From d4b9186c61ee14dda6a3d9054c01c19eaa00b258 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Fri, 11 Dec 2015 12:50:30 +0000 Subject: [PATCH] API form validates by member and characters Functions to determine membership level of user and eve characters --- celerytask/tasks.py | 99 ++++++++++++++++++++++++++++ eveonline/forms.py | 54 +++++++-------- eveonline/views.py | 6 +- services/managers/eve_api_manager.py | 23 +++++++ 4 files changed, 150 insertions(+), 32 deletions(-) diff --git a/celerytask/tasks.py b/celerytask/tasks.py index 8b220a51..5c776c4c 100755 --- a/celerytask/tasks.py +++ b/celerytask/tasks.py @@ -260,6 +260,105 @@ def remove_from_databases(user, groups, syncgroups): logger.debug("User %s has discord uid %s - updating groups." % (user, authserviceinfo.discord_uid)) update_discord_groups(user) +def make_member(user): + logger.debug("Ensuring user %s has member permissions and groups." % user) + # ensure member is not blue right now + if check_if_user_has_permission(user, 'blue_member'): + logger.info("Removing user %s blue permission to transition to member" % user) + remove_member_permission(user, 'blue_member') + blue_group, c = Group.objects.get_or_create(name=settings.DEFAULT_BLUE_GROUP) + if blue_group in user.groups.all(): + logger.info("Removing user %s blue group" % user) + user.groups.remove(blue_group) + # make member + if check_if_user_has_permission(user, 'member') is False: + logger.info("Adding user %s member permission" % user) + add_member_permission(user, 'member') + member_group, c = Group.objects.get_or_create(name=settings.DEFAULT_AUTH_GROUP) + if member_group in user.groups.all() is False: + logger.info("Adding user %s to member group" % user) + user.groups.add(member_group) + auth, c = AuthServicesInfo.objects.get_or_create(user=user) + if auth.is_blue: + logger.info("Marking user %s as non-blue" % user) + auth.is_blue = False + auth.save() + if auth.main_character_id: + if EveCharacter.objects.filter(character_id=auth.main_character_id).exists(): + char = EveCharacter.objects.get(character_id=auth.main_character_id) + corpname = generate_corp_group_name(char.corporation_name) + corp_group, c = Group.objects.get_or_create(name=corpname) + if not corp_group in user.groups.all(): + logger.info("Adding user %s to corp group %s" % (user, corp_group)) + user.groups.add(corp_group) + for g in user.groups.all(): + if str.startswith(g.name, "Corp_"): + if g != corp_group: + logger.info("Removing user %s from old corpgroup %s" % (user, g)) + user.groups.remove(g) + +def make_blue(user): + logger.debug("Ensuring user %s has blue permissions and groups." % user) + # ensure user is not a member + if check_if_user_has_permission(user, 'member'): + logger.info("Removing user %s member permission to transition to blue" % user) + remove_member_permission(user, 'blue_member') + member_group, c = Group.objects.get_or_create(name=settings.DEFAULT_AUTH_GROUP) + if member_group in user.groups.all(): + logger.info("Removing user %s member group" % user) + user.groups.remove(member_group) + # make blue + if check_if_user_has_permission(user, 'blue_member') is False: + logger.info("Adding user %s blue permission" % user) + add_member_permission(user, 'blue_member') + blue_group, c = Group.objects.get_or_create(name=settings.DEFAULT_BLUE_GROUP) + if blue_group in user.groups.all() is False: + logger.info("Adding user %s to blue group" % user) + user.groups.add(blue_group) + auth, c = AuthServicesInfo.objects.get_or_create(user=user) + if auth.is_blue is False: + logger.info("Marking user %s as blue" % user) + auth.is_blue = True + auth.save() + for g in user.groups.all(): + if str.startswith(g.name, 'Corp_'): + logger.info("Removing blue user %s from corp group %s" % (user, g)) + user.groups.remove(g) + +def determine_membership_by_character(char): + if settings.IS_CORP: + if char.corporation_id == settings.CORP_ID: + logger.debug("User %s main character %s in owning corp id %s" % (user, char, char.corporation_id)) + return "MEMBER" + else: + if char.alliance_id == settings.ALLIANCE_ID: + logger.debug("User %s main character %s in owning alliance id %s" % (user, char, char.alliance_id)) + return "MEMBER" + if EveCorporation.objects.filter(corporation_id=char.corporation_id).exists() is False: + logger.debug("No corp model for user %s main character %s corp id %s. Unable to check standings. Non-member." % (user, char, char.corporation_id)) + return False + else: + corp = EveCorporation.objects.get(corporation_id=char.corporation_id) + if corp.is_blue: + logger.debug("User %s main character %s member of blue corp %s" % (user, char, corp)) + return "BLUE" + else: + logger.debug("User %s main character %s member of non-blue corp %s. Non-member." % (user, char, corp)) + return False + +def determine_membership_by_user(user): + logger.debug("Determining membership of user %s" % user) + auth, c = AuthServicesInfo.objects.get_or_create(user=user) + if auth.main_character_id: + if EveCharacter.objects.filter(character_id=auth.main_character_id).exists(): + char = EveCharacter.objects.get(character_id=auth.main_character_id) + return determine_membership_by_character(char) + else: + logger.debug("Character model matching user %s main character id %s does not exist. Non-member." % (user, auth.main_character_id)) + return False + else: + logger.debug("User %s has no main character set. Non-member." % user) + return False # Run every minute @periodic_task(run_every=crontab(minute="*/1")) diff --git a/eveonline/forms.py b/eveonline/forms.py index 5eddf39f..4fbbcbe1 100644 --- a/eveonline/forms.py +++ b/eveonline/forms.py @@ -3,49 +3,43 @@ from django.conf import settings from services.managers.eve_api_manager import EveApiManager from eveonline.managers import EveManager +from eveonline.models import EveCharacter + +from celerytask.tasks import determine_membership_by_character import logging logger = logging.getLogger(__name__) class UpdateKeyForm(forms.Form): + def __init__(self, user_state=None, *args, **kwargs): + super(UpdateKeyForm, self).__init__(args, kwargs) + self.user_state=user_state + api_id = forms.CharField(max_length=254, required=True, label="Key ID") api_key = forms.CharField(max_length=254, required=True, label="Verification Code") - is_blue = forms.BooleanField(label="Blue to corp/alliance", required=False) def clean(self): if EveManager.check_if_api_key_pair_exist(self.cleaned_data['api_id']): logger.debug("UpdateKeyForm failed cleaning as API id %s already exists." % self.cleaned_data['api_id']) raise forms.ValidationError(u'API key already exist') - check_blue = False - try: - check_blue = self.cleaned_data['is_blue'] - except: - pass - - if check_blue: - if settings.BLUE_API_ACCOUNT: - if not EveApiManager.check_api_is_type_account(self.cleaned_data['api_id'], - self.cleaned_data['api_key']): - logger.debug("UpdateKeyForm failed cleaning as API id %s does not meet blue api key account requirement." % self.cleaned_data['api_id']) - raise forms.ValidationError(u'API not of type account') - - if not EveApiManager.check_blue_api_is_full(self.cleaned_data['api_id'], - self.cleaned_data['api_key']): - logger.debug("UpdateKeyForm failed cleaning as API id %s does not meet minimum blue api access mask requirement." % self.cleaned_data['api_id']) - raise forms.ValidationError(u'API supplied is too restricted. Minimum access mask is ' + str(settings.BLUE_API_MASK)) - - else: - if settings.MEMBER_API_ACCOUNT: - if not EveApiManager.check_api_is_type_account(self.cleaned_data['api_id'], - self.cleaned_data['api_key']): - logger.debug("UpdateKeyForm failed cleaning as API id %s does not meet member api key account requirement." % self.cleaned_data['api_id']) - raise forms.ValidationError(u'API not of type account') - - if not EveApiManager.check_api_is_full(self.cleaned_data['api_id'], - self.cleaned_data['api_key']): - logger.debug("UpdateKeyForm failed cleaning as API id %s does not meet minimum member api access mask requirement." % self.cleaned_data['api_id']) - raise forms.ValidationError(u'API supplied is too restricted. Minimum access mask is ' + str(settings.MEMBER_API_MASK)) + chars = EveApiManager.get_characters_from_api(self.cleaned_data['api_id'], self.cleaned_data['api_key']).result + states = [] + states.append(self.user_state) + for char in chars: + evechar = EveCharacter() + evechar.character_name = chars[char]['name'] + evechar.corporation_id = chars[char]['corp']['id'] + evechar.alliance_id = chars[char]['alliance']['id'] + state = determine_membership_by_character(evechar) + logger.debug("API ID %s character %s has state %s" % (self.cleaned_data['api_id'], evechar, state) + states.append(state) + if 'MEMBER' in states: + if EveApiManager.validate_member_api(self.cleaned_data['api_id'], self.cleaned_data['api_key']) is False: + raise forms.ValidationError(u'API does not meet requirements: account: %s mask: %s" % (settings.MEMBER_API_ACCOUNT, settings.MEMBER_API_MASK) + if 'BLUE' in states: + if EveApiManager.validate_blue_api(self.cleaned_data['api_id'], self.cleaned_data['api_key']) is False: + raise forms.ValidationError(u'API does not meet requirements: account: %s mask: %s" % (settings.BLUE_API_ACCOUNT, settings.BLUE_API_MASK) return self.cleaned_data diff --git a/eveonline/views.py b/eveonline/views.py index fc9ed613..1d3db1a9 100755 --- a/eveonline/views.py +++ b/eveonline/views.py @@ -20,6 +20,7 @@ from eveonline.models import EveCorporationInfo from eveonline.models import EveCharacter from eveonline.models import EveApiKeyPair from authentication.models import AuthServicesInfo +from celerytask.tasks import determine_membership_by_user import logging @@ -46,8 +47,9 @@ def disable_blue_member(user): @login_required def add_api_key(request): logger.debug("add_api_key called by user %s" % request.user) + user_state = determine_membership_by_user(request.user) if request.method == 'POST': - form = UpdateKeyForm(request.POST) + form = UpdateKeyForm(request.POST, user_state=user_state) logger.debug("Request type POST with form valid: %s" % form.is_valid()) if form.is_valid(): EveManager.create_api_keypair(form.cleaned_data['api_id'], @@ -64,7 +66,7 @@ def add_api_key(request): logger.debug("Form invalid: returning to form.") else: logger.debug("Providing empty update key form for user %s" % request.user) - form = UpdateKeyForm() + form = UpdateKeyForm(user_state=user_state) context = {'form': form, 'apikeypairs': EveManager.get_api_key_pairs(request.user.id)} return render_to_response('registered/addapikey.html', context, context_instance=RequestContext(request)) diff --git a/services/managers/eve_api_manager.py b/services/managers/eve_api_manager.py index ce5650c4..6d6f75d3 100644 --- a/services/managers/eve_api_manager.py +++ b/services/managers/eve_api_manager.py @@ -267,3 +267,26 @@ class EveApiManager(): return False logger.warn("Exception prevented verification of corp id %s existance. Assuming false." % corp_id) return False + + @staticmethod + def validate_member_api(api_id, api_key): + if settings.MEMBER_API_ACCOUNT: + if EveApiManager.check_if_api_is_type_account(api_id, api_key) is not True: + logger.debug("Api id %s is not type account as required for members - failed validation." % api_id) + return False + + if EveApiManager.check_api_is_full(api_id, api_key) is not True: + logger.debug("Api id %s does not meet member access mask requirements - failed validation." % api_id) + return False + return True + + @staticmethod + def validate_blue_api(api_id, api_key): + if settings.BLUE_API_ACCOUNT: + if EveApiManager.check_if_api_is_type_account(api_id, api_key) is not True: + logger.debug("Api id %s is not type account as required for blues - failed validation." % api_id) + return False + if EveApiManager.check_blue_api_is_full(api_id, api_key) is not True: + logger.debug("Api id %s does not meet minimum blue access mask requirements - failed validation." % api_id) + return False + return True