More code
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -65,3 +65,5 @@ target/ | |||||||
| venv/ | venv/ | ||||||
| *.sqlite | *.sqlite | ||||||
| ad.json | ad.json | ||||||
|  |  | ||||||
|  | ookean_cards.json | ||||||
|   | |||||||
							
								
								
									
										41
									
								
								contrib/ookean_export.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								contrib/ookean_export.py
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||||
| @@ -1,9 +1,31 @@ | |||||||
| import sys | import sys | ||||||
| from . import application | 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 __name__ == "__main__": | ||||||
|     if len(sys.argv) > 1: |     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: |     else: | ||||||
|         port = 8080 |         port = 8080 | ||||||
|     application.run(host='127.0.0.1', port=port) |     application.run(host='127.0.0.1', port=port) | ||||||
|   | |||||||
| @@ -59,7 +59,8 @@ class DB: | |||||||
|             ); |             ); | ||||||
|             create table users ( |             create table users ( | ||||||
|                 id integer primary key, |                 id integer primary key, | ||||||
|                 user text, |                 distinguished_name text unique, | ||||||
|  |                 user text unique, | ||||||
|                 full_name text, |                 full_name text, | ||||||
|                 email text, |                 email text, | ||||||
|                 disabled integer, |                 disabled integer, | ||||||
| @@ -91,6 +92,7 @@ class DB: | |||||||
|                 door_id integer, |                 door_id integer, | ||||||
|                 keycard_id integer, |                 keycard_id integer, | ||||||
|                 user_id integer, |                 user_id integer, | ||||||
|  |                 log_msg text, | ||||||
|  |  | ||||||
|                 foreign key (door_id) |                 foreign key (door_id) | ||||||
|                     references doors (id) |                     references doors (id) | ||||||
| @@ -116,53 +118,86 @@ class DB: | |||||||
|  |  | ||||||
|     def add_users(self, users): |     def add_users(self, users): | ||||||
|         self.db.executemany(""" |         self.db.executemany(""" | ||||||
|         insert into users(user, full_name, email, disabled, admin) |             insert into users(distinguished_name, user, full_name, email, disabled, admin) | ||||||
|         values(?, ?, ?, ?, ?) |             values(?, ?, ?, ?, ?, ?) | ||||||
|         """, users) |         """, users) | ||||||
|         self.db.commit() |         self.db.commit() | ||||||
|  |  | ||||||
|     def list_users(self): |     def list_users(self): | ||||||
|         cur = self.db.execute( |         cur = self.db.execute(""" | ||||||
|             "select id, user, full_name, email from users" |             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() |         return cur.fetchall() | ||||||
|  |  | ||||||
|     def get_user(self, user_id): |     def get_user(self, user_id): | ||||||
|         cur = self.db.execute( |         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, ) |             (user_id, ) | ||||||
|         ) |         ) | ||||||
|         return cur.fetchone() |         return cur.fetchone() | ||||||
|  |  | ||||||
|     def get_user_by_name(self, user_name): |     def get_user_by_name(self, user_name): | ||||||
|         cur = self.db.execute( |         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, ) |             (user_name, ) | ||||||
|         ) |         ) | ||||||
|         return cur.fetchone() |         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 |     @staticmethod | ||||||
|     def import_ad(json_file): |     def import_ad(json_file): | ||||||
|         with open(json_file) as fp: |         with open(json_file) as fp: | ||||||
|             json_data = json.load(fp) |             json_data = json.load(fp) | ||||||
|         for user, fields in json_data.items(): |         for user, fields in json_data.items(): | ||||||
|             if fields.get("considered_active", False) and \ |             yield ( | ||||||
|                     fields.get("groups", {}).get("floor_access", False): |                 fields.get("distinguished_name"), | ||||||
|                 yield ( |                 fields.get("username"), | ||||||
|                     user, |                 fields.get("full_name"), | ||||||
|                     fields.get("full_name"), |                 fields.get("personal_mail"), | ||||||
|                     fields.get("personal_mail"), |                 0 if fields.get("considered_active") is True and | ||||||
|                     0, |                      fields.get("groups", {}).get("floor_access") is not False else 1, | ||||||
|                     int(fields.get("groups",{}).get("onboarding", False)) |                 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 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def initdb(): | ||||||
| if __name__ == "__main__": |     dbfile = "kdoorweb.sqlite" | ||||||
|     dbfile = "../kdoorweb.sqlite" |  | ||||||
|     import os, sys |     import os, sys | ||||||
|     from pprint import pprint |     from pprint import pprint | ||||||
|     try: |     try: | ||||||
| @@ -175,3 +210,13 @@ if __name__ == "__main__": | |||||||
|     users = db.list_users() |     users = db.list_users() | ||||||
|     for user in users: |     for user in users: | ||||||
|         print(dict(user)) |         print(dict(user)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def import_ookean(): | ||||||
|  |     dbfile = "kdoorweb.sqlite" | ||||||
|  |     db = DB(dbfile) | ||||||
|  |     db.import_ookean("../contrib/ookean_cards.json") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     initdb() | ||||||
|   | |||||||
| @@ -12,10 +12,10 @@ | |||||||
| <dl> | <dl> | ||||||
|   <dt>User</dt> |   <dt>User</dt> | ||||||
|   <dd>{{user}}</dd> |   <dd>{{user}}</dd> | ||||||
|   <dt>Full Name</dt> |  | ||||||
|   <dd>{{full_name}}</dd> |  | ||||||
|   <dt>Email</dt> |   <dt>Email</dt> | ||||||
|   <dd>{{email}}</dd> |   <dd>{{email}}</dd> | ||||||
|  |   <dt>Distinguished Name</dt> | ||||||
|  |   <dd>{{distinguished_name}}</dd> | ||||||
| </dl> | </dl> | ||||||
|  |  | ||||||
| <h3>Keycards</h3> | <h3>Keycards</h3> | ||||||
|   | |||||||
| @@ -13,8 +13,12 @@ | |||||||
| <tbody> | <tbody> | ||||||
|   % for user in users: |   % for user in users: | ||||||
|     <tr> |     <tr> | ||||||
|       <td><a href="/info/{{user['id']}}">{{user["full_name"]}}</a></td> |       % if user["disabled"]: | ||||||
|       <td>-</td> |         <td><s><a href="/info/{{user['id']}}">{{user["full_name"]}}</a></s></td> | ||||||
|  |       % else: | ||||||
|  |         <td><a href="/info/{{user['id']}}">{{user["full_name"]}}</a></td> | ||||||
|  |       % end | ||||||
|  |       <td>{{user["cards"]}}</td> | ||||||
|       <td>-</td> |       <td>-</td> | ||||||
|     </tr> |     </tr> | ||||||
|   % end |   % end | ||||||
|   | |||||||
| @@ -82,7 +82,10 @@ def login(): | |||||||
| @app.post('/login', skip=[check_auth]) | @app.post('/login', skip=[check_auth]) | ||||||
| def do_login(db): | def do_login(db): | ||||||
|     user_name = request.forms.get("user") |     user_name = request.forms.get("user") | ||||||
|  |     from pprint import pprint | ||||||
|  |     pprint(db.list_users()) | ||||||
|     user = db.get_user_by_name(user_name) |     user = db.get_user_by_name(user_name) | ||||||
|  |     print("user:", user) | ||||||
|     if user: |     if user: | ||||||
|         print(f"user {dict(user)}") |         print(f"user {dict(user)}") | ||||||
|         login_user(user["id"]) |         login_user(user["id"]) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user