Skip to content

Commit 52740cd

Browse files
paulgueltekingiovannicimolin
authored andcommitted
show TOKEN only on create
return the token as message to the user change MIDDLEWARE_CLASSES (obsolete) to MIDDLEWARE, add required apps, middleware and context processors for admin pages add admin urls to reference project Add admin form for creating AuthTokens, add admin filter for searching AuthTokens Refactor AuthTokenManager, separate methods for token/digest/expiry logic
1 parent 20ca95a commit 52740cd

2 files changed

Lines changed: 55 additions & 4 deletions

File tree

‎knox/admin.py‎

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,49 @@
1-
from django.contrib import admin
2-
1+
from django import forms
2+
from django.contrib import admin, messages
3+
from django.contrib.auth import get_user_model
4+
from knox.settings import CONSTANTS
35
from knox import models
46

57

8+
class AuthTokenCreateForm(forms.ModelForm):
9+
10+
def __init__(self, *args, **kwargs):
11+
super(AuthTokenCreateForm, self).__init__(*args, **kwargs)
12+
self.token = None
13+
14+
class Meta:
15+
model = models.AuthToken
16+
fields = ['user', 'expiry']
17+
18+
def save(self, commit=True):
19+
obj = super(AuthTokenCreateForm, self).save(commit=False)
20+
digest, token = models.get_digest_token()
21+
obj.digest = digest
22+
obj.token_key = token[:CONSTANTS.TOKEN_KEY_LENGTH]
23+
self.token = token
24+
if commit:
25+
obj.save()
26+
obj.save_m2m()
27+
return obj
28+
29+
630
@admin.register(models.AuthToken)
731
class AuthTokenAdmin(admin.ModelAdmin):
32+
add_form = AuthTokenCreateForm
833
list_display = ('digest', 'user', 'created', 'expiry',)
34+
# We dont know how a custom User model looks like, but is must have a USERNAME_FIELD
35+
search_fields = ['digest', 'token_key', 'user__'+get_user_model().USERNAME_FIELD]
936
fields = ()
1037
raw_id_fields = ('user',)
38+
39+
def get_form(self, request, obj=None, **kwargs):
40+
defaults = {}
41+
if obj is None:
42+
defaults['form'] = self.add_form
43+
defaults.update(kwargs)
44+
return super(AuthTokenAdmin, self).get_form(request, obj, **defaults)
45+
46+
def save_model(self, request, obj, form, change):
47+
if not change:
48+
self.message_user(request, "TOKEN " + form.token, messages.INFO)
49+
super(AuthTokenAdmin, self).save_model(request, obj, form, change)

‎knox/models.py‎

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,18 @@
1212
User = settings.AUTH_USER_MODEL
1313

1414

15+
def get_expiry(expiry):
16+
if expiry is not None:
17+
expiry = timezone.now() + expiry
18+
return expiry
19+
20+
21+
def get_digest_token(prefix=knox_settings.TOKEN_PREFIX):
22+
token = prefix + crypto.create_token_string()
23+
digest = crypto.hash_token(token)
24+
return digest, token
25+
26+
1527
class AuthTokenManager(models.Manager):
1628
def create(
1729
self,
@@ -20,8 +32,8 @@ def create(
2032
prefix=knox_settings.TOKEN_PREFIX,
2133
**kwargs
2234
):
23-
token = prefix + crypto.create_token_string()
24-
digest = crypto.hash_token(token)
35+
36+
digest, token = get_digest_token(prefix)
2537
if expiry is not None:
2638
expiry = timezone.now() + expiry
2739
instance = super().create(

0 commit comments

Comments
 (0)