Mercurial > wikked
annotate wikked/auth.py @ 35:2b35d719f342
Handle wiki and page permissions for read/write access.
Refactored code to only have one place where page title "slugification" happens.
Made that "slugification" better by replacing diacritics with their ANSI
character equivalent (on both server and client).
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 06 Jan 2013 20:22:36 -0800 |
parents | 30ae685b86df |
children | 86ee1b696070 |
rev | line source |
---|---|
35
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
1 import re |
13
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
2 import logging |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
3 |
0 | 4 |
5 class User(object): | |
13
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
6 def __init__(self, username, password): |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
7 self.username = username |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
8 self.password = password |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
9 self.groups = [] |
0 | 10 |
11 def is_authenticated(self): | |
12 return True | |
13 | |
14 def is_active(self): | |
15 return True | |
16 | |
17 def is_anonymous(self): | |
18 return False | |
19 | |
20 def get_id(self): | |
13
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
21 return unicode(self.username) |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
22 |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
23 def is_admin(self): |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
24 return 'administrators' in self.groups |
0 | 25 |
26 | |
13
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
27 class UserManager(object): |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
28 def __init__(self, config, logger=None): |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
29 if logger is None: |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
30 logger = logging.getLogger('wikked.auth') |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
31 self.logger = logger |
35
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
32 self._updatePermissions(config) |
13
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
33 self._updateUserInfos(config) |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
34 |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
35 def getUsers(self): |
35
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
36 for user in self._users: |
13
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
37 yield self._createUser(user) |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
38 |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
39 def getUser(self, username): |
35
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
40 for user in self._users: |
13
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
41 if user['username'] == username: |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
42 return self._createUser(user) |
0 | 43 return None |
13
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
44 |
35
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
45 def isPageReadable(self, page, username): |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
46 return self._isAllowedForMeta(page, 'readers', username) |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
47 |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
48 def isPageWritable(self, page, username): |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
49 return self._isAllowedForMeta(page, 'writers', username) |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
50 |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
51 def _isAllowedForMeta(self, page, meta_name, username): |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
52 if (self._permissions[meta_name] is not None and |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
53 username not in self._permissions[meta_name]): |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
54 return False |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
55 if meta_name in page.all_meta['user']: |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
56 allowed = [r.strip() for r in re.split(r'[ ,;]', page.all_meta['user'][meta_name])] |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
57 if username is None: |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
58 return 'anonymous' in allowed |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
59 else: |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
60 return '*' in allowed or username in allowed |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
61 return True |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
62 |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
63 def _updatePermissions(self, config): |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
64 self._permissions = { |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
65 'readers': None, |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
66 'writers': None |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
67 } |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
68 if config.has_option('permissions', 'readers'): |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
69 self._permissions['readers'] = [p.strip() for p in re.split(r'[ ,;]', config.get('permissions', 'readers'))] |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
70 if config.has_option('permissions', 'writers'): |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
71 self._permissions['writers'] = [p.strip() for p in re.split(r'[ ,;]', config.get('permissions', 'writers'))] |
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
72 |
13
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
73 def _updateUserInfos(self, config): |
35
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
74 self._users = [] |
13
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
75 if config.has_section('users'): |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
76 groups = [] |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
77 if config.has_section('groups'): |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
78 groups = config.items('groups') |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
79 |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
80 for user in config.items('users'): |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
81 user_info = { 'username': user[0], 'password': user[1], 'groups': [] } |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
82 for group in groups: |
35
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
83 users_in_group = [u.strip() for u in re.split(r'[ ,;]', group[1])] |
13
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
84 if user[0] in users_in_group: |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
85 user_info['groups'].append(group[0]) |
35
2b35d719f342
Handle wiki and page permissions for read/write access.
Ludovic Chabant <ludovic@chabant.com>
parents:
13
diff
changeset
|
86 self._users.append(user_info) |
13
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
87 |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
88 def _createUser(self, user_info): |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
89 user = User(user_info['username'], user_info['password']) |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
90 user.groups = list(user_info['groups']) |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
91 return user |
30ae685b86df
Added support for authentatication
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
92 |