diff --git a/backend/app/dependencies.py b/backend/app/dependencies.py index 62b379f9..078f36a5 100644 --- a/backend/app/dependencies.py +++ b/backend/app/dependencies.py @@ -1,18 +1,15 @@ from fastapi import Depends, HTTPException, status, Request from fastapi.security import APIKeyHeader, OAuth2PasswordBearer from jose import JWTError, jwe, jwt -from Crypto.Protocol.KDF import HKDF -from Crypto.Hash import SHA256 +from cryptography.hazmat.primitives.kdf.hkdf import HKDF +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.backends import default_backend from typing import Any import json -# import logging from app.config import get_settings from app.utils import logger -# logger = logging.getLogger(__name__) - - api_key_header = APIKeyHeader(name=get_settings().API_KEY_NAME, auto_error=False) oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") @@ -43,14 +40,14 @@ def get_user(user_id: str): def get_derived_encryption_key(secret: str) -> Any: context = str.encode("NextAuth.js Generated Encryption Key") - return HKDF( - master=secret.encode(), - key_len=32, - salt="".encode(), - hashmod=SHA256, - num_keys=1, - context=context, + hkdf = HKDF( + algorithm=hashes.SHA256(), + length=32, + salt=b"", + info=context, + backend=default_backend() ) + return hkdf.derive(secret.encode()) def get_token_payload(token: str, secret: str) -> dict[str, Any]: @@ -97,6 +94,7 @@ def validate_jwt_token(token: str = Depends(oauth2_scheme)): async def validate_token(token: str = Depends(oauth2_scheme), request: Request = None): + print("VALIDATING - PRINT") logger.info("Validating token") logger.info(token) logger.info("Secret") diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index 430ba8cd..e0c975b3 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -1,9 +1,9 @@ from fastapi import APIRouter, Depends from app.dependencies import validate_token from app.plan.schemas import PlanTriggerRequest -from app.utils import read_csv_from_s3 +from app.utils import read_csv_from_s3, logger from app.config import get_settings -from app.utils import logger + router = APIRouter( prefix="/plan", diff --git a/backend/app/utils.py b/backend/app/utils.py index 415960be..77d220ae 100644 --- a/backend/app/utils.py +++ b/backend/app/utils.py @@ -3,13 +3,11 @@ import csv from io import StringIO import string import secrets -from aws_lambda_powertools import Logger, Metrics, Tracer -from aws_lambda_powertools.metrics import MetricUnit # noqa: F401 +import logging -logger: Logger = Logger() -metrics: Metrics = Metrics() -tracer: Tracer = Tracer() +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) def read_csv_from_s3(bucket_name, filepath): diff --git a/backend/docker/Dockerfile b/backend/docker/Dockerfile index 933ebce7..fb95e87e 100644 --- a/backend/docker/Dockerfile +++ b/backend/docker/Dockerfile @@ -1,5 +1,5 @@ # Pull base image -FROM python:3.10.12-slim-buster +FROM lambci/lambda:build-python3.10 # Set environment variables ENV PYTHONDONTWRITEBYTECODE 1 diff --git a/backend/docker/lambda.Dockerfile b/backend/docker/lambda.Dockerfile new file mode 100644 index 00000000..f64eec03 --- /dev/null +++ b/backend/docker/lambda.Dockerfile @@ -0,0 +1,22 @@ +FROM public.ecr.aws/lambda/python:3.10 + +# Set environment variables +ENV PYTHONDONTWRITEBYTECODE 1 +ENV PYTHONUNBUFFERED 1 + +# Set work directory +WORKDIR /app + +# Install system dependencies +#RUN apt-get update && apt-get install -y netcat-openbsd + +# Install python dependencies +COPY ./requirements/base.txt ./requirements/base.txt +RUN pip install --upgrade pip +RUN pip install -r requirements/base.txt + +# Copy project +COPY . . + +# command to run on container start +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/backend/requirements/base.txt b/backend/requirements/base.txt index 6708f024..5a1693c4 100644 --- a/backend/requirements/base.txt +++ b/backend/requirements/base.txt @@ -1,7 +1,7 @@ anyio==3.7.1 cffi==1.15.1 click==8.1.3 -cryptography==41.0.1 +cryptography==37.0.4 ecdsa==0.18.0 exceptiongroup==1.1.2 fastapi==0.99.1 @@ -25,6 +25,4 @@ uvicorn==0.22.0 uvloop==0.17.0 watchfiles==0.19.0 websockets==11.0.3 -boto3 -pycryptodome -aws-lambda-powertools \ No newline at end of file +boto3 \ No newline at end of file diff --git a/backend/serverless.yml b/backend/serverless.yml index 81c0653f..a0fcb555 100644 --- a/backend/serverless.yml +++ b/backend/serverless.yml @@ -28,6 +28,7 @@ custom: useDocker: true dockerSsh: true fileName: requirements/base.txt + dockerRunCmdExtraArgs: ['--platform', 'linux/amd64'] customDomain: domainName: api.${self:provider.environment.DOMAIN_NAME} createRoute53Record: true diff --git a/backend/test_event.json b/backend/test_event.json new file mode 100644 index 00000000..19fe7aba --- /dev/null +++ b/backend/test_event.json @@ -0,0 +1,9 @@ +{ + "httpMethod": "POST", + "path": "/v1/plan/trigger", + "headers": { + "x-api-key": "4QPwbB6hEdUloDVtbBJCUTfGBdBgWwpeavWQ7t5Z", + "Authorization": "Bearer 4QPwbB6hEdUloDVtbBJCUTfGBdBgWwpeavWQ7t5Z" + }, + "body": "{\"goal\": \"epc\", \"goal_value\": \"c\", \"portfolio_id\": 1, \"trigger_file_path\": \"test\", \"housing_type\": \"social\"}" +}