diff --git a/docs/release-notes/version-2.10.md b/docs/release-notes/version-2.10.md index 7031f7fb8..2b47faec0 100644 --- a/docs/release-notes/version-2.10.md +++ b/docs/release-notes/version-2.10.md @@ -1,5 +1,13 @@ # NetBox v2.10 +## v2.10.9 (FUTURE) + +### Bug Fixes + +* [#6073](https://github.com/netbox-community/netbox/issues/6073) - Permit users to manage their own REST API tokens without needing explicit permission + +--- + ## v2.10.8 (2021-03-26) ### Bug Fixes diff --git a/netbox/templates/users/api_tokens.html b/netbox/templates/users/api_tokens.html index 04e7cb23d..f14773293 100644 --- a/netbox/templates/users/api_tokens.html +++ b/netbox/templates/users/api_tokens.html @@ -11,12 +11,8 @@
Copy - {% if perms.users.change_token %} - Edit - {% endif %} - {% if perms.users.delete_token %} - Delete - {% endif %} + Edit + Delete
{{ token.key }} @@ -55,16 +51,10 @@ {% empty %}

You do not have any API tokens.

{% endfor %} - {% if perms.users.add_token %} - - - Add a token - - {% else %} - - {% endif %} + + + Add a token +
{% endblock %} diff --git a/netbox/users/views.py b/netbox/users/views.py index a6d28ecd2..cf7ed6430 100644 --- a/netbox/users/views.py +++ b/netbox/users/views.py @@ -6,7 +6,7 @@ from django.contrib.auth import login as auth_login, logout as auth_logout, upda from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.models import update_last_login from django.contrib.auth.signals import user_logged_in -from django.http import HttpResponseForbidden, HttpResponseRedirect +from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.decorators import method_decorator @@ -282,13 +282,9 @@ class TokenEditView(LoginRequiredMixin, View): def get(self, request, pk=None): - if pk is not None: - if not request.user.has_perm('users.change_token'): - return HttpResponseForbidden() + if pk: token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk) else: - if not request.user.has_perm('users.add_token'): - return HttpResponseForbidden() token = Token(user=request.user) form = TokenForm(instance=token) @@ -302,11 +298,11 @@ class TokenEditView(LoginRequiredMixin, View): def post(self, request, pk=None): - if pk is not None: + if pk: token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk) form = TokenForm(request.POST, instance=token) else: - token = Token() + token = Token(user=request.user) form = TokenForm(request.POST) if form.is_valid(): @@ -314,7 +310,7 @@ class TokenEditView(LoginRequiredMixin, View): token.user = request.user token.save() - msg = "Modified token {}".format(token) if pk else "Created token {}".format(token) + msg = f"Modified token {token}" if pk else f"Created token {token}" messages.success(request, msg) if '_addanother' in request.POST: