diff --git a/Makefile b/Makefile index f1300176b9..6934e8545d 100644 --- a/Makefile +++ b/Makefile @@ -145,7 +145,7 @@ test: start-docker $(GO) test $(GOFLAGS) -run=$(TESTS) -test.v -test.timeout=340s ./api || exit 1 $(GO) test $(GOFLAGS) -run=$(TESTS) -test.v -test.timeout=12s ./model || exit 1 - $(GO) test $(GOFLAGS) -run=$(TESTS) -test.v -test.timeout=120s ./store || exit 1 + $(GO) test $(GOFLAGS) -run=$(TESTS) -test.v -test.timeout=180s ./store || exit 1 $(GO) test $(GOFLAGS) -run=$(TESTS) -test.v -test.timeout=120s ./utils || exit 1 $(GO) test $(GOFLAGS) -run=$(TESTS) -test.v -test.timeout=120s ./web || exit 1 ifeq ($(BUILD_ENTERPRISE_READY),true) diff --git a/i18n/en.json b/i18n/en.json index 5cc2ec9f68..bfcfe845e7 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -3495,6 +3495,10 @@ "id": "store.sql_user.update.app_error", "translation": "We couldn't update the account" }, + { + "id": "store.sql_user.update.can_not_change_ldap.app_error", + "translation": "Can not change fields set by LDAP" + }, { "id": "store.sql_user.update.email_taken.app_error", "translation": "This email is already taken. Please choose another." diff --git a/store/sql_user_store.go b/store/sql_user_store.go index 636400ce97..9db3783415 100644 --- a/store/sql_user_store.go +++ b/store/sql_user_store.go @@ -136,7 +136,17 @@ func (us SqlUserStore) Update(user *model.User, allowActiveUpdate bool) StoreCha if user.IsOAuthUser() { user.Email = oldUser.Email - } else if !user.IsLDAPUser() && user.Email != oldUser.Email { + } else if user.IsLDAPUser() { + if user.Username != oldUser.Username || + user.FirstName != oldUser.FirstName || + user.LastName != oldUser.LastName || + user.Email != oldUser.Email { + result.Err = model.NewLocAppError("SqlUserStore.Update", "store.sql_user.update.can_not_change_ldap.app_error", nil, "user_id="+user.Id) + storeChannel <- result + close(storeChannel) + return + } + } else if user.Email != oldUser.Email { user.EmailVerified = false } diff --git a/store/sql_user_store_test.go b/store/sql_user_store_test.go index 2d17c5888f..9fed32dc8f 100644 --- a/store/sql_user_store_test.go +++ b/store/sql_user_store_test.go @@ -77,6 +77,12 @@ func TestUserStoreUpdate(t *testing.T) { Must(store.User().Save(u1)) Must(store.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id})) + u2 := &model.User{} + u2.Email = model.NewId() + u2.AuthService = "ldap" + Must(store.User().Save(u2)) + Must(store.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id})) + time.Sleep(100 * time.Millisecond) if err := (<-store.User().Update(u1, false)).Err; err != nil { @@ -92,6 +98,11 @@ func TestUserStoreUpdate(t *testing.T) { if err := (<-store.User().Update(u1, false)).Err; err == nil { t.Fatal("Update should have faile because id change") } + + u2.Email = model.NewId() + if err := (<-store.User().Update(u2, false)).Err; err == nil { + t.Fatal("Update should have failed because you can't modify LDAP fields") + } } func TestUserStoreUpdateLastPingAt(t *testing.T) { diff --git a/utils/config.go b/utils/config.go index 1ae658b16e..9e2776f759 100644 --- a/utils/config.go +++ b/utils/config.go @@ -259,6 +259,7 @@ func getClientConfig(c *model.Config) map[string]string { props["EnableLdap"] = strconv.FormatBool(*c.LdapSettings.Enable) props["LdapLoginFieldName"] = *c.LdapSettings.LoginFieldName props["LdapPasswordFieldName"] = *c.LdapSettings.PasswordFieldName + props["NicknameAttributeSet"] = strconv.FormatBool(*c.LdapSettings.NicknameAttribute != "") } if *License.Features.MFA { diff --git a/webapp/components/user_settings/user_settings_general.jsx b/webapp/components/user_settings/user_settings_general.jsx index abf5ca7a9c..718ad5ed83 100644 --- a/webapp/components/user_settings/user_settings_general.jsx +++ b/webapp/components/user_settings/user_settings_general.jsx @@ -513,85 +513,100 @@ class UserSettingsGeneralTab extends React.Component { const inputs = []; if (this.props.activeSection === 'name') { - inputs.push( -