From 48a4316d667fca8387ee6a0b958cbb66e47b635c Mon Sep 17 00:00:00 2001 From: lelo Date: Sat, 22 Mar 2025 10:44:31 +0100 Subject: [PATCH] reorganize --- app.py | 152 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 76 insertions(+), 76 deletions(-) diff --git a/app.py b/app.py index 3ab5711..7fa2335 100755 --- a/app.py +++ b/app.py @@ -114,18 +114,6 @@ def get_cached_image(size): resized_img.save(img_byte_arr, format='PNG') return img_byte_arr.getvalue() -@app.route('/static/icons/.png') -def serve_resized_icon(size): - cached_image_bytes = get_cached_image(size) - return send_file( - io.BytesIO(cached_image_bytes), - mimetype='image/png' - ) - -@app.route('/sw.js') -def serve_sw(): - return send_from_directory(os.path.join(app.root_path, 'static'), 'sw.js', mimetype='application/javascript') - def list_directory_contents(directory, subpath): """ List only the immediate contents of the given directory. @@ -191,7 +179,6 @@ def list_directory_contents(directory, subpath): pass return directories, files - def generate_breadcrumbs(subpath=None): breadcrumbs = [{'name': 'Home', 'path': ''}] if subpath: @@ -202,6 +189,82 @@ def generate_breadcrumbs(subpath=None): breadcrumbs.append({'name': part, 'path': path_accum}) return breadcrumbs +def lookup_location(ip, reader): + try: + response = reader.city(ip) + country = response.country.name if response.country.name else "Unknown" + city = response.city.name if response.city.name else "Unknown" + return country, city + except Exception: + return "Unknown", "Unknown" + +def get_device_type(user_agent): + "classify device type based on user agent string" + if 'Android' in user_agent: + return 'Android' + elif 'iPhone' in user_agent or 'iPad' in user_agent: + return 'iOS' + elif 'Windows' in user_agent: + return 'Windows' + elif 'Macintosh' in user_agent or 'Mac OS' in user_agent: + return 'MacOS' + elif 'Linux' in user_agent: + return 'Linux' + else: + return 'Other' + +def shorten_referrer(url): + segments = [seg for seg in url.split('/') if seg] + segment = segments[-1] + # Decode all percent-encoded characters (like %20, %2F, etc.) + segment_decoded = unquote(segment) + return segment_decoded + +def log_file_access(full_path): + """ + Log file access details to a SQLite database. + Records the timestamp, full file path, client IP, user agent, and referrer. + """ + # Connect to the database (this will create the file if it doesn't exist) + conn = sqlite3.connect('access_log.db') + cursor = conn.cursor() + # Create the table if it doesn't exist + cursor.execute(''' + CREATE TABLE IF NOT EXISTS file_access_log ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + timestamp TEXT, + full_path TEXT, + ip_address TEXT, + user_agent TEXT, + referrer TEXT + ) + ''') + # Gather information from the request + timestamp = datetime.now().isoformat() + ip_address = request.remote_addr + user_agent = request.headers.get('User-Agent') + referrer = request.headers.get('Referer') + + # Insert the access record into the database + cursor.execute(''' + INSERT INTO file_access_log (timestamp, full_path, ip_address, user_agent, referrer) + VALUES (?, ?, ?, ?, ?) + ''', (timestamp, full_path, ip_address, user_agent, referrer)) + conn.commit() + conn.close() + +@app.route('/static/icons/.png') +def serve_resized_icon(size): + cached_image_bytes = get_cached_image(size) + return send_file( + io.BytesIO(cached_image_bytes), + mimetype='image/png' + ) + +@app.route('/sw.js') +def serve_sw(): + return send_from_directory(os.path.join(app.root_path, 'static'), 'sw.js', mimetype='application/javascript') + # API endpoint for AJAX: returns JSON for a given directory. @app.route('/api/path/', defaults={'subpath': ''}) @app.route('/api/path/') @@ -234,37 +297,6 @@ def api_browse(subpath): 'files': files }) -def lookup_location(ip, reader): - try: - response = reader.city(ip) - country = response.country.name if response.country.name else "Unknown" - city = response.city.name if response.city.name else "Unknown" - return country, city - except Exception: - return "Unknown", "Unknown" - -# Helper function to classify device type based on user agent string -def get_device_type(user_agent): - if 'Android' in user_agent: - return 'Android' - elif 'iPhone' in user_agent or 'iPad' in user_agent: - return 'iOS' - elif 'Windows' in user_agent: - return 'Windows' - elif 'Macintosh' in user_agent or 'Mac OS' in user_agent: - return 'MacOS' - elif 'Linux' in user_agent: - return 'Linux' - else: - return 'Other' - -def shorten_referrer(url): - segments = [seg for seg in url.split('/') if seg] - segment = segments[-1] - # Decode all percent-encoded characters (like %20, %2F, etc.) - segment_decoded = unquote(segment) - return segment_decoded - @app.route("/dashboard") @require_secret def dashboard(): @@ -394,38 +426,6 @@ def dashboard(): unique_files=unique_files, unique_ips=unique_ips) -def log_file_access(full_path): - """ - Log file access details to a SQLite database. - Records the timestamp, full file path, client IP, user agent, and referrer. - """ - # Connect to the database (this will create the file if it doesn't exist) - conn = sqlite3.connect('access_log.db') - cursor = conn.cursor() - # Create the table if it doesn't exist - cursor.execute(''' - CREATE TABLE IF NOT EXISTS file_access_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - timestamp TEXT, - full_path TEXT, - ip_address TEXT, - user_agent TEXT, - referrer TEXT - ) - ''') - # Gather information from the request - timestamp = datetime.now().isoformat() - ip_address = request.remote_addr - user_agent = request.headers.get('User-Agent') - referrer = request.headers.get('Referer') - - # Insert the access record into the database - cursor.execute(''' - INSERT INTO file_access_log (timestamp, full_path, ip_address, user_agent, referrer) - VALUES (?, ?, ?, ?, ?) - ''', (timestamp, full_path, ip_address, user_agent, referrer)) - conn.commit() - conn.close() @app.route("/media/") @require_secret