I have an Apache server running mod_dav_svn and mod_authz_svn with several 
repositories, each with several projects which each contain the “typical 3” 
folders, where /svn is the base SVN path for access via HTTPS*. Kind of like 
this:

/svn
    repository1
        project1
            branches
            tags
            trunk
        project2
            …
    repository2
        …

What I want is to control access based on project. For example, I have this 
svnaccess file for authz (only relevant parts shown):

[repository1:/project1]
@project1users = r
@project1admins = rw

[repository1:/project1/trunk]
@project1users = rw

This works well enough. However, I’d also like users to be able to navigate 
into their allowed locations using the web interface. If I gave everyone read 
access to [/] then they could see the repositories. But that would allow them 
to read the contents of everything as well.

Is there a way to allow users to see certain repositories in the list without 
giving recursive read access, for example, so that @project1users can navigate 
to the site in a browser, click “repository1”, then “project1”, then “trunk” 
without seeing “project2” or “repository2” or being able to access them? I wish 
there was something like this: (Note: If you want feel free to stop here, or 
maybe forward the rest of this to the developer mailing list or something.)

[/]
* = l

[repository1:/]
@project1users = vl

[repository1:/project1]
…
@project1users = v

where “l” stands for “list” which will allow a user to see visible directories 
within it, and “v” stands for “view” which will make it visible in listings for 
the parent. These would be applied NON-RECURSIVELY. So this would mean, 
combined with the previous access file:

- The / root would be “listable” which would show viewable subdirectories.
- Repository1:/ would be “viewable” so it would appear in the listing for / 
even though it’s not otherwise accessible.
- Navigating into repository1 would not be readable. However, it would be 
“listable”. The subfolder project1 would be “viewable” which means it, and it 
alone, would appear in the listing for repository1.
- Navigating into project1 would be covered by rw permissions.

You wouldn’t even need “l” - you could just use the visibility specifier. 
Additionally, you could implement it so that “v” actually traces backwards. So 
if this was the case you could just do:

[repository1:/project1]
…
@project1users = v

In that case, the root listing would see that those users should be able to see 
/project1 so it would allow them to see and click on repository1 and project1 
to get to it.

There’s another way this could be implemented without any additional options - 
if there was a way to apply rw permissions non-recursively. (Well, technically 
it would still be a new option, but I digress). This would be close, but not 
quite the same, as the “lv” extensions. Let’s say something like rw* is 
non-recursive.

[/]
* = r*

[repository1:/]
@project1users = r*

[repository1:/project1]
@project1users = r
@project1admins = rw

[repository1:/project1/trunk]
@project1users = rw

Now, root would be readable, but clicking on any other repository would result 
in an error. The root of repository 1 would be readable, so @project1users 
could click through to project1, but clicking on project2 would throw an error.

I kind of like the second option, where “v” indicates viewability and it 
applies to the parent path, allowing the user to click through to the 
directory, but there are a lot of different ways to do it.

Maybe this would be something to add to the feature list for Subversion 2, 
whenever that ends up coming out. :)

*Yes, if you’re wondering, I’ve tested for Heartbleed, and this server is 
secure. :)

Reply via email to