From 20cdaefa1c9bab0f71ea665871e006cf01226ed1 Mon Sep 17 00:00:00 2001 From: Oscar Krause Date: Tue, 8 Apr 2025 13:52:09 +0200 Subject: [PATCH] code refactorings after merge from main --- app/main.py | 22 +++++++++++++--------- app/orm.py | 51 ++++++++++++++++++++++----------------------------- test/main.py | 4 ++-- 3 files changed, 37 insertions(+), 40 deletions(-) diff --git a/app/main.py b/app/main.py index 6ffbc19..3b619e2 100644 --- a/app/main.py +++ b/app/main.py @@ -1,8 +1,9 @@ import logging +import sys from base64 import b64encode as b64enc from calendar import timegm from contextlib import asynccontextmanager -from datetime import datetime, timedelta, UTC +from datetime import datetime, UTC from hashlib import sha256 from json import loads as json_loads from os import getenv as env @@ -21,8 +22,11 @@ from starlette.middleware.cors import CORSMiddleware from starlette.responses import StreamingResponse, JSONResponse as JSONr, HTMLResponse as HTMLr, Response, \ RedirectResponse -from orm import Origin, Lease, init as db_init, migrate -from util import PrivateKey, PublicKey, load_file +# add relative path to use packages as they were in the app/ dir +sys.path.append('../') +sys.path.append('../app') + +from orm import Origin, Lease, init as db_init, migrate, Instance, Site # Load variables load_dotenv('../version.env') @@ -249,7 +253,7 @@ async def _lease_delete(request: Request, lease_ref: str): # venv/lib/python3.9/site-packages/nls_core_service_instance/service_instance_token_manager.py @app.get('/-/client-token', summary='* Client-Token', description='creates a new messenger token for this service instance') async def _client_token(): - cur_time = datetime.utcnow() + cur_time = datetime.now(UTC) default_instance = Instance.get_default_instance(db) public_key = default_instance.get_public_key() @@ -438,7 +442,7 @@ async def auth_v1_token(request: Request): # venv/lib/python3.9/site-packages/nls_services_lease/test/test_lease_multi_controller.py @app.post('/leasing/v1/lessor', description='request multiple leases (borrow) for current origin') async def leasing_v1_lessor(request: Request): - j, cur_time = json_loads((await request.body()).decode('utf-8')), datetime.utcnow() + j, cur_time = json_loads((await request.body()).decode('utf-8')), datetime.now(UTC) default_instance = Instance.get_default_instance(db) jwt_decode_key = default_instance.get_jwt_decode_key() @@ -489,7 +493,7 @@ async def leasing_v1_lessor(request: Request): # venv/lib/python3.9/site-packages/nls_dal_service_instance_dls/schema/service_instance/V1_0_21__product_mapping.sql @app.get('/leasing/v1/lessor/leases', description='get active leases for current origin') async def leasing_v1_lessor_lease(request: Request): - cur_time = datetime.utcnow() + cur_time = datetime.now(UTC) jwt_decode_key = Instance.get_default_instance(db).get_jwt_decode_key() @@ -516,7 +520,7 @@ async def leasing_v1_lessor_lease(request: Request): # venv/lib/python3.9/site-packages/nls_core_lease/lease_single.py @app.put('/leasing/v1/lease/{lease_ref}', description='renew a lease') async def leasing_v1_lease_renew(request: Request, lease_ref: str): - cur_time = datetime.utcnow() + cur_time = datetime.now(UTC) default_instance = Instance.get_default_instance(db) jwt_decode_key = default_instance.get_jwt_decode_key() @@ -551,7 +555,7 @@ async def leasing_v1_lease_renew(request: Request, lease_ref: str): # venv/lib/python3.9/site-packages/nls_services_lease/test/test_lease_single_controller.py @app.delete('/leasing/v1/lease/{lease_ref}', description='release (return) a lease') async def leasing_v1_lease_delete(request: Request, lease_ref: str): - cur_time = datetime.utcnow() + cur_time = datetime.now(UTC) jwt_decode_key = Instance.get_default_instance(db).get_jwt_decode_key() @@ -584,7 +588,7 @@ async def leasing_v1_lease_delete(request: Request, lease_ref: str): # venv/lib/python3.9/site-packages/nls_services_lease/test/test_lease_multi_controller.py @app.delete('/leasing/v1/lessor/leases', description='release all leases') async def leasing_v1_lessor_lease_remove(request: Request): - cur_time = datetime.utcnow() + cur_time = datetime.now(UTC) jwt_decode_key = Instance.get_default_instance(db).get_jwt_decode_key() diff --git a/app/orm.py b/app/orm.py index 87ec623..da9d977 100644 --- a/app/orm.py +++ b/app/orm.py @@ -1,11 +1,17 @@ +import logging from datetime import datetime, timedelta, timezone, UTC +from os import getenv as env +from os.path import join, dirname, isfile from dateutil.relativedelta import relativedelta -from sqlalchemy import Column, VARCHAR, CHAR, ForeignKey, DATETIME, update, and_, inspect, text +from jose import jwk +from jose.constants import ALGORITHMS +from sqlalchemy import Column, VARCHAR, CHAR, ForeignKey, DATETIME, update, and_, inspect, text, BLOB, INT, FLOAT from sqlalchemy.engine import Engine from sqlalchemy.orm import sessionmaker, declarative_base, Session, relationship +from sqlalchemy.schema import CreateTable -from util import NV +from util import NV, PrivateKey, PublicKey logging.basicConfig() logger = logging.getLogger(__name__) @@ -28,7 +34,6 @@ class Site(Base): @staticmethod def create_statement(engine: Engine): - from sqlalchemy.schema import CreateTable return CreateTable(Site.__table__).compile(engine) @staticmethod @@ -65,7 +70,6 @@ class Instance(Base): @staticmethod def create_statement(engine: Engine): - from sqlalchemy.schema import CreateTable return CreateTable(Instance.__table__).compile(engine) @staticmethod @@ -111,21 +115,18 @@ class Instance(Base): def get_client_token_expire_delta(self) -> "dateutil.relativedelta.relativedelta": return relativedelta(seconds=self.client_token_expire_delta) - def __get_private_key(self) -> "RsaKey": - return parse_key(self.private_key) + def __get_private_key(self) -> "PrivateKey": + return PrivateKey(self.private_key) - def get_public_key(self) -> "RsaKey": - return parse_key(self.public_key) + def get_public_key(self) -> "PublicKey": + return PublicKey(self.public_key) def get_jwt_encode_key(self) -> "jose.jkw": - from jose import jwk - from jose.constants import ALGORITHMS - return jwk.construct(self.__get_private_key().export_key().decode('utf-8'), algorithm=ALGORITHMS.RS256) + + return jwk.construct(self.__get_private_key().pem().decode('utf-8'), algorithm=ALGORITHMS.RS256) def get_jwt_decode_key(self) -> "jose.jwt": - from jose import jwk - from jose.constants import ALGORITHMS - return jwk.construct(self.get_public_key().export_key().decode('utf-8'), algorithm=ALGORITHMS.RS256) + return jwk.construct(self.get_public_key().pem().decode('utf-8'), algorithm=ALGORITHMS.RS256) def get_private_key_str(self, encoding: str = 'utf-8') -> str: return self.private_key.decode(encoding) @@ -162,7 +163,6 @@ class Origin(Base): @staticmethod def create_statement(engine: Engine): - from sqlalchemy.schema import CreateTable return CreateTable(Origin.__table__).compile(engine) @staticmethod @@ -241,7 +241,6 @@ class Lease(Base): @staticmethod def create_statement(engine: Engine): - from sqlalchemy.schema import CreateTable return CreateTable(Lease.__table__).compile(engine) @staticmethod @@ -336,9 +335,7 @@ class Lease(Base): def init_default_site(session: Session): - from app.util import generate_key - - private_key = generate_key() + private_key = PrivateKey.generate() public_key = private_key.public_key() site = Site( @@ -351,8 +348,8 @@ def init_default_site(session: Session): instance = Instance( instance_ref=Instance.DEFAULT_INSTANCE_REF, site_key=site.site_key, - private_key=private_key.export_key(), - public_key=public_key.export_key(), + private_key=private_key.pem(), + public_key=public_key.pem(), ) session.add(instance) session.commit() @@ -379,10 +376,6 @@ def init(engine: Engine): def migrate(engine: Engine): - from os import getenv as env - from os.path import join, dirname, isfile - from util import load_key - db = inspect(engine) # todo: add update guide to use 1.LATEST to 2.0 @@ -408,15 +401,15 @@ def migrate(engine: Engine): default_instance_private_key_path = str(join(dirname(__file__), 'cert/instance.private.pem')) instance_private_key = env('INSTANCE_KEY_RSA', None) if instance_private_key is not None: - instance.private_key = load_key(str(instance_private_key)) + instance.private_key = PrivateKey(instance_private_key.encode('utf-8')) elif isfile(default_instance_private_key_path): - instance.private_key = load_key(default_instance_private_key_path) + instance.private_key = PrivateKey.from_file(default_instance_private_key_path) default_instance_public_key_path = str(join(dirname(__file__), 'cert/instance.public.pem')) instance_public_key = env('INSTANCE_KEY_PUB', None) if instance_public_key is not None: - instance.public_key = load_key(str(instance_public_key)) + instance.public_key = PublicKey(instance_public_key.encode('utf-8')) elif isfile(default_instance_public_key_path): - instance.public_key = load_key(default_instance_public_key_path) + instance.public_key = PublicKey.from_file(default_instance_public_key_path) # TOKEN_EXPIRE_DELTA token_expire_delta = env('TOKEN_EXPIRE_DAYS', None) diff --git a/test/main.py b/test/main.py index 556ff09..6442148 100644 --- a/test/main.py +++ b/test/main.py @@ -2,7 +2,7 @@ from os import getenv as env from base64 import b64encode as b64enc from hashlib import sha256 from calendar import timegm -from datetime import datetime +from datetime import datetime, UTC from uuid import UUID, uuid4 from dateutil.relativedelta import relativedelta @@ -17,7 +17,7 @@ sys.path.append('../') sys.path.append('../app') from app import main -from app.orm import init as db_init, migrate, Site, Instance +from orm import init as db_init, migrate, Site, Instance ORIGIN_REF, ALLOTMENT_REF, SECRET = str(uuid4()), '20000000-0000-0000-0000-000000000001', 'HelloWorld'