diff --git a/.gitignore b/.gitignore index 32b5193..ce4ccc3 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,5 @@ target/ venv/ *.sqlite ad.json + +ookean_cards.json diff --git a/contrib/ookean_export.py b/contrib/ookean_export.py new file mode 100644 index 0000000..419de16 --- /dev/null +++ b/contrib/ookean_export.py @@ -0,0 +1,41 @@ +from collections import defaultdict +import json +from MySQLdb import _mysql + + +db = _mysql.connect(host="localhost", db="ookean", + user="root", passwd="salakala") + +db.query(""" +select persons.name, t2.uid, t2.name from persons join tagowners t on persons.id = t.person_id join tags t2 on t.tag_id = t2.id +where persons.archived is null and t.revoked_date is null and t2.archived is null; +""") +r=db.store_result() + +nicknames = { + "Adi": "Aaditya Parashar", + "Artur Kerge": "Artur Vincent Kerge", + "Alexander Sysoev": "Aleksander Sysoev", + "Pavel Kirienko": "Pavel Kirilenko", + "Erwin Orye": "Erwin Rudi J. Orye", + "Martti Rand (Protoskoop OÜ)": "Martti Rand", + "Arttu Valkonen": "Arttu Mikael Valkonen", + "Anima (Aleksandrs Naidjonovs)": "Aleksandrs Naidjonovs" +} + +cards = defaultdict(list) + +for x in range(r.num_rows()): + name, uid, descr = r.fetch_row()[0] + name, uid, descr = name.decode(), uid.decode(), descr.decode() if descr else descr + name = name.replace("(deactivated)", "")\ + .replace("(Deactivated)","").replace("(Paused)", "").replace("(disactive)", "")\ + .replace("(Disabled)", "").replace("(Protoskoop)", "")\ + .strip() + if name in nicknames: + name = nicknames[name] + cards[name].append({"uid": uid, "descr": descr}) + print(f"{name:30} {uid:20} {descr}") + +with open("ookean_cards.json", "w") as fp: + json.dump(cards, fp, indent=2) diff --git a/kdoorweb/kdoorweb/__main__.py b/kdoorweb/kdoorweb/__main__.py index bd87b33..3830a60 100644 --- a/kdoorweb/kdoorweb/__main__.py +++ b/kdoorweb/kdoorweb/__main__.py @@ -1,9 +1,31 @@ import sys from . import application + +def print_help(): + print("K-Door webserver") + print(f"Usage: {sys.argv[0]} [PORT|initdb|import_ookean]") + sys.exit(1) + + if __name__ == "__main__": if len(sys.argv) > 1: - port = int(sys.argv[1]) + cmd = sys.argv[1] + if cmd in {"-h", "--help"}: + print_help() + elif cmd == "initdb": + from .db import initdb + initdb() + sys.exit(0) + elif cmd == "import_ookean": + from .db import import_ookean + import_ookean() + sys.exit(1) + else: + try: + port = int(sys.argv[1]) + except ValueError: + print_help() else: port = 8080 application.run(host='127.0.0.1', port=port) diff --git a/kdoorweb/kdoorweb/db.py b/kdoorweb/kdoorweb/db.py index 7901935..484df2a 100644 --- a/kdoorweb/kdoorweb/db.py +++ b/kdoorweb/kdoorweb/db.py @@ -59,7 +59,8 @@ class DB: ); create table users ( id integer primary key, - user text, + distinguished_name text unique, + user text unique, full_name text, email text, disabled integer, @@ -91,6 +92,7 @@ class DB: door_id integer, keycard_id integer, user_id integer, + log_msg text, foreign key (door_id) references doors (id) @@ -116,53 +118,86 @@ class DB: def add_users(self, users): self.db.executemany(""" - insert into users(user, full_name, email, disabled, admin) - values(?, ?, ?, ?, ?) + insert into users(distinguished_name, user, full_name, email, disabled, admin) + values(?, ?, ?, ?, ?, ?) """, users) self.db.commit() def list_users(self): - cur = self.db.execute( - "select id, user, full_name, email from users" + cur = self.db.execute(""" + select users.id, users.user , users.full_name, users.email, users.disabled, count(k.id) as cards from users + left join keycards k on users.id = k.user_id group by users.id order by users.disabled + """ ) return cur.fetchall() def get_user(self, user_id): cur = self.db.execute( - "select * from users where id = ?", + "select id, distinguished_name, user, full_name, email, admin, disabled from users where id = ?", (user_id, ) ) return cur.fetchone() def get_user_by_name(self, user_name): cur = self.db.execute( - "select * from users where user = ?", + "select id, distinguished_name, user, full_name, email, admin, disabled from users where user = ?", (user_name, ) ) return cur.fetchone() + def add_keycards(self, keycards): + self.db.executemany(""" + insert into keycards(user_id, card_uid, name) + values(?, ?, ?) + """, keycards) + self.db.commit() + @staticmethod def import_ad(json_file): with open(json_file) as fp: json_data = json.load(fp) for user, fields in json_data.items(): - if fields.get("considered_active", False) and \ - fields.get("groups", {}).get("floor_access", False): - yield ( - user, - fields.get("full_name"), - fields.get("personal_mail"), - 0, - int(fields.get("groups",{}).get("onboarding", False)) - ) + yield ( + fields.get("distinguished_name"), + fields.get("username"), + fields.get("full_name"), + fields.get("personal_mail"), + 0 if fields.get("considered_active") is True and + fields.get("groups", {}).get("floor_access") is not False else 1, + 0 if fields.get("groups",{}).get("onboarding") is False else 1 + ) + + def import_ookean(self, json_file): + unmatched = {} + with open(json_file) as fp: + json_data = json.load(fp) + for user, tokens in json_data.items(): + self.db.execute("PRAGMA case_sensitive_like = true") + cur = self.db.execute( + "select id, user, distinguished_name from users where full_name like ?", + (f"%{user}%",) + ) + user_row = cur.fetchone() + if user_row: + print(f"User {user:20} matched with {user_row['user']:20} ({user_row['distinguished_name']})") + + self.add_keycards(((user_row["id"], card["uid"], card["descr"]) for card in tokens)) + else: + unmatched[user] = tokens + + print(f"Cound not match {len(unmatched)} users") + for user in unmatched: + print(f"User {user}") + def export_db(self, json_file): + for user in self.list_users(): + pass - -if __name__ == "__main__": - dbfile = "../kdoorweb.sqlite" +def initdb(): + dbfile = "kdoorweb.sqlite" import os, sys from pprint import pprint try: @@ -175,3 +210,13 @@ if __name__ == "__main__": users = db.list_users() for user in users: print(dict(user)) + + +def import_ookean(): + dbfile = "kdoorweb.sqlite" + db = DB(dbfile) + db.import_ookean("../contrib/ookean_cards.json") + + +if __name__ == "__main__": + initdb() diff --git a/kdoorweb/kdoorweb/views/info.html b/kdoorweb/kdoorweb/views/info.html index 77af65b..0e14e9f 100644 --- a/kdoorweb/kdoorweb/views/info.html +++ b/kdoorweb/kdoorweb/views/info.html @@ -12,10 +12,10 @@
User
{{user}}
-
Full Name
-
{{full_name}}
Email
{{email}}
+
Distinguished Name
+
{{distinguished_name}}

Keycards

diff --git a/kdoorweb/kdoorweb/views/list.html b/kdoorweb/kdoorweb/views/list.html index fef248a..d044776 100644 --- a/kdoorweb/kdoorweb/views/list.html +++ b/kdoorweb/kdoorweb/views/list.html @@ -13,8 +13,12 @@ % for user in users: - {{user["full_name"]}} - - + % if user["disabled"]: + {{user["full_name"]}} + % else: + {{user["full_name"]}} + % end + {{user["cards"]}} - % end diff --git a/kdoorweb/kdoorweb/web.py b/kdoorweb/kdoorweb/web.py index 6df9204..0c725e4 100644 --- a/kdoorweb/kdoorweb/web.py +++ b/kdoorweb/kdoorweb/web.py @@ -82,7 +82,10 @@ def login(): @app.post('/login', skip=[check_auth]) def do_login(db): user_name = request.forms.get("user") + from pprint import pprint + pprint(db.list_users()) user = db.get_user_by_name(user_name) + print("user:", user) if user: print(f"user {dict(user)}") login_user(user["id"])