X-Git-Url: http://git.datanom.net/securemail.git/blobdiff_plain/8c4f590c61472aa754a180e918ca5de7d1af5ad6..83a29369f877307549a84dd2a60bc242eca4be7e:/db.py diff --git a/db.py b/db.py index e904fb1..93eea09 100644 --- a/db.py +++ b/db.py @@ -17,7 +17,49 @@ # You should have received a copy of the GNU General Public License # along with SecureMail. If not, see . -from config import DBTYPE, DBHOST, DBPORT, DBUID, DBPWD, DBNAME +# sqlite +sqlite_sql = """create table account ( +id int auto_increment, +token char(128) unique not null, +cipher text not null, +primary key (id))""" + +# mysql +mysql_sql = """create table account ( +id int auto_increment, +token char(128) unique not null, +cipher text not null, +primary key (id))""" + +# postgresql +postgresql_sql = """create table account ( +id serial, +token char(128) unique not null, +cipher bytea not null, +primary key (id))""" + +import base64 +from config import DBTYPE, DBNAME +try: + from config import DBUID +except ImportError: + DBUID = 'backend' +try: + from config import DBPWD +except ImportError: + DBPWD = 'clV77B2ZJQxr' +try: + from config import DBHOST +except ImportError: + DBHOST = 'localhost' +try: + from config import DBPORT +except ImportError: + if DBTYPE == 'mysql': + DBPORT = 3306 + elif DBTYPE == 'postgresql': + DBPORT = 5432 +from cryptonize import Cryptonize class Singleton: def __init__(self, klass): @@ -36,11 +78,16 @@ class DB: def get_connection(self): if self.conn is None: if DBTYPE == 'mysql': - import mysql.connector - self.conn = mysql.connector.connect(host=DBHOST, port=DBPORT, user=DBUID, password=DBPWD, database=DBNAME) + import MySQLdb + self.conn = MySQLdb.connect(host=DBHOST, port=DBPORT, user=DBUID, passwd=DBPWD, db=DBNAME) elif DBTYPE == 'postgresql': import psycopg2 self.conn = psycopg2.connect(host=DBHOST, port=DBPORT, user=DBUID, password=DBPWD, dbname=DBNAME) + elif DBTYPE == 'sqlite': + import apsw + self.conn = apsw.Connection('./{0}.db'.format(DBNAME)) + else: + raise ValueError('{0}: Unsupported database'.format(DBTYPE)) return self.conn def __del__(self): @@ -52,20 +99,104 @@ class DBInterface: def load_user(key): conn = DB().get_connection() cursor = conn.cursor() - cursor.execute("select a.cipher from account a where id = '{0}'".format(key)) + cursor.execute("select a.cipher from account a where token = '{0}'".format(key)) row = cursor.fetchone() if row is None: obj = None else: - obj = row[0].tobytes() + c = Cryptonize() + msg = base64.b64decode(row[0]) + obj = c.create_EncryptedMessage(msg) cursor.close() return obj @staticmethod def store_user(key, cipher): + if DBTYPE == 'mysql': + from MySQLdb import Error as DBError + elif DBTYPE == 'postgresql': + from psycopg2 import Error as DBError + elif DBTYPE == 'sqlite': + from apsw import Error as DBError conn = DB().get_connection() cursor = conn.cursor() - cursor.execute("insert into account(id, cipher) values(%s, %s)", (key, cipher)) - conn.commit() - cursor.close() + raw = base64.b64encode(cipher) + try: + if DBTYPE != 'sqlite': + cursor.execute("insert into account(token, cipher) values(%s, %s)", (key, raw)) + conn.commit() + else: + cursor.execute('begin') + cursor.execute("insert into account(token, cipher) values(?, ?)", (key, raw)) + cursor.execute('commit') + except DBError as e: + print (e) + if DBTYPE != 'sqlite': + conn.rollback() + else: + cursor.execute('rollback') + raise e + finally: + cursor.close() + + @staticmethod + def create_database(): + if DBTYPE == 'mysql': + from MySQLdb import Error as DBError + elif DBTYPE == 'postgresql': + from psycopg2 import Error as DBError + elif DBTYPE == 'sqlite': + from apsw import Error as DBError + conn = DB().get_connection() + cursor = conn.cursor() + try: + if DBTYPE != 'sqlite': + if DBTYPE == 'mysql': + sql = mysql_sql + elif DBTYPE == 'postgresql': + sql = postgresql_sql + cursor.execute(sql) + conn.commit() + else: + cursor.execute('begin') + cursor.execute(sqlite_sql) + cursor.execute('commit') + except DBError as e: + if DBTYPE != 'sqlite': + conn.rollback() + else: + cursor.execute('rollback') + raise e + finally: + cursor.close() + +def main(): + from optparse import OptionParser + + usage = "usage: %prog [options] arg" + parser = OptionParser(usage) + parser.add_option("-c", "--create", action="store_true", dest="create", + help="Create tables in database using config.py", default=False) + parser.add_option("-v", "--verbose", action="store_true", dest="verbose", + help="Run in verbose mode", default=False) + (options, args) = parser.parse_args() + + if options.create: + try: + if options.verbose: + print("Creating empty database") + print("Database Engine: {0}".format(DBTYPE)) + if DBTYPE != 'sqlite': + print("Database Host: {0}".format(DBHOST)) + print("Database Port: {0}".format(DBPORT)) + else: + print("Database File: ./{0}.db".format(DBNAME)) + DBInterface.create_database() + print("Database created") + except Exception as e: + print("Creating database failed!") + print(e) + +if __name__ == '__main__': + main()