fix(auth): mark Google group denials business-limited
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
parent
bd1e98ec29
commit
00eb3abbe1
@ -55,6 +55,7 @@ func APIKeyAuthWithSubscriptionGoogle(apiKeyService *service.APIKeyService, subs
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if _, message, ok := validateAPIKeyGroupAvailable(apiKey); !ok {
|
if _, message, ok := validateAPIKeyGroupAvailable(apiKey); !ok {
|
||||||
|
service.MarkOpsClientBusinessLimited(c, service.OpsClientBusinessLimitedReasonAPIKeyGroupUnavailable)
|
||||||
abortWithGoogleError(c, 403, message)
|
abortWithGoogleError(c, 403, message)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@ -373,6 +373,68 @@ func TestApiKeyAuthWithSubscriptionGoogle_InvalidKey(t *testing.T) {
|
|||||||
require.Equal(t, "UNAUTHENTICATED", resp.Error.Status)
|
require.Equal(t, "UNAUTHENTICATED", resp.Error.Status)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestApiKeyAuthWithSubscriptionGoogle_MarksUnavailableGroupBusinessLimited(t *testing.T) {
|
||||||
|
gin.SetMode(gin.TestMode)
|
||||||
|
|
||||||
|
groupID := int64(101)
|
||||||
|
user := &service.User{
|
||||||
|
ID: 7,
|
||||||
|
Role: service.RoleUser,
|
||||||
|
Status: service.StatusActive,
|
||||||
|
Balance: 10,
|
||||||
|
Concurrency: 3,
|
||||||
|
}
|
||||||
|
apiKey := &service.APIKey{
|
||||||
|
ID: 100,
|
||||||
|
UserID: user.ID,
|
||||||
|
GroupID: &groupID,
|
||||||
|
Key: "google-group-deleted",
|
||||||
|
Status: service.StatusActive,
|
||||||
|
User: user,
|
||||||
|
Group: &service.Group{
|
||||||
|
ID: groupID,
|
||||||
|
Name: "deleted",
|
||||||
|
Status: "deleted",
|
||||||
|
Platform: service.PlatformGemini,
|
||||||
|
Hydrated: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
r := gin.New()
|
||||||
|
var markedBusinessLimited bool
|
||||||
|
var businessLimitedReason string
|
||||||
|
r.Use(func(c *gin.Context) {
|
||||||
|
c.Next()
|
||||||
|
markedBusinessLimited = service.HasOpsClientBusinessLimited(c)
|
||||||
|
if v, ok := c.Get(service.OpsClientBusinessLimitedReasonKey); ok {
|
||||||
|
businessLimitedReason, _ = v.(string)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
apiKeyService := newTestAPIKeyService(fakeAPIKeyRepo{
|
||||||
|
getByKey: func(ctx context.Context, key string) (*service.APIKey, error) {
|
||||||
|
if key != apiKey.Key {
|
||||||
|
return nil, service.ErrAPIKeyNotFound
|
||||||
|
}
|
||||||
|
clone := *apiKey
|
||||||
|
return &clone, nil
|
||||||
|
},
|
||||||
|
})
|
||||||
|
r.Use(APIKeyAuthWithSubscriptionGoogle(apiKeyService, nil, &config.Config{RunMode: config.RunModeSimple}))
|
||||||
|
r.GET("/v1beta/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) })
|
||||||
|
|
||||||
|
req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil)
|
||||||
|
req.Header.Set("x-goog-api-key", apiKey.Key)
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
r.ServeHTTP(rec, req)
|
||||||
|
|
||||||
|
require.Equal(t, http.StatusForbidden, rec.Code)
|
||||||
|
var resp googleErrorResponse
|
||||||
|
require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &resp))
|
||||||
|
require.Equal(t, "API Key 所属分组已删除", resp.Error.Message)
|
||||||
|
require.True(t, markedBusinessLimited)
|
||||||
|
require.Equal(t, service.OpsClientBusinessLimitedReasonAPIKeyGroupUnavailable, businessLimitedReason)
|
||||||
|
}
|
||||||
|
|
||||||
func TestApiKeyAuthWithSubscriptionGoogle_RepoError(t *testing.T) {
|
func TestApiKeyAuthWithSubscriptionGoogle_RepoError(t *testing.T) {
|
||||||
gin.SetMode(gin.TestMode)
|
gin.SetMode(gin.TestMode)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user