]> ToastFreeware Gitweb - philipp/winterrodeln/wradmin.git/blob - wradmin/lib/mediawiki.py
5a31cf0898e44712d78250ad2f62f5d85184dff4
[philipp/winterrodeln/wradmin.git] / wradmin / lib / mediawiki.py
1 #!/usr/bin/python2.6
2 # -*- coding: iso-8859-15 -*-
3 # $Id$
4 "MediaWiki communication functions"
5 import datetime
6 import re
7
8 from authkit.users import UsersReadOnly, md5, AuthKitError
9 import formencode, formencode.national
10
11 import logging
12 log = logging.getLogger(__name__)
13
14 import wradmin.model as model
15 import wradmin.model.validators
16
17
18 # User management
19 # ---------------
20
21 class MediaWikiUsers(UsersReadOnly):
22     def __init__(self, data=None, encrypt=None):
23         UsersReadOnly.__init__(self, data, encrypt)
24
25         # Initialize class fields
26         self.usernames = []
27         self.passwords = {}
28         self.roles = {}
29         self.groups = {}
30         self.user_ids = {} # MediaWiki user_id field of the database
31         self.real_names = {} # Real names of the users
32         self.emails = {} # E-Mail addresses of the users
33         
34         # Query database
35         con = model.meta.engine.connect()
36         sql = "SELECT user_id, user_name, user_real_name, user_password, user_email FROM user, user_groups WHERE ug_user=user_id AND ug_group='beauftragte'"
37         result = con.execute(sql)
38         for row in result:
39             user_id, username, real_name, password, email = row
40             username = username.lower()
41             role = []
42             group = None
43             
44             self.usernames.append(username)
45             self.passwords[username] = password
46             self.roles[username] = role
47             self.groups[username] = group
48             self.user_ids[username] = user_id
49             self.real_names[username] = real_name
50             self.emails[username] = email
51         con.close()
52         log.info("%d users loaded from the MediaWiki database" % len(self.usernames))
53     
54     
55     def user_has_password(self, username, password):
56         """
57         Passwords are case sensitive.
58         Returns ``True`` if the user has the password specified, ``False`` otherwise. 
59         Raises an exception if the user doesn't exist.
60         
61         See http://www.winterrodeln.org/trac/wiki/MediaWikiAuthorization
62         """
63         pwd = self.user_password(username)
64         # Example: pwd = ':B:d25b2886:41e46c952790b1b442aac4f24f7ea7a8'
65         pwd_parts = pwd.split(':') # password_parts = ['', 'B', 'd25b2886', '41e46c952790b1b442aac4f24f7ea7a8']
66         if len(pwd_parts) == 4 and pwd_parts[1] == 'B':
67             salt, pwd_md5 = tuple(pwd_parts[2:4]) # salt = 'd25b2886'; pwd_md5 = '41e46c952790b1b442aac4f24f7ea7a8'
68         else:
69             raise AuthKitError("Password in the MediaWiki database format has an unexpected format ('%s' instead of e.g. ':B:d25b2886:41e46c952790b1b442aac4f24f7ea7a8')" % pwd)
70         # log.info("user: '%s'; md5 of salt+' '+entered_pwd: '%s'; md5-part of DB-pwd: %s" % (username, md5(salt + '-' + md5(password)), pwd_md5))
71         return md5(salt + '-' + md5(password)) == pwd_md5