func (s *Server) AddConnector(cfg connector.ConnectorConfig) error { connectorID := cfg.ConnectorID() ns := s.IssuerURL ns.Path = path.Join(ns.Path, httpPathAuth, connectorID) idpc, err := cfg.Connector(ns, s.Login, s.Templates) if err != nil { return err } s.Connectors = append(s.Connectors, idpc) sortable := sortableIDPCs(s.Connectors) sort.Sort(sortable) // We handle the LocalConnector specially because it needs access to the // UserRepo and the PasswordInfoRepo; if it turns out that other connectors // need access to these resources we'll figure out how to provide it in a // cleaner manner. localConn, ok := idpc.(*connector.LocalConnector) if ok { s.localConnectorID = connectorID if s.UserRepo == nil { return errors.New("UserRepo cannot be nil") } if s.PasswordInfoRepo == nil { return errors.New("PasswordInfoRepo cannot be nil") } localConn.SetLocalIdentityProvider(&connector.LocalIdentityProvider{ UserRepo: s.UserRepo, PasswordInfoRepo: s.PasswordInfoRepo, }) localCfg, ok := cfg.(*connector.LocalConnectorConfig) if !ok { return errors.New("config for LocalConnector not a LocalConnectorConfig?") } if len(localCfg.PasswordInfos) > 0 { err := user.LoadPasswordInfos(s.PasswordInfoRepo, localCfg.PasswordInfos) if err != nil { return err } } } log.Infof("Loaded IdP connector: id=%s type=%s", connectorID, cfg.ConnectorType()) return nil }
func newConnectorConfigModel(cfg connector.ConnectorConfig) (*connectorConfigModel, error) { b, err := json.Marshal(cfg) if err != nil { return nil, err } m := &connectorConfigModel{ ID: cfg.ConnectorID(), Type: cfg.ConnectorType(), Config: string(b), } return m, nil }