コード例 #1
0
ファイル: linkto.php プロジェクト: moraesmv/testlink-code
 $mustKeys = array('tprojectPrefix' => 'testproject_not_set', 'item' => 'item_not_set', 'id' => 'id_not_set');
 foreach ($mustKeys as $key => $labelID) {
     $op['status_ok'] = isset($_GET[$key]);
     if (!$op['status_ok']) {
         $op['msg'] = lang_get($labelID);
         break;
     }
 }
 $anchor = isset($_GET['anchor']) ? $_GET['anchor'] : null;
 $version = isset($_GET['version']) ? $_GET['version'] : null;
 $tprojectPrefix = isset($_GET['tprojectPrefix']) ? $_GET['tprojectPrefix'] : null;
 $item = isset($_GET['item']) ? $_GET['item'] : null;
 $id = isset($_GET['id']) ? $_GET['id'] : null;
 if ($op['status_ok']) {
     $tproject = new testproject($db);
     $tproject_data = $tproject->get_by_prefix($tprojectPrefix);
     if ($op['status_ok'] = !is_null($tproject_data)) {
         $tproject->setCurrentProject($tproject_data['id']);
         $op['status_ok'] = isset($itemCode[$item]);
         $op['msg'] = sprintf(lang_get('invalid_item'), $item);
     } else {
         $op['msg'] = sprintf(lang_get('testproject_not_found'), $tprojectPrefix);
     }
 }
 if ($op['status_ok']) {
     // Build  name of function to call for doing the job.
     $pfn = 'process_' . $item;
     $jump_to = $pfn($db, $id, $tproject_data['id'], $tprojectPrefix, $version);
     $op['status_ok'] = !is_null($jump_to['url']);
     $op['msg'] = $jump_to['msg'];
 }
コード例 #2
0
/**
 * replace BBCode-link tagged links in req/reqspec scope with actual links
 *
 * @internal revisions:
 * 20110525 - Julian - BUGID 4487 - allow to specify requirement version for internal links
 * 20100301 - asimon - added anchor and tproj parameters to tags
 * 
 * @param resource $dbHandler database handle
 * @param string $scope text in which to replace tags with links
 * @param integer $tprojectID ID of testproject to which req/reqspec belongs
 * @return string $scope text with generated links
 */
function req_link_replace($dbHandler, $scope, $tprojectID)
{
    // Use this to improve performance when is called in loops
    static $tree_mgr;
    static $tproject_mgr;
    static $req_mgr;
    static $cfg;
    static $l18n;
    static $title;
    static $tables;
    if (!$tproject_mgr) {
        $tproject_mgr = new testproject($dbHandler);
        $tree_mgr = new tree($dbHandler);
        $req_mgr = new requirement_mgr($dbHandler);
        $tables = tlObjectWithDB::getDBTables(array('requirements', 'req_specs'));
        $cfg = config_get('internal_links');
        $l18n['version'] = lang_get('tcversion_indicator');
        $prop2loop = array('req' => array('prop' => 'req_link_title', 'default_lbl' => 'requirement'), 'req_spec' => array('prop' => 'req_spec_link_title', 'default_lbl' => 'req_spec_short'));
        // configure link title (first part of the generated link)
        $title = array();
        foreach ($prop2loop as $key => $elem) {
            $prop = $elem['prop'];
            if ($cfg->{$prop}->type == 'string' && $cfg->{$prop}->value != '') {
                $title[$key] = lang_get($cfg->{$prop}->value);
            } else {
                if ($cfg->{$prop}->type == 'none') {
                    $title[$key] = '';
                } else {
                    $title[$key] = lang_get($elem['default_lbl']) . ": ";
                }
            }
        }
    }
    $prefix = $tproject_mgr->getTestCasePrefix($tprojectID);
    $string2replace = array();
    // configure target in which link shall open
    // use a reasonable default value if nothing is set in config
    $cfg->target = isset($cfg->target) ? $cfg->target : 'popup';
    switch ($cfg->target) {
        case 'popup':
            // use javascript to open popup window
            $string2replace['req'] = '<a href="javascript:openLinkedReqVersionWindow(%s,%s,\'%s\')">%s%s%s</a>';
            $string2replace['req_spec'] = '<a href="javascript:openLinkedReqSpecWindow(%s,\'%s\')">%s%s</a>';
            break;
        case 'window':
        case 'frame':
            // open in same frame
            $target = $cfg->target == 'window' ? 'target="_blank"' : 'target="_self"';
            $string2replace['req'] = '<a ' . $target . ' href="lib/requirements/reqView.php?' . 'item=requirement&requirement_id=%s&req_version_id=%s#%s">%s%s%s</a>';
            $string2replace['req_spec'] = '<a ' . $target . ' href="lib/requirements/reqSpecView.php?' . 'item=req_spec&req_spec_id=%s#%s">%s%s</a>';
            break;
    }
    // now the actual replacing
    $patterns2search = array();
    $patterns2search['req'] = "#\\[req(.*)\\](.*)\\[/req\\]#iU";
    $patterns2search['req_spec'] = "#\\[req_spec(.*)\\](.*)\\[/req_spec\\]#iU";
    $patternPositions = array('complete_string' => 0, 'attributes' => 1, 'doc_id' => 2);
    $items2search['req'] = array('tproj', 'anchor', 'version');
    $items2search['req_spec'] = array('tproj', 'anchor');
    $itemPositions = array('item' => 0, 'item_value' => 1);
    $sql2exec = array();
    $sql2exec['req'] = " SELECT id, req_doc_id AS doc_id " . " FROM {$tables['requirements']} WHERE req_doc_id=";
    $sql2exec['req_spec'] = " SELECT id, doc_id FROM {$tables['req_specs']} " . " WHERE doc_id=";
    foreach ($patterns2search as $accessKey => $pattern) {
        $matches = array();
        preg_match_all($pattern, $scope, $matches);
        // if no req_doc_id is set skip loop
        if (count($matches[$patternPositions['doc_id']]) == 0) {
            continue;
        }
        foreach ($matches[$patternPositions['complete_string']] as $key => $matched_string) {
            $matched = array();
            $matched['tproj'] = '';
            $matched['anchor'] = '';
            $matched['version'] = '';
            // only look for attributes if any found
            if ($matches[$patternPositions['attributes']][$key] != '') {
                foreach ($items2search[$accessKey] as $item) {
                    $matched_item = array();
                    preg_match('/' . $item . '=([\\w]+)/', $matched_string, $matched_item);
                    $matched[$item] = isset($matched_item[$itemPositions['item_value']]) ? $matched_item[$itemPositions['item_value']] : '';
                }
            }
            // set tproj to current project if tproj is not specified in attributes
            if (!isset($matched['tproj']) || $matched['tproj'] == '') {
                $matched['tproj'] = $prefix;
            }
            // get all reqs / req specs with the specified doc_id
            $sql = $sql2exec[$accessKey] . "'{$matches[$patternPositions['doc_id']][$key]}'";
            $rs = $dbHandler->get_recordset($sql);
            if (count($rs) > 0) {
                foreach ($rs as $key => $value) {
                    // get root of linked node and check
                    $real_root = $tree_mgr->getTreeRoot($value['id']);
                    $matched_root_info = $tproject_mgr->get_by_prefix($matched['tproj']);
                    // do only continue if project with the specified project exists and
                    // if the requirement really belongs to the specified project (requirements
                    // with the same doc_id may exist within different projects)
                    if ($real_root == $matched_root_info['id']) {
                        if ($accessKey == 'req') {
                            // add version to link title if set
                            $version = '';
                            $req_version_id = 'null';
                            if ($matched['version'] != '') {
                                // get requirement version_id of the specified version
                                $req_version = $req_mgr->get_by_id($value['id'], null, $matched['version']);
                                // if version is not set or wrong version was set
                                // -> show latest version by setting version_id to null
                                $req_version_id = isset($req_version[0]['version_id']) ? $req_version[0]['version_id'] : 'null';
                                // if req_version_id exists set the version to show on hyperlink text
                                if ($req_version_id != 'null') {
                                    $version = sprintf($l18n['version'], $matched['version']);
                                }
                            }
                            $urlString = sprintf($string2replace[$accessKey], $value['id'], $req_version_id, $matched['anchor'], $title[$accessKey], $value['doc_id'], $version);
                        } else {
                            // build urlString for req specs which do not have a version
                            $urlString = sprintf($string2replace[$accessKey], $value['id'], $matched['anchor'], $title[$accessKey], $value['doc_id']);
                        }
                        $scope = str_replace($matched_string, $urlString, $scope);
                    }
                }
            }
        }
    }
    return $scope;
}
コード例 #3
0
/**
 *
 *
 */
function systemWideTestCaseSearch(&$dbHandler, &$argsObj, $glue)
{
    // Attention:
    // this algorithm has potential flaw (IMHO) because we can find the glue character
    // in situation where it's role is not this.
    // Anyway i will work on this in the future (if I've time)
    //
    if (strpos($argsObj->targetTestCase, $glue) === false) {
        // We suppose user was lazy enough to do not provide prefix,
        // then we will try to help him/her
        $argsObj->targetTestCase = $argsObj->tcasePrefix . $argsObj->targetTestCase;
    }
    if (!is_null($argsObj->targetTestCase)) {
        // parse to get JUST prefix, find the last glue char.
        // This useful because from navBar, user can request search of test cases that belongs
        // to test project DIFFERENT to test project setted in environment
        if (($gluePos = strrpos($argsObj->targetTestCase, $glue)) !== false) {
            $tcasePrefix = substr($argsObj->targetTestCase, 0, $gluePos);
        }
        $tprojectMgr = new testproject($dbHandler);
        $argsObj->tcaseTestProject = $tprojectMgr->get_by_prefix($tcasePrefix);
        $tcaseMgr = new testcase($dbHandler);
        $argsObj->tcase_id = $tcaseMgr->getInternalID($argsObj->targetTestCase);
        $dummy = $tcaseMgr->get_basic_info($argsObj->tcase_id, array('number' => $argsObj->tcaseVersionNumber));
        if (!is_null($dummy)) {
            $argsObj->tcversion_id = $dummy[0]['tcversion_id'];
        }
    }
}
コード例 #4
0
/**
 * replace BBCode-link tagged links in req/reqspec scope with actual links
 *
 * @internal revisions:
 * 20100301 - asimon - added anchor and tproj parameters to tags
 * 
 * @param resource $dbHandler database handle
 * @param string $scope text in which to replace tags with links
 * @param integer $tprojectID ID of testproject to which req/reqspec belongs
 * @return string $scope text with generated links
 */
function req_link_replace($dbHandler, $scope, $tprojectID)
{
    $tree_mgr = new tree($dbHandler);
    $tproject_mgr = new testproject($dbHandler);
    $prefix = $tproject_mgr->getTestCasePrefix($tprojectID);
    $tables = tlObjectWithDB::getDBTables(array('requirements', 'req_specs'));
    $cfg = config_get('internal_links');
    $string2replace = array();
    $title = array();
    // configure target in which link shall open
    // use a reasonable default value if nothing is set in config
    $cfg->target = isset($cfg->target) ? $cfg->target : 'popup';
    switch ($cfg->target) {
        case 'popup':
            // use javascript to open popup window
            $string2replace['req'] = '<a href="javascript:openLinkedReqWindow(%s,\'%s\')">%s%s</a>';
            $string2replace['req_spec'] = '<a href="javascript:openLinkedReqSpecWindow(%s,\'%s\')">%s%s</a>';
            break;
        case 'window':
        case 'frame':
            // open in same frame
            $target = $cfg->target == 'window' ? 'target="_blank"' : 'target="_self"';
            $string2replace['req'] = '<a ' . $target . ' href="lib/requirements/reqView.php?' . 'item=requirement&requirement_id=%s#%s">%s%s</a>';
            $string2replace['req_spec'] = '<a ' . $target . ' href="lib/requirements/reqSpecView.php?' . 'item=req_spec&req_spec_id=%s#%s">%s%s</a>';
            break;
    }
    // configure link title (first part of the generated link)
    // default: use item type as name (localized name for req)
    $title['req'] = lang_get('requirement') . ": ";
    // default: use short item type as name (localized name for req spec)
    $title['req_spec'] = lang_get('req_spec_short') . ": ";
    if ($cfg->req_link_title->type == 'string' && $cfg->req_link_title->value != '') {
        $title['req'] = lang_get($cfg->req_link_title->value);
    } else {
        if ($cfg->req_link_title->type == 'none') {
            $title['req'] = '';
        }
    }
    // now for the req specs
    if ($cfg->req_spec_link_title->type == 'string' && $cfg->req_spec_link_title->value != '') {
        // use user-configured string as link title
        $title['req_spec'] = lang_get($cfg->req_spec_link_title->value);
    } else {
        if ($cfg->req_spec_link_title->type == 'none') {
            $title['req_spec'] = '';
        }
    }
    // now the actual replacing
    $patterns2search = array();
    $patterns2search['req'] = "#\\[req[\\s]*(tproj=([\\w]+))*[\\s]*(anchor=([\\w]+))*[\\s]*(tproj=([\\w]+))*\\](.*)\\[/req\\]#iU";
    $patterns2search['req_spec'] = "#\\[req_spec[\\s]*(tproj=([\\w]+))*[\\s]*(anchor=([\\w]+))*[\\s]*(tproj=([\\w]+))*\\](.*)\\[/req_spec\\]#iU";
    $sql2exec = array();
    $sql2exec['req'] = " SELECT id, req_doc_id AS doc_id " . " FROM {$tables['requirements']} WHERE req_doc_id=";
    $sql2exec['req_spec'] = " SELECT id, doc_id FROM {$tables['req_specs']} " . " WHERE doc_id=";
    foreach ($patterns2search as $accessKey => $pattern) {
        $matches = array();
        preg_match_all($pattern, $scope, $matches);
        if (count($matches[7]) == 0) {
            continue;
        }
        foreach ($matches[0] as $key => $matched_string) {
            // get testproject prefix, if that was found with regex
            // if not, get prefix of current project
            if ($matches[2][$key] != '') {
                $matched_prefix = $matches[2][$key];
            } else {
                if ($matches[6][$key] != '') {
                    $matched_prefix = $matches[6][$key];
                } else {
                    $matched_prefix = $prefix;
                }
            }
            $matched_anchor = $matches[4][$key];
            $matched_doc_id = $matches[7][$key];
            $sql = $sql2exec[$accessKey] . "'{$matched_doc_id}'";
            $rs = $dbHandler->get_recordset($sql);
            if (count($rs)) {
                //20100818 - Julian - fixed error if same doc_id exists in multiple projects
                foreach ($rs as $key => $value) {
                    // get root of linked node and check
                    $real_root = $tree_mgr->getTreeRoot($value['id']);
                    $matched_root_info = $tproject_mgr->get_by_prefix($matched_prefix);
                    if ($real_root == $matched_root_info['id']) {
                        $urlString = sprintf($string2replace[$accessKey], $value['id'], $matched_anchor, $title[$accessKey], $value['doc_id']);
                        $scope = str_replace($matched_string, $urlString, $scope);
                    }
                }
            }
        }
    }
    return $scope;
}
コード例 #5
0
/**
 * 
 *
 */
function init_args(&$dbHandler)
{
    $_REQUEST = strings_stripSlashes($_REQUEST);
    $iParams = array("edit" => array(tlInputParameter::STRING_N, 0, 50), "id" => array(tlInputParameter::INT_N), "show_path" => array(tlInputParameter::INT_N), "show_mode" => array(tlInputParameter::STRING_N, 0, 50), "tcase_id" => array(tlInputParameter::INT_N), "tcversion_id" => array(tlInputParameter::INT_N), "tproject_id" => array(tlInputParameter::INT_N), "targetTestCase" => array(tlInputParameter::STRING_N, 0, 24), "tcasePrefix" => array(tlInputParameter::STRING_N, 0, 16), "tcaseExternalID" => array(tlInputParameter::STRING_N, 0, 16), "tcaseVersionNumber" => array(tlInputParameter::INT_N));
    $args = new stdClass();
    R_PARAMS($iParams, $args);
    // For more information about the data accessed in session here, see the comment
    // in the file header of lib/functions/tlTestCaseFilterControl.class.php.
    $form_token = isset($_REQUEST['form_token']) ? $_REQUEST['form_token'] : 0;
    $mode = 'edit_mode';
    $cfg = config_get('testcase_cfg');
    $session_data = isset($_SESSION[$mode]) && isset($_SESSION[$mode][$form_token]) ? $_SESSION[$mode][$form_token] : null;
    $args->refreshTree = isset($session_data['setting_refresh_tree_on_action']) ? $session_data['setting_refresh_tree_on_action'] : 0;
    $args->user_id = isset($_SESSION['userID']) ? $_SESSION['userID'] : 0;
    $args->feature = $args->edit;
    $args->opt_requirements = null;
    $args->automationEnabled = 0;
    $args->requirementsEnabled = 0;
    $args->testPriorityEnabled = 0;
    $args->tcasePrefix = trim($args->tcasePrefix);
    $tprojectMgr = new testproject($dbHandler);
    if ($args->tproject_id <= 0 && strlen($args->tcaseExternalID) > 0) {
        // parse to get JUST prefix
        $gluePos = strrpos($args->tcaseExternalID, $cfg->glue_character);
        // Find the last glue char
        $status_ok = $gluePos !== false;
        if ($status_ok) {
            $tcasePrefix = substr($args->tcaseExternalID, 0, $gluePos);
        }
        $dummy = $tprojectMgr->get_by_prefix($tcasePrefix);
        $tcaseMgr = new testcase($dbHandler);
        $args->tcase_id = $tcaseMgr->getInternalID($args->tcaseExternalID);
        $tcinfo = $tcaseMgr->get_basic_info($args->tcase_id, array('number' => $args->tcaseVersionNumber));
        if (!is_null($tcinfo)) {
            $args->tcversion_id = $tcinfo[0]['tcversion_id'];
        }
        unset($tcaseMgr);
    } else {
        $dummy = $tprojectMgr->get_by_id($args->tproject_id);
    }
    if (!is_null($dummy)) {
        $args->tproject_id = $dummy['id'];
    }
    $args->opt_requirements = $dummy['opt']->requirementsEnabled;
    $args->requirementsEnabled = $dummy['opt']->requirementsEnabled;
    $args->automationEnabled = $dummy['opt']->automationEnabled;
    $args->testPriorityEnabled = $dummy['opt']->testPriorityEnabled;
    if (!$args->tcversion_id) {
        $args->tcversion_id = testcase::ALL_VERSIONS;
    }
    // used to manage goback
    if (intval($args->tcase_id) > 0) {
        $args->feature = 'testcase';
        $args->id = intval($args->tcase_id);
    }
    $args->id = is_null($args->id) ? 0 : $args->id;
    switch ($args->feature) {
        case 'testsuite':
            $_SESSION['setting_refresh_tree_on_action'] = $args->refreshTree ? 1 : 0;
            break;
        case 'testproject':
            $args->id = $args->tproject_id;
            break;
    }
    if (strpos($args->targetTestCase, $cfg->glue_character) === false) {
        $args->targetTestCase = $args->tcasePrefix . $args->targetTestCase;
    }
    return $args;
}
コード例 #6
0
 /**
  * Returns all test suites inside target 
  * test project with target name
  *
  * @param
  * @param struct $args
  * @param string $args["devKey"]
  * @param int $args["testsuitename"]
  * @param string $args["prefix"]
  * @return mixed $resultInfo
  * 
  * @access public
  */
 public function getTestSuite($args)
 {
     $ope = __FUNCTION__;
     $msg_prefix = "({$ope}) - ";
     $this->_setArgs($args);
     $status_ok = $this->_runChecks(array('authenticate'), $msg_prefix);
     if ($status_ok) {
         // Check for mandatory parameters
         $k2s = array(self::$testSuiteNameParamName, self::$prefixParamName);
         foreach ($k2s as $target) {
             $ok = $this->_isParamPresent($target, $msg_prefix, self::SET_ERROR);
             $status_ok = $status_ok && $ok;
         }
     }
     if ($status_ok) {
         // optionals
         //$details='simple';
         //$k2s=self::$detailsParamName;
         //if( $this->_isParamPresent($k2s) )
         //{
         //  $details = $this->args[$k2s];
         //}
     }
     if ($status_ok) {
         $tprojectMgr = new testproject($this->dbObj);
         $pfx = $this->args[self::$prefixParamName];
         $tproj = $tprojectMgr->get_by_prefix($pfx);
         if (is_null($tproj)) {
             $status_ok = false;
             $msg = $msg_prefix . sprintf(TPROJECT_PREFIX_DOESNOT_EXIST_STR, $pfx);
             $this->errors[] = new IXR_Error(TPROJECT_PREFIX_DOESNOT_EXIST, $msg);
         } else {
             $ctx[self::$testProjectIDParamName] = $dummy['id'];
         }
     }
     if ($status_ok && $this->userHasRight("mgt_view_tc", self::CHECK_PUBLIC_PRIVATE_ATTR, $ctx)) {
         $opt = array('recursive' => false, 'exclude_testcases' => true);
         // $target = $this->dbObj->prepare_string($tg);
         // $filters['additionalWhereClause'] =
         // " AND name = '{$target}' ";
         $filters = null;
         $items = $tprojectMgr->get_subtree($tproj['id'], $filters, $opt);
         $ni = array();
         if (!is_null($items) && ($l2d = count($items)) > 0) {
             $tg = $this->args[self::$testSuiteNameParamName];
             for ($ydx = 0; $ydx <= $l2d; $ydx++) {
                 if (strcmp($items[$ydx]['name'], $tg) == 0) {
                     unset($items[$ydx]['tcversion_id']);
                     $ni[] = $items[$ydx];
                 }
             }
         } else {
             $ni = $items;
         }
     }
     return $status_ok ? $ni : $this->errors;
 }
コード例 #7
0
/**
 *
 *
 */
function checkTestProject(&$db, &$user, &$args)
{
    $hasRight = false;
    $tproject_mgr = new testproject($db);
    $item_info = $tproject_mgr->get_by_prefix($args->tprojectPrefix);
    if ($op['status_ok'] = !is_null($item_info)) {
        $args->tproject_id = intval($item_info['id']);
        switch ($args->item) {
            case 'testcase':
            case 'testsuite':
                $hasRight = $user->hasRight($db, 'mgt_view_tc', $args->tproject_id);
                break;
            case 'req':
            case 'reqspec':
                $hasRight = $user->hasRight($db, 'mgt_view_req', $args->tproject_id);
                break;
            default:
                // need to fail!!
                break;
        }
    }
    return $hasRight;
}