persist session secret across restarts
This commit is contained in:
+23
-1
@@ -17,6 +17,24 @@ WEEKDAY_NAMES = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Sam
|
|||||||
WEEKDAY_SHORT_NAMES = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
|
WEEKDAY_SHORT_NAMES = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
|
||||||
|
|
||||||
|
|
||||||
|
def load_secret_key(data_dir: Path) -> str:
|
||||||
|
env_secret = os.environ.get("NOURI_SECRET_KEY")
|
||||||
|
if env_secret:
|
||||||
|
return env_secret
|
||||||
|
|
||||||
|
secret_path = data_dir / ".secret_key"
|
||||||
|
if secret_path.exists():
|
||||||
|
return secret_path.read_text(encoding="utf-8").strip()
|
||||||
|
|
||||||
|
secret_value = secrets.token_hex(24)
|
||||||
|
try:
|
||||||
|
with secret_path.open("x", encoding="utf-8") as handle:
|
||||||
|
handle.write(secret_value)
|
||||||
|
except FileExistsError:
|
||||||
|
return secret_path.read_text(encoding="utf-8").strip()
|
||||||
|
return secret_value
|
||||||
|
|
||||||
|
|
||||||
def create_app() -> Flask:
|
def create_app() -> Flask:
|
||||||
root_dir = Path(__file__).resolve().parent.parent
|
root_dir = Path(__file__).resolve().parent.parent
|
||||||
data_dir = Path(os.environ.get("NOURI_DATA_DIR", root_dir / "data")).resolve()
|
data_dir = Path(os.environ.get("NOURI_DATA_DIR", root_dir / "data")).resolve()
|
||||||
@@ -28,12 +46,16 @@ def create_app() -> Flask:
|
|||||||
|
|
||||||
app = Flask(__name__, instance_relative_config=False)
|
app = Flask(__name__, instance_relative_config=False)
|
||||||
app.config.update(
|
app.config.update(
|
||||||
SECRET_KEY=os.environ.get("NOURI_SECRET_KEY", secrets.token_hex(24)),
|
# Persist the signing key inside the app's data directory so all
|
||||||
|
# gunicorn workers and future restarts agree on the same sessions.
|
||||||
|
SECRET_KEY=load_secret_key(data_dir),
|
||||||
DATABASE_PATH=str(db_path),
|
DATABASE_PATH=str(db_path),
|
||||||
DATA_DIR=str(data_dir),
|
DATA_DIR=str(data_dir),
|
||||||
UPLOAD_FOLDER=str(upload_dir),
|
UPLOAD_FOLDER=str(upload_dir),
|
||||||
MAX_CONTENT_LENGTH=int(os.environ.get("NOURI_MAX_UPLOAD_MB", "5")) * 1024 * 1024,
|
MAX_CONTENT_LENGTH=int(os.environ.get("NOURI_MAX_UPLOAD_MB", "5")) * 1024 * 1024,
|
||||||
PERMANENT_SESSION_LIFETIME=timedelta(days=30),
|
PERMANENT_SESSION_LIFETIME=timedelta(days=30),
|
||||||
|
SESSION_COOKIE_HTTPONLY=True,
|
||||||
|
SESSION_COOKIE_SAMESITE="Lax",
|
||||||
)
|
)
|
||||||
|
|
||||||
db.init_app(app)
|
db.init_app(app)
|
||||||
|
|||||||
Reference in New Issue
Block a user