Add test helper classes for creating and managing temporary files, working with anki collections and sqlite dbs. Add class for
managing users so users can be added programmatically without using ankiserverctl.
This commit is contained in:
94
ankisyncd/users.py
Normal file
94
ankisyncd/users.py
Normal file
@@ -0,0 +1,94 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
import binascii
|
||||
from contextlib import closing
|
||||
import hashlib
|
||||
import logging
|
||||
import os
|
||||
import sqlite3 as sqlite
|
||||
|
||||
|
||||
class UserManager:
|
||||
def __init__(self, auth_db_path, collection_path):
|
||||
self.auth_db_path = auth_db_path
|
||||
self.collection_path = collection_path
|
||||
|
||||
def auth_db_exists(self):
|
||||
return os.path.isfile(self.auth_db_path)
|
||||
|
||||
def user_list(self):
|
||||
if not self.auth_db_exists():
|
||||
self.create_auth_db()
|
||||
return []
|
||||
else:
|
||||
conn = sqlite.connect(self.auth_db_path)
|
||||
cursor = conn.cursor()
|
||||
cursor.execute("SELECT user FROM auth")
|
||||
rows = cursor.fetchall()
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
return [row[0] for row in rows]
|
||||
|
||||
def user_exists(self, username):
|
||||
users = self.user_list()
|
||||
return username in users
|
||||
|
||||
def del_user(self, username):
|
||||
if not self.auth_db_exists():
|
||||
self.create_auth_db()
|
||||
|
||||
conn = sqlite.connect(self.auth_db_path)
|
||||
cursor = conn.cursor()
|
||||
logging.info("Removing user '{}' from auth db."
|
||||
.format(username))
|
||||
cursor.execute("DELETE FROM auth WHERE user=?", (username,))
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
def add_user(self, username, password):
|
||||
self._add_user_to_auth_db(username, password)
|
||||
self._create_user_dir(username)
|
||||
|
||||
def add_users(self, users_data):
|
||||
for username, password in users_data:
|
||||
self.add_user(username, password)
|
||||
|
||||
def _add_user_to_auth_db(self, username, password):
|
||||
if not self.auth_db_exists():
|
||||
self.create_auth_db()
|
||||
|
||||
pass_hash = self._create_pass_hash(username, password)
|
||||
|
||||
conn = sqlite.connect(self.auth_db_path)
|
||||
cursor = conn.cursor()
|
||||
logging.info("Adding user '{}' to auth db.".format(username))
|
||||
cursor.execute("INSERT INTO auth VALUES (?, ?)",
|
||||
(username, pass_hash))
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
@staticmethod
|
||||
def _create_pass_hash(username, password):
|
||||
salt = binascii.b2a_hex(os.urandom(8))
|
||||
pass_hash = (hashlib.sha256(username + password + salt).hexdigest() +
|
||||
salt)
|
||||
return pass_hash
|
||||
|
||||
def create_auth_db(self):
|
||||
conn = sqlite.connect(self.auth_db_path)
|
||||
cursor = conn.cursor()
|
||||
logging.info("Creating auth db at {}."
|
||||
.format(self.auth_db_path))
|
||||
cursor.execute("""CREATE TABLE IF NOT EXISTS auth
|
||||
(user VARCHAR PRIMARY KEY, hash VARCHAR)""")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
def _create_user_dir(self, username):
|
||||
user_dir_path = os.path.join(self.collection_path, username)
|
||||
if not os.path.isdir(user_dir_path):
|
||||
logging.info("Creating collection directory for user '{}' at {}"
|
||||
.format(username, user_dir_path))
|
||||
os.makedirs(user_dir_path)
|
||||
Reference in New Issue
Block a user