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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 def is_authenticated(self):
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 return True
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 def is_active(self):
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 return True
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 def is_anonymous(self):
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 return False
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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
c946f4facfa2 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
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