changeset 64:08707974eae4

Changed auth lib for sqlalchemy
author Marcin Kuzminski <marcin@python-blog.com>
date Sat, 10 Apr 2010 16:44:47 +0200
parents 3cf0603cd4f5
children 3f65447f6c02
files pylons_app/lib/auth.py
diffstat 1 files changed, 34 insertions(+), 88 deletions(-) [+]
line wrap: on
line diff
--- a/pylons_app/lib/auth.py	Sat Apr 10 16:43:34 2010 +0200
+++ b/pylons_app/lib/auth.py	Sat Apr 10 16:44:47 2010 +0200
@@ -1,35 +1,31 @@
-import sqlite3
-import os
 import logging
-from os.path import dirname as dn
 from datetime import datetime
 import crypt
 from pylons import session, url
 from pylons.controllers.util import abort, redirect
 from decorator import decorator
+from sqlalchemy.exc import OperationalError
 log = logging.getLogger(__name__)
-ROOT = dn(dn(dn(os.path.realpath(__file__))))
+from pylons_app.model import meta
+from pylons_app.model.db import Users, UserLogs
+from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
 
-def get_sqlite_conn_cur():
-    conn = sqlite3.connect(os.path.join(ROOT, 'auth.sqlite'))
-    cur = conn.cursor()
-    return conn, cur
-
+def get_crypt_password(password):
+    return crypt.crypt(password, '6a')
 
 def admin_auth(username, password):
-    conn, cur = get_sqlite_conn_cur()
-    password_crypt = crypt.crypt(password, '6a')
+    sa = meta.Session
+    password_crypt = get_crypt_password(password)
 
     try:
-        cur.execute("SELECT * FROM users WHERE username=?", (username,))
-        data = cur.fetchone()
-    except sqlite3.OperationalError as e:
-        data = None
+        user = sa.query(Users).filter(Users.username == username).one()
+    except (NoResultFound, MultipleResultsFound, OperationalError) as e:
         log.error(e)
+        user = None
         
-    if data:
-        if data[3]:
-            if data[1] == username and data[2] == password_crypt and data[4]:
+    if user:
+        if user.active:
+            if user.username == username and user.password == password_crypt and user.admin:
                 log.info('user %s authenticated correctly', username)
                 return True
         else:
@@ -38,37 +34,39 @@
     return False
 
 def authfunc(environ, username, password):
-    conn, cur = get_sqlite_conn_cur()
-    password_crypt = crypt.crypt(password, '6a')
-
+    sa = meta.Session
+    password_crypt = get_crypt_password(password)
+    
     try:
-        cur.execute("SELECT * FROM users WHERE username=?", (username,))
-        data = cur.fetchone()
-    except sqlite3.OperationalError as e:
-        data = None
+        user = sa.query(Users).filter(Users.username == username).one()
+    except (NoResultFound, MultipleResultsFound, OperationalError) as e:
         log.error(e)
-    if data:
-        if data[3]:
-            if data[1] == username and data[2] == password_crypt:
+        user = None
+        
+    if user:
+        if user.active:
+            if user.username == username and user.password == password_crypt:
                 log.info('user %s authenticated correctly', username)
                 if environ:
                     http_accept = environ.get('HTTP_ACCEPT')
             
                     if http_accept.startswith('application/mercurial') or \
                         environ['PATH_INFO'].find('raw-file') != -1:
-                        cmd = environ['PATH_INFO']
+                        repo = environ['PATH_INFO']
                         for qry in environ['QUERY_STRING'].split('&'):
                             if qry.startswith('cmd'):
-                                cmd += "|" + qry
                                 
                                 try:
-                                    cur.execute("""INSERT INTO 
-                                                        user_logs 
-                                                   VALUES(?,?,?,?)""",
-                                                    (None, data[0], cmd, datetime.now()))
-                                    conn.commit()
+                                    user_log = UserLogs()
+                                    user_log.user_id = user.user_id
+                                    user_log.action = qry
+                                    user_log.repository = repo
+                                    user_log.action_date = datetime.now()
+                                    sa.add(user_log)
+                                    sa.commit()
+                                    log.info('Adding user %s, action %s', username, qry)
                                 except Exception as e:
-                                    conn.rollback()
+                                    sa.rollback()
                                     log.error(e)
                                   
                 return True
@@ -84,55 +82,3 @@
         redirect(url('admin_home'), 301)
     return fn(*args, **kwargs)
 
-def create_user_table():
-    """
-    Create a auth database
-    """
-    conn, cur = get_sqlite_conn_cur()
-    try:
-        log.info('creating table %s', 'users')
-        cur.execute("""DROP TABLE IF EXISTS users """)
-        cur.execute("""CREATE TABLE users
-                        (user_id INTEGER PRIMARY KEY AUTOINCREMENT, 
-                         username TEXT, 
-                         password TEXT,
-                         active INTEGER,
-                         admin INTEGER)""")
-        log.info('creating table %s', 'user_logs')
-        cur.execute("""DROP TABLE IF EXISTS user_logs """)
-        cur.execute("""CREATE TABLE user_logs
-                        (id INTEGER PRIMARY KEY AUTOINCREMENT,
-                            user_id INTEGER,
-                            last_action TEXT, 
-                            last_action_date DATETIME)""")
-        conn.commit()
-    except:
-        conn.rollback()
-        raise
-    
-    cur.close()
-    
-def create_user(username, password, admin=False):
-    conn, cur = get_sqlite_conn_cur()    
-    password_crypt = crypt.crypt(password, '6a')
-    log.info('creating user %s', username)
-    try:
-        cur.execute("""INSERT INTO users values (?,?,?,?,?) """,
-                    (None, username, password_crypt, 1, admin))     
-        conn.commit()
-    except:
-        conn.rollback()
-        raise
-    
-if __name__ == "__main__":
-    create_user_table()
-    create_user('marcink', 'qweqwe', True)
-    create_user('lukaszd', 'qweqwe')
-    create_user('adriand', 'qweqwe')
-    create_user('radek', 'qweqwe')
-    create_user('skrzeka', 'qweqwe')
-    create_user('bart', 'qweqwe')
-    create_user('maho', 'qweqwe')
-    create_user('michalg', 'qweqwe')
-    
-    #authfunc('', 'marcink', 'qweqwe')