code refactorings after merge from main

This commit is contained in:
Oscar Krause 2025-04-08 13:52:09 +02:00
parent f62f2a2701
commit 20cdaefa1c
3 changed files with 37 additions and 40 deletions

View File

@ -1,8 +1,9 @@
import logging import logging
import sys
from base64 import b64encode as b64enc from base64 import b64encode as b64enc
from calendar import timegm from calendar import timegm
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from datetime import datetime, timedelta, UTC from datetime import datetime, UTC
from hashlib import sha256 from hashlib import sha256
from json import loads as json_loads from json import loads as json_loads
from os import getenv as env 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, \ from starlette.responses import StreamingResponse, JSONResponse as JSONr, HTMLResponse as HTMLr, Response, \
RedirectResponse RedirectResponse
from orm import Origin, Lease, init as db_init, migrate # add relative path to use packages as they were in the app/ dir
from util import PrivateKey, PublicKey, load_file sys.path.append('../')
sys.path.append('../app')
from orm import Origin, Lease, init as db_init, migrate, Instance, Site
# Load variables # Load variables
load_dotenv('../version.env') 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 # 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') @app.get('/-/client-token', summary='* Client-Token', description='creates a new messenger token for this service instance')
async def _client_token(): async def _client_token():
cur_time = datetime.utcnow() cur_time = datetime.now(UTC)
default_instance = Instance.get_default_instance(db) default_instance = Instance.get_default_instance(db)
public_key = default_instance.get_public_key() 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 # 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') @app.post('/leasing/v1/lessor', description='request multiple leases (borrow) for current origin')
async def leasing_v1_lessor(request: Request): 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) default_instance = Instance.get_default_instance(db)
jwt_decode_key = default_instance.get_jwt_decode_key() 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 # 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') @app.get('/leasing/v1/lessor/leases', description='get active leases for current origin')
async def leasing_v1_lessor_lease(request: Request): 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() 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 # venv/lib/python3.9/site-packages/nls_core_lease/lease_single.py
@app.put('/leasing/v1/lease/{lease_ref}', description='renew a lease') @app.put('/leasing/v1/lease/{lease_ref}', description='renew a lease')
async def leasing_v1_lease_renew(request: Request, lease_ref: str): 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) default_instance = Instance.get_default_instance(db)
jwt_decode_key = default_instance.get_jwt_decode_key() 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 # 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') @app.delete('/leasing/v1/lease/{lease_ref}', description='release (return) a lease')
async def leasing_v1_lease_delete(request: Request, lease_ref: str): 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() 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 # 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') @app.delete('/leasing/v1/lessor/leases', description='release all leases')
async def leasing_v1_lessor_lease_remove(request: Request): 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() jwt_decode_key = Instance.get_default_instance(db).get_jwt_decode_key()

View File

@ -1,11 +1,17 @@
import logging
from datetime import datetime, timedelta, timezone, UTC 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 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.engine import Engine
from sqlalchemy.orm import sessionmaker, declarative_base, Session, relationship 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() logging.basicConfig()
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -28,7 +34,6 @@ class Site(Base):
@staticmethod @staticmethod
def create_statement(engine: Engine): def create_statement(engine: Engine):
from sqlalchemy.schema import CreateTable
return CreateTable(Site.__table__).compile(engine) return CreateTable(Site.__table__).compile(engine)
@staticmethod @staticmethod
@ -65,7 +70,6 @@ class Instance(Base):
@staticmethod @staticmethod
def create_statement(engine: Engine): def create_statement(engine: Engine):
from sqlalchemy.schema import CreateTable
return CreateTable(Instance.__table__).compile(engine) return CreateTable(Instance.__table__).compile(engine)
@staticmethod @staticmethod
@ -111,21 +115,18 @@ class Instance(Base):
def get_client_token_expire_delta(self) -> "dateutil.relativedelta.relativedelta": def get_client_token_expire_delta(self) -> "dateutil.relativedelta.relativedelta":
return relativedelta(seconds=self.client_token_expire_delta) return relativedelta(seconds=self.client_token_expire_delta)
def __get_private_key(self) -> "RsaKey": def __get_private_key(self) -> "PrivateKey":
return parse_key(self.private_key) return PrivateKey(self.private_key)
def get_public_key(self) -> "RsaKey": def get_public_key(self) -> "PublicKey":
return parse_key(self.public_key) return PublicKey(self.public_key)
def get_jwt_encode_key(self) -> "jose.jkw": def get_jwt_encode_key(self) -> "jose.jkw":
from jose import jwk
from jose.constants import ALGORITHMS return jwk.construct(self.__get_private_key().pem().decode('utf-8'), algorithm=ALGORITHMS.RS256)
return jwk.construct(self.__get_private_key().export_key().decode('utf-8'), algorithm=ALGORITHMS.RS256)
def get_jwt_decode_key(self) -> "jose.jwt": def get_jwt_decode_key(self) -> "jose.jwt":
from jose import jwk return jwk.construct(self.get_public_key().pem().decode('utf-8'), algorithm=ALGORITHMS.RS256)
from jose.constants import ALGORITHMS
return jwk.construct(self.get_public_key().export_key().decode('utf-8'), algorithm=ALGORITHMS.RS256)
def get_private_key_str(self, encoding: str = 'utf-8') -> str: def get_private_key_str(self, encoding: str = 'utf-8') -> str:
return self.private_key.decode(encoding) return self.private_key.decode(encoding)
@ -162,7 +163,6 @@ class Origin(Base):
@staticmethod @staticmethod
def create_statement(engine: Engine): def create_statement(engine: Engine):
from sqlalchemy.schema import CreateTable
return CreateTable(Origin.__table__).compile(engine) return CreateTable(Origin.__table__).compile(engine)
@staticmethod @staticmethod
@ -241,7 +241,6 @@ class Lease(Base):
@staticmethod @staticmethod
def create_statement(engine: Engine): def create_statement(engine: Engine):
from sqlalchemy.schema import CreateTable
return CreateTable(Lease.__table__).compile(engine) return CreateTable(Lease.__table__).compile(engine)
@staticmethod @staticmethod
@ -336,9 +335,7 @@ class Lease(Base):
def init_default_site(session: Session): def init_default_site(session: Session):
from app.util import generate_key private_key = PrivateKey.generate()
private_key = generate_key()
public_key = private_key.public_key() public_key = private_key.public_key()
site = Site( site = Site(
@ -351,8 +348,8 @@ def init_default_site(session: Session):
instance = Instance( instance = Instance(
instance_ref=Instance.DEFAULT_INSTANCE_REF, instance_ref=Instance.DEFAULT_INSTANCE_REF,
site_key=site.site_key, site_key=site.site_key,
private_key=private_key.export_key(), private_key=private_key.pem(),
public_key=public_key.export_key(), public_key=public_key.pem(),
) )
session.add(instance) session.add(instance)
session.commit() session.commit()
@ -379,10 +376,6 @@ def init(engine: Engine):
def migrate(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) db = inspect(engine)
# todo: add update guide to use 1.LATEST to 2.0 # 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')) default_instance_private_key_path = str(join(dirname(__file__), 'cert/instance.private.pem'))
instance_private_key = env('INSTANCE_KEY_RSA', None) instance_private_key = env('INSTANCE_KEY_RSA', None)
if instance_private_key is not 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): 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')) default_instance_public_key_path = str(join(dirname(__file__), 'cert/instance.public.pem'))
instance_public_key = env('INSTANCE_KEY_PUB', None) instance_public_key = env('INSTANCE_KEY_PUB', None)
if instance_public_key is not 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): 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
token_expire_delta = env('TOKEN_EXPIRE_DAYS', None) token_expire_delta = env('TOKEN_EXPIRE_DAYS', None)

View File

@ -2,7 +2,7 @@ from os import getenv as env
from base64 import b64encode as b64enc from base64 import b64encode as b64enc
from hashlib import sha256 from hashlib import sha256
from calendar import timegm from calendar import timegm
from datetime import datetime from datetime import datetime, UTC
from uuid import UUID, uuid4 from uuid import UUID, uuid4
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
@ -17,7 +17,7 @@ sys.path.append('../')
sys.path.append('../app') sys.path.append('../app')
from app import main 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' ORIGIN_REF, ALLOTMENT_REF, SECRET = str(uuid4()), '20000000-0000-0000-0000-000000000001', 'HelloWorld'