Skip to content

Commit

Permalink
Add 'expires' field and '_post_save_set_expiry_date' function
Browse files Browse the repository at this point in the history
The 'expires' field will enable one to increment / decrement the expiry
date of an ODKToken easily. Included the '_post_save_set_expiry_date'
function to set the 'expires' field value post_save in order to have
access to the 'created' field value

- Update 'test_fails_authentication_past_odk_token_expiry' test
  • Loading branch information
DavisRayM committed Jul 30, 2020
1 parent adcd1dd commit 0358949
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 10 deletions.
18 changes: 18 additions & 0 deletions onadata/apps/api/migrations/0007_odktoken_expires.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 2.2.10 on 2020-07-17 11:57

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('api', '0006_auto_20191025_0730'),
]

operations = [
migrations.AddField(
model_name='odktoken',
name='expires',
field=models.DateTimeField(blank=True, null=True),
),
]
20 changes: 13 additions & 7 deletions onadata/apps/api/models/odk_token.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class ODKToken(models.Model):
default=ACTIVE,
max_length=1)
created = models.DateTimeField(auto_now_add=True)
expires = models.DateTimeField(blank=True, null=True)

class Meta:
app_label = 'api'
Expand All @@ -59,6 +60,7 @@ def check_key(self, key):
def save(self, *args, **kwargs): # pylint: disable=arguments-differ
if not self.key:
self.key = self.generate_key()

return super(ODKToken, self).save(*args, **kwargs)

def generate_key(self):
Expand All @@ -69,13 +71,6 @@ def generate_key(self):
def __str__(self):
return self.key

@property
def expires(self):
"""
This property holds the datetime of when the Token expires
"""
return self.created + timedelta(days=ODK_TOKEN_LIFETIME)

@property
def raw_key(self):
"""
Expand All @@ -99,5 +94,16 @@ def _post_save_persist_partial_digests(sender, instance=None, **kwargs):
_persist_partial_digests(instance.user)


def _post_save_set_expiry_date(sender, instance=None, **kwargs):
if instance and not instance.expires:
instance.expires = instance.created + timedelta(
days=ODK_TOKEN_LIFETIME)
instance.expires = instance.expires.astimezone(
instance.created.tzinfo)
instance.save()


post_save.connect(
_post_save_persist_partial_digests, sender=ODKToken)

post_save.connect(_post_save_set_expiry_date, sender=ODKToken)
9 changes: 7 additions & 2 deletions onadata/apps/api/tests/models/test_odk_token.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
"""
Test ODK Token module
"""
from onadata.apps.api.models.odk_token import ODKToken
from datetime import timedelta

from onadata.apps.api.models.odk_token import ODKToken, ODK_TOKEN_LIFETIME
from onadata.apps.api.tests.models.test_abstract_models import \
TestAbstractModels

Expand All @@ -14,6 +16,9 @@ def test_create_odk_token(self):
self._create_user_and_login()
initial_count = ODKToken.objects.count()

ODKToken.objects.create(user=self.user)
token = ODKToken.objects.create(user=self.user)

self.assertEqual(initial_count + 1, ODKToken.objects.count())
self.assertEqual(
token.expires,
token.created + timedelta(days=ODK_TOKEN_LIFETIME))
3 changes: 2 additions & 1 deletion onadata/apps/logger/tests/test_digest_authentication.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@ def test_fails_authentication_past_odk_token_expiry(self):
self.user.save()
odk_token = ODKToken.objects.create(user=self.user)

odk_token.created = timezone.now() - timedelta(days=400)
# Set expiry date of the token to the past
odk_token.expires = timezone.now() - timedelta(days=400)
odk_token.save()

# The value odk_token.key is hashed we need to have the raw_key
Expand Down

0 comments on commit 0358949

Please sign in to comment.