diff --git a/src/backend/InvenTree/plugin/builtin/integration/core_wellknown.py b/src/backend/InvenTree/plugin/builtin/integration/core_wellknown.py
index 8d910f1aff..06b104aa75 100644
--- a/src/backend/InvenTree/plugin/builtin/integration/core_wellknown.py
+++ b/src/backend/InvenTree/plugin/builtin/integration/core_wellknown.py
@@ -1,6 +1,7 @@
"""Base plugin which defines the built-in well-known entries."""
from django.http import HttpRequest, JsonResponse
+from django.shortcuts import redirect
from django.urls import path, reverse_lazy
from django.utils.translation import gettext_lazy as _
@@ -42,6 +43,17 @@ class InvenTreeWellKnown(WellKnownMixin, UrlsMixin, InvenTreePlugin):
# If the flag is not evaluated successfully, we can ignore it
pass
+ # change password to help pwd managers - see https://adamj.eu/tech/2026/09/16/django-change-password-url/
+ data.append((
+ 'change-password',
+ reverse_lazy(f'plugin:{self.slug}:change-password'),
+ ))
+ # dead url (for change-password)
+ data.append((
+ 'resource-that-should-not-exist-whose-status-code-should-not-be-200',
+ reverse_lazy(f'plugin:{self.slug}:dead'),
+ ))
+
return data
@auth_exempt
@@ -52,6 +64,22 @@ class InvenTreeWellKnown(WellKnownMixin, UrlsMixin, InvenTreePlugin):
)
return JsonResponse({'enroll': passkey_web, 'manage': passkey_web})
+ @auth_exempt
+ def view_change_password(self, request, *args, **kwargs):
+ """Redirect to the change-password web page."""
+ return redirect(
+ request.build_absolute_uri(InvenTree.helpers.pui_url('/change-password'))
+ )
+
+ @auth_exempt
+ def view_dead(self, request, *args, **kwargs):
+ """Return a 404 for the dead well-known entry."""
+ return JsonResponse({'error': 'Not found'}, status=404)
+
def setup_urls(self):
"""Urls that are exposed by this plugin."""
- return [path('passkey/', self.view_passkey, name='passkey')]
+ return [
+ path('passkey/', self.view_passkey, name='passkey'),
+ path('change-password', self.view_change_password, name='change-password'),
+ path('dead', self.view_dead, name='dead'),
+ ]
diff --git a/src/frontend/src/pages/Auth/ChangePassword.tsx b/src/frontend/src/pages/Auth/ChangePassword.tsx
index bee81faa81..eb60ebbe24 100644
--- a/src/frontend/src/pages/Auth/ChangePassword.tsx
+++ b/src/frontend/src/pages/Auth/ChangePassword.tsx
@@ -46,6 +46,7 @@ export default function Set_Password() {
label={t`Current Password`}
description={t`Enter your current password`}
{...simpleForm.getInputProps('current_password')}
+ autoComplete='current-password'
/>