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
This commit is contained in:
Basraah 2017-02-28 11:28:51 +10:00 committed by GitHub
parent e6e1339d71
commit c6118beddf
6 changed files with 169 additions and 149 deletions

View File

@ -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'])

View File

@ -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)

View File

@ -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)))

View File

@ -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):

View File

@ -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 = []

View File

@ -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] != "":