Periodic checks of character ownership hashes.

Fix migration naming from merge.
This commit is contained in:
Adarnof
2017-09-17 02:31:46 -04:00
parent 02f2968ee5
commit 5ce5f37867
8 changed files with 67 additions and 26 deletions

36
authentication/tasks.py Normal file
View 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)

View File

@@ -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)