From deb24c638f8c449da71ee4ef12dba0a981f08454 Mon Sep 17 00:00:00 2001 From: wh1te909 Date: Tue, 20 Dec 2022 23:20:47 +0000 Subject: [PATCH] allow self reset without user perms #1378 --- api/tacticalrmm/accounts/tests.py | 21 +++++++++++++++++++++ api/tacticalrmm/accounts/urls.py | 2 ++ api/tacticalrmm/accounts/views.py | 20 ++++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/api/tacticalrmm/accounts/tests.py b/api/tacticalrmm/accounts/tests.py index f8b1d270..5c48eb96 100644 --- a/api/tacticalrmm/accounts/tests.py +++ b/api/tacticalrmm/accounts/tests.py @@ -297,6 +297,27 @@ class TestUserAction(TacticalTestCase): self.check_not_authenticated("patch", url) +class TestUserReset(TacticalTestCase): + def setUp(self): + self.authenticate() + self.setup_coresettings() + + def test_reset_pw(self): + url = "/accounts/resetpw/" + data = {"password": "superSekret123456"} + r = self.client.put(url, data, format="json") + self.assertEqual(r.status_code, 200) + + self.check_not_authenticated("put", url) + + def test_reset_2fa(self): + url = "/accounts/reset2fa/" + r = self.client.put(url) + self.assertEqual(r.status_code, 200) + + self.check_not_authenticated("put", url) + + class TestAPIKeyViews(TacticalTestCase): def setUp(self): self.setup_coresettings() diff --git a/api/tacticalrmm/accounts/urls.py b/api/tacticalrmm/accounts/urls.py index 97769dc9..5aeb2178 100644 --- a/api/tacticalrmm/accounts/urls.py +++ b/api/tacticalrmm/accounts/urls.py @@ -13,4 +13,6 @@ urlpatterns = [ path("roles//", views.GetUpdateDeleteRole.as_view()), path("apikeys/", views.GetAddAPIKeys.as_view()), path("apikeys//", views.GetUpdateDeleteAPIKey.as_view()), + path("resetpw/", views.ResetPass.as_view()), + path("reset2fa/", views.Reset2FA.as_view()), ] diff --git a/api/tacticalrmm/accounts/views.py b/api/tacticalrmm/accounts/views.py index 8b194d5a..e0573a49 100644 --- a/api/tacticalrmm/accounts/views.py +++ b/api/tacticalrmm/accounts/views.py @@ -291,3 +291,23 @@ class GetUpdateDeleteAPIKey(APIView): apikey = get_object_or_404(APIKey, pk=pk) apikey.delete() return Response("The API Key was deleted") + + +class ResetPass(APIView): + permission_classes = [IsAuthenticated] + + def put(self, request): + user = request.user + user.set_password(request.data["password"]) + user.save() + return Response("Password was reset.") + + +class Reset2FA(APIView): + permission_classes = [IsAuthenticated] + + def put(self, request): + user = request.user + user.totp_key = "" + user.save() + return Response("2FA was reset. Log out and back in to setup.")