Commit 546463ad authored by bobbyrullo's avatar bobbyrullo

Merge pull request #457 from bobbyrullo/client_manager_tweaks

Various client api tweaks
parents 9c260c76 182e8af4
...@@ -2,7 +2,6 @@ package manager ...@@ -2,7 +2,6 @@ package manager
import ( import (
"encoding/base64" "encoding/base64"
"fmt"
"errors" "errors"
...@@ -64,35 +63,6 @@ func NewClientManager(clientRepo client.ClientRepo, txnFactory repo.TransactionF ...@@ -64,35 +63,6 @@ func NewClientManager(clientRepo client.ClientRepo, txnFactory repo.TransactionF
} }
} }
func NewClientManagerFromClients(clientRepo client.ClientRepo, txnFactory repo.TransactionFactory, clients []client.Client, options ManagerOptions) (*ClientManager, error) {
clientManager := NewClientManager(clientRepo, txnFactory, options)
tx, err := clientManager.begin()
if err != nil {
return nil, err
}
defer tx.Rollback()
for _, c := range clients {
if c.Credentials.Secret == "" {
return nil, fmt.Errorf("client %q has no secret", c.Credentials.ID)
}
cli, err := clientManager.generateClientCredentials(c)
if err != nil {
return nil, err
}
_, err = clientRepo.New(tx, cli)
if err != nil {
return nil, err
}
}
if err := tx.Commit(); err != nil {
return nil, err
}
return clientManager, nil
}
func (m *ClientManager) New(cli client.Client) (*oidc.ClientCredentials, error) { func (m *ClientManager) New(cli client.Client) (*oidc.ClientCredentials, error) {
tx, err := m.begin() tx, err := m.begin()
if err != nil { if err != nil {
...@@ -100,15 +70,15 @@ func (m *ClientManager) New(cli client.Client) (*oidc.ClientCredentials, error) ...@@ -100,15 +70,15 @@ func (m *ClientManager) New(cli client.Client) (*oidc.ClientCredentials, error)
} }
defer tx.Rollback() defer tx.Rollback()
c, err := m.generateClientCredentials(cli) err = m.addClientCredentials(&cli)
if err != nil { if err != nil {
return nil, err return nil, err
} }
creds := c.Credentials creds := cli.Credentials
// Save Client // Save Client
_, err = m.clientRepo.New(tx, c) _, err = m.clientRepo.New(tx, cli)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -189,25 +159,25 @@ func (m *ClientManager) Authenticate(creds oidc.ClientCredentials) (bool, error) ...@@ -189,25 +159,25 @@ func (m *ClientManager) Authenticate(creds oidc.ClientCredentials) (bool, error)
return ok, nil return ok, nil
} }
func (m *ClientManager) generateClientCredentials(cli client.Client) (client.Client, error) { func (m *ClientManager) addClientCredentials(cli *client.Client) error {
// Generate Client ID // Generate Client ID
if len(cli.Metadata.RedirectURIs) < 1 { if len(cli.Metadata.RedirectURIs) < 1 {
return cli, errors.New("no client redirect url given") return errors.New("no client redirect url given")
} }
clientID, err := m.clientIDGenerator(cli.Metadata.RedirectURIs[0].Host) clientID, err := m.clientIDGenerator(cli.Metadata.RedirectURIs[0].Host)
if err != nil { if err != nil {
return cli, err return err
} }
// Generate Secret // Generate Secret
secret, err := m.secretGenerator() secret, err := m.secretGenerator()
if err != nil { if err != nil {
return cli, err return err
} }
clientSecret := base64.URLEncoding.EncodeToString(secret) clientSecret := base64.URLEncoding.EncodeToString(secret)
cli.Credentials = oidc.ClientCredentials{ cli.Credentials = oidc.ClientCredentials{
ID: clientID, ID: clientID,
Secret: clientSecret, Secret: clientSecret,
} }
return cli, nil return nil
} }
...@@ -44,11 +44,14 @@ func makeTestFixtures() *testFixtures { ...@@ -44,11 +44,14 @@ func makeTestFixtures() *testFixtures {
secGen := func() ([]byte, error) { secGen := func() ([]byte, error) {
return []byte("secret"), nil return []byte("secret"), nil
} }
f.clientRepo = db.NewClientRepo(dbMap)
clientManager, err := NewClientManagerFromClients(f.clientRepo, db.TransactionFactory(dbMap), clients, ManagerOptions{ClientIDGenerator: clientIDGenerator, SecretGenerator: secGen}) var err error
f.clientRepo, err = db.NewClientRepoFromClients(dbMap, clients)
if err != nil { if err != nil {
panic("Failed to create client manager: " + err.Error()) panic("Failed to create client manager: " + err.Error())
} }
clientManager := NewClientManager(f.clientRepo, db.TransactionFactory(dbMap), ManagerOptions{ClientIDGenerator: clientIDGenerator, SecretGenerator: secGen})
f.mgr = clientManager f.mgr = clientManager
return f return f
} }
......
...@@ -199,6 +199,18 @@ func (r *clientRepo) All(tx repo.Transaction) ([]client.Client, error) { ...@@ -199,6 +199,18 @@ func (r *clientRepo) All(tx repo.Transaction) ([]client.Client, error) {
return cs, nil return cs, nil
} }
func NewClientRepoFromClients(dbm *gorp.DbMap, cs []client.Client) (client.ClientRepo, error) {
repo := NewClientRepo(dbm).(*clientRepo)
for _, c := range cs {
cm, err := newClientModel(c)
if err != nil {
return nil, err
}
err = repo.executor(nil).Insert(cm)
}
return repo, nil
}
func (r *clientRepo) get(tx repo.Transaction, clientID string) (client.Client, error) { func (r *clientRepo) get(tx repo.Transaction, clientID string) (client.Client, error) {
cm, err := r.getModel(tx, clientID) cm, err := r.getModel(tx, clientID)
if err != nil { if err != nil {
......
package config
import (
"os"
"testing"
"github.com/coreos/dex/client"
"github.com/coreos/dex/client/manager"
"github.com/coreos/dex/db"
)
const (
clientsFile = "../../static/fixtures/clients.json.sample"
)
// TestClientSample makes sure that the clients.json.sample file is valid and can be loaded properly.
func TestClientSample(t *testing.T) {
f, err := os.Open(clientsFile)
if err != nil {
t.Fatalf("could not open file %q: %v", clientsFile, err)
}
defer f.Close()
clients, err := client.ClientsFromReader(f)
if err != nil {
t.Fatalf("Error loading Clients: %v", err)
}
memDB := db.NewMemDB()
repo := db.NewClientRepo(memDB)
for _, c := range clients {
repo.New(nil, c)
}
mgr := manager.NewClientManager(repo, db.TransactionFactory(memDB), manager.ManagerOptions{})
for i, c := range clients {
ok, err := mgr.Authenticate(c.Credentials)
if !ok {
t.Errorf("case %d: couldn't authenticate", i)
}
if err != nil {
t.Errorf("case %d: error authenticating: %v", i, err)
}
}
}
...@@ -12,7 +12,6 @@ import ( ...@@ -12,7 +12,6 @@ import (
"github.com/kylelemons/godebug/pretty" "github.com/kylelemons/godebug/pretty"
"github.com/coreos/dex/client" "github.com/coreos/dex/client"
"github.com/coreos/dex/client/manager"
"github.com/coreos/dex/db" "github.com/coreos/dex/db"
"github.com/coreos/dex/refresh" "github.com/coreos/dex/refresh"
"github.com/coreos/dex/user" "github.com/coreos/dex/user"
...@@ -28,9 +27,7 @@ func newRefreshRepo(t *testing.T, users []user.UserWithRemoteIdentities, clients ...@@ -28,9 +27,7 @@ func newRefreshRepo(t *testing.T, users []user.UserWithRemoteIdentities, clients
if _, err := db.NewUserRepoFromUsers(dbMap, users); err != nil { if _, err := db.NewUserRepoFromUsers(dbMap, users); err != nil {
t.Fatalf("Unable to add users: %v", err) t.Fatalf("Unable to add users: %v", err)
} }
if _, err := manager.NewClientManagerFromClients(db.NewClientRepo(dbMap), db.TransactionFactory(dbMap), clients, manager.ManagerOptions{}); err != nil {
t.Fatalf("Unable to add clients: %v", err)
}
return db.NewRefreshTokenRepo(dbMap) return db.NewRefreshTokenRepo(dbMap)
} }
......
...@@ -12,6 +12,8 @@ import ( ...@@ -12,6 +12,8 @@ import (
"github.com/go-gorp/gorp" "github.com/go-gorp/gorp"
"github.com/jonboulle/clockwork" "github.com/jonboulle/clockwork"
"github.com/coreos/dex/client"
clientmanager "github.com/coreos/dex/client/manager"
"github.com/coreos/dex/connector" "github.com/coreos/dex/connector"
"github.com/coreos/dex/db" "github.com/coreos/dex/db"
"github.com/coreos/dex/user" "github.com/coreos/dex/user"
...@@ -79,3 +81,19 @@ func makeUserObjects(users []user.UserWithRemoteIdentities, passwords []user.Pas ...@@ -79,3 +81,19 @@ func makeUserObjects(users []user.UserWithRemoteIdentities, passwords []user.Pas
um.Clock = clock um.Clock = clock
return dbMap, ur, pwr, um return dbMap, ur, pwr, um
} }
func makeClientRepoAndManager(dbMap *gorp.DbMap, clients []client.Client) (client.ClientRepo, *clientmanager.ClientManager, error) {
clientIDGenerator := func(hostport string) (string, error) {
return hostport, nil
}
secGen := func() ([]byte, error) {
return []byte("secret"), nil
}
clientRepo, err := db.NewClientRepoFromClients(dbMap, clients)
if err != nil {
return nil, nil, err
}
clientManager := clientmanager.NewClientManager(clientRepo, db.TransactionFactory(dbMap), clientmanager.ManagerOptions{ClientIDGenerator: clientIDGenerator, SecretGenerator: secGen})
return clientRepo, clientManager, nil
}
...@@ -9,8 +9,12 @@ import ( ...@@ -9,8 +9,12 @@ import (
"testing" "testing"
"time" "time"
"github.com/coreos/go-oidc/jose"
"github.com/coreos/go-oidc/key"
"github.com/coreos/go-oidc/oauth2"
"github.com/coreos/go-oidc/oidc"
"github.com/coreos/dex/client" "github.com/coreos/dex/client"
clientmanager "github.com/coreos/dex/client/manager"
"github.com/coreos/dex/connector" "github.com/coreos/dex/connector"
"github.com/coreos/dex/db" "github.com/coreos/dex/db"
phttp "github.com/coreos/dex/pkg/http" phttp "github.com/coreos/dex/pkg/http"
...@@ -18,10 +22,6 @@ import ( ...@@ -18,10 +22,6 @@ import (
"github.com/coreos/dex/server" "github.com/coreos/dex/server"
"github.com/coreos/dex/session/manager" "github.com/coreos/dex/session/manager"
"github.com/coreos/dex/user" "github.com/coreos/dex/user"
"github.com/coreos/go-oidc/jose"
"github.com/coreos/go-oidc/key"
"github.com/coreos/go-oidc/oauth2"
"github.com/coreos/go-oidc/oidc"
) )
func mockServer(cis []client.Client) (*server.Server, error) { func mockServer(cis []client.Client) (*server.Server, error) {
...@@ -37,14 +37,7 @@ func mockServer(cis []client.Client) (*server.Server, error) { ...@@ -37,14 +37,7 @@ func mockServer(cis []client.Client) (*server.Server, error) {
return nil, err return nil, err
} }
clientIDGenerator := func(hostport string) (string, error) { clientRepo, clientManager, err := makeClientRepoAndManager(dbMap, cis)
return hostport, nil
}
secGen := func() ([]byte, error) {
return []byte("secret"), nil
}
clientRepo := db.NewClientRepo(dbMap)
clientManager, err := clientmanager.NewClientManagerFromClients(clientRepo, db.TransactionFactory(dbMap), cis, clientmanager.ManagerOptions{ClientIDGenerator: clientIDGenerator, SecretGenerator: secGen})
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -150,18 +143,12 @@ func TestHTTPExchangeTokenRefreshToken(t *testing.T) { ...@@ -150,18 +143,12 @@ func TestHTTPExchangeTokenRefreshToken(t *testing.T) {
}, },
} }
clientIDGenerator := func(hostport string) (string, error) {
return hostport, nil
}
secGen := func() ([]byte, error) {
return []byte("secret"), nil
}
dbMap := db.NewMemDB() dbMap := db.NewMemDB()
clientRepo := db.NewClientRepo(dbMap) clientRepo, clientManager, err := makeClientRepoAndManager(dbMap, []client.Client{ci})
clientManager, err := clientmanager.NewClientManagerFromClients(clientRepo, db.TransactionFactory(dbMap), []client.Client{ci}, clientmanager.ManagerOptions{ClientIDGenerator: clientIDGenerator, SecretGenerator: secGen})
if err != nil { if err != nil {
t.Fatalf("Failed to create client identity manager: " + err.Error()) t.Fatalf("Failed to create client identity manager: " + err.Error())
} }
passwordInfoRepo, err := db.NewPasswordInfoRepoFromPasswordInfos(db.NewMemDB(), []user.PasswordInfo{passwordInfo}) passwordInfoRepo, err := db.NewPasswordInfoRepoFromPasswordInfos(db.NewMemDB(), []user.PasswordInfo{passwordInfo})
if err != nil { if err != nil {
t.Fatalf("Failed to create password info repo: %v", err) t.Fatalf("Failed to create password info repo: %v", err)
......
...@@ -18,7 +18,6 @@ import ( ...@@ -18,7 +18,6 @@ import (
"google.golang.org/api/googleapi" "google.golang.org/api/googleapi"
"github.com/coreos/dex/client" "github.com/coreos/dex/client"
"github.com/coreos/dex/client/manager"
"github.com/coreos/dex/db" "github.com/coreos/dex/db"
schema "github.com/coreos/dex/schema/workerschema" schema "github.com/coreos/dex/schema/workerschema"
"github.com/coreos/dex/server" "github.com/coreos/dex/server"
...@@ -126,14 +125,8 @@ func makeUserAPITestFixtures() *userAPITestFixtures { ...@@ -126,14 +125,8 @@ func makeUserAPITestFixtures() *userAPITestFixtures {
}, },
}, },
} }
clientIDGenerator := func(hostport string) (string, error) {
return hostport, nil _, clientManager, err := makeClientRepoAndManager(dbMap, clients)
}
secGen := func() ([]byte, error) {
return []byte(testClientSecret), nil
}
clientRepo := db.NewClientRepo(dbMap)
clientManager, err := manager.NewClientManagerFromClients(clientRepo, db.TransactionFactory(dbMap), clients, manager.ManagerOptions{ClientIDGenerator: clientIDGenerator, SecretGenerator: secGen})
if err != nil { if err != nil {
panic("Failed to create client identity manager: " + err.Error()) panic("Failed to create client identity manager: " + err.Error())
} }
......
...@@ -188,7 +188,7 @@ func TestList(t *testing.T) { ...@@ -188,7 +188,7 @@ func TestList(t *testing.T) {
}{ }{
// empty repo // empty repo
{ {
cs: nil, cs: []client.Client{},
want: nil, want: nil,
}, },
// single client // single client
...@@ -244,20 +244,14 @@ func TestList(t *testing.T) { ...@@ -244,20 +244,14 @@ func TestList(t *testing.T) {
} }
for i, tt := range tests { for i, tt := range tests {
dbm := db.NewMemDB() f, err := makeTestFixturesWithOptions(testFixtureOptions{
clientIDGenerator := func(hostport string) (string, error) { clients: tt.cs,
return hostport, nil })
}
secGen := func() ([]byte, error) {
return []byte("secret"), nil
}
clientRepo := db.NewClientRepo(dbm)
clientManager, err := manager.NewClientManagerFromClients(clientRepo, db.TransactionFactory(dbm), tt.cs, manager.ManagerOptions{ClientIDGenerator: clientIDGenerator, SecretGenerator: secGen})
if err != nil { if err != nil {
t.Fatalf("Failed to create client identity manager: %v", err) t.Fatalf("error making test fixtures: %v", err)
continue
} }
res := &clientResource{manager: clientManager}
res := &clientResource{manager: f.clientManager}
r, err := http.NewRequest("GET", "http://example.com/clients", nil) r, err := http.NewRequest("GET", "http://example.com/clients", nil)
if err != nil { if err != nil {
......
...@@ -116,10 +116,9 @@ func (cfg *SingleServerConfig) Configure(srv *Server) error { ...@@ -116,10 +116,9 @@ func (cfg *SingleServerConfig) Configure(srv *Server) error {
return fmt.Errorf("unable to read clients from file %s: %v", cfg.ClientsFile, err) return fmt.Errorf("unable to read clients from file %s: %v", cfg.ClientsFile, err)
} }
clientRepo := db.NewClientRepo(dbMap) clientRepo, err := db.NewClientRepoFromClients(dbMap, clients)
if err != nil {
for _, c := range clients { return err
clientRepo.New(nil, c)
} }
f, err := os.Open(cfg.ConnectorsFile) f, err := os.Open(cfg.ConnectorsFile)
...@@ -158,7 +157,7 @@ func (cfg *SingleServerConfig) Configure(srv *Server) error { ...@@ -158,7 +157,7 @@ func (cfg *SingleServerConfig) Configure(srv *Server) error {
txnFactory := db.TransactionFactory(dbMap) txnFactory := db.TransactionFactory(dbMap)
userManager := usermanager.NewUserManager(userRepo, pwiRepo, cfgRepo, txnFactory, usermanager.ManagerOptions{}) userManager := usermanager.NewUserManager(userRepo, pwiRepo, cfgRepo, txnFactory, usermanager.ManagerOptions{})
clientManager, err := clientmanager.NewClientManagerFromClients(clientRepo, db.TransactionFactory(dbMap), clients, clientmanager.ManagerOptions{}) clientManager := clientmanager.NewClientManager(clientRepo, db.TransactionFactory(dbMap), clientmanager.ManagerOptions{})
if err != nil { if err != nil {
return fmt.Errorf("Failed to create client identity manager: %v", err) return fmt.Errorf("Failed to create client identity manager: %v", err)
} }
......
...@@ -17,10 +17,7 @@ import ( ...@@ -17,10 +17,7 @@ import (
"github.com/jonboulle/clockwork" "github.com/jonboulle/clockwork"
"github.com/coreos/dex/client" "github.com/coreos/dex/client"
clientmanager "github.com/coreos/dex/client/manager"
"github.com/coreos/dex/connector" "github.com/coreos/dex/connector"
"github.com/coreos/dex/db"
"github.com/coreos/dex/session/manager"
"github.com/coreos/go-oidc/jose" "github.com/coreos/go-oidc/jose"
"github.com/coreos/go-oidc/oauth2" "github.com/coreos/go-oidc/oauth2"
"github.com/coreos/go-oidc/oidc" "github.com/coreos/go-oidc/oidc"
...@@ -76,38 +73,6 @@ func TestHandleAuthFuncResponsesSingleRedirectURL(t *testing.T) { ...@@ -76,38 +73,6 @@ func TestHandleAuthFuncResponsesSingleRedirectURL(t *testing.T) {
idpcs := []connector.Connector{ idpcs := []connector.Connector{
&fakeConnector{loginURL: "http://fake.example.com"}, &fakeConnector{loginURL: "http://fake.example.com"},
} }
dbm := db.NewMemDB()
clients := []client.Client{
client.Client{
Credentials: oidc.ClientCredentials{
ID: "client.example.com",
Secret: base64.URLEncoding.EncodeToString([]byte("secret")),
},
Metadata: oidc.ClientMetadata{
RedirectURIs: []url.URL{
url.URL{Scheme: "http", Host: "client.example.com", Path: "/callback"},
},
},
},
}
clientIDGenerator := func(hostport string) (string, error) {
return hostport, nil
}
secGen := func() ([]byte, error) {
return []byte("secret"), nil
}
clientRepo := db.NewClientRepo(dbm)
clientManager, err := clientmanager.NewClientManagerFromClients(clientRepo, db.TransactionFactory(dbm), clients, clientmanager.ManagerOptions{ClientIDGenerator: clientIDGenerator, SecretGenerator: secGen})
if err != nil {
t.Fatalf("Failed to create client identity manager: %v", err)
}
srv := &Server{
IssuerURL: url.URL{Scheme: "http", Host: "server.example.com"},
SessionManager: manager.NewSessionManager(db.NewSessionRepo(db.NewMemDB()), db.NewSessionKeyRepo(db.NewMemDB())),
ClientRepo: clientRepo,
ClientManager: clientManager,
}
tests := []struct { tests := []struct {
query url.Values query url.Values
...@@ -118,7 +83,7 @@ func TestHandleAuthFuncResponsesSingleRedirectURL(t *testing.T) { ...@@ -118,7 +83,7 @@ func TestHandleAuthFuncResponsesSingleRedirectURL(t *testing.T) {
{ {
query: url.Values{ query: url.Values{
"response_type": []string{"code"}, "response_type": []string{"code"},
"client_id": []string{"client.example.com"}, "client_id": []string{testClientID},
"connector_id": []string{"fake"}, "connector_id": []string{"fake"},
"scope": []string{"openid"}, "scope": []string{"openid"},
}, },
...@@ -210,7 +175,12 @@ func TestHandleAuthFuncResponsesSingleRedirectURL(t *testing.T) { ...@@ -210,7 +175,12 @@ func TestHandleAuthFuncResponsesSingleRedirectURL(t *testing.T) {
} }
for i, tt := range tests { for i, tt := range tests {
hdlr := handleAuthFunc(srv, idpcs, nil, true) f, err := makeTestFixtures()
if err != nil {
t.Fatalf("error making test fixtures: %v", err)
}
hdlr := handleAuthFunc(f.srv, idpcs, nil, true)
w := httptest.NewRecorder() w := httptest.NewRecorder()
u := fmt.Sprintf("http://server.example.com?%s", tt.query.Encode()) u := fmt.Sprintf("http://server.example.com?%s", tt.query.Encode())
req, err := http.NewRequest("GET", u, nil) req, err := http.NewRequest("GET", u, nil)
...@@ -237,7 +207,6 @@ func TestHandleAuthFuncResponsesMultipleRedirectURLs(t *testing.T) { ...@@ -237,7 +207,6 @@ func TestHandleAuthFuncResponsesMultipleRedirectURLs(t *testing.T) {
&fakeConnector{loginURL: "http://fake.example.com"}, &fakeConnector{loginURL: "http://fake.example.com"},
} }
dbm := db.NewMemDB()
clients := []client.Client{ clients := []client.Client{
client.Client{ client.Client{
Credentials: oidc.ClientCredentials{ Credentials: oidc.ClientCredentials{
...@@ -252,23 +221,11 @@ func TestHandleAuthFuncResponsesMultipleRedirectURLs(t *testing.T) { ...@@ -252,23 +221,11 @@ func TestHandleAuthFuncResponsesMultipleRedirectURLs(t *testing.T) {
}, },
}, },
} }
f, err := makeTestFixturesWithOptions(testFixtureOptions{
clientIDGenerator := func(hostport string) (string, error) { clients: clients,
return hostport, nil })
}
secGen := func() ([]byte, error) {
return []byte("secret"), nil
}
clientRepo := db.NewClientRepo(dbm)
clientManager, err := clientmanager.NewClientManagerFromClients(clientRepo, db.TransactionFactory(dbm), clients, clientmanager.ManagerOptions{ClientIDGenerator: clientIDGenerator, SecretGenerator: secGen})
if err != nil { if err != nil {
t.Fatalf("Failed to create client identity manager: %v", err) t.Fatalf("error making test fixtures: %v", err)
}
srv := &Server{
IssuerURL: url.URL{Scheme: "http", Host: "server.example.com"},
SessionManager: manager.NewSessionManager(db.NewSessionRepo(db.NewMemDB()), db.NewSessionKeyRepo(db.NewMemDB())),
ClientRepo: clientRepo,
ClientManager: clientManager,
} }
tests := []struct { tests := []struct {
...@@ -327,7 +284,7 @@ func TestHandleAuthFuncResponsesMultipleRedirectURLs(t *testing.T) { ...@@ -327,7 +284,7 @@ func TestHandleAuthFuncResponsesMultipleRedirectURLs(t *testing.T) {
} }
for i, tt := range tests { for i, tt := range tests {
hdlr := handleAuthFunc(srv, idpcs, nil, true) hdlr := handleAuthFunc(f.srv, idpcs, nil, true)
w := httptest.NewRecorder() w := httptest.NewRecorder()
u := fmt.Sprintf("http://server.example.com?%s", tt.query.Encode()) u := fmt.Sprintf("http://server.example.com?%s", tt.query.Encode())
req, err := http.NewRequest("GET", u, nil) req, err := http.NewRequest("GET", u, nil)
......
This diff is collapsed.
...@@ -26,21 +26,33 @@ const ( ...@@ -26,21 +26,33 @@ const (
) )
var ( var (
testUserID1 = "ID-1"
testUserEmail1 = "Email-1@example.com"
testUserRemoteID1 = "RID-1"
testIssuerURL = url.URL{Scheme: "http", Host: "server.example.com"} testIssuerURL = url.URL{Scheme: "http", Host: "server.example.com"}
testClientID = "client.example.com"
testClientID = "client.example.com"
clientTestSecret = base64.URLEncoding.EncodeToString([]byte("secret"))
testClientCredentials = oidc.ClientCredentials{
ID: testClientID,
Secret: clientTestSecret,
}
testConnectorID1 = "IDPC-1"
testRedirectURL = url.URL{Scheme: "http", Host: "client.example.com", Path: "/callback"} testRedirectURL = url.URL{Scheme: "http", Host: "client.example.com", Path: "/callback"}
testUsers = []user.UserWithRemoteIdentities{ testUsers = []user.UserWithRemoteIdentities{
{ {
User: user.User{ User: user.User{
ID: "ID-1", ID: testUserID1,
Email: "Email-1@example.com", Email: testUserEmail1,
}, },
RemoteIdentities: []user.RemoteIdentity{ RemoteIdentities: []user.RemoteIdentity{
{ {
ConnectorID: "IDPC-1", ConnectorID: testConnectorID1,
ID: "RID-1", ID: testUserRemoteID1,
}, },
}, },
}, },
...@@ -83,6 +95,10 @@ type testFixtures struct { ...@@ -83,6 +95,10 @@ type testFixtures struct {
clientManager *clientmanager.ClientManager clientManager *clientmanager.ClientManager
} }
type testFixtureOptions struct {
clients []client.Client
}
func sequentialGenerateCodeFunc() sessionmanager.GenerateCodeFunc { func sequentialGenerateCodeFunc() sessionmanager.GenerateCodeFunc {
x := 0 x := 0
return func() (string, error) { return func() (string, error) {
...@@ -92,6 +108,10 @@ func sequentialGenerateCodeFunc() sessionmanager.GenerateCodeFunc { ...@@ -92,6 +108,10 @@ func sequentialGenerateCodeFunc() sessionmanager.GenerateCodeFunc {
} }
func makeTestFixtures() (*testFixtures, error) { func makeTestFixtures() (*testFixtures, error) {
return makeTestFixturesWithOptions(testFixtureOptions{})
}
func makeTestFixturesWithOptions(options testFixtureOptions) (*testFixtures, error) {
dbMap := db.NewMemDB() dbMap := db.NewMemDB()
userRepo, err := db.NewUserRepoFromUsers(dbMap, testUsers) userRepo, err := db.NewUserRepoFromUsers(dbMap, testUsers)
if err != nil { if err != nil {
...@@ -138,18 +158,20 @@ func makeTestFixtures() (*testFixtures, error) { ...@@ -138,18 +158,20 @@ func makeTestFixtures() (*testFixtures, error) {
return nil, err return nil, err
} }
clients := []client.Client{ var clients []client.Client
client.Client{ if options.clients == nil {
Credentials: oidc.ClientCredentials{ clients = []client.Client{
ID: testClientID, client.Client{
Secret: base64.URLEncoding.EncodeToString([]byte("secret")), Credentials: testClientCredentials,
}, Metadata: oidc.ClientMetadata{
Metadata: oidc.ClientMetadata{ RedirectURIs: []url.URL{
RedirectURIs: []url.URL{ testRedirectURL,
testRedirectURL, },
}, },
}, },
}, }
} else {
clients = options.clients
} }
clientIDGenerator := func(hostport string) (string, error) { clientIDGenerator := func(hostport string) (string, error) {
...@@ -158,11 +180,13 @@ func makeTestFixtures() (*testFixtures, error) { ...@@ -158,11 +180,13 @@ func makeTestFixtures() (*testFixtures, error) {
secGen := func() ([]byte, error) { secGen := func() ([]byte, error) {
return []byte("secret"), nil return []byte("secret"), nil
} }
clientRepo := db.NewClientRepo(dbMap) clientRepo, err := db.NewClientRepoFromClients(dbMap, clients)
clientManager, err := clientmanager.NewClientManagerFromClients(clientRepo, db.TransactionFactory(dbMap), clients, clientmanager.ManagerOptions{ClientIDGenerator: clientIDGenerator, SecretGenerator: secGen})
if err != nil { if err != nil {
return nil, err return nil, err
} }
clientManager := clientmanager.NewClientManager(clientRepo, db.TransactionFactory(dbMap), clientmanager.ManagerOptions{ClientIDGenerator: clientIDGenerator, SecretGenerator: secGen})
km := key.NewPrivateKeyManager() km := key.NewPrivateKeyManager()
err = km.Set(key.NewPrivateKeySet([]*key.PrivateKey{testPrivKey}, time.Now().Add(time.Minute))) err = km.Set(key.NewPrivateKeySet([]*key.PrivateKey{testPrivKey}, time.Now().Add(time.Minute)))
if err != nil { if err != nil {
......
...@@ -18,7 +18,7 @@ if [ ! -d $GOPATH/pkg ]; then ...@@ -18,7 +18,7 @@ if [ ! -d $GOPATH/pkg ]; then
echo "WARNING: No cached builds detected. Please run the ./build script to speed up future tests." echo "WARNING: No cached builds detected. Please run the ./build script to speed up future tests."
fi fi
TESTABLE="connector db integration pkg/crypto pkg/flag pkg/http pkg/time pkg/html functional/repo server session session/manager user user/api user/manager user/email email admin client client/manager" TESTABLE="admin client client/manager connector db email functional/repo integration pkg/crypto pkg/flag pkg/http pkg/time pkg/html server session session/manager user user/api user/manager user/email"
FORMATTABLE="$TESTABLE cmd/dexctl cmd/dex-worker cmd/dex-overlord examples/app functional pkg/log" FORMATTABLE="$TESTABLE cmd/dexctl cmd/dex-worker cmd/dex-overlord examples/app functional pkg/log"
# user has not provided PKG override # user has not provided PKG override
......
...@@ -4,3 +4,4 @@ source ./env ...@@ -4,3 +4,4 @@ source ./env
go test $@ github.com/coreos/dex/functional go test $@ github.com/coreos/dex/functional
go test $@ github.com/coreos/dex/functional/repo go test $@ github.com/coreos/dex/functional/repo
go test $@ github.com/coreos/dex/functional/config
...@@ -176,11 +176,11 @@ func makeTestFixtures() (*UsersAPI, *testEmailer) { ...@@ -176,11 +176,11 @@ func makeTestFixtures() (*UsersAPI, *testEmailer) {
secGen := func() ([]byte, error) { secGen := func() ([]byte, error) {
return []byte("secret"), nil return []byte("secret"), nil
} }
clientRepo := db.NewClientRepo(dbMap) clientRepo, err := db.NewClientRepoFromClients(dbMap, []client.Client{ci})
clientManager, err := clientmanager.NewClientManagerFromClients(clientRepo, db.TransactionFactory(dbMap), []client.Client{ci}, clientmanager.ManagerOptions{ClientIDGenerator: clientIDGenerator, SecretGenerator: secGen})
if err != nil { if err != nil {
panic("Failed to create client manager: " + err.Error()) panic("Failed to create client manager: " + err.Error())
} }
clientManager := clientmanager.NewClientManager(clientRepo, db.TransactionFactory(dbMap), clientmanager.ManagerOptions{ClientIDGenerator: clientIDGenerator, SecretGenerator: secGen})
// Used in TestRevokeRefreshToken test. // Used in TestRevokeRefreshToken test.
refreshTokens := []struct { refreshTokens := []struct {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment