v7.3.1.0: Improve error handling and streamline data formatting

This update reviews and adjusts multiple code segments across the project. The improvements are mainly focused on error handling with more informative exceptions and error messages. Additionally, data formatting and retrieval have been streamlined, mainly regarding JSON data preparation and use in several functions, which should expedite the data processing and enhance the code maintainability. Minor changes were also done on the front-end logic for error handling and improved user interaction.
pull/390/head v7.3.1.0
Aidaho 2024-06-19 20:52:24 +03:00
parent 6b24e8d39e
commit 811255ba0b
19 changed files with 202 additions and 218 deletions

View File

@ -54,22 +54,21 @@ def get_token():
except Exception as e: except Exception as e:
return f'error getting group: {e}' return f'error getting group: {e}'
try: try:
users = user_sql.select_users(user=login) user = user_sql.get_user_id_by_username(login)
password = roxy_wi_tools.Tools.get_hash(password_from_user) password = roxy_wi_tools.Tools.get_hash(password_from_user)
except Exception as e: except Exception as e:
return f'error one more: {e}' return f'error one more: {e}'
for user in users: if user.activeuser == 0:
if user.activeuser == 0: return False
return False if login in user.username and password == user.password:
if login in user.username and password == user.password: import uuid
import uuid user_token = str(uuid.uuid4())
user_token = str(uuid.uuid4()) role_id = user_sql.get_role_id(user.user_id, group_id)
role_id = user_sql.get_role_id(user.user_id, group_id) user_sql.write_api_token(user_token, group_id, role_id, user.username)
user_sql.write_api_token(user_token, group_id, role_id, user.username) return user_token
return user_token else:
else: return False
return False
def check_login(required_service=0) -> bool: def check_login(required_service=0) -> bool:

View File

@ -186,8 +186,8 @@ def _create_config_version(server_id: int, server_ip: str, service: str, config_
roxywi_common.logging('Roxy-WI server', f'error: Cannot create diff config version: {e}', roxywi=1) roxywi_common.logging('Roxy-WI server', f'error: Cannot create diff config version: {e}', roxywi=1)
try: try:
user_id = roxywi_common.get_user_id(login=login) user = user_sql.get_user_id_by_username(login=login)
config_sql.insert_config_version(server_id, user_id, service, cfg, config_path, diff) config_sql.insert_config_version(server_id, user.user_id, service, cfg, config_path, diff)
except Exception as e: except Exception as e:
roxywi_common.logging('Roxy-WI server', f'error: Cannot insert config version: {e}', roxywi=1) roxywi_common.logging('Roxy-WI server', f'error: Cannot insert config version: {e}', roxywi=1)

View File

@ -100,8 +100,6 @@ def update_user_role(user_id: int, group_id: int, role_id: int) -> None:
def select_users(**kwargs): def select_users(**kwargs):
if kwargs.get("user") is not None: if kwargs.get("user") is not None:
query = User.select().where(User.username == kwargs.get("user")) query = User.select().where(User.username == kwargs.get("user"))
elif kwargs.get("id") is not None:
query = User.select().where(User.user_id == kwargs.get("id"))
elif kwargs.get("group") is not None: elif kwargs.get("group") is not None:
get_date = roxy_wi_tools.GetDate(get_setting('time_zone')) get_date = roxy_wi_tools.GetDate(get_setting('time_zone'))
cur_date = get_date.return_date('regular', timedelta_minutes_minus=15) cur_date = get_date.return_date('regular', timedelta_minutes_minus=15)
@ -225,13 +223,11 @@ def get_user_id_by_uuid(uuid):
return user.user_id return user.user_id
def get_user_id_by_username(username: str): def get_user_id_by_username(username: str) -> User:
try: try:
query = User.get(User.username == username).user_id return User.get(User.username == username)
except Exception as e: except Exception as e:
out_error(e) out_error(e)
else:
return query
def get_user_role_by_uuid(uuid, group_id): def get_user_role_by_uuid(uuid, group_id):
@ -270,7 +266,7 @@ def write_user_uuid(login, user_uuid):
cur_date = get_date.return_date('regular', timedelta=session_ttl) cur_date = get_date.return_date('regular', timedelta=session_ttl)
try: try:
UUID.insert(user_id=user_id, uuid=user_uuid, exp=cur_date).execute() UUID.insert(user_id=user_id.user_id, uuid=user_uuid, exp=cur_date).execute()
except Exception as e: except Exception as e:
out_error(e) out_error(e)
@ -405,7 +401,7 @@ def get_role_id(user_id: int, group_id: int) -> int:
return int(role_id.user_role_id) return int(role_id.user_role_id)
def get_user_id(user_id: int) -> int: def get_user_id(user_id: int) -> User:
try: try:
return User.get(User.user_id == user_id) return User.get(User.user_id == user_id)
except Exception as e: except Exception as e:

View File

@ -56,18 +56,6 @@ def check_user_group_for_flask(**kwargs) -> bool:
return False return False
def get_user_id(**kwargs):
if kwargs.get('login'):
return user_sql.get_user_id_by_username(kwargs.get('login'))
user_uuid = request.cookies.get('uuid')
if user_uuid is not None:
user_id = user_sql.get_user_id_by_uuid(user_uuid)
return user_id
def check_is_server_in_group(server_ip: str) -> bool: def check_is_server_in_group(server_ip: str) -> bool:
group_id = get_user_group(id=1) group_id = get_user_group(id=1)
servers = server_sql.select_servers(server=server_ip) servers = server_sql.select_servers(server=server_ip)
@ -155,7 +143,8 @@ def logging(server_ip: str, action: str, **kwargs) -> None:
def keep_action_history(service: str, action: str, server_ip: str, login: str, user_ip: str): def keep_action_history(service: str, action: str, server_ip: str, login: str, user_ip: str):
if login != '': if login != '':
user_id = user_sql.get_user_id_by_username(login) user = user_sql.get_user_id_by_username(login)
user_id = user.user_id
else: else:
user_id = 0 user_id = 0
if user_ip == '': if user_ip == '':
@ -319,6 +308,6 @@ def handle_exceptions(ex: Exception, server_ip: str, message: str, **kwargs: Any
raise Exception(f'error: {message}: {ex}') raise Exception(f'error: {message}: {ex}')
def handle_json_exceptions(ex: Exception, server_ip: str, message: str, **kwargs: Any) -> dict: def handle_json_exceptions(ex: Exception, message: str, server_ip='Roxy-WI server') -> dict:
logging(server_ip, f'error: {message}: {ex}', roxywi=1, login=1, **kwargs) logging(server_ip, f'error: {message}: {ex}', roxywi=1, login=1)
return {'status': 'failed', 'error': f'{message}: {ex}'} return {'status': 'failed', 'error': f'{message}: {ex}'}

View File

@ -39,13 +39,10 @@ def delete_user(user_id: int):
count_super_admin_users = user_sql.get_super_admin_count() count_super_admin_users = user_sql.get_super_admin_count()
if count_super_admin_users < 2: if count_super_admin_users < 2:
raise Exception('error: you cannot delete a last user with superAdmin role') raise Exception('error: you cannot delete a last user with superAdmin role')
user = user_sql.select_users(id=user_id) user = user_sql.get_user_id(user_id)
username = ''
for u in user:
username = u.username
if user_sql.delete_user(user_id): if user_sql.delete_user(user_id):
user_sql.delete_user_groups(user_id) user_sql.delete_user_groups(user_id)
roxywi_common.logging(username, ' has been deleted user ', roxywi=1, login=1) roxywi_common.logging(user.username, 'has been deleted user', roxywi=1, login=1)
def update_user(email, new_user, user_id, enabled, group_id, role_id): def update_user(email, new_user, user_id, enabled, group_id, role_id):
@ -57,19 +54,12 @@ def update_user(email, new_user, user_id, enabled, group_id, role_id):
roxywi_common.logging(new_user, ' has been updated user ', roxywi=1, login=1) roxywi_common.logging(new_user, ' has been updated user ', roxywi=1, login=1)
def update_user_password(password, uuid, user_id_from_get): def update_user_password(password: str, uuid: str, user_id: int):
username = ''
if uuid: if uuid:
user_id = user_sql.get_user_id_by_uuid(uuid) user_id = user_sql.get_user_id_by_uuid(uuid)
else: user = user_sql.get_user_id(user_id)
user_id = user_id_from_get
user = user_sql.select_users(id=user_id)
for u in user:
username = u.username
user_sql.update_user_password(password, user_id) user_sql.update_user_password(password, user_id)
roxywi_common.logging(f'user {username}', ' has changed password ', roxywi=1, login=1) roxywi_common.logging(f'user {user.username}', 'has changed password', roxywi=1, login=1)
return 'ok'
def get_user_services(user_id: int) -> str: def get_user_services(user_id: int) -> str:
@ -162,22 +152,27 @@ def get_ldap_email(username) -> str:
ldap_proto = 'ldap' if ldap_type == "0" else 'ldaps' ldap_proto = 'ldap' if ldap_type == "0" else 'ldaps'
ldap_bind = ldap.initialize('{}://{}:{}/'.format(ldap_proto, server, port)) try:
ldap_bind = ldap.initialize(f'{ldap_proto}://{server}:{port}/')
except Exception as e:
raise Exception(f'Cannot initialize connect to LDAP: {e}')
try: try:
ldap_bind.protocol_version = ldap.VERSION3 ldap_bind.protocol_version = ldap.VERSION3
ldap_bind.set_option(ldap.OPT_REFERRALS, 0) ldap_bind.set_option(ldap.OPT_REFERRALS, 0)
bind = ldap_bind.simple_bind_s(user, password) _ = ldap_bind.simple_bind_s(user, password)
criteria = "(&(objectClass=" + ldap_class_search + ")(" + ldap_user_attribute + "=" + username + "))" criteria = f"(&(objectClass={ldap_class_search})({ldap_user_attribute}={username}))"
attributes = [ldap_search_field] attributes = [ldap_search_field]
result = ldap_bind.search_s(ldap_base, ldap.SCOPE_SUBTREE, criteria, attributes) result = ldap_bind.search_s(ldap_base, ldap.SCOPE_SUBTREE, criteria, attributes)
results = [entry for dn, entry in result if isinstance(entry, dict)] results = [entry for dn, entry in result if isinstance(entry, dict)]
try: try:
return '["' + results[0][ldap_search_field][0].decode("utf-8") + '","' + domain + '"]' return f'["' + results[0][ldap_search_field][0].decode("utf-8") + '","' + domain + '"]'
except Exception: except Exception:
return 'error: user not found' raise Exception('user not found')
except Exception as e:
raise Exception(e)
finally: finally:
ldap_bind.unbind() ldap_bind.unbind()

View File

@ -31,15 +31,18 @@ def send_message_to_rabbit(message: str, **kwargs) -> None:
rabbit_queue = sql.get_setting('rabbitmq_queue') rabbit_queue = sql.get_setting('rabbitmq_queue')
credentials = pika.PlainCredentials(rabbit_user, rabbit_password) credentials = pika.PlainCredentials(rabbit_user, rabbit_password)
parameters = pika.ConnectionParameters( try:
rabbit_host, parameters = pika.ConnectionParameters(
rabbit_port, rabbit_host,
rabbit_vhost, rabbit_port,
credentials rabbit_vhost,
) credentials
)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
except Exception as e:
raise Exception(f'RabbitMQ connection error {e}')
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
channel.queue_declare(queue=rabbit_queue) channel.queue_declare(queue=rabbit_queue)
channel.basic_publish(exchange='', routing_key=rabbit_queue, body=message) channel.basic_publish(exchange='', routing_key=rabbit_queue, body=message)
@ -337,29 +340,27 @@ def check_rabbit_alert() -> None:
json_for_sending = {"user_group": user_group_id, "message": 'info: Test message'} json_for_sending = {"user_group": user_group_id, "message": 'info: Test message'}
send_message_to_rabbit(json.dumps(json_for_sending)) send_message_to_rabbit(json.dumps(json_for_sending))
except Exception as e: except Exception as e:
raise Exception(e) raise Exception(f'Cannot send message {e}')
def check_email_alert() -> str: def check_email_alert() -> None:
subject = 'test message' subject = 'test message'
message = 'Test message from Roxy-WI' message = 'Test message from Roxy-WI'
try: try:
user_uuid = request.cookies.get('uuid') user_uuid = request.cookies.get('uuid')
except Exception as e: except Exception as e:
return f'error: Cannot send a message {e}' raise Exception(f'Cannot send a message {e}')
try: try:
user_email = user_sql.select_user_email_by_uuid(user_uuid) user_email = user_sql.select_user_email_by_uuid(user_uuid)
except Exception as e: except Exception as e:
return f'error: Cannot get a user email: {e}' raise Exception(f'Cannot get a user email: {e}')
try: try:
send_email(user_email, subject, message) send_email(user_email, subject, message)
except Exception as e: except Exception as e:
return f'error: Cannot send a message {e}' raise Exception('Cannot send a message {e}')
return 'ok'
def add_telegram_channel(token: str, channel: str, group: str) -> str: def add_telegram_channel(token: str, channel: str, group: str) -> str:

View File

@ -40,21 +40,22 @@ def check_receiver(channel_id, receiver_name):
alerting.check_receiver(channel_id, receiver_name) alerting.check_receiver(channel_id, receiver_name)
return jsonify({'status': 'success'}) return jsonify({'status': 'success'})
except Exception as e: except Exception as e:
roxywi_common.handle_json_exceptions(e, 'Roxy-WI', f'Cannot send message via {receiver_name}') return roxywi_common.handle_json_exceptions(e, f'Cannot send message via {receiver_name}')
@bp.route('/check/rabbit') @bp.post('/check')
def check_rabbit(): def check_sender():
json_data = request.get_json()
sender = json_data.get('sender')
send_function = {
'email': alerting.check_email_alert,
'web': alerting.check_rabbit_alert
}
try: try:
alerting.check_rabbit_alert() send_function[sender]()
return jsonify({'status': 'success'}) return jsonify({'status': 'success'})
except Exception as e: except Exception as e:
roxywi_common.handle_json_exceptions(e, 'Roxy-WI', 'Cannot send message via Web panel') return roxywi_common.handle_json_exceptions(e, f'Cannot send message via {sender.title()}')
@bp.route('/check/email')
def check_email():
return alerting.check_email_alert()
@bp.route('/receiver/<receiver_name>', methods=['PUT', 'POST', 'DELETE']) @bp.route('/receiver/<receiver_name>', methods=['PUT', 'POST', 'DELETE'])
@ -70,7 +71,7 @@ def receiver(receiver_name):
data = alerting.add_receiver_channel(receiver_name, token, channel, group) data = alerting.add_receiver_channel(receiver_name, token, channel, group)
return jsonify({'status': 'updated', 'data': data}) return jsonify({'status': 'updated', 'data': data})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI', f'Cannot create {receiver_name} channel') return roxywi_common.handle_json_exceptions(e, f'Cannot create {receiver_name} channel')
elif request.method == 'PUT': elif request.method == 'PUT':
token = common.checkAjaxInput(json_data['receiver_token']) token = common.checkAjaxInput(json_data['receiver_token'])
channel = common.checkAjaxInput(json_data['channel']) channel = common.checkAjaxInput(json_data['channel'])
@ -81,11 +82,11 @@ def receiver(receiver_name):
alerting.update_receiver_channel(receiver_name, token, channel, group, user_id) alerting.update_receiver_channel(receiver_name, token, channel, group, user_id)
return jsonify({'status': 'updated'}) return jsonify({'status': 'updated'})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI', f'Cannot update {receiver_name} channel') return roxywi_common.handle_json_exceptions(e, f'Cannot update {receiver_name} channel')
elif request.method == 'DELETE': elif request.method == 'DELETE':
channel_id = int(json_data['channel_id']) channel_id = int(json_data['channel_id'])
try: try:
alerting.delete_receiver_channel(channel_id, receiver_name) alerting.delete_receiver_channel(channel_id, receiver_name)
return jsonify({'status': 'deleted'}) return jsonify({'status': 'deleted'})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI', f'Cannot delete {receiver_name} channel') return roxywi_common.handle_json_exceptions(e, f'Cannot delete {receiver_name} channel')

View File

@ -1,4 +1,4 @@
from flask import render_template, request, g from flask import render_template, request, g, jsonify
from flask_login import login_required from flask_login import login_required
from app.routes.portscanner import bp from app.routes.portscanner import bp
@ -78,17 +78,13 @@ def change_settings_portscanner():
return 'ok' return 'ok'
@bp.route('/scan/<int:server_id>', defaults={'server_ip': None}) @bp.post('/scan')
@bp.route('/scan/<server_ip>', defaults={'server_id': None}) def scan_port():
def scan_port(server_id, server_ip): json_data = request.get_json()
if server_ip: if 'id' in json_data:
ip = server_ip ip = server_sql.select_server_ip_by_id(json_data['id'])
else: else:
server = server_sql.select_servers(id=server_id) ip = json_data['ip']
ip = ''
for s in server:
ip = s[2]
cmd = f"sudo nmap -sS {ip} |grep -E '^[[:digit:]]'|sed 's/ */ /g'" cmd = f"sudo nmap -sS {ip} |grep -E '^[[:digit:]]'|sed 's/ */ /g'"
cmd1 = f"sudo nmap -sS {ip} |head -5|tail -2" cmd1 = f"sudo nmap -sS {ip} |head -5|tail -2"
@ -97,7 +93,8 @@ def scan_port(server_id, server_ip):
stdout1, stderr1 = server_mod.subprocess_execute(cmd1) stdout1, stderr1 = server_mod.subprocess_execute(cmd1)
if stderr != '': if stderr != '':
return f'error: {stderr}' return jsonify({'error': stderr})
else: else:
lang = roxywi_common.get_user_lang_for_flask() lang = roxywi_common.get_user_lang_for_flask()
return render_template('ajax/scan_ports.html', ports=stdout, info=stdout1, lang=lang) temp = render_template('ajax/scan_ports.html', ports=stdout, info=stdout1, lang=lang)
return jsonify({'status': 'success', 'data': temp})

View File

@ -102,7 +102,7 @@ def create_server():
try: try:
last_id = server_mod.create_server(hostname, ip, group, type_ip, enable, master, cred, port, desc, haproxy, nginx, apache, firewall) last_id = server_mod.create_server(hostname, ip, group, type_ip, enable, master, cred, port, desc, haproxy, nginx, apache, firewall)
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', 'Cannot create server') return roxywi_common.handle_json_exceptions(e, 'Cannot create server')
try: try:
user_subscription = roxywi_common.return_user_status() user_subscription = roxywi_common.return_user_status()
@ -157,7 +157,7 @@ def create_server():
try: try:
server_sql.update_server(hostname, group, type_ip, enable, master, serv_id, cred, port, desc, firewall, protected) server_sql.update_server(hostname, group, type_ip, enable, master, serv_id, cred, port, desc, firewall, protected)
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', 'Cannot update server') return roxywi_common.handle_json_exceptions(e, 'Cannot update server')
server_ip = server_sql.select_server_ip_by_id(serv_id) server_ip = server_sql.select_server_ip_by_id(serv_id)
roxywi_common.logging(server_ip, f'The server {hostname} has been update', roxywi=1, login=1, roxywi_common.logging(server_ip, f'The server {hostname} has been update', roxywi=1, login=1,
keep_history=1, service='server') keep_history=1, service='server')
@ -168,7 +168,7 @@ def create_server():
server_mod.delete_server(server_id) server_mod.delete_server(server_id)
return jsonify({'status': 'deleted'}) return jsonify({'status': 'deleted'})
except Exception as e: except Exception as e:
roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', 'Cannot delete the server') return roxywi_common.handle_json_exceptions(e, 'Cannot delete the server')
elif request.method == 'PATCH': elif request.method == 'PATCH':
hostname = common.checkAjaxInput(json_data['name']) hostname = common.checkAjaxInput(json_data['name'])
ip = common.is_ip_or_dns(json_data['ip']) ip = common.is_ip_or_dns(json_data['ip'])
@ -177,7 +177,7 @@ def create_server():
server_mod.update_server_after_creating(hostname, ip, scan_server) server_mod.update_server_after_creating(hostname, ip, scan_server)
return jsonify({'status': 'updated'}) return jsonify({'status': 'updated'})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', 'Cannot scan the server') return roxywi_common.handle_json_exceptions(e, 'Cannot scan the server')
@bp.route('/group', methods=['POST', 'PUT', 'DELETE']) @bp.route('/group', methods=['POST', 'PUT', 'DELETE'])
@ -198,7 +198,7 @@ def create_group():
'data': render_template('ajax/new_group.html', groups=group_sql.select_groups(group=name))} 'data': render_template('ajax/new_group.html', groups=group_sql.select_groups(group=name))}
) )
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', 'Cannot create a new group') return roxywi_common.handle_json_exceptions(e, 'Cannot create a new group')
elif request.method == 'PUT': elif request.method == 'PUT':
name = json_data.get('name') name = json_data.get('name')
desc = json_data.get('desc') desc = json_data.get('desc')
@ -207,14 +207,14 @@ def create_group():
group_mod.update_group(group_id, name, desc) group_mod.update_group(group_id, name, desc)
return jsonify({'status': 'updated'}) return jsonify({'status': 'updated'})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', f'Cannot update group {name}') return roxywi_common.handle_json_exceptions(e, f'Cannot update group {name}')
elif request.method == 'DELETE': elif request.method == 'DELETE':
group_id = json_data.get('group_id') group_id = json_data.get('group_id')
try: try:
group_mod.delete_group(group_id) group_mod.delete_group(group_id)
return jsonify({'status': 'deleted'}) return jsonify({'status': 'deleted'})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', f'Cannot delete {group_id}') return roxywi_common.handle_json_exceptions(e, f'Cannot delete {group_id}')
@bp.route('/ssh', methods=['POST', 'PUT', 'DELETE', 'PATCH']) @bp.route('/ssh', methods=['POST', 'PUT', 'DELETE', 'PATCH'])
@ -227,20 +227,20 @@ def create_ssh():
data = ssh_mod.create_ssh_cred(json_data) data = ssh_mod.create_ssh_cred(json_data)
return jsonify({'status': 'created', 'id': data['id'], 'data': data['template']}) return jsonify({'status': 'created', 'id': data['id'], 'data': data['template']})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', 'Cannot create SSH') return roxywi_common.handle_json_exceptions(e, 'Cannot create SSH')
elif request.method == 'PUT': elif request.method == 'PUT':
try: try:
ssh_mod.update_ssh_key(json_data) ssh_mod.update_ssh_key(json_data)
return jsonify({'status': 'updated'}) return jsonify({'status': 'updated'})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', 'Cannot update SSH') return roxywi_common.handle_json_exceptions(e, 'Cannot update SSH')
elif request.method == 'DELETE': elif request.method == 'DELETE':
ssh_id = int(json_data.get('id')) ssh_id = int(json_data.get('id'))
try: try:
ssh_mod.delete_ssh_key(ssh_id) ssh_mod.delete_ssh_key(ssh_id)
return jsonify({'status': 'deleted'}) return jsonify({'status': 'deleted'})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', 'Cannot delete SSH') return roxywi_common.handle_json_exceptions(e, 'Cannot delete SSH')
elif request.method == 'PATCH': elif request.method == 'PATCH':
user_group = roxywi_common.get_user_group() user_group = roxywi_common.get_user_group()
name = common.checkAjaxInput(json_data['name']) name = common.checkAjaxInput(json_data['name'])
@ -251,7 +251,7 @@ def create_ssh():
saved_path = ssh_mod.upload_ssh_key(name, user_group, key, passphrase) saved_path = ssh_mod.upload_ssh_key(name, user_group, key, passphrase)
return jsonify({'status': 'uploaded', 'message': saved_path}) return jsonify({'status': 'uploaded', 'message': saved_path})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', 'Cannot upload ssh') return roxywi_common.handle_json_exceptions(e, 'Cannot upload ssh')
@bp.app_template_filter('string_to_dict') @bp.app_template_filter('string_to_dict')

View File

@ -44,7 +44,7 @@ def listener_funct(service):
roxywi_common.logging(listener_id, f'UDP listener {listener_name} has been created', roxywi=1, keep_history=1, login=1, service='UDP listener') roxywi_common.logging(listener_id, f'UDP listener {listener_name} has been created', roxywi=1, keep_history=1, login=1, service='UDP listener')
return jsonify({'status': 'created', 'listener_id': listener_id}) return jsonify({'status': 'created', 'listener_id': listener_id})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server','Cannot create UDP listener') return roxywi_common.handle_json_exceptions(e,'Cannot create UDP listener')
elif request.method == 'PUT': elif request.method == 'PUT':
json_data = request.get_json() json_data = request.get_json()
json_data['group_id'] = g.user_params['group_id'] json_data['group_id'] = g.user_params['group_id']
@ -64,12 +64,12 @@ def listener_funct(service):
service_mod.run_ansible(inv, server_ips, 'udp'), 201 service_mod.run_ansible(inv, server_ips, 'udp'), 201
roxywi_common.logging(listener_id, f'UDP listener has been deleted {listener_id}', roxywi=1, keep_history=1, login=1, service='UDP listener') roxywi_common.logging(listener_id, f'UDP listener has been deleted {listener_id}', roxywi=1, keep_history=1, login=1, service='UDP listener')
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server',f'Cannot create inventory for UDP listener deleting {listener_id}') return roxywi_common.handle_json_exceptions(e,f'Cannot create inventory for UDP listener deleting {listener_id}')
try: try:
udp_sql.delete_listener(listener_id) udp_sql.delete_listener(listener_id)
return jsonify({'status': 'deleted'}), 201 return jsonify({'status': 'deleted'}), 201
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server',f'Cannot delete UDP listener {listener_id}') return roxywi_common.handle_json_exceptions(e,f'Cannot delete UDP listener {listener_id}')
@bp.get('/<service>/listener/<int:listener_id>') @bp.get('/<service>/listener/<int:listener_id>')
@ -109,4 +109,4 @@ def action_with_listener(service, listener_id, action):
roxywi_common.logging(listener_id, f'UDP listener {listener_id} has been {action}ed', roxywi=1, keep_history=1, login=1, service='UDP listener') roxywi_common.logging(listener_id, f'UDP listener {listener_id} has been {action}ed', roxywi=1, keep_history=1, login=1, service='UDP listener')
return jsonify({'status': 'done'}) return jsonify({'status': 'done'})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server',f'Cannot {action} listener') return roxywi_common.handle_json_exceptions(e,f'Cannot {action} listener')

View File

@ -43,7 +43,7 @@ def create_user():
try: try:
user_id = roxywi_user.create_user(new_user, email, password, role, enabled, group_id) user_id = roxywi_user.create_user(new_user, email, password, role, enabled, group_id)
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', 'Cannot create a new user') return roxywi_common.handle_json_exceptions(e, 'Cannot create a new user')
else: else:
return jsonify({'status': 'created', 'id': user_id, 'data': render_template( return jsonify({'status': 'created', 'id': user_id, 'data': render_template(
'ajax/new_user.html', users=user_sql.select_users(user=new_user), groups=group_sql.select_groups(), 'ajax/new_user.html', users=user_sql.select_users(user=new_user), groups=group_sql.select_groups(),
@ -58,7 +58,7 @@ def create_user():
try: try:
user_sql.update_user_from_admin_area(user_name, email, user_id, enabled) user_sql.update_user_from_admin_area(user_name, email, user_id, enabled)
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', 'Cannot update user') return roxywi_common.handle_json_exceptions(e, 'Cannot update user')
roxywi_common.logging(user_name, ' has been updated user ', roxywi=1, login=1) roxywi_common.logging(user_name, ' has been updated user ', roxywi=1, login=1)
return jsonify({'status': 'updated'}) return jsonify({'status': 'updated'})
elif request.method == 'DELETE': elif request.method == 'DELETE':
@ -68,7 +68,7 @@ def create_user():
roxywi_user.delete_user(user_id) roxywi_user.delete_user(user_id)
return jsonify({'status': 'deleted'}) return jsonify({'status': 'deleted'})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', f'Cannot delete the user {user_id}') return roxywi_common.handle_json_exceptions(e, f'Cannot delete the user {user_id}')
else: else:
abort(405) abort(405)
@ -77,16 +77,29 @@ def create_user():
def get_ldap_email(username): def get_ldap_email(username):
roxywi_auth.page_for_admin(level=2) roxywi_auth.page_for_admin(level=2)
return roxywi_user.get_ldap_email(username) try:
user = roxywi_user.get_ldap_email(username)
return jsonify({'status': 'ldap', 'user': user})
except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Cannot get LDAP email')
@bp.post('/password') @bp.post('/password')
def update_password(): def update_password():
password = request.form.get('updatepassowrd') json_data = request.get_json()
uuid = request.form.get('uuid') password = json_data['password']
user_id_from_get = request.form.get('id') uuid = ''
user_id = ''
if 'uuid' in json_data:
uuid = common.checkAjaxInput(json_data['uuid'])
else:
user_id = int(json_data['id'])
return roxywi_user.update_user_password(password, uuid, user_id_from_get) try:
roxywi_user.update_user_password(password, uuid, user_id)
return jsonify({'status': 'updated'})
except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Cannot update password')
@bp.route('/services/<int:user_id>', methods=['GET', 'POST']) @bp.route('/services/<int:user_id>', methods=['GET', 'POST'])
@ -101,7 +114,7 @@ def show_user_services(user_id):
roxywi_user.change_user_services(user, user_id, user_services) roxywi_user.change_user_services(user, user_id, user_services)
return jsonify({'status': 'updated'}) return jsonify({'status': 'updated'})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, 'Roxy-WI server', 'Cannot change user services') return roxywi_common.handle_json_exceptions(e, 'Cannot change user services')
@bp.route('/group', methods=['GET', 'PUT']) @bp.route('/group', methods=['GET', 'PUT'])

View File

@ -177,7 +177,7 @@ def enable_rule(server_ip, rule_id, enable):
roxy_waf.switch_waf_rule(server_ip, enable, rule_id) roxy_waf.switch_waf_rule(server_ip, enable, rule_id)
return jsonify({'status': 'updated'}) return jsonify({'status': 'updated'})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, server_ip, f'Cannot enable WAF rule {rule_id} on server {server_ip}') return roxywi_common.handle_json_exceptions(e, f'Cannot enable WAF rule {rule_id}', server_ip)
@bp.route('/<service>/<server_ip>/rule/create', methods=['POST']) @bp.route('/<service>/<server_ip>/rule/create', methods=['POST'])
@ -185,19 +185,19 @@ def create_rule(service, server_ip):
server_ip = common.is_ip_or_dns(server_ip) server_ip = common.is_ip_or_dns(server_ip)
json_data = request.get_json() json_data = request.get_json()
if service not in ('haproxy', 'nginx'): if service not in ('haproxy', 'nginx'):
return roxywi_common.handle_json_exceptions('Wrong service', server_ip, '') return roxywi_common.handle_json_exceptions('Wrong service', '', server_ip)
try: try:
last_id = roxy_waf.create_waf_rule(server_ip, service, json_data) last_id = roxy_waf.create_waf_rule(server_ip, service, json_data)
return jsonify({'status': 'created', 'id': last_id}) return jsonify({'status': 'created', 'id': last_id})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, server_ip, 'Cannot create WAF rule') return roxywi_common.handle_json_exceptions(e, 'Cannot create WAF rule', server_ip,)
@bp.route('/<service>/mode/<server_name>/<waf_mode>') @bp.route('/<service>/mode/<server_name>/<waf_mode>')
def change_waf_mode(service, server_name, waf_mode): def change_waf_mode(service, server_name, waf_mode):
if service not in ('haproxy', 'nginx'): if service not in ('haproxy', 'nginx'):
return roxywi_common.handle_json_exceptions('Wrong service', server_name, '') return roxywi_common.handle_json_exceptions('Wrong service', '', server_name)
server_name = common.checkAjaxInput(server_name) server_name = common.checkAjaxInput(server_name)
waf_mode = common.checkAjaxInput(waf_mode) waf_mode = common.checkAjaxInput(waf_mode)
@ -206,7 +206,7 @@ def change_waf_mode(service, server_name, waf_mode):
roxy_waf.change_waf_mode(waf_mode, server_name, service) roxy_waf.change_waf_mode(waf_mode, server_name, service)
return jsonify({'status': 'updated'}) return jsonify({'status': 'updated'})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, server_name, 'Cannot change WAF mode') return roxywi_common.handle_json_exceptions(e, 'Cannot change WAF mode', server_name)
@bp.route('/overview/<service>/<server_ip>') @bp.route('/overview/<service>/<server_ip>')
@ -228,4 +228,4 @@ def enable_metric(enable, server_name):
waf_sql.update_waf_metrics_enable(server_name, enable) waf_sql.update_waf_metrics_enable(server_name, enable)
return jsonify({'status': 'updated'}) return jsonify({'status': 'updated'})
except Exception as e: except Exception as e:
return roxywi_common.handle_json_exceptions(e, server_name, 'Cannot enable WAF metrics') return roxywi_common.handle_json_exceptions(e, 'Cannot enable WAF metrics', server_name)

View File

@ -1,11 +1,11 @@
var cur_url = window.location.href.split('/app/').pop(); var cur_url = window.location.href.split('/app/').pop();
cur_url = cur_url.split('/'); cur_url = cur_url.split('/');
$( function() { $( function() {
$('#add-user-button').click(function() { $('#add-user-button').click(function () {
addUserDialog.dialog('open'); addUserDialog.dialog('open');
}); });
let user_tabel_title = $( "#user-add-table-overview" ).attr('title'); let user_tabel_title = $("#user-add-table-overview").attr('title');
let addUserDialog = $( "#user-add-table" ).dialog({ let addUserDialog = $("#user-add-table").dialog({
autoOpen: false, autoOpen: false,
resizable: false, resizable: false,
height: "auto", height: "auto",
@ -33,15 +33,15 @@ $( function() {
} }
}] }]
}); });
$( "#ajax-users input" ).change(function() { $("#ajax-users input").change(function () {
let id = $(this).attr('id').split('-'); let id = $(this).attr('id').split('-');
updateUser(id[1]) updateUser(id[1])
}); });
$( "#ajax-users select" ).on('selectmenuchange',function() { $("#ajax-users select").on('selectmenuchange', function () {
let id = $(this).attr('id').split('-'); let id = $(this).attr('id').split('-');
updateUser(id[1]) updateUser(id[1])
}); });
$('#search_ldap_user').click(function() { $('#search_ldap_user').click(function () {
toastr.clear(); toastr.clear();
let username_div = $('#new-username') let username_div = $('#new-username')
let valid = true; let valid = true;
@ -52,13 +52,12 @@ $( function() {
if (valid) { if (valid) {
$.ajax({ $.ajax({
url: "/app/user/ldap/" + user, url: "/app/user/ldap/" + user,
contentType: "application/json; charset=utf-8",
success: function (data) { success: function (data) {
data = data.replace(/\s+/g, ' '); if (data.status === 'failed') {
if (data.indexOf('error:') != '-1') { toastr.error(data.error);
toastr.error(data);
$('#new-email').val(''); $('#new-email').val('');
username_div.attr('readonly', false); username_div.attr('readonly', false);
username_div.val('');
} else { } else {
let json = $.parseJSON(data); let json = $.parseJSON(data);
toastr.clear(); toastr.clear();
@ -76,22 +75,25 @@ $( function() {
}); });
} ); } );
function addUser(dialog_id) { function addUser(dialog_id) {
let valid = true;
toastr.clear(); toastr.clear();
let allFields = $([]).add($('#new-username')).add($('#new-password')).add($('#new-email')) let valid = true;
let new_username_div = $('#new-username');
let password_div = $('#new-password');
let email_div = $('#new-email');
let allFields = $([]).add(new_username_div).add(password_div).add(email_div)
allFields.removeClass("ui-state-error"); allFields.removeClass("ui-state-error");
valid = valid && checkLength($('#new-username'), "user name", 1); valid = valid && checkLength(new_username_div, "user name", 1);
valid = valid && checkLength($('#new-password'), "password", 1); valid = valid && checkLength(password_div, "password", 1);
valid = valid && checkLength($('#new-email'), "Email", 1); valid = valid && checkLength(email_div, "Email", 1);
let enabled = 0; let enabled = 0;
if ($('#activeuser').is(':checked')) { if ($('#activeuser').is(':checked')) {
enabled = '1'; enabled = '1';
} }
if (valid) { if (valid) {
let jsonData = { let jsonData = {
"username": $('#new-username').val(), "username": new_username_div.val(),
"password": $('#new-password').val(), "password": password_div.val(),
"email": $('#new-email').val(), "email": email_div.val(),
"role": $('#new-role').val(), "role": $('#new-role').val(),
"enabled": enabled, "enabled": enabled,
"user_group": $('#new-group').val(), "user_group": $('#new-group').val(),
@ -231,17 +233,18 @@ function changeUserPassword(id, d) {
} else { } else {
$('#missmatchpass').hide(); $('#missmatchpass').hide();
toastr.clear(); toastr.clear();
let jsonData = {
"password": pass,
"id": id
}
$.ajax({ $.ajax({
url: "/app/user/password", url: "/app/user/password",
data: { data: JSON.stringify(jsonData),
updatepassowrd: pass, contentType: "application/json; charset=utf-8",
id: id
},
type: "POST", type: "POST",
success: function (data) { success: function (data) {
data = data.replace(/\s+/g, ' '); if (data.status === 'failed') {
if (data.indexOf('error:') != '-1') { toastr.error(data.error);
toastr.error(data);
} else { } else {
toastr.clear(); toastr.clear();
$("#user-" + id).addClass("update", 1000); $("#user-" + id).addClass("update", 1000);
@ -310,7 +313,7 @@ function changeUserServices(user_id) {
type: "POST", type: "POST",
success: function( data ) { success: function( data ) {
if (data.status === 'failed') { if (data.status === 'failed') {
toastr.error(data); toastr.error(data.error);
} else { } else {
$("#user-" + user_id).addClass("update", 1000); $("#user-" + user_id).addClass("update", 1000);
setTimeout(function () { setTimeout(function () {

View File

@ -292,9 +292,11 @@ function removeReceiver(receiver_name, receiver_id) {
} }
}); });
} }
function checkWebPanel() { function sendCheckMessage(sender) {
$.ajax({ $.ajax({
url: "/app/channel/check/rabbit", url: "/app/channel/check",
data: JSON.stringify({'sender': sender}),
type: "POST",
contentType: "application/json; charset=utf-8", contentType: "application/json; charset=utf-8",
success: function (data) { success: function (data) {
if (data.status === 'failed') { if (data.status === 'failed') {
@ -305,16 +307,3 @@ function checkWebPanel() {
} }
}); });
} }
function checkEmail() {
$.ajax({
url: "/app/channel/check/email",
success: function (data) {
data = data.replace(/\s+/g, ' ');
if (data.indexOf('error:') != '-1' || data.indexOf('error_code') != '-1') {
toastr.error(data);
} else {
toastr.success('Test message has been sent');
}
}
});
}

View File

@ -109,26 +109,29 @@ $( function() {
event.preventDefault(); event.preventDefault();
}); });
$("#nettools_portscanner_form").on("click", ":submit", function (e) { $("#nettools_portscanner_form").on("click", ":submit", function (e) {
let port_server = $('#nettools_portscanner_server').val();
$('#ajax-nettools').html(''); $('#ajax-nettools').html('');
if ($('#nettools_portscanner_server').val() == '') { if (port_server == '') {
toastr.warning('Enter an address'); toastr.warning('Enter an address');
return false; return false;
} }
$.ajax({ $.ajax({
url: "/app/portscanner/scan/" + $('#nettools_portscanner_server').val(), url: "/app/portscanner/scan",
data: JSON.stringify({'ip': port_server}),
type: "POST",
contentType: "application/json; charset=utf-8",
success: function (data) { success: function (data) {
data = data.replace(/\s+/g, ' '); if (data.status === 'failed') {
if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') { toastr.error(data.error);
toastr.error(data);
} else { } else {
toastr.clear(); toastr.clear();
$("#show_scans_ports_body").html(data); $("#show_scans_ports_body").html(data.data);
$("#show_scans_ports").dialog({ $("#show_scans_ports").dialog({
resizable: false, resizable: false,
height: "auto", height: "auto",
width: 360, width: 360,
modal: true, modal: true,
title: "{{lang.words.opened|title()}} {{lang.words.ports}}", title: "Opened ports",
buttons: [{ buttons: [{
text: close_word, text: close_word,
click: function () { click: function () {

View File

@ -1328,17 +1328,18 @@ function changeUserPasswordItOwn(d) {
} else { } else {
$('#missmatchpass').hide(); $('#missmatchpass').hide();
toastr.clear(); toastr.clear();
let jsonData = {
"password": pass,
"uuid": Cookies.get('uuid')
}
$.ajax({ $.ajax({
url: "/app/user/password", url: "/app/user/password",
data: { data: JSON.stringify(jsonData),
updatepassowrd: pass, contentType: "application/json; charset=utf-8",
uuid: Cookies.get('uuid'),
},
type: "POST", type: "POST",
success: function (data) { success: function (data) {
data = data.replace(/\s+/g, ' '); if (data.status === 'failed') {
if (data.indexOf('error:') != '-1') { toastr.error(data.error);
toastr.error(data);
} else { } else {
toastr.clear(); toastr.clear();
d.dialog("close"); d.dialog("close");

View File

@ -219,10 +219,10 @@
</tr> </tr>
<tr> <tr>
<td class="padding10 first-collumn"> <td class="padding10 first-collumn">
<button title="{{lang.phrases.send_test_mes}} {{lang.words.via}} {{lang.words.email}}" onclick="checkEmail()">{{lang.words.test|title()}}</button> <button title="{{lang.phrases.send_test_mes}} {{lang.words.via}} {{lang.words.email}}" onclick="sendCheckMessage('email')">{{lang.words.test|title()}}</button>
</td> </td>
<td> <td>
<button title="{{lang.phrases.send_test_mes}} {{lang.words.via}} {{lang.words.web_panel}}" onclick="checkWebPanel()">{{lang.words.test|title()}}</button> <button title="{{lang.phrases.send_test_mes}} {{lang.words.via}} {{lang.words.web_panel}}" onclick="sendCheckMessage('web')">{{lang.words.test|title()}}</button>
</td> </td>
</tr> </tr>
</table> </table>

View File

@ -148,36 +148,34 @@
<script> <script>
function scanPorts(id) { function scanPorts(id) {
$.ajax({ $.ajax({
url: "/app/portscanner/scan/" + id, url: "/app/portscanner/scan",
// data: { data: JSON.stringify({'id': id}),
// token: $('#token').val() type: "POST",
// }, contentType: "application/json; charset=utf-8",
// type: "POST", success: function (data) {
success: function (data) { if (data.status === 'failed') {
data = data.replace(/\s+/g, ' '); toastr.error(data.error);
if (data.indexOf('danger') != '-1' || data.indexOf('unique') != '-1' || data.indexOf('error:') != '-1') { } else {
toastr.error(data); toastr.clear();
} else { $("#show_scans_ports_body").html(data.data);
toastr.clear(); var close_word = $('#translate').attr('data-close');
$("#show_scans_ports_body").html(data); $("#show_scans_ports").dialog({
var close_word = $('#translate').attr('data-close'); resizable: false,
$("#show_scans_ports").dialog({ height: "auto",
resizable: false, width: 360,
height: "auto", modal: true,
width: 360, title: "{{lang.words.opened|title()}} {{lang.words.ports}}",
modal: true, buttons: [{
title: "{{lang.words.opened|title()}} {{lang.words.ports}}", text: close_word,
buttons: [{ click: function () {
text: close_word, $(this).dialog("close");
click: function () { $("#show_scans_ports_body").html('');
$(this).dialog("close"); }
$("#show_scans_ports_body").html(''); }]
} });
}] }
}); }
} });
}
});
} }
$( ".server-act-links" ).change(function() { $( ".server-act-links" ).change(function() {
var id = $(this).attr('id').split('-'); var id = $(this).attr('id').split('-');
@ -218,8 +216,7 @@
server_id: id, server_id: id,
enabled: portscanner_enabled, enabled: portscanner_enabled,
notify: portscanner_notify, notify: portscanner_notify,
history: portscanner_history, history: portscanner_history
token: $('#token').val()
}, },
type: "POST", type: "POST",
success: function (data) { success: function (data) {

View File

@ -61,7 +61,7 @@
<button type="submit" value="test" name="save" class="btn btn-default" title="{{lang.words.check|title()}} {{lang.words.config}} {{lang.words.without}} {{lang.words.saving}}">{{lang.phrases.check_config}}</button> <button type="submit" value="test" name="save" class="btn btn-default" title="{{lang.words.check|title()}} {{lang.words.config}} {{lang.words.without}} {{lang.words.saving}}">{{lang.phrases.check_config}}</button>
<button type="submit" value="save" name="save" class="btn btn-default" title="{{lang.phrases.save_title}}">{{lang.words.save|title()}}</button> <button type="submit" value="save" name="save" class="btn btn-default" title="{{lang.phrases.save_title}}">{{lang.words.save|title()}}</button>
{% if is_restart|int == 0 %} {% if is_restart|int == 0 %}
<button type="submit" value="" name="" class="btn btn-default">{{lang.phrases.save_and_restart}}</button> <button type="submit" value="restart" name="save" class="btn btn-default">{{lang.phrases.save_and_restart}}</button>
{% endif %} {% endif %}
<button type="submit" value="reload" name="save" class="btn btn-default">{{lang.phrases.save_and_reload}}</button> <button type="submit" value="reload" name="save" class="btn btn-default">{{lang.phrases.save_and_reload}}</button>
{% if section != 'globals' and section != 'defaults' %} {% if section != 'globals' and section != 'defaults' %}