forked from arti/doors
More code
This commit is contained in:
@@ -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)
|
||||
|
@@ -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()
|
||||
|
@@ -12,10 +12,10 @@
|
||||
<dl>
|
||||
<dt>User</dt>
|
||||
<dd>{{user}}</dd>
|
||||
<dt>Full Name</dt>
|
||||
<dd>{{full_name}}</dd>
|
||||
<dt>Email</dt>
|
||||
<dd>{{email}}</dd>
|
||||
<dt>Distinguished Name</dt>
|
||||
<dd>{{distinguished_name}}</dd>
|
||||
</dl>
|
||||
|
||||
<h3>Keycards</h3>
|
||||
|
@@ -13,8 +13,12 @@
|
||||
<tbody>
|
||||
% for user in users:
|
||||
<tr>
|
||||
<td><a href="/info/{{user['id']}}">{{user["full_name"]}}</a></td>
|
||||
<td>-</td>
|
||||
% if user["disabled"]:
|
||||
<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>
|
||||
</tr>
|
||||
% end
|
||||
|
@@ -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"])
|
||||
|
Reference in New Issue
Block a user