Add IP-based protection

This commit is contained in:
Scott Wallace 2021-12-28 15:15:08 +00:00
parent 58a94c365d
commit 026618b8d1
Signed by: scott
GPG key ID: AA742FDC5AFE2A72
2 changed files with 28 additions and 2 deletions

View file

@ -4,7 +4,7 @@ Main Flask-based app for Slinky
from flask import Flask, render_template from flask import Flask, render_template
from flask_bootstrap import Bootstrap from flask_bootstrap import Bootstrap
from slinky.web import slinky_webapp from slinky.web import protect, slinky_webapp
app = Flask(__name__) app = Flask(__name__)
app.register_blueprint(slinky_webapp) app.register_blueprint(slinky_webapp)
@ -13,6 +13,7 @@ Bootstrap(app)
@app.route('/') @app.route('/')
@protect
def index() -> str: def index() -> str:
""" """
Index/Landing page Index/Landing page

View file

@ -4,9 +4,11 @@ Web component
import logging import logging
from datetime import datetime from datetime import datetime
from functools import wraps
from typing import Any, Callable
import yaml import yaml
from flask import Blueprint, Response, redirect, render_template from flask import Blueprint, Response, redirect, render_template, request
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from wtforms import DateTimeLocalField, HiddenField, IntegerField, StringField from wtforms import DateTimeLocalField, HiddenField, IntegerField, StringField
from wtforms.validators import DataRequired, Length from wtforms.validators import DataRequired, Length
@ -67,6 +69,27 @@ class AddForm(FlaskForm): # type: ignore[misc]
) )
def protect(func: Callable[..., Response]) -> Callable[..., Response]:
"""
Decorator that will protect the admin interface
Args:
func (Callable): Wrapped function
Returns:
Callable: Function wrapper
"""
@wraps(func)
def check_ip(*args: Any, **kwargs: Any) -> Response:
if request.remote_addr not in cfg['allowed_ips']:
print(f'Protected URL access attempt from {request.remote_addr}')
return Response('Not found', 404)
return func(*args, **kwargs)
return check_ip
@slinky_webapp.route('/<path:path>') @slinky_webapp.route('/<path:path>')
def try_path_as_shortcode(path: str) -> Response: def try_path_as_shortcode(path: str) -> Response:
""" """
@ -95,6 +118,7 @@ def try_path_as_shortcode(path: str) -> Response:
@slinky_webapp.route('/_/add', methods=['GET', 'POST']) @slinky_webapp.route('/_/add', methods=['GET', 'POST'])
@protect
def add() -> Response: def add() -> Response:
""" """
Create and add a new shorturl Create and add a new shorturl
@ -130,6 +154,7 @@ def add() -> Response:
@slinky_webapp.route('/_/list', methods=['GET', 'POST']) @slinky_webapp.route('/_/list', methods=['GET', 'POST'])
@protect
def lister() -> str: def lister() -> str:
""" """
Create and add a new shorturl Create and add a new shorturl