Bug reproduced on Debian GNU/Linux 9 with trunk version as of
revision 1824204, building with default options.
When operating svnserve in virtual host mode (--virtual-host),
any attempt to access a repository through a URL that includes
a user name will fail:
$ mkdir -p /tmp/repos/localhost
$ svnadmin create /tmp/repos/localhost/Dev
$ svnserve -r /tmp/repos -d --virtual-host
$ svn ls svn://localhost/Dev
<works, returning empty result>
$ svn ls svn://foo@localhost/Dev
svn: E170013: Unable to connect to a repository at URL 'svn://foo@localhost/Dev'
svn: E210005: No repository found in 'svn://foo@localhost/Dev'
The reason for this is that svnserve will in this case include
the user name in the repository path, which can be shown
as follows:
$ ln -s localhost /tmp/repos/foo@localhost
$ svn ls svn://foo@localhost/Dev
<now works>
$ svn ls svn://bar@localhost/Dev
svn: E170013: Unable to connect to a repository at URL 'svn://bar@localhost/Dev'
svn: E210005: No repository found in 'svn://bar@localhost/Dev'
A simple fix is attached.
--
Thomas Quinot, Ph.D. ** [email protected] ** IT Lead Engineer
AdaCore -- Paris, France -- New York, USA
[[[
Fix failure to find repo in virtual host mode if user name present
* subversion/svnserve/serve.c
(find_repos): In vhost mode, skip past user name and password,
if present.
]]]
Index: subversion/svnserve/serve.c
===================================================================
--- subversion/svnserve/serve.c (revision 1824204)
+++ subversion/svnserve/serve.c (working copy)
@@ -3806,12 +3806,21 @@ find_repos(const char *url,
return svn_error_createf(SVN_ERR_BAD_URL, NULL,
"Non-svn URL passed to svn server: '%s'", url);
- if (! vhost)
+ /* In virtual host mode, skip past any USER[:PASSWORD]@ part,
+ else skip past [USER[:PASSWORD]@]HOST/. */
+ if (vhost)
{
+ const char *h_path = strchr(path, '@');
+ if (h_path != NULL)
+ path = h_path + 1;
+ }
+ else
+ {
path = strchr(path, '/');
if (path == NULL)
path = "";
}
+
path = svn_relpath_canonicalize(path, scratch_pool);
path = svn_path_uri_decode(path, scratch_pool);