From db111a8da4c4ce567c1525bebcdc4071ff8f0dc8 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 14 May 2020 14:48:11 +0800 Subject: [PATCH] fix: avoid using background context --- pkg/cloudcommon/db/tenantcache.go | 18 +++++++++--------- pkg/compute/models/cloudaccounts.go | 2 +- pkg/keystone/tokens/verify.go | 4 +++- pkg/mcclient/auth/auth.go | 12 ++++++------ pkg/mcclient/auth/authhook.go | 12 ++++++++---- pkg/mcclient/auth/middleware.go | 2 +- pkg/notify/cache/usercache.go | 2 +- pkg/util/gin/middleware/keystone_auth.go | 2 +- 8 files changed, 30 insertions(+), 24 deletions(-) diff --git a/pkg/cloudcommon/db/tenantcache.go b/pkg/cloudcommon/db/tenantcache.go index 9e21987e60..569eaddf5c 100644 --- a/pkg/cloudcommon/db/tenantcache.go +++ b/pkg/cloudcommon/db/tenantcache.go @@ -84,8 +84,8 @@ func RegistUserCredCacheUpdater() { auth.RegisterAuthHook(onAuthCompleteUpdateCache) } -func onAuthCompleteUpdateCache(userCred mcclient.TokenCredential) { - TenantCacheManager.updateTenantCache(userCred) +func onAuthCompleteUpdateCache(ctx context.Context, userCred mcclient.TokenCredential) { + TenantCacheManager.updateTenantCache(ctx, userCred) UserCacheManager.updateUserCache(userCred) } @@ -109,8 +109,8 @@ func (manager *STenantCacheManager) InitializeData() error { return nil } -func (manager *STenantCacheManager) updateTenantCache(userCred mcclient.TokenCredential) { - manager.Save(context.Background(), userCred.GetProjectId(), userCred.GetProjectName(), +func (manager *STenantCacheManager) updateTenantCache(ctx context.Context, userCred mcclient.TokenCredential) { + manager.Save(ctx, userCred.GetProjectId(), userCred.GetProjectName(), userCred.GetProjectDomainId(), userCred.GetProjectDomain()) } @@ -381,14 +381,14 @@ func (manager *STenantCacheManager) findFirstProjectOfDomain(domainId string) (* return &tenant, nil } -func (manager *STenantCacheManager) fetchDomainTenantsFromKeystone(domainId string) error { +func (manager *STenantCacheManager) fetchDomainTenantsFromKeystone(ctx context.Context, domainId string) error { if len(domainId) == 0 { log.Debugf("fetch empty domain!!!!") debug.PrintStack() return fmt.Errorf("Empty domainId") } - s := auth.GetAdminSession(context.Background(), consts.GetRegion(), "v1") + s := auth.GetAdminSession(ctx, consts.GetRegion(), "v1") params := jsonutils.Marshal(map[string]string{"domain_id": domainId}) tenants, err := modules.Projects.List(s, params) if err != nil { @@ -399,7 +399,7 @@ func (manager *STenantCacheManager) fetchDomainTenantsFromKeystone(domainId stri tenantName, _ := tenant.GetString("name") domainId, _ := tenant.GetString("domain_id") domainName, _ := tenant.GetString("project_domain") - _, err = manager.Save(context.Background(), tenantId, tenantName, domainId, domainName) + _, err = manager.Save(ctx, tenantId, tenantName, domainId, domainName) if err != nil { return err } @@ -407,11 +407,11 @@ func (manager *STenantCacheManager) fetchDomainTenantsFromKeystone(domainId stri return nil } -func (manager *STenantCacheManager) FindFirstProjectOfDomain(domainId string) (*STenant, error) { +func (manager *STenantCacheManager) FindFirstProjectOfDomain(ctx context.Context, domainId string) (*STenant, error) { tenant, err := manager.findFirstProjectOfDomain(domainId) if err != nil { if err == sql.ErrNoRows { - err = manager.fetchDomainTenantsFromKeystone(domainId) + err = manager.fetchDomainTenantsFromKeystone(ctx, domainId) if err != nil { return nil, errors.Wrap(err, "fetchDomainTenantsFromKeystone") } diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 55381fa802..59269133ad 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -879,7 +879,7 @@ func (self *SCloudaccount) importSubAccount(ctx context.Context, userCred mcclie ownerId = userCred } else { // find default project of domain - t, err := db.TenantCacheManager.FindFirstProjectOfDomain(ownerId.GetProjectDomainId()) + t, err := db.TenantCacheManager.FindFirstProjectOfDomain(ctx, ownerId.GetProjectDomainId()) if err != nil { log.Errorf("cannot find a valid porject for domain %s", ownerId.GetProjectDomainId()) return nil, err diff --git a/pkg/keystone/tokens/verify.go b/pkg/keystone/tokens/verify.go index b91a450b68..37a56a2518 100644 --- a/pkg/keystone/tokens/verify.go +++ b/pkg/keystone/tokens/verify.go @@ -15,13 +15,15 @@ package tokens import ( + "context" + "yunion.io/x/log" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" ) -func FernetTokenVerifier(tokenStr string) (mcclient.TokenCredential, error) { +func FernetTokenVerifier(ctx context.Context, tokenStr string) (mcclient.TokenCredential, error) { token := SAuthToken{} err := token.ParseFernetToken(tokenStr) if err != nil { diff --git a/pkg/mcclient/auth/auth.go b/pkg/mcclient/auth/auth.go index e3b5291c5b..41862ef69e 100644 --- a/pkg/mcclient/auth/auth.go +++ b/pkg/mcclient/auth/auth.go @@ -112,7 +112,7 @@ func (c *TokenCacheVerify) DeleteToken(token string) bool { return c.Delete(token) } -func (c *TokenCacheVerify) Verify(cli *mcclient.Client, adminToken, token string) (mcclient.TokenCredential, error) { +func (c *TokenCacheVerify) Verify(ctx context.Context, cli *mcclient.Client, adminToken, token string) (mcclient.TokenCredential, error) { cred, found := c.GetToken(token) if found { if cred.IsValid() { @@ -132,7 +132,7 @@ func (c *TokenCacheVerify) Verify(cli *mcclient.Client, adminToken, token string if err != nil { return nil, fmt.Errorf("Add %s credential to cache: %#v", cred.GetTokenString(), err) } - callbackAuthhooks(cred) + callbackAuthhooks(ctx, cred) // log.Debugf("Add token: %s", cred) return cred, nil } @@ -165,11 +165,11 @@ func (a *authManager) verifyRequest(req http.Request, virtualHost bool) (mcclien return cred, nil } -func (a *authManager) verify(token string) (mcclient.TokenCredential, error) { +func (a *authManager) verify(ctx context.Context, token string) (mcclient.TokenCredential, error) { if a.adminCredential == nil { return nil, fmt.Errorf("No valid admin token credential") } - cred, err := a.tokenCacheVerify.Verify(a.client, a.adminCredential.GetTokenString(), token) + cred, err := a.tokenCacheVerify.Verify(ctx, a.client, a.adminCredential.GetTokenString(), token) if err != nil { return nil, err } @@ -258,8 +258,8 @@ func GetCatalogData(serviceTypes []string, region string) jsonutils.JSONObject { return manager.adminCredential.GetCatalogData(serviceTypes, region) } -func Verify(tokenId string) (mcclient.TokenCredential, error) { - return manager.verify(tokenId) +func Verify(ctx context.Context, tokenId string) (mcclient.TokenCredential, error) { + return manager.verify(ctx, tokenId) } func VerifyRequest(req http.Request, virtualHost bool) (mcclient.TokenCredential, error) { diff --git a/pkg/mcclient/auth/authhook.go b/pkg/mcclient/auth/authhook.go index c36e3e97e9..f7ecc93dfd 100644 --- a/pkg/mcclient/auth/authhook.go +++ b/pkg/mcclient/auth/authhook.go @@ -14,9 +14,13 @@ package auth -import "yunion.io/x/onecloud/pkg/mcclient" +import ( + "context" -type TAuthHook func(userCred mcclient.TokenCredential) + "yunion.io/x/onecloud/pkg/mcclient" +) + +type TAuthHook func(ctx context.Context, userCred mcclient.TokenCredential) var ( authHooks = make([]TAuthHook, 0) @@ -26,8 +30,8 @@ func RegisterAuthHook(hook TAuthHook) { authHooks = append(authHooks, hook) } -func callbackAuthhooks(userCred mcclient.TokenCredential) { +func callbackAuthhooks(ctx context.Context, userCred mcclient.TokenCredential) { for i := range authHooks { - authHooks[i](userCred) + authHooks[i](ctx, userCred) } } diff --git a/pkg/mcclient/auth/middleware.go b/pkg/mcclient/auth/middleware.go index cd598b7111..04a028b0aa 100644 --- a/pkg/mcclient/auth/middleware.go +++ b/pkg/mcclient/auth/middleware.go @@ -58,7 +58,7 @@ func AuthenticateWithDelayDecision(f appsrv.FilterHandler, delayDecision bool) a token = &GuestToken } else { var err error - token, err = DefaultTokenVerifier(tokenStr) + token, err = DefaultTokenVerifier(ctx, tokenStr) if err != nil { log.Errorf("Verify token failed: %s", err) if !delayDecision { diff --git a/pkg/notify/cache/usercache.go b/pkg/notify/cache/usercache.go index af9621cb56..774c1fd4e9 100644 --- a/pkg/notify/cache/usercache.go +++ b/pkg/notify/cache/usercache.go @@ -52,7 +52,7 @@ func RegistUserCredCacheUpdater() { auth.RegisterAuthHook(onAuthCompleteUpdateCache) } -func onAuthCompleteUpdateCache(userCred mcclient.TokenCredential) { +func onAuthCompleteUpdateCache(ctx context.Context, userCred mcclient.TokenCredential) { UserCacheManager.updateUserCache(userCred) } diff --git a/pkg/util/gin/middleware/keystone_auth.go b/pkg/util/gin/middleware/keystone_auth.go index 9479493339..fa9b5f1995 100644 --- a/pkg/util/gin/middleware/keystone_auth.go +++ b/pkg/util/gin/middleware/keystone_auth.go @@ -45,7 +45,7 @@ func KeystoneTokenVerifyMiddleware() gin.HandlerFunc { return } - _, err := auth.Verify(token) + _, err := auth.Verify(c, token) if err != nil { c.AbortWithError(http.StatusUnauthorized, err) return