Commit 7858da56 authored by Eric Chiang's avatar Eric Chiang

server: add more validation to --no-db static file parsing

In #393 the format of the static user file in --no-db mode changed.
However, the old format loads without error, which has caused
issues for developers with existing user files.

Add an explicit check to ensure the file is not using the old
format. If they are, print a better error message.
parent ed89be44
......@@ -184,6 +184,10 @@ func loadUsersFromReader(r io.Reader) (users []user.UserWithRemoteIdentities, pw
user.User
Password string `json:"password"`
RemoteIdentities []user.RemoteIdentity `json:"remoteIdentities"`
// The old format stored all user data under the "user" key.
// Attempt to detect that, and print an better error.
OldUserFields map[string]string `json:"user"`
}
if err := json.NewDecoder(r).Decode(&configUsers); err != nil {
return nil, nil, err
......@@ -193,6 +197,10 @@ func loadUsersFromReader(r io.Reader) (users []user.UserWithRemoteIdentities, pw
pwis = make([]user.PasswordInfo, len(configUsers))
for i, u := range configUsers {
if u.OldUserFields != nil {
return nil, nil, fmt.Errorf("Static user file is using an outdated format. Please refer to example in static/fixtures.")
}
users[i] = user.UserWithRemoteIdentities{
User: u.User,
RemoteIdentities: u.RemoteIdentities,
......
......@@ -15,6 +15,8 @@ func TestLoadUsers(t *testing.T) {
expUsers []user.UserWithRemoteIdentities
// userid -> plaintext password
expPasswds map[string]string
wantErr bool
}{
{
raw: `[
......@@ -50,13 +52,39 @@ func TestLoadUsers(t *testing.T) {
"elroy-id": "bones",
},
},
{
// using old format.
raw: `[
{
"user": {
"id": "elroy-id",
"email": "elroy77@example.com",
"displayName": "Elroy Jonez",
"password": "bones"
},
"remoteIdentities": [
{
"connectorId": "local",
"id": "elroy-id"
}
]
}
]`,
wantErr: true,
},
}
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 !tt.wantErr {
t.Errorf("case %d: failed to load user: %v", i, err)
}
continue
}
if tt.wantErr {
t.Errorf("case %d: wanted parsing error, didn't get one", i)
continue
}
if diff := pretty.Compare(tt.expUsers, users); diff != "" {
......
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