annotate pylons_app/lib/auth.py @ 48:8e250e86a670

Css fixes, implemented removal of users, and display draft
author Marcin Kuzminski <marcin@python-blog.com>
date Wed, 07 Apr 2010 21:10:43 +0200
parents 9db7782727b3
children 25e516447a33
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
41
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
1 import sqlite3
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
2 import os
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
3 import logging
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
4 from os.path import dirname as dn
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
5 from datetime import datetime
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
6 import crypt
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
7
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
8 log = logging.getLogger(__name__)
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
9 ROOT = dn(dn(dn(os.path.realpath(__file__))))
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
10
44
d924b931b488 Added managment pages.
marcink
parents: 42
diff changeset
11 def get_sqlite_conn_cur():
41
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
12 conn = sqlite3.connect(os.path.join(ROOT, 'auth.sqlite'))
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
13 cur = conn.cursor()
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
14 return conn, cur
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
15
46
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
16
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
17 def admin_auth(username, password):
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
18 conn, cur = get_sqlite_conn_cur()
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
19 password_crypt = crypt.crypt(password, '6a')
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
20
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
21 try:
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
22 cur.execute("SELECT * FROM users WHERE username=?", (username,))
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
23 data = cur.fetchone()
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
24 except sqlite3.OperationalError as e:
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
25 data = None
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
26 log.error(e)
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
27
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
28 if data:
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
29 if data[3]:
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
30 if data[1] == username and data[2] == password_crypt and data[4]:
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
31 log.info('user %s authenticated correctly', username)
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
32 return True
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
33 else:
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
34 log.error('user %s is disabled', username)
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
35
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
36 return False
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
37
41
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
38 def authfunc(environ, username, password):
44
d924b931b488 Added managment pages.
marcink
parents: 42
diff changeset
39 conn, cur = get_sqlite_conn_cur()
41
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
40 password_crypt = crypt.crypt(password, '6a')
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
41
42
b2bc08f2974b try except error on non existing user table
marcink
parents: 41
diff changeset
42 try:
b2bc08f2974b try except error on non existing user table
marcink
parents: 41
diff changeset
43 cur.execute("SELECT * FROM users WHERE username=?", (username,))
b2bc08f2974b try except error on non existing user table
marcink
parents: 41
diff changeset
44 data = cur.fetchone()
b2bc08f2974b try except error on non existing user table
marcink
parents: 41
diff changeset
45 except sqlite3.OperationalError as e:
b2bc08f2974b try except error on non existing user table
marcink
parents: 41
diff changeset
46 data = None
b2bc08f2974b try except error on non existing user table
marcink
parents: 41
diff changeset
47 log.error(e)
41
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
48 if data:
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
49 if data[3]:
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
50 if data[1] == username and data[2] == password_crypt:
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
51 log.info('user %s authenticated correctly', username)
45
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
52 if environ:
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
53 http_accept = environ.get('HTTP_ACCEPT')
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
54
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
55 if http_accept.startswith('application/mercurial') or \
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
56 environ['PATH_INFO'].find('raw-file') != -1:
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
57 cmd = environ['PATH_INFO']
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
58 for qry in environ['QUERY_STRING'].split('&'):
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
59 if qry.startswith('cmd'):
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
60 cmd += "|" + qry
41
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
61
45
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
62 try:
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
63 cur.execute('''INSERT INTO
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
64 user_logs
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
65 VALUES(?,?,?,?)''',
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
66 (None, data[0], cmd, datetime.now()))
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
67 conn.commit()
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
68 except Exception as e:
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
69 conn.rollback()
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
70 log.error(e)
a886f5eba757 implemented admin page login
marcink
parents: 44
diff changeset
71
41
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
72 return True
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
73 else:
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
74 log.error('user %s is disabled', username)
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
75
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
76 return False
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
77
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
78 def create_user_table():
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
79 '''
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
80 Create a auth database
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
81 '''
44
d924b931b488 Added managment pages.
marcink
parents: 42
diff changeset
82 conn, cur = get_sqlite_conn_cur()
41
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
83 try:
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
84 log.info('creating table %s', 'users')
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
85 cur.execute('''DROP TABLE IF EXISTS users ''')
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
86 cur.execute('''CREATE TABLE users
48
8e250e86a670 Css fixes, implemented removal of users, and display draft
Marcin Kuzminski <marcin@python-blog.com>
parents: 46
diff changeset
87 (user_id INTEGER PRIMARY KEY AUTOINCREMENT,
41
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
88 username TEXT,
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
89 password TEXT,
46
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
90 active INTEGER,
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
91 admin INTEGER)''')
41
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
92 log.info('creating table %s', 'user_logs')
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
93 cur.execute('''DROP TABLE IF EXISTS user_logs ''')
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
94 cur.execute('''CREATE TABLE user_logs
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
95 (id INTEGER PRIMARY KEY AUTOINCREMENT,
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
96 user_id INTEGER,
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
97 last_action TEXT,
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
98 last_action_date DATETIME)''')
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
99 conn.commit()
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
100 except:
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
101 conn.rollback()
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
102 raise
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
103
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
104 cur.close()
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
105
46
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
106 def create_user(username, password, admin=False):
44
d924b931b488 Added managment pages.
marcink
parents: 42
diff changeset
107 conn, cur = get_sqlite_conn_cur()
41
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
108 password_crypt = crypt.crypt(password, '6a')
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
109 log.info('creating user %s', username)
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
110 try:
46
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
111 cur.execute('''INSERT INTO users values (?,?,?,?,?) ''',
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
112 (None, username, password_crypt, 1, admin))
41
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
113 conn.commit()
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
114 except:
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
115 conn.rollback()
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
116 raise
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
117
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
118 if __name__ == "__main__":
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
119 create_user_table()
46
9db7782727b3 Static files for production fixed
Marcin Kuzminski <marcin@python-blog.com>
parents: 45
diff changeset
120 create_user('marcink', 'qweqwe', True)
41
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
121 create_user('lukaszd', 'qweqwe')
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
122 create_user('adriand', 'qweqwe')
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
123 create_user('radek', 'qweqwe')
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
124 create_user('skrzeka', 'qweqwe')
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
125 create_user('bart', 'qweqwe')
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
126 create_user('maho', 'qweqwe')
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
127 create_user('michalg', 'qweqwe')
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
128
71ffa932799d Added app basic auth.
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
129 #authfunc('', 'marcink', 'qweqwe')