-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
76 lines (55 loc) · 2.5 KB
/
app.py
File metadata and controls
76 lines (55 loc) · 2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import base64
from datetime import timedelta
import os
from flask import Flask, session
from flask_login import LoginManager
import src.config_manager as config_manager
from src.file_mgmt.content_managers import BackBlazeContentManager
import src.file_mgmt.datastore as file_datastore
import src.user_mgmt.authentication as authentication
import src.user_mgmt.datastore as user_datastore
from src.user_mgmt.model import UserManager
# Blueprints
import src.file_mgmt.blueprint as file_mgmt_blueprint
import src.user_mgmt.blueprint as user_mgmt_blueprint
class FileZapServer(Flask):
def __init__(self):
super(FileZapServer, self).__init__(__name__)
self._init_flask_app()
self._init_user_manager()
self._init_content_manager()
self._init_login_manager()
def _init_flask_app(self):
self.secret_key = os.urandom(64)
self.permanent_session_lifetime = timedelta(minutes=30)
self.before_request = self._make_session_permanent
self._register_blueprints()
def _make_session_permanent(self):
session.permanent = True
def _register_blueprints(self):
file_mgmt_blueprint.register_blueprint(self)
user_mgmt_blueprint.register_blueprint(self)
def _init_user_manager(self):
config = config_manager.get_config()
user_data_store = user_datastore.UserDataStore(config)
file_data_store = file_datastore.FileDataStore(config)
self.user_manager = UserManager(user_data_store, file_data_store)
def _init_content_manager(self):
# TODO (Future): Implement logic to use configurable content managers
self.content_manager = BackBlazeContentManager()
def _init_login_manager(self):
login_manager = LoginManager()
login_manager.user_callback = self.user_manager.get_user
login_manager.request_callback = self._load_user_from_request
login_manager.init_app(self)
login_manager.login_view = "/login"
def _load_user_from_request(self, request):
auth_string = request.headers.get('Authorization')
if auth_string:
base64_credentials = auth_string.replace('Basic ', '', 1)
credentials = base64.b64decode(base64_credentials).decode()
username, password = credentials.split(':')
user = self.user_manager.get_user(username)
if user and user.password_hash == authentication.hash_password(password, user.salt):
user.is_authenticated = True
return user