diff --git a/.dockerignore b/.dockerignore index f17cd43..9adfe04 100644 --- a/.dockerignore +++ b/.dockerignore @@ -11,4 +11,5 @@ update_db.py logs *.log .vscode -uploads/ \ No newline at end of file +uploads/ +instructions.txt \ No newline at end of file diff --git a/app.py b/app.py index a053b61..5ced1aa 100644 --- a/app.py +++ b/app.py @@ -5,16 +5,20 @@ from flask import ( request, url_for, send_from_directory, - flash + flash, + jsonify ) from utils import redirect, dbload, dbsave, udbload, udbsave from werkzeug.exceptions import RequestEntityTooLarge from werkzeug.utils import secure_filename +from werkzeug.middleware.proxy_fix import ProxyFix + import os import random import threading import time +import requests import logging import logging.handlers @@ -24,6 +28,7 @@ app = Flask('adrive', static_folder='static', template_folder='templates') app.config['UPLOAD_DIRECTORY'] = 'uploads/' app.config['MAX_CONTENT_LENGTH'] = 1000000 * 1024 * 1024 app.config['SECRET_KEY'] = str(random.randint(99999, 9999999)) +app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1) # Redirect logs to the file 'logs' handler = logging.handlers.RotatingFileHandler('logs', maxBytes=1024 * 1024) @@ -32,6 +37,45 @@ logging.getLogger('werkzeug').addHandler(handler) app.logger.setLevel(logging.WARNING) app.logger.addHandler(handler) +@app.route('/get-location') +def get_location(): + # 1. Try to get the forwarded IP first (for Docker/Production) + user_ip = request.headers.get('X-Forwarded-For', request.remote_addr) + + # 2. If it's a list (e.g. "1.2.3.4, 172.17.0.1"), take the first one + if user_ip and ',' in user_ip: + user_ip = user_ip.split(',')[0].strip() + + # 3. Clean up any weird local addresses + if user_ip in ['127.0.0.1', 'localhost', '::1'] or user_ip.startswith('172.'): + # Fallback for testing only + return jsonify({"status": "success", "city": "Seoul", "country": "South Korea", "isp": "Test ISP"}) + + try: + # Use HTTPS to be safer + response = requests.get(f'https://ipapi.co/{user_ip}/json/', timeout=5) + data = response.json() + return jsonify({ + "status": "success", + "city": data.get('city', 'Unknown'), + "country": data.get('country_name', 'Unknown'), + "isp": data.get('org', 'Unknown ISP') + }) + except Exception as e: + return jsonify({"status": "fail", "error": str(e)}), 500 + +@app.route('/check-ip') +def check_ip(): + return { + "remote_addr": request.remote_addr, + "x_forwarded_for": request.headers.get('X-Forwarded-For'), + "actual_ip_used": request.headers.get('X-Forwarded-For', request.remote_addr) + } + +@app.route('/ping') +def ping(): + return jsonify({"status": "ok"}) + @app.route('/') def index(): return redirect(url_for('upload')) diff --git a/requirements.txt b/requirements.txt index 2077213..0d75b8d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,3 @@ -Flask \ No newline at end of file +Flask +requests +werkzeug \ No newline at end of file diff --git a/static/script.js b/static/script.js index caef571..acfd8cc 100644 --- a/static/script.js +++ b/static/script.js @@ -1,17 +1,4 @@ -if (localStorage.getItem("loaded")) { - document.getElementById("mirrorLogo").className = "fa-solid fa-circle-dot fa-2xs"; - document.getElementById("mirrorText").textContent = "drive.fybe.dev"; - document.getElementById("mirrorLogo").style.color = "#47cc00"; -} else { - setTimeout(() => { - document.getElementById("mirrorLogo").style.color = "#47cc00"; - document.getElementById("mirrorText").textContent = "drive.fybe.dev"; - setTimeout(() => { - document.getElementById("mirrorLogo").className = "fa-solid fa-circle-dot fa-2xs"; - localStorage.setItem("loaded", true); - }, 3000); - }, 3000); -} + document.addEventListener('DOMContentLoaded', function() { const form = document.getElementById('uploadForm'); diff --git a/static/styles.css b/static/styles.css index 6efaaf4..c18f1d3 100644 --- a/static/styles.css +++ b/static/styles.css @@ -1,6 +1,6 @@ :root { --black: #000000; - --almost-black: #080708; + --almostBlack: #888888; --blue: #3772FF; --blue-light: #3787ff; --red: #DF2935; @@ -19,9 +19,8 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; font-size: 22px; line-height: 1.5; - color: var(--white); - background: var(--black); - background-image: linear-gradient(to bottom right, var(--almost-black), var(--black)); + color: var(--black); + background: var(--white); display: flex; flex-direction: column; justify-content: center; @@ -37,14 +36,16 @@ body,html { align-items: flex-start; width: 80%; border: 1px solid rgb(40, 40, 40); + border-radius: 8px; padding-bottom: 40px; padding: 50px; + color: var(--black) !important; } .form-section { padding: 15px 0 0 15px; width: 100%; - color: var(--light); + color: var(--black); flex-shrink: 0; } @@ -167,57 +168,16 @@ button[type='button']:hover, .dashboard-container { padding: 15px 15px 15px 15px; width: 100%; - color: var(--light); + color: var(--black); flex-shrink: 0; } -/* Table Styling */ + +/* Bootstrap-Friendly Table Design */ table { - width: 100%; - border-collapse: collapse; - margin: 20px 0; - background: rgba(20, 20, 20, 0.8); - border: 1px solid rgb(60, 60, 60); - border-radius: 6px; - overflow: hidden; - font-size: 16px; + font-size: 15px; } - -table th { - background: linear-gradient(to bottom, rgb(50, 50, 50), rgb(40, 40, 40)); - padding: 14px 16px; - text-align: left; - font-weight: 600; - color: var(--white); - border-bottom: 2px solid rgb(80, 80, 80); - text-transform: uppercase; - letter-spacing: 0.5px; - font-size: 13px; -} - -table td { - padding: 12px 16px; - border-bottom: 1px solid rgb(40, 40, 40); - color: var(--light); -} - -table tr:last-child td { - border-bottom: none; -} - -table tr:hover { - background: rgba(55, 114, 255, 0.08); -} - -table a { - color: var(--blue); - text-decoration: none; - font-weight: 500; - transition: color 0.2s ease; -} - -table a:hover { - color: var(--blue-light); - text-decoration: underline; +table tr td { + font-weight: light; } /* Styled select for forms */ @@ -279,6 +239,7 @@ select.fancy-select::-ms-expand { .quota-block { margin: 8px 0 18px; flex: 0 0 auto; + color: var(--almostBlack) !important; } .quota-donut { position: relative; @@ -293,7 +254,8 @@ select.fancy-select::-ms-expand { height: 100%; } .donut-ring { - stroke: rgba(255,255,255,0.06); + stroke: rgba(9, 9, 9, 0.1); + /* fill: black; */ stroke-linecap: round; vector-effect: non-scaling-stroke; shape-rendering: geometricPrecision; @@ -315,7 +277,7 @@ select.fancy-select::-ms-expand { align-items: center; justify-content: center; pointer-events: none; - color: var(--white); + color: var(--almostBlack); } .quota-percent { font-size: 18px; @@ -325,7 +287,7 @@ select.fancy-select::-ms-expand { .quota-number { font-size: 12px; font-weight: 700; - color: var(--light); + color: var(--almostBlack); } .quota-label { font-size: 11px; diff --git a/templates/dashboard.html b/templates/dashboard.html index f1db80d..3855aea 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -6,6 +6,7 @@ ADrive Share + @@ -76,7 +77,7 @@ - +
@@ -97,9 +98,7 @@ {% endif %} {% endfor %} diff --git a/templates/upload.html b/templates/upload.html index 0a092c1..f41b7fa 100644 --- a/templates/upload.html +++ b/templates/upload.html @@ -41,18 +41,18 @@ {% if loggedIn %}

ADrive File Sharing {{ username }}

{% else %} -

ADrive File Sharing Guest

+

ADrive File Sharing Guest

{% endif %} - - + - Finding Nearby Mirror Ping: CONNECTINGms - - - --> + + - Location Not Found + Locating... ..ms @@ -63,7 +63,7 @@
- @@ -177,6 +177,73 @@ })(); + + +
Filename Code - {% if file.reusable %} Delete - {% endif %}