Skip to content

Commit

Permalink
Merge pull request #2 from markski1/dev
Browse files Browse the repository at this point in the history
Admin panel, bugfixes
  • Loading branch information
markski1 committed Apr 2, 2024
2 parents 705e032 + a913707 commit 0da3a9d
Show file tree
Hide file tree
Showing 15 changed files with 383 additions and 82 deletions.
12 changes: 11 additions & 1 deletion .idea/b2-sharex-upload.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
werkzeug
flask
flask-login
python-dotenv
b2sdk
5 changes: 4 additions & 1 deletion src/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,7 @@ APP_DEBUG = True
URL_PATH = 'https://files.example.com/'
NAME_LENGTH = 4
CACHE_FOLDER = 'The path to the folder to be used for caching fresh files'
CACHE_MAX_SIZE_MB = 2048
CACHE_MAX_SIZE_MB = 2048

PANEL_ENABLED = 'true|false'
SECRET_KEY = "A long string (>32 length) of whatever characters."
70 changes: 8 additions & 62 deletions src/app.py
Original file line number Diff line number Diff line change
@@ -1,72 +1,18 @@
import os
from flask import Flask, send_file, request
from dotenv import load_dotenv
from werkzeug.utils import secure_filename
from core.config import app, app_host, app_port, app_debug, panel_enabled

from misc import generate_random_string
from b2connect import b2_file_upload, b2_file_exists, b2_cache_file
# Routes
import routes.file

load_dotenv()
from routes.panel import panel_bp

authkey = os.getenv('AUTH_KEY')
url_path = os.getenv('URL_PATH')
name_length = os.getenv('NAME_LENGTH')
cache_folder = os.getenv('CACHE_FOLDER')
app = Flask(__name__)
if panel_enabled:
app.register_blueprint(panel_bp)


@app.route("/")
def index():
return 'ok'


@app.post("/upload")
def upload_file():
key = request.form.get('key', None)
if not key or key != authkey:
return "Invalid upload key."

if 'fileupload' not in request.files:
return "No file provided."

file = request.files['fileupload']
filename = secure_filename(file.filename)

if '.' in filename:
filename = f"{generate_random_string(name_length)}.{filename.split('.')[1]}"
else:
return "Filename does not contain extension."

filepath = os.path.join(cache_folder, filename)

# Save to immediate cache
file.save(filepath)

# Upload file to B2
success = b2_file_upload(filepath)

if not success:
return "Error uploading file. Check console output for details."

return f"{url_path}{filename}"


@app.route("/<string:filename>")
def get_file(filename):
# Check local cache
filepath = os.path.join(cache_folder, filename)
if os.path.isfile(filepath):
return send_file(filepath)

# If not in cache, check B2
if b2_file_exists(filename):
filepath = b2_cache_file(filename)
if not filepath:
return "Error caching file. Check console output for details."
return send_file(filepath)

return "File does not exist."
return "BSXU is running."


if __name__ == "__main__":
app.run(host=os.getenv('APP_HOST'), port=os.getenv('APP_PORT'), debug=os.getenv('APP_DEBUG'))
app.run(host=app_host, port=app_port, debug=app_debug)
27 changes: 9 additions & 18 deletions src/b2connect.py → src/core/b2connect.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,13 @@
from b2sdk.exception import *
from b2sdk.v2 import *
import os
from dotenv import load_dotenv

load_dotenv()

cache_folder = os.getenv('CACHE_FOLDER')
os.makedirs(cache_folder, exist_ok=True)

b2_app_id = os.getenv('B2_KEY_ID')
b2_app_key = os.getenv('B2_APP_KEY')
from core.config import cache_folder, b2_app_id, b2_app_key, b2_bucket_name

info = InMemoryAccountInfo()
b2_api = B2Api(info)
b2_api.authorize_account("production", b2_app_id, b2_app_key)
b2_bucket = b2_api.get_bucket_by_name(os.getenv('B2_BUCKET_NAME'))
b2_bucket = b2_api.get_bucket_by_name(b2_bucket_name)


def b2_file_upload(filepath):
Expand All @@ -33,23 +26,21 @@ def b2_file_upload(filepath):
return False


def b2_file_exists(filename):
try:
b2_bucket.get_file_info_by_name(str(filename))
return True
except FileNotPresent:
return False


def b2_cache_file(filename):
filepath = os.path.join(cache_folder, filename)
filepath = str(os.path.join(cache_folder, filename))

try:
file_download = b2_bucket.download_file_by_name(file_name=filename)
file_download.save_to(filepath, 'wb')

return filepath

except FileNotPresent:
return False

except FileNotFoundError:
return False

except Exception as e:
print(f"Exception found when caching '{filename}': \n {e}")
return False
31 changes: 31 additions & 0 deletions src/core/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import os
from dotenv import load_dotenv
from flask import Flask
from core import session

load_dotenv()

authkey = os.getenv('AUTH_KEY')
url_path = os.getenv('URL_PATH')
name_length = os.getenv('NAME_LENGTH')

cache_folder = os.getenv('CACHE_FOLDER')
os.makedirs(cache_folder, exist_ok=True)

b2_app_id = os.getenv('B2_KEY_ID')
b2_app_key = os.getenv('B2_APP_KEY')
b2_bucket_name = os.getenv('B2_BUCKET_NAME')

app_host = os.getenv('APP_HOST')
app_port = os.getenv('APP_PORT')
app_debug = os.getenv('APP_DEBUG')

panel_enabled = os.getenv('PANEL_ENABLED') == 'true'

app = Flask(__name__,
static_folder="../webpanel/static",
template_folder="../webpanel/templates")

session.init_app(app)

app.config['SECRET_KEY'] = os.getenv('SECRET_KEY')
43 changes: 43 additions & 0 deletions src/core/session.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from flask_login import (
LoginManager,
UserMixin
)

from misc import generate_random_string

import os
from dotenv import load_dotenv

load_dotenv()

authkey = os.getenv('AUTH_KEY')
gen_token = ""


def init_app(app):
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.session_protection = "strong"

@login_manager.user_loader
def user_loader(load_id):
if load_id == gen_token:
user_model = Session()
user_model.id = load_id
return user_model

return None


def attempt_login(auth_key):
global gen_token
if auth_key == authkey:
gen_token = generate_random_string(32)
return gen_token

return None



class Session(UserMixin):
...
Empty file added src/core/stats.py
Empty file.
55 changes: 55 additions & 0 deletions src/routes/file.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import os

from core.config import authkey, name_length, cache_folder, url_path, app

from flask import send_file, request
from werkzeug.utils import secure_filename

from misc import generate_random_string
from core.b2connect import b2_file_upload, b2_cache_file


@app.post("/upload")
def upload_file():
key = request.form.get('key', None)
if not key or key != authkey:
return "Invalid upload key."

if 'fileupload' not in request.files:
return "No file provided."

file = request.files['fileupload']
filename = secure_filename(file.filename)

if '.' in filename:
filename = f"{generate_random_string(name_length)}.{filename.split('.')[1]}"
else:
return "Filename does not contain extension."

filepath = os.path.join(cache_folder, filename)

# Save to immediate cache
file.save(filepath)

# Upload file to B2
success = b2_file_upload(filepath)

if not success:
return "Error uploading file. Check console output for details."

return f"{url_path}{filename}"


@app.route("/<string:filename>")
def get_file(filename):
# Check local cache
filepath = str(os.path.join(cache_folder, filename))
if os.path.isfile(filepath):
return send_file(filepath)

# If not in cache, check B2
filepath = b2_cache_file(filename)
if filepath:
return send_file(filepath)

return "File does not exist."
Loading

0 comments on commit 0da3a9d

Please sign in to comment.