~ubuntu-branches/ubuntu/saucy/trac-accountmanager/saucy-proposed

« back to all changes in this revision

Viewing changes to acct_mgr/admin.py

  • Committer: Bazaar Package Importer
  • Author(s): Leo Costela
  • Date: 2008-12-08 22:50:03 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20081208225003-denqsnd3e2oqlcye
Tags: 0.2.1~vcs20081031-1
new upstream checkout

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
from trac.core import *
15
15
from trac.config import Option
16
16
from trac.perm import PermissionSystem
17
 
from trac.util import sorted
18
17
from trac.util.datefmt import format_datetime
19
18
from trac.web.chrome import ITemplateProvider
20
19
from trac.admin import IAdminPanelProvider
28
27
    return [(name, value) for name, value in inspect.getmembers(cls)
29
28
            if isinstance(value, Option)]
30
29
 
 
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))
 
34
        continue
 
35
 
 
36
class StoreOrder(dict):
 
37
    """Keeps the order of the Password Stores"""
 
38
 
 
39
    instance = 0
 
40
 
 
41
    def __init__(self, d={}, stores=[], list=[]):
 
42
        self.instance += 1
 
43
        self.d = {}
 
44
        self.sxref = {}
 
45
        for store in stores:
 
46
            self.d[store] = 0
 
47
            self[0] = store
 
48
            self.sxref[store.__class__.__name__] = store
 
49
            continue
 
50
        for i, s in enumerate(list):
 
51
            self.d[s] = i + 1
 
52
            self[i + 1] = s
 
53
 
 
54
    def __getitem__(self, key):
 
55
        """Lookup a store in the list"""
 
56
        return self.d[key]
 
57
 
 
58
    def __setitem__(self, key, value):
 
59
        if isinstance(key, Component):
 
60
            order = self.d[key]
 
61
            self.d[key] = value
 
62
            self.d[order].remove(key)
 
63
            self[value] = 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)
 
69
        else:
 
70
            raise KeyError('Invalid key type (%s) for StoreOrder'
 
71
                           % str(type(key)))
 
72
        pass
 
73
 
 
74
    def get_enabled_stores(self):
 
75
        """Return an ordered list of password stores
 
76
 
 
77
        All stores that are order 0 are dropped from the list.
 
78
        """
 
79
        keys = [k for k in self.d.keys() if isinstance(k, int)]
 
80
        keys.sort()
 
81
        storelist = []
 
82
        for k in keys[1:]:
 
83
            storelist.extend(self.d[k])
 
84
            continue
 
85
        return storelist
 
86
 
 
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]
 
91
 
 
92
    def get_all_stores(self):
 
93
        return [k for k in self.d.keys() if isinstance(k, Component)]
 
94
 
 
95
    def numstores(self):
 
96
        return len(self.get_all_stores())
 
97
 
 
98
 
31
99
class AccountManagerAdminPage(Component):
32
100
 
33
101
    implements(IAdminPanelProvider, ITemplateProvider)
48
116
            return self._do_users(req)
49
117
 
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)
59
 
                    self.config.save()
 
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)
 
131
                        self.config.save()
60
132
            self.config.set('account-manager', 'force_passwd_change',
61
133
                            req.args.get('force_passwd_change'))
62
134
            self.config.save()
63
 
 
64
 
 
65
 
        try:
66
 
            selected = self.account_manager.password_store
67
 
        except AttributeError:
68
 
            selected = None
69
 
        sections = [
70
 
            {'name': store.__class__.__name__,
71
 
             'classname': store.__class__.__name__,
72
 
             'selected': store is selected,
73
 
             'options': [
74
 
                {'label': attr,
75
 
                 'name': '%s.%s' % (store.__class__.__name__, attr),
76
 
                 'value': option.__get__(store, store),
77
 
                }
78
 
                for attr, option in _getoptions(store)
79
 
             ],
80
 
            } for store in self.account_manager.stores
81
 
        ]
 
135
        sections = []
 
136
        for store in self.account_manager.stores:
 
137
            options = []
 
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
 
142
                options.append(
 
143
                            {'label': attr,
 
144
                            'name': '%s.%s' % (store.__class__.__name__, attr),
 
145
                            'value': opt_val,
 
146
                            })
 
147
                continue
 
148
            sections.append(
 
149
                        {'name': store.__class__.__name__,
 
150
                        'classname': store.__class__.__name__,
 
151
                        'order': stores[store],
 
152
                        'options' : options,
 
153
                        })
 
154
            continue
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
86
161
 
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')
92
168
 
93
169
        data = {
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,
 
175
                          'name' : None,
 
176
                          'email' : None,
 
177
                        }
97
178
        }
98
179
 
99
180
        if req.method == 'POST':
103
184
                        _create_user(req, self.env, check_permissions=False)
104
185
                    except TracError, e:
105
186
                        data['registration_error'] = e.message
 
187
                        data['acctmgr'] = e.acctmgr
106
188
                else:
107
189
                    data['registration_error'] = 'The password store does ' \
108
190
                                                 'not support creating users'
115
197
                else:
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:
 
202
                    try:
 
203
                        user = req.args.get('change_user')
 
204
                        acctmgr = { 'change_username' : user,
 
205
                        }
 
206
                        error = TracError('')
 
207
                        error.acctmgr = acctmgr
 
208
                        if not user:
 
209
                            error.message = 'Username cannot be empty.'
 
210
                            raise error
 
211
 
 
212
                        password = req.args.get('change_password')
 
213
                        if not password:
 
214
                            error.message = 'Password cannot be empty.'
 
215
                            raise error
 
216
 
 
217
                        if password != req.args.get('change_password_confirm'):
 
218
                            error.message = 'The passwords must match.'
 
219
                            raise error
 
220
 
 
221
                        self.account_manager.set_password(user, password)
 
222
                    except TracError, e:
 
223
                        data['password_change_error'] = e.message
 
224
                        data['acctmgr'] = getattr(e, 'acctmgr', '')
 
225
                else:
 
226
                    data['password_change_error'] = 'The password store does not ' \
 
227
                                                    'support changing passwords'
 
228
            
118
229
 
119
230
        if listing_enabled:
120
231
            accounts = {}