mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* Azure middleware in HttpClientProxy * Azure authentication under feature flag * Minor fixes * Add prefixes to not clash with JsonData * Return error if JsonData cannot be parsed * Return original string if URL invalid * Tests for datasource_cache
84 lines
2.1 KiB
Go
84 lines
2.1 KiB
Go
package azcredentials
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
func FromDatasourceData(data map[string]interface{}, secureData map[string]string) (AzureCredentials, error) {
|
|
if credentialsObj, err := getMapOptional(data, "azureCredentials"); err != nil {
|
|
return nil, err
|
|
} else if credentialsObj == nil {
|
|
return nil, nil
|
|
} else {
|
|
return getFromCredentialsObject(credentialsObj, secureData)
|
|
}
|
|
}
|
|
|
|
func getFromCredentialsObject(credentialsObj map[string]interface{}, secureData map[string]string) (AzureCredentials, error) {
|
|
authType, err := getStringValue(credentialsObj, "authType")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
switch authType {
|
|
case AzureAuthManagedIdentity:
|
|
credentials := &AzureManagedIdentityCredentials{}
|
|
return credentials, nil
|
|
|
|
case AzureAuthClientSecret:
|
|
cloud, err := getStringValue(credentialsObj, "azureCloud")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
tenantId, err := getStringValue(credentialsObj, "tenantId")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
clientId, err := getStringValue(credentialsObj, "clientId")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
clientSecret := secureData["azureClientSecret"]
|
|
|
|
credentials := &AzureClientSecretCredentials{
|
|
AzureCloud: cloud,
|
|
TenantId: tenantId,
|
|
ClientId: clientId,
|
|
ClientSecret: clientSecret,
|
|
}
|
|
return credentials, nil
|
|
|
|
default:
|
|
err := fmt.Errorf("the authentication type '%s' not supported", authType)
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
func getMapOptional(obj map[string]interface{}, key string) (map[string]interface{}, error) {
|
|
if untypedValue, ok := obj[key]; ok {
|
|
if value, ok := untypedValue.(map[string]interface{}); ok {
|
|
return value, nil
|
|
} else {
|
|
err := fmt.Errorf("the field '%s' should be an object", key)
|
|
return nil, err
|
|
}
|
|
} else {
|
|
// Value optional, not error
|
|
return nil, nil
|
|
}
|
|
}
|
|
|
|
func getStringValue(obj map[string]interface{}, key string) (string, error) {
|
|
if untypedValue, ok := obj[key]; ok {
|
|
if value, ok := untypedValue.(string); ok {
|
|
return value, nil
|
|
} else {
|
|
err := fmt.Errorf("the field '%s' should be a string", key)
|
|
return "", err
|
|
}
|
|
} else {
|
|
err := fmt.Errorf("the field '%s' should be set", key)
|
|
return "", err
|
|
}
|
|
}
|