You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by cm...@apache.org on 2011/01/24 17:00:14 UTC

svn commit: r1062848 - /subversion/branches/uris-as-urls/subversion/svnserve/serve.c

Author: cmpilato
Date: Mon Jan 24 16:00:14 2011
New Revision: 1062848

URL: http://svn.apache.org/viewvc?rev=1062848&view=rev
Log:
On the 'uris-as-urls' branch, review and correct some use of the
svn_uri_* APIs.  (One step of many similar ones.)

* subversion/svnserve/serve.c
  (authz_check_access, set_path, delete_path, link_path, reparent,
   unlock_paths, get_file, get_dir, update, switch_cmd, status, diff,
   get_mergeinfo, log_cmd, check_path, stat_cmd, get_locations,
   get_location_segments, get_file_revs, lock, lock_many, unlock,
   unlock_many, get_lock, get_locks, get_deleted_rev, find_repos,
   serve): Review/correct/rename uses of the svn_uri_* APIs.

Modified:
    subversion/branches/uris-as-urls/subversion/svnserve/serve.c

Modified: subversion/branches/uris-as-urls/subversion/svnserve/serve.c
URL: http://svn.apache.org/viewvc/subversion/branches/uris-as-urls/subversion/svnserve/serve.c?rev=1062848&r1=1062847&r2=1062848&view=diff
==============================================================================
--- subversion/branches/uris-as-urls/subversion/svnserve/serve.c (original)
+++ subversion/branches/uris-as-urls/subversion/svnserve/serve.c Mon Jan 24 16:00:14 2011
@@ -396,8 +396,8 @@ static svn_error_t *authz_check_access(s
      absolute path. Passing such a malformed path to the authz
      routines throws them into an infinite loop and makes them miss
      ACLs. */
-  if (path && *path != '/')
-    path = svn_uri_join("/", path, pool);
+  if (path)
+    path = svn_fspath__canonicalize(path, pool);
 
   /* If we have a username, and we've not yet used it + any username
      case normalization that might be requested to determine "the
@@ -764,7 +764,7 @@ static svn_error_t *set_path(svn_ra_svn_
                                  &depth_word));
   if (depth_word)
     depth = svn_depth_from_word(depth_word);
-  path = svn_uri_canonicalize(path, pool);
+  path = svn_relpath_canonicalize(path, pool);
   if (b->from_rev && strcmp(path, "") == 0)
     *b->from_rev = rev;
   if (!b->err)
@@ -783,7 +783,7 @@ static svn_error_t *delete_path(svn_ra_s
   const char *path;
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c", &path));
-  path = svn_uri_canonicalize(path, pool);
+  path = svn_relpath_canonicalize(path, pool);
   if (!b->err)
     b->err = svn_repos_delete_path(b->report_baton, path, pool);
   return SVN_NO_ERROR;
@@ -802,13 +802,17 @@ static svn_error_t *link_path(svn_ra_svn
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "ccrb?(?c)?w",
                                  &path, &url, &rev, &start_empty,
                                  &lock_token, &depth_word));
-  path = svn_uri_canonicalize(path, pool);
-  url = svn_path_uri_decode(svn_uri_canonicalize(url, pool), pool);
+
+  /* ### WHAT?!  The link path is an absolute URL?!  Didn't see that
+     coming...   -- cmpilato  */
+  path = svn_relpath_canonicalize(path, pool);
+  url = svn_url_canonicalize(url, pool);
   if (depth_word)
     depth = svn_depth_from_word(depth_word);
   if (!b->err)
     b->err = get_fs_path(svn_path_uri_decode(b->repos_url, pool),
-                         url, &fs_path);
+                         svn_path_uri_decode(url, pool),
+                         &fs_path);
   if (!b->err)
     b->err = svn_repos_link_path3(b->report_baton, path, fs_path, rev,
                                   depth, start_empty, lock_token, pool);
@@ -994,10 +998,11 @@ static svn_error_t *reparent(svn_ra_svn_
   const char *fs_path;
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c", &url));
-  url = svn_path_uri_decode(svn_uri_canonicalize(url, pool), pool);
+  url = svn_url_canonicalize(url, pool);
   SVN_ERR(trivial_auth_request(conn, pool, b));
   SVN_CMD_ERR(get_fs_path(svn_path_uri_decode(b->repos_url, pool),
-                          url, &fs_path));
+                          svn_path_uri_decode(url, pool),
+                          &fs_path));
   SVN_ERR(log_command(b, conn, pool, "%s", svn_log__reparent(fs_path, pool)));
   svn_stringbuf_set(b->fs_path, fs_path);
   SVN_ERR(svn_ra_svn_write_cmd_response(conn, pool, ""));
@@ -1209,9 +1214,9 @@ static svn_error_t *add_lock_tokens(svn_
                                 "Lock token isn't a string");
 
       path = path_item->u.string->data;
-      full_path = svn_uri_join(sb->fs_path->data,
-                               svn_uri_canonicalize(path, pool),
-                               pool);
+      full_path = svn_fspath__join(sb->fs_path->data,
+                                   svn_relpath_canonicalize(path, pool),
+                                   pool);
 
       if (! lookup_access(pool, sb, conn, svn_authz_write,
                           full_path, TRUE))
@@ -1251,9 +1256,9 @@ static svn_error_t *unlock_paths(const a
       path = path_item->u.string->data;
       token = token_item->u.string->data;
 
-      full_path = svn_uri_join(sb->fs_path->data,
-                               svn_uri_canonicalize(path, iterpool),
-                               iterpool);
+      full_path = svn_fspath__join(sb->fs_path->data,
+                                   svn_relpath_canonicalize(path, iterpool),
+                                   iterpool);
 
       /* The lock may have become defunct after the commit, so ignore such
          errors. */
@@ -1392,8 +1397,8 @@ static svn_error_t *get_file(svn_ra_svn_
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?r)bb", &path, &rev,
                                  &want_props, &want_contents));
 
-  full_path = svn_uri_join(b->fs_path->data,
-                           svn_uri_canonicalize(path, pool), pool);
+  full_path = svn_fspath__join(b->fs_path->data,
+                               svn_relpath_canonicalize(path, pool), pool);
 
   /* Check authorizations */
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
@@ -1509,8 +1514,8 @@ static svn_error_t *get_dir(svn_ra_svn_c
         }
     }
 
-  full_path = svn_uri_join(b->fs_path->data,
-                           svn_uri_canonicalize(path, pool), pool);
+  full_path = svn_fspath__join(b->fs_path->data,
+                               svn_relpath_canonicalize(path, pool), pool);
 
   /* Check authorizations */
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
@@ -1547,7 +1552,7 @@ static svn_error_t *get_dir(svn_ra_svn_c
 
           svn_pool_clear(subpool);
 
-          file_path = svn_uri_join(full_path, name, subpool);
+          file_path = svn_fspath__join(full_path, name, subpool);
 
           if (! lookup_access(subpool, b, conn, svn_authz_read,
                               file_path, FALSE))
@@ -1647,7 +1652,7 @@ static svn_error_t *update(svn_ra_svn_co
   /* Parse the arguments. */
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "(?r)cb?wB", &rev, &target,
                                  &recurse, &depth_word, &send_copyfrom_param));
-  target = svn_uri_canonicalize(target, pool);
+  target = svn_relpath_canonicalize(target, pool);
 
   if (depth_word)
     depth = svn_depth_from_word(depth_word);
@@ -1657,7 +1662,7 @@ static svn_error_t *update(svn_ra_svn_co
   send_copyfrom_args = (send_copyfrom_param == SVN_RA_SVN_UNSPECIFIED_NUMBER) ?
       FALSE : (svn_boolean_t) send_copyfrom_param;
 
-  full_path = svn_uri_join(b->fs_path->data, target, pool);
+  full_path = svn_fspath__join(b->fs_path->data, target, pool);
   /* Check authorization and authenticate the user if necessary. */
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_read, full_path, FALSE));
 
@@ -1698,8 +1703,8 @@ static svn_error_t *switch_cmd(svn_ra_sv
   /* Parse the arguments. */
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "(?r)cbc?w", &rev, &target,
                                  &recurse, &switch_url, &depth_word));
-  target = svn_uri_canonicalize(target, pool);
-  switch_url = svn_uri_canonicalize(switch_url, pool);
+  target = svn_relpath_canonicalize(target, pool);
+  switch_url = svn_url_canonicalize(switch_url, pool);
 
   if (depth_word)
     depth = svn_depth_from_word(depth_word);
@@ -1715,7 +1720,7 @@ static svn_error_t *switch_cmd(svn_ra_sv
                           &switch_path));
 
   {
-    const char *full_path = svn_uri_join(b->fs_path->data, target, pool);
+    const char *full_path = svn_fspath__join(b->fs_path->data, target, pool);
     SVN_ERR(log_command(b, conn, pool, "%s",
                         svn_log__switch(full_path, switch_path, rev,
                                         depth, pool)));
@@ -1742,7 +1747,7 @@ static svn_error_t *status(svn_ra_svn_co
   /* Parse the arguments. */
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "cb?(?r)?w",
                                  &target, &recurse, &rev, &depth_word));
-  target = svn_uri_canonicalize(target, pool);
+  target = svn_relpath_canonicalize(target, pool);
 
   if (depth_word)
     depth = svn_depth_from_word(depth_word);
@@ -1754,7 +1759,7 @@ static svn_error_t *status(svn_ra_svn_co
     SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->fs, pool));
 
   {
-    const char *full_path = svn_uri_join(b->fs_path->data, target, pool);
+    const char *full_path = svn_fspath__join(b->fs_path->data, target, pool);
     SVN_ERR(log_command(b, conn, pool, "%s",
                         svn_log__status(full_path, rev, depth, pool)));
   }
@@ -1791,8 +1796,8 @@ static svn_error_t *diff(svn_ra_svn_conn
                                      &ignore_ancestry, &versus_url,
                                      &text_deltas, &depth_word));
     }
-  target = svn_uri_canonicalize(target, pool);
-  versus_url = svn_uri_canonicalize(versus_url, pool);
+  target = svn_relpath_canonicalize(target, pool);
+  versus_url = svn_url_canonicalize(versus_url, pool);
 
   if (depth_word)
     depth = svn_depth_from_word(depth_word);
@@ -1808,7 +1813,7 @@ static svn_error_t *diff(svn_ra_svn_conn
                           &versus_path));
 
   {
-    const char *full_path = svn_uri_join(b->fs_path->data, target, pool);
+    const char *full_path = svn_fspath__join(b->fs_path->data, target, pool);
     svn_revnum_t from_rev;
     SVN_ERR(accept_report(NULL, &from_rev,
                           conn, pool, b, rev, target, versus_path,
@@ -1858,10 +1863,8 @@ static svn_error_t *get_mergeinfo(svn_ra
         if (item->kind != SVN_RA_SVN_STRING)
           return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
                                   _("Path is not a string"));
-        full_path = svn_uri_join(b->fs_path->data,
-                                 svn_uri_canonicalize(item->u.string->data,
-                                                      pool),
-                                 pool);
+        full_path = svn_relpath_canonicalize(item->u.string->data, pool);
+        full_path = svn_fspath__join(b->fs_path->data, full_path, pool);
         APR_ARRAY_PUSH(canonical_paths, const char *) = full_path;
      }
 
@@ -2037,10 +2040,8 @@ static svn_error_t *log_cmd(svn_ra_svn_c
       if (elt->kind != SVN_RA_SVN_STRING)
         return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
                                 _("Log path entry not a string"));
-      full_path = svn_uri_join(b->fs_path->data,
-                               svn_uri_canonicalize(elt->u.string->data,
-                                                    pool),
-                               pool);
+      full_path = svn_relpath_canonicalize(elt->u.string->data, pool),
+      full_path = svn_fspath__join(b->fs_path->data, full_path, pool);
       APR_ARRAY_PUSH(full_paths, const char *) = full_path;
     }
   SVN_ERR(trivial_auth_request(conn, pool, b));
@@ -2082,8 +2083,8 @@ static svn_error_t *check_path(svn_ra_sv
   svn_node_kind_t kind;
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?r)", &path, &rev));
-  full_path = svn_uri_join(b->fs_path->data,
-                           svn_uri_canonicalize(path, pool), pool);
+  full_path = svn_fspath__join(b->fs_path->data,
+                               svn_relpath_canonicalize(path, pool), pool);
 
   /* Check authorizations */
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
@@ -2112,8 +2113,8 @@ static svn_error_t *stat_cmd(svn_ra_svn_
   svn_dirent_t *dirent;
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?r)", &path, &rev));
-  full_path = svn_uri_join(b->fs_path->data,
-                           svn_uri_canonicalize(path, pool), pool);
+  full_path = svn_fspath__join(b->fs_path->data,
+                               svn_relpath_canonicalize(path, pool), pool);
 
   /* Check authorizations */
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
@@ -2167,9 +2168,9 @@ static svn_error_t *get_locations(svn_ra
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "crl", &relative_path,
                                  &peg_revision,
                                  &loc_revs_proto));
-  relative_path = svn_uri_canonicalize(relative_path, pool);
+  relative_path = svn_relpath_canonicalize(relative_path, pool);
 
-  abs_path = svn_uri_join(b->fs_path->data, relative_path, pool);
+  abs_path = svn_fspath__join(b->fs_path->data, relative_path, pool);
 
   location_revisions = apr_array_make(pool, loc_revs_proto->nelts,
                                       sizeof(svn_revnum_t));
@@ -2256,9 +2257,9 @@ static svn_error_t *get_location_segment
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?r)(?r)(?r)",
                                  &relative_path, &peg_revision,
                                  &start_rev, &end_rev));
-  relative_path = svn_uri_canonicalize(relative_path, pool);
+  relative_path = svn_relpath_canonicalize(relative_path, pool);
 
-  abs_path = svn_uri_join(b->fs_path->data, relative_path, pool);
+  abs_path = svn_fspath__join(b->fs_path->data, relative_path, pool);
 
   if (SVN_IS_VALID_REVNUM(start_rev)
       && SVN_IS_VALID_REVNUM(end_rev)
@@ -2389,9 +2390,9 @@ static svn_error_t *get_file_revs(svn_ra
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?r)(?r)?B",
                                  &path, &start_rev, &end_rev,
                                  &include_merged_revs_param));
-  path = svn_uri_canonicalize(path, pool);
+  path = svn_relpath_canonicalize(path, pool);
   SVN_ERR(trivial_auth_request(conn, pool, b));
-  full_path = svn_uri_join(b->fs_path->data, path, pool);
+  full_path = svn_fspath__join(b->fs_path->data, path, pool);
 
   if (include_merged_revs_param == SVN_RA_SVN_UNSPECIFIED_NUMBER)
     include_merged_revisions = FALSE;
@@ -2435,8 +2436,8 @@ static svn_error_t *lock(svn_ra_svn_conn
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?c)b(?r)", &path, &comment,
                                  &steal_lock, &current_rev));
-  full_path = svn_uri_join(b->fs_path->data,
-                           svn_uri_canonicalize(path, pool), pool);
+  full_path = svn_fspath__join(b->fs_path->data,
+                               svn_relpath_canonicalize(path, pool), pool);
 
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_write,
                            full_path, TRUE));
@@ -2499,9 +2500,9 @@ static svn_error_t *lock_many(svn_ra_svn
 
       /* Allocate the full_path out of pool so it will survive for use
        * by operational logging, after this loop. */
-      full_path = svn_uri_join(b->fs_path->data,
-                               svn_uri_canonicalize(path, subpool),
-                               pool);
+      full_path = svn_fspath__join(b->fs_path->data,
+                                   svn_relpath_canonicalize(path, subpool),
+                                   pool);
       APR_ARRAY_PUSH(log_paths, const char *) = full_path;
 
       if (! lookup_access(pool, b, conn, svn_authz_write, full_path, TRUE))
@@ -2563,8 +2564,8 @@ static svn_error_t *unlock(svn_ra_svn_co
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?c)b", &path, &token,
                                  &break_lock));
 
-  full_path = svn_uri_join(b->fs_path->data, svn_uri_canonicalize(path, pool),
-                           pool);
+  full_path = svn_fspath__join(b->fs_path->data,
+                               svn_relpath_canonicalize(path, pool), pool);
 
   /* Username required unless break_lock was specified. */
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_write,
@@ -2620,9 +2621,9 @@ static svn_error_t *unlock_many(svn_ra_s
 
       /* Allocate the full_path out of pool so it will survive for use
        * by operational logging, after this loop. */
-      full_path = svn_uri_join(b->fs_path->data,
-                               svn_uri_canonicalize(path, subpool),
-                               pool);
+      full_path = svn_fspath__join(b->fs_path->data,
+                                   svn_relpath_canonicalize(path, subpool),
+                                   pool);
       APR_ARRAY_PUSH(log_paths, const char *) = full_path;
 
       if (! lookup_access(subpool, b, conn, svn_authz_write, full_path,
@@ -2677,9 +2678,8 @@ static svn_error_t *get_lock(svn_ra_svn_
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c", &path));
 
-  full_path = svn_uri_join(b->fs_path->data, svn_uri_canonicalize(path,
-                                                                  pool),
-                           pool);
+  full_path = svn_fspath__join(b->fs_path->data,
+                               svn_relpath_canonicalize(path, pool), pool);
 
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
                            full_path, FALSE));
@@ -2721,8 +2721,8 @@ static svn_error_t *get_locks(svn_ra_svn
       return log_fail_and_flush(err, b, conn, pool);
     }
 
-  full_path = svn_uri_join(b->fs_path->data,
-                           svn_uri_canonicalize(path, pool), pool);
+  full_path = svn_fspath__join(b->fs_path->data,
+                               svn_relpath_canonicalize(path, pool), pool);
 
   SVN_ERR(trivial_auth_request(conn, pool, b));
 
@@ -2849,8 +2849,8 @@ get_deleted_rev(svn_ra_svn_conn_t *conn,
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "crr",
                                  &path, &peg_revision, &end_revision));
-  full_path = svn_uri_join(b->fs_path->data,
-                           svn_uri_canonicalize(path, pool), pool);
+  full_path = svn_fspath__join(b->fs_path->data,
+                               svn_relpath_canonicalize(path, pool), pool);
   SVN_ERR(log_command(b, conn, pool, "get-deleted-rev"));
   SVN_ERR(trivial_auth_request(conn, pool, b));
   SVN_ERR(svn_repos_deleted_rev(b->fs, full_path, peg_revision, end_revision,
@@ -2965,23 +2965,21 @@ static svn_error_t *find_repos(const cha
   if (path == NULL)
     return svn_error_createf(SVN_ERR_BAD_URL, NULL,
                              "Non-svn URL passed to svn server: '%s'", url);
-  path = strchr(path, '/');
-  path = (path == NULL) ? "" : path + 1;
 
-  /* Decode URI escapes from the path. */
+
+  path = strchr(path, '/');
+  path = (path == NULL) ? "" : svn_relpath_canonicalize(path, pool);
   path = svn_path_uri_decode(path, pool);
 
-  /* Ensure that it isn't possible to escape the root by skipping leading
-     slashes and not allowing '..' segments. */
-  while (*path == '/')
-    ++path;
+  /* Ensure that it isn't possible to escape the root by disallowing
+     '..' segments. */
   if (!repos_path_valid(path))
     return svn_error_create(SVN_ERR_BAD_FILENAME, NULL,
                             "Couldn't determine repository path");
 
   /* Join the server-configured root with the client path. */
-  full_path = svn_uri_join(svn_uri_canonicalize(root, pool),
-                           svn_uri_canonicalize(path, pool), pool);
+  full_path = svn_dirent_join(svn_dirent_canonicalize(root, pool),
+                              path, pool);
 
   /* Search for a repository in the full path. */
   repos_root = svn_repos_find_root_path(full_path, pool);
@@ -2999,9 +2997,9 @@ static svn_error_t *find_repos(const cha
   svn_path_remove_components(url_buf,
                              svn_path_component_count(b->fs_path->data));
   b->repos_url = url_buf->data;
-  b->authz_repos_name = svn_uri_is_child(root, repos_root, pool);
+  b->authz_repos_name = svn_fspath__is_child(root, repos_root, pool);
   if (b->authz_repos_name == NULL)
-    b->repos_name = svn_uri_basename(repos_root, pool);
+    b->repos_name = svn_fspath__basename(repos_root, pool);
   else
     b->repos_name = b->authz_repos_name;
   b->repos_name = svn_path_uri_encode(b->repos_name, pool);
@@ -3112,7 +3110,7 @@ svn_error_t *serve(svn_ra_svn_conn_t *co
   if (ver != 2)
     return SVN_NO_ERROR;
 
-  client_url = svn_uri_canonicalize(client_url, pool);
+  client_url = svn_url_canonicalize(client_url, pool);
   SVN_ERR(svn_ra_svn_set_capabilities(conn, caplist));
 
   /* All released versions of Subversion support edit-pipeline,