From 3a1d0d0335279acfa246391953b3fb875f453bdc Mon Sep 17 00:00:00 2001 From: Adarnof Date: Sat, 25 Feb 2017 17:24:12 -0500 Subject: [PATCH 01/11] use v1 Universe for structure names --- fleetactivitytracking/views.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/fleetactivitytracking/views.py b/fleetactivitytracking/views.py index 067d91c9..f31f7cf7 100644 --- a/fleetactivitytracking/views.py +++ b/fleetactivitytracking/views.py @@ -212,13 +212,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 From 3e09f2179f5a776856bd47389650305dc1577f40 Mon Sep 17 00:00:00 2001 From: Basraah Date: Sun, 26 Feb 2017 19:37:26 +1000 Subject: [PATCH 02/11] Fix translation Closes #740 --- timerboard/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/timerboard/views.py b/timerboard/views.py index 6bcd6b4c..fe63c3c3 100755 --- a/timerboard/views.py +++ b/timerboard/views.py @@ -111,7 +111,8 @@ def remove_timer(request, timer_id): timer = Timer.objects.get(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}) else: logger.error( "Unable to delete timer id %s for user %s - timer matching id not found." % (timer_id, request.user)) From 693016e171f766e7ce70e1a0083bdf8165906e4b Mon Sep 17 00:00:00 2001 From: Basraah Date: Mon, 27 Feb 2017 19:29:05 +1000 Subject: [PATCH 03/11] CDN Javascript & CSS fix and cleanup (#743) * Add missing javascript and css * Remove unnecessary javascript and css --- .../fleetactivitytracking/fatlinkformatter.html | 2 -- stock/templates/registered/addtimer.html | 17 ----------------- stock/templates/registered/optimerupdate.html | 8 +++++++- stock/templates/registered/srpfleetadd.html | 7 ++++++- stock/templates/registered/srpfleetrequest.html | 11 ----------- .../registered/srpfleetrequestamount.html | 11 ----------- stock/templates/registered/srpfleetupdate.html | 11 ----------- stock/templates/registered/timerupdate.html | 11 ----------- 8 files changed, 13 insertions(+), 65 deletions(-) diff --git a/fleetactivitytracking/templates/fleetactivitytracking/fatlinkformatter.html b/fleetactivitytracking/templates/fleetactivitytracking/fatlinkformatter.html index d08e3873..37accc49 100644 --- a/fleetactivitytracking/templates/fleetactivitytracking/fatlinkformatter.html +++ b/fleetactivitytracking/templates/fleetactivitytracking/fatlinkformatter.html @@ -6,8 +6,6 @@ {% block title %}Alliance Auth - Fatlink Create{% endblock %} {% block page_title %}{% trans "Create Fatlink" %}{% endblock page_title %} -{% block extra_css %} - {% endblock extra_css %} {% block content %}
diff --git a/stock/templates/registered/addtimer.html b/stock/templates/registered/addtimer.html index 11b1c2e3..f42f243a 100755 --- a/stock/templates/registered/addtimer.html +++ b/stock/templates/registered/addtimer.html @@ -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 %}
@@ -30,17 +27,3 @@
{% 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 %} diff --git a/stock/templates/registered/optimerupdate.html b/stock/templates/registered/optimerupdate.html index 318ec842..fd75a055 100755 --- a/stock/templates/registered/optimerupdate.html +++ b/stock/templates/registered/optimerupdate.html @@ -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 %} - {% 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({ diff --git a/stock/templates/registered/srpfleetadd.html b/stock/templates/registered/srpfleetadd.html index 71f4bc2b..39145ae5 100755 --- a/stock/templates/registered/srpfleetadd.html +++ b/stock/templates/registered/srpfleetadd.html @@ -7,7 +7,8 @@ {% block page_title %}{% trans "SRP Fleet Create" %}{% endblock page_title %} {% block extra_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({ diff --git a/stock/templates/registered/srpfleetrequest.html b/stock/templates/registered/srpfleetrequest.html index 8cc91f18..c2beff83 100755 --- a/stock/templates/registered/srpfleetrequest.html +++ b/stock/templates/registered/srpfleetrequest.html @@ -6,8 +6,6 @@ {% block title %}Alliance Auth - SRP Request{% endblock %} {% block page_title %}{% trans "SRP Request" %}{% endblock page_title %} -{% block extra_css %} - {% endblock extra_css %} {% block content %} @@ -42,12 +40,3 @@
{% endblock content %} - -{% block extra_script %} - - $('#id_fleet_time').datetimepicker({ - maskInput: true, - format: 'Y-m-d H:i',minDate:0 - }); - -{% endblock extra_script %} diff --git a/stock/templates/registered/srpfleetrequestamount.html b/stock/templates/registered/srpfleetrequestamount.html index 648f835f..cc1f4fe6 100755 --- a/stock/templates/registered/srpfleetrequestamount.html +++ b/stock/templates/registered/srpfleetrequestamount.html @@ -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 %} - {% endblock extra_css %} {% block content %} @@ -31,12 +29,3 @@ {% endblock content %} - -{% block extra_script %} - - $('#id_fleet_time').datetimepicker({ - maskInput: true, - format: 'Y-m-d H:i',minDate:0 - }); - -{% endblock extra_script %} diff --git a/stock/templates/registered/srpfleetupdate.html b/stock/templates/registered/srpfleetupdate.html index ef603113..207ec22e 100755 --- a/stock/templates/registered/srpfleetupdate.html +++ b/stock/templates/registered/srpfleetupdate.html @@ -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 %} - {% endblock extra_css %} {% block content %} @@ -35,12 +33,3 @@ {% endblock content %} - -{% block extra_script %} - - $('#id_fleet_time').datetimepicker({ - maskInput: true, - format: 'Y-m-d H:i',minDate:0 - }); - -{% endblock extra_script %} diff --git a/stock/templates/registered/timerupdate.html b/stock/templates/registered/timerupdate.html index bf59dc0c..11ddcdb1 100644 --- a/stock/templates/registered/timerupdate.html +++ b/stock/templates/registered/timerupdate.html @@ -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 %} - {% endblock extra_css %} {% block content %} @@ -35,12 +33,3 @@ {% endblock content %} - -{% block extra_script %} - - $('#id_fleet_time').datetimepicker({ - maskInput: true, - format: 'Y-m-d H:i',minDate:0 - }); - -{% endblock extra_script %} From e6e1339d710d7bacdbe8bafaf45fd7362a533d21 Mon Sep 17 00:00:00 2001 From: Nathan Morgan Date: Tue, 28 Feb 2017 01:27:24 +0000 Subject: [PATCH 04/11] Added Google reCaptcha (#738) --- alliance_auth/settings.py.example | 10 ++++++++++ authentication/forms.py | 9 +++++++++ docs/installation/auth/settings.md | 15 +++++++++++++++ requirements.txt | 1 + 4 files changed, 35 insertions(+) diff --git a/alliance_auth/settings.py.example b/alliance_auth/settings.py.example index 2aa364b2..cfc68fce 100644 --- a/alliance_auth/settings.py.example +++ b/alliance_auth/settings.py.example @@ -67,6 +67,7 @@ INSTALLED_APPS = [ 'permissions_tool', 'geelweb.django.navhelper', 'bootstrap_pagination', + 'captcha', # Services 'services.modules.mumble', @@ -221,6 +222,15 @@ CACHES = { } } +# Google Recaptcha + +CAPTCHA_ENABLED = False + +RECAPTCHA_PUBLIC_KEY = 'MyRecaptchaKey' +RECAPTCHA_PRIVATE_KEY = 'MyRecaptchaPrivateKey' + +NOCAPTCHA = True + ##################################################### ## ## Auth configuration starts here diff --git a/authentication/forms.py b/authentication/forms.py index 76aa3771..7374ac03 100644 --- a/authentication/forms.py +++ b/authentication/forms.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from django import forms from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import User +from django.conf import settings import re @@ -9,6 +10,10 @@ class LoginForm(forms.Form): username = forms.CharField(label=_('Username'), max_length=32, required=True) password = forms.CharField(label=_('Password'), widget=forms.PasswordInput()) + if getattr(settings, 'CAPTCHA_ENABLED', False): + from captcha.fields import ReCaptchaField + captcha = ReCaptchaField() + class RegistrationForm(forms.Form): username = forms.CharField(label=_('Username'), max_length=30, required=True) @@ -17,6 +22,10 @@ class RegistrationForm(forms.Form): email = forms.CharField(label=_('Email'), max_length=254, required=True) email_again = forms.CharField(label=_('Email Again'), max_length=254, required=True) + if getattr(settings, 'CAPTCHA_ENABLED', False): + from captcha.fields import ReCaptchaField + captcha = ReCaptchaField() + def clean(self): if ' ' in self.cleaned_data['username']: raise forms.ValidationError('Username cannot contain a space') diff --git a/docs/installation/auth/settings.md b/docs/installation/auth/settings.md index 8347660f..8fa74d05 100644 --- a/docs/installation/auth/settings.md +++ b/docs/installation/auth/settings.md @@ -136,6 +136,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 +157,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 diff --git a/requirements.txt b/requirements.txt index 5ccdd5a0..a704a314 100755 --- a/requirements.txt +++ b/requirements.txt @@ -16,6 +16,7 @@ django-bootstrap-form django-navhelper django-bootstrap-pagination django-redis>=4.4 +django-recaptcha # awating release for fix to celery/django-celery#447 # django-celery From c6118beddfb47353f88af8c38d83db3bc6ae6d31 Mon Sep 17 00:00:00 2001 From: Basraah Date: Tue, 28 Feb 2017 11:28:51 +1000 Subject: [PATCH 05/11] Teamspeak 3 Updates (#741) * Correct duplicate error and success messages to user * Read out all buffer bytes before sending command * Convert ts3 manager to use a single connection Each instance of the class will now use a single connection and should be cleanly disconnected when finished. Compatible with `with` clauses and will automatically disconnect from the TS3 server when it exits the `with` block. * Update TS3 manager consumers to use new style * Update unit tests to use new style manager --- services/modules/teamspeak3/forms.py | 5 +- services/modules/teamspeak3/manager.py | 185 ++++++++++++------------ services/modules/teamspeak3/tasks.py | 17 ++- services/modules/teamspeak3/tests.py | 42 +++--- services/modules/teamspeak3/util/ts3.py | 19 ++- services/modules/teamspeak3/views.py | 50 ++++--- 6 files changed, 169 insertions(+), 149 deletions(-) diff --git a/services/modules/teamspeak3/forms.py b/services/modules/teamspeak3/forms.py index 4377ebcc..ec4366b7 100644 --- a/services/modules/teamspeak3/forms.py +++ b/services/modules/teamspeak3/forms.py @@ -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']) diff --git a/services/modules/teamspeak3/manager.py b/services/modules/teamspeak3/manager.py index 5661b62f..85cfdd2a 100755 --- a/services/modules/teamspeak3/manager.py +++ b/services/modules/teamspeak3/manager.py @@ -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(): @@ -38,12 +62,10 @@ class Teamspeak3Manager: sanatized = "[BLUE][" + 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'] @@ -52,11 +74,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) @@ -66,34 +86,30 @@ 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 = [] @@ -112,11 +128,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: @@ -128,35 +142,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: @@ -181,23 +190,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 settings.DEFAULT_AUTH_GROUP not in server_groups: - Teamspeak3Manager._create_group(settings.DEFAULT_AUTH_GROUP) + self._create_group(settings.DEFAULT_AUTH_GROUP) - alliance_group_id = Teamspeak3Manager._group_id_by_name(settings.DEFAULT_AUTH_GROUP) + alliance_group_id = self._group_id_by_name(settings.DEFAULT_AUTH_GROUP) 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 "","" @@ -210,22 +216,19 @@ class Teamspeak3Manager: logger.exception("Failed to add teamspeak user %s - received response: %s" % (username_clean, ret)) return "", "" - @staticmethod - def add_blue_user(username, corp_ticker): - username_clean = Teamspeak3Manager.__santatize_username(Teamspeak3Manager.__generate_username_blue(username, - corp_ticker)) - server = Teamspeak3Manager.__get_created_server() + def add_blue_user(self, username, corp_ticker): + username_clean = self.__santatize_username(self.__generate_username_blue(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 settings.DEFAULT_BLUE_GROUP not in server_groups: - Teamspeak3Manager._create_group(settings.DEFAULT_BLUE_GROUP) + self._create_group(settings.DEFAULT_BLUE_GROUP) - blue_group_id = Teamspeak3Manager._group_id_by_name(settings.DEFAULT_BLUE_GROUP) + blue_group_id = self._group_id_by_name(settings.DEFAULT_BLUE_GROUP) try: - ret = server.send_command('tokenadd', {'tokentype': 0, 'tokenid1': blue_group_id, 'tokenid2': 0, - 'tokendescription': username_clean, - 'tokencustomset': "ident=sso_uid value=%s" % username_clean}) + ret = self.server.send_command('tokenadd', {'tokentype': 0, 'tokenid1': blue_group_id, 'tokenid2': 0, + 'tokendescription': username_clean, + 'tokencustomset': "ident=sso_uid value=%s" % username_clean}) except TeamspeakError as e: logger.error("Failed to add blue teamspeak user %s: %s" % (username, str(e))) return "","" @@ -238,24 +241,22 @@ class Teamspeak3Manager: logger.exception("Failed to add blue 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 @@ -269,33 +270,29 @@ 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): + def generate_new_blue_permissionkey(self, 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) + self.delete_user(uid) + return self.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]) @@ -309,8 +306,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) diff --git a/services/modules/teamspeak3/tasks.py b/services/modules/teamspeak3/tasks.py index 4643449f..39d3f87a 100644 --- a/services/modules/teamspeak3/tasks.py +++ b/services/modules/teamspeak3/tasks.py @@ -25,11 +25,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 @@ -43,7 +44,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(): @@ -73,7 +75,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))) diff --git a/services/modules/teamspeak3/tests.py b/services/modules/teamspeak3/tests.py index bb190e2d..b0426f0b 100644 --- a/services/modules/teamspeak3/tests.py +++ b/services/modules/teamspeak3/tests.py @@ -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): diff --git a/services/modules/teamspeak3/util/ts3.py b/services/modules/teamspeak3/util/ts3.py index d36acfef..901dcc93 100755 --- a/services/modules/teamspeak3/util/ts3.py +++ b/services/modules/teamspeak3/util/ts3.py @@ -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 = [] diff --git a/services/modules/teamspeak3/views.py b/services/modules/teamspeak3/views.py index 4eee0799..d667cbdb 100644 --- a/services/modules/teamspeak3/views.py +++ b/services/modules/teamspeak3/views.py @@ -28,17 +28,17 @@ def activate_teamspeak3(request): authinfo = AuthServicesInfo.objects.get(user=request.user) character = EveManager.get_main_character(request.user) ticker = character.corporation_ticker - - if authinfo.state == BLUE_STATE: - logger.debug("Adding TS3 user for blue user %s with main character %s" % (request.user, character)) - # Blue members should have alliance ticker (if in alliance) - if EveAllianceInfo.objects.filter(alliance_id=character.alliance_id).exists(): - alliance = EveAllianceInfo.objects.filter(alliance_id=character.alliance_id)[0] - ticker = alliance.alliance_ticker - result = Teamspeak3Manager.add_blue_user(character.character_name, ticker) - else: - 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: + if authinfo.state == BLUE_STATE: + logger.debug("Adding TS3 user for blue user %s with main character %s" % (request.user, character)) + # Blue members should have alliance ticker (if in alliance) + if EveAllianceInfo.objects.filter(alliance_id=character.alliance_id).exists(): + alliance = EveAllianceInfo.objects.filter(alliance_id=character.alliance_id)[0] + ticker = alliance.alliance_ticker + result = ts3man.add_blue_user(character.character_name, ticker) + else: + 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 "": @@ -82,8 +82,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") @@ -96,18 +97,19 @@ def reset_teamspeak3_perm(request): authinfo = AuthServicesInfo.objects.get(user=request.user) character = EveManager.get_main_character(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) - if authinfo.state == BLUE_STATE: - logger.debug( - "Generating new permission key for blue user %s with main character %s" % (request.user, character)) - result = Teamspeak3Manager.generate_new_blue_permissionkey(request.user.teamspeak3.uid, - character.character_name, - character.corporation_ticker) - else: - 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) + if authinfo.state == BLUE_STATE: + logger.debug( + "Generating new permission key for blue user %s with main character %s" % (request.user, character)) + result = ts3man.generate_new_blue_permissionkey(request.user.teamspeak3.uid, + character.character_name, + character.corporation_ticker) + else: + 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] != "": From 2e274d3baf1ca9933eb0e02a1fb876d6beb24550 Mon Sep 17 00:00:00 2001 From: Basraah Date: Tue, 28 Feb 2017 11:30:26 +1000 Subject: [PATCH 06/11] Update Openfire broadcast tool (#742) Allow users to ignore invalid certificates. Added some limited user feedback. Removed threading. Prevent infinite connection attempt loops. --- docs/installation/auth/settings.md | 1 + docs/installation/services/openfire.md | 2 ++ services/modules/openfire/manager.py | 47 ++++++++++++++------------ services/modules/openfire/views.py | 38 +++++++++++---------- 4 files changed, 48 insertions(+), 40 deletions(-) diff --git a/docs/installation/auth/settings.md b/docs/installation/auth/settings.md index 8fa74d05..e854e165 100644 --- a/docs/installation/auth/settings.md +++ b/docs/installation/auth/settings.md @@ -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: diff --git a/docs/installation/services/openfire.md b/docs/installation/services/openfire.md index ac4d1ae8..34c7715b 100644 --- a/docs/installation/services/openfire.md +++ b/docs/installation/services/openfire.md @@ -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). diff --git a/services/modules/openfire/manager.py b/services/modules/openfire/manager.py index 672d57f7..7cf18ea7 100755 --- a/services/modules/openfire/manager.py +++ b/services/modules/openfire/manager.py @@ -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 diff --git a/services/modules/openfire/views.py b/services/modules/openfire/views.py index bebb3309..712ac0c9 100644 --- a/services/modules/openfire/views.py +++ b/services/modules/openfire/views.py @@ -10,7 +10,7 @@ from eveonline.managers import EveManager from eveonline.models import EveCharacter 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 @@ -103,27 +103,29 @@ def jabber_broadcast_view(request): if form.is_valid(): main_char = EveManager.get_main_character(request.user) 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 From 9238ac97cfdd495e537991a82060faaad6734128 Mon Sep 17 00:00:00 2001 From: Basraah Date: Tue, 28 Feb 2017 11:38:47 +1000 Subject: [PATCH 07/11] Remove unnecessary package --- requirements.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index a704a314..14fbe899 100755 --- a/requirements.txt +++ b/requirements.txt @@ -22,8 +22,6 @@ django-recaptcha # 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 From de47e9487049f6ded4d6cd48e5682e8066519aca Mon Sep 17 00:00:00 2001 From: Basraah Date: Tue, 28 Feb 2017 11:39:25 +1000 Subject: [PATCH 08/11] Version bump to 1.15.1 --- alliance_auth/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alliance_auth/__init__.py b/alliance_auth/__init__.py index 4fbf5773..0ee627f0 100644 --- a/alliance_auth/__init__.py +++ b/alliance_auth/__init__.py @@ -4,5 +4,5 @@ from __future__ import absolute_import, unicode_literals # Django starts so that shared_task will use this app. from .celeryapp import app as celery_app # noqa -__version__ = '1.15.0' +__version__ = '1.15.1' NAME = 'Alliance Auth v%s' % __version__ From ecb74e67b0f1f438af3ada1a36ce9cd7a3ee3304 Mon Sep 17 00:00:00 2001 From: Basraah Date: Tue, 28 Feb 2017 12:41:59 +1000 Subject: [PATCH 09/11] Fix link format --- docs/installation/auth/settings.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation/auth/settings.md b/docs/installation/auth/settings.md index e854e165..e7d3eeb6 100644 --- a/docs/installation/auth/settings.md +++ b/docs/installation/auth/settings.md @@ -137,8 +137,8 @@ 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 +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) From 27628dc70b2df3a95c565e8d347e5421f896569e Mon Sep 17 00:00:00 2001 From: Adarnof Date: Tue, 7 Mar 2017 16:28:19 -0500 Subject: [PATCH 10/11] include http in front of example settings @porowns --- docs/installation/services/jacknife.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation/services/jacknife.md b/docs/installation/services/jacknife.md index 20c1c764..d23cc394 100644 --- a/docs/installation/services/jacknife.md +++ b/docs/installation/services/jacknife.md @@ -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. From 7d0aa2b5ecae02922a7c2c5fc51ac384461f29c6 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Tue, 7 Mar 2017 23:41:48 -0500 Subject: [PATCH 11/11] Wait to validate user is on TS after presenting form (#758) --- services/modules/teamspeak3/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/modules/teamspeak3/views.py b/services/modules/teamspeak3/views.py index d667cbdb..df19c3bb 100644 --- a/services/modules/teamspeak3/views.py +++ b/services/modules/teamspeak3/views.py @@ -66,7 +66,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,