Skip to content
Snippets Groups Projects
ldap.go 1.29 KiB
Newer Older
  • Learn to ignore specific revisions
  • Eric Chiang's avatar
    Eric Chiang committed
    // Package ldap implements strategies for authenticating using the LDAP protocol.
    package ldap
    
    import (
    	"errors"
    	"fmt"
    
    	"gopkg.in/ldap.v2"
    
    	"github.com/coreos/poke/connector"
    	"github.com/coreos/poke/storage"
    )
    
    // Config holds the configuration parameters for the LDAP connector.
    type Config struct {
    	Host   string `yaml:"host"`
    	BindDN string `yaml:"bindDN"`
    }
    
    // Open returns an authentication strategy using LDAP.
    func (c *Config) Open() (connector.Connector, error) {
    	if c.Host == "" {
    		return nil, errors.New("missing host parameter")
    	}
    	if c.BindDN == "" {
    		return nil, errors.New("missing bindDN paramater")
    	}
    	return &ldapConnector{*c}, nil
    }
    
    type ldapConnector struct {
    	Config
    }
    
    func (c *ldapConnector) do(f func(c *ldap.Conn) error) error {
    	// TODO(ericchiang): Connection pooling.
    	conn, err := ldap.Dial("tcp", c.Host)
    	if err != nil {
    		return fmt.Errorf("failed to connect: %v", err)
    	}
    	defer conn.Close()
    
    	return f(conn)
    }
    
    func (c *ldapConnector) Login(username, password string) (storage.Identity, error) {
    	err := c.do(func(conn *ldap.Conn) error {
    		return conn.Bind(fmt.Sprintf("uid=%s,%s", username, c.BindDN), password)
    	})
    	if err != nil {
    		return storage.Identity{}, err
    	}
    
    	return storage.Identity{Username: username}, nil
    }
    
    func (c *ldapConnector) Close() error {
    	return nil
    }