Этот коммит содержится в:
Christopher Speller
2016-05-16 07:54:38 -04:00
родитель 6363fc5b7f 9d94869cc6
Коммит dcba917d60
8 изменённых файлов: 64 добавлений и 3 удалений

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

@@ -127,7 +127,7 @@ func checkUserNotDisabled(user *model.User) *model.AppError {
} }
func authenticateUser(user *model.User, password, mfaToken string) (*model.User, *model.AppError) { func authenticateUser(user *model.User, password, mfaToken string) (*model.User, *model.AppError) {
ldapAvailable := *utils.Cfg.LdapSettings.Enable && einterfaces.GetLdapInterface() != nil ldapAvailable := *utils.Cfg.LdapSettings.Enable && einterfaces.GetLdapInterface() != nil && utils.IsLicensed && *utils.License.Features.LDAP
if user.AuthService == model.USER_AUTH_SERVICE_LDAP { if user.AuthService == model.USER_AUTH_SERVICE_LDAP {
if !ldapAvailable { if !ldapAvailable {

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

@@ -266,6 +266,10 @@ func JoinUserToTeam(team *model.Team, user *model.User) *model.AppError {
return tmr.Err return tmr.Err
} }
if uua := <-Srv.Store.User().UpdateUpdateAt(user.Id); uua.Err != nil {
return uua.Err
}
// Soft error if there is an issue joining the default channels // Soft error if there is an issue joining the default channels
if err := JoinDefaultChannels(team.Id, user, channelRole); err != nil { if err := JoinDefaultChannels(team.Id, user, channelRole); err != nil {
l4g.Error(utils.T("api.user.create_user.joining.error"), user.Id, team.Id, err) l4g.Error(utils.T("api.user.create_user.joining.error"), user.Id, team.Id, err)

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

@@ -487,7 +487,7 @@ func login(c *Context, w http.ResponseWriter, r *http.Request) {
} }
func getUserForLogin(loginId string, onlyLdap bool) (*model.User, *model.AppError) { func getUserForLogin(loginId string, onlyLdap bool) (*model.User, *model.AppError) {
ldapAvailable := *utils.Cfg.LdapSettings.Enable && einterfaces.GetLdapInterface() != nil ldapAvailable := *utils.Cfg.LdapSettings.Enable && einterfaces.GetLdapInterface() != nil && utils.IsLicensed && *utils.License.Features.LDAP
if result := <-Srv.Store.User().GetForLogin( if result := <-Srv.Store.User().GetForLogin(
loginId, loginId,

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

@@ -434,6 +434,8 @@ func incomingWebhook(c *Context, w http.ResponseWriter, r *http.Request) {
IsOAuth: false, IsOAuth: false,
} }
c.TeamId = hook.TeamId
if !c.HasPermissionsToChannel(pchan, "createIncomingHook") && channel.Type != model.CHANNEL_OPEN { if !c.HasPermissionsToChannel(pchan, "createIncomingHook") && channel.Type != model.CHANNEL_OPEN {
c.Err = model.NewLocAppError("incomingWebhook", "web.incoming_webhook.permissions.app_error", nil, "") c.Err = model.NewLocAppError("incomingWebhook", "web.incoming_webhook.permissions.app_error", nil, "")
return return

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

@@ -197,6 +197,27 @@ func (us SqlUserStore) UpdateLastPictureUpdate(userId string) StoreChannel {
return storeChannel return storeChannel
} }
func (us SqlUserStore) UpdateUpdateAt(userId string) StoreChannel {
storeChannel := make(StoreChannel)
go func() {
result := StoreResult{}
curTime := model.GetMillis()
if _, err := us.GetMaster().Exec("UPDATE Users SET UpdateAt = :Time WHERE Id = :UserId", map[string]interface{}{"Time": curTime, "UserId": userId}); err != nil {
result.Err = model.NewLocAppError("SqlUserStore.UpdateUpdateAt", "store.sql_user.update_update.app_error", nil, "user_id="+userId)
} else {
result.Data = userId
}
storeChannel <- result
close(storeChannel)
}()
return storeChannel
}
func (us SqlUserStore) UpdateLastPingAt(userId string, time int64) StoreChannel { func (us SqlUserStore) UpdateLastPingAt(userId string, time int64) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)
@@ -461,7 +482,7 @@ func (s SqlUserStore) GetEtagForDirectProfiles(userId string) StoreChannel {
WHERE WHERE
UserId = :UserId UserId = :UserId
AND Category = 'direct_channel_show') AND Category = 'direct_channel_show')
ORDER BY UpdateAt DESC ORDER BY UpdateAt DESC LIMIT 1
`, map[string]interface{}{"UserId": userId}) `, map[string]interface{}{"UserId": userId})
if err != nil { if err != nil {
result.Data = fmt.Sprintf("%v.%v", model.CurrentVersion, model.GetMillis()) result.Data = fmt.Sprintf("%v.%v", model.CurrentVersion, model.GetMillis())

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

@@ -105,6 +105,30 @@ func TestUserStoreUpdate(t *testing.T) {
} }
} }
func TestUserStoreUpdateUpdateAt(t *testing.T) {
Setup()
u1 := &model.User{}
u1.Email = model.NewId()
Must(store.User().Save(u1))
Must(store.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}))
time.Sleep(10 * time.Millisecond)
if err := (<-store.User().UpdateUpdateAt(u1.Id)).Err; err != nil {
t.Fatal(err)
}
if r1 := <-store.User().Get(u1.Id); r1.Err != nil {
t.Fatal(r1.Err)
} else {
if r1.Data.(*model.User).UpdateAt <= u1.UpdateAt {
t.Fatal("UpdateAt not updated correctly")
}
}
}
func TestUserStoreUpdateLastPingAt(t *testing.T) { func TestUserStoreUpdateLastPingAt(t *testing.T) {
Setup() Setup()

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

@@ -122,6 +122,7 @@ type UserStore interface {
Save(user *model.User) StoreChannel Save(user *model.User) StoreChannel
Update(user *model.User, allowRoleUpdate bool) StoreChannel Update(user *model.User, allowRoleUpdate bool) StoreChannel
UpdateLastPictureUpdate(userId string) StoreChannel UpdateLastPictureUpdate(userId string) StoreChannel
UpdateUpdateAt(userId string) StoreChannel
UpdateLastPingAt(userId string, time int64) StoreChannel UpdateLastPingAt(userId string, time int64) StoreChannel
UpdateLastActivityAt(userId string, time int64) StoreChannel UpdateLastActivityAt(userId string, time int64) StoreChannel
UpdateUserAndSessionActivity(userId string, sessionId string, time int64) StoreChannel UpdateUserAndSessionActivity(userId string, sessionId string, time int64) StoreChannel

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

@@ -43,6 +43,15 @@ class FilteredUserList extends React.Component {
}; };
} }
componentWillUpdate(nextProps) {
// assume the user list is immutable
if (this.props.users !== nextProps.users) {
this.setState({
users: this.filterUsers(nextProps.teamMembers, nextProps.users)
});
}
}
componentDidUpdate(prevProps, prevState) { componentDidUpdate(prevProps, prevState) {
if (prevState.filter !== this.state.filter) { if (prevState.filter !== this.state.filter) {
$(ReactDOM.findDOMNode(this.refs.userList)).scrollTop(0); $(ReactDOM.findDOMNode(this.refs.userList)).scrollTop(0);