Loading Dockerfile +7 −2 Original line number Diff line number Diff line Loading @@ -6,11 +6,16 @@ WORKDIR /usr/src/app COPY requirements.txt /usr/src/app/requirements.txt COPY config.yaml /usr/src/app/config.yaml ENV CAPIF_HOSTNAME="nginx" ENV CAPIF_PORT="8080" ENV BACKOFFICE_HOSTNAME="backoffice-microservice" ENV BACKOFFICE_PORT="8085" RUN apk add -U --no-cache gcc build-base linux-headers ca-certificates libffi-dev libressl-dev libxslt-dev RUN pip3 install --no-cache-dir -r requirements.txt COPY . /usr/src/app EXPOSE 8000 EXPOSE 8080 ENTRYPOINT ["python3", "-m", "main"] ENTRYPOINT ["python3", "main.py"] certs/create_cert_to_capif.py +10 −8 Original line number Diff line number Diff line Loading @@ -5,11 +5,13 @@ import os from OpenSSL.SSL import FILETYPE_PEM from OpenSSL.crypto import (dump_certificate_request, dump_privatekey, load_publickey, PKey, TYPE_RSA, X509Req, dump_publickey) from OpenSSL.crypto import (dump_certificate_request, dump_privatekey, PKey, TYPE_RSA, X509Req) HOSTNAME = os.getenv('CAPIF_HOSTNAME') PORT = os.getenv('CAPIF_PORT') def create_csr(): private_key_path = "private.key" Loading Loading @@ -37,6 +39,7 @@ def create_csr(): return csr_request def sign_certificate(publick_key): url = f"http://{HOSTNAME}:{PORT}/sign-csr" Loading @@ -46,12 +49,11 @@ def sign_certificate(publick_key): payload['filename'] = "superadmin_information" headers = { 'Content-Type': 'application/json' } response = requests.request("POST", url, headers=headers, data=json.dumps(payload)) response = requests.request( "POST", url, headers=headers, data=json.dumps(payload),verify=False) response_payload = json.loads(response.text) cert = response_payload["certificate"] Loading @@ -60,15 +62,14 @@ def sign_certificate(publick_key): cert_file.close() return response_payload def get_ca_root(): url = f"http://{HOSTNAME}:{PORT}/ca-root" #url = "http://localhost:8080/ca-root" headers = { 'Content-Type': "application/json" } response = requests.request("GET", url, headers=headers) response = requests.request("GET", url, headers=headers,verify=False) response_payload = json.loads(response.text) cert = response_payload["certificate"] Loading @@ -82,4 +83,5 @@ if __name__ == '__main__': get_ca_root() csr_request = create_csr() sign_certificate(csr_request) print("Obtained certs/ca to operate with CAPIF") controllers/resources.py +13 −19 Original line number Diff line number Diff line from core.invokers_resources import InvokersResources from core.providers_resources import ProviderResources from core.events import Events from core.capif_ops import CapifOps from fastapi import APIRouter, Depends, HTTPException, Request from typing import Optional from fastapi_jwt_auth import AuthJWT from typing import List from datetime import date router = APIRouter() invokers_ops = InvokersResources() providers_ops = ProviderResources() events_ops = Events() capif_ops = CapifOps() @router.get("/resources/invokers") Loading @@ -22,7 +16,7 @@ async def get_invokers(Authorize: AuthJWT = Depends()): Authorize.jwt_required() return invokers_ops.get_all_invokers() return capif_ops.get_invokers() @router.delete("/resources/invokers/{invoker_id}") Loading @@ -33,7 +27,7 @@ async def delete_invoker(invoker_id, Authorize: AuthJWT = Depends()): Authorize.jwt_required() return invokers_ops.remove_invoker(invoker_id) return capif_ops.delete_invoker(invoker_id) @router.get('/resources/invokers/security/{invoker_id}') Loading @@ -43,7 +37,7 @@ def get_invoker_security_context_resource(invoker_id, Authorize: AuthJWT = Depen """ Authorize.jwt_required() return invokers_ops.get_security_context(invoker_id) return capif_ops.get_security_context(invoker_id) @router.delete('/resources/invokers/security/{invoker_id}') Loading @@ -53,10 +47,10 @@ def delete_invoker_security_context(invoker_id, Authorize: AuthJWT = Depends()): """ Authorize.jwt_required() return invokers_ops.remove_security_context(invoker_id) return capif_ops.delete_security_context(invoker_id) @router.get("/resources/providers",) @router.get("/resources/providers") async def get_providers(Authorize: AuthJWT = Depends()): """ Get list of all provider registered in CAPIF Loading @@ -64,7 +58,7 @@ async def get_providers(Authorize: AuthJWT = Depends()): Authorize.jwt_required() return providers_ops.get_providers() return capif_ops.get_providers() @router.delete("/resources/providers/{provider_id}") Loading @@ -75,7 +69,7 @@ async def delete_provider(provider_id, Authorize: AuthJWT = Depends()): Authorize.jwt_required() return providers_ops.remove_provider(provider_id) return capif_ops.delete_provider(provider_id) @router.get('/resources/providers/services/{apf_id}') Loading @@ -85,7 +79,7 @@ def get_provider_services_resources(apf_id, Authorize: AuthJWT = Depends()): """ Authorize.jwt_required() return providers_ops.get_services_of_apf(apf_id) return capif_ops.get_provider_service(apf_id) @router.delete('/resources/providers/services/{apf_id}/{service_id}') Loading @@ -95,7 +89,7 @@ def delete_provider_service(apf_id, service_id, Authorize: AuthJWT = Depends()): """ Authorize.jwt_required() return providers_ops.remove_service(apf_id, service_id) return capif_ops.delete_provider_service(apf_id, service_id) @router.get('/resources/events/{id}') Loading @@ -106,7 +100,7 @@ def get_events(id, Authorize: AuthJWT = Depends()): """ Authorize.jwt_required() return events_ops.get_events_by_id(id) return capif_ops.get_events(id) @router.delete('/resources/events/{subscriber_id}/{subscription_id}') Loading @@ -118,4 +112,4 @@ async def delete_events(subscriber_id, subscription_id, Authorize: AuthJWT = Dep Authorize.jwt_required() return events_ops.remove_events_by_subscriber_id(subscriber_id, subscription_id) return capif_ops.delete_events(subscriber_id, subscription_id) core/capif_ops.py +66 −28 Original line number Diff line number Diff line import requests import os import logging import os import requests import warnings from core.responses import make_response warnings.filterwarnings('ignore', message='Unverified HTTPS request') logger = logging.getLogger(__name__) # the __name__ resolve to "uicheckapp.services" # This will load the uicheckapp logger GET = "GET" DELETE = "DELETE" class CapifOps(): def __init__(self): self.HOSTNAME = os.getenv('CAPIF_HOSTNAME') self.CAPIF_HOSTNAME = os.getenv('CAPIF_HOSTNAME') self.CAPIF_PORT = os.getenv('CAPIF_PORT') self.BACKOFFICE_HOSTNAME = os.getenv('BACKOFFICE_HOSTNAME') self.BACKOFFICE_PORT = os.getenv('BACKOFFICE_PORT') self.headers = { 'Content-Type': 'application/json' } def delete_security_context(self, id): url = f"https://{self.HOSTNAME}/capif-security/v1/trustedInvokers/{id}" response = self.__make_request(url) def get_invokers(self): url = f"https://{self.BACKOFFICE_HOSTNAME}:{self.BACKOFFICE_PORT}/invokers" response = self.__make_request(url, GET) return response def delete_service(self, id, service_id): url = f"https://{self.HOSTNAME}/published-apis/v1/{id}/service-apis/{service_id}" def get_security_context(self, invoker_id): url = f"https://{self.BACKOFFICE_HOSTNAME}:{self.BACKOFFICE_PORT}/resources/invokers/security/{invoker_id}" response = self.__make_request(url, GET) return response response = self.__make_request(url) def get_providers(self): url = f"https://{self.BACKOFFICE_HOSTNAME}:{self.BACKOFFICE_PORT}/providers" response = self.__make_request(url, GET) return response def get_provider_service(self, id): url = f"https://{self.BACKOFFICE_HOSTNAME}:{self.BACKOFFICE_PORT}/resources/providers/services/{id}" response = self.__make_request(url, GET) return response def delete_event_subscription(self, id, subscription_id): def get_events(self, id): url = f"https://{self.BACKOFFICE_HOSTNAME}:{self.BACKOFFICE_PORT}/events/{id}" response = self.__make_request(url, GET) return response url = f"https://{self.HOSTNAME}/capif-events/v1/{id}/subscriptions/{subscription_id}" def delete_security_context(self, id): url = f"https://{self.CAPIF_HOSTNAME}:{self.CAPIF_PORT}/capif-security/v1/trustedInvokers/{id}" response = self.__make_request(url, DELETE) return response response = self.__make_request(url) def delete_provider_service(self, id, service_id): url = f"https://{self.CAPIF_HOSTNAME}:{self.CAPIF_PORT}/published-apis/v1/{id}/service-apis/{service_id}" response = self.__make_request(url, DELETE) return response def delete_events(self, id, subscription_id): url = f"https://{self.CAPIF_HOSTNAME}:{self.CAPIF_PORT}/capif-events/v1/{id}/subscriptions/{subscription_id}" response = self.__make_request(url, DELETE) return response def delete_invoker(self, id): url = f"https://{self.HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{id}" response = self.__make_request(url) url = f"https://{self.CAPIF_HOSTNAME}:{self.CAPIF_PORT}/api-invoker-management/v1/onboardedInvokers/{id}" response = self.__make_request(url, DELETE) return response def delete_provider(self, id): url = f"https://{self.HOSTNAME}/api-provider-management/v1/registrations/{id}" response = self.__make_request(url) url = f"https://{self.CAPIF_HOSTNAME}:{self.CAPIF_PORT}/api-provider-management/v1/registrations/{id}" response = self.__make_request(url, DELETE) return response def __make_request(self, url): def __make_request(self, url, method): try: if method == DELETE: response = requests.delete(url, headers=self.headers, cert=( 'certs/cert_backoffice.crt', 'certs/private.key'), verify="certs/ca.crt") if response.status_code == 404: logger.error("Resource not found") return make_response(object=None, status=200) elif response.status_code == 400: logger.error("Bad request") return make_response(object=None, status=200) return make_response(object=response.json(), status=200) # One way ssl verification, we haven't the microservice certificate response = requests.request(method, url, headers=self.headers, cert=( 'certs/cert_backoffice.crt', 'certs/private.key'), verify=False) return response if response.status_code == 404: logger.error("Resource not found") return make_response(object=None, status=200) elif response.status_code == 400: logger.error("Bad request") return make_response(object=None, status=200) return make_response(object=response.json()["object"], status=200) except Exception as e: logger.error("Something wrong happens: ", e) return "Shometing wrong happens: ", e core/events.pydeleted 100644 → 0 +0 −61 Original line number Diff line number Diff line from core.resources import Resource from core.capif_ops import CapifOps from core.responses import make_response import logging logger = logging.getLogger(__name__) class Events(Resource): def __init__(self): Resource.__init__(self) self.capif = CapifOps() def get_events_by_id(self, id): events_col = self.db.get_col_by_name(self.db.event_details) try: events = events_col.find({"subscriber_id": id}) json_events = [] for event in events: json_events.append(event) return make_response(object=json_events, status=200) except Exception as e: return "Error when retreiving event: ", e def get_events(self): events_col = self.db.get_col_by_name(self.db.event_details) try: events = events_col.find({}, {"_id": 0}) json_events = [] for event in events: json_events.append(event) return make_response(object=json_events, status=200) except Exception as e: print(e) return "Error when retreiving event list: ", e def remove_events(self): self.db.delete_col_by_name(self.db.event_details) return "Done", 200 def remove_events_by_subscriber_id(self, subscriber_id, subscription_id): self.capif.delete_event_subscription(subscriber_id, subscription_id) # self.db.delete_document_by_subscriber_id( # self.db.event_details, subscriber_id) return "Done", 200 Loading
Dockerfile +7 −2 Original line number Diff line number Diff line Loading @@ -6,11 +6,16 @@ WORKDIR /usr/src/app COPY requirements.txt /usr/src/app/requirements.txt COPY config.yaml /usr/src/app/config.yaml ENV CAPIF_HOSTNAME="nginx" ENV CAPIF_PORT="8080" ENV BACKOFFICE_HOSTNAME="backoffice-microservice" ENV BACKOFFICE_PORT="8085" RUN apk add -U --no-cache gcc build-base linux-headers ca-certificates libffi-dev libressl-dev libxslt-dev RUN pip3 install --no-cache-dir -r requirements.txt COPY . /usr/src/app EXPOSE 8000 EXPOSE 8080 ENTRYPOINT ["python3", "-m", "main"] ENTRYPOINT ["python3", "main.py"]
certs/create_cert_to_capif.py +10 −8 Original line number Diff line number Diff line Loading @@ -5,11 +5,13 @@ import os from OpenSSL.SSL import FILETYPE_PEM from OpenSSL.crypto import (dump_certificate_request, dump_privatekey, load_publickey, PKey, TYPE_RSA, X509Req, dump_publickey) from OpenSSL.crypto import (dump_certificate_request, dump_privatekey, PKey, TYPE_RSA, X509Req) HOSTNAME = os.getenv('CAPIF_HOSTNAME') PORT = os.getenv('CAPIF_PORT') def create_csr(): private_key_path = "private.key" Loading Loading @@ -37,6 +39,7 @@ def create_csr(): return csr_request def sign_certificate(publick_key): url = f"http://{HOSTNAME}:{PORT}/sign-csr" Loading @@ -46,12 +49,11 @@ def sign_certificate(publick_key): payload['filename'] = "superadmin_information" headers = { 'Content-Type': 'application/json' } response = requests.request("POST", url, headers=headers, data=json.dumps(payload)) response = requests.request( "POST", url, headers=headers, data=json.dumps(payload),verify=False) response_payload = json.loads(response.text) cert = response_payload["certificate"] Loading @@ -60,15 +62,14 @@ def sign_certificate(publick_key): cert_file.close() return response_payload def get_ca_root(): url = f"http://{HOSTNAME}:{PORT}/ca-root" #url = "http://localhost:8080/ca-root" headers = { 'Content-Type': "application/json" } response = requests.request("GET", url, headers=headers) response = requests.request("GET", url, headers=headers,verify=False) response_payload = json.loads(response.text) cert = response_payload["certificate"] Loading @@ -82,4 +83,5 @@ if __name__ == '__main__': get_ca_root() csr_request = create_csr() sign_certificate(csr_request) print("Obtained certs/ca to operate with CAPIF")
controllers/resources.py +13 −19 Original line number Diff line number Diff line from core.invokers_resources import InvokersResources from core.providers_resources import ProviderResources from core.events import Events from core.capif_ops import CapifOps from fastapi import APIRouter, Depends, HTTPException, Request from typing import Optional from fastapi_jwt_auth import AuthJWT from typing import List from datetime import date router = APIRouter() invokers_ops = InvokersResources() providers_ops = ProviderResources() events_ops = Events() capif_ops = CapifOps() @router.get("/resources/invokers") Loading @@ -22,7 +16,7 @@ async def get_invokers(Authorize: AuthJWT = Depends()): Authorize.jwt_required() return invokers_ops.get_all_invokers() return capif_ops.get_invokers() @router.delete("/resources/invokers/{invoker_id}") Loading @@ -33,7 +27,7 @@ async def delete_invoker(invoker_id, Authorize: AuthJWT = Depends()): Authorize.jwt_required() return invokers_ops.remove_invoker(invoker_id) return capif_ops.delete_invoker(invoker_id) @router.get('/resources/invokers/security/{invoker_id}') Loading @@ -43,7 +37,7 @@ def get_invoker_security_context_resource(invoker_id, Authorize: AuthJWT = Depen """ Authorize.jwt_required() return invokers_ops.get_security_context(invoker_id) return capif_ops.get_security_context(invoker_id) @router.delete('/resources/invokers/security/{invoker_id}') Loading @@ -53,10 +47,10 @@ def delete_invoker_security_context(invoker_id, Authorize: AuthJWT = Depends()): """ Authorize.jwt_required() return invokers_ops.remove_security_context(invoker_id) return capif_ops.delete_security_context(invoker_id) @router.get("/resources/providers",) @router.get("/resources/providers") async def get_providers(Authorize: AuthJWT = Depends()): """ Get list of all provider registered in CAPIF Loading @@ -64,7 +58,7 @@ async def get_providers(Authorize: AuthJWT = Depends()): Authorize.jwt_required() return providers_ops.get_providers() return capif_ops.get_providers() @router.delete("/resources/providers/{provider_id}") Loading @@ -75,7 +69,7 @@ async def delete_provider(provider_id, Authorize: AuthJWT = Depends()): Authorize.jwt_required() return providers_ops.remove_provider(provider_id) return capif_ops.delete_provider(provider_id) @router.get('/resources/providers/services/{apf_id}') Loading @@ -85,7 +79,7 @@ def get_provider_services_resources(apf_id, Authorize: AuthJWT = Depends()): """ Authorize.jwt_required() return providers_ops.get_services_of_apf(apf_id) return capif_ops.get_provider_service(apf_id) @router.delete('/resources/providers/services/{apf_id}/{service_id}') Loading @@ -95,7 +89,7 @@ def delete_provider_service(apf_id, service_id, Authorize: AuthJWT = Depends()): """ Authorize.jwt_required() return providers_ops.remove_service(apf_id, service_id) return capif_ops.delete_provider_service(apf_id, service_id) @router.get('/resources/events/{id}') Loading @@ -106,7 +100,7 @@ def get_events(id, Authorize: AuthJWT = Depends()): """ Authorize.jwt_required() return events_ops.get_events_by_id(id) return capif_ops.get_events(id) @router.delete('/resources/events/{subscriber_id}/{subscription_id}') Loading @@ -118,4 +112,4 @@ async def delete_events(subscriber_id, subscription_id, Authorize: AuthJWT = Dep Authorize.jwt_required() return events_ops.remove_events_by_subscriber_id(subscriber_id, subscription_id) return capif_ops.delete_events(subscriber_id, subscription_id)
core/capif_ops.py +66 −28 Original line number Diff line number Diff line import requests import os import logging import os import requests import warnings from core.responses import make_response warnings.filterwarnings('ignore', message='Unverified HTTPS request') logger = logging.getLogger(__name__) # the __name__ resolve to "uicheckapp.services" # This will load the uicheckapp logger GET = "GET" DELETE = "DELETE" class CapifOps(): def __init__(self): self.HOSTNAME = os.getenv('CAPIF_HOSTNAME') self.CAPIF_HOSTNAME = os.getenv('CAPIF_HOSTNAME') self.CAPIF_PORT = os.getenv('CAPIF_PORT') self.BACKOFFICE_HOSTNAME = os.getenv('BACKOFFICE_HOSTNAME') self.BACKOFFICE_PORT = os.getenv('BACKOFFICE_PORT') self.headers = { 'Content-Type': 'application/json' } def delete_security_context(self, id): url = f"https://{self.HOSTNAME}/capif-security/v1/trustedInvokers/{id}" response = self.__make_request(url) def get_invokers(self): url = f"https://{self.BACKOFFICE_HOSTNAME}:{self.BACKOFFICE_PORT}/invokers" response = self.__make_request(url, GET) return response def delete_service(self, id, service_id): url = f"https://{self.HOSTNAME}/published-apis/v1/{id}/service-apis/{service_id}" def get_security_context(self, invoker_id): url = f"https://{self.BACKOFFICE_HOSTNAME}:{self.BACKOFFICE_PORT}/resources/invokers/security/{invoker_id}" response = self.__make_request(url, GET) return response response = self.__make_request(url) def get_providers(self): url = f"https://{self.BACKOFFICE_HOSTNAME}:{self.BACKOFFICE_PORT}/providers" response = self.__make_request(url, GET) return response def get_provider_service(self, id): url = f"https://{self.BACKOFFICE_HOSTNAME}:{self.BACKOFFICE_PORT}/resources/providers/services/{id}" response = self.__make_request(url, GET) return response def delete_event_subscription(self, id, subscription_id): def get_events(self, id): url = f"https://{self.BACKOFFICE_HOSTNAME}:{self.BACKOFFICE_PORT}/events/{id}" response = self.__make_request(url, GET) return response url = f"https://{self.HOSTNAME}/capif-events/v1/{id}/subscriptions/{subscription_id}" def delete_security_context(self, id): url = f"https://{self.CAPIF_HOSTNAME}:{self.CAPIF_PORT}/capif-security/v1/trustedInvokers/{id}" response = self.__make_request(url, DELETE) return response response = self.__make_request(url) def delete_provider_service(self, id, service_id): url = f"https://{self.CAPIF_HOSTNAME}:{self.CAPIF_PORT}/published-apis/v1/{id}/service-apis/{service_id}" response = self.__make_request(url, DELETE) return response def delete_events(self, id, subscription_id): url = f"https://{self.CAPIF_HOSTNAME}:{self.CAPIF_PORT}/capif-events/v1/{id}/subscriptions/{subscription_id}" response = self.__make_request(url, DELETE) return response def delete_invoker(self, id): url = f"https://{self.HOSTNAME}/api-invoker-management/v1/onboardedInvokers/{id}" response = self.__make_request(url) url = f"https://{self.CAPIF_HOSTNAME}:{self.CAPIF_PORT}/api-invoker-management/v1/onboardedInvokers/{id}" response = self.__make_request(url, DELETE) return response def delete_provider(self, id): url = f"https://{self.HOSTNAME}/api-provider-management/v1/registrations/{id}" response = self.__make_request(url) url = f"https://{self.CAPIF_HOSTNAME}:{self.CAPIF_PORT}/api-provider-management/v1/registrations/{id}" response = self.__make_request(url, DELETE) return response def __make_request(self, url): def __make_request(self, url, method): try: if method == DELETE: response = requests.delete(url, headers=self.headers, cert=( 'certs/cert_backoffice.crt', 'certs/private.key'), verify="certs/ca.crt") if response.status_code == 404: logger.error("Resource not found") return make_response(object=None, status=200) elif response.status_code == 400: logger.error("Bad request") return make_response(object=None, status=200) return make_response(object=response.json(), status=200) # One way ssl verification, we haven't the microservice certificate response = requests.request(method, url, headers=self.headers, cert=( 'certs/cert_backoffice.crt', 'certs/private.key'), verify=False) return response if response.status_code == 404: logger.error("Resource not found") return make_response(object=None, status=200) elif response.status_code == 400: logger.error("Bad request") return make_response(object=None, status=200) return make_response(object=response.json()["object"], status=200) except Exception as e: logger.error("Something wrong happens: ", e) return "Shometing wrong happens: ", e
core/events.pydeleted 100644 → 0 +0 −61 Original line number Diff line number Diff line from core.resources import Resource from core.capif_ops import CapifOps from core.responses import make_response import logging logger = logging.getLogger(__name__) class Events(Resource): def __init__(self): Resource.__init__(self) self.capif = CapifOps() def get_events_by_id(self, id): events_col = self.db.get_col_by_name(self.db.event_details) try: events = events_col.find({"subscriber_id": id}) json_events = [] for event in events: json_events.append(event) return make_response(object=json_events, status=200) except Exception as e: return "Error when retreiving event: ", e def get_events(self): events_col = self.db.get_col_by_name(self.db.event_details) try: events = events_col.find({}, {"_id": 0}) json_events = [] for event in events: json_events.append(event) return make_response(object=json_events, status=200) except Exception as e: print(e) return "Error when retreiving event list: ", e def remove_events(self): self.db.delete_col_by_name(self.db.event_details) return "Done", 200 def remove_events_by_subscriber_id(self, subscriber_id, subscription_id): self.capif.delete_event_subscription(subscriber_id, subscription_id) # self.db.delete_document_by_subscriber_id( # self.db.event_details, subscriber_id) return "Done", 200