From e007b3226160e1ce0bfe4984550d99db63866987 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Thu, 7 Jan 2016 15:34:16 +0000 Subject: [PATCH 1/6] Functions to clear all data relating to individual services Addresses #272 --- services/tasks.py | 114 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 services/tasks.py diff --git a/services/tasks.py b/services/tasks.py new file mode 100644 index 00000000..60a30bd3 --- /dev/null +++ b/services/tasks.py @@ -0,0 +1,114 @@ +from authentication.models import AuthServicesInfo +from celerytask.models import SyncGroupCache +from django.conf import settings +import logging +from services.models import UserTSgroup +from services.models import AuthTS +from services.models import TSgroup +from services.models import DiscordAuthToken + +logger = logging.getLogger(__name__) + +def disable_teamspeak(): + if settings.ENABLE_AUTH_TEAMSPEAK3: + logger.warn("ENABLE_AUTH_TEAMSPEAK3 still True, after disabling users will still be able to create teamspeak accounts") + if settings.ENABLE_BLUE_TEAMSPEAK3: + logger.warn("ENABLE_BLUE_TEAMSPEAK3 still True, after disabling blues will still be able to create teamspeak accounts") + for auth in AuthServicesInfo.objects.all(): + if auth.teamspeak3_uid: + logger.info("Clearing %s Teamspeak3 UID" % auth.user) + auth.teamspeak3_uid = '' + auth.save() + if auth.teamspeak3_perm_key: + logger.info("Clearing %s Teamspeak3 permission key" % auth.user) + auth.teamspeak3_perm_key = '' + auth.save() + logger.info("Deleting all UserTSgroup models") + UserTSgroup.objects.all().delete() + logger.info("Deleting all AuthTS models") + AuthTS.objects.all().delete() + logger.info("Deleting all TSgroup models") + TSgroup.objects.all().delete() + logger.info("Teamspeak3 disabled") + +def disable_forum(): + if settings.ENABLE_AUTH_FORUM: + logger.warn("ENABLE_AUTH_FORUM still True, after disabling users will still be able to create forum accounts") + if settings.ENABLE_BLUE_FORUM: + logger.warn("ENABLE_BLUE_FORUM still True, after disabling blues will still be able to create forum accounts") + for auth in AuthServicesInfo.objects.all(): + if auth.forum_username: + logger.info("Clearing %s forum username" % auth.user) + auth.forum_username = '' + auth.save() + if auth.forum_password: + logger.info("Clearing %s forum password" % auth.user) + auth.forum_password = '' + auth.save() + logger.info("Deleting all SyncGroupCache models for forum") + SyncGroupCache.objects.filter(servicename="forum").delete() + +def disable_jabber(): + if settings.ENABLE_AUTH_JABBER: + logger.warn("ENABLE_AUTH_JABBER still True, after disabling users will still be able to create jabber accounts") + if settings.ENABLE_BLUE_JABBER: + logger.warn("ENABLE_BLUE_JABBER still True, after disabling blues will still be able to create jabber accounts") + for auth in AuthServicesInfo.objects.all(): + if auth.jabber_username: + logger.info("Clearing %s jabber username" % auth.user) + auth.jabber_username = '' + auth.save() + if auth.jabber_password: + logger.info("Clearing %s jabber password" % auth.user) + auth.jabber_password = '' + auth.save() + logger.info("Deleting all SyncGroupCache models for jabber") + SyncGroupCache.objects.filter(servicename="jabber").delete() + +def disable_mumble(): + if settings.ENABLE_AUTH_MUMBLE: + logger.warn("ENABLE_AUTH_MUMBLE still True, after disabling users will still be able to create mumble accounts") + if settings.ENABLE_BLUE_MUMBLE: + logger.warn("ENABLE_BLUE_MUMBLE still True, after disabling blues will still be able to create mumble accounts") + for auth in AuthServicesInfo.objects.all(): + if auth.mumble_username: + logger.info("Clearing %s mumble username" % auth.user) + auth.mumble_username = '' + auth.save() + if auth.mumble_password: + logger.info("Clearing %s mumble password" % auth.user) + auth.mumble_password = '' + auth.save() + logger.info("Deleting all SyncGroupCache models for mumble") + SyncGroupCache.objects.filter(servicename="mumble").delete() + +def disable_ipboard(): + if settings.ENABLE_AUTH_IPBOARD: + logger.warn("ENABLE_AUTH_IPBOARD still True, after disabling users will still be able to create IPBoard accounts") + if settings.ENABLE_BLUE_IPBOARD: + logger.warn("ENABLE_BLUE_IPBOARD still True, after disabling blues will still be able to create IPBoard accounts") + for auth in AuthServicesInfo.objects.all(): + if auth.ipboard_username: + logger.info("Clearing %s ipboard username" % auth.user) + auth.ipboard_username = '' + auth.save() + if auth.ipboard_password: + logger.info("Clearing %s ipboard password" % auth.user) + auth.ipboard_password = '' + auth.save() + logger.info("Deleting all SyncGroupCache models for ipboard") + SyncGroupCache.objects.filter(servicename="ipboard").delete() + + +def disable_discord(): + if settings.ENABLE_AUTH_DISCORD: + logger.warn("ENABLE_AUTH_DISCORD still True, after disabling users will still be able to link Discord accounts") + if settings.ENABLE_BLUE_DISCORD: + logger.warn("ENABLE_BLUE_DISCORD still True, after disabling blues will still be able to link Discord accounts") + for auth in AuthServicesInfo.objects.all(): + if auth.discord_uid: + logger.info("Clearing %s Discord UID" % auth.user) + auth.discord_uid = '' + auth.save() + logger.info("Deleting all DiscordAuthToken models") + DiscordAuthToken.objects.all().delete() From a3378760352b9cb8b6c4e7119175db46032112bc Mon Sep 17 00:00:00 2001 From: Adarnof Date: Wed, 17 Feb 2016 20:55:53 +0000 Subject: [PATCH 2/6] Parallelize corp and alliance model updates - if corp joins alliance which is blue, it may take 2 cycles for blue status to be reflected due to async updates Addresses #103 --- celerytask/tasks.py | 61 ++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/celerytask/tasks.py b/celerytask/tasks.py index 571c5b77..5015798c 100755 --- a/celerytask/tasks.py +++ b/celerytask/tasks.py @@ -2,7 +2,7 @@ from django.conf import settings from celery.task import periodic_task from django.contrib.auth.models import User from django.contrib.auth.models import Group - +from celery import task from models import SyncGroupCache from celery.task.schedules import crontab from services.managers.openfire_manager import OpenfireManager @@ -522,6 +522,39 @@ def populate_alliance(id, blue=False): EveManager.create_corporation_info(corpinfo['id'], corpinfo['name'], corpinfo['ticker'], corpinfo['members']['current'], blue, alliance) +@task +def update_alliance(id): + alliance = EveAllianceInfo.objects.get(alliance_id=id) + corps = EveCorporationInfo.objects.filter(alliance=alliance) + logger.debug("Updating alliance %s with %s member corps" % (alliance, len(corps))) + allianceinfo = EveApiManager.get_alliance_information(alliance.alliance_id) + if allianceinfo: + EveManager.update_alliance_info(allianceinfo['id'], allianceinfo['executor_id'], + allianceinfo['member_count'], alliance.is_blue) + for corp in corps: + if corp.corporation_id in allianceinfo['member_corps'] is False: + logger.info("Corp %s no longer in alliance %s" % (corp, alliance)) + corp.alliance = None + corp.save() + populate_alliance(alliance.alliance_id, blue=alliance.is_blue) + elif EveApiManager.check_if_alliance_exists(alliance.alliance_id) is False: + logger.info("Alliance %s has closed. Deleting model" % alliance) + alliance.delete() + +@task +def update_corp(id): + corp = EveCorporationInfo.objects.get(corporation_id=id) + logger.debug("Updating corp %s" % corp) + corpinfo = EveApiManager.get_corporation_information(corp.corporation_id) + if corpinfo: + alliance = None + if EveAllianceInfo.objects.filter(alliance_id=corpinfo['alliance']['id']).exists(): + alliance = EveAllianceInfo.objects.get(alliance_id=corpinfo['alliance']['id']) + EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], alliance, corp.is_blue) + elif EveApiManager.check_if_corp_exists(corp.corporation_id) is False: + logger.info("Corp %s has closed. Deleting model" % corp) + corp.delete() + # Run Every 2 hours @periodic_task(run_every=crontab(minute=0, hour="*/2")) def run_corp_update(): @@ -595,33 +628,11 @@ def run_corp_update(): # update existing corp models for corp in EveCorporationInfo.objects.all(): - logger.debug("Updating corp %s" % corp) - corpinfo = EveApiManager.get_corporation_information(corp.corporation_id) - if corpinfo: - alliance = None - if EveAllianceInfo.objects.filter(alliance_id=corpinfo['alliance']['id']).exists(): - alliance = EveAllianceInfo.objects.get(alliance_id=corpinfo['alliance']['id']) - EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], alliance, corp.is_blue) - elif EveApiManager.check_if_corp_exists(corp.corporation_id) is False: - logger.info("Corp %s has closed. Deleting model" % corp) - corp.delete() + update_corp.delay(corp.corporation_id) # update existing alliance models for alliance in EveAllianceInfo.objects.all(): - logger.debug("Updating alliance %s" % alliance) - allianceinfo = EveApiManager.get_alliance_information(alliance.alliance_id) - if allianceinfo: - EveManager.update_alliance_info(allianceinfo['id'], allianceinfo['executor_id'], - allianceinfo['member_count'], alliance.is_blue) - for corp in EveCorporationInfo.objects.filter(alliance=alliance): - if corp.corporation_id in allianceinfo['member_corps'] is False: - logger.info("Corp %s no longer in alliance %s" % (corp, alliance)) - corp.alliance = None - corp.save() - populate_alliance(alliance.alliance_id, blue=alliance.is_blue) - elif EveApiManager.check_if_alliance_exists(alliance.alliance_id) is False: - logger.info("Alliance %s has closed. Deleting model" % alliance) - alliance.delete() + update_alliance.delay(alliance.alliance_id) # create standings standings = EveApiManager.get_corp_standings() From ece06a683246b7a970976d0bac878d906c365e62 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Wed, 17 Feb 2016 21:16:16 +0000 Subject: [PATCH 3/6] Toggle assignment of alliance groups --- alliance_auth/settings.py.example | 2 ++ celerytask/tasks.py | 31 +++++++++++++++++++++++++++++++ util/common_task.py | 2 ++ 3 files changed, 35 insertions(+) diff --git a/alliance_auth/settings.py.example b/alliance_auth/settings.py.example index 830ed9ad..08fd6cdd 100755 --- a/alliance_auth/settings.py.example +++ b/alliance_auth/settings.py.example @@ -221,7 +221,9 @@ FORUM_URL = os.environ.get('AA_FORUM_URL', '') DEFAULT_AUTH_GROUP = os.environ.get('AA_DEFAULT_ALLIANCE_GROUP', 'Member') DEFAULT_BLUE_GROUP = os.environ.get('AA_DEFAULT_BLUE_GROUP', 'Blue') MEMBER_CORP_GROUPS = 'True' == os.environ.get('AA_MEMBER_CORP_GROUPS', 'True') +MEMBER_ALLIANCE_GROUPS = 'True' == os.environ.get('AA_MEMBER_ALLIANCE_GROUPS', 'False') BLUE_CORP_GROUPS = 'True' == os.environ.get('AA_BLUE_CORP_GROUPS', 'False') +BLUE_ALLIANCE_GROUPS = 'True' == os.environ.get('AA_BLUE_ALLIANCE_GROUPS', 'False') ######################### # Alliance Service Setup diff --git a/celerytask/tasks.py b/celerytask/tasks.py index 571c5b77..0d351cfb 100755 --- a/celerytask/tasks.py +++ b/celerytask/tasks.py @@ -23,6 +23,7 @@ from util import check_if_user_has_permission from util.common_task import add_user_to_group from util.common_task import remove_user_from_group from util.common_task import generate_corp_group_name +from util.common_task import generate_alliance_group_name from eveonline.models import EveCharacter from eveonline.models import EveCorporationInfo from eveonline.models import EveAllianceInfo @@ -271,6 +272,34 @@ def assign_corp_group(auth): logger.info("Removing user %s from old corpgroup %s" % (auth.user, g)) auth.user.groups.remove(g) +def assign_alliance_group(auth): + alliance_group = None + if auth.main_char_id: + if EveCharacter.objects.filter(character_id=auth.main_char_id).exists(): + char = EveCharacter.objects.get(character_id=auth.main_char_id) + if char.alliance_name: + alliancename = generate_corp_group_name(char.alliance_name) + state = determine_membership_by_character(char) + if state == "BLUE" and settings.BLUE_ALLIANCE_GROUPS: + logger.debug("Validating blue user %s has alliance group assigned." % auth.user) + alliance_group, c = Group.objects.get_or_create(name=alliancename) + elif state == "MEMBER" and settings.MEMBER_ALLIANCE_GROUPS: + logger.debug("Validating member %s has alliance group assigned." % auth.user) + alliance_group, c = Group.objects.get_or_create(name=alliancename) + else: + logger.debug("Ensuring non-member %s has no alliance groups assigned." % auth.user) + else: + logger.debug("User %s main character %s not in an alliance. Ensuring no allinace group assigned." % (auth.user, char)) + if alliance_group: + if not alliance_group in auth.user.groups.all(): + logger.info("Adding user %s to alliance group %s" % (auth.user, alliance_group)) + auth.user.groups.add(alliance_group) + for g in auth.user.groups.all(): + if str.startswith(str(g.name), "Alliance_"): + if g != alliance_group: + logger.info("Removing user %s from old alliancegroup %s" % (auth.user, g)) + auth.user.groups.remove(g) + def make_member(user): logger.debug("Ensuring user %s has member permissions and groups." % user) # ensure member is not blue right now @@ -295,6 +324,7 @@ def make_member(user): auth.is_blue = False auth.save() assign_corp_group(auth) + assign_alliance_group(auth) def make_blue(user): logger.debug("Ensuring user %s has blue permissions and groups." % user) @@ -320,6 +350,7 @@ def make_blue(user): auth.is_blue = True auth.save() assign_corp_group(auth) + assign_alliance_group(auth) def determine_membership_by_character(char): if settings.IS_CORP: diff --git a/util/common_task.py b/util/common_task.py index c29f5aee..c4b9d88f 100755 --- a/util/common_task.py +++ b/util/common_task.py @@ -70,3 +70,5 @@ def deactivate_services(user): def generate_corp_group_name(corpname): return 'Corp_' + corpname.replace(' ', '_') +def generate_alliance_group_name(alliancename): + reutrn 'Alliance_' + alliancename.replace(' ', '_') From 7259e40267b47425f10b9bde3bb993bc1172a8b0 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Wed, 17 Feb 2016 21:26:34 +0000 Subject: [PATCH 4/6] Corrected group name generation as alliance --- celerytask/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/celerytask/tasks.py b/celerytask/tasks.py index 0d351cfb..3226f024 100755 --- a/celerytask/tasks.py +++ b/celerytask/tasks.py @@ -278,7 +278,7 @@ def assign_alliance_group(auth): if EveCharacter.objects.filter(character_id=auth.main_char_id).exists(): char = EveCharacter.objects.get(character_id=auth.main_char_id) if char.alliance_name: - alliancename = generate_corp_group_name(char.alliance_name) + alliancename = generate_alliance_group_name(char.alliance_name) state = determine_membership_by_character(char) if state == "BLUE" and settings.BLUE_ALLIANCE_GROUPS: logger.debug("Validating blue user %s has alliance group assigned." % auth.user) From bfef9c3123755e2502ba75a01f3c6222f773e652 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Wed, 17 Feb 2016 17:08:22 -0500 Subject: [PATCH 5/6] Lowered loglevel for evelink.APIError Prevents unnecessary notifications when getting info for a corp with a bad corp ID --- services/managers/eve_api_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/managers/eve_api_manager.py b/services/managers/eve_api_manager.py index ac79fefe..721ce02c 100644 --- a/services/managers/eve_api_manager.py +++ b/services/managers/eve_api_manager.py @@ -170,7 +170,7 @@ class EveApiManager(): logger.debug("Confirmed id %s is a corp." % corp_id) return True except evelink.api.APIError as error: - logger.exception("APIError occured while checking if id %s is corp. Possibly not corp?" % corp_id) + logger.debug("APIError occured while checking if id %s is corp. Possibly not corp?" % corp_id) logger.debug("Unable to verify id %s is corp." % corp_id) return False From 86e9ea763477b6e7da764f1de7b560fe8aa79d58 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Wed, 17 Feb 2016 17:35:08 -0500 Subject: [PATCH 6/6] typo --- util/common_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/common_task.py b/util/common_task.py index c4b9d88f..a22dbfb5 100755 --- a/util/common_task.py +++ b/util/common_task.py @@ -71,4 +71,4 @@ def generate_corp_group_name(corpname): return 'Corp_' + corpname.replace(' ', '_') def generate_alliance_group_name(alliancename): - reutrn 'Alliance_' + alliancename.replace(' ', '_') + return 'Alliance_' + alliancename.replace(' ', '_')