1 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
12 from mailer import Message
13 from config import config
16 def __init__(self, p, login):
21 self.change_requester = False
23 if p.has_option(login, "gpg_emails"):
24 self.gpg_emails = string.split(p.get(login, "gpg_emails"))
26 log.panic("acl: [%s] has no gpg_emails" % login)
28 if p.has_option(login, "mailto"):
29 self.mailto = p.get(login, "mailto")
31 if len(self.gpg_emails) > 0:
32 self.mailto = self.gpg_emails[0]
34 if p.has_option(login, "change_requester"):
35 self.change_requester = True
37 if p.has_option(login, "privs"):
38 for p in string.split(p.get(login, "privs")):
39 l = string.split(p, ":")
42 if len(l) not in (2,3) or l[0] == "" or l[1] == "":
43 log.panic("acl: invalid priv format: '%s' [%s]" % (p, login))
47 log.panic("acl: [%s] has no privs" % login)
49 def can_do(self, what, where, branch=None):
51 action = "%s:%s:%s" % (what, where, branch)
53 action = "%s:%s:N-A" % (what, where)
54 for priv in self.privs:
60 pwhat,pwhere,pbranch=priv.split(":")
61 for pbranch in pbranch.split(","):
62 priv="%s:%s:%s" % (pwhat,pwhere,pbranch)
63 if fnmatch.fnmatch(action, priv):
67 def check_priority(self, prio, where):
68 for priv in self.privs:
69 val,builder=priv.split(":")[0:2]
70 if fnmatch.fnmatch(where, builder):
86 m.set_headers(to = self.mail_to(), cc = config.builder_list)
97 mtime = os.stat(path.acl_conf)[stat.ST_MTIME]
98 if mtime != self.acl_conf_mtime:
99 log.notice("acl.conf has changed, reloading...")
105 self.acl_conf_mtime = os.stat(path.acl_conf)[stat.ST_MTIME]
106 self.current_user = None
107 status.push("reading acl.conf")
108 p = ConfigParser.ConfigParser()
109 p.readfp(open(path.acl_conf))
111 for login in p.sections():
112 if self.users.has_key(login):
113 log.panic("acl: duplicate login: %s" % login)
115 user = User(p, login)
116 for e in user.gpg_emails:
117 if self.users.has_key(e):
118 log.panic("acl: user email colision %s <-> %s" % \
119 (self.users[e].login, login))
122 self.users[login] = user
125 def user_by_email(self, ems):
127 if self.users.has_key(e):
131 def user_by_login(self, l):
135 if not self.users.has_key(l):
136 log.panic("no such user: %s" % l)
139 def set_current_user(self, u):
140 self.current_user = u
142 status.email = u.mail_to()
144 def current_user_login(self):
145 if self.current_user != None:
146 return self.current_user.login