mirror of
https://github.com/mattermost/mattermost.git
synced 2025-02-25 18:55:24 -06:00
* add CUD support for channel members via plugins This effectively exposes AddChannelMember, UpdateChannelMemberRoles, UpdateChannelMemberNotifyProps and LeaveChannel via the plugin API. It also modifies the semantics of AddChannelMember to explicitly allow for an empty user requestor, left as such for now via the plugin API. * change the signature of AddChannelMember to accept a channel id instead of a channel
299 lines
8.8 KiB
Go
299 lines
8.8 KiB
Go
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
|
|
// See License.txt for license information.
|
|
|
|
package app
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/gorilla/mux"
|
|
"github.com/mattermost/mattermost-server/model"
|
|
"github.com/mattermost/mattermost-server/utils"
|
|
|
|
"github.com/mattermost/mattermost-server/plugin"
|
|
)
|
|
|
|
type PluginAPI struct {
|
|
id string
|
|
app *App
|
|
keyValueStore *PluginKeyValueStore
|
|
}
|
|
|
|
type PluginKeyValueStore struct {
|
|
id string
|
|
app *App
|
|
}
|
|
|
|
func (api *PluginAPI) LoadPluginConfiguration(dest interface{}) error {
|
|
if b, err := json.Marshal(api.app.Config().PluginSettings.Plugins[api.id]); err != nil {
|
|
return err
|
|
} else {
|
|
return json.Unmarshal(b, dest)
|
|
}
|
|
}
|
|
|
|
func (api *PluginAPI) RegisterCommand(command *model.Command) error {
|
|
return api.app.RegisterPluginCommand(api.id, command)
|
|
}
|
|
|
|
func (api *PluginAPI) UnregisterCommand(teamId, trigger string) error {
|
|
api.app.UnregisterPluginCommand(api.id, teamId, trigger)
|
|
return nil
|
|
}
|
|
|
|
func (api *PluginAPI) CreateTeam(team *model.Team) (*model.Team, *model.AppError) {
|
|
return api.app.CreateTeam(team)
|
|
}
|
|
|
|
func (api *PluginAPI) DeleteTeam(teamId string) *model.AppError {
|
|
return api.app.SoftDeleteTeam(teamId)
|
|
}
|
|
|
|
func (api *PluginAPI) GetTeam(teamId string) (*model.Team, *model.AppError) {
|
|
return api.app.GetTeam(teamId)
|
|
}
|
|
|
|
func (api *PluginAPI) GetTeamByName(name string) (*model.Team, *model.AppError) {
|
|
return api.app.GetTeamByName(name)
|
|
}
|
|
|
|
func (api *PluginAPI) UpdateTeam(team *model.Team) (*model.Team, *model.AppError) {
|
|
return api.app.UpdateTeam(team)
|
|
}
|
|
|
|
func (api *PluginAPI) CreateUser(user *model.User) (*model.User, *model.AppError) {
|
|
return api.app.CreateUser(user)
|
|
}
|
|
|
|
func (api *PluginAPI) DeleteUser(userId string) *model.AppError {
|
|
user, err := api.app.GetUser(userId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = api.app.UpdateActive(user, false)
|
|
return err
|
|
}
|
|
|
|
func (api *PluginAPI) GetUser(userId string) (*model.User, *model.AppError) {
|
|
return api.app.GetUser(userId)
|
|
}
|
|
|
|
func (api *PluginAPI) GetUserByEmail(email string) (*model.User, *model.AppError) {
|
|
return api.app.GetUserByEmail(email)
|
|
}
|
|
|
|
func (api *PluginAPI) GetUserByUsername(name string) (*model.User, *model.AppError) {
|
|
return api.app.GetUserByUsername(name)
|
|
}
|
|
|
|
func (api *PluginAPI) UpdateUser(user *model.User) (*model.User, *model.AppError) {
|
|
return api.app.UpdateUser(user, true)
|
|
}
|
|
|
|
func (api *PluginAPI) CreateChannel(channel *model.Channel) (*model.Channel, *model.AppError) {
|
|
return api.app.CreateChannel(channel, false)
|
|
}
|
|
|
|
func (api *PluginAPI) DeleteChannel(channelId string) *model.AppError {
|
|
channel, err := api.app.GetChannel(channelId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return api.app.DeleteChannel(channel, "")
|
|
}
|
|
|
|
func (api *PluginAPI) GetChannel(channelId string) (*model.Channel, *model.AppError) {
|
|
return api.app.GetChannel(channelId)
|
|
}
|
|
|
|
func (api *PluginAPI) GetChannelByName(name, teamId string) (*model.Channel, *model.AppError) {
|
|
return api.app.GetChannelByName(name, teamId)
|
|
}
|
|
|
|
func (api *PluginAPI) GetDirectChannel(userId1, userId2 string) (*model.Channel, *model.AppError) {
|
|
return api.app.GetDirectChannel(userId1, userId2)
|
|
}
|
|
|
|
func (api *PluginAPI) GetGroupChannel(userIds []string) (*model.Channel, *model.AppError) {
|
|
return api.app.CreateGroupChannel(userIds, "")
|
|
}
|
|
|
|
func (api *PluginAPI) UpdateChannel(channel *model.Channel) (*model.Channel, *model.AppError) {
|
|
return api.app.UpdateChannel(channel)
|
|
}
|
|
|
|
func (api *PluginAPI) AddChannelMember(channelId, userId string) (*model.ChannelMember, *model.AppError) {
|
|
// For now, don't allow overriding these via the plugin API.
|
|
userRequestorId := ""
|
|
postRootId := ""
|
|
|
|
channel, err := api.GetChannel(channelId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return api.app.AddChannelMember(userId, channel, userRequestorId, postRootId)
|
|
}
|
|
|
|
func (api *PluginAPI) GetChannelMember(channelId, userId string) (*model.ChannelMember, *model.AppError) {
|
|
return api.app.GetChannelMember(channelId, userId)
|
|
}
|
|
|
|
func (api *PluginAPI) UpdateChannelMemberRoles(channelId, userId, newRoles string) (*model.ChannelMember, *model.AppError) {
|
|
return api.app.UpdateChannelMemberRoles(channelId, userId, newRoles)
|
|
}
|
|
|
|
func (api *PluginAPI) UpdateChannelMemberNotifications(channelId, userId string, notifications map[string]string) (*model.ChannelMember, *model.AppError) {
|
|
return api.app.UpdateChannelMemberNotifyProps(notifications, channelId, userId)
|
|
}
|
|
|
|
func (api *PluginAPI) DeleteChannelMember(channelId, userId string) *model.AppError {
|
|
return api.app.LeaveChannel(channelId, userId)
|
|
}
|
|
|
|
func (api *PluginAPI) CreatePost(post *model.Post) (*model.Post, *model.AppError) {
|
|
return api.app.CreatePostMissingChannel(post, true)
|
|
}
|
|
|
|
func (api *PluginAPI) DeletePost(postId string) *model.AppError {
|
|
_, err := api.app.DeletePost(postId)
|
|
return err
|
|
}
|
|
|
|
func (api *PluginAPI) GetPost(postId string) (*model.Post, *model.AppError) {
|
|
return api.app.GetSinglePost(postId)
|
|
}
|
|
|
|
func (api *PluginAPI) UpdatePost(post *model.Post) (*model.Post, *model.AppError) {
|
|
return api.app.UpdatePost(post, false)
|
|
}
|
|
|
|
func (api *PluginAPI) KeyValueStore() plugin.KeyValueStore {
|
|
return api.keyValueStore
|
|
}
|
|
|
|
func (s *PluginKeyValueStore) Set(key string, value []byte) *model.AppError {
|
|
return s.app.SetPluginKey(s.id, key, value)
|
|
}
|
|
|
|
func (s *PluginKeyValueStore) Get(key string) ([]byte, *model.AppError) {
|
|
return s.app.GetPluginKey(s.id, key)
|
|
}
|
|
|
|
func (s *PluginKeyValueStore) Delete(key string) *model.AppError {
|
|
return s.app.DeletePluginKey(s.id, key)
|
|
}
|
|
|
|
type BuiltInPluginAPI struct {
|
|
id string
|
|
router *mux.Router
|
|
app *App
|
|
}
|
|
|
|
func (api *BuiltInPluginAPI) LoadPluginConfiguration(dest interface{}) error {
|
|
if b, err := json.Marshal(api.app.Config().PluginSettings.Plugins[api.id]); err != nil {
|
|
return err
|
|
} else {
|
|
return json.Unmarshal(b, dest)
|
|
}
|
|
}
|
|
|
|
func (api *BuiltInPluginAPI) PluginRouter() *mux.Router {
|
|
return api.router
|
|
}
|
|
|
|
func (api *BuiltInPluginAPI) GetTeamByName(name string) (*model.Team, *model.AppError) {
|
|
return api.app.GetTeamByName(name)
|
|
}
|
|
|
|
func (api *BuiltInPluginAPI) GetUserByName(name string) (*model.User, *model.AppError) {
|
|
return api.app.GetUserByUsername(name)
|
|
}
|
|
|
|
func (api *BuiltInPluginAPI) GetChannelByName(teamId, name string) (*model.Channel, *model.AppError) {
|
|
return api.app.GetChannelByName(name, teamId)
|
|
}
|
|
|
|
func (api *BuiltInPluginAPI) GetDirectChannel(userId1, userId2 string) (*model.Channel, *model.AppError) {
|
|
return api.app.GetDirectChannel(userId1, userId2)
|
|
}
|
|
|
|
func (api *BuiltInPluginAPI) CreatePost(post *model.Post) (*model.Post, *model.AppError) {
|
|
return api.app.CreatePostMissingChannel(post, true)
|
|
}
|
|
|
|
func (api *BuiltInPluginAPI) 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.AuthData == nil {
|
|
return map[string]string{}, nil
|
|
}
|
|
|
|
return api.app.Ldap.GetUserAttributes(*user.AuthData, attributes)
|
|
}
|
|
|
|
func (api *BuiltInPluginAPI) GetSessionFromRequest(r *http.Request) (*model.Session, *model.AppError) {
|
|
token := ""
|
|
isTokenFromQueryString := false
|
|
|
|
// Attempt to parse token out of the header
|
|
authHeader := r.Header.Get(model.HEADER_AUTH)
|
|
if len(authHeader) > 6 && strings.ToUpper(authHeader[0:6]) == model.HEADER_BEARER {
|
|
// Default session token
|
|
token = authHeader[7:]
|
|
|
|
} else if len(authHeader) > 5 && strings.ToLower(authHeader[0:5]) == model.HEADER_TOKEN {
|
|
// OAuth token
|
|
token = authHeader[6:]
|
|
}
|
|
|
|
// Attempt to parse the token from the cookie
|
|
if len(token) == 0 {
|
|
if cookie, err := r.Cookie(model.SESSION_COOKIE_TOKEN); err == nil {
|
|
token = cookie.Value
|
|
|
|
if r.Header.Get(model.HEADER_REQUESTED_WITH) != model.HEADER_REQUESTED_WITH_XML {
|
|
return nil, model.NewAppError("ServeHTTP", "api.context.session_expired.app_error", nil, "token="+token+" Appears to be a CSRF attempt", http.StatusUnauthorized)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Attempt to parse token out of the query string
|
|
if len(token) == 0 {
|
|
token = r.URL.Query().Get("access_token")
|
|
isTokenFromQueryString = true
|
|
}
|
|
|
|
if len(token) == 0 {
|
|
return nil, model.NewAppError("ServeHTTP", "api.context.session_expired.app_error", nil, "token="+token, http.StatusUnauthorized)
|
|
}
|
|
|
|
session, err := api.app.GetSession(token)
|
|
|
|
if err != nil {
|
|
return nil, model.NewAppError("ServeHTTP", "api.context.session_expired.app_error", nil, "token="+token, http.StatusUnauthorized)
|
|
} else if !session.IsOAuth && isTokenFromQueryString {
|
|
return nil, model.NewAppError("ServeHTTP", "api.context.token_provided.app_error", nil, "token="+token, http.StatusUnauthorized)
|
|
}
|
|
|
|
return session, nil
|
|
}
|
|
|
|
func (api *BuiltInPluginAPI) I18n(id string, r *http.Request) string {
|
|
if r != nil {
|
|
f, _ := utils.GetTranslationsAndLocale(nil, r)
|
|
return f(id)
|
|
}
|
|
f, _ := utils.GetTranslationsBySystemLocale()
|
|
return f(id)
|
|
}
|