Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ecb74e67b0 | ||
|
|
de47e94870 | ||
|
|
9238ac97cf | ||
|
|
2e274d3baf | ||
|
|
c6118beddf | ||
|
|
e6e1339d71 | ||
|
|
693016e171 | ||
|
|
3e09f2179f | ||
|
|
3a1d0d0335 | ||
|
|
7c14aede26 | ||
|
|
308dc9191f | ||
|
|
1a958384c3 | ||
|
|
078ec785e4 |
@@ -2,7 +2,7 @@ Alliance Auth
|
|||||||
============
|
============
|
||||||
|
|
||||||
[](https://gitter.im/R4stl1n/allianceauth?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
[](https://gitter.im/R4stl1n/allianceauth?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
[](http://allianceauth.readthedocs.io/en/latest/?badge=latest)
|
[](http://allianceauth.readthedocs.io/?badge=latest)
|
||||||
[](https://travis-ci.org/allianceauth/allianceauth)
|
[](https://travis-ci.org/allianceauth/allianceauth)
|
||||||
[](https://coveralls.io/github/allianceauth/allianceauth?branch=master)
|
[](https://coveralls.io/github/allianceauth/allianceauth?branch=master)
|
||||||
|
|
||||||
@@ -10,6 +10,8 @@ Alliance Auth
|
|||||||
EVE service auth to help corps, alliances, and coalitions manage services.
|
EVE service auth to help corps, alliances, and coalitions manage services.
|
||||||
Built for "The 99 Percent" open for anyone to use.
|
Built for "The 99 Percent" open for anyone to use.
|
||||||
|
|
||||||
|
[Read the docs here.](http://allianceauth.rtfd.io)
|
||||||
|
|
||||||
Special Permissions In Admin:
|
Special Permissions In Admin:
|
||||||
|
|
||||||
auth | user | group_management ( Access to add members to groups within the alliance )
|
auth | user | group_management ( Access to add members to groups within the alliance )
|
||||||
|
|||||||
@@ -4,5 +4,5 @@ from __future__ import absolute_import, unicode_literals
|
|||||||
# Django starts so that shared_task will use this app.
|
# Django starts so that shared_task will use this app.
|
||||||
from .celeryapp import app as celery_app # noqa
|
from .celeryapp import app as celery_app # noqa
|
||||||
|
|
||||||
__version__ = '1.15.0'
|
__version__ = '1.15.1'
|
||||||
NAME = 'Alliance Auth v%s' % __version__
|
NAME = 'Alliance Auth v%s' % __version__
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ INSTALLED_APPS = [
|
|||||||
'permissions_tool',
|
'permissions_tool',
|
||||||
'geelweb.django.navhelper',
|
'geelweb.django.navhelper',
|
||||||
'bootstrap_pagination',
|
'bootstrap_pagination',
|
||||||
|
'captcha',
|
||||||
|
|
||||||
# Services
|
# Services
|
||||||
'services.modules.mumble',
|
'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
|
## Auth configuration starts here
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ from __future__ import unicode_literals
|
|||||||
from django import forms
|
from django import forms
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
from django.conf import settings
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
|
||||||
@@ -9,6 +10,10 @@ class LoginForm(forms.Form):
|
|||||||
username = forms.CharField(label=_('Username'), max_length=32, required=True)
|
username = forms.CharField(label=_('Username'), max_length=32, required=True)
|
||||||
password = forms.CharField(label=_('Password'), widget=forms.PasswordInput())
|
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):
|
class RegistrationForm(forms.Form):
|
||||||
username = forms.CharField(label=_('Username'), max_length=30, required=True)
|
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 = forms.CharField(label=_('Email'), max_length=254, required=True)
|
||||||
email_again = forms.CharField(label=_('Email Again'), 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):
|
def clean(self):
|
||||||
if ' ' in self.cleaned_data['username']:
|
if ' ' in self.cleaned_data['username']:
|
||||||
raise forms.ValidationError('Username cannot contain a space')
|
raise forms.ValidationError('Username cannot contain a space')
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ class CorpStats(models.Model):
|
|||||||
# the swagger spec doesn't have a maxItems count
|
# the swagger spec doesn't have a maxItems count
|
||||||
# manual testing says we can do over 350, but let's not risk it
|
# manual testing says we can do over 350, but let's not risk it
|
||||||
member_id_chunks = [member_ids[i:i + 255] for i in range(0, len(member_ids), 255)]
|
member_id_chunks = [member_ids[i:i + 255] for i in range(0, len(member_ids), 255)]
|
||||||
|
c = self.token.get_esi_client(Character='v1') # ccplease bump versions of whole resources
|
||||||
member_name_chunks = [c.Character.get_characters_names(character_ids=id_chunk).result() for id_chunk in
|
member_name_chunks = [c.Character.get_characters_names(character_ids=id_chunk).result() for id_chunk in
|
||||||
member_id_chunks]
|
member_id_chunks]
|
||||||
member_list = {}
|
member_list = {}
|
||||||
@@ -163,7 +164,10 @@ class CorpStats(models.Model):
|
|||||||
|
|
||||||
def get_member_objects(self, user):
|
def get_member_objects(self, user):
|
||||||
show_apis = self.show_apis(user)
|
show_apis = self.show_apis(user)
|
||||||
return sorted([CorpStats.MemberObject(id, name, show_apis=show_apis) for id, name in self.members.items()], key=attrgetter('main_user', 'character_name'))
|
member_list = [CorpStats.MemberObject(id, name, show_apis=show_apis) for id, name in self.members.items()]
|
||||||
|
outlist = sorted([m for m in member_list if m.main_user], key=attrgetter('main_user', 'character_name'))
|
||||||
|
outlist = outlist + sorted([m for m in member_list if not m.main_user], key=attrgetter('character_name'))
|
||||||
|
return outlist
|
||||||
|
|
||||||
def can_update(self, user):
|
def can_update(self, user):
|
||||||
return user.is_superuser or user == self.token.user
|
return user.is_superuser or user == self.token.user
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<b>{% trans "API Index: " %}</b> {{ corpstats.total_users }} Main Characters
|
<b>{% trans "API Index: " %}</b> {{ corpstats.total_users }} Main Character{{ corpstats.total_users|pluralize }}
|
||||||
<div class="progress">
|
<div class="progress">
|
||||||
<div class="progress-bar" role="progressbar" aria-valuenow="{{ corpstats.registered_members }}" aria-valuemin="0" aria-valuemax="{{ corpstats.total_members }}" style="width: {% widthratio corpstats.registered_members corpstats.total_members 100 %}%;">
|
<div class="progress-bar" role="progressbar" aria-valuenow="{{ corpstats.registered_members }}" aria-valuemin="0" aria-valuemax="{{ corpstats.total_members }}" style="width: {% widthratio corpstats.registered_members corpstats.total_members 100 %}%;">
|
||||||
{{ corpstats.registered_members }}/{{ corpstats.total_members }}
|
{{ corpstats.registered_members }}/{{ corpstats.total_members }}
|
||||||
|
|||||||
@@ -46,7 +46,10 @@ def corpstats_add(request, token):
|
|||||||
'corporation_id']
|
'corporation_id']
|
||||||
corp = EveCorporationInfo.objects.get(corporation_id=corp_id)
|
corp = EveCorporationInfo.objects.get(corporation_id=corp_id)
|
||||||
cs = CorpStats.objects.create(token=token, corp=corp)
|
cs = CorpStats.objects.create(token=token, corp=corp)
|
||||||
cs.update()
|
try:
|
||||||
|
cs.update()
|
||||||
|
except HTTPError as e:
|
||||||
|
messages.error(request, str(e))
|
||||||
assert cs.pk # ensure update was successful
|
assert cs.pk # ensure update was successful
|
||||||
if CorpStats.objects.filter(pk=cs.pk).visible_to(request.user).exists():
|
if CorpStats.objects.filter(pk=cs.pk).visible_to(request.user).exists():
|
||||||
return redirect('corputils:view_corp', corp_id=corp.corporation_id)
|
return redirect('corputils:view_corp', corp_id=corp.corporation_id)
|
||||||
|
|||||||
BIN
docs/_static/images/features/corpstats/api_index.png
vendored
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
docs/_static/images/features/corpstats/blank_header.png
vendored
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
docs/_static/images/features/corpstats/eve_sso_authorization.png
vendored
Normal file
|
After Width: | Height: | Size: 258 KiB |
BIN
docs/_static/images/features/corpstats/last_update.png
vendored
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
docs/_static/images/features/corpstats/member_list.png
vendored
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
docs/_static/images/features/corpstats/navbar.png
vendored
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
BIN
docs/_static/images/features/corpstats/pagination.png
vendored
Normal file
|
After Width: | Height: | Size: 903 B |
BIN
docs/_static/images/features/corpstats/search_view.png
vendored
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
docs/_static/images/features/corpstats/select_sso_token.png
vendored
Normal file
|
After Width: | Height: | Size: 24 KiB |
@@ -6,17 +6,17 @@ This module is used to check the registration status of corp members and to dete
|
|||||||
|
|
||||||
Upon initial install, nothing will be visible. For every corp, a model will have to be created before data can be viewed.
|
Upon initial install, nothing will be visible. For every corp, a model will have to be created before data can be viewed.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
If you are a superuser, the add button will be immediate visible to you. If not, your user account requires the `add_corpstats` permission.
|
If you are a superuser, the add button will be immediate visible to you. If not, your user account requires the `add_corpstats` permission.
|
||||||
|
|
||||||
Corp Stats requires an EVE SSO token to access data from the EVE Swagger Interface. Upon pressing the Add button, you will be prompted to authenticated. Please select the character who is in the corp you want data for.
|
Corp Stats requires an EVE SSO token to access data from the EVE Swagger Interface. Upon pressing the Add button, you will be prompted to authenticated. Please select the character who is in the corp you want data for.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
You will return to auth where you are asked to select a token with the green arrow button. If you want to use a different character, press the `LOG IN with EVE Online` button.
|
You will return to auth where you are asked to select a token with the green arrow button. If you want to use a different character, press the `LOG IN with EVE Online` button.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
If this works (and you have permission to view the Corp Stats you just created) you'll be returned to a view of the Corp Stats.
|
If this works (and you have permission to view the Corp Stats you just created) you'll be returned to a view of the Corp Stats.
|
||||||
If it fails an error message will be displayed.
|
If it fails an error message will be displayed.
|
||||||
@@ -25,7 +25,7 @@ If it fails an error message will be displayed.
|
|||||||
|
|
||||||
### Navigation Bar
|
### Navigation Bar
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
This bar contains a dropdown menu of all available corps. If the user has the `add_corpstats` permission, a button to add a Corp Stats will be shown.
|
This bar contains a dropdown menu of all available corps. If the user has the `add_corpstats` permission, a button to add a Corp Stats will be shown.
|
||||||
|
|
||||||
@@ -33,13 +33,13 @@ On the right of this bar is a search field. Press enter to search. It checks all
|
|||||||
|
|
||||||
### API Index
|
### API Index
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
This is a visual indication of the number of registered characters.
|
This is a visual indication of the number of registered characters.
|
||||||
|
|
||||||
### Last Update
|
### Last Update
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Corp Stats do not automatically update. They update once upon creation for initial data, and whenever someone presses the update button.
|
Corp Stats do not automatically update. They update once upon creation for initial data, and whenever someone presses the update button.
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ Only superusers and the creator of the Corp Stat can update it.
|
|||||||
|
|
||||||
### Member List
|
### Member List
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
The list contains all characters in the corp. Red backgrounds means they are not registered in auth. If registered, and the user has the required permission to view APIs, a link to JackKnife will be present.
|
The list contains all characters in the corp. Red backgrounds means they are not registered in auth. If registered, and the user has the required permission to view APIs, a link to JackKnife will be present.
|
||||||
A link to zKillboard is present for all characters.
|
A link to zKillboard is present for all characters.
|
||||||
@@ -55,11 +55,11 @@ If registered, the character will also have a main character, main corporation,
|
|||||||
|
|
||||||
This view is paginated: use the navigation arrows to view more pages (sorted alphabetically by character name), or search for a specific character.
|
This view is paginated: use the navigation arrows to view more pages (sorted alphabetically by character name), or search for a specific character.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Search View
|
## Search View
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
This view is essentially the same as the Corp Stats page, but not specific to a single corp.
|
This view is essentially the same as the Corp Stats page, but not specific to a single corp.
|
||||||
The search query is visible in the search box.
|
The search query is visible in the search box.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -83,6 +83,8 @@ Navigate to the `Server` tab, `Server Manager` subtab, and select `System Proper
|
|||||||
- 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).
|
||||||
|
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ class EveSwaggerProvider(EveProvider):
|
|||||||
)
|
)
|
||||||
return model
|
return model
|
||||||
except HTTPNotFound:
|
except HTTPNotFound:
|
||||||
raise ObjectNotFound(id, 'corporation')
|
raise ObjectNotFound(corp_id, 'corporation')
|
||||||
|
|
||||||
def get_character(self, character_id):
|
def get_character(self, character_id):
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -212,13 +212,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
|
||||||
|
|||||||
@@ -16,13 +16,12 @@ django-bootstrap-form
|
|||||||
django-navhelper
|
django-navhelper
|
||||||
django-bootstrap-pagination
|
django-bootstrap-pagination
|
||||||
django-redis>=4.4
|
django-redis>=4.4
|
||||||
|
django-recaptcha
|
||||||
|
|
||||||
# awating release for fix to celery/django-celery#447
|
# awating release for fix to celery/django-celery#447
|
||||||
# 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)
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ from eveonline.managers import EveManager
|
|||||||
from eveonline.models import EveCharacter
|
from eveonline.models import EveCharacter
|
||||||
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
|
||||||
@@ -103,27 +103,29 @@ def jabber_broadcast_view(request):
|
|||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
main_char = EveManager.get_main_character(request.user)
|
main_char = EveManager.get_main_character(request.user)
|
||||||
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():
|
||||||
@@ -38,12 +62,10 @@ class Teamspeak3Manager:
|
|||||||
sanatized = "[BLUE][" + corp_ticker + "]" + username
|
sanatized = "[BLUE][" + 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']
|
||||||
@@ -52,11 +74,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)
|
||||||
@@ -66,34 +86,30 @@ 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()
|
|
||||||
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 = []
|
||||||
@@ -112,11 +128,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:
|
||||||
@@ -128,35 +142,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:
|
||||||
@@ -181,23 +190,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 settings.DEFAULT_AUTH_GROUP not in server_groups:
|
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:
|
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 "",""
|
||||||
@@ -210,22 +216,19 @@ 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 add_blue_user(self, username, corp_ticker):
|
||||||
def add_blue_user(username, corp_ticker):
|
username_clean = self.__santatize_username(self.__generate_username_blue(username, corp_ticker))
|
||||||
username_clean = Teamspeak3Manager.__santatize_username(Teamspeak3Manager.__generate_username_blue(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 settings.DEFAULT_BLUE_GROUP not in server_groups:
|
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:
|
try:
|
||||||
ret = server.send_command('tokenadd', {'tokentype': 0, 'tokenid1': blue_group_id, 'tokenid2': 0,
|
ret = self.server.send_command('tokenadd', {'tokentype': 0, 'tokenid1': blue_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 blue teamspeak user %s: %s" % (username, str(e)))
|
logger.error("Failed to add blue teamspeak user %s: %s" % (username, str(e)))
|
||||||
return "",""
|
return "",""
|
||||||
@@ -238,24 +241,22 @@ class Teamspeak3Manager:
|
|||||||
logger.exception("Failed to add blue teamspeak user %s - received response: %s" % (username_clean, ret))
|
logger.exception("Failed to add blue 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
|
||||||
@@ -269,33 +270,29 @@ 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 generate_new_blue_permissionkey(self, uid, username, corpticker):
|
||||||
def generate_new_blue_permissionkey(uid, username, corpticker):
|
|
||||||
logger.debug("Re-issuing blue permission key for user id %s" % uid)
|
logger.debug("Re-issuing blue permission key for user id %s" % uid)
|
||||||
Teamspeak3Manager.delete_user(uid)
|
self.delete_user(uid)
|
||||||
return Teamspeak3Manager.add_blue_user(username, corpticker)
|
return self.add_blue_user(username, corpticker)
|
||||||
|
|
||||||
@staticmethod
|
def update_groups(self, uid, ts_groups):
|
||||||
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])
|
||||||
@@ -309,8 +306,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)
|
||||||
|
|||||||
@@ -25,11 +25,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
|
||||||
@@ -43,7 +44,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():
|
||||||
@@ -73,7 +75,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 = []
|
||||||
|
|||||||
@@ -28,17 +28,17 @@ def activate_teamspeak3(request):
|
|||||||
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
||||||
character = EveManager.get_main_character(request.user)
|
character = EveManager.get_main_character(request.user)
|
||||||
ticker = character.corporation_ticker
|
ticker = character.corporation_ticker
|
||||||
|
with Teamspeak3Manager() as ts3man:
|
||||||
if authinfo.state == BLUE_STATE:
|
if authinfo.state == BLUE_STATE:
|
||||||
logger.debug("Adding TS3 user for blue user %s with main character %s" % (request.user, character))
|
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)
|
# Blue members should have alliance ticker (if in alliance)
|
||||||
if EveAllianceInfo.objects.filter(alliance_id=character.alliance_id).exists():
|
if EveAllianceInfo.objects.filter(alliance_id=character.alliance_id).exists():
|
||||||
alliance = EveAllianceInfo.objects.filter(alliance_id=character.alliance_id)[0]
|
alliance = EveAllianceInfo.objects.filter(alliance_id=character.alliance_id)[0]
|
||||||
ticker = alliance.alliance_ticker
|
ticker = alliance.alliance_ticker
|
||||||
result = Teamspeak3Manager.add_blue_user(character.character_name, ticker)
|
result = ts3man.add_blue_user(character.character_name, ticker)
|
||||||
else:
|
else:
|
||||||
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 "":
|
||||||
@@ -82,8 +82,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")
|
||||||
|
|
||||||
|
|
||||||
@@ -96,18 +97,19 @@ def reset_teamspeak3_perm(request):
|
|||||||
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
||||||
character = EveManager.get_main_character(request.user)
|
character = EveManager.get_main_character(request.user)
|
||||||
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)
|
||||||
|
|
||||||
if authinfo.state == BLUE_STATE:
|
if authinfo.state == BLUE_STATE:
|
||||||
logger.debug(
|
logger.debug(
|
||||||
"Generating new permission key for blue user %s with main character %s" % (request.user, character))
|
"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,
|
result = ts3man.generate_new_blue_permissionkey(request.user.teamspeak3.uid,
|
||||||
character.character_name,
|
character.character_name,
|
||||||
character.corporation_ticker)
|
character.corporation_ticker)
|
||||||
else:
|
else:
|
||||||
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 %}Alliance Auth - SRP Request{% endblock %}
|
{% block title %}Alliance Auth - 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 %}
|
||||||
|
|
||||||
@@ -42,12 +40,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 %}
|
|
||||||
|
|||||||
@@ -111,7 +111,8 @@ def remove_timer(request, timer_id):
|
|||||||
timer = Timer.objects.get(id=timer_id)
|
timer = Timer.objects.get(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})
|
||||||
else:
|
else:
|
||||||
logger.error(
|
logger.error(
|
||||||
"Unable to delete timer id %s for user %s - timer matching id not found." % (timer_id, request.user))
|
"Unable to delete timer id %s for user %s - timer matching id not found." % (timer_id, request.user))
|
||||||
|
|||||||