@ -2,8 +2,10 @@ package registry
import (
"context"
"sync"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/infra/slugify"
"github.com/grafana/grafana/pkg/services/extsvcauth"
"github.com/grafana/grafana/pkg/services/extsvcauth/oauthserver"
"github.com/grafana/grafana/pkg/services/featuremgmt"
@ -17,14 +19,53 @@ type Registry struct {
logger log . Logger
oauthServer oauthserver . OAuth2Server
saSvc * extsvcaccounts . ExtSvcAccountsService
extSvcProviders map [ string ] extsvcauth . AuthProvider
lock sync . Mutex
}
func ProvideExtSvcRegistry ( oauthServer oauthserver . OAuth2Server , saSvc * extsvcaccounts . ExtSvcAccountsService , features featuremgmt . FeatureToggles ) * Registry {
return & Registry {
features : features ,
logger : log . New ( "extsvcauth.registry" ) ,
oauthServer : oauthServer ,
saSvc : saSvc ,
extSvcProviders : map [ string ] extsvcauth . AuthProvider { } ,
features : features ,
lock : sync . Mutex { } ,
logger : log . New ( "extsvcauth.registry" ) ,
oauthServer : oauthServer ,
saSvc : saSvc ,
}
}
// HasExternalService returns whether an external service has been saved with that name.
func ( r * Registry ) HasExternalService ( ctx context . Context , name string ) bool {
_ , ok := r . extSvcProviders [ slugify . Slugify ( name ) ]
return ok
}
// RemoveExternalService removes an external service and its associated resources from the database (ex: service account, token).
func ( r * Registry ) RemoveExternalService ( ctx context . Context , name string ) error {
provider , ok := r . extSvcProviders [ slugify . Slugify ( name ) ]
if ! ok {
r . logger . Debug ( "external service not found" , "service" , name )
return nil
}
switch provider {
case extsvcauth . ServiceAccounts :
if ! r . features . IsEnabled ( featuremgmt . FlagExternalServiceAccounts ) {
r . logger . Debug ( "Skipping External Service removal, flag disabled" , "service" , name , "flag" , featuremgmt . FlagExternalServiceAccounts )
return nil
}
r . logger . Debug ( "Routing External Service removal to the External Service Account service" , "service" , name )
return r . saSvc . RemoveExternalService ( ctx , name )
case extsvcauth . OAuth2Server :
if ! r . features . IsEnabled ( featuremgmt . FlagExternalServiceAuth ) {
r . logger . Debug ( "Skipping External Service removal, flag disabled" , "service" , name , "flag" , featuremgmt . FlagExternalServiceAccounts )
return nil
}
r . logger . Debug ( "Routing External Service removal to the OAuth2Server" , "service" , name )
return r . oauthServer . RemoveExternalService ( ctx , name )
default :
return extsvcauth . ErrUnknownProvider . Errorf ( "unknow provider '%v'" , provider )
}
}
@ -32,17 +73,22 @@ func ProvideExtSvcRegistry(oauthServer oauthserver.OAuth2Server, saSvc *extsvcac
// it generates client_id, secrets and any additional provider specificities (ex: rsa keys). It also ensures that the
// associated service account has the correct permissions.
func ( r * Registry ) SaveExternalService ( ctx context . Context , cmd * extsvcauth . ExternalServiceRegistration ) ( * extsvcauth . ExternalService , error ) {
// Record provider in case of removal
r . lock . Lock ( )
r . extSvcProviders [ slugify . Slugify ( cmd . Name ) ] = cmd . AuthProvider
r . lock . Unlock ( )
switch cmd . AuthProvider {
case extsvcauth . ServiceAccounts :
if ! r . features . IsEnabled ( featuremgmt . FlagExternalServiceAccounts ) {
r . logger . Warn ( "Skipping external service authentication, flag disabled" , "service" , cmd . Name , "flag" , featuremgmt . FlagExternalServiceAccounts )
r . logger . Warn ( "Skipping External S ervice authentication, flag disabled" , "service" , cmd . Name , "flag" , featuremgmt . FlagExternalServiceAccounts )
return nil , nil
}
r . logger . Debug ( "Routing the External Service registration to the External Service Account service" , "service" , cmd . Name )
return r . saSvc . SaveExternalService ( ctx , cmd )
case extsvcauth . OAuth2Server :
if ! r . features . IsEnabled ( featuremgmt . FlagExternalServiceAuth ) {
r . logger . Warn ( "Skipping external s ervice authentication, flag disabled" , "service" , cmd . Name , "flag" , featuremgmt . FlagExternalServiceAuth )
r . logger . Warn ( "Skipping External S ervice authentication, flag disabled" , "service" , cmd . Name , "flag" , featuremgmt . FlagExternalServiceAuth )
return nil , nil
}
r . logger . Debug ( "Routing the External Service registration to the OAuth2Server" , "service" , cmd . Name )