mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-11 21:40:17 +02:00
API form validates by member and characters
Functions to determine membership level of user and eve characters
This commit is contained in:
parent
d20c73fb03
commit
d4b9186c61
@ -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"))
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user