This should fix the racecondition issues with the sqlite backend.
[quassel.git] / scripts / manageusers.py
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3 #
4 # Requires at least python version 2.5
5
6 """Usage:
7     manageusers.py (add|changepass) <username> <password>
8     manageusers.py list"""
9
10 import os
11 import sha
12 import sys
13 from pprint import pprint
14
15 try:
16     import sqlite3
17 except ImportError:
18     print >> sys.stderr, "ERROR: sqlite3 module not available!"
19     print >> sys.stderr, "This script needs sqlite3 support which is part of Python 2.5"
20     print >> sys.stderr, "You probably need to upgrade your Python installation first."
21     sys.exit(3)
22
23 class UserManager(object):
24     def __init__(self):
25         dbpaths = [os.environ['HOME'] + '/.quassel/quassel-storage.sqlite',
26                    os.environ['HOME'] + '/.config/quassel-irc.org/quassel-storage.sqlite',
27                    '/var/cache/quassel/quassel-storage.sqlite']
28         for dbpath in dbpaths:
29             if os.path.exists(dbpath):
30                 self.db = sqlite3.connect(dbpath)
31                 break
32
33         self.cursor = self.db.cursor()
34
35     def __del__(self):
36         self.db.commit()
37         self.db.close();
38
39     def _shaCrypt(self, password):
40         return sha.new(password).hexdigest()
41
42     def add(self, username, password):
43         self.cursor.execute('INSERT INTO quasseluser (username, password) VALUES (:username, :password)',
44             {'username':username, 'password':self._shaCrypt(password)}).fetchone()
45
46     def changepass(self, username, password):
47         self.cursor.execute('UPDATE quasseluser SET password = :password WHERE username = :username',
48             {'username':username, 'password':self._shaCrypt(password)}).fetchone()
49
50     def list(self):
51         return self.cursor.execute("SELECT * FROM quasseluser").fetchall()
52
53     def callByName(self, name, *args, **kws):
54         return self.__getattribute__(name)(*args, **kws)
55
56 def main():
57     usermanager = UserManager()
58
59     try:
60         action = sys.argv[1].lower()
61     except:
62         print(__doc__)
63         return
64
65     if action == 'list':
66         pprint(usermanager.list())
67     elif action in ['add', 'changepass'] and len(sys.argv) > 3:
68         usermanager.callByName(action, sys.argv[2], sys.argv[3])
69     else:
70         print("ERROR: Wrong arguments supplied.")
71         print(__doc__)
72
73 if __name__ == "__main__":
74     main()