
Ahoj, jasně, kouknu na to, až budu zpátky / budu mít chvíli u počítače. :-) J. Cituji Michal Sojka <michal.sojka@cvut.cz>:
Ahoj,
teď už to vypadá docela dobře, tak ti to konečně aplikuji. Pár drobností jsem tam ještě upravil (viz mé commity). Je tam ale ještě jeden závažnější problém a budu po tobě chtít abys ho opravil. Viz níže:
On Wed, Aug 14 2019, Jaroslav Klapalek wrote:
Possible TODOs: - add option to merge two identifiers (e. g. if one is lost, it should be possible to transfer all coffees to different one), - divide identifiers to 2+ groups -- 'master key' and 'regular', so the public ones (e. g. mugs) cannot remove identifiers from an account. --- Změny oproti v5: - přidany komentáře k určitým částem kódu - v tabulce je udržována pouze poslední relace identifikátoru - ID identifikátoru je v tabulce jako PRIMARY KEY app.py | 56 ++++++++++++++++++++++++++++++++++++++++++-------- coffee_db.py | 59 ++++++++++++++++++++++++++++++++++++++++++++++------- coffee_db.sql | 8 ++++++++ templates/main.js | 55 +++++++++++++++++++++++++++++++++++++++++-------- templates/user.html | 21 +++++++++++++++++++ 5 files changed, 175 insertions(+), 24 deletions(-)
diff --git a/app.py b/app.py index b1f50cc..25bfe14 100644 --- a/app.py +++ b/app.py @@ -31,19 +31,28 @@ def hello():
@app.route('/login', methods=["POST"]) -@app.route('/login/<uid>') -def login(uid=None): +@app.route('/login/<iid>') +def login(iid=None): if request.method == "POST": - uid = request.data.decode("utf-8") - if uid is not None: - db.add_user(uid) - session["uid"] = uid + iid = request.data.decode("utf-8") + if iid is not None: + uid = db.get_uid(iid) + + session["iid"] = iid + + if uid is None:
Předpokládám, že tenhle if má sloužit k tomu, aby v nové tabulce indetifiers byly vytvořeny záznamy odpovídající aktuálním uživatelům. Bohužel to má jeden (možná nechtěný) efekt navíc:
Mějme uživatele A a B. Uživatel A bude mít ID A1 a později si zaregistruje A2. Pak se rozhodne, že ID A1 věnuje uživateli B a bude používat jen A2. Uživatel A odstaní A1 ze svého účtu a dá ho uživateli B. B si bude chtít přidat A1 ke svému účtu, ale zapomene zmáčknout "add identifier" a jen si "pípne". V tom okamžiku tento kód id A1 aktivuje a přiřadí ho opět k uživateli A, protože jeho userid je A1. Uživatel B si tedy vesele může dávat kafe na účet A!
Mělo by se to opravit minimálně tak, že v podmínce výše se nebude testovat jestli existuje uid odpovídající iid, ale jestli je dané iid v tabulce identifiers - ať aktivní nebo ne.
Změna v podmínce zabrání problému popsanému výše, ale přinese další, méně závažný problém: Pokud dám A1 novému uživateli, který zatím není zaregistrován, nebude schopen začít A1 používat, protože při "pípnutí" se nic nestane (v kódu níže by se měla opravit větev else). Kdybychom chtěli, aby se nový uživatel mohl s A1 zaregistrovat, bylo by potřeba vygenerovat mu nové userid - takové, které v databázi ještě není, tedy ne A1. Asi nějaké náhodné. Bez tohoto bych dovedl žít, ale to, aby se B mohl bez vědomí A vydávat za něj, bych rád měl opravené.
+ db.add_user_identifier(iid, iid, "Default") + session["uid"] = iid + db.add_user(iid) + else: + session["uid"] = uid return redirect(url_for('user'))
-Michal