diff --git a/server.py b/server.py index 4de14bc6ed2569bae154cdce59b9cdd3a81d3fbc..506c2f1671f4f4a7b6a0460d8d393e69ec970797 100755 --- a/server.py +++ b/server.py @@ -1,13 +1,11 @@ #!/bin/python - -from flask import * +from flask import Flask, g, request, url_for, redirect, session, render_template, flash from functools import wraps import datetime -import sqlite3 import os -import re app = Flask(__name__) + config = app.config config['DB_SCHEMA'] = 'db_schema.sql' config['DB_DATA'] = 'db_example.sql' @@ -17,110 +15,17 @@ config['SQLITE_INIT_SCHEMA'] = True config['SQLITE_INIT_DATA'] = False config['DEBUG'] = False config['VIDEOPREFIX'] = 'https://videoag.fsmpi.rwth-aachen.de' + if __name__ == '__main__': config['SQLITE_INIT_DATA'] = True config['DEBUG'] = True -config.from_pyfile('config.py', silent=True) -app.jinja_env.globals['videoprefix'] = config['VIDEOPREFIX'] -mod_endpoints = [] - -if config['DB_ENGINE'] == 'sqlite': - created = not os.path.exists(config['SQLITE_DB']) - db = sqlite3.connect(config['SQLITE_DB']) - cur = db.cursor() - if config['SQLITE_INIT_SCHEMA']: - cur.executescript(open(config['DB_SCHEMA']).read()) - if config['SQLITE_INIT_DATA'] and created: - cur.executescript(open(config['DB_DATA']).read()) - db.commit() - db.close() - -# Row wrapper for sqlite -def dict_factory(cursor, row): - d = {} - for idx, col in enumerate(cursor.description): - if type(row[idx]) == str: - d[col[0].split('.')[-1]] = row[idx].replace('\\n','\n').replace('\\r','\r') - else: - d[col[0].split('.')[-1]] = row[idx] - return d -def query(operation, *params): - if config['DB_ENGINE'] == 'mysql': - import mysql.connector - if 'db' not in g or not g.db.is_connected(): - g.db = mysql.connector.connect(user=config['MYSQL_USER'], password=config['MYSQL_PASSWD'], host=config['MYSQL_HOST'], database=config['MYSQL_DB']) - if not hasattr(request, 'db'): - request.db = g.db.cursor(dictionary=True) - request.db.execute(operation.replace('?', '%s'), params) - elif config['DB_ENGINE'] == 'sqlite': - if 'db' not in g: - g.db = sqlite3.connect(config['SQLITE_DB']) - g.db.row_factory = dict_factory - g.db.isolation_level = None - if not hasattr(request, 'db'): - request.db = g.db.cursor() - request.db.execute(operation, params) - else: - return [] - return request.db.fetchall() - -@app.teardown_request -def commit_db(*args): - if hasattr(request, 'db'): - request.db.close() - g.db.commit() - -def searchquery(text, columns, match, tables, suffix, *suffixparams): - params = [] - subexprs = [] - words = text.split(' ') - prio = len(words)+1 - for word in words: - if word == '' or word.isspace(): - continue - matchexpr = ' OR '.join(['%s LIKE ?'%column for column in match]) - subexprs.append('SELECT %s, %s AS _prio FROM %s WHERE %s'%(columns, str(prio), tables, matchexpr)) - params += ['%'+word+'%']*len(match) - prio -= 1 - if subexprs == []: - return [] - expr = 'SELECT *,SUM(_prio) AS _score FROM (%s) AS _tmp %s'%(' UNION '.join(subexprs), suffix) - return query(expr, *params, *suffixparams) - -LDAP_USERRE = re.compile(r'[^a-z0-9]') -notldap = { - 'videoag':('videoag', ['users','videoag'], {'uid': 'videoag', 'givenName': 'Video', 'sn': 'Geier'}), - 'gustav':('passwort', ['users'], {'uid': 'gustav', 'givenName': 'Gustav', 'sn': 'Geier'}) -} +config.from_pyfile('config.py', silent=True) -def ldapauth(user, password): - user = LDAP_USERRE.sub(r'', user.lower()) - if 'LDAP_HOST' in config: - import ldap3 - try: - conn = ldap3.Connection(config['LDAP_HOST'], 'uid=%s,ou=users,dc=fsmpi,dc=rwth-aachen,dc=de'%user, password, auto_bind=True) - if conn.search("ou=groups,dc=fsmpi,dc=rwth-aachen,dc=de", "(&(cn=*)(memberUid=%s))"%user, attributes=['cn']): - groups = [e.cn.value for e in conn.entries] - conn.unbind() - return user, groups - except ldap3.core.exceptions.LDAPBindError: - pass - elif config.get('DEBUG') and user in notldap and password == notldap[user][0]: - return user, notldap[user][1] - return None, [] +from db import query, searchquery, ldapauth, ldapget -def ldapget(user): - user = LDAP_USERRE.sub(r'', user.lower()) - if 'LDAP_HOST' in config: - import ldap3 - conn = ldap3.Connection('ldaps://rumo.fsmpi.rwth-aachen.de', auto_bind=True) - conn.search("ou=users,dc=fsmpi,dc=rwth-aachen,dc=de", "(uid=%s)"%user, - attributes=ldap3.ALL_ATTRIBUTES) - e = conn.entries[0] - return {'uid': user, 'givenName': e.givenName.value, 'sn':e.sn.value} - else: - return notldap[user][2] +app.jinja_env.globals['videoprefix'] = config['VIDEOPREFIX'] +mod_endpoints = [] def ismod(*args): return ('user' in session) @@ -136,7 +41,6 @@ def mod_required(func): return redirect(url_for('login', ref=request.url)) else: return func(*args, **kwargs) - print(decorator.__name__) return decorator app.jinja_env.globals['navbar'] = []