mirror of https://github.com/dexidp/dex.git
Browse Source
In --no-db mode, load passwords from the users file instead of the connectors file. This allows us to remove the password infos field from the local connector and stop loading them during connector registration, a case that was causing panics when using a real database (see #286). Fixes #286 Closes #340pull/393/head
8 changed files with 132 additions and 59 deletions
@ -0,0 +1,78 @@
|
||||
package server |
||||
|
||||
import ( |
||||
"strings" |
||||
"testing" |
||||
|
||||
"github.com/coreos/dex/user" |
||||
"github.com/kylelemons/godebug/pretty" |
||||
) |
||||
|
||||
func TestLoadUsers(t *testing.T) { |
||||
tests := []struct { |
||||
// The raw JSON file
|
||||
raw string |
||||
expUsers []user.UserWithRemoteIdentities |
||||
// userid -> plaintext password
|
||||
expPasswds map[string]string |
||||
}{ |
||||
{ |
||||
raw: `[ |
||||
{ |
||||
"id": "elroy-id", |
||||
"email": "elroy77@example.com", |
||||
"displayName": "Elroy Jonez", |
||||
"password": "bones", |
||||
"remoteIdentities": [ |
||||
{ |
||||
"connectorId": "local", |
||||
"id": "elroy-id" |
||||
} |
||||
] |
||||
} |
||||
]`, |
||||
expUsers: []user.UserWithRemoteIdentities{ |
||||
{ |
||||
User: user.User{ |
||||
ID: "elroy-id", |
||||
Email: "elroy77@example.com", |
||||
DisplayName: "Elroy Jonez", |
||||
}, |
||||
RemoteIdentities: []user.RemoteIdentity{ |
||||
{ |
||||
ConnectorID: "local", |
||||
ID: "elroy-id", |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
expPasswds: map[string]string{ |
||||
"elroy-id": "bones", |
||||
}, |
||||
}, |
||||
} |
||||
|
||||
for i, tt := range tests { |
||||
users, pwInfos, err := loadUsersFromReader(strings.NewReader(tt.raw)) |
||||
if err != nil { |
||||
t.Errorf("case %d: failed to load user: %v", i, err) |
||||
return |
||||
} |
||||
|
||||
if diff := pretty.Compare(tt.expUsers, users); diff != "" { |
||||
t.Errorf("case: %d: wantUsers!=gotUsers: %s", i, diff) |
||||
} |
||||
|
||||
// For each password info loaded, verify the password.
|
||||
for _, pwInfo := range pwInfos { |
||||
expPW, ok := tt.expPasswds[pwInfo.UserID] |
||||
if !ok { |
||||
t.Errorf("no password entry for %s", pwInfo.UserID) |
||||
continue |
||||
} |
||||
if _, err := pwInfo.Authenticate(expPW); err != nil { |
||||
t.Errorf("case %d: user %s's password did not match", i, pwInfo.UserID) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue