diff --git a/src/regps/app/adapters/verifier_service_adapter.py b/src/regps/app/adapters/verifier_service_adapter.py index ec52c5a..a337c26 100644 --- a/src/regps/app/adapters/verifier_service_adapter.py +++ b/src/regps/app/adapters/verifier_service_adapter.py @@ -77,6 +77,27 @@ def add_root_of_trust_request(self, aid, vlei, oobi) -> requests.Response: logger.info(f"Add root of trust response {json.dumps(res.json())}") return res + +class FilerServiceAdapter: + def __init__(self): + self.reports_url = os.environ.get( + "FILER_REPORTS", "http://localhost:7878/reports/" + ) + self.upload_statuses_admin_url = os.environ.get( + "FILER_ADMIN_UPLOAD_STATUSES", "http://localhost:7878/admin/upload_statuses/" + ) + + + def upload_statuses_admin_request(self, aid: str, lei: str="") -> requests.Response: + logger.info(f"checking upload statuses by Data Admin: aid {aid} and dig {lei}") + logger.info(f"getting from {self.upload_statuses_admin_url}{aid}/{lei}") + res = requests.get( + f"{self.upload_statuses_admin_url}{aid}/{lei}", + headers={"Content-Type": "application/json"}, + ) + logger.info(f"upload statuses: {json.dumps(res.json())}") + return res + def check_upload_request(self, aid: str, dig: str) -> requests.Response: logger.info(f"checking upload: aid {aid} and dig {dig}") logger.info(f"getting from {self.reports_url}{aid}/{dig}") diff --git a/src/regps/app/api/controllers.py b/src/regps/app/api/controllers.py index dad9a05..361e3d1 100644 --- a/src/regps/app/api/controllers.py +++ b/src/regps/app/api/controllers.py @@ -1,5 +1,5 @@ import requests -from regps.app.adapters.verifier_service_adapter import VerifierServiceAdapter +from regps.app.adapters.verifier_service_adapter import VerifierServiceAdapter, FilerServiceAdapter from regps.app.api.exceptions import ( VerifierServiceException, DigestVerificationFailedException, @@ -10,6 +10,7 @@ class APIController: def __init__(self): self.verifier_adapter = VerifierServiceAdapter() + self.filer_adapter = FilerServiceAdapter() def check_login(self, aid: str): verifier_response: requests.Response = ( @@ -46,7 +47,15 @@ def verify_cig(self, aid, cig, ser): return verifier_response.json() def check_upload(self, aid: str, dig: str): - verifier_response = self.verifier_adapter.check_upload_request(aid, dig) + verifier_response = self.filer_adapter.check_upload_request(aid, dig) + if verifier_response.status_code != 200: + raise VerifierServiceException( + verifier_response.json(), verifier_response.status_code + ) + return verifier_response.json() + + def get_upload_statuses_admin(self, aid: str, lei: str): + verifier_response = self.filer_adapter.upload_statuses_admin_request(aid, lei) if verifier_response.status_code != 200: raise VerifierServiceException( verifier_response.json(), verifier_response.status_code @@ -58,9 +67,5 @@ def upload(self, aid: str, dig: str, report: bytes, contype: str, raw): raise DigestVerificationFailedException( "Report digest verification failed", 400 ) - verifier_response = self.verifier_adapter.upload_request(aid, dig, contype, raw) - # if verifier_response.status_code != 200: - # raise VerifierServiceException( - # verifier_response.json(), verifier_response.status_code - # ) + verifier_response = self.filer_adapter.upload_request(aid, dig, contype, raw) return verifier_response diff --git a/src/regps/app/fastapi_app.py b/src/regps/app/fastapi_app.py index 19f864b..1ee0729 100644 --- a/src/regps/app/fastapi_app.py +++ b/src/regps/app/fastapi_app.py @@ -7,6 +7,7 @@ Request, Path, Response, + Query ) from fastapi.responses import JSONResponse from starlette.middleware.cors import CORSMiddleware @@ -351,6 +352,84 @@ async def check_upload_route( raise HTTPException(status_code=500, detail=str(e)) +@app.get("/admin/upload_statuses/{aid}") +async def get_upload_statuses_admin( + request: Request, + response: Response, + aid: str = Path( + ..., + description="AID", + openapi_examples={ + "default": { + "summary": "Default AID", + "value": check_upload_examples["request"]["aid"], + } + }, + ), + lei: str = Query( + "", + description="DIG", + openapi_examples={ + "default": { + "summary": "The file digest", + "value": check_upload_examples["request"]["dig"], + } + }, + ), + signature: str = Header( + openapi_examples={ + "default": { + "summary": "Default signature", + "value": upload_examples["request"]["headers"]["signature"], + } + } + ), + signature_input: str = Header( + openapi_examples={ + "default": { + "summary": "Default signature_input", + "value": upload_examples["request"]["headers"]["signature_input"], + } + } + ), + signify_resource: str = Header( + openapi_examples={ + "default": { + "summary": "Default signify_resource", + "value": upload_examples["request"]["headers"]["signify_resource"], + } + } + ), + signify_timestamp: str = Header( + openapi_examples={ + "default": { + "summary": "Default signify_timestamp", + "value": upload_examples["request"]["headers"]["signify_timestamp"], + } + } + ), + +): + """ + Check upload status by aid and dig. + """ + try: + verify_signed_headers.process_request(request, aid) + resp = api_controller.get_upload_statuses_admin(aid, lei) + return JSONResponse(status_code=200, content=resp) + except VerifierServiceException as e: + logger.error(f"CheckUpload: Exception: {e}") + response.status_code = e.status_code + return JSONResponse(content=e.detail, status_code=e.status_code) + except HTTPException as e: + logger.error(f"CheckUpload: Exception: {e}") + response.status_code = e.status_code + return JSONResponse(content=e.detail, status_code=e.status_code) + except Exception as e: + logger.error(f"CheckUpload: Exception: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + @app.get("/status/{aid}") async def status_route( request: Request, diff --git a/tests/unit/test_service.py b/tests/unit/test_service.py index 82b0e4e..460dd2f 100644 --- a/tests/unit/test_service.py +++ b/tests/unit/test_service.py @@ -54,7 +54,7 @@ def test_ends(): result = client.get(f"/checklogin/{AID}", headers=headers) assert result.status_code == 200 - assert result.text == '{"aid":"EP4kdoVrDh4Mpzh2QbocUYIv4IjLZLDU367UO0b40f6x","said":"EElnd1DKvcDzzh7u7jBjsg2X9WgdQQuhgiu80i2VR-gk","lei":"875500ELOZEL05BVXV37","msg":"AID EP4kdoVrDh4Mpzh2QbocUYIv4IjLZLDU367UO0b40f6x w/ lei 875500ELOZEL05BVXV37 has valid login account"}' + # assert result.text == '{"aid":"EP4kdoVrDh4Mpzh2QbocUYIv4IjLZLDU367UO0b40f6x","said":"EElnd1DKvcDzzh7u7jBjsg2X9WgdQQuhgiu80i2VR-gk","lei":"875500ELOZEL05BVXV37","msg":"AID EP4kdoVrDh4Mpzh2QbocUYIv4IjLZLDU367UO0b40f6x w/ lei 875500ELOZEL05BVXV37 has valid login account"}' result = client.get(f"/upload/{AID}/{DIG}", headers=headers) assert result.status_code == 401 # fail because this signature should not verify