public function testURIPathComponentEscape()
 {
     $this->assertEqual('a%252Fb', phutil_escape_uri_path_component('a/b'));
     $str = '';
     for ($ii = 0; $ii <= 255; $ii++) {
         $str .= chr($ii);
     }
     $this->assertEqual($str, phutil_unescape_uri_path_component(rawurldecode(phutil_escape_uri_path_component($str))));
 }
Esempio n. 2
0
/**
 * uri_sprintf() callback for URI encoding.
 * @group markup
 */
function xsprintf_uri($userdata, &$pattern, &$pos, &$value, &$length)
{
    $type = $pattern[$pos];
    switch ($type) {
        case 's':
            $value = phutil_escape_uri($value);
            $type = 's';
            break;
        case 'p':
            $value = phutil_escape_uri_path_component($value);
            $type = 's';
            break;
        case 'R':
            $type = 's';
            break;
    }
    $pattern[$pos] = $type;
}
Esempio n. 3
0
 /**
  * Generate a Diffusion URI from a parameter map. Applies the correct encoding
  * and formatting to the URI. Parameters are:
  *
  *   - `action` One of `history`, `browse`, `change`, `lastmodified`,
  *     `branch`, `tags`, `branches`,  or `revision-ref`. The action specified
  *      by the URI.
  *   - `repository` Repository.
  *   - `callsign` Repository callsign.
  *   - `branch` Optional if action is not `branch`, branch name.
  *   - `path` Optional, path to file.
  *   - `commit` Optional, commit identifier.
  *   - `line` Optional, line range.
  *   - `lint` Optional, lint code.
  *   - `params` Optional, query parameters.
  *
  * The function generates the specified URI and returns it.
  *
  * @param   map         See documentation.
  * @return  PhutilURI   Generated URI.
  * @task uri
  */
 public static function generateDiffusionURI(array $params)
 {
     $action = idx($params, 'action');
     $repository = idx($params, 'repository');
     if ($repository) {
         $callsign = $repository->getCallsign();
     } else {
         $callsign = idx($params, 'callsign');
     }
     $path = idx($params, 'path');
     $branch = idx($params, 'branch');
     $commit = idx($params, 'commit');
     $line = idx($params, 'line');
     if (strlen($callsign)) {
         $callsign = phutil_escape_uri_path_component($callsign) . '/';
     }
     if (strlen($branch)) {
         $branch = phutil_escape_uri_path_component($branch) . '/';
     }
     if (strlen($path)) {
         $path = ltrim($path, '/');
         $path = str_replace(array(';', '$'), array(';;', '$$'), $path);
         $path = phutil_escape_uri($path);
     }
     $path = "{$branch}{$path}";
     if (strlen($commit)) {
         $commit = str_replace('$', '$$', $commit);
         $commit = ';' . phutil_escape_uri($commit);
     }
     if (strlen($line)) {
         $line = '$' . phutil_escape_uri($line);
     }
     $req_callsign = false;
     $req_branch = false;
     $req_commit = false;
     switch ($action) {
         case 'history':
         case 'browse':
         case 'change':
         case 'lastmodified':
         case 'tags':
         case 'branches':
         case 'lint':
         case 'refs':
             $req_callsign = true;
             break;
         case 'branch':
             $req_callsign = true;
             $req_branch = true;
             break;
         case 'commit':
             $req_callsign = true;
             $req_commit = true;
             break;
     }
     if ($req_callsign && !strlen($callsign)) {
         throw new Exception(pht("Diffusion URI action '%s' requires callsign!", $action));
     }
     if ($req_commit && !strlen($commit)) {
         throw new Exception(pht("Diffusion URI action '%s' requires commit!", $action));
     }
     switch ($action) {
         case 'change':
         case 'history':
         case 'browse':
         case 'lastmodified':
         case 'tags':
         case 'branches':
         case 'lint':
         case 'pathtree':
         case 'refs':
             $uri = "/diffusion/{$callsign}{$action}/{$path}{$commit}{$line}";
             break;
         case 'branch':
             if (strlen($path)) {
                 $uri = "/diffusion/{$callsign}repository/{$path}";
             } else {
                 $uri = "/diffusion/{$callsign}";
             }
             break;
         case 'external':
             $commit = ltrim($commit, ';');
             $uri = "/diffusion/external/{$commit}/";
             break;
         case 'rendering-ref':
             // This isn't a real URI per se, it's passed as a query parameter to
             // the ajax changeset stuff but then we parse it back out as though
             // it came from a URI.
             $uri = rawurldecode("{$path}{$commit}");
             break;
         case 'commit':
             $commit = ltrim($commit, ';');
             $callsign = rtrim($callsign, '/');
             $uri = "/r{$callsign}{$commit}";
             break;
         default:
             throw new Exception(pht("Unknown Diffusion URI action '%s'!", $action));
     }
     if ($action == 'rendering-ref') {
         return $uri;
     }
     $uri = new PhutilURI($uri);
     if (isset($params['lint'])) {
         $params['params'] = idx($params, 'params', array()) + array('lint' => $params['lint']);
     }
     if (idx($params, 'params')) {
         $uri->setQueryParams($params['params']);
     }
     return $uri;
 }
 public function generateURI(array $params)
 {
     $req_branch = false;
     $req_commit = false;
     $action = idx($params, 'action');
     switch ($action) {
         case 'history':
         case 'browse':
         case 'change':
         case 'lastmodified':
         case 'tags':
         case 'branches':
         case 'lint':
         case 'pathtree':
         case 'refs':
             break;
         case 'branch':
             // NOTE: This does not actually require a branch, and won't have one
             // in Subversion. Possibly this should be more clear.
             break;
         case 'commit':
         case 'rendering-ref':
             $req_commit = true;
             break;
         default:
             throw new Exception(pht('Action "%s" is not a valid repository URI action.', $action));
     }
     $path = idx($params, 'path');
     $branch = idx($params, 'branch');
     $commit = idx($params, 'commit');
     $line = idx($params, 'line');
     if ($req_commit && !strlen($commit)) {
         throw new Exception(pht('Diffusion URI action "%s" requires commit!', $action));
     }
     if ($req_branch && !strlen($branch)) {
         throw new Exception(pht('Diffusion URI action "%s" requires branch!', $action));
     }
     if ($action === 'commit') {
         return $this->getCommitURI($commit);
     }
     $identifier = $this->getID();
     $callsign = $this->getCallsign();
     if ($callsign !== null) {
         $identifier = $callsign;
     }
     if (strlen($identifier)) {
         $identifier = phutil_escape_uri_path_component($identifier);
     }
     if (strlen($path)) {
         $path = ltrim($path, '/');
         $path = str_replace(array(';', '$'), array(';;', '$$'), $path);
         $path = phutil_escape_uri($path);
     }
     if (strlen($branch)) {
         $branch = phutil_escape_uri_path_component($branch);
         $path = "{$branch}/{$path}";
     }
     if (strlen($commit)) {
         $commit = str_replace('$', '$$', $commit);
         $commit = ';' . phutil_escape_uri($commit);
     }
     if (strlen($line)) {
         $line = '$' . phutil_escape_uri($line);
     }
     switch ($action) {
         case 'change':
         case 'history':
         case 'browse':
         case 'lastmodified':
         case 'tags':
         case 'branches':
         case 'lint':
         case 'pathtree':
         case 'refs':
             $uri = "/diffusion/{$identifier}/{$action}/{$path}{$commit}{$line}";
             break;
         case 'branch':
             if (strlen($path)) {
                 $uri = "/diffusion/{$identifier}/repository/{$path}";
             } else {
                 $uri = "/diffusion/{$identifier}/";
             }
             break;
         case 'external':
             $commit = ltrim($commit, ';');
             $uri = "/diffusion/external/{$commit}/";
             break;
         case 'rendering-ref':
             // This isn't a real URI per se, it's passed as a query parameter to
             // the ajax changeset stuff but then we parse it back out as though
             // it came from a URI.
             $uri = rawurldecode("{$path}{$commit}");
             break;
     }
     if ($action == 'rendering-ref') {
         return $uri;
     }
     $uri = new PhutilURI($uri);
     if (isset($params['lint'])) {
         $params['params'] = idx($params, 'params', array()) + array('lint' => $params['lint']);
     }
     if (idx($params, 'params')) {
         $uri->setQueryParams($params['params']);
     }
     return $uri;
 }
Esempio n. 5
0
 public function getURI()
 {
     $parts = array();
     $parts[] = phutil_escape_uri_path_component($this->getType());
     if ($this->getContext()) {
         $parts[] = phutil_escape_uri_path_component($this->getContext());
     }
     $parts[] = phutil_escape_uri_path_component($this->getName());
     $parts[] = null;
     return implode('/', $parts);
 }
Esempio n. 6
0
 private function getBaseURI()
 {
     $repo_uri = $this->getRepositoryURI();
     if ($repo_uri === null) {
         throw new ArcanistUsageException(pht('arc is unable to determine which repository in Diffusion ' . 'this working copy belongs to. Use "%s" to understand how ' . '%s looks for a repository.', 'arc which', 'arc'));
     }
     $branch = $this->getArgument('branch', 'master');
     $branch = phutil_escape_uri_path_component($branch);
     return $repo_uri . 'browse/' . $branch . '/';
 }