mirror of
https://github.com/router-for-me/CLIProxyAPIPlus.git
synced 2026-03-30 01:06:39 +00:00
Previously Cursor required a manual ?label=xxx parameter to distinguish accounts (unlike Codex which auto-generates filenames from JWT claims). Cursor JWTs contain a "sub" claim (e.g. "auth0|user_XXXX") that uniquely identifies each account. Now we: - Add ParseJWTSub() + SubToShortHash() to extract and hash the sub claim - Refactor GetTokenExpiry() to share the new decodeJWTPayload() helper - Update CredentialFileName(label, subHash) to auto-generate filenames from the sub hash when no explicit label is provided (e.g. "cursor.8f202e67.json" instead of always "cursor.json") - Add DisplayLabel() for human-readable account identification - Store "sub" in metadata for observability - Update both management API handler and SDK authenticator Same account always produces the same filename (deterministic), different accounts get different files. Explicit ?label= still takes priority. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
34 lines
828 B
Go
34 lines
828 B
Go
package cursor
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// CredentialFileName returns the filename used to persist Cursor credentials.
|
|
// Priority: explicit label > auto-generated from JWT sub hash.
|
|
// If both label and subHash are empty, falls back to "cursor.json".
|
|
func CredentialFileName(label, subHash string) string {
|
|
label = strings.TrimSpace(label)
|
|
subHash = strings.TrimSpace(subHash)
|
|
if label != "" {
|
|
return fmt.Sprintf("cursor.%s.json", label)
|
|
}
|
|
if subHash != "" {
|
|
return fmt.Sprintf("cursor.%s.json", subHash)
|
|
}
|
|
return "cursor.json"
|
|
}
|
|
|
|
// DisplayLabel returns a human-readable label for the Cursor account.
|
|
func DisplayLabel(label, subHash string) string {
|
|
label = strings.TrimSpace(label)
|
|
if label != "" {
|
|
return "Cursor " + label
|
|
}
|
|
if subHash != "" {
|
|
return "Cursor " + subHash
|
|
}
|
|
return "Cursor User"
|
|
}
|