From 9c76d9ba0031ee4175db6960024d61c23cc98659 Mon Sep 17 00:00:00 2001 From: Joram Wilander Date: Wed, 29 Aug 2018 14:07:27 -0400 Subject: Add GetLDAPUserAttributes method to the plugin API (#9326) --- app/plugin_api.go | 16 ++++++++++++++++ plugin/api.go | 6 ++++++ plugin/client_rpc_generated.go | 30 ++++++++++++++++++++++++++++++ plugin/plugintest/api.go | 25 +++++++++++++++++++++++++ 4 files changed, 77 insertions(+) diff --git a/app/plugin_api.go b/app/plugin_api.go index 503feabee..20a27316f 100644 --- a/app/plugin_api.go +++ b/app/plugin_api.go @@ -184,6 +184,22 @@ func (api *PluginAPI) UpdateUserStatus(userId, status string) (*model.Status, *m return api.app.GetStatus(userId) } +func (api *PluginAPI) GetLDAPUserAttributes(userId string, attributes []string) (map[string]string, *model.AppError) { + if api.app.Ldap == nil { + return nil, model.NewAppError("GetLdapUserAttributes", "ent.ldap.disabled.app_error", nil, "", http.StatusNotImplemented) + } + + user, err := api.app.GetUser(userId) + if err != nil { + return nil, err + } + + if user.AuthService != model.USER_AUTH_SERVICE_LDAP || user.AuthData == nil { + return map[string]string{}, nil + } + + return api.app.Ldap.GetUserAttributes(*user.AuthData, attributes) +} func (api *PluginAPI) CreateChannel(channel *model.Channel) (*model.Channel, *model.AppError) { return api.app.CreateChannel(channel, false) diff --git a/plugin/api.go b/plugin/api.go index 370c28268..2f8c6dcc5 100644 --- a/plugin/api.go +++ b/plugin/api.go @@ -62,6 +62,12 @@ type API interface { // The status parameter can be: "online", "away", "dnd", or "offline". UpdateUserStatus(userId, status string) (*model.Status, *model.AppError) + // GetLDAPUserAttributes will return LDAP attributes for a user. + // The attributes parameter should be a list of attributes to pull. + // Returns a map with attribute names as keys and the user's attributes as values. + // Requires an enterprise license, LDAP to be configured and for the user to use LDAP as an authentication method. + GetLDAPUserAttributes(userId string, attributes []string) (map[string]string, *model.AppError) + // CreateTeam creates a team. CreateTeam(team *model.Team) (*model.Team, *model.AppError) diff --git a/plugin/client_rpc_generated.go b/plugin/client_rpc_generated.go index ab41c66d9..d0d576f8d 100644 --- a/plugin/client_rpc_generated.go +++ b/plugin/client_rpc_generated.go @@ -903,6 +903,36 @@ func (s *apiRPCServer) UpdateUserStatus(args *Z_UpdateUserStatusArgs, returns *Z return nil } +type Z_GetLDAPUserAttributesArgs struct { + A string + B []string +} + +type Z_GetLDAPUserAttributesReturns struct { + A map[string]string + B *model.AppError +} + +func (g *apiRPCClient) GetLDAPUserAttributes(userId string, attributes []string) (map[string]string, *model.AppError) { + _args := &Z_GetLDAPUserAttributesArgs{userId, attributes} + _returns := &Z_GetLDAPUserAttributesReturns{} + if err := g.client.Call("Plugin.GetLDAPUserAttributes", _args, _returns); err != nil { + log.Printf("RPC call to GetLDAPUserAttributes API failed: %s", err.Error()) + } + return _returns.A, _returns.B +} + +func (s *apiRPCServer) GetLDAPUserAttributes(args *Z_GetLDAPUserAttributesArgs, returns *Z_GetLDAPUserAttributesReturns) error { + if hook, ok := s.impl.(interface { + GetLDAPUserAttributes(userId string, attributes []string) (map[string]string, *model.AppError) + }); ok { + returns.A, returns.B = hook.GetLDAPUserAttributes(args.A, args.B) + } else { + return fmt.Errorf("API GetLDAPUserAttributes called but not implemented.") + } + return nil +} + type Z_CreateTeamArgs struct { A *model.Team } diff --git a/plugin/plugintest/api.go b/plugin/plugintest/api.go index e84ceffd8..32fab3595 100644 --- a/plugin/plugintest/api.go +++ b/plugin/plugintest/api.go @@ -524,6 +524,31 @@ func (_m *API) GetGroupChannel(userIds []string) (*model.Channel, *model.AppErro return r0, r1 } +// GetLDAPUserAttributes provides a mock function with given fields: userId, attributes +func (_m *API) GetLDAPUserAttributes(userId string, attributes []string) (map[string]string, *model.AppError) { + ret := _m.Called(userId, attributes) + + var r0 map[string]string + if rf, ok := ret.Get(0).(func(string, []string) map[string]string); ok { + r0 = rf(userId, attributes) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[string]string) + } + } + + var r1 *model.AppError + if rf, ok := ret.Get(1).(func(string, []string) *model.AppError); ok { + r1 = rf(userId, attributes) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*model.AppError) + } + } + + return r0, r1 +} + // GetPost provides a mock function with given fields: postId func (_m *API) GetPost(postId string) (*model.Post, *model.AppError) { ret := _m.Called(postId) -- cgit v1.2.3-1-g7c22