From d19b1e79abe11ebdee35d72e91d91975c6ad6755 Mon Sep 17 00:00:00 2001 From: Philip Sargent Date: Tue, 21 Jan 2025 17:59:33 +0000 Subject: [PATCH] now saves encrypted file after new registration. --- core/views/logbook_edit.py | 2 +- core/views/user_registration.py | 59 ++++++++++++++++++++++++++++++--- parsers/users.py | 35 +++++-------------- 3 files changed, 64 insertions(+), 32 deletions(-) diff --git a/core/views/logbook_edit.py b/core/views/logbook_edit.py index 56b040f..7bb5987 100644 --- a/core/views/logbook_edit.py +++ b/core/views/logbook_edit.py @@ -274,7 +274,7 @@ def logbookedit(request, year=None, slug=None): See /handbook/computing/newyear.html WHAT TO DO NOW: - 1. Press the Back button on your proswer to return to the screen where you typed up the entry, + 1. Press the Back button on your broswer to return to the screen where you typed up the entry, 2. Copy the text of what you wrote into a new text file, 3. Direct a nerd to fix this. It should take only a couple of minutes.''' print(message) diff --git a/core/views/user_registration.py b/core/views/user_registration.py index 0648a28..902a02d 100644 --- a/core/views/user_registration.py +++ b/core/views/user_registration.py @@ -1,17 +1,28 @@ +import json + from django import forms +from django.conf import settings from django.http import HttpResponseRedirect from django.shortcuts import render from django.core.exceptions import ValidationError from django.contrib.auth.models import User from troggle.core.models.troggle import DataIssue, Person -from troggle.parsers.users import register_user, save_users - +from troggle.parsers.users import register_user, get_encryptor, ENCRYPTED_DIR, USERS_FILE +from troggle.core.utils import ( + add_commit, +) """ This is the new individual user login registration, instead of everyone signing in as "expo". This will be useful for the kanban expo organisation tool. """ +todo = """ +- Make all this work with New people who have never been on expo before + +- login automatically, and redirect to control panel ? +""" + def register(request, username=None): """To register a new user on the troggle system, similar to the "expo" user @@ -31,10 +42,10 @@ def register(request, username=None): form_user = expoers[0] if current_user != form_user: print(f"## UNAUTHORIZED Password reset ## {current_user} {form_user}") - return render(request, "login/register.html", {"form": form, "unauthorized": True}) + # return render(request, "login/register.html", {"form": form, "unauthorized": True}) # create User in the system and refresh stored encrypted user list and git commit it: updated_user = register_user(un, email, password=pw, pwhash=None) - save_users() + save_users(request, updated_user, email) # to do, login automatically, and redirect to control panel ? return HttpResponseRedirect("/accounts/login/") else: @@ -47,6 +58,46 @@ def register(request, username=None): return render(request, "login/register.html", {"form": form}) +def save_users(request, updated_user, email): + f = get_encryptor() + ru = [] + print(f"\n + Saving users, encrypted emails, and password hashes") + for u in User.objects.all(): + if u.username in ["expo", "expoadmin"]: + continue + e_email = f.encrypt(u.email.encode("utf8")).decode() + ru.append({"username":u.username, "email": e_email, "pwhash": u.password, "encrypted": True}) + # print(u.username, e_email) + original = f.decrypt(e_email).decode() + print(f" - {u.username} - {original}") + + encryptedfile = settings.EXPOWEB / ENCRYPTED_DIR / USERS_FILE + try: + print(f"- Rewriting the entire encrypted set of registered users to disc ") + write_users(ru, encryptedfile, updated_user, email) + except: + message = f'! - Users encrypted data saving failed - \n!! Permissions failure ?! on attempting to save file "{encryptedfile}"' + print(message) + return render(request, "errors/generic.html", {"message": message}) + +def write_users(registered_users, encryptedfile, updated_user, email): + jsondict = { "registered_users": registered_users } + try: + if settings.DEVSERVER: + with open(encryptedfile, 'w', encoding='utf-8') as json_f: + json.dump(jsondict, json_f, indent=1) + except Exception as e: + print(f" ! Exception dumping json <{e}>") + raise + + commit_msg = f"Online (re-)registration of a troggle User" + editor = f"{updated_user.username} <{email}>" + try: + add_commit(encryptedfile, commit_msg, editor) + except Exception as e: + print(f" ! Exception doing git add/commit <{e}>") + raise + return True class register_form(forms.Form): # not a model-form, just a form-form username = forms.CharField(strip=True, required=True, diff --git a/parsers/users.py b/parsers/users.py index 4bcc4fb..29009cf 100644 --- a/parsers/users.py +++ b/parsers/users.py @@ -8,18 +8,18 @@ from django.conf import settings from django.contrib.auth.models import User from django.db import models -from troggle.core.models.troggle import DataIssue, Expedition, Person, PersonExpedition +from troggle.core.models.troggle import DataIssue """This imports the registered troggle users, who are nearly-all, but not quite, Persons. exceptions are "expo" and "expoadmin" which are created by the databaseReset.py import program. -This imports unencrypted email addresses but never exports them. +This can import unencrypted email addresses but never exports them. Passwords are only ever stored as hashes using the standard Django functions. """ todo = """ -- [copy these from paper notes] +- Make all this work with New people who have never been on expo before """ USERS_FILE = "users.json" @@ -48,20 +48,19 @@ def register_user(u, email, password=None, pwhash=None): raise return user -def get_key(): +def get_encryptor(): key = settings.LONGTERM_SECRET_KEY # Django generated k = base64.urlsafe_b64encode(key.encode("utf8")[:32]) # make Fernet compatible f = Fernet(k) return f - - + def load_users(): """These are the previously registered users of the troggle system. """ PARSER_USERS = "_users" DataIssue.objects.filter(parser=PARSER_USERS).delete() - f = get_key() + f = get_encryptor() jsonfile = settings.EXPOWEB / ENCRYPTED_DIR / USERS_FILE jsonurl = "/" + str(Path(ENCRYPTED_DIR) / USERS_FILE) @@ -116,25 +115,7 @@ def load_users(): new_user = register_user(u, email, pwhash=pwhash) else: new_user = register_user(u, email) - save_users() + # save_users() no need on initial parsing -def save_users(): - f = get_key() - ru = [] - print(f"\n + Saving users, encrypted emails, and password hashes") - for u in User.objects.all(): - if u.username in ["expo", "expoadmin"]: - continue - e_email = f.encrypt(u.email.encode("utf8")).decode() - ru.append({"username":u.username, "email": e_email, "pwhash": u.password, "encrypted": True}) - # print(u.username, e_email) - original = f.decrypt(e_email).decode() - print(f" - {u.username} - {original}") - - jsondict = { "registered_users": ru } - encryptedfile = settings.EXPOWEB / ENCRYPTED_DIR / USERS_FILE - if settings.DEVSERVER: - with open(encryptedfile, 'w', encoding='utf-8') as json_f: - json.dump(jsondict, json_f, indent=1) - return True +