mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-28 16:25:55 +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()
|
_ = f.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Convert struct to map for merging
|
// Merge metadata using helper
|
||||||
data := make(map[string]any)
|
data, errMerge := misc.MergeMetadata(ts, ts.Metadata)
|
||||||
temp, errJson := json.Marshal(ts)
|
if errMerge != nil {
|
||||||
if errJson != nil {
|
return fmt.Errorf("failed to merge metadata: %w", errMerge)
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encode and write the token data as JSON
|
// Encode and write the token data as JSON
|
||||||
|
|||||||
@@ -68,21 +68,10 @@ func (ts *CodexTokenStorage) SaveTokenToFile(authFilePath string) error {
|
|||||||
_ = f.Close()
|
_ = f.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Convert struct to map for merging
|
// Merge metadata using helper
|
||||||
data := make(map[string]any)
|
data, errMerge := misc.MergeMetadata(ts, ts.Metadata)
|
||||||
temp, errJson := json.Marshal(ts)
|
if errMerge != nil {
|
||||||
if errJson != nil {
|
return fmt.Errorf("failed to merge metadata: %w", errMerge)
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = json.NewEncoder(f).Encode(data); err != nil {
|
if err = json.NewEncoder(f).Encode(data); err != nil {
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/router-for-me/CLIProxyAPI/v6/internal/misc"
|
"github.com/router-for-me/CLIProxyAPI/v6/internal/misc"
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// GeminiTokenStorage stores OAuth2 token information for Google Gemini API authentication.
|
// 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
|
// - error: An error if the operation fails, nil otherwise
|
||||||
func (ts *GeminiTokenStorage) SaveTokenToFile(authFilePath string) error {
|
func (ts *GeminiTokenStorage) SaveTokenToFile(authFilePath string) error {
|
||||||
misc.LogSavingCredentials(authFilePath)
|
misc.LogSavingCredentials(authFilePath)
|
||||||
ts.Type = "gemini"
|
ts.Type = "gemini" // Ensure type is set before merging/saving
|
||||||
if err := os.MkdirAll(filepath.Dir(authFilePath), 0700); err != nil {
|
|
||||||
return fmt.Errorf("failed to create directory: %v", err)
|
// 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)
|
f, err := os.Create(authFilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to create token file: %w", err)
|
return fmt.Errorf("failed to create file: %w", err)
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
if errClose := f.Close(); errClose != nil {
|
_ = f.Close()
|
||||||
log.Errorf("failed to close file: %v", errClose)
|
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Convert struct to map for merging
|
// Write to file
|
||||||
data := make(map[string]any)
|
enc := json.NewEncoder(f)
|
||||||
temp, errJson := json.Marshal(ts)
|
enc.SetIndent("", " ")
|
||||||
if errJson != nil {
|
if err := enc.Encode(data); err != nil {
|
||||||
return fmt.Errorf("failed to marshal struct: %w", errJson)
|
return fmt.Errorf("failed to encode token to file: %w", err)
|
||||||
}
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = json.NewEncoder(f).Encode(data); err != nil {
|
|
||||||
return fmt.Errorf("failed to write token to file: %w", err)
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,21 +46,10 @@ func (ts *IFlowTokenStorage) SaveTokenToFile(authFilePath string) error {
|
|||||||
}
|
}
|
||||||
defer func() { _ = f.Close() }()
|
defer func() { _ = f.Close() }()
|
||||||
|
|
||||||
// Convert struct to map for merging
|
// Merge metadata using helper
|
||||||
data := make(map[string]any)
|
data, errMerge := misc.MergeMetadata(ts, ts.Metadata)
|
||||||
temp, errJson := json.Marshal(ts)
|
if errMerge != nil {
|
||||||
if errJson != nil {
|
return fmt.Errorf("failed to merge metadata: %w", errMerge)
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = json.NewEncoder(f).Encode(data); err != nil {
|
if err = json.NewEncoder(f).Encode(data); err != nil {
|
||||||
|
|||||||
@@ -95,21 +95,10 @@ func (ts *KimiTokenStorage) SaveTokenToFile(authFilePath string) error {
|
|||||||
_ = f.Close()
|
_ = f.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Convert struct to map for merging
|
// Merge metadata using helper
|
||||||
data := make(map[string]any)
|
data, errMerge := misc.MergeMetadata(ts, ts.Metadata)
|
||||||
temp, errJson := json.Marshal(ts)
|
if errMerge != nil {
|
||||||
if errJson != nil {
|
return fmt.Errorf("failed to merge metadata: %w", errMerge)
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
encoder := json.NewEncoder(f)
|
encoder := json.NewEncoder(f)
|
||||||
|
|||||||
@@ -66,21 +66,10 @@ func (ts *QwenTokenStorage) SaveTokenToFile(authFilePath string) error {
|
|||||||
_ = f.Close()
|
_ = f.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Convert struct to map for merging
|
// Merge metadata using helper
|
||||||
data := make(map[string]any)
|
data, errMerge := misc.MergeMetadata(ts, ts.Metadata)
|
||||||
temp, errJson := json.Marshal(ts)
|
if errMerge != nil {
|
||||||
if errJson != nil {
|
return fmt.Errorf("failed to merge metadata: %w", errMerge)
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = json.NewEncoder(f).Encode(data); err != nil {
|
if err = json.NewEncoder(f).Encode(data); err != nil {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package misc
|
package misc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -24,3 +25,37 @@ func LogSavingCredentials(path string) {
|
|||||||
func LogCredentialSeparator() {
|
func LogCredentialSeparator() {
|
||||||
log.Debug(credentialSeparator)
|
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