Merge master.

Fix FAT statistics generation.
This commit is contained in:
Adarnof 2017-04-07 00:21:14 -04:00
commit 96b04a269d
23 changed files with 232 additions and 242 deletions

View File

@ -458,10 +458,10 @@ SMF_DB = {
# 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_APP_KEY = ''
FLEETUP_USER_ID = ''
FLEETUP_API_ID = ''
FLEETUP_GROUP_ID = ''
FLEETUP_APP_KEY = os.environ.get('AA_FLEETUP_APP_KEY', '')
FLEETUP_USER_ID = os.environ.get('AA_FLEETUP_USER_ID', '')
FLEETUP_API_ID = os.environ.get('AA_FLEETUP_API_ID', '')
FLEETUP_GROUP_ID = os.environ.get('AA_FLEETUP_GROUP_ID', '')
#####################################################
##

View File

@ -68,6 +68,7 @@ If using Openfire, the following need to be set in accordance with the [install
- [BROADCAST_USER](#broadcast-user)
- [BROADCAST_USER_PASSWORD](#broadcast-user-password)
- [BROADCAST_SERVICE_NAME](#broadcast-service-name)
- [BROADCAST_IGNORE_INVALID_CERT](#broadcast-ignore-invalid-cert)
### Mumble
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_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
## Django
### SECRET_KEY
@ -150,6 +158,14 @@ List of databases available. Contains the Django database, and may include servi
Friendly name of the local language.
### TIME_ZONE
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
Absolute URL to serve static files from.
### STATIC_ROOT

View File

@ -68,4 +68,4 @@ Enter your database password and press Check. If all the boxes come back green p
## 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.

View File

@ -82,6 +82,8 @@ Navigate to the `Server` tab, `Server Manager` subtab, and select `System Proper
- Name: `plugin.broadcast.allowedUsers`
- Value: `broadcast@example.com`, replacing the domain name with yours
- 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
Channels are available which function like a chat room. Access can be controlled either by password or ACL (not unlike mumble).

View File

@ -6,8 +6,6 @@
{% block title %}Alliance Auth - Fatlink Create{% endblock %}
{% 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 %}
<div class="col-lg-12">

View File

@ -210,13 +210,14 @@ def click_fatlink_view(request, token, hash, fatname):
location['solar_system_name'] = \
c.Universe.get_universe_systems_system_id(system_id=location['solar_system_id']).result()[
'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'] = \
c.Universe.get_universe_structures_structure_id(structure_id=location['structure_id']).result()[
'name']
elif location['station_id']:
location['station_name'] = \
c.Universe.get_universe_stations_station_id(station_id=location['station_id']).result()['name']
else:
location['station_name'] = "No Station"
ship['ship_type_name'] = EveManager.get_itemtype(ship['ship_type_id']).name

View File

@ -23,8 +23,6 @@ git+https://github.com/adarnof/django-navhelper
# 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
git+https://github.com/adarnof/openfire-restapi

View File

@ -11,7 +11,6 @@ except ImportError:
import sleekxmpp
from django.conf import settings
import threading
from ofrestapi.users import Users as ofUsers
from ofrestapi import exception
@ -24,12 +23,6 @@ class OpenfireManager:
def __init__(self):
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
def __add_address_to_username(username):
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.register_plugin('xep_0030') # Service Discovery
xmpp.register_plugin('xep_0199') # XMPP Ping
if xmpp.connect():
if xmpp.connect(reattempt=False):
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:
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):
@ -184,17 +185,28 @@ class PingBot(sleekxmpp.ClientXMPP):
def __init__(self, jid, password, recipient, message):
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
# will receive it.
self.recipient = recipient
self.msg = message
# Success checking
self.message_sent = False
# The session_start event will be triggered when
# the bot establishes its connection with the server
# and the XML streams are ready for use. We want to
# listen for this event so that we we can initialize
# our roster.
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):
self.send_presence()
@ -203,20 +215,11 @@ class PingBot(sleekxmpp.ClientXMPP):
self.send_message(mto=self.recipient,
mbody=self.msg,
mtype='chat')
self.message_sent = True
# Using wait=True ensures that the send queue will be
# emptied before ending the session.
self.disconnect(wait=True)
class XmppThread(threading.Thread):
def __init__(self, thread_id, name, counter, group, message, ):
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)
class PingBotException(Exception):
pass

View File

@ -5,7 +5,7 @@ from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.auth.models import Group
from django.shortcuts import render, redirect
from services.forms import ServicePasswordForm
from .manager import OpenfireManager
from .manager import OpenfireManager, PingBotException
from .tasks import OpenfireTasks
from .forms import JabberBroadcastForm
from .models import OpenfireUser
@ -98,27 +98,29 @@ def jabber_broadcast_view(request):
if form.is_valid():
main_char = request.user.profile.main_character
logger.debug("Processing jabber broadcast for user %s with main character %s" % (request.user, main_char))
if main_char is not None:
message_to_send = form.cleaned_data[
'message'] + "\n##### SENT BY: " + "[" + main_char.corporation_ticker + "]" + \
main_char.character_name + " 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']
try:
if main_char is not None:
message_to_send = form.cleaned_data[
'message'] + "\n##### SENT BY: " + "[" + main_char.corporation_ticker + "]" + \
main_char.character_name + " 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, )
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:
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_message(group_to_send, message_to_send)
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:
form = JabberBroadcastForm()
form.fields['group'].choices = allchoices

View File

@ -10,6 +10,7 @@ class TeamspeakJoinForm(forms.Form):
username = forms.CharField(widget=forms.HiddenInput())
def clean(self):
if Teamspeak3Manager._get_userid(self.cleaned_data['username']):
return self.cleaned_data
with Teamspeak3Manager() as ts3man:
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'])

View File

@ -12,7 +12,31 @@ logger = logging.getLogger(__name__)
class Teamspeak3Manager:
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
def __get_created_server():
@ -33,12 +57,10 @@ class Teamspeak3Manager:
sanatized = "[" + corp_ticker + "]" + username
return sanatized[:30]
@staticmethod
def _get_userid(uid):
def _get_userid(self, uid)::
logger.debug("Looking for uid %s on TS3 server." % uid)
server = Teamspeak3Manager.__get_created_server()
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']:
logger.debug("Got userid %s for uid %s" % (ret['keys']['cldbid'], uid))
return ret['keys']['cldbid']
@ -47,11 +69,9 @@ class Teamspeak3Manager:
raise e
return None
@staticmethod
def _group_id_by_name(groupname):
server = Teamspeak3Manager.__get_created_server()
def _group_id_by_name(self, 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)
for group in group_cache:
logger.debug("Checking group %s" % group)
@ -61,34 +81,31 @@ class Teamspeak3Manager:
logger.debug("Group %s not found on server." % groupname)
return None
@staticmethod
def _create_group(groupname):
def _create_group(self, groupname):
logger.debug("Creating group %s on TS3 server." % groupname)
server = Teamspeak3Manager.__get_created_server()
sgid = Teamspeak3Manager._group_id_by_name(groupname)
sgid = self._group_id_by_name(groupname)
if not sgid:
logger.debug("Group does not yet exist. Proceeding with creation.")
ret = server.send_command('servergroupadd', {'name': groupname})
Teamspeak3Manager.__group_cache = None
ret = self.server.send_command('servergroupadd', {'name': groupname})
self.__group_cache = None
sgid = ret['keys']['sgid']
server.send_command('servergroupaddperm',
{'sgid': sgid, 'permsid': 'i_group_needed_modify_power', 'permvalue': 75,
'permnegated': 0, 'permskip': 0})
server.send_command('servergroupaddperm',
{'sgid': sgid, 'permsid': 'i_group_needed_member_add_power', 'permvalue': 100,
'permnegated': 0, 'permskip': 0})
server.send_command('servergroupaddperm',
{'sgid': sgid, 'permsid': 'i_group_needed_member_remove_power', 'permvalue': 100,
'permnegated': 0, 'permskip': 0})
self.server.send_command('servergroupaddperm',
{'sgid': sgid, 'permsid': 'i_group_needed_modify_power', 'permvalue': 75,
'permnegated': 0, 'permskip': 0})
self.server.send_command('servergroupaddperm',
{'sgid': sgid, 'permsid': 'i_group_needed_member_add_power', 'permvalue': 100,
'permnegated': 0, 'permskip': 0})
self.server.send_command('servergroupaddperm',
{'sgid': sgid, 'permsid': 'i_group_needed_member_remove_power', 'permvalue': 100,
'permnegated': 0, 'permskip': 0})
logger.info("Created group on TS3 server with name %s and id %s" % (groupname, sgid))
return sgid
@staticmethod
def _user_group_list(cldbid):
def _user_group_list(self, cldbid):
logger.debug("Retrieving group list for user with id %s" % cldbid)
server = Teamspeak3Manager.__get_created_server()
try:
groups = server.send_command('servergroupsbyclientid', {'cldbid': cldbid})
groups = self.server.send_command('servergroupsbyclientid', {'cldbid': cldbid})
except TeamspeakError as e:
if e.code == '1281': # no groups
groups = []
@ -107,11 +124,9 @@ class Teamspeak3Manager:
logger.debug("Returning name/id pairing: %s" % outlist)
return outlist
@staticmethod
def _group_list():
def _group_list(self):
logger.debug("Retrieving group list on TS3 server.")
server = Teamspeak3Manager.__get_created_server()
group_cache = server.send_command('servergrouplist')
group_cache = self.server.send_command('servergrouplist')
logger.debug("Received group cache from server: %s" % group_cache)
outlist = {}
if group_cache:
@ -123,35 +138,30 @@ class Teamspeak3Manager:
logger.debug("Returning name/id pairing: %s" % outlist)
return outlist
@staticmethod
def _add_user_to_group(uid, groupid):
def _add_user_to_group(self, uid, groupid):
logger.debug("Adding group id %s to TS3 user id %s" % (groupid, uid))
server = Teamspeak3Manager.__get_created_server()
user_groups = Teamspeak3Manager._user_group_list(uid)
user_groups = self._user_group_list(uid)
if groupid not in user_groups.values():
logger.debug("User does not have group already. Issuing command to add.")
server.send_command('servergroupaddclient',
{'sgid': str(groupid), 'cldbid': uid})
self.server.send_command('servergroupaddclient',
{'sgid': str(groupid), 'cldbid': uid})
logger.info("Added user id %s to group id %s on TS3 server." % (uid, groupid))
@staticmethod
def _remove_user_from_group(uid, groupid):
def _remove_user_from_group(self, uid, groupid):
logger.debug("Removing group id %s from TS3 user id %s" % (groupid, uid))
server = Teamspeak3Manager.__get_created_server()
user_groups = Teamspeak3Manager._user_group_list(uid)
user_groups = self._user_group_list(uid)
if str(groupid) in user_groups.values():
logger.debug("User is in group. Issuing command to remove.")
server.send_command('servergroupdelclient',
{'sgid': str(groupid), 'cldbid': uid})
self.server.send_command('servergroupdelclient',
{'sgid': str(groupid), 'cldbid': uid})
logger.info("Removed user id %s from group id %s on TS3 server." % (uid, groupid))
@staticmethod
def _sync_ts_group_db():
def _sync_ts_group_db(self):
logger.debug("_sync_ts_group_db function called.")
try:
remote_groups = Teamspeak3Manager._group_list()
remote_groups = self._group_list()
local_groups = TSgroup.objects.all()
logger.debug("Comparing remote groups to TSgroup objects: %s" % local_groups)
for key in remote_groups:
@ -176,23 +186,20 @@ class Teamspeak3Manager:
except:
logger.exception("An unhandled exception has occured while syncing TS groups.")
@staticmethod
def add_user(username, corp_ticker):
username_clean = Teamspeak3Manager.__santatize_username(Teamspeak3Manager.__generate_username(username,
corp_ticker))
server = Teamspeak3Manager.__get_created_server()
def add_user(self, username, corp_ticker):
username_clean = self.__santatize_username(self.__generate_username(username, corp_ticker))
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:
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:
ret = server.send_command('tokenadd', {'tokentype': 0, 'tokenid1': alliance_group_id, 'tokenid2': 0,
'tokendescription': username_clean,
'tokencustomset': "ident=sso_uid value=%s" % username_clean})
ret = self.server.send_command('tokenadd', {'tokentype': 0, 'tokenid1': alliance_group_id, 'tokenid2': 0,
'tokendescription': username_clean,
'tokencustomset': "ident=sso_uid value=%s" % username_clean})
except TeamspeakError as e:
logger.error("Failed to add teamspeak user %s: %s" % (username, str(e)))
return "",""
@ -205,24 +212,22 @@ class Teamspeak3Manager:
logger.exception("Failed to add teamspeak user %s - received response: %s" % (username_clean, ret))
return "", ""
@staticmethod
def delete_user(uid):
server = Teamspeak3Manager.__get_created_server()
user = Teamspeak3Manager._get_userid(uid)
def delete_user(self, uid):
user = self._get_userid(uid)
logger.debug("Deleting user %s with id %s from TS3 server." % (user, uid))
if user:
clients = server.send_command('clientlist')
clients = self.server.send_command('clientlist')
for client in clients:
try:
if client['keys']['client_database_id'] == user:
logger.debug("Found user %s on TS3 server - issuing deletion command." % user)
server.send_command('clientkick', {'clid': client['keys']['clid'], 'reasonid': 5,
'reasonmsg': 'Auth service deleted'})
self.server.send_command('clientkick', {'clid': client['keys']['clid'], 'reasonid': 5,
'reasonmsg': 'Auth service deleted'})
except:
logger.exception("Failed to delete user id %s from TS3 - received response %s" % (uid, client))
return False
try:
ret = server.send_command('clientdbdelete', {'cldbid': user})
ret = self.server.send_command('clientdbdelete', {'cldbid': user})
except TeamspeakError as e:
logger.error("Failed to delete teamspeak user %s: %s" % (uid, str(e)))
return False
@ -236,33 +241,24 @@ class Teamspeak3Manager:
logger.warn("User with id %s not found on TS3 server. Assuming succesful deletion." % uid)
return True
@staticmethod
def check_user_exists(uid):
if Teamspeak3Manager._get_userid(uid):
def check_user_exists(self, uid):
if self._get_userid(uid):
return True
return False
@staticmethod
def generate_new_permissionkey(uid, username, corpticker):
def generate_new_permissionkey(self, uid, username, corpticker):
logger.debug("Re-issuing permission key for user id %s" % uid)
Teamspeak3Manager.delete_user(uid)
return Teamspeak3Manager.add_user(username, corpticker)
self.delete_user(uid)
return self.add_user(username, corpticker)
@staticmethod
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):
def update_groups(self, 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 = []
remgroups = []
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)
for key in user_ts_groups:
user_ts_groups[key] = int(user_ts_groups[key])
@ -276,8 +272,8 @@ class Teamspeak3Manager:
for g in addgroups:
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:
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)

View File

@ -22,11 +22,12 @@ class Teamspeak3Tasks:
def delete_user(cls, user, notify_user=False):
if cls.has_account(user):
logger.debug("User %s has TS3 account %s. Deleting." % (user, user.teamspeak3.uid))
if Teamspeak3Manager.delete_user(user.teamspeak3.uid):
user.teamspeak3.delete()
if notify_user:
notify(user, 'TeamSpeak3 Account Disabled', level='danger')
return True
with Teamspeak3Manager() as ts3man:
if ts3man.delete_user(user.teamspeak3.uid):
user.teamspeak3.delete()
if notify_user:
notify(user, 'TeamSpeak3 Account Disabled', level='danger')
return True
return False
@staticmethod
@ -40,7 +41,8 @@ class Teamspeak3Tasks:
@app.task()
def run_ts3_group_update():
logger.debug("TS3 installed. Syncing local group objects.")
Teamspeak3Manager._sync_ts_group_db()
with Teamspeak3Manager() as ts3man:
ts3man._sync_ts_group_db()
@staticmethod
def disable():
@ -70,7 +72,8 @@ class Teamspeak3Tasks:
groups[ts_group.ts_group_name] = ts_group.ts_group_id
logger.debug("Updating user %s teamspeak3 groups to %s" % (user, groups))
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)
except TeamspeakError as e:
logger.error("Error occured while syncing TS groups for %s: %s" % (user, str(e)))

View File

@ -75,20 +75,22 @@ class Teamspeak3HooksTestCase(TestCase):
@mock.patch(MODULE_PATH + '.tasks.Teamspeak3Manager')
def test_update_all_groups(self, manager):
instance = manager.return_value.__enter__.return_value
service = self.service()
service.update_all_groups()
# Check member and blue user have groups updated
self.assertTrue(manager.update_groups.called)
self.assertEqual(manager.update_groups.call_count, 2)
self.assertTrue(instance.update_groups.called)
self.assertEqual(instance.update_groups.call_count, 2)
def test_update_groups(self):
# Check member has Member group updated
with mock.patch(MODULE_PATH + '.tasks.Teamspeak3Manager') as manager:
instance = manager.return_value.__enter__.return_value
service = self.service()
member = User.objects.get(username=self.member)
service.update_groups(member)
self.assertTrue(manager.update_groups.called)
args, kwargs = manager.update_groups.call_args
self.assertTrue(instance.update_groups.called)
args, kwargs = instance.update_groups.call_args
# update_groups(user.teamspeak3.uid, groups)
self.assertEqual({'Member': 1}, args[1]) # Check groups
self.assertEqual(self.member, args[0]) # Check uid
@ -98,7 +100,7 @@ class Teamspeak3HooksTestCase(TestCase):
service = self.service()
none_user = User.objects.get(username=self.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')
def test_validate_user(self, manager):
@ -112,7 +114,7 @@ class Teamspeak3HooksTestCase(TestCase):
none_user = User.objects.get(username=self.none_user)
Teamspeak3User.objects.create(user=none_user, uid='abc123', perm_key='132ACB')
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):
none_teamspeak3 = User.objects.get(username=self.none_user).teamspeak3
@ -124,7 +126,7 @@ class Teamspeak3HooksTestCase(TestCase):
result = service.delete_user(member)
self.assertTrue(result)
self.assertTrue(manager.delete_user.called)
self.assertTrue(manager.return_value.__enter__.return_value.delete_user.called)
with self.assertRaises(ObjectDoesNotExist):
teamspeak3_user = User.objects.get(username=self.member).teamspeak3
@ -182,11 +184,12 @@ class Teamspeak3ViewsTestCase(TestCase):
def test_activate(self, manager, forms_manager):
self.login()
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'))
self.assertTrue(manager.add_user.called)
self.assertTrue(instance.add_user.called)
teamspeak3_user = Teamspeak3User.objects.get(user=self.member)
self.assertTrue(teamspeak3_user.uid)
self.assertTrue(teamspeak3_user.perm_key)
@ -197,11 +200,12 @@ class Teamspeak3ViewsTestCase(TestCase):
def test_activate_blue(self, manager, forms_manager):
self.login(self.blue_user)
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'))
self.assertTrue(manager.add_blue_user.called)
self.assertTrue(instance.add_blue_user.called)
teamspeak3_user = Teamspeak3User.objects.get(user=self.blue_user)
self.assertTrue(teamspeak3_user.uid)
self.assertTrue(teamspeak3_user.perm_key)
@ -213,15 +217,16 @@ class Teamspeak3ViewsTestCase(TestCase):
self.login()
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'})
data = {'username': 'auth_member'}
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.assertTrue(manager.return_value.__enter__.return_value.update_groups.called)
@mock.patch(MODULE_PATH + '.tasks.Teamspeak3Manager')
def test_deactivate(self, manager):
@ -230,7 +235,7 @@ class Teamspeak3ViewsTestCase(TestCase):
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)
with self.assertRaises(ObjectDoesNotExist):
teamspeak3_user = User.objects.get(pk=self.member.pk).teamspeak3
@ -241,7 +246,7 @@ class Teamspeak3ViewsTestCase(TestCase):
self.login()
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'))
@ -249,7 +254,7 @@ class Teamspeak3ViewsTestCase(TestCase):
ts3_user = Teamspeak3User.objects.get(uid='valid_member')
self.assertEqual(ts3_user.uid, 'valid_member')
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 + '.views.Teamspeak3Manager')
@ -257,7 +262,8 @@ class Teamspeak3ViewsTestCase(TestCase):
self.login(self.blue_user)
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'))
@ -265,7 +271,7 @@ class Teamspeak3ViewsTestCase(TestCase):
ts3_user = Teamspeak3User.objects.get(uid='valid_blue')
self.assertEqual(ts3_user.uid, 'valid_blue')
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):

View File

@ -50,13 +50,24 @@ class TS3Proto:
return True
def disconnect(self):
self.send_command("quit")
self._conn.close()
self._connected = False
self._log.info('Disconnected')
if self._connected:
try:
self.send("quit")
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):
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)
data = []

View File

@ -22,9 +22,9 @@ def activate_teamspeak3(request):
character = request.user.profile.main_character
ticker = character.corporation_ticker
logger.debug("Adding TS3 user for user %s with main character %s" % (request.user, character))
result = Teamspeak3Manager.add_user(character.character_name, ticker)
with Teamspeak3Manager() as ts3man:
logger.debug("Adding TS3 user for user %s with main character %s" % (request.user, character))
result = ts3man.add_user(character.character_name, ticker)
# if its empty we failed
if result[0] is not "":
@ -52,7 +52,7 @@ def verify_teamspeak3(request):
logger.debug("Validated user %s joined TS server" % request.user)
return redirect("auth_services")
else:
form = TeamspeakJoinForm({'username': request.user.teamspeak3.uid})
form = TeamspeakJoinForm(initial={'username': request.user.teamspeak3.uid})
context = {
'form': form,
'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):
logger.info("Successfully deactivated TS3 for user %s" % request.user)
messages.success(request, 'Deactivated 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.')
else:
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")
@ -81,11 +82,12 @@ def reset_teamspeak3_perm(request):
return redirect("auth_services")
character = request.user.profile.main_character
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))
result = Teamspeak3Manager.generate_new_permissionkey(request.user.teamspeak3.uid, character.character_name,
character.corporation_ticker)
logger.debug("Generating new permission key for user %s with main character %s" % (request.user, character))
result = ts3man.generate_new_permissionkey(request.user.teamspeak3.uid, character.character_name,
character.corporation_ticker)
# if blank we failed
if result[0] != "":

View File

@ -7,9 +7,6 @@
{% block title %}{% trans "Alliance Auth - Structure Timer Create" %}{% endblock %}
{% block page_title %}{% trans "Timer Create" %}{% endblock page_title %}
{% block extra_css %}
{% include 'bundles/jquery-datetimepicker-css.html' %}
{% endblock extra_css %}
{% block content %}
<div class="col-lg-12">
@ -30,17 +27,3 @@
</div>
{% 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 %}

View File

@ -7,8 +7,10 @@
{% block title %}Alliance Auth - Update Fleet Operation {% endblock %}
{% 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 %}
{% include 'bundles/jquery-datetimepicker-css.html' %}
{% endblock extra_css %}
{% block content %}
@ -37,6 +39,10 @@
{% endblock content %}
{% block extra_javascript %}
{% include 'bundles/jquery-datetimepicker-js.html' %}
{% endblock %}
{% block extra_script %}
$('#id_start').datetimepicker({

View File

@ -7,7 +7,8 @@
{% block page_title %}{% trans "SRP Fleet Create" %}{% endblock page_title %}
{% 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 %}
@ -40,6 +41,10 @@
{% endblock content %}
{% block extra_javascript %}
{% include 'bundles/jquery-datetimepicker-js.html' %}
{% endblock %}
{% block extra_script %}
$('#id_fleet_time').datetimepicker({

View File

@ -6,8 +6,6 @@
{% block title %}SRP Request{% endblock %}
{% 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 %}
@ -31,12 +29,3 @@
</div>
{% endblock content %}
{% block extra_script %}
$('#id_fleet_time').datetimepicker({
maskInput: true,
format: 'Y-m-d H:i',minDate:0
});
{% endblock extra_script %}

View File

@ -6,8 +6,6 @@
{% block title %}Alliance Auth - Update SRP Amount{% endblock %}
{% 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 %}
@ -31,12 +29,3 @@
</div>
{% endblock content %}
{% block extra_script %}
$('#id_fleet_time').datetimepicker({
maskInput: true,
format: 'Y-m-d H:i',minDate:0
});
{% endblock extra_script %}

View File

@ -6,8 +6,6 @@
{% block title %}Alliance Auth - Update AAR Link{% endblock %}
{% 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 %}
@ -35,12 +33,3 @@
</div>
{% endblock content %}
{% block extra_script %}
$('#id_fleet_time').datetimepicker({
maskInput: true,
format: 'Y-m-d H:i',minDate:0
});
{% endblock extra_script %}

View File

@ -6,8 +6,6 @@
{% block title %}Alliance Auth - Update Structure Timer {% endblock %}
{% 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 %}
@ -35,12 +33,3 @@
</div>
{% endblock content %}
{% block extra_script %}
$('#id_fleet_time').datetimepicker({
maskInput: true,
format: 'Y-m-d H:i',minDate:0
});
{% endblock extra_script %}

View File

@ -100,7 +100,8 @@ def remove_timer(request, timer_id):
timer = get_object_or_404(Timer, id=timer_id)
timer.delete()
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")