remove internal network check
This commit is contained in:
@@ -60,10 +60,4 @@ volumes:
|
|||||||
|
|
||||||
networks:
|
networks:
|
||||||
public_network:
|
public_network:
|
||||||
name: docupulse_public
|
name: docupulse_public
|
||||||
internal_network:
|
|
||||||
name: docupulse_internal
|
|
||||||
internal: true # This network is not accessible from outside Docker
|
|
||||||
ipam:
|
|
||||||
config:
|
|
||||||
- subnet: 10.42.0.0/16 # Less commonly used subnet
|
|
||||||
@@ -10,7 +10,6 @@ import os
|
|||||||
import jwt
|
import jwt
|
||||||
from werkzeug.security import generate_password_hash
|
from werkzeug.security import generate_password_hash
|
||||||
import secrets
|
import secrets
|
||||||
import ipaddress
|
|
||||||
|
|
||||||
admin_api = Blueprint('admin_api', __name__)
|
admin_api = Blueprint('admin_api', __name__)
|
||||||
|
|
||||||
@@ -39,30 +38,6 @@ def token_required(f):
|
|||||||
return f(current_user, *args, **kwargs)
|
return f(current_user, *args, **kwargs)
|
||||||
return decorated
|
return decorated
|
||||||
|
|
||||||
def docker_network_required(f):
|
|
||||||
@wraps(f)
|
|
||||||
def decorated(*args, **kwargs):
|
|
||||||
# Get the client IP address
|
|
||||||
client_ip = request.remote_addr
|
|
||||||
|
|
||||||
# Docker internal network range
|
|
||||||
docker_networks = [
|
|
||||||
'10.42.0.0/16' # Our custom internal network
|
|
||||||
]
|
|
||||||
|
|
||||||
# Check if the client IP is in our internal network
|
|
||||||
is_docker_network = False
|
|
||||||
for network in docker_networks:
|
|
||||||
if ipaddress.ip_address(client_ip) in ipaddress.ip_network(network):
|
|
||||||
is_docker_network = True
|
|
||||||
break
|
|
||||||
|
|
||||||
if not is_docker_network:
|
|
||||||
return jsonify({'message': 'Access denied. This API is only accessible from the internal Docker network.'}), 403
|
|
||||||
|
|
||||||
return f(*args, **kwargs)
|
|
||||||
return decorated
|
|
||||||
|
|
||||||
def generate_management_api_key():
|
def generate_management_api_key():
|
||||||
"""Generate a secure API key for the management tool"""
|
"""Generate a secure API key for the management tool"""
|
||||||
return secrets.token_urlsafe(32)
|
return secrets.token_urlsafe(32)
|
||||||
@@ -77,7 +52,6 @@ def validate_management_api_key(api_key):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
@admin_api.route('/login', methods=['POST'])
|
@admin_api.route('/login', methods=['POST'])
|
||||||
@docker_network_required
|
|
||||||
def admin_login():
|
def admin_login():
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
if not data or 'email' not in data or 'password' not in data:
|
if not data or 'email' not in data or 'password' not in data:
|
||||||
@@ -91,7 +65,6 @@ def admin_login():
|
|||||||
return jsonify({'token': token})
|
return jsonify({'token': token})
|
||||||
|
|
||||||
@admin_api.route('/management-token', methods=['POST'])
|
@admin_api.route('/management-token', methods=['POST'])
|
||||||
@docker_network_required
|
|
||||||
def get_management_token():
|
def get_management_token():
|
||||||
"""Generate a JWT token for the management tool using API key authentication"""
|
"""Generate a JWT token for the management tool using API key authentication"""
|
||||||
api_key = request.headers.get('X-API-Key')
|
api_key = request.headers.get('X-API-Key')
|
||||||
@@ -110,7 +83,6 @@ def get_management_token():
|
|||||||
|
|
||||||
@admin_api.route('/management-api-key', methods=['POST'])
|
@admin_api.route('/management-api-key', methods=['POST'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def create_management_api_key(current_user):
|
def create_management_api_key(current_user):
|
||||||
"""Create a new API key for the management tool (only accessible by admin users)"""
|
"""Create a new API key for the management tool (only accessible by admin users)"""
|
||||||
if not current_user.is_admin:
|
if not current_user.is_admin:
|
||||||
@@ -138,7 +110,6 @@ def create_management_api_key(current_user):
|
|||||||
|
|
||||||
@admin_api.route('/management-api-keys', methods=['GET'])
|
@admin_api.route('/management-api-keys', methods=['GET'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def list_management_api_keys(current_user):
|
def list_management_api_keys(current_user):
|
||||||
"""List all management API keys (only accessible by admin users)"""
|
"""List all management API keys (only accessible by admin users)"""
|
||||||
if not current_user.is_admin:
|
if not current_user.is_admin:
|
||||||
@@ -156,7 +127,6 @@ def list_management_api_keys(current_user):
|
|||||||
|
|
||||||
@admin_api.route('/management-api-key/<int:key_id>', methods=['DELETE'])
|
@admin_api.route('/management-api-key/<int:key_id>', methods=['DELETE'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def revoke_management_api_key(current_user, key_id):
|
def revoke_management_api_key(current_user, key_id):
|
||||||
"""Revoke a management API key (only accessible by admin users)"""
|
"""Revoke a management API key (only accessible by admin users)"""
|
||||||
if not current_user.is_admin:
|
if not current_user.is_admin:
|
||||||
@@ -173,14 +143,12 @@ def revoke_management_api_key(current_user, key_id):
|
|||||||
# Key-Value Settings CRUD
|
# Key-Value Settings CRUD
|
||||||
@admin_api.route('/key-value', methods=['GET'])
|
@admin_api.route('/key-value', methods=['GET'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def get_key_values(current_user):
|
def get_key_values(current_user):
|
||||||
settings = KeyValueSettings.query.all()
|
settings = KeyValueSettings.query.all()
|
||||||
return jsonify([{'key': s.key, 'value': s.value} for s in settings])
|
return jsonify([{'key': s.key, 'value': s.value} for s in settings])
|
||||||
|
|
||||||
@admin_api.route('/key-value/<key>', methods=['GET'])
|
@admin_api.route('/key-value/<key>', methods=['GET'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def get_key_value(current_user, key):
|
def get_key_value(current_user, key):
|
||||||
setting = KeyValueSettings.query.filter_by(key=key).first()
|
setting = KeyValueSettings.query.filter_by(key=key).first()
|
||||||
if not setting:
|
if not setting:
|
||||||
@@ -189,7 +157,6 @@ def get_key_value(current_user, key):
|
|||||||
|
|
||||||
@admin_api.route('/key-value', methods=['POST'])
|
@admin_api.route('/key-value', methods=['POST'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def create_key_value(current_user):
|
def create_key_value(current_user):
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
if not data or 'key' not in data or 'value' not in data:
|
if not data or 'key' not in data or 'value' not in data:
|
||||||
@@ -202,7 +169,6 @@ def create_key_value(current_user):
|
|||||||
|
|
||||||
@admin_api.route('/key-value/<key>', methods=['PUT'])
|
@admin_api.route('/key-value/<key>', methods=['PUT'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def update_key_value(current_user, key):
|
def update_key_value(current_user, key):
|
||||||
setting = KeyValueSettings.query.filter_by(key=key).first()
|
setting = KeyValueSettings.query.filter_by(key=key).first()
|
||||||
if not setting:
|
if not setting:
|
||||||
@@ -218,7 +184,6 @@ def update_key_value(current_user, key):
|
|||||||
|
|
||||||
@admin_api.route('/key-value/<key>', methods=['DELETE'])
|
@admin_api.route('/key-value/<key>', methods=['DELETE'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def delete_key_value(current_user, key):
|
def delete_key_value(current_user, key):
|
||||||
setting = KeyValueSettings.query.filter_by(key=key).first()
|
setting = KeyValueSettings.query.filter_by(key=key).first()
|
||||||
if not setting:
|
if not setting:
|
||||||
@@ -231,7 +196,6 @@ def delete_key_value(current_user, key):
|
|||||||
# Contacts (Users) CRUD
|
# Contacts (Users) CRUD
|
||||||
@admin_api.route('/contacts', methods=['GET'])
|
@admin_api.route('/contacts', methods=['GET'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def get_contacts(current_user):
|
def get_contacts(current_user):
|
||||||
users = User.query.all()
|
users = User.query.all()
|
||||||
return jsonify([{
|
return jsonify([{
|
||||||
@@ -248,7 +212,6 @@ def get_contacts(current_user):
|
|||||||
|
|
||||||
@admin_api.route('/contacts/<int:user_id>', methods=['GET'])
|
@admin_api.route('/contacts/<int:user_id>', methods=['GET'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def get_contact(current_user, user_id):
|
def get_contact(current_user, user_id):
|
||||||
user = User.query.get(user_id)
|
user = User.query.get(user_id)
|
||||||
if not user:
|
if not user:
|
||||||
@@ -267,7 +230,6 @@ def get_contact(current_user, user_id):
|
|||||||
|
|
||||||
@admin_api.route('/contacts', methods=['POST'])
|
@admin_api.route('/contacts', methods=['POST'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def create_contact(current_user):
|
def create_contact(current_user):
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
required_fields = ['username', 'email', 'last_name']
|
required_fields = ['username', 'email', 'last_name']
|
||||||
@@ -293,7 +255,6 @@ def create_contact(current_user):
|
|||||||
|
|
||||||
@admin_api.route('/contacts/<int:user_id>', methods=['PUT'])
|
@admin_api.route('/contacts/<int:user_id>', methods=['PUT'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def update_contact(current_user, user_id):
|
def update_contact(current_user, user_id):
|
||||||
user = User.query.get(user_id)
|
user = User.query.get(user_id)
|
||||||
if not user:
|
if not user:
|
||||||
@@ -320,7 +281,6 @@ def update_contact(current_user, user_id):
|
|||||||
|
|
||||||
@admin_api.route('/contacts/<int:user_id>', methods=['DELETE'])
|
@admin_api.route('/contacts/<int:user_id>', methods=['DELETE'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def delete_contact(current_user, user_id):
|
def delete_contact(current_user, user_id):
|
||||||
user = User.query.get(user_id)
|
user = User.query.get(user_id)
|
||||||
if not user:
|
if not user:
|
||||||
@@ -333,7 +293,6 @@ def delete_contact(current_user, user_id):
|
|||||||
# Statistics
|
# Statistics
|
||||||
@admin_api.route('/statistics', methods=['GET'])
|
@admin_api.route('/statistics', methods=['GET'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def get_statistics(current_user):
|
def get_statistics(current_user):
|
||||||
room_count = Room.query.count()
|
room_count = Room.query.count()
|
||||||
conversation_count = Conversation.query.count()
|
conversation_count = Conversation.query.count()
|
||||||
@@ -353,7 +312,6 @@ def get_statistics(current_user):
|
|||||||
# Website Settings CRUD
|
# Website Settings CRUD
|
||||||
@admin_api.route('/settings', methods=['GET'])
|
@admin_api.route('/settings', methods=['GET'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def get_settings(current_user):
|
def get_settings(current_user):
|
||||||
settings = SiteSettings.get_settings()
|
settings = SiteSettings.get_settings()
|
||||||
return jsonify({
|
return jsonify({
|
||||||
@@ -375,7 +333,6 @@ def get_settings(current_user):
|
|||||||
|
|
||||||
@admin_api.route('/settings', methods=['PUT'])
|
@admin_api.route('/settings', methods=['PUT'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def update_settings(current_user):
|
def update_settings(current_user):
|
||||||
settings = SiteSettings.get_settings()
|
settings = SiteSettings.get_settings()
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
@@ -390,7 +347,6 @@ def update_settings(current_user):
|
|||||||
# Website Logs
|
# Website Logs
|
||||||
@admin_api.route('/logs', methods=['GET'])
|
@admin_api.route('/logs', methods=['GET'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def get_logs(current_user):
|
def get_logs(current_user):
|
||||||
page = request.args.get('page', 1, type=int)
|
page = request.args.get('page', 1, type=int)
|
||||||
per_page = request.args.get('per_page', 50, type=int)
|
per_page = request.args.get('per_page', 50, type=int)
|
||||||
@@ -417,7 +373,6 @@ def get_logs(current_user):
|
|||||||
# Mail Logs
|
# Mail Logs
|
||||||
@admin_api.route('/mail-logs', methods=['GET'])
|
@admin_api.route('/mail-logs', methods=['GET'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def get_mail_logs(current_user):
|
def get_mail_logs(current_user):
|
||||||
page = request.args.get('page', 1, type=int)
|
page = request.args.get('page', 1, type=int)
|
||||||
per_page = request.args.get('per_page', 50, type=int)
|
per_page = request.args.get('per_page', 50, type=int)
|
||||||
@@ -444,7 +399,6 @@ def get_mail_logs(current_user):
|
|||||||
# Resend Setup Mail
|
# Resend Setup Mail
|
||||||
@admin_api.route('/resend-setup-mail/<int:user_id>', methods=['POST'])
|
@admin_api.route('/resend-setup-mail/<int:user_id>', methods=['POST'])
|
||||||
@token_required
|
@token_required
|
||||||
@docker_network_required
|
|
||||||
def resend_setup_mail(current_user, user_id):
|
def resend_setup_mail(current_user, user_id):
|
||||||
user = User.query.get(user_id)
|
user = User.query.get(user_id)
|
||||||
if not user:
|
if not user:
|
||||||
|
|||||||
Reference in New Issue
Block a user