Compare commits

..

No commits in common. "d68d75bd05939ecfa8253d5f21bf5013c5e1467e" and "baf3c85ac7b8746c6051c61597fd72c722a4a198" have entirely different histories.

7 changed files with 172 additions and 162 deletions

View File

@ -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 import django # noqa
from django.utils.datetime_safe import datetime import os # noqa
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") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myauth.settings.local") # noqa
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true" os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true" # noqa
django.setup() django.setup() # noqa
from django.utils.datetime_safe import datetime
from allianceauth import __version__ # noqa from allianceauth import __version__
from allianceauth.services.modules.mumble.models import MumbleServerServer, MumbleUser, TempUser # noqa from allianceauth.services.modules.mumble.models import MumbleServerServer, MumbleUser
def main() -> None: def main() -> None:
@ -293,48 +293,22 @@ 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 MumbleUser.DoesNotExist as a: except Exception as e:
try: logger.error(e)
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 MumbleUser.DoesNotExist as a: except Exception as e:
try: logger.error(e)
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:
if text_message.text == "!kicktemps": pass
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
@ -366,16 +340,13 @@ 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:
try: return (-2, None, None)
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.display_name} {mumble_user.user_id + MumbleServerServer.objects.get(id=1).offset}') logger.info(f'User authenticated: {mumble_user.get_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.display_name, mumble_user.group_string()) return (mumble_user.user_id + MumbleServerServer.objects.get(id=1).offset, mumble_user.get_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)
@ -403,10 +374,7 @@ 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:
try: return -2 # FALL_THROUGH
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
@ -419,17 +387,12 @@ 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:
try: return "" # FALL_THROUGH
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

View File

@ -1,5 +1,6 @@
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
@ -49,11 +50,6 @@ 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
@ -101,6 +97,13 @@ 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)
@ -143,16 +146,13 @@ 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=HashFunction.choices, choices=MumbleUser.HashFunction.choices,
default=HashFunction.SHA256) default=MumbleUser.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,40 +178,9 @@ 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)

View File

@ -11,9 +11,9 @@
{% endblock header_nav_brand %} {% endblock header_nav_brand %}
{% block content %} {% block content %}
<div class="allianceauth-mumble"> <div class="allianceauth-mumbletemps">
<div class="row"> <div class="row">
{% block mumble %}{% endblock mumble %} {% block mumbletemps %}{% endblock %}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -1,9 +1,10 @@
{% extends "services/mumble/base.html" %} {% extends "mumbletemps/base.html" %}
{% load i18n %} {% load i18n %}
{% load humanize %} {% load humanize %}
{% load timetags %}
{% block mumble %} {% block mumbletemps %}
<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">
@ -12,29 +13,20 @@
<div class="card-body text-center"> <div class="card-body text-center">
<p> <p>
{% blocktranslate trimmed with bold_start="<b>" bold_end="</b>" %} {% translate 'Temp Links Give Access to mumble with the <b class="text-success">Guest</b> Group for the preset time.' %}
Temp Links Give Access to mumble with the {{ bold_start }}Guest{{ bold_end }} Group for the preset time
{% endblocktranslate %}
</p> </p>
<p> <p>
{% blocktranslate trimmed with bold_start="<b class='text-warning'>" bold_end="</b>" %} {% translate 'Connected users <b class="text-warning">will not</b> be kicked at the end of this period.' %}
Connected users {{ bold_start }}will not{{ bold_end }} be kicked at the end of this period.
{% endblocktranslate %}
</p> </p>
<p> <p>
{% blocktranslate trimmed with badge_start="<span class='badge bg-danger'>" badge_end="</span>" %} {% translate 'Templink users can be kicked in mumble by typing <span class="badge bg-danger">!kicktemps</span> in mumble chat.' %}
Templink users can be kicked in mumble by typing {{ badge_start }}!kicktemps{{ badge_end }} in mumble chat.
{% endblocktranslate %}
</p> </p>
<p> <p>
{% blocktranslate trimmed with bold_start="<b class='text-warning'>" bold_end="</b>" %} {% translate 'There are <b class="text-warning">no restrictions</b> on who or how many can use a templink, share wisely.' %}
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>
@ -48,7 +40,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 'mumble:index' %}" method="post"> <form action="{% url 'mumbletemps:index' %}" method="post">
{% csrf_token %} {% csrf_token %}
<div class="mb-3"> <div class="mb-3">
@ -79,9 +71,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 'mumble:join' tl.link_ref %}</pre> <pre>{{ SITE_URL }}{% url 'mumbletemps:join' tl.link_ref %}</pre>
<button class="btn btn-info" id="clipboard-new" data-clipboard-text="{{ SITE_URL }}{% url 'mumble:join' tl.link_ref %}"> <button class="btn btn-info" id="clipboard-new" data-clipboard-text="{{ SITE_URL }}{% url 'mumbletemps:join' tl.link_ref %}">
{% translate "Copy to Clipboard!" %} {% translate "Copy to Clipboard!" %}
</button> </button>
</div> </div>
@ -124,13 +116,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 'mumble:join' lnk.link_ref %}"> data-clipboard-text="{{ SITE_URL }}{% url 'mumbletemps: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 'mumble:nuke' lnk.link_ref %}">{% translate "Nuke Link!" %}</a> <a class="btn btn-danger" href="{% url 'mumbletemps:nuke' lnk.link_ref %}">{% translate "Nuke Link!" %}</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
@ -170,7 +162,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 'mumble:nuke' lnk.link_ref %}">{% translate "Nuke Link!" %}</a> <a class="btn btn-danger" href="{% url 'mumbletemps:nuke' lnk.link_ref %}">{% translate "Nuke Link!" %}</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
@ -180,18 +172,103 @@
</div> </div>
</div> </div>
{% endif %} {% endif %}
{% endblock mumble %} {% endblock mumbletemps %}
{% block extra_javascript %} {% block extra_javascript %}
{% include "bundles/clipboard-js.html" %} {% include 'bundles/clipboard-js.html' %}
<script> <script>
/* global ClipboardJS */ /* global ClipboardJS, moment */
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 }}'); %
{% endfor %} for lnk in tl_list %
}
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 %}

View File

@ -1,18 +1,19 @@
{% extends "services/mumble/base.html" %} {% extends "mumbletemps/base.html" %}
{% load static %} {% load static %}
{% load i18n %} {% load i18n %}
{% load timetags %}
{% block mumble %} {% block mumbletemps %}
<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>
{% blocktranslatelate with character=link.creator.character_name %} {% blocktranslate with character=link.creator.character_name %}
{{ character }} has invited you to join Mumble! {{ character }} has invited you to join Mumble!
{% endblocktranslatelate %} {% endblocktranslate %}
</h4> </h4>
<p> <p>
@ -24,7 +25,7 @@
<p> <p>
<a class="btn btn-primary" href="mumble://{{ connect_url }}"> <a class="btn btn-primary" href="mumble://{{ connect_url }}">
<img src="{% static 'services/mumble/images/mumble-icon.png' %}" alt="{% translate 'Mumble' %}" height="64" width="64" style="margin: 15px" /> <img src="{% static 'mumbletemps/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>
@ -66,7 +67,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| date:"c" }}'), 'targetDate': moment('{{ link.expires|print_timestamp| date:"c" }}'),
'expired': false 'expired': false
}]; }];
@ -117,4 +118,4 @@
// Start timed updates // Start timed updates
setInterval(timedUpdate, 1000); setInterval(timedUpdate, 1000);
</script> </script>
{% endblock mumble %} {% endblock mumbletemps %}

View File

@ -1,19 +1,20 @@
{% extends "services/mumble/base.html" %} {% extends "mumbletemps/base.html" %}
{% load static %} {% load static %}
{% load i18n %} {% load i18n %}
{% load timetags %}
{% block mumble %} {% block mumbletemps %}
<div class="col-md-12 text-center"> <div class="col-md-12 text-center">
<div class="mumble-sso-login mb-3"> <div class="mumbletemps-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>
{% blocktranslatelate with character=link.creator.character_name %} {% blocktranslate with character=link.creator.character_name %}
{{ character }} has invited you to join Mumble! {{ character }} has invited you to join Mumble!
{% endblocktranslatelate %} {% endblocktranslate %}
</h4> </h4>
<p> <p>
@ -23,7 +24,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 'mumble:join' link.link_ref %}" method="post"> <form action="{% url 'mumbletemps:join' link.link_ref %}" method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="sso" value="True" /> <input type="hidden" name="sso" value="True" />
@ -36,7 +37,7 @@
</form> </form>
</div> </div>
<div class="mumble-non-sso-login"> <div class="mumbletemps-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">
@ -46,7 +47,7 @@
<div class="card-body text-start"> <div class="card-body text-start">
<div class="form-group"> <div class="form-group">
<form action="{% url 'mumble:join' link.link_ref %}" method="post"> <form action="{% url 'mumbletemps:join' link.link_ref %}" method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="sso" value="False" /> <input type="hidden" name="sso" value="False" />
@ -85,7 +86,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| date:"c" }}'), 'targetDate': moment('{{ link.expires|print_timestamp| date:"c" }}'),
'expired': false 'expired': false
}]; }];
@ -136,4 +137,4 @@
// Start timed updates // Start timed updates
setInterval(timedUpdate, 1000); setInterval(timedUpdate, 1000);
</script> </script>
{% endblock mumble %} {% endblock mumbletemps %}

View File

@ -64,17 +64,15 @@ 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:
users = MumbleUser.objects.all() connection_history_data = MumbleUser.objects.all(
connection_history_data = [] ).values(
for user in users: 'user',
connection_history_data.append({ 'display_name',
'user': str(user), 'release',
'display_name': user.display_name, 'version',
'release': user.release, 'last_connect',
'version': user.version, 'last_disconnect',
'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)})
@ -112,7 +110,7 @@ class PseudoUser:
@login_required @login_required
@permission_required("mumble.create_new_links") @permission_required("mumbletemps.create_new_links")
def index(request): def index(request):
tl = None tl = None
@ -120,10 +118,11 @@ 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=datetime.now(timezone.utc) + timedelta(hours=int(duration)) expires=expiry.timestamp(),
) )
tl.save() tl.save()
@ -138,7 +137,7 @@ def index(request):
} }
return render( return render(
request=request, template_name="services/mumble/index.html", context=context request=request, template_name="mumbletemps/index.html", context=context
) )
@ -171,7 +170,7 @@ def link(request, link_ref):
context = {"link": templink} context = {"link": templink}
return render( return render(
request=request, template_name="services/mumble/login.html", context=context request=request, template_name="mumbletemps/login.html", context=context
) )
@ -205,7 +204,7 @@ def link_username(request, name, association, link):
} }
return render( return render(
request=request, template_name="services/mumble/link.html", context=context request=request, template_name="mumbletemps/link.html", context=context
) )
@ -247,12 +246,12 @@ def link_sso(request, token, link):
} }
return render( return render(
request=request, template_name="services/mumble/link.html", context=context request=request, template_name="mumbletemps/link.html", context=context
) )
@login_required @login_required
@permission_required("mumble.create_new_links") @permission_required("mumbletemps.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()
@ -263,4 +262,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="mumble:index") return redirect(to="mumbletemps:index")