Нет описания

__init__.py 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. # IRIS Source Code
  2. # Copyright (C) 2021 - Airbus CyberSecurity (SAS)
  3. # ir@cyberactionlab.net
  4. #
  5. # This program is free software; you can redistribute it and/or
  6. # modify it under the terms of the GNU Lesser General Public
  7. # License as published by the Free Software Foundation; either
  8. # version 3 of the License, or (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. # Lesser General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU Lesser General Public License
  16. # along with this program; if not, write to the Free Software Foundation,
  17. # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. import collections
  19. import json
  20. import logging as logger
  21. import os
  22. import urllib.parse
  23. from flask import Flask
  24. from flask import session
  25. from flask_bcrypt import Bcrypt
  26. from flask_caching import Cache
  27. from flask_login import LoginManager
  28. from flask_marshmallow import Marshmallow
  29. from flask_socketio import SocketIO, Namespace
  30. from flask_sqlalchemy import SQLAlchemy
  31. from functools import partial
  32. from werkzeug.middleware.proxy_fix import ProxyFix
  33. from app.flask_dropzone import Dropzone
  34. from app.iris_engine.tasker.celery import make_celery
  35. from app.iris_engine.access_control.oidc_handler import get_oidc_client
  36. class ReverseProxied(object):
  37. def __init__(self, flask_app):
  38. self._app = flask_app
  39. def __call__(self, environ, start_response):
  40. scheme = environ.get('HTTP_X_FORWARDED_PROTO', None)
  41. if scheme is not None:
  42. environ['wsgi.url_scheme'] = scheme
  43. return self._app(environ, start_response)
  44. class AlertsNamespace(Namespace):
  45. pass
  46. APP_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  47. TEMPLATE_PATH = os.path.join(APP_PATH, 'templates/')
  48. # Grabs the folder where the script runs.
  49. basedir = os.path.abspath(os.path.dirname(__file__))
  50. LOG_FORMAT = '%(asctime)s :: %(levelname)s :: %(module)s :: %(funcName)s :: %(message)s'
  51. LOG_TIME_FORMAT = '%Y-%m-%d %H:%M:%S'
  52. logger.basicConfig(level=logger.INFO, format=LOG_FORMAT, datefmt=LOG_TIME_FORMAT)
  53. app = Flask(__name__, static_folder='../static')
  54. # CORS(app,
  55. # supports_credentials=True,
  56. # resources={r"/api/*": {"origins": ["http://127.0.0.1:5137", "http://localhost:5173"]}})
  57. def ac_current_user_has_permission(*permissions):
  58. """
  59. Return True if current user has permission
  60. """
  61. for permission in permissions:
  62. if ('permissions' in session and
  63. session['permissions'] & permission.value == permission.value):
  64. return True
  65. return False
  66. def ac_current_user_has_manage_perms():
  67. if session['permissions'] != 1 and session['permissions'] & 0x1FFFFF0 != 0:
  68. return True
  69. return False
  70. app.jinja_env.filters['unquote'] = lambda u: urllib.parse.unquote(u)
  71. app.jinja_env.filters['tojsonsafe'] = lambda u: json.dumps(u, indent=4, ensure_ascii=False)
  72. app.jinja_env.filters['tojsonindent'] = lambda u: json.dumps(u, indent=4)
  73. app.jinja_env.filters['escape_dots'] = lambda u: u.replace('.', '[.]')
  74. app.jinja_env.globals.update(user_has_perm=ac_current_user_has_permission)
  75. app.jinja_env.globals.update(user_has_manage_perms=ac_current_user_has_manage_perms)
  76. app.jinja_options["autoescape"] = lambda _: True
  77. app.jinja_env.autoescape = True
  78. app.config.from_object('app.configuration.Config')
  79. app.config.update(
  80. SESSION_COOKIE_SECURE=True,
  81. SESSION_COOKIE_HTTPONLY=True,
  82. SESSION_COOKIE_SAMESITE='Lax',
  83. SOC_INTEGRATOR_URL=os.getenv('SOC_INTEGRATOR_URL', 'http://soc-integrator:8080'),
  84. )
  85. cache = Cache(app)
  86. SQLALCHEMY_ENGINE_OPTIONS = {
  87. "json_deserializer": partial(json.loads, object_pairs_hook=collections.OrderedDict),
  88. "pool_pre_ping": True
  89. }
  90. db = SQLAlchemy(app, engine_options=SQLALCHEMY_ENGINE_OPTIONS) # flask-sqlalchemy
  91. bc = Bcrypt(app) # flask-bcrypt
  92. lm = LoginManager() # flask-loginmanager
  93. lm.init_app(app) # init the login manager
  94. ma = Marshmallow(app) # Init marshmallow
  95. dropzone = Dropzone(app)
  96. celery = make_celery(app)
  97. # store = HttpExposedFileSystemStore(
  98. # path='images',
  99. # prefix='/static/assets/images/'
  100. # )
  101. app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1)
  102. #app.wsgi_app = store.wsgi_middleware(app.wsgi_app)
  103. socket_io = SocketIO(app, cors_allowed_origins="*")
  104. alerts_namespace = AlertsNamespace('/alerts')
  105. socket_io.on_namespace(alerts_namespace)
  106. oidc_client = None
  107. if app.config.get('AUTHENTICATION_TYPE') == "oidc":
  108. oidc_client = get_oidc_client(app)
  109. @app.teardown_appcontext
  110. def shutdown_session(exception=None):
  111. db.session.remove()
  112. @app.after_request
  113. def after_request(response):
  114. response.headers.add('Access-Control-Allow-Origin', '*')
  115. response.headers.add('Access-Control-Allow-Credentials', 'true')
  116. response.headers.add('Access-Control-Allow-Headers', 'Content-Type, Authorization')
  117. response.headers.add('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
  118. return response
  119. from app.views import register_blusprints
  120. from app.views import load_user
  121. from app.views import load_user_from_request
  122. register_blusprints(app)
  123. from app.post_init import run_post_init
  124. try:
  125. run_post_init(development=app.config['DEVELOPMENT'])
  126. except Exception as e:
  127. app.logger.exception('Post init failed. IRIS not started')
  128. raise e
  129. lm.user_loader(load_user)
  130. lm.request_loader(load_user_from_request)