mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-23 19:22:27 +02:00
Compare commits
4 Commits
baf3c85ac7
...
d68d75bd05
Author | SHA1 | Date | |
---|---|---|---|
|
d68d75bd05 | ||
|
1385a2ef16 | ||
|
d09892397b | ||
|
168e6cc290 |
@ -41,19 +41,19 @@ from threading import Timer
|
|||||||
from passlib.hash import bcrypt_sha256
|
from passlib.hash import bcrypt_sha256
|
||||||
from hashlib import sha1
|
from hashlib import sha1
|
||||||
|
|
||||||
import django # noqa
|
import django
|
||||||
import os # noqa
|
from django.utils.datetime_safe import datetime
|
||||||
|
import os
|
||||||
import sys
|
import sys
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
sys.path.append(os.getcwd())
|
sys.path.append(os.getcwd())
|
||||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myauth.settings.local") # noqa
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myauth.settings.local")
|
||||||
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true" # noqa
|
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
|
||||||
django.setup() # noqa
|
django.setup()
|
||||||
from django.utils.datetime_safe import datetime
|
|
||||||
|
|
||||||
from allianceauth import __version__
|
from allianceauth import __version__ # noqa
|
||||||
from allianceauth.services.modules.mumble.models import MumbleServerServer, MumbleUser
|
from allianceauth.services.modules.mumble.models import MumbleServerServer, MumbleUser, TempUser # noqa
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
@ -293,22 +293,48 @@ def main() -> None:
|
|||||||
mumble_user.version = user.version
|
mumble_user.version = user.version
|
||||||
mumble_user.last_connect = datetime.now()
|
mumble_user.last_connect = datetime.now()
|
||||||
mumble_user.save()
|
mumble_user.save()
|
||||||
except Exception as e:
|
except MumbleUser.DoesNotExist as a:
|
||||||
logger.error(e)
|
try:
|
||||||
|
mumble_user = TempUser.objects.get(username=user)
|
||||||
|
mumble_user.release = user.release
|
||||||
|
mumble_user.version = user.version
|
||||||
|
mumble_user.last_connect = datetime.now()
|
||||||
|
mumble_user.save()
|
||||||
|
except Exception as b:
|
||||||
|
logger.exception(a)
|
||||||
|
logger.exception(b)
|
||||||
|
|
||||||
def userDisconnected(self, user, current=None) -> None:
|
def userDisconnected(self, user, current=None) -> None:
|
||||||
try:
|
try:
|
||||||
mumble_user = MumbleUser.objects.get(username=user)
|
mumble_user = MumbleUser.objects.get(username=user)
|
||||||
mumble_user.last_disconnect = datetime.now()
|
mumble_user.last_disconnect = datetime.now()
|
||||||
mumble_user.save()
|
mumble_user.save()
|
||||||
except Exception as e:
|
except MumbleUser.DoesNotExist as a:
|
||||||
logger.error(e)
|
try:
|
||||||
|
mumble_user = TempUser.objects.get(username=user)
|
||||||
|
mumble_user.last_disconnect = datetime.now()
|
||||||
|
mumble_user.save()
|
||||||
|
except Exception as b:
|
||||||
|
logger.exception(a)
|
||||||
|
logger.exception(b)
|
||||||
|
|
||||||
def userStateChanged(self, user, current=None) -> None:
|
def userStateChanged(self, user, current=None) -> None:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def userTextMessage(self, user, text_message=None) -> None:
|
def userTextMessage(self, user, text_message=None) -> None:
|
||||||
pass
|
if text_message.text == "!kicktemps":
|
||||||
|
if self.server.hasPermission(user.session, 0, 0x10000):
|
||||||
|
self.server.sendMessage(user.session, "Kicking all templink clients!")
|
||||||
|
|
||||||
|
users = self.server.getUsers()
|
||||||
|
for (userid, auser) in users.items():
|
||||||
|
if auser.userid > (MumbleServerServer.objects.get(id=1).offset * 2):
|
||||||
|
self.server.kickUser(auser.session, "Kicking all temp users! :-)")
|
||||||
|
|
||||||
|
self.server.sendMessage(user.session, "All templink clients kicked!")
|
||||||
|
|
||||||
|
else:
|
||||||
|
self.server.sendMessage(user.session, "You do not have kick permissions!")
|
||||||
|
|
||||||
def channelCreated(self, channel, current=None) -> None:
|
def channelCreated(self, channel, current=None) -> None:
|
||||||
pass
|
pass
|
||||||
@ -340,13 +366,16 @@ def main() -> None:
|
|||||||
try:
|
try:
|
||||||
mumble_user = MumbleUser.objects.get(username=name)
|
mumble_user = MumbleUser.objects.get(username=name)
|
||||||
except MumbleUser.DoesNotExist:
|
except MumbleUser.DoesNotExist:
|
||||||
return (-2, None, None)
|
try:
|
||||||
|
mumble_user = TempUser.objects.get(username=name)
|
||||||
|
except TempUser.DoesNotExist:
|
||||||
|
return (-2, None, None) # No Standard or Temp User
|
||||||
|
|
||||||
logger.debug("checking password with hash function: %s" % mumble_user.hashfn)
|
logger.debug("checking password with hash function: %s" % mumble_user.hashfn)
|
||||||
if allianceauth_check_hash(pw, mumble_user.pwhash, mumble_user.hashfn):
|
if allianceauth_check_hash(pw, mumble_user.pwhash, mumble_user.hashfn):
|
||||||
logger.info(f'User authenticated: {mumble_user.get_display_name()} {mumble_user.user_id + MumbleServerServer.objects.get(id=1).offset}')
|
logger.info(f'User authenticated: {mumble_user.display_name} {mumble_user.user_id + MumbleServerServer.objects.get(id=1).offset}')
|
||||||
logger.debug("Group memberships: %s", mumble_user.group_string())
|
logger.debug("Group memberships: %s", mumble_user.group_string())
|
||||||
return (mumble_user.user_id + MumbleServerServer.objects.get(id=1).offset, mumble_user.get_display_name(), mumble_user.group_string())
|
return (mumble_user.user_id + MumbleServerServer.objects.get(id=1).offset, mumble_user.display_name, mumble_user.group_string())
|
||||||
logger.info(
|
logger.info(
|
||||||
f'Failed authentication attempt for user: {name} {mumble_user.user_id + MumbleServerServer.objects.get(id=1).offset}')
|
f'Failed authentication attempt for user: {name} {mumble_user.user_id + MumbleServerServer.objects.get(id=1).offset}')
|
||||||
return (AUTH_REFUSED, None, None)
|
return (AUTH_REFUSED, None, None)
|
||||||
@ -374,7 +403,10 @@ def main() -> None:
|
|||||||
try:
|
try:
|
||||||
return (MumbleUser.objects.get(username=name).pk + MumbleServerServer.objects.get(id=1).offset)
|
return (MumbleUser.objects.get(username=name).pk + MumbleServerServer.objects.get(id=1).offset)
|
||||||
except MumbleUser.DoesNotExist:
|
except MumbleUser.DoesNotExist:
|
||||||
return -2 # FALL_THROUGH
|
try:
|
||||||
|
return (TempUser.objects.get(username=name).pk + MumbleServerServer.objects.get(id=1).offset * 2)
|
||||||
|
except TempUser.DoesNotExist:
|
||||||
|
return -2 # FALL_THROUGH
|
||||||
|
|
||||||
@fortifyIceFu("")
|
@fortifyIceFu("")
|
||||||
@checkSecret
|
@checkSecret
|
||||||
@ -387,12 +419,17 @@ def main() -> None:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
mumble_user = MumbleUser.objects.get(user_id=id - MumbleServerServer.objects.get(id=1).offset)
|
mumble_user = MumbleUser.objects.get(user_id=id - MumbleServerServer.objects.get(id=1).offset)
|
||||||
|
mumble_user.username
|
||||||
except MumbleUser.DoesNotExist:
|
except MumbleUser.DoesNotExist:
|
||||||
return "" # FALL_THROUGH
|
try:
|
||||||
|
mumble_user = TempUser.objects.get(user_id=id - MumbleServerServer.objects.get(id=1).offset * 2)
|
||||||
|
mumble_user.username
|
||||||
|
except TempUser.DoesNotExist:
|
||||||
|
return "" # FALL_THROUGH
|
||||||
|
|
||||||
# I dont quite rightly know why we have this
|
# I dont quite rightly know why we have this
|
||||||
# SuperUser shouldnt be in our Authenticator?
|
# SuperUser shouldnt be in our Authenticator?
|
||||||
# But Maybe it can be
|
# But Maybe it can be?
|
||||||
if MumbleUser.objects.get(user_id=id - MumbleServerServer.objects.get(id=1).offset).username == "SuperUser":
|
if MumbleUser.objects.get(user_id=id - MumbleServerServer.objects.get(id=1).offset).username == "SuperUser":
|
||||||
logger.debug('idToName %d -> "SuperUser" caught')
|
logger.debug('idToName %d -> "SuperUser" caught')
|
||||||
return "" # FALL_THROUGH
|
return "" # FALL_THROUGH
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
from typing import LiteralString
|
|
||||||
from allianceauth.eveonline.models import EveCharacter
|
from allianceauth.eveonline.models import EveCharacter
|
||||||
from allianceauth.services.hooks import NameFormatter
|
from allianceauth.services.hooks import NameFormatter
|
||||||
from passlib.hash import bcrypt_sha256
|
from passlib.hash import bcrypt_sha256
|
||||||
@ -50,6 +49,11 @@ class MumbleUser(AbstractServiceModel):
|
|||||||
blank=True, null=True, editable=False,
|
blank=True, null=True, editable=False,
|
||||||
help_text="Timestamp of the users Last Disconnection from Mumble")
|
help_text="Timestamp of the users Last Disconnection from Mumble")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def display_name(self) -> str:
|
||||||
|
from .auth_hooks import MumbleService
|
||||||
|
return NameFormatter(MumbleService(), self.user).format_name()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_username(user) -> str:
|
def get_username(user) -> str:
|
||||||
return user.profile.main_character.character_name # main character as the user.username may be incorrect
|
return user.profile.main_character.character_name # main character as the user.username may be incorrect
|
||||||
@ -97,13 +101,6 @@ class MumbleUser(AbstractServiceModel):
|
|||||||
groups_str.append(str(group.name))
|
groups_str.append(str(group.name))
|
||||||
return ','.join({g.replace(' ', '-') for g in groups_str})
|
return ','.join({g.replace(' ', '-') for g in groups_str})
|
||||||
|
|
||||||
def get_display_name(self) -> str:
|
|
||||||
from .auth_hooks import MumbleService
|
|
||||||
return NameFormatter(MumbleService(), self.user).format_name()
|
|
||||||
|
|
||||||
def display_name(self) -> str:
|
|
||||||
return self.get_display_name()
|
|
||||||
|
|
||||||
def create(self, user):
|
def create(self, user):
|
||||||
try:
|
try:
|
||||||
username = self.get_username(user)
|
username = self.get_username(user)
|
||||||
@ -146,13 +143,16 @@ class TempLink(models.Model):
|
|||||||
|
|
||||||
|
|
||||||
class TempUser(models.Model):
|
class TempUser(models.Model):
|
||||||
|
class HashFunction(models.TextChoices):
|
||||||
|
SHA256 = 'bcrypt-sha256', _('SHA256')
|
||||||
|
SHA1 = 'sha1', _('SHA1')
|
||||||
name = models.CharField(max_length=200) # Display name to show
|
name = models.CharField(max_length=200) # Display name to show
|
||||||
username = models.CharField(max_length=254, unique=True)
|
username = models.CharField(max_length=254, unique=True)
|
||||||
pwhash = models.CharField(max_length=90)
|
pwhash = models.CharField(max_length=90)
|
||||||
hashfn = models.CharField(
|
hashfn = models.CharField(
|
||||||
max_length=15,
|
max_length=15,
|
||||||
choices=MumbleUser.HashFunction.choices,
|
choices=HashFunction.choices,
|
||||||
default=MumbleUser.HashFunction.SHA256)
|
default=HashFunction.SHA256)
|
||||||
certhash = models.CharField(
|
certhash = models.CharField(
|
||||||
verbose_name="Certificate Hash",
|
verbose_name="Certificate Hash",
|
||||||
max_length=254,blank=True, null=True, editable=False,
|
max_length=254,blank=True, null=True, editable=False,
|
||||||
@ -178,9 +178,40 @@ class TempUser(models.Model):
|
|||||||
templink = models.ForeignKey(TempLink, on_delete=models.CASCADE, null=True, default=None)
|
templink = models.ForeignKey(TempLink, on_delete=models.CASCADE, null=True, default=None)
|
||||||
character_id = models.IntegerField(default=None, blank=True, null=True)
|
character_id = models.IntegerField(default=None, blank=True, null=True)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def display_name(self) -> str:
|
||||||
|
from .auth_hooks import MumbleService
|
||||||
|
return NameFormatter(MumbleService(), self.user).format_name()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_username(user) -> str:
|
||||||
|
return user.profile.main_character.character_name # main character as the user.username may be incorrect
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def sanitise_username(username) -> str:
|
||||||
|
return username.replace(" ", "_")
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def generate_random_pass() -> str:
|
||||||
|
return ''.join([random.choice(string.ascii_letters + string.digits) for n in range(16)])
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def gen_pwhash(password) -> str:
|
||||||
|
return bcrypt_sha256.encrypt(password.encode('utf-8'))
|
||||||
|
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return f"Temp User: {self.username} - {self.name}"
|
return f"Temp User: {self.username} - {self.name}"
|
||||||
|
|
||||||
|
def group_string(self) -> str:
|
||||||
|
"""Overwritten from MumbleUser, we could add features to this in the future
|
||||||
|
"""
|
||||||
|
return str(["Guest"])
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = _("Temp User")
|
||||||
|
verbose_name_plural = _("Temp Users")
|
||||||
|
permissions = ()
|
||||||
|
|
||||||
|
|
||||||
class IdlerHandler(models.Model):
|
class IdlerHandler(models.Model):
|
||||||
name = models.CharField(_("Name"), max_length=50)
|
name = models.CharField(_("Name"), max_length=50)
|
||||||
|
@ -11,9 +11,9 @@
|
|||||||
{% endblock header_nav_brand %}
|
{% endblock header_nav_brand %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="allianceauth-mumbletemps">
|
<div class="allianceauth-mumble">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
{% block mumbletemps %}{% endblock %}
|
{% block mumble %}{% endblock mumble %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
{% extends "mumbletemps/base.html" %}
|
{% extends "services/mumble/base.html" %}
|
||||||
|
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load humanize %}
|
{% load humanize %}
|
||||||
{% load timetags %}
|
|
||||||
|
|
||||||
{% block mumbletemps %}
|
{% block mumble %}
|
||||||
<div class="col-md-6 mb-2">
|
<div class="col-md-6 mb-2">
|
||||||
<div class="card h-100">
|
<div class="card h-100">
|
||||||
<div class="card-header bg-warning">
|
<div class="card-header bg-warning">
|
||||||
@ -13,20 +12,29 @@
|
|||||||
|
|
||||||
<div class="card-body text-center">
|
<div class="card-body text-center">
|
||||||
<p>
|
<p>
|
||||||
{% translate 'Temp Links Give Access to mumble with the <b class="text-success">Guest</b> Group for the preset time.' %}
|
{% blocktranslate trimmed with bold_start="<b>" bold_end="</b>" %}
|
||||||
|
Temp Links Give Access to mumble with the {{ bold_start }}Guest{{ bold_end }} Group for the preset time
|
||||||
|
{% endblocktranslate %}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
{% translate 'Connected users <b class="text-warning">will not</b> be kicked at the end of this period.' %}
|
{% blocktranslate trimmed with bold_start="<b class='text-warning'>" bold_end="</b>" %}
|
||||||
|
Connected users {{ bold_start }}will not{{ bold_end }} be kicked at the end of this period.
|
||||||
|
{% endblocktranslate %}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
{% translate 'Templink users can be kicked in mumble by typing <span class="badge bg-danger">!kicktemps</span> in mumble chat.' %}
|
{% blocktranslate trimmed with badge_start="<span class='badge bg-danger'>" badge_end="</span>" %}
|
||||||
|
Templink users can be kicked in mumble by typing {{ badge_start }}!kicktemps{{ badge_end }} in mumble chat.
|
||||||
|
{% endblocktranslate %}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
{% translate 'There are <b class="text-warning">no restrictions</b> on who or how many can use a templink, share wisely.' %}
|
{% blocktranslate trimmed with bold_start="<b class='text-warning'>" bold_end="</b>" %}
|
||||||
|
There are {{ bold_start }}no restrictions{{ bold_end }} on who or how many can use a templink, share wisely.
|
||||||
|
{% endblocktranslate %}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -40,7 +48,7 @@
|
|||||||
<div class="card-body text-center">
|
<div class="card-body text-center">
|
||||||
<p>{% translate "Your link will be displayed on the next page for an easy copy and paste." %}</p>
|
<p>{% translate "Your link will be displayed on the next page for an easy copy and paste." %}</p>
|
||||||
|
|
||||||
<form action="{% url 'mumbletemps:index' %}" method="post">
|
<form action="{% url 'mumble:index' %}" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
@ -71,9 +79,9 @@
|
|||||||
{% translate "Expires in" %}: <span id="countdown{{ tl.link_ref }}hot"></span>
|
{% translate "Expires in" %}: <span id="countdown{{ tl.link_ref }}hot"></span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>{{ SITE_URL }}{% url 'mumbletemps:join' tl.link_ref %}</pre>
|
<pre>{{ SITE_URL }}{% url 'mumble:join' tl.link_ref %}</pre>
|
||||||
|
|
||||||
<button class="btn btn-info" id="clipboard-new" data-clipboard-text="{{ SITE_URL }}{% url 'mumbletemps:join' tl.link_ref %}">
|
<button class="btn btn-info" id="clipboard-new" data-clipboard-text="{{ SITE_URL }}{% url 'mumble:join' tl.link_ref %}">
|
||||||
{% translate "Copy to Clipboard!" %}
|
{% translate "Copy to Clipboard!" %}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@ -116,13 +124,13 @@
|
|||||||
<td class="text-center">
|
<td class="text-center">
|
||||||
<button class="btn btn-info"
|
<button class="btn btn-info"
|
||||||
id="clipboard-{{ lnk.link_ref }}"
|
id="clipboard-{{ lnk.link_ref }}"
|
||||||
data-clipboard-text="{{ SITE_URL }}{% url 'mumbletemps:join' lnk.link_ref %}">
|
data-clipboard-text="{{ SITE_URL }}{% url 'mumble:join' lnk.link_ref %}">
|
||||||
{% translate "Copy to Clipboard!" %}
|
{% translate "Copy to Clipboard!" %}
|
||||||
</button>
|
</button>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td class="text-center">
|
<td class="text-center">
|
||||||
<a class="btn btn-danger" href="{% url 'mumbletemps:nuke' lnk.link_ref %}">{% translate "Nuke Link!" %}</a>
|
<a class="btn btn-danger" href="{% url 'mumble:nuke' lnk.link_ref %}">{% translate "Nuke Link!" %}</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@ -162,7 +170,7 @@
|
|||||||
<td class="text-center">{{ lnk.link_ref }}</td>
|
<td class="text-center">{{ lnk.link_ref }}</td>
|
||||||
|
|
||||||
<td class="text-center">
|
<td class="text-center">
|
||||||
<a class="btn btn-danger" href="{% url 'mumbletemps:nuke' lnk.link_ref %}">{% translate "Nuke Link!" %}</a>
|
<a class="btn btn-danger" href="{% url 'mumble:nuke' lnk.link_ref %}">{% translate "Nuke Link!" %}</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@ -172,103 +180,18 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endblock mumbletemps %}
|
{% endblock mumble %}
|
||||||
|
|
||||||
{% block extra_javascript %}
|
{% block extra_javascript %}
|
||||||
{% include 'bundles/clipboard-js.html' %}
|
{% include "bundles/clipboard-js.html" %}
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
/* global ClipboardJS, moment */
|
/* global ClipboardJS */
|
||||||
const clipboard = new ClipboardJS('#clipboard-new');
|
const clipboard = new ClipboardJS('#clipboard-new');
|
||||||
|
|
||||||
{
|
{% for lnk in tl_list %}
|
||||||
%
|
const lnk{{ lnk.link_ref }} = new ClipboardJS('#clipboard-{{ lnk.link_ref }}');
|
||||||
for lnk in tl_list %
|
{% endfor %}
|
||||||
}
|
|
||||||
const lnk {
|
|
||||||
{
|
|
||||||
lnk.link_ref
|
|
||||||
}
|
|
||||||
} = new ClipboardJS('#clipboard-{{ lnk.link_ref }}'); {
|
|
||||||
% endfor %
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{% include "bundles/moment-js.html" with locale=True %}
|
|
||||||
{% include "bundles/timers-js.html" %}
|
|
||||||
|
|
||||||
<script>
|
|
||||||
const locale = '{{ LANGUAGE_CODE }}';
|
|
||||||
|
|
||||||
const timers = [{
|
|
||||||
%
|
|
||||||
for lnk in tl_list %
|
|
||||||
} {
|
|
||||||
'id': "{{ lnk.link_ref }}",
|
|
||||||
'targetDate': moment("{{ lnk.expires|print_timestamp| date:"
|
|
||||||
c " }}"),
|
|
||||||
'expired': false
|
|
||||||
}, {
|
|
||||||
% endfor %
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
%
|
|
||||||
if tl %
|
|
||||||
} {
|
|
||||||
'id': "{{ tl.link_ref }}hot",
|
|
||||||
'targetDate': moment('{{ tl.expires|print_timestamp| date:"c" }}'),
|
|
||||||
'expired': false
|
|
||||||
}, {
|
|
||||||
% endif %
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
moment.locale(locale);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update a timer
|
|
||||||
*
|
|
||||||
* @param timer
|
|
||||||
*/
|
|
||||||
const updateTimer = (timer) => {
|
|
||||||
if (timer.targetDate.isAfter(Date.now())) {
|
|
||||||
const duration = moment.duration(timer.targetDate - moment(), 'milliseconds');
|
|
||||||
|
|
||||||
document.getElementById('countdown' + timer.id).innerHTML = getDurationString(duration);
|
|
||||||
} else {
|
|
||||||
timer.expired = true;
|
|
||||||
|
|
||||||
document.getElementById('countdown' + timer.id).innerHTML = '';
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update all timers
|
|
||||||
*/
|
|
||||||
const updateAllTimers = () => {
|
|
||||||
const l = timers.length;
|
|
||||||
|
|
||||||
for (let i = 0; i < l; ++i) {
|
|
||||||
if (timers[i].expired) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateTimer(timers[i]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Timed update function
|
|
||||||
*/
|
|
||||||
const timedUpdate = () => {
|
|
||||||
updateAllTimers();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Set initial values
|
|
||||||
timedUpdate();
|
|
||||||
|
|
||||||
// Start timed updates
|
|
||||||
setInterval(timedUpdate, 1000);
|
|
||||||
</script>
|
|
||||||
{% endblock extra_javascript %}
|
{% endblock extra_javascript %}
|
||||||
|
@ -1,19 +1,18 @@
|
|||||||
{% extends "mumbletemps/base.html" %}
|
{% extends "services/mumble/base.html" %}
|
||||||
|
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load timetags %}
|
|
||||||
|
|
||||||
{% block mumbletemps %}
|
{% block mumble %}
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<p>
|
<p>
|
||||||
<img class="ra-avatar img-circle" src="{{ link.creator.portrait_url_128 }}" alt="{{ link.creator.character_name }}" />
|
<img class="ra-avatar img-circle" src="{{ link.creator.portrait_url_128 }}" alt="{{ link.creator.character_name }}" />
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h4>
|
<h4>
|
||||||
{% blocktranslate with character=link.creator.character_name %}
|
{% blocktranslatelate with character=link.creator.character_name %}
|
||||||
{{ character }} has invited you to join Mumble!
|
{{ character }} has invited you to join Mumble!
|
||||||
{% endblocktranslate %}
|
{% endblocktranslatelate %}
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@ -25,7 +24,7 @@
|
|||||||
|
|
||||||
<p>
|
<p>
|
||||||
<a class="btn btn-primary" href="mumble://{{ connect_url }}">
|
<a class="btn btn-primary" href="mumble://{{ connect_url }}">
|
||||||
<img src="{% static 'mumbletemps/images/mumble-icon.png' %}" alt="{% translate 'Mumble' %}" height="64" width="64" style="margin: 15px" />
|
<img src="{% static 'services/mumble/images/mumble-icon.png' %}" alt="{% translate 'Mumble' %}" height="64" width="64" style="margin: 15px" />
|
||||||
|
|
||||||
<span style="margin: 15px;">
|
<span style="margin: 15px;">
|
||||||
{% translate "Click to Join Mumble as" %}: <b>{{ temp_user.name }}</b>
|
{% translate "Click to Join Mumble as" %}: <b>{{ temp_user.name }}</b>
|
||||||
@ -67,7 +66,7 @@
|
|||||||
const locale = '{{ LANGUAGE_CODE }}';
|
const locale = '{{ LANGUAGE_CODE }}';
|
||||||
const timers = [{
|
const timers = [{
|
||||||
'id': '{{ link.link_ref }}',
|
'id': '{{ link.link_ref }}',
|
||||||
'targetDate': moment('{{ link.expires|print_timestamp| date:"c" }}'),
|
'targetDate': moment('{{ link.expires| date:"c" }}'),
|
||||||
'expired': false
|
'expired': false
|
||||||
}];
|
}];
|
||||||
|
|
||||||
@ -118,4 +117,4 @@
|
|||||||
// Start timed updates
|
// Start timed updates
|
||||||
setInterval(timedUpdate, 1000);
|
setInterval(timedUpdate, 1000);
|
||||||
</script>
|
</script>
|
||||||
{% endblock mumbletemps %}
|
{% endblock mumble %}
|
||||||
|
@ -1,20 +1,19 @@
|
|||||||
{% extends "mumbletemps/base.html" %}
|
{% extends "services/mumble/base.html" %}
|
||||||
|
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load timetags %}
|
|
||||||
|
|
||||||
{% block mumbletemps %}
|
{% block mumble %}
|
||||||
<div class="col-md-12 text-center">
|
<div class="col-md-12 text-center">
|
||||||
<div class="mumbletemps-sso-login mb-3">
|
<div class="mumble-sso-login mb-3">
|
||||||
<p>
|
<p>
|
||||||
<img class="ra-avatar img-circle" src="{{ link.creator.portrait_url_128 }}" alt="{{ link.creator.character_name }}" />
|
<img class="ra-avatar img-circle" src="{{ link.creator.portrait_url_128 }}" alt="{{ link.creator.character_name }}" />
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h4>
|
<h4>
|
||||||
{% blocktranslate with character=link.creator.character_name %}
|
{% blocktranslatelate with character=link.creator.character_name %}
|
||||||
{{ character }} has invited you to join Mumble!
|
{{ character }} has invited you to join Mumble!
|
||||||
{% endblocktranslate %}
|
{% endblocktranslatelate %}
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@ -24,7 +23,7 @@
|
|||||||
<span class="label label-info">{% translate "Link Ref" %}: {{ link.link_ref }}</span>
|
<span class="label label-info">{% translate "Link Ref" %}: {{ link.link_ref }}</span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<form action="{% url 'mumbletemps:join' link.link_ref %}" method="post">
|
<form action="{% url 'mumble:join' link.link_ref %}" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
|
||||||
<input type="hidden" name="sso" value="True" />
|
<input type="hidden" name="sso" value="True" />
|
||||||
@ -37,7 +36,7 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mumbletemps-non-sso-login">
|
<div class="mumble-non-sso-login">
|
||||||
<div class="row justify-content-center">
|
<div class="row justify-content-center">
|
||||||
<div class="col-md-10 col-lg-8">
|
<div class="col-md-10 col-lg-8">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
@ -47,7 +46,7 @@
|
|||||||
|
|
||||||
<div class="card-body text-start">
|
<div class="card-body text-start">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<form action="{% url 'mumbletemps:join' link.link_ref %}" method="post">
|
<form action="{% url 'mumble:join' link.link_ref %}" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
|
||||||
<input type="hidden" name="sso" value="False" />
|
<input type="hidden" name="sso" value="False" />
|
||||||
@ -86,7 +85,7 @@
|
|||||||
const locale = '{{ LANGUAGE_CODE }}';
|
const locale = '{{ LANGUAGE_CODE }}';
|
||||||
const timers = [{
|
const timers = [{
|
||||||
'id': '{{ link.link_ref }}',
|
'id': '{{ link.link_ref }}',
|
||||||
'targetDate': moment('{{ link.expires|print_timestamp| date:"c" }}'),
|
'targetDate': moment('{{ link.expires| date:"c" }}'),
|
||||||
'expired': false
|
'expired': false
|
||||||
}];
|
}];
|
||||||
|
|
||||||
@ -137,4 +136,4 @@
|
|||||||
// Start timed updates
|
// Start timed updates
|
||||||
setInterval(timedUpdate, 1000);
|
setInterval(timedUpdate, 1000);
|
||||||
</script>
|
</script>
|
||||||
{% endblock mumbletemps %}
|
{% endblock mumble %}
|
||||||
|
@ -64,15 +64,17 @@ def connection_history(request) -> HttpResponse:
|
|||||||
@login_required
|
@login_required
|
||||||
@permission_required("mumble.view_connection_history")
|
@permission_required("mumble.view_connection_history")
|
||||||
def connection_history_data(request) -> JsonResponse:
|
def connection_history_data(request) -> JsonResponse:
|
||||||
connection_history_data = MumbleUser.objects.all(
|
users = MumbleUser.objects.all()
|
||||||
).values(
|
connection_history_data = []
|
||||||
'user',
|
for user in users:
|
||||||
'display_name',
|
connection_history_data.append({
|
||||||
'release',
|
'user': str(user),
|
||||||
'version',
|
'display_name': user.display_name,
|
||||||
'last_connect',
|
'release': user.release,
|
||||||
'last_disconnect',
|
'version': user.version,
|
||||||
)
|
'last_connect': user.last_connect,
|
||||||
|
'last_disconnect': user.last_disconnect,
|
||||||
|
})
|
||||||
|
|
||||||
return JsonResponse({"connection_history_data": list(connection_history_data)})
|
return JsonResponse({"connection_history_data": list(connection_history_data)})
|
||||||
|
|
||||||
@ -110,7 +112,7 @@ class PseudoUser:
|
|||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@permission_required("mumbletemps.create_new_links")
|
@permission_required("mumble.create_new_links")
|
||||||
def index(request):
|
def index(request):
|
||||||
tl = None
|
tl = None
|
||||||
|
|
||||||
@ -118,11 +120,10 @@ def index(request):
|
|||||||
duration = request.POST.get("time")
|
duration = request.POST.get("time")
|
||||||
|
|
||||||
if duration in ["3", "6", "12", "24"]:
|
if duration in ["3", "6", "12", "24"]:
|
||||||
expiry = datetime.now().replace(tzinfo=timezone.utc) + timedelta(hours=int(duration))
|
|
||||||
tl = TempLink.objects.create(
|
tl = TempLink.objects.create(
|
||||||
creator=request.user.profile.main_character,
|
creator=request.user.profile.main_character,
|
||||||
link_ref=get_random_string(15),
|
link_ref=get_random_string(15),
|
||||||
expires=expiry.timestamp(),
|
expires=datetime.now(timezone.utc) + timedelta(hours=int(duration))
|
||||||
)
|
)
|
||||||
tl.save()
|
tl.save()
|
||||||
|
|
||||||
@ -137,7 +138,7 @@ def index(request):
|
|||||||
}
|
}
|
||||||
|
|
||||||
return render(
|
return render(
|
||||||
request=request, template_name="mumbletemps/index.html", context=context
|
request=request, template_name="services/mumble/index.html", context=context
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -170,7 +171,7 @@ def link(request, link_ref):
|
|||||||
context = {"link": templink}
|
context = {"link": templink}
|
||||||
|
|
||||||
return render(
|
return render(
|
||||||
request=request, template_name="mumbletemps/login.html", context=context
|
request=request, template_name="services/mumble/login.html", context=context
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -204,7 +205,7 @@ def link_username(request, name, association, link):
|
|||||||
}
|
}
|
||||||
|
|
||||||
return render(
|
return render(
|
||||||
request=request, template_name="mumbletemps/link.html", context=context
|
request=request, template_name="services/mumble/link.html", context=context
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -246,12 +247,12 @@ def link_sso(request, token, link):
|
|||||||
}
|
}
|
||||||
|
|
||||||
return render(
|
return render(
|
||||||
request=request, template_name="mumbletemps/link.html", context=context
|
request=request, template_name="services/mumble/link.html", context=context
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@permission_required("mumbletemps.create_new_links")
|
@permission_required("mumble.create_new_links")
|
||||||
def nuke(request, link_ref):
|
def nuke(request, link_ref):
|
||||||
try:
|
try:
|
||||||
TempLink.objects.get(link_ref=link_ref).delete()
|
TempLink.objects.get(link_ref=link_ref).delete()
|
||||||
@ -262,4 +263,4 @@ def nuke(request, link_ref):
|
|||||||
messages.error(request=request, message=f"Deleted Token {link_ref}")
|
messages.error(request=request, message=f"Deleted Token {link_ref}")
|
||||||
pass # Crappy link
|
pass # Crappy link
|
||||||
|
|
||||||
return redirect(to="mumbletemps:index")
|
return redirect(to="mumble:index")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user