Projekt

Obecné

Profil

Stáhnout (3.54 KB) Statistiky
| Větev: | Tag: | Revize:
1
from flask import Response, request
2
from injector import inject
3
import base64
4

    
5
from src.exceptions.certificate_not_found_exception import CertificateNotFoundException
6
from src.exceptions.private_key_not_found_exception import PrivateKeyNotFoundException
7
from src.services.crl_ocsp.crl_ocsp_service import CrlOcspService
8
from src.controllers.return_codes import *
9
from src.utils.logger import Logger
10

    
11
E_WRONG_PARAMETERS = {"success": False, "data": "Invalid request, wrong parameters."}
12
E_NO_CERTIFICATES_FOUND = {"success": False, "data": "No such certificate found."}
13

    
14

    
15
class CrlOcspController:
16

    
17
    @inject
18
    def __init__(self, crl_service: CrlOcspService):
19
        self.crl_service = crl_service
20

    
21
    def get_crl(self, ca_id: str):
22
        """
23
        Generate and download a CRL for a selected certificate authority
24
        :param ca_id: certificate authority whose CRL is requested
25
        :return: download response / error
26
        """
27

    
28
        # TODO check log
29
        Logger.info(f"\n\t{request.referrer}"
30
                    f"\n\t{request.method}   {request.path}   {request.scheme}"
31
                    f"\n\tCertificate ID = {ca_id}")
32

    
33
        # convert id from string to int
34
        try:
35
            identifier = int(ca_id)
36
        except ValueError:
37
            Logger.error(f"Invalid request, wrong parameters 'id'[{ca_id}].")
38
            return E_WRONG_PARAMETERS, C_BAD_REQUEST
39

    
40
        # generate the CRL
41
        try:
42
            crl = self.crl_service.generate_crl_response(identifier)
43
        except CertificateNotFoundException:
44
            Logger.error(f"No such certificate found 'ID = {identifier}'.")
45
            return E_NO_CERTIFICATES_FOUND, C_NOT_FOUND
46

    
47
        return Response(crl, mimetype="application/x-x509-ca-cert",
48
                        headers={"Content-Disposition": f"attachment;filename={ca_id}_crl.pem"})
49

    
50
    def get_ocsp_from_base64(self, ca_id, base64_der_ocsp_request):
51
        """
52
        Generate an OCSP Response for a base-64 encoded DER encoded OCSP Request.
53
        :param ca_id: certificate authority ID
54
        :param base64_der_ocsp_request: encoded request
55
        :return: DER OCSP response
56
        """
57

    
58
        Logger.info(f"\n\t{request.referrer}"
59
                    f"\n\t{request.method}   {request.path}   {request.scheme}"
60
                    f"\n\tCertificate ID = {ca_id}")
61

    
62
        return self.get_ocsp_from_der(ca_id, base64.b64decode(base64_der_ocsp_request))
63

    
64
    def get_ocsp_from_der(self, ca_id, der_ocsp_request):
65
        """
66
        Generate an OCSP Response for a DER encoded OCSP Request.
67
        :param ca_id: certificate authority ID
68
        :param der_ocsp_request: encoded request
69
        :return: DER OCSP response
70
        """
71

    
72
        Logger.info(f"\n\t{request.referrer}"
73
                    f"\n\t{request.method}   {request.path}   {request.scheme}"
74
                    f"\n\tCertificate ID = {ca_id}")
75

    
76
        if len(der_ocsp_request) == 0:
77
            Logger.error(f"Invalid request, wrong parameters 'der_ocsp_request'.")
78
            return E_WRONG_PARAMETERS, C_BAD_REQUEST
79

    
80
        try:
81
            ca_id = int(ca_id)
82
        except ValueError:
83
            Logger.error(f"Invalid request, wrong parameters 'id'[{ca_id}].")
84
            return E_WRONG_PARAMETERS, C_BAD_REQUEST
85

    
86
        try:
87
            ocsp_response = self.crl_service.generate_ocsp_response(ca_id, der_ocsp_request)
88
        except CertificateNotFoundException:
89
            Logger.error(f"No such certificate found 'ID = {ca_id}'.")
90
            return E_NO_CERTIFICATES_FOUND, C_NOT_FOUND
91

    
92
        return Response(ocsp_response, mimetype="application/ocsp-response")
(3-3/5)