annotate examples/trac/trac/versioncontrol/svn_authz.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2004-2005 Edgewall Software
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2004 Francois Harvey <fharvey@securiweb.net>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # Copyright (C) 2005 Matthew Good <trac@matt-good.net>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # individuals. For the exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16 # Author: Francois Harvey <fharvey@securiweb.net>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 # Matthew Good <trac@matt-good.net>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 from trac.config import Option
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20 from trac.core import *
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21 from trac.versioncontrol import Authorizer
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24 class SvnAuthzOptions(Component):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26 authz_file = Option('trac', 'authz_file', '',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27 """Path to Subversion
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28 [http://svnbook.red-bean.com/en/1.1/ch06s04.html#svn-ch-6-sect-4.4.2 authorization (authz) file]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 """)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31 authz_module_name = Option('trac', 'authz_module_name', '',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32 """The module prefix used in the authz_file.""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 def SubversionAuthorizer(env, authname):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 authz_file = env.config.get('trac', 'authz_file')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37 if not authz_file:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38 return Authorizer()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40 module_name = env.config.get('trac', 'authz_module_name')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 db = env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 return RealSubversionAuthorizer(db, authname, module_name, authz_file)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44 def parent_iter(path):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 path = path.strip('/')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46 if path:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47 path = '/' + path + '/'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49 path = '/'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51 while 1:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52 yield path
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 if path == '/':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54 raise StopIteration()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55 path = path[:-1]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56 yield path
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 idx = path.rfind('/')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58 path = path[:idx + 1]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 class RealSubversionAuthorizer(Authorizer):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63 auth_name = ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64 module_name = ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65 conf_authz = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 def __init__(self, db, auth_name, module_name, cfg_file, cfg_fp=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68 self.db = db
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 self.auth_name = auth_name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70 self.module_name = module_name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72 from ConfigParser import ConfigParser
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 self.conf_authz = ConfigParser()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 if cfg_fp:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75 self.conf_authz.readfp(cfg_fp, cfg_file)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76 elif cfg_file:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77 self.conf_authz.read(cfg_file)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 self.groups = self._groups()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81 def has_permission(self, path):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82 if path is None:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 return 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85 for p in parent_iter(path):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86 if self.module_name:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87 for perm in self._get_section(self.module_name + ':' + p):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 if perm is not None:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89 return perm
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90 for perm in self._get_section(p):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91 if perm is not None:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92 return perm
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94 return 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96 def has_permission_for_changeset(self, rev):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97 cursor = self.db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98 cursor.execute("SELECT path FROM node_change WHERE rev=%s", (rev,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 for row in cursor:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100 if self.has_permission(row[0]):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101 return 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102 return 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104 # Internal API
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106 def _groups(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107 if not self.conf_authz.has_section('groups'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108 return []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110 grp_parents = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111 usr_grps = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113 for group in self.conf_authz.options('groups'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114 for member in self.conf_authz.get('groups', group).split(','):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115 member = member.strip()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116 if member == self.auth_name:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117 usr_grps.append(group)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118 elif member.startswith('@'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119 grp_parents.setdefault(member[1:], []).append(group)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121 expanded = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 def expand_group(group):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124 if group in expanded:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125 return
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126 expanded[group] = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127 for parent in grp_parents.get(group, []):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128 expand_group(parent)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130 for g in usr_grps:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131 expand_group(g)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
132
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
133 # expand groups
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
134 return expanded.keys()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
135
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
136 def _get_section(self, section):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
137 if not self.conf_authz.has_section(section):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
138 return
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
139
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
140 yield self._get_permission(section, self.auth_name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
141
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
142 group_perm = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
143 for g in self.groups:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
144 p = self._get_permission(section, '@' + g)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
145 if p is not None:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
146 group_perm = p
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
147
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
148 if group_perm:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
149 yield 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
150
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
151 yield group_perm
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
152
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
153 yield self._get_permission(section, '*')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
154
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
155 def _get_permission(self, section, subject):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
156 if self.conf_authz.has_option(section, subject):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
157 return 'r' in self.conf_authz.get(section, subject)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
158 return None
Copyright (C) 2012-2017 Edgewall Software