Projekt

Obecné

Profil

Stáhnout (6.01 KB) Statistiky
| Větev: | Tag: | Revize:
1 62d64d21 Stanislav Král
import os
2 1fa243ca Jan Pašek
3 b543de69 Captain_Trojan
from flask import Flask, redirect, request
4 0cf35f70 Stanislav Král
from flask_injector import FlaskInjector
5 d55b3aff Stanislav Král
from injector import Injector
6
from werkzeug.exceptions import HTTPException
7 1fa243ca Jan Pašek
8
from src.config import configuration
9 d78aa613 Jan Pašek
from src.config.configuration import Configuration
10 1fa243ca Jan Pašek
from src.config.connection_provider import ConnectionProvider
11 5b57121e Captain_Trojan
from src.controllers.certificates_controller import CertController
12 b1fa358f Jan Pašek
from src.controllers.crl_ocsp_controller import CrlOcspController
13 266e1b4d Stanislav Král
from src.controllers.exception_handlers import handle_cryptography_exception, handle_database_exception, \
14
    handle_generic_exception
15 2166bb21 Stanislav Král
from src.exceptions.database_exception import DatabaseException
16 81dbb479 Jan Pašek
from src.services.cryptography import CryptographyService, CryptographyException
17 ca436714 David Friesecký
from src.utils.logger import Logger
18 6e333f54 Stanislav Král
19 61535019 Stanislav Král
app = Flask(__name__)
20 6e333f54 Stanislav Král
21
22
@app.route('/')
23
def index():
24 2e646e3b Jan Pašek
    return redirect("/static/index.html")
25 6e333f54 Stanislav Král
26
27 5b57121e Captain_Trojan
@app.route('/api/certificates', methods=["POST"])
28 0cf35f70 Stanislav Král
def create_certificate(certificate_controller: CertController):
29 1fa243ca Jan Pašek
    return certificate_controller.create_certificate()
30 5b57121e Captain_Trojan
31
32
@app.route('/api/certificates', methods=["GET"])
33 0cf35f70 Stanislav Král
def get_cert_list(certificate_controller: CertController):
34 1fa243ca Jan Pašek
    return certificate_controller.get_certificate_list()
35 5b57121e Captain_Trojan
36
37 fb987403 Captain_Trojan
@app.route('/api/certificates/<id>', methods=["GET"])
38 0cf35f70 Stanislav Král
def get_cert(id, certificate_controller: CertController):
39 1fa243ca Jan Pašek
    return certificate_controller.get_certificate_by_id(id)
40 fb987403 Captain_Trojan
41
42 2cecaf70 Jan Pašek
@app.route('/api/certificates/<id>', methods=["PATCH"])
43
def set_certificate_status(id, certificate_controller: CertController):
44
    return certificate_controller.set_certificate_status(id)
45
46
47 f808fd93 Captain_Trojan
@app.route('/api/certificates/<id>', methods=["DELETE"])
48
def delete_certificate(id, certificate_controller: CertController):
49
    return certificate_controller.delete_certificate(id)
50
51
52 5b6d9513 Captain_Trojan
@app.route('/api/certificates/<id>/details', methods=["GET"])
53 0cf35f70 Stanislav Král
def get_cert_details(id, certificate_controller: CertController):
54 1fa243ca Jan Pašek
    return certificate_controller.get_certificate_details_by_id(id)
55 5b6d9513 Captain_Trojan
56
57 d53c2fdc Captain_Trojan
@app.route('/api/certificates/<id>/root', methods=["GET"])
58 0cf35f70 Stanislav Král
def get_cert_root(id, certificate_controller: CertController):
59 1fa243ca Jan Pašek
    return certificate_controller.get_certificate_root_by_id(id)
60 d53c2fdc Captain_Trojan
61
62 aa740737 Captain_Trojan
@app.route('/api/certificates/<id>/chain', methods=["GET"])
63 0cf35f70 Stanislav Král
def get_cert_chain(id, certificate_controller: CertController):
64 1fa243ca Jan Pašek
    return certificate_controller.get_certificate_trust_chain_by_id(id)
65
66 f808fd93 Captain_Trojan
67 780c6d9c Jan Pašek
@app.route('/api/certificates/<id>/privatekey', methods=["GET"])
68 ce8b9aaf Stanislav Král
def get_private_key_of_a_certificate(id, certificate_controller: CertController):
69
    return certificate_controller.get_private_key_of_a_certificate(id)
70 1fa243ca Jan Pašek
71 f808fd93 Captain_Trojan
72 780c6d9c Jan Pašek
@app.route('/api/certificates/<id>/publickey', methods=["GET"])
73 cfda1725 Stanislav Král
def get_public_key_of_a_certificate(id, certificate_controller: CertController):
74
    return certificate_controller.get_public_key_of_a_certificate(id)
75
76 f808fd93 Captain_Trojan
77 b1fa358f Jan Pašek
@app.route('/api/crl/<id>', methods=["GET"])
78
def get_crl_of_issuer(id, crl_ocsp_controller: CrlOcspController):
79
    return crl_ocsp_controller.get_crl(id)
80
81
82 b543de69 Captain_Trojan
@app.route('/api/ocsp/<id>/<path:ocsp_request>', methods=["GET"])
83
def get_ocsp_of_issuer_get(id, ocsp_request, crl_ocsp_controller: CrlOcspController):
84
    return crl_ocsp_controller.get_ocsp_from_base64(id, ocsp_request)
85
86
87
@app.route('/api/ocsp/<id>', methods=["POST"])
88
def get_ocsp_of_issuer_post(id, crl_ocsp_controller: CrlOcspController):
89
    return crl_ocsp_controller.get_ocsp_from_der(id, request.data)
90
91
92 977845e0 Stanislav Král
@app.route('/api/certificates/<id>/identity', methods=["POST"])
93 1d8ff0a3 Stanislav Král
def generate_certificate_pkcs_identity(id, certificate_controller: CertController):
94
    return certificate_controller.generate_certificate_pkcs_identity(id)
95
96
97 da0fc952 Stanislav Král
@app.errorhandler(CryptographyException)
98 266e1b4d Stanislav Král
def cryptography_error(e):
99
    return handle_cryptography_exception(e)
100 da0fc952 Stanislav Král
101
102 2166bb21 Stanislav Král
@app.errorhandler(DatabaseException)
103 266e1b4d Stanislav Král
def database_error(e):
104
    return handle_database_exception(e)
105 2166bb21 Stanislav Král
106
107 d55b3aff Stanislav Král
@app.errorhandler(Exception)
108 266e1b4d Stanislav Král
def generic_exception(e):
109 d55b3aff Stanislav Král
    if isinstance(e, HTTPException):
110 266e1b4d Stanislav Král
        # handle HTTPException exceptions here (MethodNotAllowed for example)
111 d55b3aff Stanislav Král
        Logger.warning(f""" HTTPException occurred: "{str(e)}" """)
112
        return str(e), e.code
113 266e1b4d Stanislav Král
    return handle_generic_exception(e)
114 d55b3aff Stanislav Král
115
116 61535019 Stanislav Král
def initialize_app(application) -> bool:
117 81dbb479 Jan Pašek
    """
118
    Initializes the application
119
        -   configure dependency injection
120
        -   check whether OpenSSL is on the system
121 61535019 Stanislav Král
    :param application Flask Application to be initialized.
122
    :return: boolean flag indicating whether initialization was successful or not
123 81dbb479 Jan Pašek
    """
124 0cf35f70 Stanislav Král
    modules = [configuration.configure_env_variable, ConnectionProvider]
125
    injector = Injector(modules)
126 61535019 Stanislav Král
    FlaskInjector(app=application, modules=modules)
127 aa740737 Captain_Trojan
128 d78aa613 Jan Pašek
    config = injector.get(Configuration)
129
    configuration.configure_logging(config)
130
131 688c63b7 Jan Pašek
    Logger.info(f"Using configuration file: {config.config_file}")
132
133 81dbb479 Jan Pašek
    # There's a little dependency on the CryptoService, which is not a pretty thing from
134
    # architectural point of view. However it is only a minimal piece of code and
135
    # it makes sense to do it in this way instead of trying to run openssl via subprocess here
136
    cryptography_service = injector.get(CryptographyService)
137
    try:
138
        # if version string is returned, OpenSSL is present on the system
139 ca436714 David Friesecký
        Logger.info(f"Using {cryptography_service.get_openssl_version()}")
140 81dbb479 Jan Pašek
        return True
141
    except CryptographyException:
142
        # If getting the version string throws an exception the OpenSSL is not available
143
        print("OpenSSL was not located on the system. Application will now exit.")
144 ca436714 David Friesecký
        Logger.error(f"OpenSSL was not located on the system. Application will now exit.")
145 81dbb479 Jan Pašek
        return False
146
147 aa740737 Captain_Trojan
148 61535019 Stanislav Král
# app initialization must follow endpoint declaration (after all Flask decoration)
149
with app.app_context():
150
    if not initialize_app(app):
151
        print("Failed to initialize app, aborting...")
152 ca436714 David Friesecký
        Logger.error(f"Failed to initialize app, aborting...")
153 61535019 Stanislav Král
        exit(-1)
154
155 6e333f54 Stanislav Král
if __name__ == '__main__':
156 1fa243ca Jan Pašek
    app_host = "0.0.0.0"
157
    app_port = 5000
158 62d64d21 Stanislav Král
159 9832694f Stanislav Král
    # TODO better load this from config.py
160 62d64d21 Stanislav Král
    if "FLASK_HOST" in os.environ:
161 1fa243ca Jan Pašek
        app_host = os.environ["FLASK_HOST"]
162 62d64d21 Stanislav Král
163
    if "FLASK_PORT" in os.environ:
164 1fa243ca Jan Pašek
        app_host = os.environ["FLASK_PORT"]
165 62d64d21 Stanislav Král
166 1fa243ca Jan Pašek
    app.run(host=app_host, port=app_port)