From 7d988186a0e2c21843c642db94f47dcc2fde02f0 Mon Sep 17 00:00:00 2001 From: Chris Proctor Date: Mon, 20 May 2024 10:02:16 -0400 Subject: [PATCH] Admin sends a messagae on account creation --- .gitignore | 1 + client/user_interface.py | 12 +++++++++--- pyproject.toml | 2 -- server/app/views.py | 18 +++++++++++++++++- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index e85a7a7..0bafb89 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ **/__pycache__/* server/app/migrations server/database.sqlite +*.pem diff --git a/client/user_interface.py b/client/user_interface.py index 806590f..f25258e 100644 --- a/client/user_interface.py +++ b/client/user_interface.py @@ -95,9 +95,15 @@ class SubRosaUI: def main(): from argparse import ArgumentParser parser = ArgumentParser() - parser.add_argument("username") - parser.add_argument("-k", "--key", default="subrosa_private_key.pem") - parser.add_argument("-s", "--server-url", default="http://127.0.0.1:5000") + parser.add_argument("username", help="Existing or new username.") + parser.add_argument("-k", "--key", + default="subrosa_private_key.pem", + help="Private key file. Will be created if it does not exist." + ) + parser.add_argument("-s", "--server-url", + default="http://subrosa.makingwithcode.org", + help='Server URL. Use "http://127.0.0.1:5000" for a local server.' + ) args = parser.parse_args() ui = SubRosaUI(args.key, args.server_url) ui.run(args.username) diff --git a/pyproject.toml b/pyproject.toml index 5cdc608..6ceaffc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,6 @@ version = "0.1.0" description = "" authors = ["Chris Proctor "] readme = "README.md" -packages = [{include = "lab_subrosa"}] [tool.poetry.dependencies] python = "^3.10" @@ -12,7 +11,6 @@ django-banjo = "^0.5.1" cryptography = "^42.0.7" requests = "^2.31.0" - [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/server/app/views.py b/server/app/views.py index d47daad..f0d0757 100644 --- a/server/app/views.py +++ b/server/app/views.py @@ -7,16 +7,32 @@ import sys sys.path.insert(0, "..") from encryption import PrivateKey, PublicKey +def get_or_create_admin(): + if not User.objects.filter(name='subrosa_admin').exists(): + private_key = PrivateKey.generate() + public_key = private_key.get_public_key() + admin = User(name='subrosa_admin', public_key=str(public_key)) + admin.save() + return User.objects.get(name='subrosa_admin') + @route_post("users/new", args={'name': str, 'public_key': str}) def create_user(params): "Creates a new user" + admin = get_or_create_admin() try: - PublicKey.load(params['public_key']) + public_key = PublicKey.load(params['public_key']) except (ValueError, FileNotFoundError): raise NotAllowed("Invalid public key") try: new_user = User.from_dict(params) new_user.save() + welcome = "Welcome to SubRosa! Please be a good community member." + message = Message( + sender=admin, + recipient=new_user, + ciphertext=public_key.encrypt(welcome) + ) + message.save() return new_user.to_dict() except: raise NotAllowed(f"Username {params['name']} is already in use.")