Projekt

Obecné

Profil

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