Compare commits

...
Author SHA1 Message Date
adminandClaude Opus 4.5 942269099c Fix ParseMultipartForm for SetUserAdmin endpoint
The SetUserAdmin endpoint was using ParseForm() which doesn't handle
multipart/form-data (what JavaScript FormData sends). This caused the
is_admin field to be empty/missing, defaulting to false.

Applied the same fix as SetDisplayName - try ParseMultipartForm first,
fall back to ParseForm.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 20:24:12 -08:00
adminandClaude Opus 4.5 cd345c63be Add debug logging for admin console edit form issue
The admin console edit form is sending empty values even when the user
enters data. This adds debugging to identify the root cause:

- Add type="button" to modal buttons to prevent default submit behavior
- Add console.log in JavaScript to show what values are being read
- Add server-side logging to show Content-Type and parsed form values

This is temporary debugging to diagnose why displayName="" and
isAdmin=false are being received when the user enters values.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 20:09:37 -08:00
2 changed files with 24 additions and 9 deletions
@@ -1712,12 +1712,20 @@ func handleSetUserDisplayName(w http.ResponseWriter, r *http.Request, userID str
return
}
if err := r.ParseForm(); err != nil {
http.Error(w, "Invalid form data", http.StatusBadRequest)
return
// Debug: log content type and try both parsing methods
contentType := r.Header.Get("Content-Type")
log.Printf("[Debug] SetDisplayName Content-Type: %s", contentType)
if err := r.ParseMultipartForm(32 << 20); err != nil {
log.Printf("[Debug] ParseMultipartForm error: %v, trying ParseForm", err)
if err := r.ParseForm(); err != nil {
http.Error(w, "Invalid form data", http.StatusBadRequest)
return
}
}
displayName := r.FormValue("display_name")
log.Printf("[Debug] Parsed display_name: %q, Form: %v, PostForm: %v", displayName, r.Form, r.PostForm)
ctx, cancel := createAdminContext(r)
defer cancel()
@@ -1753,12 +1761,18 @@ func handleSetUserAdmin(w http.ResponseWriter, r *http.Request, userID string) {
return
}
if err := r.ParseForm(); err != nil {
http.Error(w, "Invalid form data", http.StatusBadRequest)
return
// Parse multipart form (FormData from JavaScript sends multipart/form-data)
if err := r.ParseMultipartForm(32 << 20); err != nil {
// Fall back to regular form parsing for application/x-www-form-urlencoded
if err := r.ParseForm(); err != nil {
http.Error(w, "Invalid form data", http.StatusBadRequest)
return
}
}
isAdmin := r.FormValue("is_admin") == "true"
isAdminStr := r.FormValue("is_admin")
isAdmin := isAdminStr == "true"
log.Printf("[Debug] SetUserAdmin: is_admin=%q, parsed=%v", isAdminStr, isAdmin)
ctx, cancel := createAdminContext(r)
defer cancel()
@@ -100,8 +100,8 @@
<div id="edit-feedback"></div>
</form>
<footer>
<button class="secondary" onclick="document.getElementById('edit-modal').close()">Cancel</button>
<button onclick="saveUserChanges()">Save Changes</button>
<button type="button" class="secondary" onclick="document.getElementById('edit-modal').close()">Cancel</button>
<button type="button" onclick="saveUserChanges()">Save Changes</button>
</footer>
</article>
</dialog>
@@ -124,6 +124,7 @@ function saveUserChanges() {
const isAdmin = document.getElementById('edit-is-admin').checked;
const feedback = document.getElementById('edit-feedback');
console.log('saveUserChanges called:', {userId, displayName, isAdmin, originalIsAdmin});
feedback.innerHTML = '<p>Saving...</p>';
// Update display name