Projekt

Obecné

Profil

Stáhnout (5.42 KB) Statistiky
| Větev: | Tag: | Revize:
1
import os
2

    
3
from flask import Flask, redirect, request
4
from injector import Injector
5
from flask_injector import FlaskInjector
6

    
7
from src.config import configuration
8
from src.config.configuration import Configuration
9
from src.config.connection_provider import ConnectionProvider
10
from src.controllers.certificates_controller import CertController
11
from src.controllers.crl_ocsp_controller import CrlOcspController
12
from src.services.cryptography import CryptographyService, CryptographyException
13
from src.utils.logger import Logger
14

    
15
app = Flask(__name__)
16

    
17

    
18
@app.route('/')
19
def index():
20
    return redirect("/static/index.html")
21

    
22

    
23
@app.route('/api/certificates', methods=["POST"])
24
def create_certificate(certificate_controller: CertController):
25
    return certificate_controller.create_certificate()
26

    
27

    
28
@app.route('/api/certificates', methods=["GET"])
29
def get_cert_list(certificate_controller: CertController):
30
    return certificate_controller.get_certificate_list()
31

    
32

    
33
@app.route('/api/certificates/<id>', methods=["GET"])
34
def get_cert(id, certificate_controller: CertController):
35
    return certificate_controller.get_certificate_by_id(id)
36

    
37

    
38
@app.route('/api/certificates/<id>', methods=["PATCH"])
39
def set_certificate_status(id, certificate_controller: CertController):
40
    return certificate_controller.set_certificate_status(id)
41

    
42

    
43
@app.route('/api/certificates/<id>', methods=["DELETE"])
44
def delete_certificate(id, certificate_controller: CertController):
45
    return certificate_controller.delete_certificate(id)
46

    
47

    
48
@app.route('/api/certificates/<id>/details', methods=["GET"])
49
def get_cert_details(id, certificate_controller: CertController):
50
    return certificate_controller.get_certificate_details_by_id(id)
51

    
52

    
53
@app.route('/api/certificates/<id>/root', methods=["GET"])
54
def get_cert_root(id, certificate_controller: CertController):
55
    return certificate_controller.get_certificate_root_by_id(id)
56

    
57

    
58
@app.route('/api/certificates/<id>/chain', methods=["GET"])
59
def get_cert_chain(id, certificate_controller: CertController):
60
    return certificate_controller.get_certificate_trust_chain_by_id(id)
61

    
62

    
63
@app.route('/api/certificates/<id>/privatekey', methods=["GET"])
64
def get_private_key_of_a_certificate(id, certificate_controller: CertController):
65
    return certificate_controller.get_private_key_of_a_certificate(id)
66

    
67

    
68
@app.route('/api/certificates/<id>/publickey', methods=["GET"])
69
def get_public_key_of_a_certificate(id, certificate_controller: CertController):
70
    return certificate_controller.get_public_key_of_a_certificate(id)
71

    
72

    
73
@app.route('/api/crl/<id>', methods=["GET"])
74
def get_crl_of_issuer(id, crl_ocsp_controller: CrlOcspController):
75
    return crl_ocsp_controller.get_crl(id)
76

    
77

    
78
@app.route('/api/ocsp/<id>/<path:ocsp_request>', methods=["GET"])
79
def get_ocsp_of_issuer_get(id, ocsp_request, crl_ocsp_controller: CrlOcspController):
80
    return crl_ocsp_controller.get_ocsp_from_base64(id, ocsp_request)
81

    
82

    
83
@app.route('/api/ocsp/<id>', methods=["POST"])
84
def get_ocsp_of_issuer_post(id, crl_ocsp_controller: CrlOcspController):
85
    return crl_ocsp_controller.get_ocsp_from_der(id, request.data)
86

    
87

    
88
@app.route('/api/certificates/<id>/identity', methods=["POST"])
89
def generate_certificate_pkcs_identity(id, certificate_controller: CertController):
90
    return certificate_controller.generate_certificate_pkcs_identity(id)
91

    
92

    
93
@app.errorhandler(CryptographyException)
94
def cryptography_error(e, certificate_controller: CertController):
95
    return certificate_controller.handle_cryptography_error(e)
96

    
97

    
98
def initialize_app(application) -> bool:
99
    """
100
    Initializes the application
101
        -   configure dependency injection
102
        -   check whether OpenSSL is on the system
103
    :param application Flask Application to be initialized.
104
    :return: boolean flag indicating whether initialization was successful or not
105
    """
106
    modules = [configuration.configure_env_variable, ConnectionProvider]
107
    injector = Injector(modules)
108
    FlaskInjector(app=application, modules=modules)
109

    
110
    config = injector.get(Configuration)
111
    configuration.configure_logging(config)
112

    
113
    Logger.info(f"Using configuration file: {config.config_file}")
114

    
115
    # There's a little dependency on the CryptoService, which is not a pretty thing from
116
    # architectural point of view. However it is only a minimal piece of code and
117
    # it makes sense to do it in this way instead of trying to run openssl via subprocess here
118
    cryptography_service = injector.get(CryptographyService)
119
    try:
120
        # if version string is returned, OpenSSL is present on the system
121
        Logger.info(f"Using {cryptography_service.get_openssl_version()}")
122
        return True
123
    except CryptographyException:
124
        # If getting the version string throws an exception the OpenSSL is not available
125
        print("OpenSSL was not located on the system. Application will now exit.")
126
        Logger.error(f"OpenSSL was not located on the system. Application will now exit.")
127
        return False
128

    
129

    
130
# app initialization must follow endpoint declaration (after all Flask decoration)
131
with app.app_context():
132
    if not initialize_app(app):
133
        print("Failed to initialize app, aborting...")
134
        Logger.error(f"Failed to initialize app, aborting...")
135
        exit(-1)
136

    
137
if __name__ == '__main__':
138
    app_host = "0.0.0.0"
139
    app_port = 5000
140

    
141
    # TODO better load this from config.py
142
    if "FLASK_HOST" in os.environ:
143
        app_host = os.environ["FLASK_HOST"]
144

    
145
    if "FLASK_PORT" in os.environ:
146
        app_host = os.environ["FLASK_PORT"]
147

    
148
    app.run(host=app_host, port=app_port)
(7-7/12)