~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to contrib/bzr_access

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2008-04-07 07:52:50 UTC
  • mfrom: (3340.1.1 208418-1.4)
  • Revision ID: pqm@pqm.ubuntu.com-20080407075250-phs53xnslo8boaeo
Return the correct knit serialisation method in _StreamAccess.
        (Andrew Bennetts, Martin Pool, Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
#
19
19
# You should have received a copy of the GNU General Public License
20
20
# along with this program; if not, write to the Free Software
21
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
21
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
22
#
23
23
###############################################################################
24
24
"""
40
40
the users belonging to the given groups. (User names must be separated by
41
41
commas.)
42
42
 
43
 
Right now only one section is supported [/], defining the permissions for the
44
 
repository. The options in those sections are user names or group references
45
 
(group name with a leading '@'), the corresponding values are the 
46
 
permissions: 'rw', 'r' and '' (without the quotes)
47
 
for read-write, read-only and no access, respectively.
 
43
All other sections names should be path names (starting with '/'), defining
 
44
the permissions for the given path. The options in those sections are user
 
45
names or group references (group name with a leading '@'), the corresponding
 
46
values are the permissions: 'rw', 'r' and '' (without the quotes) for
 
47
read-write, read-only and no access, respectively.
 
48
 
 
49
Only the options in the section with the longest matching name are evaluated.
 
50
The last relevant option for the user is used.
48
51
 
49
52
Sample bzr_access.conf::
50
53
 
52
55
   admins = alpha
53
56
   devels = beta, gamma, delta
54
57
   
55
 
   [/]
 
58
   [/test/trunk]
56
59
   @admins = rw
57
60
   @devels = r
 
61
   
 
62
   [/test/branches]
 
63
   @admins = rw
 
64
   @devels = rw
 
65
 
58
66
 
59
67
This allows you to set up a single SSH user, and customize the access based on
60
68
ssh key. Your ``.ssh/authorized_key`` file should look something like this::
123
131
                self.groups[group] = set([ s.strip() for s in users.split(",")])
124
132
        
125
133
 
126
 
    def permission(self, user):
 
134
    def permission(self, user, path):
127
135
        """Determines the permission for a given user and a given path
128
136
        :param user: user to look for.
 
137
        :param path: path to look for.
129
138
        :return: permission.
130
139
        """
131
 
        configSection = "/"
 
140
        if not path.startswith("/"):
 
141
            return PERM_DENIED
132
142
        perm = PERM_DENIED
133
 
        pathFound = self.config.has_section(configSection)
134
 
        if (pathFound):
135
 
            options = reversed(self.config.options(configSection))
136
 
            for option in options:
137
 
                value = PERM_DICT.get(self.config.get(configSection, option),
138
 
                                      PERM_DENIED)
139
 
                if self._is_relevant(option, user):
140
 
                    perm = value
 
143
        pathFound = False
 
144
        while not pathFound and path != "/":
 
145
            print >>sys.stderr, "DEBUG:", path
 
146
            pathFound = self.config.has_section(path)
 
147
            if (pathFound):
 
148
                options = reversed(self.config.options(path))
 
149
                for option in options:
 
150
                    value = PERM_DICT.get(self.config.get(path, option),
 
151
                                          PERM_DENIED)
 
152
                    if self._is_relevant(option, user):
 
153
                        perm = value
 
154
            else:
 
155
                path = os.path.dirname(path)
141
156
        return perm
142
 
 
 
157
      
143
158
      
144
159
    def _is_relevant(self, option, user):
145
160
        """Decides if a certain option is relevant for a given user.
210
225
        error("Can't read config file.", EXIT_NOCONF)
211
226
    
212
227
    # Determine permission and execute bzr with appropriate options
213
 
    perm = accessMan.permission(user)
214
 
    command = [bzrExec] + BZR_OPTIONS + [repoRoot]
 
228
    perm = accessMan.permission(user, directory)
 
229
    absDir = os.path.join(repoRoot, directory)
 
230
    command = [bzrExec] + BZR_OPTIONS + [absDir]
215
231
    if perm == PERM_READ:
216
232
        # Nothing extra needed for readonly operations
217
233
        pass