diff --git a/ankisyncctl.py b/ankisyncctl.py index ffaaeea..96e34ff 100755 --- a/ankisyncctl.py +++ b/ankisyncctl.py @@ -1,11 +1,12 @@ #!/usr/bin/env python +from __future__ import print_function + import os import sys -import binascii import getpass -import hashlib -import sqlite3 + +from ankisyncd.users import SqliteUserManager DATAPREFIX = os.path.join(os.path.expanduser("~"), ".local", "share") DATADIR = os.path.join(DATAPREFIX, "ankisyncd") @@ -13,81 +14,61 @@ AUTHDBPATH = os.path.join(DATADIR, "auth.db") COLLECTIONPATH = os.path.join(DATADIR, "collections") def usage(): - print "usage: "+sys.argv[0]+" []" - print - print "Commands:" - print " adduser - add a new user" - print " deluser - delete a user" - print " lsuser - list users" - print " passwd - change password of a user" + print("usage: "+sys.argv[0]+" []") + print() + print("Commands:") + print(" adduser - add a new user") + print(" deluser - delete a user") + print(" lsuser - list users") + print(" passwd - change password of a user") def adduser(username): if username: - password = getpass.getpass("Enter password for "+username+": ") - salt = binascii.b2a_hex(os.urandom(8)) - hash = hashlib.sha256(username+password+salt).hexdigest()+salt + password = getpass.getpass("Enter password for {}: ".format(username)) - conn = sqlite3.connect(AUTHDBPATH) - cursor = conn.cursor() - - cursor.execute( "CREATE TABLE IF NOT EXISTS auth " - "(user VARCHAR PRIMARY KEY, hash VARCHAR)") - - cursor.execute("INSERT INTO auth VALUES (?, ?)", (username, hash)) - - colpath = os.path.join(COLLECTIONPATH, username) - if not os.path.isdir(colpath): - os.makedirs(colpath) - - conn.commit() - conn.close() + user_manager = SqliteUserManager(AUTHDBPATH, COLLECTIONPATH) + user_manager.add_user(username, password) else: usage() def deluser(username): if username and os.path.isfile(AUTHDBPATH): - conn = sqlite3.connect(AUTHDBPATH) - cursor = conn.cursor() + user_manager = SqliteUserManager(AUTHDBPATH, COLLECTIONPATH) - cursor.execute("DELETE FROM auth WHERE user=?", (username,)) - - conn.commit() - conn.close() + try: + user_manager.del_user(username) + except ValueError as error: + print("Could not delete user {}: {}" + .format(username, error.message), file=sys.stderr) elif not username: usage() else: - print >>sys.stderr, sys.argv[0]+": Database file does not exist" + print("{}: Database file does not exist".format(sys.argv[0]), + file=sys.stderr) def lsuser(): - conn = sqlite3.connect(AUTHDBPATH) - cursor = conn.cursor() - - cursor.execute("SELECT user FROM auth") - - row = cursor.fetchone() - - while row is not None: - print row[0] - - row = cursor.fetchone() - - conn.close() + user_manager = SqliteUserManager(AUTHDBPATH, COLLECTIONPATH) + try: + users = user_manager.user_list() + for username in users: + print(username) + except ValueError as error: + print("Could not list users: {}".format(AUTHDBPATH, error.message), + file=sys.stderr) def passwd(username): if os.path.isfile(AUTHDBPATH): - password = getpass.getpass("Enter password for "+username+": ") - salt = binascii.b2a_hex(os.urandom(8)) - hash = hashlib.sha256(username+password+salt).hexdigest()+salt + password = getpass.getpass("Enter password for {}: ".format(username)) - conn = sqlite3.connect(AUTHDBPATH) - cursor = conn.cursor() - - cursor.execute("UPDATE auth SET hash=? WHERE user=?", (hash, username)) - - conn.commit() - conn.close() + user_manager = SqliteUserManager(AUTHDBPATH, COLLECTIONPATH) + try: + user_manager.set_password_for_user(username, password) + except ValueError as error: + print("Could not set password for user {}: {}" + .format(username, error.message), file=sys.stderr) else: - print >>sys.stderr, sys.argv[0]+": Database file does not exist" + print("{}: Database file does not exist".format(sys.argv[0]), + file=sys.stderr) def main(): argc = len(sys.argv)