mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-13 22:40:16 +02:00
Merge master.
Fix FAT statistics generation.
This commit is contained in:
commit
96b04a269d
@ -458,10 +458,10 @@ SMF_DB = {
|
|||||||
# FLEETUP_API_ID - The API id from http://fleet-up.com/Api/MyKeys
|
# FLEETUP_API_ID - The API id from http://fleet-up.com/Api/MyKeys
|
||||||
# FLEETUP_GROUP_ID - The id of the group you want to pull data from, see http://fleet-up.com/Api/Endpoints#groups_mygroupmemberships
|
# FLEETUP_GROUP_ID - The id of the group you want to pull data from, see http://fleet-up.com/Api/Endpoints#groups_mygroupmemberships
|
||||||
######################################
|
######################################
|
||||||
FLEETUP_APP_KEY = ''
|
FLEETUP_APP_KEY = os.environ.get('AA_FLEETUP_APP_KEY', '')
|
||||||
FLEETUP_USER_ID = ''
|
FLEETUP_USER_ID = os.environ.get('AA_FLEETUP_USER_ID', '')
|
||||||
FLEETUP_API_ID = ''
|
FLEETUP_API_ID = os.environ.get('AA_FLEETUP_API_ID', '')
|
||||||
FLEETUP_GROUP_ID = ''
|
FLEETUP_GROUP_ID = os.environ.get('AA_FLEETUP_GROUP_ID', '')
|
||||||
|
|
||||||
#####################################################
|
#####################################################
|
||||||
##
|
##
|
||||||
|
@ -68,6 +68,7 @@ If using Openfire, the following need to be set in accordance with the [install
|
|||||||
- [BROADCAST_USER](#broadcast-user)
|
- [BROADCAST_USER](#broadcast-user)
|
||||||
- [BROADCAST_USER_PASSWORD](#broadcast-user-password)
|
- [BROADCAST_USER_PASSWORD](#broadcast-user-password)
|
||||||
- [BROADCAST_SERVICE_NAME](#broadcast-service-name)
|
- [BROADCAST_SERVICE_NAME](#broadcast-service-name)
|
||||||
|
- [BROADCAST_IGNORE_INVALID_CERT](#broadcast-ignore-invalid-cert)
|
||||||
|
|
||||||
### Mumble
|
### Mumble
|
||||||
If using Mumble, the following needs to be set to the address of the mumble server:
|
If using Mumble, the following needs to be set to the address of the mumble server:
|
||||||
@ -136,6 +137,13 @@ Fittings and operations can be imported from Fleet-Up. Define the following to d
|
|||||||
- [FLEETUP_API_ID](#fleetup-api-id)
|
- [FLEETUP_API_ID](#fleetup-api-id)
|
||||||
- [FLEETUP_GROUP_ID](#fleetup-group-id)
|
- [FLEETUP_GROUP_ID](#fleetup-group-id)
|
||||||
|
|
||||||
|
### CAPTCHA
|
||||||
|
To help prevent bots from registering and brute forcing the login. Get the reCaptcha keys from [here](https://www.google.com/recaptcha/intro/index.html)
|
||||||
|
- [CAPTCHA_ENABLED](#captcha_enabled)
|
||||||
|
- [RECAPTCHA_PUBLIC_KEY](#recaptcha_public_key)
|
||||||
|
- [RECAPTCHA_PRIVATE_KEY](#recaptcha_private_key)
|
||||||
|
- [NOCAPTCHA](#nocaptcha)
|
||||||
|
|
||||||
# Description of Settings
|
# Description of Settings
|
||||||
## Django
|
## Django
|
||||||
### SECRET_KEY
|
### SECRET_KEY
|
||||||
@ -150,6 +158,14 @@ List of databases available. Contains the Django database, and may include servi
|
|||||||
Friendly name of the local language.
|
Friendly name of the local language.
|
||||||
### TIME_ZONE
|
### TIME_ZONE
|
||||||
Friendly name of the local timezone.
|
Friendly name of the local timezone.
|
||||||
|
### CAPTCHA_ENABLED
|
||||||
|
Enable Google reCaptcha
|
||||||
|
### RECAPTCHA_PUBLIC_KEY
|
||||||
|
Google reCaptcha public key
|
||||||
|
### RECAPTCHA_PRIVATE_KEY
|
||||||
|
Google reCaptcha private key
|
||||||
|
### NOCAPTCHA
|
||||||
|
Enable New No Captcha reCaptcha
|
||||||
### STATIC_URL
|
### STATIC_URL
|
||||||
Absolute URL to serve static files from.
|
Absolute URL to serve static files from.
|
||||||
### STATIC_ROOT
|
### STATIC_ROOT
|
||||||
|
@ -68,4 +68,4 @@ Enter your database password and press Check. If all the boxes come back green p
|
|||||||
|
|
||||||
## Update Auth Settings
|
## Update Auth Settings
|
||||||
|
|
||||||
Edit your aut settings file (`nano ~/allianceauth/alliance_auth/settings.py`) and replace `API_KEY_AUDIT_URL` with either `jacknife.example.com/?usid={api_id}&apik={vcode}` or `example.com/jacknife/?usid={api_id}&apik={vcode}` depending on your apache choice.
|
Edit your aut settings file (`nano ~/allianceauth/alliance_auth/settings.py`) and replace `API_KEY_AUDIT_URL` with either `http://jacknife.example.com/?usid={api_id}&apik={vcode}` or `http://example.com/jacknife/?usid={api_id}&apik={vcode}` depending on your apache choice.
|
||||||
|
@ -82,6 +82,8 @@ Navigate to the `Server` tab, `Server Manager` subtab, and select `System Proper
|
|||||||
- Name: `plugin.broadcast.allowedUsers`
|
- Name: `plugin.broadcast.allowedUsers`
|
||||||
- Value: `broadcast@example.com`, replacing the domain name with yours
|
- Value: `broadcast@example.com`, replacing the domain name with yours
|
||||||
- Do not encrypt this property value
|
- Do not encrypt this property value
|
||||||
|
|
||||||
|
If you have troubles getting broadcasts to work, you can try setting the optional (you will need to add it) `BROADCAST_IGNORE_INVALID_CERT` setting to `True`. This will allow invalid certificates to be used when connecting to the Openfire server to send a broadcast.
|
||||||
|
|
||||||
### Group Chat
|
### Group Chat
|
||||||
Channels are available which function like a chat room. Access can be controlled either by password or ACL (not unlike mumble).
|
Channels are available which function like a chat room. Access can be controlled either by password or ACL (not unlike mumble).
|
||||||
|
@ -6,8 +6,6 @@
|
|||||||
{% block title %}Alliance Auth - Fatlink Create{% endblock %}
|
{% block title %}Alliance Auth - Fatlink Create{% endblock %}
|
||||||
|
|
||||||
{% block page_title %}{% trans "Create Fatlink" %}{% endblock page_title %}
|
{% block page_title %}{% trans "Create Fatlink" %}{% endblock page_title %}
|
||||||
{% block extra_css %}
|
|
||||||
<link href="{% static 'css/jquery.datetimepicker.css' %}" rel="stylesheet" type="text/css">{% endblock extra_css %}
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
|
@ -210,13 +210,14 @@ def click_fatlink_view(request, token, hash, fatname):
|
|||||||
location['solar_system_name'] = \
|
location['solar_system_name'] = \
|
||||||
c.Universe.get_universe_systems_system_id(system_id=location['solar_system_id']).result()[
|
c.Universe.get_universe_systems_system_id(system_id=location['solar_system_id']).result()[
|
||||||
'name']
|
'name']
|
||||||
if location['structure_id']:
|
if location['station_id']:
|
||||||
|
location['station_name'] = \
|
||||||
|
c.Universe.get_universe_stations_station_id(station_id=location['station_id']).result()['name']
|
||||||
|
elif location['structure_id']:
|
||||||
|
c = token.get_esi_client(Universe='v1')
|
||||||
location['station_name'] = \
|
location['station_name'] = \
|
||||||
c.Universe.get_universe_structures_structure_id(structure_id=location['structure_id']).result()[
|
c.Universe.get_universe_structures_structure_id(structure_id=location['structure_id']).result()[
|
||||||
'name']
|
'name']
|
||||||
elif location['station_id']:
|
|
||||||
location['station_name'] = \
|
|
||||||
c.Universe.get_universe_stations_station_id(station_id=location['station_id']).result()['name']
|
|
||||||
else:
|
else:
|
||||||
location['station_name'] = "No Station"
|
location['station_name'] = "No Station"
|
||||||
ship['ship_type_name'] = EveManager.get_itemtype(ship['ship_type_id']).name
|
ship['ship_type_name'] = EveManager.get_itemtype(ship['ship_type_id']).name
|
||||||
|
@ -23,8 +23,6 @@ git+https://github.com/adarnof/django-navhelper
|
|||||||
# django-celery
|
# django-celery
|
||||||
git+https://github.com/celery/django-celery
|
git+https://github.com/celery/django-celery
|
||||||
|
|
||||||
git+git://github.com/nikdoof/python-ts3.git
|
|
||||||
|
|
||||||
# awating pyghassen/openfire-restapi #1 to fix installation issues
|
# awating pyghassen/openfire-restapi #1 to fix installation issues
|
||||||
git+https://github.com/adarnof/openfire-restapi
|
git+https://github.com/adarnof/openfire-restapi
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@ except ImportError:
|
|||||||
|
|
||||||
import sleekxmpp
|
import sleekxmpp
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
import threading
|
|
||||||
from ofrestapi.users import Users as ofUsers
|
from ofrestapi.users import Users as ofUsers
|
||||||
from ofrestapi import exception
|
from ofrestapi import exception
|
||||||
|
|
||||||
@ -24,12 +23,6 @@ class OpenfireManager:
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def send_broadcast_threaded(group_name, broadcast_message):
|
|
||||||
logger.debug("Starting broadcast to %s with message %s" % (group_name, broadcast_message))
|
|
||||||
broadcast_thread = XmppThread(1, "XMPP Broadcast Thread", 1, group_name, broadcast_message)
|
|
||||||
broadcast_thread.start()
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def __add_address_to_username(username):
|
def __add_address_to_username(username):
|
||||||
address = urlparse(settings.OPENFIRE_ADDRESS).netloc.split(":")[0]
|
address = urlparse(settings.OPENFIRE_ADDRESS).netloc.split(":")[0]
|
||||||
@ -169,11 +162,19 @@ class OpenfireManager:
|
|||||||
xmpp = PingBot(settings.BROADCAST_USER, settings.BROADCAST_USER_PASSWORD, to_address, broadcast_message)
|
xmpp = PingBot(settings.BROADCAST_USER, settings.BROADCAST_USER_PASSWORD, to_address, broadcast_message)
|
||||||
xmpp.register_plugin('xep_0030') # Service Discovery
|
xmpp.register_plugin('xep_0030') # Service Discovery
|
||||||
xmpp.register_plugin('xep_0199') # XMPP Ping
|
xmpp.register_plugin('xep_0199') # XMPP Ping
|
||||||
if xmpp.connect():
|
if xmpp.connect(reattempt=False):
|
||||||
xmpp.process(block=True)
|
xmpp.process(block=True)
|
||||||
logger.info("Sent jabber ping to group %s" % group_name)
|
message = None
|
||||||
|
if xmpp.message_sent:
|
||||||
|
logger.debug("Sent jabber ping to group %s" % group_name)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
message = "Failed to send Openfire broadcast message."
|
||||||
|
logger.error(message)
|
||||||
|
raise PingBotException(message)
|
||||||
else:
|
else:
|
||||||
raise ValueError("Unable to connect to jabber server.")
|
logger.error("Unable to connect to jabber server")
|
||||||
|
raise PingBotException("Unable to connect to jabber server.")
|
||||||
|
|
||||||
|
|
||||||
class PingBot(sleekxmpp.ClientXMPP):
|
class PingBot(sleekxmpp.ClientXMPP):
|
||||||
@ -184,17 +185,28 @@ class PingBot(sleekxmpp.ClientXMPP):
|
|||||||
def __init__(self, jid, password, recipient, message):
|
def __init__(self, jid, password, recipient, message):
|
||||||
sleekxmpp.ClientXMPP.__init__(self, jid, password)
|
sleekxmpp.ClientXMPP.__init__(self, jid, password)
|
||||||
|
|
||||||
|
self.reconnect_max_attempts = 5
|
||||||
|
self.auto_reconnect = False
|
||||||
# The message we wish to send, and the JID that
|
# The message we wish to send, and the JID that
|
||||||
# will receive it.
|
# will receive it.
|
||||||
self.recipient = recipient
|
self.recipient = recipient
|
||||||
self.msg = message
|
self.msg = message
|
||||||
|
|
||||||
|
# Success checking
|
||||||
|
self.message_sent = False
|
||||||
|
|
||||||
# The session_start event will be triggered when
|
# The session_start event will be triggered when
|
||||||
# the bot establishes its connection with the server
|
# the bot establishes its connection with the server
|
||||||
# and the XML streams are ready for use. We want to
|
# and the XML streams are ready for use. We want to
|
||||||
# listen for this event so that we we can initialize
|
# listen for this event so that we we can initialize
|
||||||
# our roster.
|
# our roster.
|
||||||
self.add_event_handler("session_start", self.start)
|
self.add_event_handler("session_start", self.start)
|
||||||
|
if getattr(settings, 'BROADCAST_IGNORE_INVALID_CERT', False):
|
||||||
|
self.add_event_handler("ssl_invalid_cert", self.discard)
|
||||||
|
|
||||||
|
def discard(self, *args, **kwargs):
|
||||||
|
# Discard the event
|
||||||
|
return
|
||||||
|
|
||||||
def start(self, event):
|
def start(self, event):
|
||||||
self.send_presence()
|
self.send_presence()
|
||||||
@ -203,20 +215,11 @@ class PingBot(sleekxmpp.ClientXMPP):
|
|||||||
self.send_message(mto=self.recipient,
|
self.send_message(mto=self.recipient,
|
||||||
mbody=self.msg,
|
mbody=self.msg,
|
||||||
mtype='chat')
|
mtype='chat')
|
||||||
|
self.message_sent = True
|
||||||
# Using wait=True ensures that the send queue will be
|
# Using wait=True ensures that the send queue will be
|
||||||
# emptied before ending the session.
|
# emptied before ending the session.
|
||||||
self.disconnect(wait=True)
|
self.disconnect(wait=True)
|
||||||
|
|
||||||
|
|
||||||
class XmppThread(threading.Thread):
|
class PingBotException(Exception):
|
||||||
def __init__(self, thread_id, name, counter, group, message, ):
|
pass
|
||||||
threading.Thread.__init__(self)
|
|
||||||
self.threadID = thread_id
|
|
||||||
self.name = name
|
|
||||||
self.counter = counter
|
|
||||||
self.group = group
|
|
||||||
self.message = message
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
OpenfireManager.send_broadcast_message(self.group, self.message)
|
|
||||||
|
@ -5,7 +5,7 @@ from django.contrib.auth.decorators import login_required, permission_required
|
|||||||
from django.contrib.auth.models import Group
|
from django.contrib.auth.models import Group
|
||||||
from django.shortcuts import render, redirect
|
from django.shortcuts import render, redirect
|
||||||
from services.forms import ServicePasswordForm
|
from services.forms import ServicePasswordForm
|
||||||
from .manager import OpenfireManager
|
from .manager import OpenfireManager, PingBotException
|
||||||
from .tasks import OpenfireTasks
|
from .tasks import OpenfireTasks
|
||||||
from .forms import JabberBroadcastForm
|
from .forms import JabberBroadcastForm
|
||||||
from .models import OpenfireUser
|
from .models import OpenfireUser
|
||||||
@ -98,27 +98,29 @@ def jabber_broadcast_view(request):
|
|||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
main_char = request.user.profile.main_character
|
main_char = request.user.profile.main_character
|
||||||
logger.debug("Processing jabber broadcast for user %s with main character %s" % (request.user, main_char))
|
logger.debug("Processing jabber broadcast for user %s with main character %s" % (request.user, main_char))
|
||||||
if main_char is not None:
|
try:
|
||||||
message_to_send = form.cleaned_data[
|
if main_char is not None:
|
||||||
'message'] + "\n##### SENT BY: " + "[" + main_char.corporation_ticker + "]" + \
|
message_to_send = form.cleaned_data[
|
||||||
main_char.character_name + " TO: " + \
|
'message'] + "\n##### SENT BY: " + "[" + main_char.corporation_ticker + "]" + \
|
||||||
form.cleaned_data['group'] + " WHEN: " + datetime.datetime.utcnow().strftime(
|
main_char.character_name + " TO: " + \
|
||||||
"%Y-%m-%d %H:%M:%S") + " #####\n##### Replies are NOT monitored #####\n"
|
form.cleaned_data['group'] + " WHEN: " + datetime.datetime.utcnow().strftime(
|
||||||
group_to_send = form.cleaned_data['group']
|
"%Y-%m-%d %H:%M:%S") + " #####\n##### Replies are NOT monitored #####\n"
|
||||||
|
group_to_send = form.cleaned_data['group']
|
||||||
|
|
||||||
OpenfireManager.send_broadcast_threaded(group_to_send, message_to_send, )
|
else:
|
||||||
|
message_to_send = form.cleaned_data[
|
||||||
|
'message'] + "\n##### SENT BY: " + "No character but can send pings?" + " TO: " + \
|
||||||
|
form.cleaned_data['group'] + " WHEN: " + datetime.datetime.utcnow().strftime(
|
||||||
|
"%Y-%m-%d %H:%M:%S") + " #####\n##### Replies are NOT monitored #####\n"
|
||||||
|
group_to_send = form.cleaned_data['group']
|
||||||
|
|
||||||
else:
|
OpenfireManager.send_broadcast_message(group_to_send, message_to_send)
|
||||||
message_to_send = form.cleaned_data[
|
|
||||||
'message'] + "\n##### SENT BY: " + "No character but can send pings?" + " TO: " + \
|
|
||||||
form.cleaned_data['group'] + " WHEN: " + datetime.datetime.utcnow().strftime(
|
|
||||||
"%Y-%m-%d %H:%M:%S") + " #####\n##### Replies are NOT monitored #####\n"
|
|
||||||
group_to_send = form.cleaned_data['group']
|
|
||||||
|
|
||||||
OpenfireManager.send_broadcast_threaded(group_to_send, message_to_send, )
|
messages.success(request, 'Sent jabber broadcast to %s' % group_to_send)
|
||||||
|
logger.info("Sent jabber broadcast on behalf of user %s" % request.user)
|
||||||
|
except PingBotException as e:
|
||||||
|
messages.error(request, e)
|
||||||
|
|
||||||
messages.success(request, 'Sent jabber broadcast to %s' % group_to_send)
|
|
||||||
logger.info("Sent jabber broadcast on behalf of user %s" % request.user)
|
|
||||||
else:
|
else:
|
||||||
form = JabberBroadcastForm()
|
form = JabberBroadcastForm()
|
||||||
form.fields['group'].choices = allchoices
|
form.fields['group'].choices = allchoices
|
||||||
|
@ -10,6 +10,7 @@ class TeamspeakJoinForm(forms.Form):
|
|||||||
username = forms.CharField(widget=forms.HiddenInput())
|
username = forms.CharField(widget=forms.HiddenInput())
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
if Teamspeak3Manager._get_userid(self.cleaned_data['username']):
|
with Teamspeak3Manager() as ts3man:
|
||||||
return self.cleaned_data
|
if ts3man._get_userid(self.cleaned_data['username']):
|
||||||
|
return self.cleaned_data
|
||||||
raise forms.ValidationError(_("Unable to locate user %s on server") % self.cleaned_data['username'])
|
raise forms.ValidationError(_("Unable to locate user %s on server") % self.cleaned_data['username'])
|
||||||
|
@ -12,7 +12,31 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
class Teamspeak3Manager:
|
class Teamspeak3Manager:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
pass
|
self._server = None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def server(self):
|
||||||
|
if self._server is not None and self._server._connected:
|
||||||
|
return self._server
|
||||||
|
else:
|
||||||
|
raise ValueError("Teamspeak not connected")
|
||||||
|
|
||||||
|
def connect(self):
|
||||||
|
self._server = self.__get_created_server()
|
||||||
|
return self
|
||||||
|
|
||||||
|
def disconnect(self):
|
||||||
|
self._server.disconnect()
|
||||||
|
self._server = None
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
logger.debug("Entering with statement, connecting")
|
||||||
|
self.connect()
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, _type, value, traceback):
|
||||||
|
logger.debug("Exiting with statement, cleaning up")
|
||||||
|
self.disconnect()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def __get_created_server():
|
def __get_created_server():
|
||||||
@ -33,12 +57,10 @@ class Teamspeak3Manager:
|
|||||||
sanatized = "[" + corp_ticker + "]" + username
|
sanatized = "[" + corp_ticker + "]" + username
|
||||||
return sanatized[:30]
|
return sanatized[:30]
|
||||||
|
|
||||||
@staticmethod
|
def _get_userid(self, uid)::
|
||||||
def _get_userid(uid):
|
|
||||||
logger.debug("Looking for uid %s on TS3 server." % uid)
|
logger.debug("Looking for uid %s on TS3 server." % uid)
|
||||||
server = Teamspeak3Manager.__get_created_server()
|
|
||||||
try:
|
try:
|
||||||
ret = server.send_command('customsearch', {'ident': 'sso_uid', 'pattern': uid})
|
ret = self.server.send_command('customsearch', {'ident': 'sso_uid', 'pattern': uid})
|
||||||
if ret and 'keys' in ret and 'cldbid' in ret['keys']:
|
if ret and 'keys' in ret and 'cldbid' in ret['keys']:
|
||||||
logger.debug("Got userid %s for uid %s" % (ret['keys']['cldbid'], uid))
|
logger.debug("Got userid %s for uid %s" % (ret['keys']['cldbid'], uid))
|
||||||
return ret['keys']['cldbid']
|
return ret['keys']['cldbid']
|
||||||
@ -47,11 +69,9 @@ class Teamspeak3Manager:
|
|||||||
raise e
|
raise e
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@staticmethod
|
def _group_id_by_name(self, groupname):
|
||||||
def _group_id_by_name(groupname):
|
|
||||||
server = Teamspeak3Manager.__get_created_server()
|
|
||||||
logger.debug("Looking for group %s on TS3 server." % groupname)
|
logger.debug("Looking for group %s on TS3 server." % groupname)
|
||||||
group_cache = server.send_command('servergrouplist')
|
group_cache = self.server.send_command('servergrouplist')
|
||||||
logger.debug("Received group cache from server: %s" % group_cache)
|
logger.debug("Received group cache from server: %s" % group_cache)
|
||||||
for group in group_cache:
|
for group in group_cache:
|
||||||
logger.debug("Checking group %s" % group)
|
logger.debug("Checking group %s" % group)
|
||||||
@ -61,34 +81,31 @@ class Teamspeak3Manager:
|
|||||||
logger.debug("Group %s not found on server." % groupname)
|
logger.debug("Group %s not found on server." % groupname)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@staticmethod
|
def _create_group(self, groupname):
|
||||||
def _create_group(groupname):
|
|
||||||
logger.debug("Creating group %s on TS3 server." % groupname)
|
logger.debug("Creating group %s on TS3 server." % groupname)
|
||||||
server = Teamspeak3Manager.__get_created_server()
|
sgid = self._group_id_by_name(groupname)
|
||||||
sgid = Teamspeak3Manager._group_id_by_name(groupname)
|
|
||||||
if not sgid:
|
if not sgid:
|
||||||
logger.debug("Group does not yet exist. Proceeding with creation.")
|
logger.debug("Group does not yet exist. Proceeding with creation.")
|
||||||
ret = server.send_command('servergroupadd', {'name': groupname})
|
ret = self.server.send_command('servergroupadd', {'name': groupname})
|
||||||
Teamspeak3Manager.__group_cache = None
|
self.__group_cache = None
|
||||||
sgid = ret['keys']['sgid']
|
sgid = ret['keys']['sgid']
|
||||||
server.send_command('servergroupaddperm',
|
self.server.send_command('servergroupaddperm',
|
||||||
{'sgid': sgid, 'permsid': 'i_group_needed_modify_power', 'permvalue': 75,
|
{'sgid': sgid, 'permsid': 'i_group_needed_modify_power', 'permvalue': 75,
|
||||||
'permnegated': 0, 'permskip': 0})
|
'permnegated': 0, 'permskip': 0})
|
||||||
server.send_command('servergroupaddperm',
|
self.server.send_command('servergroupaddperm',
|
||||||
{'sgid': sgid, 'permsid': 'i_group_needed_member_add_power', 'permvalue': 100,
|
{'sgid': sgid, 'permsid': 'i_group_needed_member_add_power', 'permvalue': 100,
|
||||||
'permnegated': 0, 'permskip': 0})
|
'permnegated': 0, 'permskip': 0})
|
||||||
server.send_command('servergroupaddperm',
|
self.server.send_command('servergroupaddperm',
|
||||||
{'sgid': sgid, 'permsid': 'i_group_needed_member_remove_power', 'permvalue': 100,
|
{'sgid': sgid, 'permsid': 'i_group_needed_member_remove_power', 'permvalue': 100,
|
||||||
'permnegated': 0, 'permskip': 0})
|
'permnegated': 0, 'permskip': 0})
|
||||||
logger.info("Created group on TS3 server with name %s and id %s" % (groupname, sgid))
|
logger.info("Created group on TS3 server with name %s and id %s" % (groupname, sgid))
|
||||||
return sgid
|
return sgid
|
||||||
|
|
||||||
@staticmethod
|
def _user_group_list(self, cldbid):
|
||||||
def _user_group_list(cldbid):
|
|
||||||
logger.debug("Retrieving group list for user with id %s" % cldbid)
|
logger.debug("Retrieving group list for user with id %s" % cldbid)
|
||||||
server = Teamspeak3Manager.__get_created_server()
|
server = Teamspeak3Manager.__get_created_server()
|
||||||
try:
|
try:
|
||||||
groups = server.send_command('servergroupsbyclientid', {'cldbid': cldbid})
|
groups = self.server.send_command('servergroupsbyclientid', {'cldbid': cldbid})
|
||||||
except TeamspeakError as e:
|
except TeamspeakError as e:
|
||||||
if e.code == '1281': # no groups
|
if e.code == '1281': # no groups
|
||||||
groups = []
|
groups = []
|
||||||
@ -107,11 +124,9 @@ class Teamspeak3Manager:
|
|||||||
logger.debug("Returning name/id pairing: %s" % outlist)
|
logger.debug("Returning name/id pairing: %s" % outlist)
|
||||||
return outlist
|
return outlist
|
||||||
|
|
||||||
@staticmethod
|
def _group_list(self):
|
||||||
def _group_list():
|
|
||||||
logger.debug("Retrieving group list on TS3 server.")
|
logger.debug("Retrieving group list on TS3 server.")
|
||||||
server = Teamspeak3Manager.__get_created_server()
|
group_cache = self.server.send_command('servergrouplist')
|
||||||
group_cache = server.send_command('servergrouplist')
|
|
||||||
logger.debug("Received group cache from server: %s" % group_cache)
|
logger.debug("Received group cache from server: %s" % group_cache)
|
||||||
outlist = {}
|
outlist = {}
|
||||||
if group_cache:
|
if group_cache:
|
||||||
@ -123,35 +138,30 @@ class Teamspeak3Manager:
|
|||||||
logger.debug("Returning name/id pairing: %s" % outlist)
|
logger.debug("Returning name/id pairing: %s" % outlist)
|
||||||
return outlist
|
return outlist
|
||||||
|
|
||||||
@staticmethod
|
def _add_user_to_group(self, uid, groupid):
|
||||||
def _add_user_to_group(uid, groupid):
|
|
||||||
logger.debug("Adding group id %s to TS3 user id %s" % (groupid, uid))
|
logger.debug("Adding group id %s to TS3 user id %s" % (groupid, uid))
|
||||||
server = Teamspeak3Manager.__get_created_server()
|
user_groups = self._user_group_list(uid)
|
||||||
user_groups = Teamspeak3Manager._user_group_list(uid)
|
|
||||||
|
|
||||||
if groupid not in user_groups.values():
|
if groupid not in user_groups.values():
|
||||||
logger.debug("User does not have group already. Issuing command to add.")
|
logger.debug("User does not have group already. Issuing command to add.")
|
||||||
server.send_command('servergroupaddclient',
|
self.server.send_command('servergroupaddclient',
|
||||||
{'sgid': str(groupid), 'cldbid': uid})
|
{'sgid': str(groupid), 'cldbid': uid})
|
||||||
logger.info("Added user id %s to group id %s on TS3 server." % (uid, groupid))
|
logger.info("Added user id %s to group id %s on TS3 server." % (uid, groupid))
|
||||||
|
|
||||||
@staticmethod
|
def _remove_user_from_group(self, uid, groupid):
|
||||||
def _remove_user_from_group(uid, groupid):
|
|
||||||
logger.debug("Removing group id %s from TS3 user id %s" % (groupid, uid))
|
logger.debug("Removing group id %s from TS3 user id %s" % (groupid, uid))
|
||||||
server = Teamspeak3Manager.__get_created_server()
|
user_groups = self._user_group_list(uid)
|
||||||
user_groups = Teamspeak3Manager._user_group_list(uid)
|
|
||||||
|
|
||||||
if str(groupid) in user_groups.values():
|
if str(groupid) in user_groups.values():
|
||||||
logger.debug("User is in group. Issuing command to remove.")
|
logger.debug("User is in group. Issuing command to remove.")
|
||||||
server.send_command('servergroupdelclient',
|
self.server.send_command('servergroupdelclient',
|
||||||
{'sgid': str(groupid), 'cldbid': uid})
|
{'sgid': str(groupid), 'cldbid': uid})
|
||||||
logger.info("Removed user id %s from group id %s on TS3 server." % (uid, groupid))
|
logger.info("Removed user id %s from group id %s on TS3 server." % (uid, groupid))
|
||||||
|
|
||||||
@staticmethod
|
def _sync_ts_group_db(self):
|
||||||
def _sync_ts_group_db():
|
|
||||||
logger.debug("_sync_ts_group_db function called.")
|
logger.debug("_sync_ts_group_db function called.")
|
||||||
try:
|
try:
|
||||||
remote_groups = Teamspeak3Manager._group_list()
|
remote_groups = self._group_list()
|
||||||
local_groups = TSgroup.objects.all()
|
local_groups = TSgroup.objects.all()
|
||||||
logger.debug("Comparing remote groups to TSgroup objects: %s" % local_groups)
|
logger.debug("Comparing remote groups to TSgroup objects: %s" % local_groups)
|
||||||
for key in remote_groups:
|
for key in remote_groups:
|
||||||
@ -176,23 +186,20 @@ class Teamspeak3Manager:
|
|||||||
except:
|
except:
|
||||||
logger.exception("An unhandled exception has occured while syncing TS groups.")
|
logger.exception("An unhandled exception has occured while syncing TS groups.")
|
||||||
|
|
||||||
@staticmethod
|
def add_user(self, username, corp_ticker):
|
||||||
def add_user(username, corp_ticker):
|
username_clean = self.__santatize_username(self.__generate_username(username, corp_ticker))
|
||||||
username_clean = Teamspeak3Manager.__santatize_username(Teamspeak3Manager.__generate_username(username,
|
|
||||||
corp_ticker))
|
|
||||||
server = Teamspeak3Manager.__get_created_server()
|
|
||||||
logger.debug("Adding user to TS3 server with cleaned username %s" % username_clean)
|
logger.debug("Adding user to TS3 server with cleaned username %s" % username_clean)
|
||||||
server_groups = Teamspeak3Manager._group_list()
|
server_groups = self._group_list()
|
||||||
|
|
||||||
if 'Member' not in server_groups:
|
if 'Member' not in server_groups:
|
||||||
Teamspeak3Manager._create_group('Member')
|
self._create_group('Member')
|
||||||
|
|
||||||
alliance_group_id = Teamspeak3Manager._group_id_by_name('Member')
|
alliance_group_id = self._group_id_by_name('Member')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
ret = server.send_command('tokenadd', {'tokentype': 0, 'tokenid1': alliance_group_id, 'tokenid2': 0,
|
ret = self.server.send_command('tokenadd', {'tokentype': 0, 'tokenid1': alliance_group_id, 'tokenid2': 0,
|
||||||
'tokendescription': username_clean,
|
'tokendescription': username_clean,
|
||||||
'tokencustomset': "ident=sso_uid value=%s" % username_clean})
|
'tokencustomset': "ident=sso_uid value=%s" % username_clean})
|
||||||
except TeamspeakError as e:
|
except TeamspeakError as e:
|
||||||
logger.error("Failed to add teamspeak user %s: %s" % (username, str(e)))
|
logger.error("Failed to add teamspeak user %s: %s" % (username, str(e)))
|
||||||
return "",""
|
return "",""
|
||||||
@ -205,24 +212,22 @@ class Teamspeak3Manager:
|
|||||||
logger.exception("Failed to add teamspeak user %s - received response: %s" % (username_clean, ret))
|
logger.exception("Failed to add teamspeak user %s - received response: %s" % (username_clean, ret))
|
||||||
return "", ""
|
return "", ""
|
||||||
|
|
||||||
@staticmethod
|
def delete_user(self, uid):
|
||||||
def delete_user(uid):
|
user = self._get_userid(uid)
|
||||||
server = Teamspeak3Manager.__get_created_server()
|
|
||||||
user = Teamspeak3Manager._get_userid(uid)
|
|
||||||
logger.debug("Deleting user %s with id %s from TS3 server." % (user, uid))
|
logger.debug("Deleting user %s with id %s from TS3 server." % (user, uid))
|
||||||
if user:
|
if user:
|
||||||
clients = server.send_command('clientlist')
|
clients = self.server.send_command('clientlist')
|
||||||
for client in clients:
|
for client in clients:
|
||||||
try:
|
try:
|
||||||
if client['keys']['client_database_id'] == user:
|
if client['keys']['client_database_id'] == user:
|
||||||
logger.debug("Found user %s on TS3 server - issuing deletion command." % user)
|
logger.debug("Found user %s on TS3 server - issuing deletion command." % user)
|
||||||
server.send_command('clientkick', {'clid': client['keys']['clid'], 'reasonid': 5,
|
self.server.send_command('clientkick', {'clid': client['keys']['clid'], 'reasonid': 5,
|
||||||
'reasonmsg': 'Auth service deleted'})
|
'reasonmsg': 'Auth service deleted'})
|
||||||
except:
|
except:
|
||||||
logger.exception("Failed to delete user id %s from TS3 - received response %s" % (uid, client))
|
logger.exception("Failed to delete user id %s from TS3 - received response %s" % (uid, client))
|
||||||
return False
|
return False
|
||||||
try:
|
try:
|
||||||
ret = server.send_command('clientdbdelete', {'cldbid': user})
|
ret = self.server.send_command('clientdbdelete', {'cldbid': user})
|
||||||
except TeamspeakError as e:
|
except TeamspeakError as e:
|
||||||
logger.error("Failed to delete teamspeak user %s: %s" % (uid, str(e)))
|
logger.error("Failed to delete teamspeak user %s: %s" % (uid, str(e)))
|
||||||
return False
|
return False
|
||||||
@ -236,33 +241,24 @@ class Teamspeak3Manager:
|
|||||||
logger.warn("User with id %s not found on TS3 server. Assuming succesful deletion." % uid)
|
logger.warn("User with id %s not found on TS3 server. Assuming succesful deletion." % uid)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@staticmethod
|
def check_user_exists(self, uid):
|
||||||
def check_user_exists(uid):
|
if self._get_userid(uid):
|
||||||
if Teamspeak3Manager._get_userid(uid):
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@staticmethod
|
def generate_new_permissionkey(self, uid, username, corpticker):
|
||||||
def generate_new_permissionkey(uid, username, corpticker):
|
|
||||||
logger.debug("Re-issuing permission key for user id %s" % uid)
|
logger.debug("Re-issuing permission key for user id %s" % uid)
|
||||||
Teamspeak3Manager.delete_user(uid)
|
self.delete_user(uid)
|
||||||
return Teamspeak3Manager.add_user(username, corpticker)
|
return self.add_user(username, corpticker)
|
||||||
|
|
||||||
@staticmethod
|
def update_groups(self, uid, ts_groups):
|
||||||
def generate_new_blue_permissionkey(uid, username, corpticker):
|
|
||||||
logger.debug("Re-issuing blue permission key for user id %s" % uid)
|
|
||||||
Teamspeak3Manager.delete_user(uid)
|
|
||||||
return Teamspeak3Manager.add_blue_user(username, corpticker)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def update_groups(uid, ts_groups):
|
|
||||||
logger.debug("Updating uid %s TS3 groups %s" % (uid, ts_groups))
|
logger.debug("Updating uid %s TS3 groups %s" % (uid, ts_groups))
|
||||||
userid = Teamspeak3Manager._get_userid(uid)
|
userid = self._get_userid(uid)
|
||||||
addgroups = []
|
addgroups = []
|
||||||
remgroups = []
|
remgroups = []
|
||||||
if userid is not None:
|
if userid is not None:
|
||||||
user_ts_groups = Teamspeak3Manager._user_group_list(userid)
|
user_ts_groups = self._user_group_list(userid)
|
||||||
logger.debug("User has groups on TS3 server: %s" % user_ts_groups)
|
logger.debug("User has groups on TS3 server: %s" % user_ts_groups)
|
||||||
for key in user_ts_groups:
|
for key in user_ts_groups:
|
||||||
user_ts_groups[key] = int(user_ts_groups[key])
|
user_ts_groups[key] = int(user_ts_groups[key])
|
||||||
@ -276,8 +272,8 @@ class Teamspeak3Manager:
|
|||||||
|
|
||||||
for g in addgroups:
|
for g in addgroups:
|
||||||
logger.info("Adding Teamspeak user %s into group %s" % (userid, g))
|
logger.info("Adding Teamspeak user %s into group %s" % (userid, g))
|
||||||
Teamspeak3Manager._add_user_to_group(userid, g)
|
self._add_user_to_group(userid, g)
|
||||||
|
|
||||||
for g in remgroups:
|
for g in remgroups:
|
||||||
logger.info("Removing Teamspeak user %s from group %s" % (userid, g))
|
logger.info("Removing Teamspeak user %s from group %s" % (userid, g))
|
||||||
Teamspeak3Manager._remove_user_from_group(userid, g)
|
self._remove_user_from_group(userid, g)
|
||||||
|
@ -22,11 +22,12 @@ class Teamspeak3Tasks:
|
|||||||
def delete_user(cls, user, notify_user=False):
|
def delete_user(cls, user, notify_user=False):
|
||||||
if cls.has_account(user):
|
if cls.has_account(user):
|
||||||
logger.debug("User %s has TS3 account %s. Deleting." % (user, user.teamspeak3.uid))
|
logger.debug("User %s has TS3 account %s. Deleting." % (user, user.teamspeak3.uid))
|
||||||
if Teamspeak3Manager.delete_user(user.teamspeak3.uid):
|
with Teamspeak3Manager() as ts3man:
|
||||||
user.teamspeak3.delete()
|
if ts3man.delete_user(user.teamspeak3.uid):
|
||||||
if notify_user:
|
user.teamspeak3.delete()
|
||||||
notify(user, 'TeamSpeak3 Account Disabled', level='danger')
|
if notify_user:
|
||||||
return True
|
notify(user, 'TeamSpeak3 Account Disabled', level='danger')
|
||||||
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -40,7 +41,8 @@ class Teamspeak3Tasks:
|
|||||||
@app.task()
|
@app.task()
|
||||||
def run_ts3_group_update():
|
def run_ts3_group_update():
|
||||||
logger.debug("TS3 installed. Syncing local group objects.")
|
logger.debug("TS3 installed. Syncing local group objects.")
|
||||||
Teamspeak3Manager._sync_ts_group_db()
|
with Teamspeak3Manager() as ts3man:
|
||||||
|
ts3man._sync_ts_group_db()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def disable():
|
def disable():
|
||||||
@ -70,7 +72,8 @@ class Teamspeak3Tasks:
|
|||||||
groups[ts_group.ts_group_name] = ts_group.ts_group_id
|
groups[ts_group.ts_group_name] = ts_group.ts_group_id
|
||||||
logger.debug("Updating user %s teamspeak3 groups to %s" % (user, groups))
|
logger.debug("Updating user %s teamspeak3 groups to %s" % (user, groups))
|
||||||
try:
|
try:
|
||||||
Teamspeak3Manager.update_groups(user.teamspeak3.uid, groups)
|
with Teamspeak3Manager() as ts3man:
|
||||||
|
ts3man.update_groups(user.teamspeak3.uid, groups)
|
||||||
logger.debug("Updated user %s teamspeak3 groups." % user)
|
logger.debug("Updated user %s teamspeak3 groups." % user)
|
||||||
except TeamspeakError as e:
|
except TeamspeakError as e:
|
||||||
logger.error("Error occured while syncing TS groups for %s: %s" % (user, str(e)))
|
logger.error("Error occured while syncing TS groups for %s: %s" % (user, str(e)))
|
||||||
|
@ -75,20 +75,22 @@ class Teamspeak3HooksTestCase(TestCase):
|
|||||||
|
|
||||||
@mock.patch(MODULE_PATH + '.tasks.Teamspeak3Manager')
|
@mock.patch(MODULE_PATH + '.tasks.Teamspeak3Manager')
|
||||||
def test_update_all_groups(self, manager):
|
def test_update_all_groups(self, manager):
|
||||||
|
instance = manager.return_value.__enter__.return_value
|
||||||
service = self.service()
|
service = self.service()
|
||||||
service.update_all_groups()
|
service.update_all_groups()
|
||||||
# Check member and blue user have groups updated
|
# Check member and blue user have groups updated
|
||||||
self.assertTrue(manager.update_groups.called)
|
self.assertTrue(instance.update_groups.called)
|
||||||
self.assertEqual(manager.update_groups.call_count, 2)
|
self.assertEqual(instance.update_groups.call_count, 2)
|
||||||
|
|
||||||
def test_update_groups(self):
|
def test_update_groups(self):
|
||||||
# Check member has Member group updated
|
# Check member has Member group updated
|
||||||
with mock.patch(MODULE_PATH + '.tasks.Teamspeak3Manager') as manager:
|
with mock.patch(MODULE_PATH + '.tasks.Teamspeak3Manager') as manager:
|
||||||
|
instance = manager.return_value.__enter__.return_value
|
||||||
service = self.service()
|
service = self.service()
|
||||||
member = User.objects.get(username=self.member)
|
member = User.objects.get(username=self.member)
|
||||||
service.update_groups(member)
|
service.update_groups(member)
|
||||||
self.assertTrue(manager.update_groups.called)
|
self.assertTrue(instance.update_groups.called)
|
||||||
args, kwargs = manager.update_groups.call_args
|
args, kwargs = instance.update_groups.call_args
|
||||||
# update_groups(user.teamspeak3.uid, groups)
|
# update_groups(user.teamspeak3.uid, groups)
|
||||||
self.assertEqual({'Member': 1}, args[1]) # Check groups
|
self.assertEqual({'Member': 1}, args[1]) # Check groups
|
||||||
self.assertEqual(self.member, args[0]) # Check uid
|
self.assertEqual(self.member, args[0]) # Check uid
|
||||||
@ -98,7 +100,7 @@ class Teamspeak3HooksTestCase(TestCase):
|
|||||||
service = self.service()
|
service = self.service()
|
||||||
none_user = User.objects.get(username=self.none_user)
|
none_user = User.objects.get(username=self.none_user)
|
||||||
service.update_groups(none_user)
|
service.update_groups(none_user)
|
||||||
self.assertFalse(manager.update_user_groups.called)
|
self.assertFalse(manager.return_value.__enter__.return_value.update_user_groups.called)
|
||||||
|
|
||||||
@mock.patch(MODULE_PATH + '.tasks.Teamspeak3Manager')
|
@mock.patch(MODULE_PATH + '.tasks.Teamspeak3Manager')
|
||||||
def test_validate_user(self, manager):
|
def test_validate_user(self, manager):
|
||||||
@ -112,7 +114,7 @@ class Teamspeak3HooksTestCase(TestCase):
|
|||||||
none_user = User.objects.get(username=self.none_user)
|
none_user = User.objects.get(username=self.none_user)
|
||||||
Teamspeak3User.objects.create(user=none_user, uid='abc123', perm_key='132ACB')
|
Teamspeak3User.objects.create(user=none_user, uid='abc123', perm_key='132ACB')
|
||||||
service.validate_user(none_user)
|
service.validate_user(none_user)
|
||||||
self.assertTrue(manager.delete_user.called)
|
self.assertTrue(manager.return_value.__enter__.return_value.delete_user.called)
|
||||||
with self.assertRaises(ObjectDoesNotExist):
|
with self.assertRaises(ObjectDoesNotExist):
|
||||||
none_teamspeak3 = User.objects.get(username=self.none_user).teamspeak3
|
none_teamspeak3 = User.objects.get(username=self.none_user).teamspeak3
|
||||||
|
|
||||||
@ -124,7 +126,7 @@ class Teamspeak3HooksTestCase(TestCase):
|
|||||||
result = service.delete_user(member)
|
result = service.delete_user(member)
|
||||||
|
|
||||||
self.assertTrue(result)
|
self.assertTrue(result)
|
||||||
self.assertTrue(manager.delete_user.called)
|
self.assertTrue(manager.return_value.__enter__.return_value.delete_user.called)
|
||||||
with self.assertRaises(ObjectDoesNotExist):
|
with self.assertRaises(ObjectDoesNotExist):
|
||||||
teamspeak3_user = User.objects.get(username=self.member).teamspeak3
|
teamspeak3_user = User.objects.get(username=self.member).teamspeak3
|
||||||
|
|
||||||
@ -182,11 +184,12 @@ class Teamspeak3ViewsTestCase(TestCase):
|
|||||||
def test_activate(self, manager, forms_manager):
|
def test_activate(self, manager, forms_manager):
|
||||||
self.login()
|
self.login()
|
||||||
expected_username = 'auth_member'
|
expected_username = 'auth_member'
|
||||||
manager.add_user.return_value = (expected_username, 'abc123')
|
instance = manager.return_value.__enter__.return_value
|
||||||
|
instance.add_user.return_value = (expected_username, 'abc123')
|
||||||
|
|
||||||
response = self.client.get(urls.reverse('auth_activate_teamspeak3'))
|
response = self.client.get(urls.reverse('auth_activate_teamspeak3'))
|
||||||
|
|
||||||
self.assertTrue(manager.add_user.called)
|
self.assertTrue(instance.add_user.called)
|
||||||
teamspeak3_user = Teamspeak3User.objects.get(user=self.member)
|
teamspeak3_user = Teamspeak3User.objects.get(user=self.member)
|
||||||
self.assertTrue(teamspeak3_user.uid)
|
self.assertTrue(teamspeak3_user.uid)
|
||||||
self.assertTrue(teamspeak3_user.perm_key)
|
self.assertTrue(teamspeak3_user.perm_key)
|
||||||
@ -197,11 +200,12 @@ class Teamspeak3ViewsTestCase(TestCase):
|
|||||||
def test_activate_blue(self, manager, forms_manager):
|
def test_activate_blue(self, manager, forms_manager):
|
||||||
self.login(self.blue_user)
|
self.login(self.blue_user)
|
||||||
expected_username = 'auth_blue'
|
expected_username = 'auth_blue'
|
||||||
manager.add_blue_user.return_value = (expected_username, 'abc123')
|
instance = manager.return_value.__enter__.return_value
|
||||||
|
instance.add_blue_user.return_value = (expected_username, 'abc123')
|
||||||
|
|
||||||
response = self.client.get(urls.reverse('auth_activate_teamspeak3'))
|
response = self.client.get(urls.reverse('auth_activate_teamspeak3'))
|
||||||
|
|
||||||
self.assertTrue(manager.add_blue_user.called)
|
self.assertTrue(instance.add_blue_user.called)
|
||||||
teamspeak3_user = Teamspeak3User.objects.get(user=self.blue_user)
|
teamspeak3_user = Teamspeak3User.objects.get(user=self.blue_user)
|
||||||
self.assertTrue(teamspeak3_user.uid)
|
self.assertTrue(teamspeak3_user.uid)
|
||||||
self.assertTrue(teamspeak3_user.perm_key)
|
self.assertTrue(teamspeak3_user.perm_key)
|
||||||
@ -213,15 +217,16 @@ class Teamspeak3ViewsTestCase(TestCase):
|
|||||||
self.login()
|
self.login()
|
||||||
expected_username = 'auth_member'
|
expected_username = 'auth_member'
|
||||||
|
|
||||||
forms_manager._get_userid.return_value = '1234'
|
forms_instance = manager.return_value.__enter__.return_value
|
||||||
|
forms_instance._get_userid.return_value = '1234'
|
||||||
|
|
||||||
Teamspeak3User.objects.update_or_create(user=self.member, defaults={'uid': '1234', 'perm_key': '5678'})
|
Teamspeak3User.objects.update_or_create(user=self.member, defaults={'uid': '1234', 'perm_key': '5678'})
|
||||||
data = {'username': 'auth_member'}
|
data = {'username': 'auth_member'}
|
||||||
|
|
||||||
response = self.client.post(urls.reverse('auth_verify_teamspeak3'), data)
|
response = self.client.post(urls.reverse('auth_verify_teamspeak3'), data)
|
||||||
|
|
||||||
self.assertTrue(manager.update_groups.called)
|
|
||||||
self.assertRedirects(response, urls.reverse('auth_services'), target_status_code=200)
|
self.assertRedirects(response, urls.reverse('auth_services'), target_status_code=200)
|
||||||
|
self.assertTrue(manager.return_value.__enter__.return_value.update_groups.called)
|
||||||
|
|
||||||
@mock.patch(MODULE_PATH + '.tasks.Teamspeak3Manager')
|
@mock.patch(MODULE_PATH + '.tasks.Teamspeak3Manager')
|
||||||
def test_deactivate(self, manager):
|
def test_deactivate(self, manager):
|
||||||
@ -230,7 +235,7 @@ class Teamspeak3ViewsTestCase(TestCase):
|
|||||||
|
|
||||||
response = self.client.get(urls.reverse('auth_deactivate_teamspeak3'))
|
response = self.client.get(urls.reverse('auth_deactivate_teamspeak3'))
|
||||||
|
|
||||||
self.assertTrue(manager.delete_user.called)
|
self.assertTrue(manager.return_value.__enter__.return_value.delete_user.called)
|
||||||
self.assertRedirects(response, expected_url=urls.reverse('auth_services'), target_status_code=200)
|
self.assertRedirects(response, expected_url=urls.reverse('auth_services'), target_status_code=200)
|
||||||
with self.assertRaises(ObjectDoesNotExist):
|
with self.assertRaises(ObjectDoesNotExist):
|
||||||
teamspeak3_user = User.objects.get(pk=self.member.pk).teamspeak3
|
teamspeak3_user = User.objects.get(pk=self.member.pk).teamspeak3
|
||||||
@ -241,7 +246,7 @@ class Teamspeak3ViewsTestCase(TestCase):
|
|||||||
self.login()
|
self.login()
|
||||||
Teamspeak3User.objects.create(user=self.member, uid='some member')
|
Teamspeak3User.objects.create(user=self.member, uid='some member')
|
||||||
|
|
||||||
manager.generate_new_permissionkey.return_value = "valid_member", "123abc"
|
manager.return_value.__enter__.return_value.generate_new_permissionkey.return_value = "valid_member", "123abc"
|
||||||
|
|
||||||
response = self.client.get(urls.reverse('auth_reset_teamspeak3_perm'))
|
response = self.client.get(urls.reverse('auth_reset_teamspeak3_perm'))
|
||||||
|
|
||||||
@ -249,7 +254,7 @@ class Teamspeak3ViewsTestCase(TestCase):
|
|||||||
ts3_user = Teamspeak3User.objects.get(uid='valid_member')
|
ts3_user = Teamspeak3User.objects.get(uid='valid_member')
|
||||||
self.assertEqual(ts3_user.uid, 'valid_member')
|
self.assertEqual(ts3_user.uid, 'valid_member')
|
||||||
self.assertEqual(ts3_user.perm_key, '123abc')
|
self.assertEqual(ts3_user.perm_key, '123abc')
|
||||||
self.assertTrue(tasks_manager.update_groups.called)
|
self.assertTrue(tasks_manager.return_value.__enter__.return_value.update_groups.called)
|
||||||
|
|
||||||
@mock.patch(MODULE_PATH + '.tasks.Teamspeak3Manager')
|
@mock.patch(MODULE_PATH + '.tasks.Teamspeak3Manager')
|
||||||
@mock.patch(MODULE_PATH + '.views.Teamspeak3Manager')
|
@mock.patch(MODULE_PATH + '.views.Teamspeak3Manager')
|
||||||
@ -257,7 +262,8 @@ class Teamspeak3ViewsTestCase(TestCase):
|
|||||||
self.login(self.blue_user)
|
self.login(self.blue_user)
|
||||||
Teamspeak3User.objects.create(user=self.blue_user, uid='some member')
|
Teamspeak3User.objects.create(user=self.blue_user, uid='some member')
|
||||||
|
|
||||||
manager.generate_new_blue_permissionkey.return_value = "valid_blue", "123abc"
|
manager.return_value.__enter__.return_value.generate_new_blue_permissionkey.return_value = ("valid_blue",
|
||||||
|
"123abc")
|
||||||
|
|
||||||
response = self.client.get(urls.reverse('auth_reset_teamspeak3_perm'))
|
response = self.client.get(urls.reverse('auth_reset_teamspeak3_perm'))
|
||||||
|
|
||||||
@ -265,7 +271,7 @@ class Teamspeak3ViewsTestCase(TestCase):
|
|||||||
ts3_user = Teamspeak3User.objects.get(uid='valid_blue')
|
ts3_user = Teamspeak3User.objects.get(uid='valid_blue')
|
||||||
self.assertEqual(ts3_user.uid, 'valid_blue')
|
self.assertEqual(ts3_user.uid, 'valid_blue')
|
||||||
self.assertEqual(ts3_user.perm_key, '123abc')
|
self.assertEqual(ts3_user.perm_key, '123abc')
|
||||||
self.assertTrue(tasks_manager.update_groups.called)
|
self.assertTrue(tasks_manager.return_value.__enter__.return_value.update_groups.called)
|
||||||
|
|
||||||
|
|
||||||
class Teamspeak3SignalsTestCase(TestCase):
|
class Teamspeak3SignalsTestCase(TestCase):
|
||||||
|
@ -50,13 +50,24 @@ class TS3Proto:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def disconnect(self):
|
def disconnect(self):
|
||||||
self.send_command("quit")
|
if self._connected:
|
||||||
self._conn.close()
|
try:
|
||||||
self._connected = False
|
self.send("quit")
|
||||||
self._log.info('Disconnected')
|
self._conn.close()
|
||||||
|
except:
|
||||||
|
self._log.exception('Error while disconnecting')
|
||||||
|
self._connected = False
|
||||||
|
self._log.info('Disconnected')
|
||||||
|
else:
|
||||||
|
self._log.info("Not connected")
|
||||||
|
|
||||||
def send_command(self, command, keys=None, opts=None):
|
def send_command(self, command, keys=None, opts=None):
|
||||||
cmd = self.construct_command(command, keys=keys, opts=opts)
|
cmd = self.construct_command(command, keys=keys, opts=opts)
|
||||||
|
|
||||||
|
# Clear read buffer of any stray bytes
|
||||||
|
self._conn.read_very_eager()
|
||||||
|
|
||||||
|
# Send command
|
||||||
self.send('%s\n' % cmd)
|
self.send('%s\n' % cmd)
|
||||||
|
|
||||||
data = []
|
data = []
|
||||||
|
@ -22,9 +22,9 @@ def activate_teamspeak3(request):
|
|||||||
|
|
||||||
character = request.user.profile.main_character
|
character = request.user.profile.main_character
|
||||||
ticker = character.corporation_ticker
|
ticker = character.corporation_ticker
|
||||||
|
with Teamspeak3Manager() as ts3man:
|
||||||
logger.debug("Adding TS3 user for user %s with main character %s" % (request.user, character))
|
logger.debug("Adding TS3 user for user %s with main character %s" % (request.user, character))
|
||||||
result = Teamspeak3Manager.add_user(character.character_name, ticker)
|
result = ts3man.add_user(character.character_name, ticker)
|
||||||
|
|
||||||
# if its empty we failed
|
# if its empty we failed
|
||||||
if result[0] is not "":
|
if result[0] is not "":
|
||||||
@ -52,7 +52,7 @@ def verify_teamspeak3(request):
|
|||||||
logger.debug("Validated user %s joined TS server" % request.user)
|
logger.debug("Validated user %s joined TS server" % request.user)
|
||||||
return redirect("auth_services")
|
return redirect("auth_services")
|
||||||
else:
|
else:
|
||||||
form = TeamspeakJoinForm({'username': request.user.teamspeak3.uid})
|
form = TeamspeakJoinForm(initial={'username': request.user.teamspeak3.uid})
|
||||||
context = {
|
context = {
|
||||||
'form': form,
|
'form': form,
|
||||||
'authinfo': {'teamspeak3_uid': request.user.teamspeak3.uid,
|
'authinfo': {'teamspeak3_uid': request.user.teamspeak3.uid,
|
||||||
@ -68,8 +68,9 @@ def deactivate_teamspeak3(request):
|
|||||||
if Teamspeak3Tasks.has_account(request.user) and Teamspeak3Tasks.delete_user(request.user):
|
if Teamspeak3Tasks.has_account(request.user) and Teamspeak3Tasks.delete_user(request.user):
|
||||||
logger.info("Successfully deactivated TS3 for user %s" % request.user)
|
logger.info("Successfully deactivated TS3 for user %s" % request.user)
|
||||||
messages.success(request, 'Deactivated TeamSpeak3 account.')
|
messages.success(request, 'Deactivated TeamSpeak3 account.')
|
||||||
logger.error("Unsuccessful attempt to deactivate TS3 for user %s" % request.user)
|
else:
|
||||||
messages.error(request, 'An error occurred while processing your TeamSpeak3 account.')
|
logger.error("Unsuccessful attempt to deactivate TS3 for user %s" % request.user)
|
||||||
|
messages.error(request, 'An error occurred while processing your TeamSpeak3 account.')
|
||||||
return redirect("auth_services")
|
return redirect("auth_services")
|
||||||
|
|
||||||
|
|
||||||
@ -81,11 +82,12 @@ def reset_teamspeak3_perm(request):
|
|||||||
return redirect("auth_services")
|
return redirect("auth_services")
|
||||||
character = request.user.profile.main_character
|
character = request.user.profile.main_character
|
||||||
logger.debug("Deleting TS3 user for user %s" % request.user)
|
logger.debug("Deleting TS3 user for user %s" % request.user)
|
||||||
Teamspeak3Manager.delete_user(request.user.teamspeak3.uid)
|
with Teamspeak3Manager() as ts3man:
|
||||||
|
ts3man.delete_user(request.user.teamspeak3.uid)
|
||||||
|
|
||||||
logger.debug("Generating new permission key for user %s with main character %s" % (request.user, character))
|
logger.debug("Generating new permission key for user %s with main character %s" % (request.user, character))
|
||||||
result = Teamspeak3Manager.generate_new_permissionkey(request.user.teamspeak3.uid, character.character_name,
|
result = ts3man.generate_new_permissionkey(request.user.teamspeak3.uid, character.character_name,
|
||||||
character.corporation_ticker)
|
character.corporation_ticker)
|
||||||
|
|
||||||
# if blank we failed
|
# if blank we failed
|
||||||
if result[0] != "":
|
if result[0] != "":
|
||||||
|
@ -7,9 +7,6 @@
|
|||||||
{% block title %}{% trans "Alliance Auth - Structure Timer Create" %}{% endblock %}
|
{% block title %}{% trans "Alliance Auth - Structure Timer Create" %}{% endblock %}
|
||||||
|
|
||||||
{% block page_title %}{% trans "Timer Create" %}{% endblock page_title %}
|
{% block page_title %}{% trans "Timer Create" %}{% endblock page_title %}
|
||||||
{% block extra_css %}
|
|
||||||
{% include 'bundles/jquery-datetimepicker-css.html' %}
|
|
||||||
{% endblock extra_css %}
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
@ -30,17 +27,3 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
||||||
{% block extra_javascript %}
|
|
||||||
{% include 'bundles/jquery-datetimepicker-js.html' %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block extra_script %}
|
|
||||||
|
|
||||||
$('#id_eve_time').datetimepicker({
|
|
||||||
lang: '{{ LANGUAGE_CODE }}',
|
|
||||||
maskInput: true,
|
|
||||||
format: 'Y-m-d H:i',minDate:0
|
|
||||||
});
|
|
||||||
|
|
||||||
{% endblock extra_script %}
|
|
||||||
|
@ -7,8 +7,10 @@
|
|||||||
{% block title %}Alliance Auth - Update Fleet Operation {% endblock %}
|
{% block title %}Alliance Auth - Update Fleet Operation {% endblock %}
|
||||||
|
|
||||||
{% block page_title %}{% trans "Update AAR Link" %}{% endblock page_title %}
|
{% block page_title %}{% trans "Update AAR Link" %}{% endblock page_title %}
|
||||||
|
|
||||||
{% block extra_css %}
|
{% block extra_css %}
|
||||||
<link href="{% static 'css/jquery.datetimepicker.css' %}" rel="stylesheet" type="text/css">{% endblock extra_css %}
|
{% include 'bundles/jquery-datetimepicker-css.html' %}
|
||||||
|
{% endblock extra_css %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
@ -37,6 +39,10 @@
|
|||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
||||||
|
{% block extra_javascript %}
|
||||||
|
{% include 'bundles/jquery-datetimepicker-js.html' %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block extra_script %}
|
{% block extra_script %}
|
||||||
|
|
||||||
$('#id_start').datetimepicker({
|
$('#id_start').datetimepicker({
|
||||||
|
@ -7,7 +7,8 @@
|
|||||||
|
|
||||||
{% block page_title %}{% trans "SRP Fleet Create" %}{% endblock page_title %}
|
{% block page_title %}{% trans "SRP Fleet Create" %}{% endblock page_title %}
|
||||||
{% block extra_css %}
|
{% block extra_css %}
|
||||||
<link href="{% static 'css/jquery.datetimepicker.css' %}" rel="stylesheet" type="text/css">{% endblock extra_css %}
|
{% include 'bundles/jquery-datetimepicker-css.html' %}
|
||||||
|
{% endblock extra_css %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
@ -40,6 +41,10 @@
|
|||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
||||||
|
{% block extra_javascript %}
|
||||||
|
{% include 'bundles/jquery-datetimepicker-js.html' %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block extra_script %}
|
{% block extra_script %}
|
||||||
|
|
||||||
$('#id_fleet_time').datetimepicker({
|
$('#id_fleet_time').datetimepicker({
|
||||||
|
@ -6,8 +6,6 @@
|
|||||||
{% block title %}SRP Request{% endblock %}
|
{% block title %}SRP Request{% endblock %}
|
||||||
|
|
||||||
{% block page_title %}{% trans "SRP Request" %}{% endblock page_title %}
|
{% block page_title %}{% trans "SRP Request" %}{% endblock page_title %}
|
||||||
{% block extra_css %}
|
|
||||||
<link href="{% static 'css/jquery.datetimepicker.css' %}" rel="stylesheet" type="text/css">{% endblock extra_css %}
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
@ -31,12 +29,3 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
||||||
{% block extra_script %}
|
|
||||||
|
|
||||||
$('#id_fleet_time').datetimepicker({
|
|
||||||
maskInput: true,
|
|
||||||
format: 'Y-m-d H:i',minDate:0
|
|
||||||
});
|
|
||||||
|
|
||||||
{% endblock extra_script %}
|
|
||||||
|
@ -6,8 +6,6 @@
|
|||||||
{% block title %}Alliance Auth - Update SRP Amount{% endblock %}
|
{% block title %}Alliance Auth - Update SRP Amount{% endblock %}
|
||||||
|
|
||||||
{% block page_title %}{% trans "Update SRP Amount" %}{% endblock page_title %}
|
{% block page_title %}{% trans "Update SRP Amount" %}{% endblock page_title %}
|
||||||
{% block extra_css %}
|
|
||||||
<link href="{% static 'css/jquery.datetimepicker.css' %}" rel="stylesheet" type="text/css">{% endblock extra_css %}
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
@ -31,12 +29,3 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
||||||
{% block extra_script %}
|
|
||||||
|
|
||||||
$('#id_fleet_time').datetimepicker({
|
|
||||||
maskInput: true,
|
|
||||||
format: 'Y-m-d H:i',minDate:0
|
|
||||||
});
|
|
||||||
|
|
||||||
{% endblock extra_script %}
|
|
||||||
|
@ -6,8 +6,6 @@
|
|||||||
{% block title %}Alliance Auth - Update AAR Link{% endblock %}
|
{% block title %}Alliance Auth - Update AAR Link{% endblock %}
|
||||||
|
|
||||||
{% block page_title %}{% trans "Update AAR Link" %}{% endblock page_title %}
|
{% block page_title %}{% trans "Update AAR Link" %}{% endblock page_title %}
|
||||||
{% block extra_css %}
|
|
||||||
<link href="{% static 'css/jquery.datetimepicker.css' %}" rel="stylesheet" type="text/css">{% endblock extra_css %}
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
@ -35,12 +33,3 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
||||||
{% block extra_script %}
|
|
||||||
|
|
||||||
$('#id_fleet_time').datetimepicker({
|
|
||||||
maskInput: true,
|
|
||||||
format: 'Y-m-d H:i',minDate:0
|
|
||||||
});
|
|
||||||
|
|
||||||
{% endblock extra_script %}
|
|
||||||
|
@ -6,8 +6,6 @@
|
|||||||
{% block title %}Alliance Auth - Update Structure Timer {% endblock %}
|
{% block title %}Alliance Auth - Update Structure Timer {% endblock %}
|
||||||
|
|
||||||
{% block page_title %}{% trans "Update AAR Link" %}{% endblock page_title %}
|
{% block page_title %}{% trans "Update AAR Link" %}{% endblock page_title %}
|
||||||
{% block extra_css %}
|
|
||||||
<link href="{% static 'css/jquery.datetimepicker.css' %}" rel="stylesheet" type="text/css">{% endblock extra_css %}
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
@ -35,12 +33,3 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
||||||
{% block extra_script %}
|
|
||||||
|
|
||||||
$('#id_fleet_time').datetimepicker({
|
|
||||||
maskInput: true,
|
|
||||||
format: 'Y-m-d H:i',minDate:0
|
|
||||||
});
|
|
||||||
|
|
||||||
{% endblock extra_script %}
|
|
||||||
|
@ -100,7 +100,8 @@ def remove_timer(request, timer_id):
|
|||||||
timer = get_object_or_404(Timer, id=timer_id)
|
timer = get_object_or_404(Timer, id=timer_id)
|
||||||
timer.delete()
|
timer.delete()
|
||||||
logger.debug("Deleting timer id %s by user %s" % (timer_id, request.user))
|
logger.debug("Deleting timer id %s by user %s" % (timer_id, request.user))
|
||||||
messages.success(request, _('Deleted timer in %(system)s at %(time)s.') % (timer.system, timer.eve_time))
|
messages.success(request, _('Deleted timer in %(system)s at %(time)s.') % {'system': timer.system,
|
||||||
|
'time': timer.eve_time})
|
||||||
return redirect("auth_timer_view")
|
return redirect("auth_timer_view")
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user