28
27
return [(name, value) for name, value in inspect.getmembers(cls)
29
28
if isinstance(value, Option)]
30
def _setorder(req, stores):
31
"""Pull the password store ordering out of the req object"""
32
for store in stores.get_all_stores():
33
stores[store] = int(req.args.get(store.__class__.__name__, 0))
36
class StoreOrder(dict):
37
"""Keeps the order of the Password Stores"""
41
def __init__(self, d={}, stores=[], list=[]):
48
self.sxref[store.__class__.__name__] = store
50
for i, s in enumerate(list):
54
def __getitem__(self, key):
55
"""Lookup a store in the list"""
58
def __setitem__(self, key, value):
59
if isinstance(key, Component):
62
self.d[order].remove(key)
64
elif isinstance(key, basestring):
65
self.d[self.sxref[key]] = value
66
elif isinstance(key, int):
67
self.d.setdefault(key, [])
68
self.d[key].append(value)
70
raise KeyError('Invalid key type (%s) for StoreOrder'
74
def get_enabled_stores(self):
75
"""Return an ordered list of password stores
77
All stores that are order 0 are dropped from the list.
79
keys = [k for k in self.d.keys() if isinstance(k, int)]
83
storelist.extend(self.d[k])
87
def get_enabled_store_names(self):
88
"""Returns the class names of the enabled password stores"""
89
stores = self.get_enabled_stores()
90
return [s.__class__.__name__ for s in stores]
92
def get_all_stores(self):
93
return [k for k in self.d.keys() if isinstance(k, Component)]
96
return len(self.get_all_stores())
31
99
class AccountManagerAdminPage(Component):
33
101
implements(IAdminPanelProvider, ITemplateProvider)
48
116
return self._do_users(req)
50
118
def _do_config(self, req):
119
stores = StoreOrder(stores=self.account_manager.stores,
120
list=self.account_manager.password_store)
51
121
if req.method == 'POST':
52
selected_class = req.args.get('selected')
53
self.config.set('account-manager', 'password_store', selected_class)
54
selected = self.account_manager.password_store
55
for attr, option in _getoptions(selected):
56
newvalue = req.args.get('%s.%s' % (selected_class, attr))
57
if newvalue is not None:
58
self.config.set(option.section, option.name, newvalue)
122
_setorder(req, stores)
123
self.config.set('account-manager', 'password_store',
124
','.join(stores.get_enabled_store_names()))
125
for store in stores.get_all_stores():
126
for attr, option in _getoptions(store):
127
newvalue = req.args.get('%s.%s' % (store.__class__.__name__, attr))
128
self.log.debug("%s.%s: %s" % (store.__class__.__name__, attr, newvalue))
129
if newvalue is not None:
130
self.config.set(option.section, option.name, newvalue)
60
132
self.config.set('account-manager', 'force_passwd_change',
61
133
req.args.get('force_passwd_change'))
62
134
self.config.save()
66
selected = self.account_manager.password_store
67
except AttributeError:
70
{'name': store.__class__.__name__,
71
'classname': store.__class__.__name__,
72
'selected': store is selected,
75
'name': '%s.%s' % (store.__class__.__name__, attr),
76
'value': option.__get__(store, store),
78
for attr, option in _getoptions(store)
80
} for store in self.account_manager.stores
136
for store in self.account_manager.stores:
138
for attr, option in _getoptions(store):
139
opt_val = option.__get__(store, store)
140
opt_val = isinstance(opt_val, Component) and \
141
opt_val.__class__.__name__ or opt_val
144
'name': '%s.%s' % (store.__class__.__name__, attr),
149
{'name': store.__class__.__name__,
150
'classname': store.__class__.__name__,
151
'order': stores[store],
82
155
sections = sorted(sections, key=lambda i: i['name'])
156
numstores = range(0, stores.numstores() + 1)
83
157
data = {'sections': sections,
158
'numstores': numstores,
84
159
'force_passwd_change': self.account_manager.force_passwd_change}
85
160
return 'admin_accountsconfig.html', data
88
163
perm = PermissionSystem(self.env)
89
164
listing_enabled = self.account_manager.supports('get_users')
90
165
create_enabled = self.account_manager.supports('set_password')
166
password_change_enabled = self.account_manager.supports('set_password')
91
167
delete_enabled = self.account_manager.supports('delete_user')
94
170
'listing_enabled': listing_enabled,
95
171
'create_enabled': create_enabled,
96
172
'delete_enabled': delete_enabled,
173
'password_change_enabled': password_change_enabled,
174
'acctmgr' : { 'username' : None,
99
180
if req.method == 'POST':
116
198
data['deletion_error'] = 'The password store does not ' \
117
199
'support deleting users'
200
elif req.args.get('change'):
201
if password_change_enabled:
203
user = req.args.get('change_user')
204
acctmgr = { 'change_username' : user,
206
error = TracError('')
207
error.acctmgr = acctmgr
209
error.message = 'Username cannot be empty.'
212
password = req.args.get('change_password')
214
error.message = 'Password cannot be empty.'
217
if password != req.args.get('change_password_confirm'):
218
error.message = 'The passwords must match.'
221
self.account_manager.set_password(user, password)
223
data['password_change_error'] = e.message
224
data['acctmgr'] = getattr(e, 'acctmgr', '')
226
data['password_change_error'] = 'The password store does not ' \
227
'support changing passwords'
119
230
if listing_enabled: