8853 make token view accessible only once on POST

This commit is contained in:
Arthur 2022-10-27 12:38:57 -07:00
parent c262593706
commit 08b965b55e
4 changed files with 20 additions and 23 deletions

View File

@ -1,4 +1,5 @@
{% extends 'generic/object.html' %} {% extends 'generic/object.html' %}
{% load form_helpers %}
{% load helpers %} {% load helpers %}
{% load plugins %} {% load plugins %}
@ -17,6 +18,7 @@
</table> </table>
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
{% render_form form %}
<div class="row my-3"> <div class="row my-3">
<div class="col col-md-12 text-center"> <div class="col col-md-12 text-center">
<button type="submit" name="_addanother" class="btn btn-outline-primary"> <button type="submit" name="_addanother" class="btn btn-outline-primary">

View File

@ -127,3 +127,7 @@ class TokenForm(BootstrapMixin, forms.ModelForm):
keyfield.disabled = True keyfield.disabled = True
keyfield.required = False keyfield.required = False
keyfield.widget = forms.HiddenInput() keyfield.widget = forms.HiddenInput()
class TokenViewForm(BootstrapMixin, forms.Form):
view_token = forms.BooleanField(widget=forms.HiddenInput(), required=False)

View File

@ -10,7 +10,6 @@ urlpatterns = [
path('password/', views.ChangePasswordView.as_view(), name='change_password'), path('password/', views.ChangePasswordView.as_view(), name='change_password'),
path('api-tokens/', views.TokenListView.as_view(), name='token_list'), path('api-tokens/', views.TokenListView.as_view(), name='token_list'),
path('api-tokens/add/', views.TokenEditView.as_view(), name='token_add'), path('api-tokens/add/', views.TokenEditView.as_view(), name='token_add'),
path('api-tokens/<int:pk>/', views.TokenKeyView.as_view(), name='token_key'),
path('api-tokens/<int:pk>/edit/', views.TokenEditView.as_view(), name='token_edit'), path('api-tokens/<int:pk>/edit/', views.TokenEditView.as_view(), name='token_edit'),
path('api-tokens/<int:pk>/delete/', views.TokenDeleteView.as_view(), name='token_delete'), path('api-tokens/<int:pk>/delete/', views.TokenDeleteView.as_view(), name='token_delete'),

View File

@ -20,7 +20,7 @@ from extras.tables import ObjectChangeTable
from netbox.authentication import get_auth_backend_display, get_saml_idps from netbox.authentication import get_auth_backend_display, get_saml_idps
from netbox.config import get_config from netbox.config import get_config
from utilities.forms import ConfirmationForm from utilities.forms import ConfirmationForm
from .forms import LoginForm, PasswordChangeForm, TokenForm, UserConfigForm from .forms import LoginForm, PasswordChangeForm, TokenForm, TokenViewForm, UserConfigForm
from .models import Token, UserConfig from .models import Token, UserConfig
from .tables import TokenTable from .tables import TokenTable
@ -274,6 +274,12 @@ class TokenEditView(LoginRequiredMixin, View):
form = TokenForm(request.POST) form = TokenForm(request.POST)
if form.is_valid(): if form.is_valid():
if 'view_token' in request.POST and request.POST['view_token']:
if '_addanother' in request.POST:
return redirect(request.path)
else:
return redirect('users:token_list')
token = form.save(commit=False) token = form.save(commit=False)
token.user = request.user token.user = request.user
token.save() token.save()
@ -282,7 +288,13 @@ class TokenEditView(LoginRequiredMixin, View):
messages.success(request, msg) messages.success(request, msg)
if not pk and not settings.ALLOW_TOKEN_RETRIEVAL: if not pk and not settings.ALLOW_TOKEN_RETRIEVAL:
return redirect('users:token_key', pk=token.pk) form = TokenViewForm(initial={'view_token': True})
return render(request, 'users/api_token.html', {
'object': token,
'form': form,
'key': token.key,
'return_url': reverse('users:token_list'),
})
elif '_addanother' in request.POST: elif '_addanother' in request.POST:
return redirect(request.path) return redirect(request.path)
else: else:
@ -326,23 +338,3 @@ class TokenDeleteView(LoginRequiredMixin, View):
'form': form, 'form': form,
'return_url': reverse('users:token_list'), 'return_url': reverse('users:token_list'),
}) })
class TokenKeyView(LoginRequiredMixin, View):
def get(self, request, pk):
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
return render(request, 'users/api_token.html', {
'object': token,
'key': token.key,
'return_url': reverse('users:token_list'),
})
def post(self, request, pk):
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
if '_addanother' in request.POST:
return redirect('users:token_add')
else:
return redirect('users:token_list')