alexkappa/terraform-provider-auth0

View on GitHub
auth0/structure_auth0_connection.go

Summary

Maintainability
C
1 day
Test Coverage
A
95%
package auth0

import (
    "log"

    "gopkg.in/auth0.v5"
    "gopkg.in/auth0.v5/management"
)

func flattenConnectionOptions(d ResourceData, options interface{}) []interface{} {

    var m interface{}

    switch o := options.(type) {
    case *management.ConnectionOptions:
        m = flattenConnectionOptionsAuth0(d, o)
    case *management.ConnectionOptionsGoogleOAuth2:
        m = flattenConnectionOptionsGoogleOAuth2(o)
    case *management.ConnectionOptionsGoogleApps:
        m = flattenConnectionOptionsGoogleApps(o)
    case *management.ConnectionOptionsOAuth2:
        m = flattenConnectionOptionsOAuth2(o)
    case *management.ConnectionOptionsFacebook:
        m = flattenConnectionOptionsFacebook(o)
    case *management.ConnectionOptionsApple:
        m = flattenConnectionOptionsApple(o)
    case *management.ConnectionOptionsLinkedin:
        m = flattenConnectionOptionsLinkedin(o)
    case *management.ConnectionOptionsGitHub:
        m = flattenConnectionOptionsGitHub(o)
    case *management.ConnectionOptionsWindowsLive:
        m = flattenConnectionOptionsWindowsLive(o)
    case *management.ConnectionOptionsSalesforce:
        m = flattenConnectionOptionsSalesforce(o)
    case *management.ConnectionOptionsEmail:
        m = flattenConnectionOptionsEmail(o)
    case *management.ConnectionOptionsSMS:
        m = flattenConnectionOptionsSMS(o)
    case *management.ConnectionOptionsOIDC:
        m = flattenConnectionOptionsOIDC(o)
    case *management.ConnectionOptionsAD:
        m = flattenConnectionOptionsAD(o)
    case *management.ConnectionOptionsAzureAD:
        m = flattenConnectionOptionsAzureAD(o)
    case *management.ConnectionOptionsADFS:
        m = flattenConnectionOptionsADFS(o)
    case *management.ConnectionOptionsSAML:
        m = flattenConnectionOptionsSAML(o)
    }

    return []interface{}{m}
}

func flattenConnectionOptionsGitHub(o *management.ConnectionOptionsGitHub) interface{} {
    return map[string]interface{}{
        "client_id":                o.GetClientID(),
        "client_secret":            o.GetClientSecret(),
        "set_user_root_attributes": o.GetSetUserAttributes(),
        "non_persistent_attrs":     o.GetNonPersistentAttrs(),
        "scopes":                   o.Scopes(),
    }
}

func flattenConnectionOptionsWindowsLive(o *management.ConnectionOptionsWindowsLive) interface{} {
    return map[string]interface{}{
        "client_id":                o.GetClientID(),
        "client_secret":            o.GetClientSecret(),
        "scopes":                   o.Scopes(),
        "set_user_root_attributes": o.GetSetUserAttributes(),
        "non_persistent_attrs":     o.GetNonPersistentAttrs(),
        "strategy_version":         o.GetStrategyVersion(),
    }
}

func flattenConnectionOptionsAuth0(d ResourceData, o *management.ConnectionOptions) interface{} {
    return map[string]interface{}{
        "validation":                     o.Validation,
        "password_policy":                o.GetPasswordPolicy(),
        "password_history":               o.PasswordHistory,
        "password_no_personal_info":      o.PasswordNoPersonalInfo,
        "password_dictionary":            o.PasswordDictionary,
        "password_complexity_options":    o.PasswordComplexityOptions,
        "enabled_database_customization": o.GetEnabledDatabaseCustomization(),
        "brute_force_protection":         o.GetBruteForceProtection(),
        "import_mode":                    o.GetImportMode(),
        "disable_signup":                 o.GetDisableSignup(),
        "requires_username":              o.GetRequiresUsername(),
        "custom_scripts":                 o.CustomScripts,
        "mfa":                            o.MFA,
        "configuration":                  Map(d, "configuration"), // does not get read back
        "non_persistent_attrs":           o.GetNonPersistentAttrs(),
    }
}

func flattenConnectionOptionsGoogleOAuth2(o *management.ConnectionOptionsGoogleOAuth2) interface{} {
    return map[string]interface{}{
        "client_id":                o.GetClientID(),
        "client_secret":            o.GetClientSecret(),
        "allowed_audiences":        o.AllowedAudiences,
        "scopes":                   o.Scopes(),
        "set_user_root_attributes": o.GetSetUserAttributes(),
        "non_persistent_attrs":     o.GetNonPersistentAttrs(),
    }
}

func flattenConnectionOptionsGoogleApps(o *management.ConnectionOptionsGoogleApps) interface{} {
    return map[string]interface{}{
        "client_id":                o.GetClientID(),
        "client_secret":            o.GetClientSecret(),
        "domain":                   o.GetDomain(),
        "tenant_domain":            o.GetTenantDomain(),
        "api_enable_users":         o.GetEnableUsersAPI(),
        "scopes":                   o.Scopes(),
        "set_user_root_attributes": o.GetSetUserAttributes(),
        "non_persistent_attrs":     o.GetNonPersistentAttrs(),
        "domain_aliases":           o.DomainAliases,
        "icon_url":                 o.GetLogoURL(),
    }
}

func flattenConnectionOptionsOAuth2(o *management.ConnectionOptionsOAuth2) interface{} {
    return map[string]interface{}{
        "client_id":                o.GetClientID(),
        "client_secret":            o.GetClientSecret(),
        "scopes":                   o.Scopes(),
        "token_endpoint":           o.GetTokenURL(),
        "authorization_endpoint":   o.GetAuthorizationURL(),
        "scripts":                  o.Scripts,
        "set_user_root_attributes": o.GetSetUserAttributes(),
        "non_persistent_attrs":     o.GetNonPersistentAttrs(),
    }
}

func flattenConnectionOptionsFacebook(o *management.ConnectionOptionsFacebook) interface{} {
    return map[string]interface{}{
        "client_id":                o.GetClientID(),
        "client_secret":            o.GetClientSecret(),
        "scopes":                   o.Scopes(),
        "set_user_root_attributes": o.GetSetUserAttributes(),
        "non_persistent_attrs":     o.GetNonPersistentAttrs(),
    }
}

func flattenConnectionOptionsApple(o *management.ConnectionOptionsApple) interface{} {
    return map[string]interface{}{
        "client_id":                o.GetClientID(),
        "client_secret":            o.GetClientSecret(),
        "team_id":                  o.GetTeamID(),
        "key_id":                   o.GetKeyID(),
        "scopes":                   o.Scopes(),
        "set_user_root_attributes": o.GetSetUserAttributes(),
        "non_persistent_attrs":     o.GetNonPersistentAttrs(),
    }
}

func flattenConnectionOptionsLinkedin(o *management.ConnectionOptionsLinkedin) interface{} {
    return map[string]interface{}{
        "client_id":                o.GetClientID(),
        "client_secret":            o.GetClientSecret(),
        "strategy_version":         o.GetStrategyVersion(),
        "scopes":                   o.Scopes(),
        "set_user_root_attributes": o.GetSetUserAttributes(),
        "non_persistent_attrs":     o.GetNonPersistentAttrs(),
    }
}

func flattenConnectionOptionsSalesforce(o *management.ConnectionOptionsSalesforce) interface{} {
    return map[string]interface{}{
        "client_id":                o.GetClientID(),
        "client_secret":            o.GetClientSecret(),
        "community_base_url":       o.GetCommunityBaseURL(),
        "scopes":                   o.Scopes(),
        "set_user_root_attributes": o.GetSetUserAttributes(),
        "non_persistent_attrs":     o.GetNonPersistentAttrs(),
    }
}

func flattenConnectionOptionsSMS(o *management.ConnectionOptionsSMS) interface{} {
    return map[string]interface{}{
        "name":                   o.GetName(),
        "from":                   o.GetFrom(),
        "syntax":                 o.GetSyntax(),
        "template":               o.GetTemplate(),
        "twilio_sid":             o.GetTwilioSID(),
        "twilio_token":           o.GetTwilioToken(),
        "messaging_service_sid":  o.GetMessagingServiceSID(),
        "disable_signup":         o.GetDisableSignup(),
        "brute_force_protection": o.GetBruteForceProtection(),
        "totp": map[string]interface{}{
            "time_step": o.OTP.GetTimeStep(),
            "length":    o.OTP.GetLength(),
        },
        "provider":    o.GetProvider(),
        "gateway_url": o.GetGatewayUrl(),
        "gateway_authentication": map[string]interface{}{
            "method":                o.GatewayAuthentication.GetMethod(),
            "subject":               o.GatewayAuthentication.GetSubject(),
            "audience":              o.GatewayAuthentication.GetAudience(),
            "secret_base64_encoded": o.GatewayAuthentication.GetSecretBase64Encoded(),
        },
        "forward_request_info": o.GetForwardRequestInfo(),
    }
}

func flattenConnectionOptionsOIDC(o *management.ConnectionOptionsOIDC) interface{} {
    return map[string]interface{}{
        "client_id":      o.GetClientID(),
        "client_secret":  o.GetClientSecret(),
        "icon_url":       o.GetLogoURL(),
        "tenant_domain":  o.GetTenantDomain(),
        "domain_aliases": o.DomainAliases,

        "type":                     o.GetType(),
        "scopes":                   o.Scopes(),
        "issuer":                   o.GetIssuer(),
        "jwks_uri":                 o.GetJWKSURI(),
        "discovery_url":            o.GetDiscoveryURL(),
        "token_endpoint":           o.GetTokenEndpoint(),
        "userinfo_endpoint":        o.GetUserInfoEndpoint(),
        "authorization_endpoint":   o.GetAuthorizationEndpoint(),
        "set_user_root_attributes": o.GetSetUserAttributes(),
        "non_persistent_attrs":     o.GetNonPersistentAttrs(),
    }
}

func flattenConnectionOptionsEmail(o *management.ConnectionOptionsEmail) interface{} {
    return map[string]interface{}{
        "name":                   o.GetName(),
        "from":                   o.GetEmail().GetFrom(),
        "syntax":                 o.GetEmail().GetSyntax(),
        "subject":                o.GetEmail().GetSubject(),
        "template":               o.GetEmail().GetBody(),
        "disable_signup":         o.GetDisableSignup(),
        "brute_force_protection": o.GetBruteForceProtection(),
        "totp": map[string]interface{}{
            "time_step": o.OTP.GetTimeStep(),
            "length":    o.OTP.GetLength(),
        },
        "set_user_root_attributes": o.GetSetUserAttributes(),
        "non_persistent_attrs":     o.GetNonPersistentAttrs(),
    }
}

func flattenConnectionOptionsAD(o *management.ConnectionOptionsAD) interface{} {
    return map[string]interface{}{
        "tenant_domain":            o.GetTenantDomain(),
        "domain_aliases":           o.DomainAliases,
        "icon_url":                 o.GetLogoURL(),
        "ips":                      o.IPs,
        "use_cert_auth":            o.GetCertAuth(),
        "use_kerberos":             o.GetKerberos(),
        "disable_cache":            o.GetDisableCache(),
        "brute_force_protection":   o.GetBruteForceProtection(),
        "set_user_root_attributes": o.GetSetUserAttributes(),
        "non_persistent_attrs":     o.GetNonPersistentAttrs(),
    }
}

func flattenConnectionOptionsAzureAD(o *management.ConnectionOptionsAzureAD) interface{} {
    return map[string]interface{}{
        "client_id":                              o.GetClientID(),
        "client_secret":                          o.GetClientSecret(),
        "app_id":                                 o.GetAppID(),
        "tenant_domain":                          o.GetTenantDomain(),
        "domain":                                 o.GetDomain(),
        "domain_aliases":                         o.DomainAliases,
        "icon_url":                               o.GetLogoURL(),
        "identity_api":                           o.GetIdentityAPI(),
        "waad_protocol":                          o.GetWAADProtocol(),
        "waad_common_endpoint":                   o.GetUseCommonEndpoint(),
        "use_wsfed":                              o.GetUseWSFederation(),
        "api_enable_users":                       o.GetEnableUsersAPI(),
        "max_groups_to_retrieve":                 o.GetMaxGroupsToRetrieve(),
        "scopes":                                 o.Scopes(),
        "set_user_root_attributes":               o.GetSetUserAttributes(),
        "non_persistent_attrs":                   o.GetNonPersistentAttrs(),
        "should_trust_email_verified_connection": o.GetTrustEmailVerified(),
    }
}

func flattenConnectionOptionsADFS(o *management.ConnectionOptionsADFS) interface{} {
    return map[string]interface{}{
        "tenant_domain":            o.GetTenantDomain(),
        "domain_aliases":           o.DomainAliases,
        "icon_url":                 o.GetLogoURL(),
        "adfs_server":              o.GetADFSServer(),
        "api_enable_users":         o.GetEnableUsersAPI(),
        "set_user_root_attributes": o.GetSetUserAttributes(),
        "non_persistent_attrs":     o.GetNonPersistentAttrs(),
    }
}

func flattenConnectionOptionsSAML(o *management.ConnectionOptionsSAML) interface{} {
    return map[string]interface{}{
        "signing_cert":     o.GetSigningCert(),
        "protocol_binding": o.GetProtocolBinding(),
        "debug":            o.GetDebug(),
        "idp_initiated": map[string]interface{}{
            "client_id":              o.IdpInitiated.GetClientID(),
            "client_protocol":        o.IdpInitiated.GetClientProtocol(),
            "client_authorize_query": o.IdpInitiated.GetClientAuthorizeQuery(),
        },
        "tenant_domain":            o.GetTenantDomain(),
        "domain_aliases":           o.DomainAliases,
        "sign_in_endpoint":         o.GetSignInEndpoint(),
        "sign_out_endpoint":        o.GetSignOutEndpoint(),
        "signature_algorithm":      o.GetSignatureAlgorithm(),
        "digest_algorithm":         o.GetDigestAglorithm(),
        "fields_map":               o.FieldsMap,
        "sign_saml_request":        o.GetSignSAMLRequest(),
        "icon_url":                 o.GetLogoURL(),
        "request_template":         o.GetRequestTemplate(),
        "user_id_attribute":        o.GetUserIDAttribute(),
        "set_user_root_attributes": o.GetSetUserAttributes(),
        "non_persistent_attrs":     o.GetNonPersistentAttrs(),
        "entity_id":                o.GetEntityID(),
    }
}

func expandConnection(d ResourceData) *management.Connection {

    c := &management.Connection{
        Name:               String(d, "name", IsNewResource()),
        DisplayName:        String(d, "display_name"),
        Strategy:           String(d, "strategy", IsNewResource()),
        IsDomainConnection: Bool(d, "is_domain_connection"),
        EnabledClients:     Set(d, "enabled_clients").List(),
        Realms:             Slice(d, "realms", IsNewResource(), HasChange()),
    }

    s := d.Get("strategy").(string)

    List(d, "options").Elem(func(d ResourceData) {
        switch s {
        case management.ConnectionStrategyAuth0:
            c.Options = expandConnectionOptionsAuth0(d)
        case management.ConnectionStrategyGoogleOAuth2:
            c.Options = expandConnectionOptionsGoogleOAuth2(d)
        case management.ConnectionStrategyGoogleApps:
            c.Options = expandConnectionOptionsGoogleApps(d)
        case management.ConnectionStrategyOAuth2:
            c.Options = expandConnectionOptionsOAuth2(d)
        case management.ConnectionStrategyFacebook:
            c.Options = expandConnectionOptionsFacebook(d)
        case management.ConnectionStrategyApple:
            c.Options = expandConnectionOptionsApple(d)
        case management.ConnectionStrategyLinkedin:
            c.Options = expandConnectionOptionsLinkedin(d)
        case management.ConnectionStrategyGitHub:
            c.Options = expandConnectionOptionsGitHub(d)
        case management.ConnectionStrategyWindowsLive:
            c.Options = expandConnectionOptionsWindowsLive(d)
        case management.ConnectionStrategySalesforce,
            management.ConnectionStrategySalesforceCommunity,
            management.ConnectionStrategySalesforceSandbox:
            c.Options = expandConnectionOptionsSalesforce(d)
        case management.ConnectionStrategySMS:
            c.Options = expandConnectionOptionsSMS(d)
        case management.ConnectionStrategyOIDC:
            c.Options = expandConnectionOptionsOIDC(d)
        case management.ConnectionStrategyAD:
            c.Options = expandConnectionOptionsAD(d)
        case management.ConnectionStrategyAzureAD:
            c.Options = expandConnectionOptionsAzureAD(d)
        case management.ConnectionStrategyEmail:
            c.Options = expandConnectionOptionsEmail(d)
        case management.ConnectionStrategySAML:
            c.Options = expandConnectionOptionsSAML(d)
        case management.ConnectionStrategyADFS:
            c.Options = expandConnectionOptionsADFS(d)
        default:
            log.Printf("[WARN]: Unsupported connection strategy %s", s)
            log.Printf("[WARN]: Raise an issue with the auth0 provider in order to support it:")
            log.Printf("[WARN]:     https://github.com/alexkappa/terraform-provider-auth0/issues/new")
        }
    })

    return c
}

func expandConnectionOptionsGitHub(d ResourceData) *management.ConnectionOptionsGitHub {

    o := &management.ConnectionOptionsGitHub{
        ClientID:           String(d, "client_id"),
        ClientSecret:       String(d, "client_secret"),
        SetUserAttributes:  String(d, "set_user_root_attributes"),
        NonPersistentAttrs: castToListOfStrings(Set(d, "non_persistent_attrs").List()),
    }

    expandConnectionOptionsScopes(d, o)

    return o
}

func expandConnectionOptionsAuth0(d ResourceData) *management.ConnectionOptions {

    o := &management.ConnectionOptions{
        PasswordPolicy:     String(d, "password_policy"),
        NonPersistentAttrs: castToListOfStrings(Set(d, "non_persistent_attrs").List()),
    }

    List(d, "validation").Elem(func(d ResourceData) {
        o.Validation = make(map[string]interface{})
        List(d, "username").Elem(func(d ResourceData) {
            usernameValidation := make(map[string]*int)
            usernameValidation["min"] = Int(d, "min")
            usernameValidation["max"] = Int(d, "max")
            o.Validation["username"] = usernameValidation
        })
    })

    List(d, "password_history").Elem(func(d ResourceData) {
        o.PasswordHistory = make(map[string]interface{})
        o.PasswordHistory["enable"] = Bool(d, "enable")
        o.PasswordHistory["size"] = Int(d, "size")
    })

    List(d, "password_no_personal_info").Elem(func(d ResourceData) {
        o.PasswordNoPersonalInfo = make(map[string]interface{})
        o.PasswordNoPersonalInfo["enable"] = Bool(d, "enable")
    })

    List(d, "password_dictionary").Elem(func(d ResourceData) {
        o.PasswordDictionary = make(map[string]interface{})
        o.PasswordDictionary["enable"] = Bool(d, "enable")
        o.PasswordDictionary["dictionary"] = Set(d, "dictionary").List()
    })

    List(d, "password_complexity_options").Elem(func(d ResourceData) {
        o.PasswordComplexityOptions = make(map[string]interface{})
        o.PasswordComplexityOptions["min_length"] = Int(d, "min_length")
    })

    List(d, "mfa").Elem(func(d ResourceData) {
        o.MFA = make(map[string]interface{})
        o.MFA["active"] = Bool(d, "active")
        o.MFA["return_enroll_settings"] = Bool(d, "return_enroll_settings")
    })

    o.EnabledDatabaseCustomization = Bool(d, "enabled_database_customization")
    o.BruteForceProtection = Bool(d, "brute_force_protection")
    o.ImportMode = Bool(d, "import_mode")
    o.DisableSignup = Bool(d, "disable_signup")
    o.RequiresUsername = Bool(d, "requires_username")
    o.CustomScripts = Map(d, "custom_scripts")
    o.Configuration = Map(d, "configuration")

    return o
}

func expandConnectionOptionsGoogleOAuth2(d ResourceData) *management.ConnectionOptionsGoogleOAuth2 {

    o := &management.ConnectionOptionsGoogleOAuth2{
        ClientID:           String(d, "client_id"),
        ClientSecret:       String(d, "client_secret"),
        AllowedAudiences:   Set(d, "allowed_audiences").List(),
        SetUserAttributes:  String(d, "set_user_root_attributes"),
        NonPersistentAttrs: castToListOfStrings(Set(d, "non_persistent_attrs").List()),
    }

    expandConnectionOptionsScopes(d, o)

    return o
}

func expandConnectionOptionsGoogleApps(d ResourceData) *management.ConnectionOptionsGoogleApps {

    o := &management.ConnectionOptionsGoogleApps{
        ClientID:           String(d, "client_id"),
        ClientSecret:       String(d, "client_secret"),
        Domain:             String(d, "domain"),
        TenantDomain:       String(d, "tenant_domain"),
        EnableUsersAPI:     Bool(d, "api_enable_users"),
        SetUserAttributes:  String(d, "set_user_root_attributes"),
        NonPersistentAttrs: castToListOfStrings(Set(d, "non_persistent_attrs").List()),
        DomainAliases:      Set(d, "domain_aliases").List(),
        LogoURL:            String(d, "icon_url"),
    }

    expandConnectionOptionsScopes(d, o)

    return o
}

func expandConnectionOptionsOAuth2(d ResourceData) *management.ConnectionOptionsOAuth2 {

    o := &management.ConnectionOptionsOAuth2{
        ClientID:           String(d, "client_id"),
        ClientSecret:       String(d, "client_secret"),
        AuthorizationURL:   String(d, "authorization_endpoint"),
        TokenURL:           String(d, "token_endpoint"),
        SetUserAttributes:  String(d, "set_user_root_attributes"),
        NonPersistentAttrs: castToListOfStrings(Set(d, "non_persistent_attrs").List()),
    }
    o.Scripts = Map(d, "scripts")

    expandConnectionOptionsScopes(d, o)

    return o
}

func expandConnectionOptionsFacebook(d ResourceData) *management.ConnectionOptionsFacebook {

    o := &management.ConnectionOptionsFacebook{
        ClientID:           String(d, "client_id"),
        ClientSecret:       String(d, "client_secret"),
        SetUserAttributes:  String(d, "set_user_root_attributes"),
        NonPersistentAttrs: castToListOfStrings(Set(d, "non_persistent_attrs").List()),
    }

    expandConnectionOptionsScopes(d, o)

    return o
}

func expandConnectionOptionsApple(d ResourceData) *management.ConnectionOptionsApple {

    o := &management.ConnectionOptionsApple{
        ClientID:           String(d, "client_id"),
        ClientSecret:       String(d, "client_secret"),
        TeamID:             String(d, "team_id"),
        KeyID:              String(d, "key_id"),
        SetUserAttributes:  String(d, "set_user_root_attributes"),
        NonPersistentAttrs: castToListOfStrings(Set(d, "non_persistent_attrs").List()),
    }

    expandConnectionOptionsScopes(d, o)

    return o
}

func expandConnectionOptionsLinkedin(d ResourceData) *management.ConnectionOptionsLinkedin {

    o := &management.ConnectionOptionsLinkedin{
        ClientID:           String(d, "client_id"),
        ClientSecret:       String(d, "client_secret"),
        StrategyVersion:    Int(d, "strategy_version"),
        SetUserAttributes:  String(d, "set_user_root_attributes"),
        NonPersistentAttrs: castToListOfStrings(Set(d, "non_persistent_attrs").List()),
    }

    expandConnectionOptionsScopes(d, o)

    return o
}

func expandConnectionOptionsSalesforce(d ResourceData) *management.ConnectionOptionsSalesforce {

    o := &management.ConnectionOptionsSalesforce{
        ClientID:           String(d, "client_id"),
        ClientSecret:       String(d, "client_secret"),
        CommunityBaseURL:   String(d, "community_base_url"),
        SetUserAttributes:  String(d, "set_user_root_attributes"),
        NonPersistentAttrs: castToListOfStrings(Set(d, "non_persistent_attrs").List()),
    }

    expandConnectionOptionsScopes(d, o)

    return o
}

func expandConnectionOptionsWindowsLive(d ResourceData) *management.ConnectionOptionsWindowsLive {

    o := &management.ConnectionOptionsWindowsLive{
        ClientID:           String(d, "client_id"),
        ClientSecret:       String(d, "client_secret"),
        StrategyVersion:    Int(d, "strategy_version"),
        SetUserAttributes:  String(d, "set_user_root_attributes"),
        NonPersistentAttrs: castToListOfStrings(Set(d, "non_persistent_attrs").List()),
    }

    expandConnectionOptionsScopes(d, o)

    return o
}

func expandConnectionOptionsSMS(d ResourceData) *management.ConnectionOptionsSMS {

    o := &management.ConnectionOptionsSMS{
        Name:                 String(d, "name"),
        From:                 String(d, "from"),
        Syntax:               String(d, "syntax"),
        Template:             String(d, "template"),
        TwilioSID:            String(d, "twilio_sid"),
        TwilioToken:          String(d, "twilio_token"),
        MessagingServiceSID:  String(d, "messaging_service_sid"),
        Provider:             String(d, "provider"),
        GatewayUrl:           String(d, "gateway_url"),
        ForwardRequestInfo:   Bool(d, "forward_request_info"),
        DisableSignup:        Bool(d, "disable_signup"),
        BruteForceProtection: Bool(d, "brute_force_protection"),
    }

    List(d, "totp").Elem(func(d ResourceData) {
        o.OTP = &management.ConnectionOptionsOTP{
            TimeStep: Int(d, "time_step"),
            Length:   Int(d, "length"),
        }
    })

    List(d, "gateway_authentication").Elem(func(d ResourceData) {
        o.GatewayAuthentication = &management.ConnectionGatewayAuthentication{
            Method:              String(d, "method"),
            Subject:             String(d, "subject"),
            Audience:            String(d, "audience"),
            Secret:              String(d, "secret"),
            SecretBase64Encoded: Bool(d, "secret_base64_encoded"),
        }
    })

    return o
}

func expandConnectionOptionsEmail(d ResourceData) *management.ConnectionOptionsEmail {

    o := &management.ConnectionOptionsEmail{
        Name:          String(d, "name"),
        DisableSignup: Bool(d, "disable_signup"),
        Email: &management.ConnectionOptionsEmailSettings{
            Syntax:  String(d, "syntax"),
            From:    String(d, "from"),
            Subject: String(d, "subject"),
            Body:    String(d, "template"),
        },
        BruteForceProtection: Bool(d, "brute_force_protection"),
        SetUserAttributes:    String(d, "set_user_root_attributes"),
        NonPersistentAttrs:   castToListOfStrings(Set(d, "non_persistent_attrs").List()),
    }

    List(d, "totp").Elem(func(d ResourceData) {
        o.OTP = &management.ConnectionOptionsOTP{
            TimeStep: Int(d, "time_step"),
            Length:   Int(d, "length"),
        }
    })

    return o
}

func expandConnectionOptionsAD(d ResourceData) *management.ConnectionOptionsAD {

    o := &management.ConnectionOptionsAD{
        DomainAliases:      Set(d, "domain_aliases").List(),
        TenantDomain:       String(d, "tenant_domain"),
        LogoURL:            String(d, "icon_url"),
        IPs:                Set(d, "ips").List(),
        CertAuth:           Bool(d, "use_cert_auth"),
        Kerberos:           Bool(d, "use_kerberos"),
        DisableCache:       Bool(d, "disable_cache"),
        SetUserAttributes:  String(d, "set_user_root_attributes"),
        NonPersistentAttrs: castToListOfStrings(Set(d, "non_persistent_attrs").List()),
    }

    // `brute_force_protection` will default to true by the API if we don't
    // specify it. Therefore if it's not specified we'll set it to false
    // ourselves.
    v, ok := d.GetOk("brute_force_protection")
    if !ok {
        v = false
    }
    o.BruteForceProtection = auth0.Bool(v.(bool))

    return o
}

func expandConnectionOptionsAzureAD(d ResourceData) *management.ConnectionOptionsAzureAD {

    o := &management.ConnectionOptionsAzureAD{
        ClientID:            String(d, "client_id"),
        ClientSecret:        String(d, "client_secret"),
        AppID:               String(d, "app_id"),
        Domain:              String(d, "domain"),
        DomainAliases:       Set(d, "domain_aliases").List(),
        TenantDomain:        String(d, "tenant_domain"),
        MaxGroupsToRetrieve: String(d, "max_groups_to_retrieve"),
        UseWSFederation:     Bool(d, "use_wsfed"),
        WAADProtocol:        String(d, "waad_protocol"),
        UseCommonEndpoint:   Bool(d, "waad_common_endpoint"),
        EnableUsersAPI:      Bool(d, "api_enable_users"),
        LogoURL:             String(d, "icon_url"),
        IdentityAPI:         String(d, "identity_api"),
        SetUserAttributes:   String(d, "set_user_root_attributes"),
        NonPersistentAttrs:  castToListOfStrings(Set(d, "non_persistent_attrs").List()),
        TrustEmailVerified:  String(d, "should_trust_email_verified_connection"),
    }

    expandConnectionOptionsScopes(d, o)

    return o
}

func expandConnectionOptionsOIDC(d ResourceData) *management.ConnectionOptionsOIDC {

    o := &management.ConnectionOptionsOIDC{
        ClientID:              String(d, "client_id"),
        ClientSecret:          String(d, "client_secret"),
        TenantDomain:          String(d, "tenant_domain"),
        DomainAliases:         Set(d, "domain_aliases").List(),
        LogoURL:               String(d, "icon_url"),
        DiscoveryURL:          String(d, "discovery_url"),
        AuthorizationEndpoint: String(d, "authorization_endpoint"),
        Issuer:                String(d, "issuer"),
        JWKSURI:               String(d, "jwks_uri"),
        Type:                  String(d, "type"),
        UserInfoEndpoint:      String(d, "userinfo_endpoint"),
        TokenEndpoint:         String(d, "token_endpoint"),
        SetUserAttributes:     String(d, "set_user_root_attributes"),
        NonPersistentAttrs:    castToListOfStrings(Set(d, "non_persistent_attrs").List()),
    }

    expandConnectionOptionsScopes(d, o)

    return o
}

func expandConnectionOptionsSAML(d ResourceData) *management.ConnectionOptionsSAML {
    o := &management.ConnectionOptionsSAML{
        Debug:              Bool(d, "debug"),
        SigningCert:        String(d, "signing_cert"),
        ProtocolBinding:    String(d, "protocol_binding"),
        TenantDomain:       String(d, "tenant_domain"),
        DomainAliases:      Set(d, "domain_aliases").List(),
        SignInEndpoint:     String(d, "sign_in_endpoint"),
        SignOutEndpoint:    String(d, "sign_out_endpoint"),
        SignatureAlgorithm: String(d, "signature_algorithm"),
        DigestAglorithm:    String(d, "digest_algorithm"),
        FieldsMap:          Map(d, "fields_map"),
        SignSAMLRequest:    Bool(d, "sign_saml_request"),
        RequestTemplate:    String(d, "request_template"),
        UserIDAttribute:    String(d, "user_id_attribute"),
        LogoURL:            String(d, "icon_url"),
        SetUserAttributes:  String(d, "set_user_root_attributes"),
        NonPersistentAttrs: castToListOfStrings(Set(d, "non_persistent_attrs").List()),
        EntityID:           String(d, "entity_id"),
    }

    List(d, "idp_initiated").Elem(func(d ResourceData) {
        o.IdpInitiated = &management.ConnectionOptionsSAMLIdpInitiated{
            ClientID:             String(d, "client_id"),
            ClientProtocol:       String(d, "client_protocol"),
            ClientAuthorizeQuery: String(d, "client_authorize_query"),
        }
    })

    return o
}

func expandConnectionOptionsADFS(d ResourceData) *management.ConnectionOptionsADFS {
    return &management.ConnectionOptionsADFS{
        TenantDomain:       String(d, "tenant_domain"),
        DomainAliases:      Slice(d, "domain_aliases"),
        LogoURL:            String(d, "icon_url"),
        ADFSServer:         String(d, "adfs_server"),
        EnableUsersAPI:     Bool(d, "api_enable_users"),
        SetUserAttributes:  String(d, "set_user_root_attributes"),
        NonPersistentAttrs: castToListOfStrings(Set(d, "non_persistent_attrs").List()),
    }
}

type scoper interface {
    Scopes() []string
    SetScopes(enable bool, scopes ...string)
}

func expandConnectionOptionsScopes(d ResourceData, s scoper) {
    add := Set(d, "scopes").List()
    _, rm := Diff(d, "scopes")
    for _, scope := range add {
        s.SetScopes(true, scope.(string))
    }
    for _, scope := range rm.List() {
        s.SetScopes(false, scope.(string))
    }
}

func castToListOfStrings(interfaces []interface{}) *[]string {
    var strings []string
    for _, v := range interfaces {
        strings = append(strings, v.(string))
    }
    return &strings
}