Skip to content

Commit

Permalink
Added /admin/upload_statuses endpoint to get all upload statuses by D…
Browse files Browse the repository at this point in the history
…ata Admin
  • Loading branch information
aydarng committed Jan 8, 2025
1 parent f756a84 commit 7794c50
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 8 deletions.
21 changes: 21 additions & 0 deletions src/regps/app/adapters/verifier_service_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
Expand Down
19 changes: 12 additions & 7 deletions src/regps/app/api/controllers.py
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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 = (
Expand Down Expand Up @@ -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
Expand All @@ -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
79 changes: 79 additions & 0 deletions src/regps/app/fastapi_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
Request,
Path,
Response,
Query
)
from fastapi.responses import JSONResponse
from starlette.middleware.cors import CORSMiddleware
Expand Down Expand Up @@ -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 check_upload_route(
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,
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/test_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 7794c50

Please sign in to comment.