diff --git a/internal/server/http/ui_users.go b/internal/server/http/ui_users.go index 08ee401..f9c1eec 100644 --- a/internal/server/http/ui_users.go +++ b/internal/server/http/ui_users.go @@ -51,6 +51,7 @@ type userRow struct { LastLoginAt string // pre-formatted "2006-01-02 15:04:05" or "never" Disabled bool MustChangePassword bool + AuthSource string } func (s *Server) handleUIUsersList(w stdhttp.ResponseWriter, r *stdhttp.Request) { @@ -104,6 +105,7 @@ func (s *Server) handleUIUsersList(w stdhttp.ResponseWriter, r *stdhttp.Request) Role: string(ux.Role), LastLoginAt: ll, Disabled: ux.DisabledAt != nil, MustChangePassword: ux.MustChangePassword, + AuthSource: ux.AuthSource, }) } @@ -157,7 +159,8 @@ type userFormPage struct { // to add a username that already exists (disabled). Triggers a // banner on the edit page explaining why and steering them at // the Re-enable button. See handleUIUserNewPost's collision branch. - Reenable bool + Reenable bool + AuthSource string } func (s *Server) handleUIUserNewGet(w stdhttp.ResponseWriter, r *stdhttp.Request) { @@ -294,8 +297,9 @@ func (s *Server) handleUIUserEditGet(w stdhttp.ResponseWriter, r *stdhttp.Reques view.Page = userFormPage{ Mode: "edit", ID: target.ID, Username: target.Username, Email: em, Role: string(target.Role), - Disabled: target.DisabledAt != nil, - Reenable: r.URL.Query().Get("reenable") == "1", + Disabled: target.DisabledAt != nil, + Reenable: r.URL.Query().Get("reenable") == "1", + AuthSource: target.AuthSource, } _ = s.deps.UI.Render(w, "user_edit", view) } @@ -315,6 +319,10 @@ func (s *Server) handleUIUserEditPost(w stdhttp.ResponseWriter, r *stdhttp.Reque stdhttp.NotFound(w, r) return } + if target.AuthSource == "oidc" { + stdhttp.Error(w, "OIDC users cannot have role/email edited locally", stdhttp.StatusForbidden) + return + } role, ok := validRole(r.PostForm.Get("role")) if !ok { stdhttp.Error(w, "bad role", stdhttp.StatusBadRequest) diff --git a/web/templates/pages/user_edit.html b/web/templates/pages/user_edit.html index 4014fad..9e8cd94 100644 --- a/web/templates/pages/user_edit.html +++ b/web/templates/pages/user_edit.html @@ -67,9 +67,20 @@ {{end}} {{else}} {{/* new + edit form. */}} + {{if and (eq $page.Mode "edit") (eq $page.AuthSource "oidc")}} +
+
+ This user is provisioned via OIDC. Username, role, and email are + managed by your IdP and refreshed on each sign-in. Disable / + Enable / Force logout still work locally. +
+
+ {{end}}
+ class="panel rounded-[7px] p-6 space-y-4 {{if and (eq $page.Mode "edit") (eq $page.AuthSource "oidc")}}mt-3{{else}}mt-7{{end}}">
- @@ -104,9 +117,11 @@
Other actions
- - - + {{if ne $page.AuthSource "oidc"}} +
+ +
+ {{end}}
diff --git a/web/templates/pages/users.html b/web/templates/pages/users.html index 6b411b4..6022c55 100644 --- a/web/templates/pages/users.html +++ b/web/templates/pages/users.html @@ -67,6 +67,7 @@ {{if .Disabled}}disabled {{else if .MustChangePassword}}setup pending {{else}}enabled{{end}} + {{if eq .AuthSource "oidc"}}oidc{{end}}