Fixing LDAP editing of attributes (#2824)

Этот коммит содержится в:
Christopher Speller
2016-05-02 08:07:58 -04:00
родитель 3346a9a63a
Коммит c63e027aec
6 изменённых файлов: 210 добавлений и 139 удалений

Просмотреть файл

@@ -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=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=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 ./utils || exit 1
$(GO) test $(GOFLAGS) -run=$(TESTS) -test.v -test.timeout=120s ./web || exit 1 $(GO) test $(GOFLAGS) -run=$(TESTS) -test.v -test.timeout=120s ./web || exit 1
ifeq ($(BUILD_ENTERPRISE_READY),true) ifeq ($(BUILD_ENTERPRISE_READY),true)

Просмотреть файл

@@ -3495,6 +3495,10 @@
"id": "store.sql_user.update.app_error", "id": "store.sql_user.update.app_error",
"translation": "We couldn't update the account" "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", "id": "store.sql_user.update.email_taken.app_error",
"translation": "This email is already taken. Please choose another." "translation": "This email is already taken. Please choose another."

Просмотреть файл

@@ -136,7 +136,17 @@ func (us SqlUserStore) Update(user *model.User, allowActiveUpdate bool) StoreCha
if user.IsOAuthUser() { if user.IsOAuthUser() {
user.Email = oldUser.Email 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 user.EmailVerified = false
} }

Просмотреть файл

@@ -77,6 +77,12 @@ func TestUserStoreUpdate(t *testing.T) {
Must(store.User().Save(u1)) Must(store.User().Save(u1))
Must(store.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id})) 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) time.Sleep(100 * time.Millisecond)
if err := (<-store.User().Update(u1, false)).Err; err != nil { 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 { if err := (<-store.User().Update(u1, false)).Err; err == nil {
t.Fatal("Update should have faile because id change") 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) { func TestUserStoreUpdateLastPingAt(t *testing.T) {

Просмотреть файл

@@ -259,6 +259,7 @@ func getClientConfig(c *model.Config) map[string]string {
props["EnableLdap"] = strconv.FormatBool(*c.LdapSettings.Enable) props["EnableLdap"] = strconv.FormatBool(*c.LdapSettings.Enable)
props["LdapLoginFieldName"] = *c.LdapSettings.LoginFieldName props["LdapLoginFieldName"] = *c.LdapSettings.LoginFieldName
props["LdapPasswordFieldName"] = *c.LdapSettings.PasswordFieldName props["LdapPasswordFieldName"] = *c.LdapSettings.PasswordFieldName
props["NicknameAttributeSet"] = strconv.FormatBool(*c.LdapSettings.NicknameAttribute != "")
} }
if *License.Features.MFA { if *License.Features.MFA {

Просмотреть файл

@@ -513,6 +513,9 @@ class UserSettingsGeneralTab extends React.Component {
const inputs = []; const inputs = [];
if (this.props.activeSection === 'name') { if (this.props.activeSection === 'name') {
let extraInfo;
let submit = null;
if (this.props.user.auth_service === '') {
inputs.push( inputs.push(
<div <div
key='firstNameSetting' key='firstNameSetting'
@@ -575,7 +578,7 @@ class UserSettingsGeneralTab extends React.Component {
</a> </a>
); );
const extraInfo = ( extraInfo = (
<span> <span>
<FormattedMessage <FormattedMessage
id='user.settings.general.notificationsExtra' id='user.settings.general.notificationsExtra'
@@ -587,11 +590,23 @@ class UserSettingsGeneralTab extends React.Component {
</span> </span>
); );
submit = this.submitName;
} else {
extraInfo = (
<span>
<FormattedMessage
id='user.settings.general.field_handled_externally'
defaultMessage='This field is handled through your login provider. If you want to change it, you need to do so though your login provider.'
/>
</span>
);
}
nameSection = ( nameSection = (
<SettingItemMax <SettingItemMax
title={formatMessage(holders.fullName)} title={formatMessage(holders.fullName)}
inputs={inputs} inputs={inputs}
submit={this.submitName} submit={submit}
server_error={serverError} server_error={serverError}
client_error={clientError} client_error={clientError}
updateSection={(e) => { updateSection={(e) => {
@@ -632,6 +647,18 @@ class UserSettingsGeneralTab extends React.Component {
let nicknameSection; let nicknameSection;
if (this.props.activeSection === 'nickname') { if (this.props.activeSection === 'nickname') {
let extraInfo;
let submit = null;
if (this.props.user.auth_service === 'ldap' && global.window.mm_config.NicknameAttributeSet) {
extraInfo = (
<span>
<FormattedMessage
id='user.settings.general.field_handled_externally'
defaultMessage='This field is handled through your login provider. If you want to change it, you need to do so though your login provider.'
/>
</span>
);
} else {
let nicknameLabel = ( let nicknameLabel = (
<FormattedMessage <FormattedMessage
id='user.settings.general.nickname' id='user.settings.general.nickname'
@@ -659,7 +686,7 @@ class UserSettingsGeneralTab extends React.Component {
</div> </div>
); );
const extraInfo = ( extraInfo = (
<span> <span>
<FormattedMessage <FormattedMessage
id='user.settings.general.nicknameExtra' id='user.settings.general.nicknameExtra'
@@ -668,11 +695,14 @@ class UserSettingsGeneralTab extends React.Component {
</span> </span>
); );
submit = this.submitNickname;
}
nicknameSection = ( nicknameSection = (
<SettingItemMax <SettingItemMax
title={formatMessage(holders.nickname)} title={formatMessage(holders.nickname)}
inputs={inputs} inputs={inputs}
submit={this.submitNickname} submit={submit}
server_error={serverError} server_error={serverError}
client_error={clientError} client_error={clientError}
updateSection={(e) => { updateSection={(e) => {
@@ -708,6 +738,9 @@ class UserSettingsGeneralTab extends React.Component {
let usernameSection; let usernameSection;
if (this.props.activeSection === 'username') { if (this.props.activeSection === 'username') {
let extraInfo;
let submit = null;
if (this.props.user.auth_service === '') {
let usernameLabel = ( let usernameLabel = (
<FormattedMessage <FormattedMessage
id='user.settings.general.username' id='user.settings.general.username'
@@ -736,7 +769,7 @@ class UserSettingsGeneralTab extends React.Component {
</div> </div>
); );
const extraInfo = ( extraInfo = (
<span> <span>
<FormattedMessage <FormattedMessage
id='user.settings.general.usernameInfo' id='user.settings.general.usernameInfo'
@@ -745,11 +778,23 @@ class UserSettingsGeneralTab extends React.Component {
</span> </span>
); );
submit = this.submitUsername;
} else {
extraInfo = (
<span>
<FormattedMessage
id='user.settings.general.field_handled_externally'
defaultMessage='This field is handled through your login provider. If you want to change it, you need to do so though your login provider.'
/>
</span>
);
}
usernameSection = ( usernameSection = (
<SettingItemMax <SettingItemMax
title={formatMessage(holders.username)} title={formatMessage(holders.username)}
inputs={inputs} inputs={inputs}
submit={this.submitUsername} submit={submit}
server_error={serverError} server_error={serverError}
client_error={clientError} client_error={clientError}
updateSection={(e) => { updateSection={(e) => {