mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-28 08:36:09 +08:00
feat/auth-hook: add post auth hook
This commit is contained in:
@@ -75,21 +75,10 @@ func (ts *ClaudeTokenStorage) SaveTokenToFile(authFilePath string) error {
|
||||
_ = f.Close()
|
||||
}()
|
||||
|
||||
// Convert struct to map for merging
|
||||
data := make(map[string]any)
|
||||
temp, errJson := json.Marshal(ts)
|
||||
if errJson != nil {
|
||||
return fmt.Errorf("failed to marshal struct: %w", errJson)
|
||||
}
|
||||
if errUnmarshal := json.Unmarshal(temp, &data); errUnmarshal != nil {
|
||||
return fmt.Errorf("failed to unmarshal struct map: %w", errUnmarshal)
|
||||
}
|
||||
|
||||
// Merge extra metadata
|
||||
if ts.Metadata != nil {
|
||||
for k, v := range ts.Metadata {
|
||||
data[k] = v
|
||||
}
|
||||
// Merge metadata using helper
|
||||
data, errMerge := misc.MergeMetadata(ts, ts.Metadata)
|
||||
if errMerge != nil {
|
||||
return fmt.Errorf("failed to merge metadata: %w", errMerge)
|
||||
}
|
||||
|
||||
// Encode and write the token data as JSON
|
||||
|
||||
@@ -68,21 +68,10 @@ func (ts *CodexTokenStorage) SaveTokenToFile(authFilePath string) error {
|
||||
_ = f.Close()
|
||||
}()
|
||||
|
||||
// Convert struct to map for merging
|
||||
data := make(map[string]any)
|
||||
temp, errJson := json.Marshal(ts)
|
||||
if errJson != nil {
|
||||
return fmt.Errorf("failed to marshal struct: %w", errJson)
|
||||
}
|
||||
if errUnmarshal := json.Unmarshal(temp, &data); errUnmarshal != nil {
|
||||
return fmt.Errorf("failed to unmarshal struct map: %w", errUnmarshal)
|
||||
}
|
||||
|
||||
// Merge extra metadata
|
||||
if ts.Metadata != nil {
|
||||
for k, v := range ts.Metadata {
|
||||
data[k] = v
|
||||
}
|
||||
// Merge metadata using helper
|
||||
data, errMerge := misc.MergeMetadata(ts, ts.Metadata)
|
||||
if errMerge != nil {
|
||||
return fmt.Errorf("failed to merge metadata: %w", errMerge)
|
||||
}
|
||||
|
||||
if err = json.NewEncoder(f).Encode(data); err != nil {
|
||||
|
||||
@@ -11,7 +11,6 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/router-for-me/CLIProxyAPI/v6/internal/misc"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// GeminiTokenStorage stores OAuth2 token information for Google Gemini API authentication.
|
||||
@@ -58,41 +57,35 @@ func (ts *GeminiTokenStorage) SetMetadata(meta map[string]any) {
|
||||
// - error: An error if the operation fails, nil otherwise
|
||||
func (ts *GeminiTokenStorage) SaveTokenToFile(authFilePath string) error {
|
||||
misc.LogSavingCredentials(authFilePath)
|
||||
ts.Type = "gemini"
|
||||
if err := os.MkdirAll(filepath.Dir(authFilePath), 0700); err != nil {
|
||||
return fmt.Errorf("failed to create directory: %v", err)
|
||||
ts.Type = "gemini" // Ensure type is set before merging/saving
|
||||
|
||||
// Merge metadata using helper
|
||||
data, errMerge := misc.MergeMetadata(ts, ts.Metadata)
|
||||
if errMerge != nil {
|
||||
return fmt.Errorf("failed to merge metadata: %w", errMerge)
|
||||
}
|
||||
|
||||
// Create parent directory
|
||||
if err := os.MkdirAll(filepath.Dir(authFilePath), os.ModePerm); err != nil {
|
||||
return fmt.Errorf("failed to create directory: %w", err)
|
||||
}
|
||||
|
||||
// Create file
|
||||
f, err := os.Create(authFilePath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create token file: %w", err)
|
||||
return fmt.Errorf("failed to create file: %w", err)
|
||||
}
|
||||
defer func() {
|
||||
if errClose := f.Close(); errClose != nil {
|
||||
log.Errorf("failed to close file: %v", errClose)
|
||||
}
|
||||
_ = f.Close()
|
||||
}()
|
||||
|
||||
// Convert struct to map for merging
|
||||
data := make(map[string]any)
|
||||
temp, errJson := json.Marshal(ts)
|
||||
if errJson != nil {
|
||||
return fmt.Errorf("failed to marshal struct: %w", errJson)
|
||||
}
|
||||
if errUnmarshal := json.Unmarshal(temp, &data); errUnmarshal != nil {
|
||||
return fmt.Errorf("failed to unmarshal struct map: %w", errUnmarshal)
|
||||
// Write to file
|
||||
enc := json.NewEncoder(f)
|
||||
enc.SetIndent("", " ")
|
||||
if err := enc.Encode(data); err != nil {
|
||||
return fmt.Errorf("failed to encode token to file: %w", err)
|
||||
}
|
||||
|
||||
// Merge extra metadata
|
||||
if ts.Metadata != nil {
|
||||
for k, v := range ts.Metadata {
|
||||
data[k] = v
|
||||
}
|
||||
}
|
||||
|
||||
if err = json.NewEncoder(f).Encode(data); err != nil {
|
||||
return fmt.Errorf("failed to write token to file: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -46,21 +46,10 @@ func (ts *IFlowTokenStorage) SaveTokenToFile(authFilePath string) error {
|
||||
}
|
||||
defer func() { _ = f.Close() }()
|
||||
|
||||
// Convert struct to map for merging
|
||||
data := make(map[string]any)
|
||||
temp, errJson := json.Marshal(ts)
|
||||
if errJson != nil {
|
||||
return fmt.Errorf("failed to marshal struct: %w", errJson)
|
||||
}
|
||||
if errUnmarshal := json.Unmarshal(temp, &data); errUnmarshal != nil {
|
||||
return fmt.Errorf("failed to unmarshal struct map: %w", errUnmarshal)
|
||||
}
|
||||
|
||||
// Merge extra metadata
|
||||
if ts.Metadata != nil {
|
||||
for k, v := range ts.Metadata {
|
||||
data[k] = v
|
||||
}
|
||||
// Merge metadata using helper
|
||||
data, errMerge := misc.MergeMetadata(ts, ts.Metadata)
|
||||
if errMerge != nil {
|
||||
return fmt.Errorf("failed to merge metadata: %w", errMerge)
|
||||
}
|
||||
|
||||
if err = json.NewEncoder(f).Encode(data); err != nil {
|
||||
|
||||
@@ -95,21 +95,10 @@ func (ts *KimiTokenStorage) SaveTokenToFile(authFilePath string) error {
|
||||
_ = f.Close()
|
||||
}()
|
||||
|
||||
// Convert struct to map for merging
|
||||
data := make(map[string]any)
|
||||
temp, errJson := json.Marshal(ts)
|
||||
if errJson != nil {
|
||||
return fmt.Errorf("failed to marshal struct: %w", errJson)
|
||||
}
|
||||
if errUnmarshal := json.Unmarshal(temp, &data); errUnmarshal != nil {
|
||||
return fmt.Errorf("failed to unmarshal struct map: %w", errUnmarshal)
|
||||
}
|
||||
|
||||
// Merge extra metadata
|
||||
if ts.Metadata != nil {
|
||||
for k, v := range ts.Metadata {
|
||||
data[k] = v
|
||||
}
|
||||
// Merge metadata using helper
|
||||
data, errMerge := misc.MergeMetadata(ts, ts.Metadata)
|
||||
if errMerge != nil {
|
||||
return fmt.Errorf("failed to merge metadata: %w", errMerge)
|
||||
}
|
||||
|
||||
encoder := json.NewEncoder(f)
|
||||
|
||||
@@ -66,21 +66,10 @@ func (ts *QwenTokenStorage) SaveTokenToFile(authFilePath string) error {
|
||||
_ = f.Close()
|
||||
}()
|
||||
|
||||
// Convert struct to map for merging
|
||||
data := make(map[string]any)
|
||||
temp, errJson := json.Marshal(ts)
|
||||
if errJson != nil {
|
||||
return fmt.Errorf("failed to marshal struct: %w", errJson)
|
||||
}
|
||||
if errUnmarshal := json.Unmarshal(temp, &data); errUnmarshal != nil {
|
||||
return fmt.Errorf("failed to unmarshal struct map: %w", errUnmarshal)
|
||||
}
|
||||
|
||||
// Merge extra metadata
|
||||
if ts.Metadata != nil {
|
||||
for k, v := range ts.Metadata {
|
||||
data[k] = v
|
||||
}
|
||||
// Merge metadata using helper
|
||||
data, errMerge := misc.MergeMetadata(ts, ts.Metadata)
|
||||
if errMerge != nil {
|
||||
return fmt.Errorf("failed to merge metadata: %w", errMerge)
|
||||
}
|
||||
|
||||
if err = json.NewEncoder(f).Encode(data); err != nil {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package misc
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
@@ -24,3 +25,37 @@ func LogSavingCredentials(path string) {
|
||||
func LogCredentialSeparator() {
|
||||
log.Debug(credentialSeparator)
|
||||
}
|
||||
|
||||
// MergeMetadata serializes the source struct into a map and merges the provided metadata into it.
|
||||
func MergeMetadata(source any, metadata map[string]any) (map[string]any, error) {
|
||||
var data map[string]any
|
||||
|
||||
// Fast path: if source is already a map, just copy it to avoid mutation of original
|
||||
if srcMap, ok := source.(map[string]any); ok {
|
||||
data = make(map[string]any, len(srcMap)+len(metadata))
|
||||
for k, v := range srcMap {
|
||||
data[k] = v
|
||||
}
|
||||
} else {
|
||||
// Slow path: marshal to JSON and back to map to respect JSON tags
|
||||
temp, err := json.Marshal(source)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to marshal source: %w", err)
|
||||
}
|
||||
if err := json.Unmarshal(temp, &data); err != nil {
|
||||
return nil, fmt.Errorf("failed to unmarshal to map: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Merge extra metadata
|
||||
if metadata != nil {
|
||||
if data == nil {
|
||||
data = make(map[string]any)
|
||||
}
|
||||
for k, v := range metadata {
|
||||
data[k] = v
|
||||
}
|
||||
}
|
||||
|
||||
return data, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user