mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
	
	
		
			102 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			102 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
|  | package login | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"fmt" | ||
|  | 	"os" | ||
|  | 
 | ||
|  | 	"github.com/BurntSushi/toml" | ||
|  | 	"github.com/grafana/grafana/pkg/log" | ||
|  | 	m "github.com/grafana/grafana/pkg/models" | ||
|  | 	"github.com/grafana/grafana/pkg/setting" | ||
|  | ) | ||
|  | 
 | ||
|  | type LdapConfig struct { | ||
|  | 	Servers []*LdapServerConf `toml:"servers"` | ||
|  | } | ||
|  | 
 | ||
|  | type LdapServerConf struct { | ||
|  | 	Host          string           `toml:"host"` | ||
|  | 	Port          int              `toml:"port"` | ||
|  | 	UseSSL        bool             `toml:"use_ssl"` | ||
|  | 	StartTLS      bool             `toml:"start_tls"` | ||
|  | 	SkipVerifySSL bool             `toml:"ssl_skip_verify"` | ||
|  | 	RootCACert    string           `toml:"root_ca_cert"` | ||
|  | 	BindDN        string           `toml:"bind_dn"` | ||
|  | 	BindPassword  string           `toml:"bind_password"` | ||
|  | 	Attr          LdapAttributeMap `toml:"attributes"` | ||
|  | 
 | ||
|  | 	SearchFilter  string   `toml:"search_filter"` | ||
|  | 	SearchBaseDNs []string `toml:"search_base_dns"` | ||
|  | 
 | ||
|  | 	GroupSearchFilter              string   `toml:"group_search_filter"` | ||
|  | 	GroupSearchFilterUserAttribute string   `toml:"group_search_filter_user_attribute"` | ||
|  | 	GroupSearchBaseDNs             []string `toml:"group_search_base_dns"` | ||
|  | 
 | ||
|  | 	LdapGroups []*LdapGroupToOrgRole `toml:"group_mappings"` | ||
|  | } | ||
|  | 
 | ||
|  | type LdapAttributeMap struct { | ||
|  | 	Username string `toml:"username"` | ||
|  | 	Name     string `toml:"name"` | ||
|  | 	Surname  string `toml:"surname"` | ||
|  | 	Email    string `toml:"email"` | ||
|  | 	MemberOf string `toml:"member_of"` | ||
|  | } | ||
|  | 
 | ||
|  | type LdapGroupToOrgRole struct { | ||
|  | 	GroupDN string     `toml:"group_dn"` | ||
|  | 	OrgId   int64      `toml:"org_id"` | ||
|  | 	OrgRole m.RoleType `toml:"org_role"` | ||
|  | } | ||
|  | 
 | ||
|  | var LdapCfg LdapConfig | ||
|  | var ldapLogger log.Logger = log.New("ldap") | ||
|  | 
 | ||
|  | func loadLdapConfig() { | ||
|  | 	if !setting.LdapEnabled { | ||
|  | 		return | ||
|  | 	} | ||
|  | 
 | ||
|  | 	ldapLogger.Info("Ldap enabled, reading config file", "file", setting.LdapConfigFile) | ||
|  | 
 | ||
|  | 	_, err := toml.DecodeFile(setting.LdapConfigFile, &LdapCfg) | ||
|  | 	if err != nil { | ||
|  | 		ldapLogger.Crit("Failed to load ldap config file", "error", err) | ||
|  | 		os.Exit(1) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if len(LdapCfg.Servers) == 0 { | ||
|  | 		ldapLogger.Crit("ldap enabled but no ldap servers defined in config file") | ||
|  | 		os.Exit(1) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// set default org id
 | ||
|  | 	for _, server := range LdapCfg.Servers { | ||
|  | 		assertNotEmptyCfg(server.SearchFilter, "search_filter") | ||
|  | 		assertNotEmptyCfg(server.SearchBaseDNs, "search_base_dns") | ||
|  | 
 | ||
|  | 		for _, groupMap := range server.LdapGroups { | ||
|  | 			if groupMap.OrgId == 0 { | ||
|  | 				groupMap.OrgId = 1 | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func assertNotEmptyCfg(val interface{}, propName string) { | ||
|  | 	switch v := val.(type) { | ||
|  | 	case string: | ||
|  | 		if v == "" { | ||
|  | 			ldapLogger.Crit("LDAP config file is missing option", "option", propName) | ||
|  | 			os.Exit(1) | ||
|  | 		} | ||
|  | 	case []string: | ||
|  | 		if len(v) == 0 { | ||
|  | 			ldapLogger.Crit("LDAP config file is missing option", "option", propName) | ||
|  | 			os.Exit(1) | ||
|  | 		} | ||
|  | 	default: | ||
|  | 		fmt.Println("unknown") | ||
|  | 	} | ||
|  | } |