From 4e7005893d70b5c8d96146ffdd40f323deb9f03c Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Thu, 27 Feb 2025 10:51:07 -0300 Subject: [PATCH] VPN Invite first commit --- vpn_invite/__init__.py | 0 vpn_invite/admin.py | 3 ++ vpn_invite/apps.py | 6 +++ vpn_invite/migrations/0001_initial.py | 71 +++++++++++++++++++++++++++ vpn_invite/migrations/__init__.py | 0 vpn_invite/models.py | 60 ++++++++++++++++++++++ vpn_invite/tests.py | 3 ++ vpn_invite/views.py | 3 ++ wireguard_webadmin/settings.py | 3 +- 9 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 vpn_invite/__init__.py create mode 100644 vpn_invite/admin.py create mode 100644 vpn_invite/apps.py create mode 100644 vpn_invite/migrations/0001_initial.py create mode 100644 vpn_invite/migrations/__init__.py create mode 100644 vpn_invite/models.py create mode 100644 vpn_invite/tests.py create mode 100644 vpn_invite/views.py diff --git a/vpn_invite/__init__.py b/vpn_invite/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vpn_invite/admin.py b/vpn_invite/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/vpn_invite/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/vpn_invite/apps.py b/vpn_invite/apps.py new file mode 100644 index 0000000..e5570e9 --- /dev/null +++ b/vpn_invite/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class VpnInviteConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'vpn_invite' diff --git a/vpn_invite/migrations/0001_initial.py b/vpn_invite/migrations/0001_initial.py new file mode 100644 index 0000000..13ea403 --- /dev/null +++ b/vpn_invite/migrations/0001_initial.py @@ -0,0 +1,71 @@ +# Generated by Django 5.1.5 on 2025-02-27 13:49 + +import django.db.models.deletion +import uuid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('wireguard', '0027_alter_wireguardinstance_peer_list_refresh_interval'), + ] + + operations = [ + migrations.CreateModel( + name='InviteSettings', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='default_settings', max_length=16, unique=True)), + ('default_password', models.CharField(blank=True, default='', max_length=32, null=True)), + ('enforce_random_password', models.BooleanField(default=True)), + ('random_password_length', models.IntegerField(default=6)), + ('random_password_complexity', models.CharField(choices=[('letters_digits_special', 'Letters, Digits, Special Characters'), ('letters_digits', 'Letters, Digits'), ('letters', 'Letters'), ('digits', 'Digits')], default='letters_digits', max_length=22)), + ('invite_expiration', models.IntegerField(default=30)), + ('download_1_label', models.CharField(blank=True, default='iPhone', max_length=32, null=True)), + ('download_2_label', models.CharField(blank=True, default='Android', max_length=32, null=True)), + ('download_3_label', models.CharField(blank=True, default='Windows', max_length=32, null=True)), + ('download_4_label', models.CharField(blank=True, default='macOS', max_length=32, null=True)), + ('download_5_label', models.CharField(blank=True, default='Desktop', max_length=32, null=True)), + ('download_1_icon', models.CharField(blank=True, default='fab fa-app-store-ios', max_length=32, null=True)), + ('download_2_icon', models.CharField(blank=True, default='fab fa-google-play', max_length=32, null=True)), + ('download_3_icon', models.CharField(blank=True, default='fab fa-windows', max_length=32, null=True)), + ('download_4_icon', models.CharField(blank=True, default='fab fa-apple', max_length=32, null=True)), + ('download_5_icon', models.CharField(blank=True, default='fas fa-desktop', max_length=32, null=True)), + ('download_1_url', models.URLField(blank=True, default='https://apps.apple.com/us/app/wireguard/id1441195209', null=True)), + ('download_2_url', models.URLField(blank=True, default='https://play.google.com/store/apps/details?id=com.wireguard.android', null=True)), + ('download_3_url', models.URLField(blank=True, default='https://download.wireguard.com/windows-client/wireguard-installer.exe', null=True)), + ('download_4_url', models.URLField(blank=True, default='https://apps.apple.com/us/app/wireguard/id1451685025', null=True)), + ('download_5_url', models.URLField(blank=True, default='https://www.wireguard.com/install/', null=True)), + ('download_1_enabled', models.BooleanField(default=True)), + ('download_2_enabled', models.BooleanField(default=True)), + ('download_3_enabled', models.BooleanField(default=True)), + ('download_4_enabled', models.BooleanField(default=True)), + ('download_5_enabled', models.BooleanField(default=True)), + ('download_instructions', models.TextField(default='Download the WireGuard app for your device using one of the links below. After installation, you can scan the QR code or download the configuration file to import on your device.')), + ('invite_url', models.URLField(default='')), + ('invite_email_subject', models.CharField(blank=True, default='WireGuard VPN Invite', max_length=64, null=True)), + ('invite_email_body', models.TextField(blank=True, default='Here is your WireGuard VPN invite link: {invite_url}', null=True)), + ('invite_email_enabled', models.BooleanField(default=True)), + ('invite_whatsapp_body', models.TextField(blank=True, default='Here is your WireGuard VPN invite link: {invite_url}', null=True)), + ('invite_whatsapp_enabled', models.BooleanField(default=True)), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ], + ), + migrations.CreateModel( + name='PeerInvite', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('invite_password', models.CharField(default='', max_length=32)), + ('invite_expiration', models.DateTimeField()), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('peer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wireguard.peer')), + ], + ), + ] diff --git a/vpn_invite/migrations/__init__.py b/vpn_invite/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vpn_invite/models.py b/vpn_invite/models.py new file mode 100644 index 0000000..5cbf628 --- /dev/null +++ b/vpn_invite/models.py @@ -0,0 +1,60 @@ +from django.db import models +from wireguard.models import Peer +import uuid + + +class InviteSettings(models.Model): + name = models.CharField(max_length=16, default='default_settings', unique=True) + default_password = models.CharField(max_length=32, default='', blank=True, null=True) + enforce_random_password = models.BooleanField(default=True) + random_password_length = models.IntegerField(default=6) + random_password_complexity = models.CharField( + max_length=22, default='letters_digits', choices=( + ('letters_digits_special', 'Letters, Digits, Special Characters'), + ('letters_digits', 'Letters, Digits'), ('letters', 'Letters'), ('digits', 'Digits') + ) + ) + invite_expiration = models.IntegerField(default=30) # minutes + download_1_label = models.CharField(max_length=32, default='iPhone', blank=True, null=True) + download_2_label = models.CharField(max_length=32, default='Android', blank=True, null=True) + download_3_label = models.CharField(max_length=32, default='Windows', blank=True, null=True) + download_4_label = models.CharField(max_length=32, default='macOS', blank=True, null=True) + download_5_label = models.CharField(max_length=32, default='Desktop', blank=True, null=True) + download_1_icon = models.CharField(max_length=32, default='fab fa-app-store-ios', blank=True, null=True) + download_2_icon = models.CharField(max_length=32, default='fab fa-google-play', blank=True, null=True) + download_3_icon = models.CharField(max_length=32, default='fab fa-windows', blank=True, null=True) + download_4_icon = models.CharField(max_length=32, default='fab fa-apple', blank=True, null=True) + download_5_icon = models.CharField(max_length=32, default='fas fa-desktop', blank=True, null=True) + download_1_url = models.URLField(default='https://apps.apple.com/us/app/wireguard/id1441195209', blank=True, null=True) + download_2_url = models.URLField(default='https://play.google.com/store/apps/details?id=com.wireguard.android', blank=True, null=True) + download_3_url = models.URLField(default='https://download.wireguard.com/windows-client/wireguard-installer.exe', blank=True, null=True) + download_4_url = models.URLField(default='https://apps.apple.com/us/app/wireguard/id1451685025', blank=True, null=True) + download_5_url = models.URLField(default='https://www.wireguard.com/install/', blank=True, null=True) + download_1_enabled = models.BooleanField(default=True) + download_2_enabled = models.BooleanField(default=True) + download_3_enabled = models.BooleanField(default=True) + download_4_enabled = models.BooleanField(default=True) + download_5_enabled = models.BooleanField(default=True) + download_instructions = models.TextField(default='Download the WireGuard app for your device using one of the links below. After installation, you can scan the QR code or download the configuration file to import on your device.') + + invite_url = models.URLField(default='') + invite_email_subject = models.CharField(max_length=64, default='WireGuard VPN Invite', blank=True, null=True) + invite_email_body = models.TextField(default='Here is your WireGuard VPN invite link: {invite_url}', blank=True, null=True) + invite_email_enabled = models.BooleanField(default=True) + + invite_whatsapp_body = models.TextField(default='Here is your WireGuard VPN invite link: {invite_url}', blank=True, null=True) + invite_whatsapp_enabled = models.BooleanField(default=True) + + uuid = models.UUIDField(default=uuid.uuid4, editable=False) + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) + + +class PeerInvite(models.Model): + peer = models.ForeignKey(Peer, on_delete=models.CASCADE) + invite_password = models.CharField(max_length=32, default='') + invite_expiration = models.DateTimeField() + + uuid = models.UUIDField(default=uuid.uuid4, editable=False) + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) \ No newline at end of file diff --git a/vpn_invite/tests.py b/vpn_invite/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/vpn_invite/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/vpn_invite/views.py b/vpn_invite/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/vpn_invite/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/wireguard_webadmin/settings.py b/wireguard_webadmin/settings.py index f2280db..8b6e43a 100644 --- a/wireguard_webadmin/settings.py +++ b/wireguard_webadmin/settings.py @@ -42,7 +42,8 @@ INSTALLED_APPS = [ 'user_manager', 'wireguard_tools', 'firewall', - 'dns' + 'dns', + 'vpn_invite' ] MIDDLEWARE = [