mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2026-02-04 22:26:19 +01:00
Periodic checks of character ownership hashes.
Fix migration naming from merge.
This commit is contained in:
36
authentication/tasks.py
Normal file
36
authentication/tasks.py
Normal file
@@ -0,0 +1,36 @@
|
||||
from alliance_auth.celeryapp import app
|
||||
from esi.models import Token
|
||||
from esi.errors import TokenExpiredError, TokenInvalidError
|
||||
from authentication.models import CharacterOwnership
|
||||
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@app.task
|
||||
def check_character_ownership(owner_hash):
|
||||
tokens = Token.objects.filter(character_owner_hash=owner_hash)
|
||||
if tokens:
|
||||
for t in tokens:
|
||||
old_hash = t.character_owner_hash
|
||||
try:
|
||||
t.update_token_data(commit=False)
|
||||
except (TokenExpiredError, TokenInvalidError):
|
||||
t.delete()
|
||||
continue
|
||||
|
||||
if t.character_owner_hash == old_hash:
|
||||
break
|
||||
else:
|
||||
logger.info('Character %s has changed ownership. Revoking %s tokens.' % (t.character_name, tokens.count()))
|
||||
tokens.delete()
|
||||
else:
|
||||
logger.info('No tokens found with owner hash %s. Revoking ownership.' % owner_hash)
|
||||
CharacterOwnership.objects.filter(owner_hash=owner_hash).delete()
|
||||
|
||||
|
||||
@app.task
|
||||
def check_all_character_ownership():
|
||||
for c in CharacterOwnership.objects.all().only('owner_hash'):
|
||||
check_character_ownership.delay(c.owner_hash)
|
||||
@@ -12,6 +12,7 @@ from django.contrib.auth.models import User
|
||||
from alliance_auth.tests.auth_utils import AuthUtils
|
||||
from authentication.models import CharacterOwnership, UserProfile, State, get_guest_state
|
||||
from authentication.backends import StateBackend
|
||||
from authentication.tasks import check_character_ownership
|
||||
from eveonline.models import EveCharacter, EveCorporationInfo, EveAllianceInfo
|
||||
from esi.models import Token
|
||||
|
||||
@@ -136,6 +137,28 @@ class CharacterOwnershipTestCase(TestCase):
|
||||
self.user = User.objects.get(pk=self.user.pk)
|
||||
self.assertIsNone(self.user.profile.main_character)
|
||||
|
||||
@mock.patch('esi.models.Token.update_token_data')
|
||||
def test_character_ownership_check(self, update_token_data):
|
||||
t = Token.objects.create(
|
||||
user=self.user,
|
||||
character_id=self.character.character_id,
|
||||
character_name=self.character.character_name,
|
||||
character_owner_hash='1',
|
||||
)
|
||||
co = CharacterOwnership.objects.get(owner_hash='1')
|
||||
check_character_ownership(co.owner_hash)
|
||||
self.assertTrue(CharacterOwnership.objects.filter(owner_hash='1').exists())
|
||||
|
||||
t.character_owner_hash = '2'
|
||||
t.save()
|
||||
check_character_ownership(co.owner_hash)
|
||||
self.assertFalse(CharacterOwnership.objects.filter(owner_hash='1').exists())
|
||||
|
||||
t.delete()
|
||||
co = CharacterOwnership.objects.create(user=self.user, character=self.character, owner_hash='3')
|
||||
check_character_ownership(co.owner_hash)
|
||||
self.assertFalse(CharacterOwnership.objects.filter(owner_hash='3').exists())
|
||||
|
||||
|
||||
class StateTestCase(TestCase):
|
||||
@classmethod
|
||||
@@ -269,4 +292,4 @@ class StateTestCase(TestCase):
|
||||
self.user.is_active = True
|
||||
self.user.save()
|
||||
self._refresh_user()
|
||||
self.assertEquals(self.user.profile.state, self.member_state)
|
||||
self.assertEquals(self.user.profile.state, self.member_state)
|
||||
|
||||
Reference in New Issue
Block a user