Skip to content

Commit 6139b0e

Browse files
Fixed major bugs that didn't allow things
1 parent 4742f8b commit 6139b0e

File tree

14 files changed

+36
-304
lines changed

14 files changed

+36
-304
lines changed

api/admin.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,8 +644,6 @@ def api_admin_sql():
644644
except Exception as e:
645645
print(f"Error executing SQL query: {e}")
646646
return jsonify({"error": f"Query failed: {str(e)}"}), 500
647-
finally:
648-
sync_admin_wallet()
649647

650648
@app.route('/api/admin/delete-record', methods=['POST'])
651649
@admin_required

api/get.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from bank_lib.database import execute_query_dict, check_db_connection
44
from bank_lib.decorator import admin_required, login_required
55
from bank_lib.get_data import get_settings, get_total_currency, get_server_health, get_user_by_wallet_name
6-
from bank_lib.validate import validate_wallet_name
76

87

98
def register_get_api_routes(app):
@@ -17,9 +16,6 @@ def api_server_health():
1716
def api_get_wallet():
1817
wallet_name = request.args.get('wallet_name')
1918

20-
if not validate_wallet_name(wallet_name):
21-
return jsonify({"error": "Invalid wallet name format"}), 400
22-
2319
# Get user
2420
user = get_user_by_wallet_name(wallet_name)
2521

api/requests.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from bank_lib.form_validators import ResetPasswordForm
1010
from bank_lib.get_data import get_settings, get_client_ip, get_user_by_wallet_name
1111
from bank_lib.log_module import create_log
12-
from bank_lib.validate import validate_wallet_name
1312

1413

1514
def register_request_api_routes(app):
@@ -22,9 +21,6 @@ def api_request_wallet():
2221
reason = data.get('reason')
2322
FORBIDDEN_REASON_CHARS = re.compile(r"[|\'\"`;]")
2423

25-
if not validate_wallet_name(wallet_name):
26-
return jsonify({"error": "Wallet name can only contain letters, numbers, and underscores"}), 400
27-
2824
if not password or len(password) < 8:
2925
return jsonify({"error": "Password must be at least 8 characters long"}), 400
3026

api/transfer.py

Lines changed: 3 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -1,131 +1,16 @@
11
import uuid
22

3-
from flask import jsonify, request, session
3+
from flask import jsonify, request
44

55
from bank_lib.database import execute_query
6-
from bank_lib.decorator import admin_required, login_required
7-
from bank_lib.form_validators import TransferForm, BankTransferForm
6+
from bank_lib.decorator import admin_required
7+
from bank_lib.form_validators import BankTransferForm
88
from bank_lib.get_data import get_settings, get_client_ip, get_total_currency, get_user_by_wallet_name, \
99
update_admin_balance
1010
from bank_lib.log_module import create_log
1111

1212

1313
def register_transfer_api_routes(app):
14-
@app.route('/api/transfer/toWallet', methods=['POST'])
15-
@login_required
16-
def api_transfer_to_wallet():
17-
data = request.json
18-
form = TransferForm(data=data)
19-
20-
if not form.validate():
21-
errors = {field: errors[0] for field, errors in form.errors.items()}
22-
return jsonify(
23-
{"error": errors.get(next(iter(errors), "error"), "Validation failed"), "details": errors}), 400
24-
25-
from_wallet = session['wallet_name']
26-
to_wallet = data.get('to_wallet')
27-
category = data.get('category')
28-
reason = data.get('reason')
29-
amount = float(data.get('amount', 0))
30-
31-
# Additional validation
32-
if from_wallet == to_wallet:
33-
return jsonify({"error": "Cannot transfer to your own wallet"}), 400
34-
35-
# Get users
36-
from_user = get_user_by_wallet_name(from_wallet)
37-
to_user = get_user_by_wallet_name(to_wallet)
38-
39-
if not to_user:
40-
return jsonify({"error": "Recipient wallet not found"}), 404
41-
42-
if from_user['is_frozen']:
43-
return jsonify({"error": "Your wallet is frozen"}), 403
44-
45-
if to_user['is_frozen']:
46-
return jsonify({"error": "Recipient wallet is frozen"}), 403
47-
48-
settings = get_settings()
49-
50-
if from_user['current_currency'] < amount and not settings['allow_debts']:
51-
return jsonify({"error": "Insufficient funds and debts are not allowed"}), 400
52-
53-
# For Penalty or Invoice categories, create a request instead of direct transfer
54-
if category in ["Penalty", "Invoice"]:
55-
try:
56-
ticket_uuid = str(uuid.uuid4())
57-
58-
# Create request record
59-
execute_query(
60-
"""
61-
INSERT INTO requests
62-
(request_type, ticket_uuid, wallet_name, category, status, reason, ip_address)
63-
VALUES (%s, %s, %s, %s, %s, %s, %s)
64-
""",
65-
("Transfer", ticket_uuid, from_wallet, category, "Pending", reason, get_client_ip()),
66-
commit=True
67-
)
68-
69-
create_log("Transfer Request",
70-
f"{from_wallet} requested a transfer of {amount} {settings['currency_name']} to {to_wallet} for {category}: {reason}",
71-
"Private")
72-
73-
return jsonify({
74-
"message": "Transfer request submitted for approval",
75-
"transfer_ticket_uuid": ticket_uuid
76-
})
77-
except Exception as e:
78-
print(f"Error creating transfer request: {e}")
79-
return jsonify({"error": f"Transfer request failed: {str(e)}"}), 500
80-
else:
81-
try:
82-
# Update balances
83-
execute_query(
84-
"UPDATE users SET current_currency = current_currency - %s WHERE wallet_name = %s",
85-
(amount, from_wallet),
86-
commit=True
87-
)
88-
89-
execute_query(
90-
"UPDATE users SET current_currency = current_currency + %s WHERE wallet_name = %s",
91-
(amount, to_wallet),
92-
commit=True
93-
)
94-
95-
# Update admin balance
96-
update_admin_balance()
97-
98-
ticket_uuid = str(uuid.uuid4())
99-
100-
# Create request record
101-
execute_query(
102-
"""
103-
INSERT INTO requests
104-
(request_type, ticket_uuid, wallet_name, category, status, reason, ip_address)
105-
VALUES (%s, %s, %s, %s, %s, %s, %s)
106-
""",
107-
("Transfer", ticket_uuid, from_wallet, category, "Complete", reason, get_client_ip()),
108-
commit=True
109-
)
110-
111-
create_log("Transfer",
112-
f"{from_wallet} transferred {amount} {settings['currency_name']} to {to_wallet} for {category}: {reason} (transfer ticket uuid: {ticket_uuid})",
113-
"Private")
114-
115-
# Add public log for large transfers
116-
if amount >= 100:
117-
create_log("Large Transfer",
118-
f"User {from_wallet} transferred {amount} {settings['currency_name']} to {to_wallet}",
119-
"Global")
120-
121-
return jsonify({
122-
"message": "Transfer completed successfully",
123-
"transfer_ticket_uuid": ticket_uuid
124-
})
125-
except Exception as e:
126-
print(f"Error during transfer: {e}")
127-
return jsonify({"error": f"Transfer failed: {str(e)}"}), 500
128-
12914
# noinspection DuplicatedCode
13015
@app.route('/api/transfer/bank', methods=['POST'])
13116
@admin_required
@@ -145,7 +30,6 @@ def api_transfer_bank():
14530

14631
# Get user
14732
user = get_user_by_wallet_name(wallet_name)
148-
14933
if not user:
15034
return jsonify({"error": "Wallet not found"}), 404
15135

app.py

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
from flask_wtf.csrf import CSRFError
1212
from werkzeug.exceptions import BadRequest, HTTPException
1313
from werkzeug.security import check_password_hash
14-
from waitress import serve
1514

1615
from api import register_request_api_routes, register_get_api_routes, \
1716
register_setup_api_routes, register_transfer_api_routes, register_admin_api_routes
@@ -26,7 +25,6 @@
2625
from bank_lib.get_data import get_settings, get_total_currency, get_user_by_wallet_name
2726
from bank_lib.global_vars import DB_POOL
2827
from bank_lib.log_module import create_log, rotate_logs
29-
from bank_lib.validate import validate_wallet_name
3028

3129
# Set up logging once in your app setup code (if not already done)
3230
logging.basicConfig(
@@ -38,7 +36,7 @@
3836
)
3937

4038
# Configuration
41-
secret_key = os.environ.get("SECRET_KEY", None)
39+
secret_key = os.environ.get("SECRET_KEY", "yay")
4240
if secret_key is None:
4341
secret_key = secrets.token_hex(32)
4442
logging.warning("SECRET_KEY environment variable not set - Using random value")
@@ -186,14 +184,6 @@ def login():
186184
wallet_name = request.form.get('wallet_name')
187185
password = request.form.get('password')
188186

189-
# Input validation
190-
if not validate_wallet_name(wallet_name):
191-
return render_template('login.html', error="Invalid wallet name format",
192-
settings=settings,
193-
is_admin='admin' in session and session['admin'],
194-
is_logged_in='wallet_name' in session, loginForm=loginForm,
195-
requestWalletForm=requestWalletForm)
196-
197187
user = get_user_by_wallet_name(wallet_name)
198188

199189
if user and check_password_hash(user['password'], password):
@@ -237,9 +227,6 @@ def logout():
237227
def wallet_page(wallet_name):
238228
settings = get_settings()
239229

240-
if not validate_wallet_name(wallet_name):
241-
return render_template('error.html', message="Invalid wallet name format")
242-
243230
user = get_user_by_wallet_name(wallet_name)
244231

245232
if not user:
@@ -381,9 +368,6 @@ def admin_wallets_page():
381368
def admin_wallet_detail_page(wallet_name):
382369
settings = get_settings()
383370

384-
if not validate_wallet_name(wallet_name):
385-
return render_template('error.html', message="Invalid wallet name format")
386-
387371
user = get_user_by_wallet_name(wallet_name)
388372

389373
if not user:
@@ -514,4 +498,5 @@ def serve_static(filename):
514498
logging.warning("Database pool is not initialized due to the error.")
515499
finally:
516500
logging.info("Server Started!")
517-
serve(app, host='0.0.0.0', port=5000)
501+
app.run(debug=True)
502+
# serve(app, host='0.0.0.0', port=5000)

bank_lib/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@
66
update_admin_balance
77
from .global_vars import DB_POOL
88
from .log_module import create_log, rotate_logs
9-
from .validate import validate_wallet_name, validate_uuid, validate_amount
9+
from .validate import validate_uuid, validate_amount

bank_lib/form_validators.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ class WalletForm(FlaskForm):
2424
username = StringField('Username', [
2525
Length(min=3, max=100, message="Username must be between 3 and 100 characters"),
2626
DataRequired(message="Username is required"),
27-
Regexp(r'^[a-zA-Z0-9_]+$', message="Wallet name can only contain letters, numbers, and underscores")
2827
])
2928
password = PasswordField('Password', [
3029
Length(min=8, message="Password must be at least 8 characters long"),
@@ -48,7 +47,6 @@ class TransferForm(FlaskForm):
4847
to_wallet = StringField('To Wallet', [
4948
Length(min=3, max=100, message="Wallet name must be between 3 and 100 characters"),
5049
DataRequired(message="Wallet name is required"),
51-
Regexp(r'^[a-zA-Z0-9_]+$', message="Wallet name can only contain letters, numbers, and underscores")
5250
])
5351
amount = FloatField('Amount', [DataRequired(message="Amount is required")])
5452
category = SelectField('Category', [DataRequired(
@@ -98,7 +96,6 @@ class AdminActionForm(FlaskForm):
9896
wallet_name = StringField('Wallet Name', [
9997
Length(min=3, max=100, message="Wallet name must be between 3 and 100 characters"),
10098
DataRequired(message="Wallet name is required"),
101-
Regexp(r'^[a-zA-Z0-9_]+$', message="Wallet name can only contain letters, numbers, and underscores")
10299
])
103100
reason = TextAreaField('Reason', [
104101
Length(min=3, max=500, message="Reason must be between 3 and 500 characters"),
@@ -125,7 +122,6 @@ class BankTransferForm(FlaskForm):
125122
wallet_name = StringField('Wallet Name', [
126123
Length(min=3, max=100, message="Wallet name must be between 3 and 100 characters"),
127124
DataRequired(message="Wallet name is required"),
128-
Regexp(r'^[a-zA-Z0-9_]+$', message="Wallet name can only contain letters, numbers, and underscores")
129125
])
130126
amount = FloatField('Amount', [
131127
DataRequired(message="Amount is required")

bank_lib/get_data.py

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,16 @@ def get_settings():
3434

3535
# Get user info by the wallet name
3636
def get_user_by_wallet_name(wallet_name):
37-
"""Get user by wallet name"""
38-
if 'user_cache' not in g:
39-
g.user_cache = {}
40-
41-
if wallet_name not in g.user_cache:
42-
try:
43-
users = execute_query_dict(
44-
"SELECT * FROM users WHERE wallet_name = %s",
45-
(wallet_name,)
46-
)
47-
g.user_cache[wallet_name] = users[0] if users else None
48-
except Exception as e:
49-
print(f"Error getting user by wallet name: {e}")
50-
g.user_cache[wallet_name] = None
51-
52-
return g.user_cache[wallet_name]
37+
"""Always get user by wallet name directly from the database"""
38+
try:
39+
users = execute_query_dict(
40+
"SELECT * FROM users WHERE wallet_name = %s",
41+
(wallet_name,)
42+
)
43+
return users[0] if users else None
44+
except Exception as e:
45+
print(f"Error getting user by wallet name: {e}")
46+
return None
5347

5448

5549
# Get server health metrics

bank_lib/validate.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
1-
import re
21
import uuid
32

43

5-
def validate_wallet_name(wallet_name):
6-
"""Validate wallet name format"""
7-
if not wallet_name or not re.match(r'^[a-zA-Z0-9_]{3,100}$', wallet_name):
8-
return False
9-
return True
10-
11-
124
def validate_amount(amount):
135
"""Validate that amount is a positive number"""
146
try:

0 commit comments

Comments
 (0)