API form validates by member and characters

Functions to determine membership level of user and eve characters
This commit is contained in:
Adarnof 2015-12-11 12:50:30 +00:00
parent d20c73fb03
commit d4b9186c61
4 changed files with 150 additions and 32 deletions

View File

@ -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)) logger.debug("User %s has discord uid %s - updating groups." % (user, authserviceinfo.discord_uid))
update_discord_groups(user) 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 # Run every minute
@periodic_task(run_every=crontab(minute="*/1")) @periodic_task(run_every=crontab(minute="*/1"))

View File

@ -3,49 +3,43 @@ from django.conf import settings
from services.managers.eve_api_manager import EveApiManager from services.managers.eve_api_manager import EveApiManager
from eveonline.managers import EveManager from eveonline.managers import EveManager
from eveonline.models import EveCharacter
from celerytask.tasks import determine_membership_by_character
import logging import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class UpdateKeyForm(forms.Form): 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_id = forms.CharField(max_length=254, required=True, label="Key ID")
api_key = forms.CharField(max_length=254, required=True, label="Verification Code") 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): def clean(self):
if EveManager.check_if_api_key_pair_exist(self.cleaned_data['api_id']): 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']) logger.debug("UpdateKeyForm failed cleaning as API id %s already exists." % self.cleaned_data['api_id'])
raise forms.ValidationError(u'API key already exist') raise forms.ValidationError(u'API key already exist')
check_blue = False chars = EveApiManager.get_characters_from_api(self.cleaned_data['api_id'], self.cleaned_data['api_key']).result
try: states = []
check_blue = self.cleaned_data['is_blue'] states.append(self.user_state)
except: for char in chars:
pass evechar = EveCharacter()
evechar.character_name = chars[char]['name']
if check_blue: evechar.corporation_id = chars[char]['corp']['id']
if settings.BLUE_API_ACCOUNT: evechar.alliance_id = chars[char]['alliance']['id']
if not EveApiManager.check_api_is_type_account(self.cleaned_data['api_id'], state = determine_membership_by_character(evechar)
self.cleaned_data['api_key']): logger.debug("API ID %s character %s has state %s" % (self.cleaned_data['api_id'], evechar, state)
logger.debug("UpdateKeyForm failed cleaning as API id %s does not meet blue api key account requirement." % self.cleaned_data['api_id']) states.append(state)
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))
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 return self.cleaned_data

View File

@ -20,6 +20,7 @@ from eveonline.models import EveCorporationInfo
from eveonline.models import EveCharacter from eveonline.models import EveCharacter
from eveonline.models import EveApiKeyPair from eveonline.models import EveApiKeyPair
from authentication.models import AuthServicesInfo from authentication.models import AuthServicesInfo
from celerytask.tasks import determine_membership_by_user
import logging import logging
@ -46,8 +47,9 @@ def disable_blue_member(user):
@login_required @login_required
def add_api_key(request): def add_api_key(request):
logger.debug("add_api_key called by user %s" % request.user) logger.debug("add_api_key called by user %s" % request.user)
user_state = determine_membership_by_user(request.user)
if request.method == 'POST': 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()) logger.debug("Request type POST with form valid: %s" % form.is_valid())
if form.is_valid(): if form.is_valid():
EveManager.create_api_keypair(form.cleaned_data['api_id'], 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.") logger.debug("Form invalid: returning to form.")
else: else:
logger.debug("Providing empty update key form for user %s" % request.user) 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)} context = {'form': form, 'apikeypairs': EveManager.get_api_key_pairs(request.user.id)}
return render_to_response('registered/addapikey.html', context, return render_to_response('registered/addapikey.html', context,
context_instance=RequestContext(request)) context_instance=RequestContext(request))

View File

@ -267,3 +267,26 @@ class EveApiManager():
return False return False
logger.warn("Exception prevented verification of corp id %s existance. Assuming false." % corp_id) logger.warn("Exception prevented verification of corp id %s existance. Assuming false." % corp_id)
return False 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