diff --git a/plugin/auth/oauth.go b/plugin/auth/oauth.go index ca9c1ce73..35e327b06 100644 --- a/plugin/auth/oauth.go +++ b/plugin/auth/oauth.go @@ -61,14 +61,10 @@ var ( ) func getInstance(subject string) *OAuth { - oauthMu.Lock() - defer oauthMu.Unlock() return identities[subject] } func addInstance(subject string, identity *OAuth) { - oauthMu.Lock() - defer oauthMu.Unlock() identities[subject] = identity } @@ -99,6 +95,9 @@ func NewOauth(ctx context.Context, name string, oc *oauth2.Config, opts ...oauth return nil, errors.New("instance name must not be empty") } + oauthMu.Lock() + defer oauthMu.Unlock() + // hash oauth2 config h := sha256.Sum256(fmt.Append(nil, oc)) hash := hex.EncodeToString(h[:])[:8] @@ -185,6 +184,8 @@ func (o *OAuth) RefreshToken(token *oauth2.Token) (*oauth2.Token, error) { err = o.updateToken(token) + o.onlineC <- token.Valid() + return token, err } @@ -197,13 +198,7 @@ func (o *OAuth) updateToken(token *oauth2.Token) error { store = o.tokenStorer(token) } - if err := settings.SetJson(o.subject, store); err != nil { - return err - } - - o.onlineC <- token.Valid() - - return nil + return settings.SetJson(o.subject, store) } // updateTokenSource must only be called when lock is held @@ -214,6 +209,8 @@ func (o *OAuth) updateTokenSource(token *oauth2.Token) { } o.TokenSource = oauth.RefreshTokenSource(token, o) + + o.onlineC <- token.Valid() } // HandleCallback implements api.AuthProvider. @@ -285,9 +282,10 @@ func (o *OAuth) Logout() error { o.mu.Lock() defer o.mu.Unlock() - o.onlineC <- false o.TokenSource = oauth.RefreshTokenSource(nil, o) + o.onlineC <- false + return nil } @@ -298,6 +296,9 @@ func (o *OAuth) DisplayName() string { // Authenticated implements api.AuthProvider. func (o *OAuth) Authenticated() bool { + o.mu.Lock() + defer o.mu.Unlock() + token, err := o.Token() return err == nil && token.Valid() } diff --git a/server/providerauth/handler.go b/server/providerauth/handler.go index fe2cf3107..01adcadff 100644 --- a/server/providerauth/handler.go +++ b/server/providerauth/handler.go @@ -28,7 +28,7 @@ type Handler struct { // TODO get status from update channel func (a *Handler) run(paramC chan<- util.Param) { - for range <-a.updateC { + for range a.updateC { a.mu.Lock() res := make(map[string]*AuthProvider) diff --git a/vehicle/bmw/cardata/api.go b/vehicle/bmw/cardata/api.go index dd8af5ee4..be180c241 100644 --- a/vehicle/bmw/cardata/api.go +++ b/vehicle/bmw/cardata/api.go @@ -18,6 +18,7 @@ var Config = oauth2.Config{ Endpoint: oauth2.Endpoint{ DeviceAuthURL: "https://customer.bmwgroup.com/gcdm/oauth/device/code", TokenURL: "https://customer.bmwgroup.com/gcdm/oauth/token", + AuthStyle: oauth2.AuthStyleInParams, }, } diff --git a/vehicle/bmw/cardata/provider.go b/vehicle/bmw/cardata/provider.go index 1a97d1189..32108d93d 100644 --- a/vehicle/bmw/cardata/provider.go +++ b/vehicle/bmw/cardata/provider.go @@ -124,7 +124,7 @@ func (v *Provider) any(key string) (any, error) { defer v.mu.Unlock() if a, ok := v.streaming[key]; ok { - return a, nil + return a.Value, nil } if v.initial == nil { diff --git a/vehicle/cardata.go b/vehicle/cardata.go index 3071b9052..10c736bcb 100644 --- a/vehicle/cardata.go +++ b/vehicle/cardata.go @@ -52,7 +52,7 @@ func NewCardataFromConfig(ctx context.Context, other map[string]interface{}) (ap log := util.NewLogger("cardata").Redact(cc.ClientID) - ts, err := auth.NewOauth(context.Background(), "BMW/Mini CarData", &oc, + ts, err := auth.NewOauth(context.Background(), "BMW/Mini", &oc, auth.WithOauthDeviceFlowOption(), auth.WithTokenRetrieverOption(func(data string, res *oauth2.Token) error { var token cardata.Token