diff --git a/api/views.py b/api/views.py index 0348fa6..ae52609 100644 --- a/api/views.py +++ b/api/views.py @@ -285,13 +285,17 @@ def cron_check_updates(request): return JsonResponse({'update_available': webadmin_settings.update_available}) - @login_required def api_peer_invite(request): user_acl = get_object_or_404(UserAcl, user=request.user) - data = {'status': '', 'message': '', 'invite_data': {}} - peer_invite = PeerInvite.objects.none() invite_settings = InviteSettings.objects.filter(name='default_settings').first() + data = { + 'status': '', 'message': '', 'invite_data': {}, + 'whatsapp_enabled': invite_settings.invite_whatsapp_enabled, + 'email_enabled': invite_settings.invite_email_enabled, + } + peer_invite = PeerInvite.objects.none() + if not invite_settings: data['status'] = 'error' data['message'] = 'Default settings not found' @@ -308,7 +312,10 @@ def api_peer_invite(request): data['status'] = 'error' data['message'] = 'Permission denied' return JsonResponse(data, status=403) - peer_invite = create_peer_invite(peer, invite_settings) + peer_invite = PeerInvite.objects.filter(peer=peer).first() + if not peer_invite: + peer_invite = create_peer_invite(peer, invite_settings) + elif request.GET.get('invite'): peer_invite = get_object_or_404(PeerInvite, uuid=request.GET.get('invite')) if request.GET.get('action') == 'refresh': @@ -323,6 +330,15 @@ def api_peer_invite(request): if peer_invite: data['status'] = 'success' data['message'] = '' - data['invite_data'] = get_peer_invite_data(peer_invite) + data['invite_data'] = get_peer_invite_data(peer_invite, invite_settings) + if request.GET.get('action') == 'email': + data['status'] = 'success' + data['message'] = 'Email sent' + return JsonResponse(data) + else: + if request.GET.get('action') == 'email': + data['status'] = 'error' + data['message'] = 'Invite not found' + return JsonResponse(data) return JsonResponse(data, status=200) \ No newline at end of file diff --git a/wgwadmlibrary/tools.py b/wgwadmlibrary/tools.py index 818eebf..11faff8 100644 --- a/wgwadmlibrary/tools.py +++ b/wgwadmlibrary/tools.py @@ -147,21 +147,22 @@ def get_peer_invite_data(peer_invite: PeerInvite, invite_settings: InviteSetting 'url': f'{invite_settings.invite_url}?token{peer_invite.uuid}&', 'password': peer_invite.invite_password, 'expiration': peer_invite.invite_expiration.isoformat(), - 'email_subject': replace_message_variables(invite_settings.invite_email_subject), - 'email_body': replace_message_variables(invite_settings.invite_email_body), - 'whatsapp_body': replace_message_variables(invite_settings.invite_whatsapp_body), - 'text_body': replace_message_variables(invite_settings.invite_text_body), + 'email_subject': replace_message_variables(invite_settings.invite_email_subject, peer_invite, invite_settings), + 'email_body': replace_message_variables(invite_settings.invite_email_body, peer_invite, invite_settings), + 'whatsapp_body': replace_message_variables(invite_settings.invite_whatsapp_body, peer_invite, invite_settings), + 'text_body': replace_message_variables(invite_settings.invite_text_body, peer_invite, invite_settings), + 'uuid': str(peer_invite.uuid), } return data -def create_peer_invite(peer, invite_settings): - if invite_settings.enable_random_password or not invite_settings.default_password: +def create_peer_invite(peer: Peer, invite_settings: InviteSettings): + if invite_settings.enforce_random_password or not invite_settings.default_password: password = create_random_password(invite_settings.random_password_length, invite_settings.random_password_complexity) else: password = invite_settings.default_password peer_invite = PeerInvite.objects.create( - peer=peer, password=password[32], invite_expiration=timezone.now() + timedelta(minutes=invite_settings.invite_expiration_minutes) + peer=peer, invite_password=password[:32], invite_expiration=timezone.now() + timedelta(minutes=invite_settings.invite_expiration) ) return peer_invite diff --git a/wireguard_webadmin/urls.py b/wireguard_webadmin/urls.py index 806bc58..e30d28d 100644 --- a/wireguard_webadmin/urls.py +++ b/wireguard_webadmin/urls.py @@ -23,7 +23,7 @@ from console.views import view_console from user_manager.views import view_user_list, view_manage_user, view_peer_group_list, view_peer_group_manage from accounts.views import view_create_first_user, view_login, view_logout from wireguard_tools.views import export_wireguard_configs, download_config_or_qrcode, restart_wireguard_interfaces -from api.views import wireguard_status, cron_check_updates, cron_update_peer_latest_handshake, routerfleet_get_user_token, routerfleet_authenticate_session, peer_info +from api.views import wireguard_status, cron_check_updates, cron_update_peer_latest_handshake, routerfleet_get_user_token, routerfleet_authenticate_session, peer_info, api_peer_invite from firewall.views import view_redirect_rule_list, manage_redirect_rule, view_firewall_rule_list, manage_firewall_rule, view_manage_firewall_settings, view_generate_iptables_script, view_reset_firewall, view_firewall_migration_required from dns.views import view_static_host_list, view_manage_static_host, view_manage_dns_settings, view_apply_dns_config from wgrrd.views import view_rrd_graph @@ -58,6 +58,7 @@ urlpatterns = [ path('api/routerfleet_get_user_token/', routerfleet_get_user_token, name='routerfleet_get_user_token'), path('api/wireguard_status/', wireguard_status, name='api_wireguard_status'), path('api/peer_info/', peer_info, name='api_peer_info'), + path('api/peer_invite/', api_peer_invite, name='api_peer_invite'), path('api/cron_check_updates/', cron_check_updates, name='cron_check_updates'), path('api/cron_update_peer_latest_handshake/', cron_update_peer_latest_handshake, name='cron_update_peer_latest_handshake'), path('firewall/port_forward/', view_redirect_rule_list, name='redirect_rule_list'),