Projekt

Obecné

Profil

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

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

    
7
from src.config import configuration
8
from src.config.connection_provider import ConnectionProvider
9
from src.controllers.certificates_controller import CertController
10
from src.services.cryptography import CryptographyService, CryptographyException
11

    
12
app = Flask(__name__)
13

    
14

    
15
@app.route('/')
16
def index():
17
    return redirect("/static/index.html")
18

    
19

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

    
24

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

    
29

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

    
34

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

    
39

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

    
44

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

    
49

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

    
54

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

    
59

    
60
@app.route('/api/certificates/<id>/private_key', methods=["GET"])
61
def get_private_key_of_a_certificate(id, certificate_controller: CertController):
62
    return certificate_controller.get_private_key_of_a_certificate(id)
63

    
64

    
65
@app.route('/api/certificates/<id>/public_key', methods=["GET"])
66
def get_public_key_of_a_certificate(id, certificate_controller: CertController):
67
    return certificate_controller.get_public_key_of_a_certificate(id)
68

    
69

    
70
def initialize_app(application) -> bool:
71
    """
72
    Initializes the application
73
        -   configure dependency injection
74
        -   check whether OpenSSL is on the system
75
    :param application Flask Application to be initialized.
76
    :return: boolean flag indicating whether initialization was successful or not
77
    """
78

    
79
    modules = [configuration.configure_env_variable, ConnectionProvider]
80
    injector = Injector(modules)
81
    FlaskInjector(app=application, modules=modules)
82

    
83
    # There's a little dependency on the CryptoService, which is not a pretty thing from
84
    # architectural point of view. However it is only a minimal piece of code and
85
    # it makes sense to do it in this way instead of trying to run openssl via subprocess here
86
    cryptography_service = injector.get(CryptographyService)
87
    try:
88
        # if version string is returned, OpenSSL is present on the system
89
        print(f"Using {cryptography_service.get_openssl_version()}")
90
        # TODO log the version instead of prining it out
91
        return True
92
    except CryptographyException:
93
        # If getting the version string throws an exception the OpenSSL is not available
94
        print("OpenSSL was not located on the system. Application will now exit.")
95
        # TODO add logging here
96
        return False
97

    
98

    
99
# app initialization must follow endpoint declaration (after all Flask decoration)
100
with app.app_context():
101
    if not initialize_app(app):
102
        # TODO log this
103
        print("Failed to initialize app, aborting...")
104
        exit(-1)
105

    
106
if __name__ == '__main__':
107
    app_host = "0.0.0.0"
108
    app_port = 5000
109

    
110
    # TODO better load this from config.py
111
    if "FLASK_HOST" in os.environ:
112
        app_host = os.environ["FLASK_HOST"]
113

    
114
    if "FLASK_PORT" in os.environ:
115
        app_host = os.environ["FLASK_PORT"]
116

    
117
    app.run(host=app_host, port=app_port)
(6-6/11)