[MM-16751] golint model (#17896)
Этот коммит содержится в:
коммит произвёл
Claudio Costa
родитель
953eebdef4
Коммит
97ccf0bdf6
@@ -10,9 +10,9 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
ACCESS_TOKEN_GRANT_TYPE = "authorization_code"
|
||||
ACCESS_TOKEN_TYPE = "bearer"
|
||||
REFRESH_TOKEN_GRANT_TYPE = "refresh_token"
|
||||
AccessTokenGrantType = "authorization_code"
|
||||
AccessTokenType = "bearer"
|
||||
RefreshTokenGrantType = "refresh_token"
|
||||
)
|
||||
|
||||
type AccessData struct {
|
||||
|
||||
@@ -10,10 +10,10 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
AUTHCODE_EXPIRE_TIME = 60 * 10 // 10 minutes
|
||||
AUTHCODE_RESPONSE_TYPE = "code"
|
||||
IMPLICIT_RESPONSE_TYPE = "token"
|
||||
DEFAULT_SCOPE = "user"
|
||||
AuthCodeExpireTime = 60 * 10 // 10 minutes
|
||||
AuthCodeResponseType = "code"
|
||||
ImplicitResponseType = "token"
|
||||
DefaultScope = "user"
|
||||
)
|
||||
|
||||
type AuthData struct {
|
||||
@@ -103,7 +103,7 @@ func (ar *AuthorizeRequest) IsValid() *AppError {
|
||||
|
||||
func (ad *AuthData) PreSave() {
|
||||
if ad.ExpiresIn == 0 {
|
||||
ad.ExpiresIn = AUTHCODE_EXPIRE_TIME
|
||||
ad.ExpiresIn = AuthCodeExpireTime
|
||||
}
|
||||
|
||||
if ad.CreateAt == 0 {
|
||||
@@ -111,7 +111,7 @@ func (ad *AuthData) PreSave() {
|
||||
}
|
||||
|
||||
if ad.Scope == "" {
|
||||
ad.Scope = DEFAULT_SCOPE
|
||||
ad.Scope = DefaultScope
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
22
model/bot.go
22
model/bot.go
@@ -13,11 +13,11 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
BOT_DISPLAY_NAME_MAX_RUNES = USER_FIRST_NAME_MAX_RUNES
|
||||
BOT_DESCRIPTION_MAX_RUNES = 1024
|
||||
BOT_CREATOR_ID_MAX_RUNES = KEY_VALUE_PLUGIN_ID_MAX_RUNES // UserId or PluginId
|
||||
BOT_WARN_METRIC_BOT_USERNAME = "mattermost-advisor"
|
||||
BOT_SYSTEM_BOT_USERNAME = "system-bot"
|
||||
BotDisplayNameMaxRunes = UserFirstNameMaxRunes
|
||||
BotDescriptionMaxRunes = 1024
|
||||
BotCreatorIdMaxRunes = KeyValuePluginIdMaxRunes // UserId or PluginId
|
||||
BotWarnMetricBotUsername = "mattermost-advisor"
|
||||
BotSystemBotUsername = "system-bot"
|
||||
)
|
||||
|
||||
// Bot is a special type of User meant for programmatic interactions.
|
||||
@@ -75,15 +75,15 @@ func (b *Bot) IsValid() *AppError {
|
||||
return NewAppError("Bot.IsValid", "model.bot.is_valid.username.app_error", b.Trace(), "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(b.DisplayName) > BOT_DISPLAY_NAME_MAX_RUNES {
|
||||
if utf8.RuneCountInString(b.DisplayName) > BotDisplayNameMaxRunes {
|
||||
return NewAppError("Bot.IsValid", "model.bot.is_valid.user_id.app_error", b.Trace(), "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(b.Description) > BOT_DESCRIPTION_MAX_RUNES {
|
||||
if utf8.RuneCountInString(b.Description) > BotDescriptionMaxRunes {
|
||||
return NewAppError("Bot.IsValid", "model.bot.is_valid.description.app_error", b.Trace(), "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if b.OwnerId == "" || utf8.RuneCountInString(b.OwnerId) > BOT_CREATOR_ID_MAX_RUNES {
|
||||
if b.OwnerId == "" || utf8.RuneCountInString(b.OwnerId) > BotCreatorIdMaxRunes {
|
||||
return NewAppError("Bot.IsValid", "model.bot.is_valid.creator_id.app_error", b.Trace(), "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
@@ -191,7 +191,7 @@ func UserFromBot(b *Bot) *User {
|
||||
Username: b.Username,
|
||||
Email: NormalizeEmail(fmt.Sprintf("%s@localhost", b.Username)),
|
||||
FirstName: b.DisplayName,
|
||||
Roles: SYSTEM_USER_ROLE_ID,
|
||||
Roles: SystemUserRoleId,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,7 +201,7 @@ func BotFromUser(u *User) *Bot {
|
||||
OwnerId: u.Id,
|
||||
UserId: u.Id,
|
||||
Username: u.Username,
|
||||
DisplayName: u.GetDisplayName(SHOW_USERNAME),
|
||||
DisplayName: u.GetDisplayName(ShowUsername),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -242,7 +242,7 @@ func MakeBotNotFoundError(userId string) *AppError {
|
||||
}
|
||||
|
||||
func IsBotDMChannel(channel *Channel, botUserID string) bool {
|
||||
if channel.Type != CHANNEL_DIRECT {
|
||||
if channel.Type != ChannelTypeDirect {
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
@@ -762,14 +762,14 @@ func TestIsBotChannel(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
Name: "not a direct channel",
|
||||
Channel: &Channel{Type: CHANNEL_OPEN},
|
||||
Channel: &Channel{Type: ChannelTypeOpen},
|
||||
Expected: false,
|
||||
},
|
||||
{
|
||||
Name: "a direct channel with another user",
|
||||
Channel: &Channel{
|
||||
Name: "user1__user2",
|
||||
Type: CHANNEL_DIRECT,
|
||||
Type: ChannelTypeDirect,
|
||||
},
|
||||
Expected: false,
|
||||
},
|
||||
@@ -777,7 +777,7 @@ func TestIsBotChannel(t *testing.T) {
|
||||
Name: "a direct channel with the name containing the bot's ID first",
|
||||
Channel: &Channel{
|
||||
Name: "botUserID__user2",
|
||||
Type: CHANNEL_DIRECT,
|
||||
Type: ChannelTypeDirect,
|
||||
},
|
||||
Expected: true,
|
||||
},
|
||||
@@ -785,7 +785,7 @@ func TestIsBotChannel(t *testing.T) {
|
||||
Name: "a direct channel with the name containing the bot's ID second",
|
||||
Channel: &Channel{
|
||||
Name: "user1__botUserID",
|
||||
Type: CHANNEL_DIRECT,
|
||||
Type: ChannelTypeDirect,
|
||||
},
|
||||
Expected: true,
|
||||
},
|
||||
|
||||
@@ -15,22 +15,23 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
CHANNEL_OPEN = "O"
|
||||
CHANNEL_PRIVATE = "P"
|
||||
CHANNEL_DIRECT = "D"
|
||||
CHANNEL_GROUP = "G"
|
||||
CHANNEL_GROUP_MAX_USERS = 8
|
||||
CHANNEL_GROUP_MIN_USERS = 3
|
||||
DEFAULT_CHANNEL = "town-square"
|
||||
CHANNEL_DISPLAY_NAME_MAX_RUNES = 64
|
||||
CHANNEL_NAME_MIN_LENGTH = 2
|
||||
CHANNEL_NAME_MAX_LENGTH = 64
|
||||
CHANNEL_HEADER_MAX_RUNES = 1024
|
||||
CHANNEL_PURPOSE_MAX_RUNES = 250
|
||||
CHANNEL_CACHE_SIZE = 25000
|
||||
ChannelTypeOpen = "O"
|
||||
ChannelTypePrivate = "P"
|
||||
ChannelTypeDirect = "D"
|
||||
ChannelTypeGroup = "G"
|
||||
|
||||
CHANNEL_SORT_BY_USERNAME = "username"
|
||||
CHANNEL_SORT_BY_STATUS = "status"
|
||||
ChannelGroupMaxUsers = 8
|
||||
ChannelGroupMinUsers = 3
|
||||
DefaultChannelName = "town-square"
|
||||
ChannelDisplayNameMaxRunes = 64
|
||||
ChannelNameMinLength = 2
|
||||
ChannelNameMaxLength = 64
|
||||
ChannelHeaderMaxRunes = 1024
|
||||
ChannelPurposeMaxRunes = 250
|
||||
ChannelCacheSize = 25000
|
||||
|
||||
ChannelSortByUsername = "username"
|
||||
ChannelSortByStatus = "status"
|
||||
)
|
||||
|
||||
type Channel struct {
|
||||
@@ -230,7 +231,7 @@ func (o *Channel) IsValid() *AppError {
|
||||
return NewAppError("Channel.IsValid", "model.channel.is_valid.update_at.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(o.DisplayName) > CHANNEL_DISPLAY_NAME_MAX_RUNES {
|
||||
if utf8.RuneCountInString(o.DisplayName) > ChannelDisplayNameMaxRunes {
|
||||
return NewAppError("Channel.IsValid", "model.channel.is_valid.display_name.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
@@ -238,15 +239,15 @@ func (o *Channel) IsValid() *AppError {
|
||||
return NewAppError("Channel.IsValid", "model.channel.is_valid.2_or_more.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if !(o.Type == CHANNEL_OPEN || o.Type == CHANNEL_PRIVATE || o.Type == CHANNEL_DIRECT || o.Type == CHANNEL_GROUP) {
|
||||
if !(o.Type == ChannelTypeOpen || o.Type == ChannelTypePrivate || o.Type == ChannelTypeDirect || o.Type == ChannelTypeGroup) {
|
||||
return NewAppError("Channel.IsValid", "model.channel.is_valid.type.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(o.Header) > CHANNEL_HEADER_MAX_RUNES {
|
||||
if utf8.RuneCountInString(o.Header) > ChannelHeaderMaxRunes {
|
||||
return NewAppError("Channel.IsValid", "model.channel.is_valid.header.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(o.Purpose) > CHANNEL_PURPOSE_MAX_RUNES {
|
||||
if utf8.RuneCountInString(o.Purpose) > ChannelPurposeMaxRunes {
|
||||
return NewAppError("Channel.IsValid", "model.channel.is_valid.purpose.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
@@ -255,7 +256,7 @@ func (o *Channel) IsValid() *AppError {
|
||||
}
|
||||
|
||||
userIds := strings.Split(o.Name, "__")
|
||||
if o.Type != CHANNEL_DIRECT && len(userIds) == 2 && IsValidId(userIds[0]) && IsValidId(userIds[1]) {
|
||||
if o.Type != ChannelTypeDirect && len(userIds) == 2 && IsValidId(userIds[0]) && IsValidId(userIds[1]) {
|
||||
return NewAppError("Channel.IsValid", "model.channel.is_valid.name.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
@@ -282,11 +283,11 @@ func (o *Channel) PreUpdate() {
|
||||
}
|
||||
|
||||
func (o *Channel) IsGroupOrDirect() bool {
|
||||
return o.Type == CHANNEL_DIRECT || o.Type == CHANNEL_GROUP
|
||||
return o.Type == ChannelTypeDirect || o.Type == ChannelTypeGroup
|
||||
}
|
||||
|
||||
func (o *Channel) IsOpen() bool {
|
||||
return o.Type == CHANNEL_OPEN
|
||||
return o.Type == ChannelTypeOpen
|
||||
}
|
||||
|
||||
func (o *Channel) Patch(patch *ChannelPatch) {
|
||||
@@ -332,7 +333,7 @@ func (o *Channel) IsShared() bool {
|
||||
}
|
||||
|
||||
func (o *Channel) GetOtherUserIdForDM(userId string) string {
|
||||
if o.Type != CHANNEL_DIRECT {
|
||||
if o.Type != ChannelTypeDirect {
|
||||
return ""
|
||||
}
|
||||
|
||||
@@ -368,8 +369,8 @@ func GetGroupDisplayNameFromUsers(users []*User, truncate bool) string {
|
||||
|
||||
name := strings.Join(usernames, ", ")
|
||||
|
||||
if truncate && len(name) > CHANNEL_NAME_MAX_LENGTH {
|
||||
name = name[:CHANNEL_NAME_MAX_LENGTH]
|
||||
if truncate && len(name) > ChannelNameMaxLength {
|
||||
name = name[:ChannelNameMaxLength]
|
||||
}
|
||||
|
||||
return name
|
||||
|
||||
@@ -11,16 +11,16 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
CHANNEL_NOTIFY_DEFAULT = "default"
|
||||
CHANNEL_NOTIFY_ALL = "all"
|
||||
CHANNEL_NOTIFY_MENTION = "mention"
|
||||
CHANNEL_NOTIFY_NONE = "none"
|
||||
CHANNEL_MARK_UNREAD_ALL = "all"
|
||||
CHANNEL_MARK_UNREAD_MENTION = "mention"
|
||||
IGNORE_CHANNEL_MENTIONS_DEFAULT = "default"
|
||||
IGNORE_CHANNEL_MENTIONS_OFF = "off"
|
||||
IGNORE_CHANNEL_MENTIONS_ON = "on"
|
||||
IGNORE_CHANNEL_MENTIONS_NOTIFY_PROP = "ignore_channel_mentions"
|
||||
ChannelNotifyDefault = "default"
|
||||
ChannelNotifyAll = "all"
|
||||
ChannelNotifyMention = "mention"
|
||||
ChannelNotifyNone = "none"
|
||||
ChannelMarkUnreadAll = "all"
|
||||
ChannelMarkUnreadMention = "mention"
|
||||
IgnoreChannelMentionsDefault = "default"
|
||||
IgnoreChannelMentionsOff = "off"
|
||||
IgnoreChannelMentionsOn = "on"
|
||||
IgnoreChannelMentionsNotifyProp = "ignore_channel_mentions"
|
||||
)
|
||||
|
||||
type ChannelUnread struct {
|
||||
@@ -127,29 +127,29 @@ func (o *ChannelMember) IsValid() *AppError {
|
||||
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.user_id.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
notifyLevel := o.NotifyProps[DESKTOP_NOTIFY_PROP]
|
||||
notifyLevel := o.NotifyProps[DesktopNotifyProp]
|
||||
if len(notifyLevel) > 20 || !IsChannelNotifyLevelValid(notifyLevel) {
|
||||
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.notify_level.app_error", nil, "notify_level="+notifyLevel, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
markUnreadLevel := o.NotifyProps[MARK_UNREAD_NOTIFY_PROP]
|
||||
markUnreadLevel := o.NotifyProps[MarkUnreadNotifyProp]
|
||||
if len(markUnreadLevel) > 20 || !IsChannelMarkUnreadLevelValid(markUnreadLevel) {
|
||||
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.unread_level.app_error", nil, "mark_unread_level="+markUnreadLevel, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if pushLevel, ok := o.NotifyProps[PUSH_NOTIFY_PROP]; ok {
|
||||
if pushLevel, ok := o.NotifyProps[PushNotifyProp]; ok {
|
||||
if len(pushLevel) > 20 || !IsChannelNotifyLevelValid(pushLevel) {
|
||||
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.push_level.app_error", nil, "push_notification_level="+pushLevel, http.StatusBadRequest)
|
||||
}
|
||||
}
|
||||
|
||||
if sendEmail, ok := o.NotifyProps[EMAIL_NOTIFY_PROP]; ok {
|
||||
if sendEmail, ok := o.NotifyProps[EmailNotifyProp]; ok {
|
||||
if len(sendEmail) > 20 || !IsSendEmailValid(sendEmail) {
|
||||
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.email_value.app_error", nil, "push_notification_level="+sendEmail, http.StatusBadRequest)
|
||||
}
|
||||
}
|
||||
|
||||
if ignoreChannelMentions, ok := o.NotifyProps[IGNORE_CHANNEL_MENTIONS_NOTIFY_PROP]; ok {
|
||||
if ignoreChannelMentions, ok := o.NotifyProps[IgnoreChannelMentionsNotifyProp]; ok {
|
||||
if len(ignoreChannelMentions) > 40 || !IsIgnoreChannelMentionsValid(ignoreChannelMentions) {
|
||||
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.ignore_channel_mentions_value.app_error", nil, "ignore_channel_mentions="+ignoreChannelMentions, http.StatusBadRequest)
|
||||
}
|
||||
@@ -172,41 +172,41 @@ func (o *ChannelMember) GetRoles() []string {
|
||||
|
||||
func (o *ChannelMember) SetChannelMuted(muted bool) {
|
||||
if o.IsChannelMuted() {
|
||||
o.NotifyProps[MARK_UNREAD_NOTIFY_PROP] = CHANNEL_MARK_UNREAD_ALL
|
||||
o.NotifyProps[MarkUnreadNotifyProp] = ChannelMarkUnreadAll
|
||||
} else {
|
||||
o.NotifyProps[MARK_UNREAD_NOTIFY_PROP] = CHANNEL_MARK_UNREAD_MENTION
|
||||
o.NotifyProps[MarkUnreadNotifyProp] = ChannelMarkUnreadMention
|
||||
}
|
||||
}
|
||||
|
||||
func (o *ChannelMember) IsChannelMuted() bool {
|
||||
return o.NotifyProps[MARK_UNREAD_NOTIFY_PROP] == CHANNEL_MARK_UNREAD_MENTION
|
||||
return o.NotifyProps[MarkUnreadNotifyProp] == ChannelMarkUnreadMention
|
||||
}
|
||||
|
||||
func IsChannelNotifyLevelValid(notifyLevel string) bool {
|
||||
return notifyLevel == CHANNEL_NOTIFY_DEFAULT ||
|
||||
notifyLevel == CHANNEL_NOTIFY_ALL ||
|
||||
notifyLevel == CHANNEL_NOTIFY_MENTION ||
|
||||
notifyLevel == CHANNEL_NOTIFY_NONE
|
||||
return notifyLevel == ChannelNotifyDefault ||
|
||||
notifyLevel == ChannelNotifyAll ||
|
||||
notifyLevel == ChannelNotifyMention ||
|
||||
notifyLevel == ChannelNotifyNone
|
||||
}
|
||||
|
||||
func IsChannelMarkUnreadLevelValid(markUnreadLevel string) bool {
|
||||
return markUnreadLevel == CHANNEL_MARK_UNREAD_ALL || markUnreadLevel == CHANNEL_MARK_UNREAD_MENTION
|
||||
return markUnreadLevel == ChannelMarkUnreadAll || markUnreadLevel == ChannelMarkUnreadMention
|
||||
}
|
||||
|
||||
func IsSendEmailValid(sendEmail string) bool {
|
||||
return sendEmail == CHANNEL_NOTIFY_DEFAULT || sendEmail == "true" || sendEmail == "false"
|
||||
return sendEmail == ChannelNotifyDefault || sendEmail == "true" || sendEmail == "false"
|
||||
}
|
||||
|
||||
func IsIgnoreChannelMentionsValid(ignoreChannelMentions string) bool {
|
||||
return ignoreChannelMentions == IGNORE_CHANNEL_MENTIONS_ON || ignoreChannelMentions == IGNORE_CHANNEL_MENTIONS_OFF || ignoreChannelMentions == IGNORE_CHANNEL_MENTIONS_DEFAULT
|
||||
return ignoreChannelMentions == IgnoreChannelMentionsOn || ignoreChannelMentions == IgnoreChannelMentionsOff || ignoreChannelMentions == IgnoreChannelMentionsDefault
|
||||
}
|
||||
|
||||
func GetDefaultChannelNotifyProps() StringMap {
|
||||
return StringMap{
|
||||
DESKTOP_NOTIFY_PROP: CHANNEL_NOTIFY_DEFAULT,
|
||||
MARK_UNREAD_NOTIFY_PROP: CHANNEL_MARK_UNREAD_ALL,
|
||||
PUSH_NOTIFY_PROP: CHANNEL_NOTIFY_DEFAULT,
|
||||
EMAIL_NOTIFY_PROP: CHANNEL_NOTIFY_DEFAULT,
|
||||
IGNORE_CHANNEL_MENTIONS_NOTIFY_PROP: IGNORE_CHANNEL_MENTIONS_DEFAULT,
|
||||
DesktopNotifyProp: ChannelNotifyDefault,
|
||||
MarkUnreadNotifyProp: ChannelMarkUnreadAll,
|
||||
PushNotifyProp: ChannelNotifyDefault,
|
||||
EmailNotifyProp: ChannelNotifyDefault,
|
||||
IgnoreChannelMentionsNotifyProp: IgnoreChannelMentionsDefault,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,13 +35,13 @@ func TestChannelMemberIsValid(t *testing.T) {
|
||||
o.NotifyProps["desktop"] = "123456789012345678901"
|
||||
require.NotNil(t, o.IsValid(), "should be invalid")
|
||||
|
||||
o.NotifyProps["desktop"] = CHANNEL_NOTIFY_ALL
|
||||
o.NotifyProps["desktop"] = ChannelNotifyAll
|
||||
require.Nil(t, o.IsValid(), "should be valid")
|
||||
|
||||
o.NotifyProps["mark_unread"] = "123456789012345678901"
|
||||
require.NotNil(t, o.IsValid(), "should be invalid")
|
||||
|
||||
o.NotifyProps["mark_unread"] = CHANNEL_MARK_UNREAD_ALL
|
||||
o.NotifyProps["mark_unread"] = ChannelMarkUnreadAll
|
||||
require.Nil(t, o.IsValid(), "should be valid")
|
||||
|
||||
o.Roles = ""
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"io"
|
||||
)
|
||||
|
||||
const CHANNEL_SEARCH_DEFAULT_LIMIT = 50
|
||||
const ChannelSearchDefaultLimit = 50
|
||||
|
||||
type ChannelSearch struct {
|
||||
Term string `json:"term"`
|
||||
|
||||
@@ -115,11 +115,11 @@ func TestGetGroupDisplayNameFromUsers(t *testing.T) {
|
||||
users[3] = &User{Username: NewId()}
|
||||
|
||||
name := GetGroupDisplayNameFromUsers(users, true)
|
||||
require.LessOrEqual(t, len(name), CHANNEL_NAME_MAX_LENGTH)
|
||||
require.LessOrEqual(t, len(name), ChannelNameMaxLength)
|
||||
}
|
||||
|
||||
func TestGetGroupNameFromUserIds(t *testing.T) {
|
||||
name := GetGroupNameFromUserIds([]string{NewId(), NewId(), NewId(), NewId(), NewId()})
|
||||
|
||||
require.LessOrEqual(t, len(name), CHANNEL_NAME_MAX_LENGTH)
|
||||
require.LessOrEqual(t, len(name), ChannelNameMaxLength)
|
||||
}
|
||||
|
||||
124
model/client4.go
124
model/client4.go
@@ -19,35 +19,35 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
HEADER_REQUEST_ID = "X-Request-ID"
|
||||
HEADER_VERSION_ID = "X-Version-ID"
|
||||
HEADER_CLUSTER_ID = "X-Cluster-ID"
|
||||
HEADER_ETAG_SERVER = "ETag"
|
||||
HEADER_ETAG_CLIENT = "If-None-Match"
|
||||
HEADER_FORWARDED = "X-Forwarded-For"
|
||||
HEADER_REAL_IP = "X-Real-IP"
|
||||
HEADER_FORWARDED_PROTO = "X-Forwarded-Proto"
|
||||
HEADER_TOKEN = "token"
|
||||
HEADER_CSRF_TOKEN = "X-CSRF-Token"
|
||||
HEADER_BEARER = "BEARER"
|
||||
HEADER_AUTH = "Authorization"
|
||||
HEADER_CLOUD_TOKEN = "X-Cloud-Token"
|
||||
HEADER_REMOTECLUSTER_TOKEN = "X-RemoteCluster-Token"
|
||||
HEADER_REMOTECLUSTER_ID = "X-RemoteCluster-Id"
|
||||
HEADER_REQUESTED_WITH = "X-Requested-With"
|
||||
HEADER_REQUESTED_WITH_XML = "XMLHttpRequest"
|
||||
HEADER_RANGE = "Range"
|
||||
STATUS = "status"
|
||||
STATUS_OK = "OK"
|
||||
STATUS_FAIL = "FAIL"
|
||||
STATUS_UNHEALTHY = "UNHEALTHY"
|
||||
STATUS_REMOVE = "REMOVE"
|
||||
HeaderRequestId = "X-Request-ID"
|
||||
HeaderVersionId = "X-Version-ID"
|
||||
HeaderClusterId = "X-Cluster-ID"
|
||||
HeaderEtagServer = "ETag"
|
||||
HeaderEtagClient = "If-None-Match"
|
||||
HeaderForwarded = "X-Forwarded-For"
|
||||
HeaderRealIp = "X-Real-IP"
|
||||
HeaderForwardedProto = "X-Forwarded-Proto"
|
||||
HeaderToken = "token"
|
||||
HeaderCsrfToken = "X-CSRF-Token"
|
||||
HeaderBearer = "BEARER"
|
||||
HeaderAuth = "Authorization"
|
||||
HeaderCloudToken = "X-Cloud-Token"
|
||||
HeaderRemoteclusterToken = "X-RemoteCluster-Token"
|
||||
HeaderRemoteclusterId = "X-RemoteCluster-Id"
|
||||
HeaderRequestedWith = "X-Requested-With"
|
||||
HeaderRequestedWithXml = "XMLHttpRequest"
|
||||
HeaderRange = "Range"
|
||||
STATUS = "status"
|
||||
StatusOk = "OK"
|
||||
StatusFail = "FAIL"
|
||||
StatusUnhealthy = "UNHEALTHY"
|
||||
StatusRemove = "REMOVE"
|
||||
|
||||
CLIENT_DIR = "client"
|
||||
ClientDir = "client"
|
||||
|
||||
API_URL_SUFFIX_V1 = "/api/v1"
|
||||
API_URL_SUFFIX_V4 = "/api/v4"
|
||||
API_URL_SUFFIX = API_URL_SUFFIX_V4
|
||||
ApiUrlSuffixV1 = "/api/v1"
|
||||
ApiUrlSuffixV4 = "/api/v4"
|
||||
ApiUrlSuffix = ApiUrlSuffixV4
|
||||
)
|
||||
|
||||
type Response struct {
|
||||
@@ -120,7 +120,7 @@ func (c *Client4) Must(result interface{}, resp *Response) interface{} {
|
||||
|
||||
func NewAPIv4Client(url string) *Client4 {
|
||||
url = strings.TrimRight(url, "/")
|
||||
return &Client4{url, url + API_URL_SUFFIX, &http.Client{}, "", "", map[string]string{}, "", ""}
|
||||
return &Client4{url, url + ApiUrlSuffix, &http.Client{}, "", "", map[string]string{}, "", ""}
|
||||
}
|
||||
|
||||
func NewAPIv4SocketClient(socketPath string) *Client4 {
|
||||
@@ -157,16 +157,16 @@ func BuildErrorResponse(r *http.Response, err *AppError) *Response {
|
||||
func BuildResponse(r *http.Response) *Response {
|
||||
return &Response{
|
||||
StatusCode: r.StatusCode,
|
||||
RequestId: r.Header.Get(HEADER_REQUEST_ID),
|
||||
Etag: r.Header.Get(HEADER_ETAG_SERVER),
|
||||
ServerVersion: r.Header.Get(HEADER_VERSION_ID),
|
||||
RequestId: r.Header.Get(HeaderRequestId),
|
||||
Etag: r.Header.Get(HeaderEtagServer),
|
||||
ServerVersion: r.Header.Get(HeaderVersionId),
|
||||
Header: r.Header,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client4) SetToken(token string) {
|
||||
c.AuthToken = token
|
||||
c.AuthType = HEADER_BEARER
|
||||
c.AuthType = HeaderBearer
|
||||
}
|
||||
|
||||
// MockSession is deprecated in favour of SetToken
|
||||
@@ -176,12 +176,12 @@ func (c *Client4) MockSession(token string) {
|
||||
|
||||
func (c *Client4) SetOAuthToken(token string) {
|
||||
c.AuthToken = token
|
||||
c.AuthType = HEADER_TOKEN
|
||||
c.AuthType = HeaderToken
|
||||
}
|
||||
|
||||
func (c *Client4) ClearOAuthToken() {
|
||||
c.AuthToken = ""
|
||||
c.AuthType = HEADER_BEARER
|
||||
c.AuthType = HeaderBearer
|
||||
}
|
||||
|
||||
func (c *Client4) GetUsersRoute() string {
|
||||
@@ -610,7 +610,7 @@ func (c *Client4) DoApiDelete(url string) (*http.Response, *AppError) {
|
||||
}
|
||||
|
||||
func (c *Client4) DoApiRequest(method, url, data, etag string) (*http.Response, *AppError) {
|
||||
return c.doApiRequestReader(method, url, strings.NewReader(data), map[string]string{HEADER_ETAG_CLIENT: etag})
|
||||
return c.doApiRequestReader(method, url, strings.NewReader(data), map[string]string{HeaderEtagClient: etag})
|
||||
}
|
||||
|
||||
func (c *Client4) DoApiRequestWithHeaders(method, url, data string, headers map[string]string) (*http.Response, *AppError) {
|
||||
@@ -618,7 +618,7 @@ func (c *Client4) DoApiRequestWithHeaders(method, url, data string, headers map[
|
||||
}
|
||||
|
||||
func (c *Client4) doApiRequestBytes(method, url string, data []byte, etag string) (*http.Response, *AppError) {
|
||||
return c.doApiRequestReader(method, url, bytes.NewReader(data), map[string]string{HEADER_ETAG_CLIENT: etag})
|
||||
return c.doApiRequestReader(method, url, bytes.NewReader(data), map[string]string{HeaderEtagClient: etag})
|
||||
}
|
||||
|
||||
func (c *Client4) doApiRequestReader(method, url string, data io.Reader, headers map[string]string) (*http.Response, *AppError) {
|
||||
@@ -632,7 +632,7 @@ func (c *Client4) doApiRequestReader(method, url string, data io.Reader, headers
|
||||
}
|
||||
|
||||
if c.AuthToken != "" {
|
||||
rq.Header.Set(HEADER_AUTH, c.AuthType+" "+c.AuthToken)
|
||||
rq.Header.Set(HeaderAuth, c.AuthType+" "+c.AuthToken)
|
||||
}
|
||||
|
||||
if c.HttpHeader != nil && len(c.HttpHeader) > 0 {
|
||||
@@ -673,7 +673,7 @@ func (c *Client4) doUploadFile(url string, body io.Reader, contentType string, c
|
||||
rq.Header.Set("Content-Type", contentType)
|
||||
|
||||
if c.AuthToken != "" {
|
||||
rq.Header.Set(HEADER_AUTH, c.AuthType+" "+c.AuthToken)
|
||||
rq.Header.Set(HeaderAuth, c.AuthType+" "+c.AuthToken)
|
||||
}
|
||||
|
||||
rp, err := c.HttpClient.Do(rq)
|
||||
@@ -697,7 +697,7 @@ func (c *Client4) DoEmojiUploadFile(url string, data []byte, contentType string)
|
||||
rq.Header.Set("Content-Type", contentType)
|
||||
|
||||
if c.AuthToken != "" {
|
||||
rq.Header.Set(HEADER_AUTH, c.AuthType+" "+c.AuthToken)
|
||||
rq.Header.Set(HeaderAuth, c.AuthType+" "+c.AuthToken)
|
||||
}
|
||||
|
||||
rp, err := c.HttpClient.Do(rq)
|
||||
@@ -721,7 +721,7 @@ func (c *Client4) DoUploadImportTeam(url string, data []byte, contentType string
|
||||
rq.Header.Set("Content-Type", contentType)
|
||||
|
||||
if c.AuthToken != "" {
|
||||
rq.Header.Set(HEADER_AUTH, c.AuthType+" "+c.AuthToken)
|
||||
rq.Header.Set(HeaderAuth, c.AuthType+" "+c.AuthToken)
|
||||
}
|
||||
|
||||
rp, err := c.HttpClient.Do(rq)
|
||||
@@ -743,7 +743,7 @@ func CheckStatusOK(r *http.Response) bool {
|
||||
m := MapFromJson(r.Body)
|
||||
defer closeBody(r)
|
||||
|
||||
if m != nil && m[STATUS] == STATUS_OK {
|
||||
if m != nil && m[STATUS] == StatusOk {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -804,8 +804,8 @@ func (c *Client4) login(m map[string]string) (*User, *Response) {
|
||||
return nil, BuildErrorResponse(r, err)
|
||||
}
|
||||
defer closeBody(r)
|
||||
c.AuthToken = r.Header.Get(HEADER_TOKEN)
|
||||
c.AuthType = HEADER_BEARER
|
||||
c.AuthToken = r.Header.Get(HeaderToken)
|
||||
c.AuthType = HeaderBearer
|
||||
return UserFromJson(r.Body), BuildResponse(r)
|
||||
}
|
||||
|
||||
@@ -817,7 +817,7 @@ func (c *Client4) Logout() (bool, *Response) {
|
||||
}
|
||||
defer closeBody(r)
|
||||
c.AuthToken = ""
|
||||
c.AuthType = HEADER_BEARER
|
||||
c.AuthType = HeaderBearer
|
||||
return CheckStatusOK(r), BuildResponse(r)
|
||||
}
|
||||
|
||||
@@ -879,7 +879,7 @@ func (c *Client4) CreateUserWithInviteId(user *User, inviteId string) (*User, *R
|
||||
|
||||
// GetMe returns the logged in user.
|
||||
func (c *Client4) GetMe(etag string) (*User, *Response) {
|
||||
r, err := c.DoApiGet(c.GetUserRoute(ME), etag)
|
||||
r, err := c.DoApiGet(c.GetUserRoute(Me), etag)
|
||||
if err != nil {
|
||||
return nil, BuildErrorResponse(r, err)
|
||||
}
|
||||
@@ -1534,7 +1534,7 @@ func (c *Client4) SetProfileImage(userId string, data []byte) (bool, *Response)
|
||||
rq.Header.Set("Content-Type", writer.FormDataContentType())
|
||||
|
||||
if c.AuthToken != "" {
|
||||
rq.Header.Set(HEADER_AUTH, c.AuthType+" "+c.AuthToken)
|
||||
rq.Header.Set(HeaderAuth, c.AuthType+" "+c.AuthToken)
|
||||
}
|
||||
|
||||
rp, err := c.HttpClient.Do(rq)
|
||||
@@ -1783,7 +1783,7 @@ func (c *Client4) SetBotIconImage(botUserId string, data []byte) (bool, *Respons
|
||||
rq.Header.Set("Content-Type", writer.FormDataContentType())
|
||||
|
||||
if c.AuthToken != "" {
|
||||
rq.Header.Set(HEADER_AUTH, c.AuthType+" "+c.AuthToken)
|
||||
rq.Header.Set(HeaderAuth, c.AuthType+" "+c.AuthToken)
|
||||
}
|
||||
|
||||
rp, err := c.HttpClient.Do(rq)
|
||||
@@ -2031,7 +2031,7 @@ func (c *Client4) PermanentDeleteTeam(teamId string) (bool, *Response) {
|
||||
return CheckStatusOK(r), BuildResponse(r)
|
||||
}
|
||||
|
||||
// UpdateTeamPrivacy modifies the team type (model.TEAM_OPEN <--> model.TEAM_INVITE) and sets
|
||||
// UpdateTeamPrivacy modifies the team type (model.TeamOpen <--> model.TeamInvite) and sets
|
||||
// the corresponding AllowOpenInvite appropriately.
|
||||
func (c *Client4) UpdateTeamPrivacy(teamId string, privacy string) (*Team, *Response) {
|
||||
requestBody := map[string]string{"privacy": privacy}
|
||||
@@ -2056,8 +2056,8 @@ func (c *Client4) GetTeamMembers(teamId string, page int, perPage int, etag stri
|
||||
|
||||
// GetTeamMembersWithoutDeletedUsers returns team members based on the provided team id string. Additional parameters of sort and exclude_deleted_users accepted as well
|
||||
// Could not add it to above function due to it be a breaking change.
|
||||
func (c *Client4) GetTeamMembersSortAndWithoutDeletedUsers(teamId string, page int, perPage int, sort string, exclude_deleted_users bool, etag string) ([]*TeamMember, *Response) {
|
||||
query := fmt.Sprintf("?page=%v&per_page=%v&sort=%v&exclude_deleted_users=%v", page, perPage, sort, exclude_deleted_users)
|
||||
func (c *Client4) GetTeamMembersSortAndWithoutDeletedUsers(teamId string, page int, perPage int, sort string, excludeDeletedUsers bool, etag string) ([]*TeamMember, *Response) {
|
||||
query := fmt.Sprintf("?page=%v&per_page=%v&sort=%v&exclude_deleted_users=%v", page, perPage, sort, excludeDeletedUsers)
|
||||
r, err := c.DoApiGet(c.GetTeamMembersRoute(teamId)+query, etag)
|
||||
if err != nil {
|
||||
return nil, BuildErrorResponse(r, err)
|
||||
@@ -2329,7 +2329,7 @@ func (c *Client4) SetTeamIcon(teamId string, data []byte) (bool, *Response) {
|
||||
rq.Header.Set("Content-Type", writer.FormDataContentType())
|
||||
|
||||
if c.AuthToken != "" {
|
||||
rq.Header.Set(HEADER_AUTH, c.AuthType+" "+c.AuthToken)
|
||||
rq.Header.Set(HeaderAuth, c.AuthType+" "+c.AuthToken)
|
||||
}
|
||||
|
||||
rp, err := c.HttpClient.Do(rq)
|
||||
@@ -3376,7 +3376,7 @@ func (c *Client4) GetPing() (string, *Response) {
|
||||
r, err := c.DoApiGet(c.GetSystemRoute()+"/ping", "")
|
||||
if r != nil && r.StatusCode == 500 {
|
||||
defer r.Body.Close()
|
||||
return STATUS_UNHEALTHY, BuildErrorResponse(r, err)
|
||||
return StatusUnhealthy, BuildErrorResponse(r, err)
|
||||
}
|
||||
if err != nil {
|
||||
return "", BuildErrorResponse(r, err)
|
||||
@@ -3391,7 +3391,7 @@ func (c *Client4) GetPingWithServerStatus() (string, *Response) {
|
||||
r, err := c.DoApiGet(c.GetSystemRoute()+"/ping?get_server_status="+c.boolString(true), "")
|
||||
if r != nil && r.StatusCode == 500 {
|
||||
defer r.Body.Close()
|
||||
return STATUS_UNHEALTHY, BuildErrorResponse(r, err)
|
||||
return StatusUnhealthy, BuildErrorResponse(r, err)
|
||||
}
|
||||
if err != nil {
|
||||
return "", BuildErrorResponse(r, err)
|
||||
@@ -3406,7 +3406,7 @@ func (c *Client4) GetPingWithFullServerStatus() (map[string]string, *Response) {
|
||||
r, err := c.DoApiGet(c.GetSystemRoute()+"/ping?get_server_status="+c.boolString(true), "")
|
||||
if r != nil && r.StatusCode == 500 {
|
||||
defer r.Body.Close()
|
||||
return map[string]string{"status": STATUS_UNHEALTHY}, BuildErrorResponse(r, err)
|
||||
return map[string]string{"status": StatusUnhealthy}, BuildErrorResponse(r, err)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, BuildErrorResponse(r, err)
|
||||
@@ -3569,7 +3569,7 @@ func (c *Client4) UploadLicenseFile(data []byte) (bool, *Response) {
|
||||
rq.Header.Set("Content-Type", writer.FormDataContentType())
|
||||
|
||||
if c.AuthToken != "" {
|
||||
rq.Header.Set(HEADER_AUTH, c.AuthType+" "+c.AuthToken)
|
||||
rq.Header.Set(HeaderAuth, c.AuthType+" "+c.AuthToken)
|
||||
}
|
||||
|
||||
rp, err := c.HttpClient.Do(rq)
|
||||
@@ -3998,7 +3998,7 @@ func (c *Client4) DownloadComplianceReport(reportId string) ([]byte, *Response)
|
||||
}
|
||||
|
||||
if c.AuthToken != "" {
|
||||
rq.Header.Set(HEADER_AUTH, "BEARER "+c.AuthToken)
|
||||
rq.Header.Set(HeaderAuth, "BEARER "+c.AuthToken)
|
||||
}
|
||||
|
||||
rp, err := c.HttpClient.Do(rq)
|
||||
@@ -4264,7 +4264,7 @@ func (c *Client4) MigrateAuthToSaml(fromAuthService string, usersMap map[string]
|
||||
|
||||
// UploadLdapPublicCertificate will upload a public certificate for LDAP and set the config to use it.
|
||||
func (c *Client4) UploadLdapPublicCertificate(data []byte) (bool, *Response) {
|
||||
body, writer, err := fileToMultipart(data, LDAP_PUBLIC_CERTIFICATE_NAME)
|
||||
body, writer, err := fileToMultipart(data, LdapPublicCertificateName)
|
||||
if err != nil {
|
||||
return false, &Response{Error: NewAppError("UploadLdapPublicCertificate", "model.client.upload_ldap_cert.app_error", nil, err.Error(), http.StatusBadRequest)}
|
||||
}
|
||||
@@ -4275,7 +4275,7 @@ func (c *Client4) UploadLdapPublicCertificate(data []byte) (bool, *Response) {
|
||||
|
||||
// UploadLdapPrivateCertificate will upload a private key for LDAP and set the config to use it.
|
||||
func (c *Client4) UploadLdapPrivateCertificate(data []byte) (bool, *Response) {
|
||||
body, writer, err := fileToMultipart(data, LDAP_PRIVATE_KEY_NAME)
|
||||
body, writer, err := fileToMultipart(data, LdapPrivateKeyName)
|
||||
if err != nil {
|
||||
return false, &Response{Error: NewAppError("UploadLdapPrivateCertificate", "model.client.upload_Ldap_cert.app_error", nil, err.Error(), http.StatusBadRequest)}
|
||||
}
|
||||
@@ -4373,7 +4373,7 @@ func (c *Client4) UploadBrandImage(data []byte) (bool, *Response) {
|
||||
rq.Header.Set("Content-Type", writer.FormDataContentType())
|
||||
|
||||
if c.AuthToken != "" {
|
||||
rq.Header.Set(HEADER_AUTH, c.AuthType+" "+c.AuthToken)
|
||||
rq.Header.Set(HeaderAuth, c.AuthType+" "+c.AuthToken)
|
||||
}
|
||||
|
||||
rp, err := c.HttpClient.Do(rq)
|
||||
@@ -4528,7 +4528,7 @@ func (c *Client4) GetOAuthAccessToken(data url.Values) (*AccessResponse, *Respon
|
||||
rq.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
|
||||
if c.AuthToken != "" {
|
||||
rq.Header.Set(HEADER_AUTH, c.AuthType+" "+c.AuthToken)
|
||||
rq.Header.Set(HeaderAuth, c.AuthType+" "+c.AuthToken)
|
||||
}
|
||||
|
||||
rp, err := c.HttpClient.Do(rq)
|
||||
@@ -5389,7 +5389,7 @@ func (c *Client4) uploadPlugin(file io.Reader, force bool) (*Manifest, *Response
|
||||
rq.Header.Set("Content-Type", writer.FormDataContentType())
|
||||
|
||||
if c.AuthToken != "" {
|
||||
rq.Header.Set(HEADER_AUTH, c.AuthType+" "+c.AuthToken)
|
||||
rq.Header.Set(HeaderAuth, c.AuthType+" "+c.AuthToken)
|
||||
}
|
||||
|
||||
rp, err := c.HttpClient.Do(rq)
|
||||
@@ -6165,7 +6165,7 @@ func (c *Client4) DownloadExport(name string, wr io.Writer, offset int64) (int64
|
||||
var headers map[string]string
|
||||
if offset > 0 {
|
||||
headers = map[string]string{
|
||||
HEADER_RANGE: fmt.Sprintf("bytes=%d-", offset),
|
||||
HeaderRange: fmt.Sprintf("bytes=%d-", offset),
|
||||
}
|
||||
}
|
||||
r, appErr := c.DoApiRequestWithHeaders(http.MethodGet, c.ApiUrl+c.GetExportRoute(name), "", headers)
|
||||
|
||||
@@ -21,7 +21,7 @@ func TestClient4TrimTrailingSlash(t *testing.T) {
|
||||
testUrl := baseUrl + strings.Repeat("/", s)
|
||||
client := NewAPIv4Client(testUrl)
|
||||
assert.Equal(t, baseUrl, client.Url)
|
||||
assert.Equal(t, baseUrl+API_URL_SUFFIX, client.ApiUrl)
|
||||
assert.Equal(t, baseUrl+ApiUrlSuffix, client.ApiUrl)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,12 +75,12 @@ func TestClient4SetToken(t *testing.T) {
|
||||
expected := NewId()
|
||||
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
authHeader := r.Header.Get(HEADER_AUTH)
|
||||
authHeader := r.Header.Get(HeaderAuth)
|
||||
|
||||
token := strings.Split(authHeader, HEADER_BEARER)
|
||||
token := strings.Split(authHeader, HeaderBearer)
|
||||
|
||||
if len(token) < 2 {
|
||||
t.Errorf("wrong authorization header format, got %s, expected: %s %s", authHeader, HEADER_BEARER, expected)
|
||||
t.Errorf("wrong authorization header format, got %s, expected: %s %s", authHeader, HeaderBearer, expected)
|
||||
}
|
||||
|
||||
assert.Equal(t, expected, strings.TrimSpace(token[1]))
|
||||
@@ -97,12 +97,12 @@ func TestClient4MockSession(t *testing.T) {
|
||||
expected := NewId()
|
||||
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
authHeader := r.Header.Get(HEADER_AUTH)
|
||||
authHeader := r.Header.Get(HeaderAuth)
|
||||
|
||||
token := strings.Split(authHeader, HEADER_BEARER)
|
||||
token := strings.Split(authHeader, HeaderBearer)
|
||||
|
||||
if len(token) < 2 {
|
||||
t.Errorf("wrong authorization header format, got %s, expected: %s %s", authHeader, HEADER_BEARER, expected)
|
||||
t.Errorf("wrong authorization header format, got %s, expected: %s %s", authHeader, HeaderBearer, expected)
|
||||
}
|
||||
|
||||
assert.Equal(t, expected, strings.TrimSpace(token[1]))
|
||||
|
||||
@@ -11,8 +11,8 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
CDS_OFFLINE_AFTER_MILLIS = 1000 * 60 * 30 // 30 minutes
|
||||
CDS_TYPE_APP = "mattermost_app"
|
||||
CDSOfflineAfterMillis = 1000 * 60 * 30 // 30 minutes
|
||||
CDSTypeApp = "mattermost_app"
|
||||
)
|
||||
|
||||
type ClusterDiscovery struct {
|
||||
|
||||
@@ -9,54 +9,54 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
CLUSTER_EVENT_PUBLISH = "publish"
|
||||
CLUSTER_EVENT_UPDATE_STATUS = "update_status"
|
||||
CLUSTER_EVENT_INVALIDATE_ALL_CACHES = "inv_all_caches"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_REACTIONS = "inv_reactions"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_WEBHOOK = "inv_webhook"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_CHANNEL_POSTS = "inv_channel_posts"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_CHANNEL_MEMBERS_NOTIFY_PROPS = "inv_channel_members_notify_props"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_CHANNEL_MEMBERS = "inv_channel_members"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_CHANNEL_BY_NAME = "inv_channel_name"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_CHANNEL = "inv_channel"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_CHANNEL_GUEST_COUNT = "inv_channel_guest_count"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_USER = "inv_user"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_USER_TEAMS = "inv_user_teams"
|
||||
CLUSTER_EVENT_CLEAR_SESSION_CACHE_FOR_USER = "clear_session_user"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_ROLES = "inv_roles"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_ROLE_PERMISSIONS = "inv_role_permissions"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_PROFILE_BY_IDS = "inv_profile_ids"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_PROFILE_IN_CHANNEL = "inv_profile_in_channel"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_SCHEMES = "inv_schemes"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_FILE_INFOS = "inv_file_infos"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_WEBHOOKS = "inv_webhooks"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_EMOJIS_BY_ID = "inv_emojis_by_id"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_EMOJIS_ID_BY_NAME = "inv_emojis_id_by_name"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_CHANNEL_PINNEDPOSTS_COUNTS = "inv_channel_pinnedposts_counts"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_CHANNEL_MEMBER_COUNTS = "inv_channel_member_counts"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_LAST_POSTS = "inv_last_posts"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_LAST_POST_TIME = "inv_last_post_time"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_TEAMS = "inv_teams"
|
||||
CLUSTER_EVENT_CLEAR_SESSION_CACHE_FOR_ALL_USERS = "inv_all_user_sessions"
|
||||
CLUSTER_EVENT_INSTALL_PLUGIN = "install_plugin"
|
||||
CLUSTER_EVENT_REMOVE_PLUGIN = "remove_plugin"
|
||||
CLUSTER_EVENT_PLUGIN_EVENT = "plugin_event"
|
||||
CLUSTER_EVENT_INVALIDATE_CACHE_FOR_TERMS_OF_SERVICE = "inv_terms_of_service"
|
||||
CLUSTER_EVENT_BUSY_STATE_CHANGED = "busy_state_change"
|
||||
ClusterEventPublish = "publish"
|
||||
ClusterEventUpdateStatus = "update_status"
|
||||
ClusterEventInvalidateAllCaches = "inv_all_caches"
|
||||
ClusterEventInvalidateCacheForReactions = "inv_reactions"
|
||||
ClusterEventInvalidateCacheForWebhook = "inv_webhook"
|
||||
ClusterEventInvalidateCacheForChannelPosts = "inv_channel_posts"
|
||||
ClusterEventInvalidateCacheForChannelMembersNotifyProps = "inv_channel_members_notify_props"
|
||||
ClusterEventInvalidateCacheForChannelMembers = "inv_channel_members"
|
||||
ClusterEventInvalidateCacheForChannelByName = "inv_channel_name"
|
||||
ClusterEventInvalidateCacheForChannel = "inv_channel"
|
||||
ClusterEventInvalidateCacheForChannelGuestCount = "inv_channel_guest_count"
|
||||
ClusterEventInvalidateCacheForUser = "inv_user"
|
||||
ClusterEventInvalidateCacheForUserTeams = "inv_user_teams"
|
||||
ClusterEventClearSessionCacheForUser = "clear_session_user"
|
||||
ClusterEventInvalidateCacheForRoles = "inv_roles"
|
||||
ClusterEventInvalidateCacheForRolePermissions = "inv_role_permissions"
|
||||
ClusterEventInvalidateCacheForProfileByIds = "inv_profile_ids"
|
||||
ClusterEventInvalidateCacheForProfileInChannel = "inv_profile_in_channel"
|
||||
ClusterEventInvalidateCacheForSchemes = "inv_schemes"
|
||||
ClusterEventInvalidateCacheForFileInfos = "inv_file_infos"
|
||||
ClusterEventInvalidateCacheForWebhooks = "inv_webhooks"
|
||||
ClusterEventInvalidateCacheForEmojisById = "inv_emojis_by_id"
|
||||
ClusterEventInvalidateCacheForEmojisIdByName = "inv_emojis_id_by_name"
|
||||
ClusterEventInvalidateCacheForChannelPinnedpostsCounts = "inv_channel_pinnedposts_counts"
|
||||
ClusterEventInvalidateCacheForChannelMemberCounts = "inv_channel_member_counts"
|
||||
ClusterEventInvalidateCacheForLastPosts = "inv_last_posts"
|
||||
ClusterEventInvalidateCacheForLastPostTime = "inv_last_post_time"
|
||||
ClusterEventInvalidateCacheForTeams = "inv_teams"
|
||||
ClusterEventClearSessionCacheForAllUsers = "inv_all_user_sessions"
|
||||
ClusterEventInstallPlugin = "install_plugin"
|
||||
ClusterEventRemovePlugin = "remove_plugin"
|
||||
ClusterEventPluginEvent = "plugin_event"
|
||||
ClusterEventInvalidateCacheForTermsOfService = "inv_terms_of_service"
|
||||
ClusterEventBusyStateChanged = "busy_state_change"
|
||||
|
||||
// Gossip communication
|
||||
CLUSTER_GOSSIP_EVENT_REQUEST_GET_LOGS = "gossip_request_get_logs"
|
||||
CLUSTER_GOSSIP_EVENT_RESPONSE_GET_LOGS = "gossip_response_get_logs"
|
||||
CLUSTER_GOSSIP_EVENT_REQUEST_GET_CLUSTER_STATS = "gossip_request_cluster_stats"
|
||||
CLUSTER_GOSSIP_EVENT_RESPONSE_GET_CLUSTER_STATS = "gossip_response_cluster_stats"
|
||||
CLUSTER_GOSSIP_EVENT_REQUEST_GET_PLUGIN_STATUSES = "gossip_request_plugin_statuses"
|
||||
CLUSTER_GOSSIP_EVENT_RESPONSE_GET_PLUGIN_STATUSES = "gossip_response_plugin_statuses"
|
||||
CLUSTER_GOSSIP_EVENT_REQUEST_SAVE_CONFIG = "gossip_request_save_config"
|
||||
CLUSTER_GOSSIP_EVENT_RESPONSE_SAVE_CONFIG = "gossip_response_save_config"
|
||||
ClusterGossipEventRequestGetLogs = "gossip_request_get_logs"
|
||||
ClusterGossipEventResponseGetLogs = "gossip_response_get_logs"
|
||||
ClusterGossipEventRequestGetClusterStats = "gossip_request_cluster_stats"
|
||||
ClusterGossipEventResponseGetClusterStats = "gossip_response_cluster_stats"
|
||||
ClusterGossipEventRequestGetPluginStatuses = "gossip_request_plugin_statuses"
|
||||
ClusterGossipEventResponseGetPluginStatuses = "gossip_response_plugin_statuses"
|
||||
ClusterGossipEventRequestSaveConfig = "gossip_request_save_config"
|
||||
ClusterGossipEventResponseSaveConfig = "gossip_response_save_config"
|
||||
|
||||
// SendTypes for ClusterMessage.
|
||||
CLUSTER_SEND_BEST_EFFORT = "best_effort"
|
||||
CLUSTER_SEND_RELIABLE = "reliable"
|
||||
ClusterSendBestEffort = "best_effort"
|
||||
ClusterSendReliable = "reliable"
|
||||
)
|
||||
|
||||
type ClusterMessage struct {
|
||||
|
||||
@@ -12,8 +12,8 @@ import (
|
||||
|
||||
func TestClusterMessage(t *testing.T) {
|
||||
m := ClusterMessage{
|
||||
Event: CLUSTER_EVENT_PUBLISH,
|
||||
SendType: CLUSTER_SEND_BEST_EFFORT,
|
||||
Event: ClusterEventPublish,
|
||||
SendType: ClusterSendBestEffort,
|
||||
Data: "hello",
|
||||
}
|
||||
json := m.ToJson()
|
||||
|
||||
@@ -11,10 +11,10 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
COMMAND_METHOD_POST = "P"
|
||||
COMMAND_METHOD_GET = "G"
|
||||
MIN_TRIGGER_LENGTH = 1
|
||||
MAX_TRIGGER_LENGTH = 128
|
||||
CommandMethodPost = "P"
|
||||
CommandMethodGet = "G"
|
||||
MinTriggerLength = 1
|
||||
MaxTriggerLength = 128
|
||||
)
|
||||
|
||||
type Command struct {
|
||||
@@ -101,7 +101,7 @@ func (o *Command) IsValid() *AppError {
|
||||
return NewAppError("Command.IsValid", "model.command.is_valid.team_id.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if len(o.Trigger) < MIN_TRIGGER_LENGTH || len(o.Trigger) > MAX_TRIGGER_LENGTH || strings.Index(o.Trigger, "/") == 0 || strings.Contains(o.Trigger, " ") {
|
||||
if len(o.Trigger) < MinTriggerLength || len(o.Trigger) > MaxTriggerLength || strings.Index(o.Trigger, "/") == 0 || strings.Contains(o.Trigger, " ") {
|
||||
return NewAppError("Command.IsValid", "model.command.is_valid.trigger.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
@@ -113,7 +113,7 @@ func (o *Command) IsValid() *AppError {
|
||||
return NewAppError("Command.IsValid", "model.command.is_valid.url_http.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if !(o.Method == COMMAND_METHOD_GET || o.Method == COMMAND_METHOD_POST) {
|
||||
if !(o.Method == CommandMethodGet || o.Method == CommandMethodPost) {
|
||||
return NewAppError("Command.IsValid", "model.command.is_valid.method.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ func NewAutocompleteData(trigger, hint, helpText string) *AutocompleteData {
|
||||
Trigger: trigger,
|
||||
Hint: hint,
|
||||
HelpText: helpText,
|
||||
RoleID: SYSTEM_USER_ROLE_ID,
|
||||
RoleID: SystemUserRoleId,
|
||||
Arguments: []*AutocompleteArg{},
|
||||
SubCommands: []*AutocompleteData{},
|
||||
}
|
||||
@@ -234,7 +234,7 @@ func (ad *AutocompleteData) IsValid() error {
|
||||
if strings.ToLower(ad.Trigger) != ad.Trigger {
|
||||
return errors.New("Command should be lowercase")
|
||||
}
|
||||
roles := []string{SYSTEM_ADMIN_ROLE_ID, SYSTEM_USER_ROLE_ID, ""}
|
||||
roles := []string{SystemAdminRoleId, SystemUserRoleId, ""}
|
||||
if stringNotInSlice(ad.RoleID, roles) {
|
||||
return errors.New("Wrong role in the autocomplete data")
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ func TestAutocompleteData(t *testing.T) {
|
||||
assert.NoError(t, ad.IsValid())
|
||||
ad.RoleID = "some_id"
|
||||
assert.Error(t, ad.IsValid())
|
||||
ad.RoleID = SYSTEM_ADMIN_ROLE_ID
|
||||
ad.RoleID = SystemAdminRoleId
|
||||
assert.NoError(t, ad.IsValid())
|
||||
ad.AddDynamicListArgument("help", "/some/url", true)
|
||||
assert.NoError(t, ad.IsValid())
|
||||
@@ -76,9 +76,9 @@ func TestAutocompleteDataJSON(t *testing.T) {
|
||||
|
||||
func getAutocompleteData() *AutocompleteData {
|
||||
ad := NewAutocompleteData("jira", "", "Available commands:")
|
||||
ad.RoleID = SYSTEM_USER_ROLE_ID
|
||||
ad.RoleID = SystemUserRoleId
|
||||
command := NewAutocompleteData("connect", "", "Connect to mattermost")
|
||||
command.RoleID = SYSTEM_ADMIN_ROLE_ID
|
||||
command.RoleID = SystemAdminRoleId
|
||||
items := []AutocompleteListItem{
|
||||
{
|
||||
Hint: "arg1",
|
||||
|
||||
@@ -13,8 +13,8 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
COMMAND_RESPONSE_TYPE_IN_CHANNEL = "in_channel"
|
||||
COMMAND_RESPONSE_TYPE_EPHEMERAL = "ephemeral"
|
||||
CommandResponseTypeInChannel = "in_channel"
|
||||
CommandResponseTypeEphemeral = "ephemeral"
|
||||
)
|
||||
|
||||
type CommandResponse struct {
|
||||
|
||||
@@ -28,7 +28,7 @@ func TestCommandIsValid(t *testing.T) {
|
||||
TeamId: NewId(),
|
||||
Trigger: "trigger",
|
||||
URL: "http://example.com",
|
||||
Method: COMMAND_METHOD_GET,
|
||||
Method: CommandMethodGet,
|
||||
DisplayName: "",
|
||||
Description: "",
|
||||
}
|
||||
@@ -95,10 +95,10 @@ func TestCommandIsValid(t *testing.T) {
|
||||
o.Method = "https://example.com"
|
||||
require.NotNil(t, o.IsValid(), "should be invalid")
|
||||
|
||||
o.Method = COMMAND_METHOD_GET
|
||||
o.Method = CommandMethodGet
|
||||
require.Nil(t, o.IsValid())
|
||||
|
||||
o.Method = COMMAND_METHOD_POST
|
||||
o.Method = CommandMethodPost
|
||||
require.Nil(t, o.IsValid())
|
||||
|
||||
o.DisplayName = strings.Repeat("1", 65)
|
||||
|
||||
@@ -19,7 +19,7 @@ type CommandWebhook struct {
|
||||
}
|
||||
|
||||
const (
|
||||
COMMAND_WEBHOOK_LIFETIME = 1000 * 60 * 30
|
||||
CommandWebhookLifetime = 1000 * 60 * 30
|
||||
)
|
||||
|
||||
func (o *CommandWebhook) PreSave() {
|
||||
|
||||
@@ -11,14 +11,14 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
COMPLIANCE_STATUS_CREATED = "created"
|
||||
COMPLIANCE_STATUS_RUNNING = "running"
|
||||
COMPLIANCE_STATUS_FINISHED = "finished"
|
||||
COMPLIANCE_STATUS_FAILED = "failed"
|
||||
COMPLIANCE_STATUS_REMOVED = "removed"
|
||||
ComplianceStatusCreated = "created"
|
||||
ComplianceStatusRunning = "running"
|
||||
ComplianceStatusFinished = "finished"
|
||||
ComplianceStatusFailed = "failed"
|
||||
ComplianceStatusRemoved = "removed"
|
||||
|
||||
COMPLIANCE_TYPE_DAILY = "daily"
|
||||
COMPLIANCE_TYPE_ADHOC = "adhoc"
|
||||
ComplianceTypeDaily = "daily"
|
||||
ComplianceTypeAdhoc = "adhoc"
|
||||
)
|
||||
|
||||
type Compliance struct {
|
||||
@@ -61,7 +61,7 @@ func (c *Compliance) PreSave() {
|
||||
}
|
||||
|
||||
if c.Status == "" {
|
||||
c.Status = COMPLIANCE_STATUS_CREATED
|
||||
c.Status = ComplianceStatusCreated
|
||||
}
|
||||
|
||||
c.Count = 0
|
||||
@@ -78,7 +78,7 @@ func (c *Compliance) DeepCopy() *Compliance {
|
||||
|
||||
func (c *Compliance) JobName() string {
|
||||
jobName := c.Type
|
||||
if c.Type == COMPLIANCE_TYPE_DAILY {
|
||||
if c.Type == ComplianceTypeDaily {
|
||||
jobName += "-" + c.Desc
|
||||
}
|
||||
|
||||
|
||||
739
model/config.go
739
model/config.go
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
@@ -64,7 +64,7 @@ func TestConfigEmptySiteName(t *testing.T) {
|
||||
}
|
||||
c1.SetDefaults()
|
||||
|
||||
require.Equal(t, *c1.TeamSettings.SiteName, TEAM_SETTINGS_DEFAULT_SITE_NAME)
|
||||
require.Equal(t, *c1.TeamSettings.SiteName, TeamSettingsDefaultSiteName)
|
||||
}
|
||||
|
||||
func TestConfigEnableDeveloper(t *testing.T) {
|
||||
@@ -73,7 +73,7 @@ func TestConfigEnableDeveloper(t *testing.T) {
|
||||
EnableDeveloper *bool
|
||||
ExpectedSiteURL string
|
||||
}{
|
||||
{"enable developer is true", NewBool(true), SERVICE_SETTINGS_DEFAULT_SITE_URL},
|
||||
{"enable developer is true", NewBool(true), ServiceSettingsDefaultSiteUrl},
|
||||
{"enable developer is false", NewBool(false), ""},
|
||||
{"enable developer is nil", nil, ""},
|
||||
}
|
||||
@@ -103,7 +103,7 @@ func TestConfigDefaultEmailNotificationContentsType(t *testing.T) {
|
||||
c1 := Config{}
|
||||
c1.SetDefaults()
|
||||
|
||||
require.Equal(t, *c1.EmailSettings.EmailNotificationContentsType, EMAIL_NOTIFICATION_CONTENTS_FULL)
|
||||
require.Equal(t, *c1.EmailSettings.EmailNotificationContentsType, EmailNotificationContentsFull)
|
||||
}
|
||||
|
||||
func TestConfigDefaultFileSettingsS3SSE(t *testing.T) {
|
||||
@@ -117,8 +117,8 @@ func TestConfigDefaultSignatureAlgorithm(t *testing.T) {
|
||||
c1 := Config{}
|
||||
c1.SetDefaults()
|
||||
|
||||
require.Equal(t, *c1.SamlSettings.SignatureAlgorithm, SAML_SETTINGS_DEFAULT_SIGNATURE_ALGORITHM)
|
||||
require.Equal(t, *c1.SamlSettings.CanonicalAlgorithm, SAML_SETTINGS_DEFAULT_CANONICAL_ALGORITHM)
|
||||
require.Equal(t, *c1.SamlSettings.SignatureAlgorithm, SamlSettingsDefaultSignatureAlgorithm)
|
||||
require.Equal(t, *c1.SamlSettings.CanonicalAlgorithm, SamlSettingsDefaultCanonicalAlgorithm)
|
||||
}
|
||||
|
||||
func TestConfigOverwriteSignatureAlgorithm(t *testing.T) {
|
||||
@@ -237,7 +237,7 @@ func TestConfigDefaultServiceSettingsExperimentalGroupUnreadChannels(t *testing.
|
||||
c1 := Config{}
|
||||
c1.SetDefaults()
|
||||
|
||||
require.Equal(t, *c1.ServiceSettings.ExperimentalGroupUnreadChannels, GROUP_UNREAD_CHANNELS_DISABLED)
|
||||
require.Equal(t, *c1.ServiceSettings.ExperimentalGroupUnreadChannels, GroupUnreadChannelsDisabled)
|
||||
|
||||
// This setting was briefly a boolean, so ensure that those values still work as expected
|
||||
c1 = Config{
|
||||
@@ -247,7 +247,7 @@ func TestConfigDefaultServiceSettingsExperimentalGroupUnreadChannels(t *testing.
|
||||
}
|
||||
c1.SetDefaults()
|
||||
|
||||
require.Equal(t, *c1.ServiceSettings.ExperimentalGroupUnreadChannels, GROUP_UNREAD_CHANNELS_DEFAULT_ON)
|
||||
require.Equal(t, *c1.ServiceSettings.ExperimentalGroupUnreadChannels, GroupUnreadChannelsDefaultOn)
|
||||
|
||||
c1 = Config{
|
||||
ServiceSettings: ServiceSettings{
|
||||
@@ -256,7 +256,7 @@ func TestConfigDefaultServiceSettingsExperimentalGroupUnreadChannels(t *testing.
|
||||
}
|
||||
c1.SetDefaults()
|
||||
|
||||
require.Equal(t, *c1.ServiceSettings.ExperimentalGroupUnreadChannels, GROUP_UNREAD_CHANNELS_DISABLED)
|
||||
require.Equal(t, *c1.ServiceSettings.ExperimentalGroupUnreadChannels, GroupUnreadChannelsDisabled)
|
||||
}
|
||||
|
||||
func TestConfigDefaultNPSPluginState(t *testing.T) {
|
||||
@@ -463,7 +463,7 @@ func TestMessageExportSettingsIsValidExportFormatInvalid(t *testing.T) {
|
||||
func TestMessageExportSettingsIsValidGlobalRelayEmailAddressInvalid(t *testing.T) {
|
||||
mes := &MessageExportSettings{
|
||||
EnableExport: NewBool(true),
|
||||
ExportFormat: NewString(COMPLIANCE_EXPORT_TYPE_GLOBALRELAY),
|
||||
ExportFormat: NewString(ComplianceExportTypeGlobalrelay),
|
||||
ExportFromTimestamp: NewInt64(0),
|
||||
DailyRunTime: NewString("15:04"),
|
||||
BatchSize: NewInt(100),
|
||||
@@ -476,7 +476,7 @@ func TestMessageExportSettingsIsValidGlobalRelayEmailAddressInvalid(t *testing.T
|
||||
func TestMessageExportSettingsIsValidActiance(t *testing.T) {
|
||||
mes := &MessageExportSettings{
|
||||
EnableExport: NewBool(true),
|
||||
ExportFormat: NewString(COMPLIANCE_EXPORT_TYPE_ACTIANCE),
|
||||
ExportFormat: NewString(ComplianceExportTypeActiance),
|
||||
ExportFromTimestamp: NewInt64(0),
|
||||
DailyRunTime: NewString("15:04"),
|
||||
BatchSize: NewInt(100),
|
||||
@@ -489,7 +489,7 @@ func TestMessageExportSettingsIsValidActiance(t *testing.T) {
|
||||
func TestMessageExportSettingsIsValidGlobalRelaySettingsMissing(t *testing.T) {
|
||||
mes := &MessageExportSettings{
|
||||
EnableExport: NewBool(true),
|
||||
ExportFormat: NewString(COMPLIANCE_EXPORT_TYPE_GLOBALRELAY),
|
||||
ExportFormat: NewString(ComplianceExportTypeGlobalrelay),
|
||||
ExportFromTimestamp: NewInt64(0),
|
||||
DailyRunTime: NewString("15:04"),
|
||||
BatchSize: NewInt(100),
|
||||
@@ -502,7 +502,7 @@ func TestMessageExportSettingsIsValidGlobalRelaySettingsMissing(t *testing.T) {
|
||||
func TestMessageExportSettingsIsValidGlobalRelaySettingsInvalidCustomerType(t *testing.T) {
|
||||
mes := &MessageExportSettings{
|
||||
EnableExport: NewBool(true),
|
||||
ExportFormat: NewString(COMPLIANCE_EXPORT_TYPE_GLOBALRELAY),
|
||||
ExportFormat: NewString(ComplianceExportTypeGlobalrelay),
|
||||
ExportFromTimestamp: NewInt64(0),
|
||||
DailyRunTime: NewString("15:04"),
|
||||
BatchSize: NewInt(100),
|
||||
@@ -528,7 +528,7 @@ func TestMessageExportSettingsGlobalRelaySettings(t *testing.T) {
|
||||
{
|
||||
"Invalid email address",
|
||||
&GlobalRelayMessageExportSettings{
|
||||
CustomerType: NewString(GLOBALRELAY_CUSTOMER_TYPE_A9),
|
||||
CustomerType: NewString(GlobalrelayCustomerTypeA9),
|
||||
EmailAddress: NewString("invalidEmailAddress"),
|
||||
SmtpUsername: NewString("SomeUsername"),
|
||||
SmtpPassword: NewString("SomePassword"),
|
||||
@@ -538,7 +538,7 @@ func TestMessageExportSettingsGlobalRelaySettings(t *testing.T) {
|
||||
{
|
||||
"Missing smtp username",
|
||||
&GlobalRelayMessageExportSettings{
|
||||
CustomerType: NewString(GLOBALRELAY_CUSTOMER_TYPE_A10),
|
||||
CustomerType: NewString(GlobalrelayCustomerTypeA10),
|
||||
EmailAddress: NewString("valid@mattermost.com"),
|
||||
SmtpPassword: NewString("SomePassword"),
|
||||
},
|
||||
@@ -547,7 +547,7 @@ func TestMessageExportSettingsGlobalRelaySettings(t *testing.T) {
|
||||
{
|
||||
"Invalid smtp username",
|
||||
&GlobalRelayMessageExportSettings{
|
||||
CustomerType: NewString(GLOBALRELAY_CUSTOMER_TYPE_A10),
|
||||
CustomerType: NewString(GlobalrelayCustomerTypeA10),
|
||||
EmailAddress: NewString("valid@mattermost.com"),
|
||||
SmtpUsername: NewString(""),
|
||||
SmtpPassword: NewString("SomePassword"),
|
||||
@@ -557,7 +557,7 @@ func TestMessageExportSettingsGlobalRelaySettings(t *testing.T) {
|
||||
{
|
||||
"Invalid smtp password",
|
||||
&GlobalRelayMessageExportSettings{
|
||||
CustomerType: NewString(GLOBALRELAY_CUSTOMER_TYPE_A10),
|
||||
CustomerType: NewString(GlobalrelayCustomerTypeA10),
|
||||
EmailAddress: NewString("valid@mattermost.com"),
|
||||
SmtpUsername: NewString("SomeUsername"),
|
||||
SmtpPassword: NewString(""),
|
||||
@@ -567,7 +567,7 @@ func TestMessageExportSettingsGlobalRelaySettings(t *testing.T) {
|
||||
{
|
||||
"Valid data",
|
||||
&GlobalRelayMessageExportSettings{
|
||||
CustomerType: NewString(GLOBALRELAY_CUSTOMER_TYPE_A9),
|
||||
CustomerType: NewString(GlobalrelayCustomerTypeA9),
|
||||
EmailAddress: NewString("valid@mattermost.com"),
|
||||
SmtpUsername: NewString("SomeUsername"),
|
||||
SmtpPassword: NewString("SomePassword"),
|
||||
@@ -580,7 +580,7 @@ func TestMessageExportSettingsGlobalRelaySettings(t *testing.T) {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
mes := &MessageExportSettings{
|
||||
EnableExport: NewBool(true),
|
||||
ExportFormat: NewString(COMPLIANCE_EXPORT_TYPE_GLOBALRELAY),
|
||||
ExportFormat: NewString(ComplianceExportTypeGlobalrelay),
|
||||
ExportFromTimestamp: NewInt64(0),
|
||||
DailyRunTime: NewString("15:04"),
|
||||
BatchSize: NewInt(100),
|
||||
@@ -604,7 +604,7 @@ func TestMessageExportSetDefaults(t *testing.T) {
|
||||
require.Equal(t, "01:00", *mes.DailyRunTime)
|
||||
require.Equal(t, int64(0), *mes.ExportFromTimestamp)
|
||||
require.Equal(t, 10000, *mes.BatchSize)
|
||||
require.Equal(t, COMPLIANCE_EXPORT_TYPE_ACTIANCE, *mes.ExportFormat)
|
||||
require.Equal(t, ComplianceExportTypeActiance, *mes.ExportFormat)
|
||||
}
|
||||
|
||||
func TestMessageExportSetDefaultsExportEnabledExportFromTimestampNil(t *testing.T) {
|
||||
@@ -815,7 +815,7 @@ func TestListenAddressIsValidated(t *testing.T) {
|
||||
|
||||
func TestImageProxySettingsSetDefaults(t *testing.T) {
|
||||
ss := ServiceSettings{
|
||||
DEPRECATED_DO_NOT_USE_ImageProxyType: NewString(IMAGE_PROXY_TYPE_ATMOS_CAMO),
|
||||
DEPRECATED_DO_NOT_USE_ImageProxyType: NewString(ImageProxyTypeAtmosCamo),
|
||||
DEPRECATED_DO_NOT_USE_ImageProxyURL: NewString("http://images.example.com"),
|
||||
DEPRECATED_DO_NOT_USE_ImageProxyOptions: NewString("1234abcd"),
|
||||
}
|
||||
@@ -825,7 +825,7 @@ func TestImageProxySettingsSetDefaults(t *testing.T) {
|
||||
ips.SetDefaults(ServiceSettings{})
|
||||
|
||||
assert.Equal(t, false, *ips.Enable)
|
||||
assert.Equal(t, IMAGE_PROXY_TYPE_LOCAL, *ips.ImageProxyType)
|
||||
assert.Equal(t, ImageProxyTypeLocal, *ips.ImageProxyType)
|
||||
assert.Equal(t, "", *ips.RemoteImageProxyURL)
|
||||
assert.Equal(t, "", *ips.RemoteImageProxyOptions)
|
||||
})
|
||||
@@ -846,14 +846,14 @@ func TestImageProxySettingsSetDefaults(t *testing.T) {
|
||||
|
||||
ips := ImageProxySettings{
|
||||
Enable: NewBool(false),
|
||||
ImageProxyType: NewString(IMAGE_PROXY_TYPE_LOCAL),
|
||||
ImageProxyType: NewString(ImageProxyTypeLocal),
|
||||
RemoteImageProxyURL: &url,
|
||||
RemoteImageProxyOptions: &options,
|
||||
}
|
||||
ips.SetDefaults(ss)
|
||||
|
||||
assert.Equal(t, false, *ips.Enable)
|
||||
assert.Equal(t, IMAGE_PROXY_TYPE_LOCAL, *ips.ImageProxyType)
|
||||
assert.Equal(t, ImageProxyTypeLocal, *ips.ImageProxyType)
|
||||
assert.Equal(t, url, *ips.RemoteImageProxyURL)
|
||||
assert.Equal(t, options, *ips.RemoteImageProxyOptions)
|
||||
})
|
||||
@@ -898,7 +898,7 @@ func TestImageProxySettingsIsValid(t *testing.T) {
|
||||
{
|
||||
Name: "atmos/camo",
|
||||
Enable: true,
|
||||
ImageProxyType: IMAGE_PROXY_TYPE_ATMOS_CAMO,
|
||||
ImageProxyType: ImageProxyTypeAtmosCamo,
|
||||
RemoteImageProxyURL: "someurl",
|
||||
RemoteImageProxyOptions: "someoptions",
|
||||
ExpectError: false,
|
||||
@@ -906,7 +906,7 @@ func TestImageProxySettingsIsValid(t *testing.T) {
|
||||
{
|
||||
Name: "atmos/camo, missing url",
|
||||
Enable: true,
|
||||
ImageProxyType: IMAGE_PROXY_TYPE_ATMOS_CAMO,
|
||||
ImageProxyType: ImageProxyTypeAtmosCamo,
|
||||
RemoteImageProxyURL: "",
|
||||
RemoteImageProxyOptions: "garbage",
|
||||
ExpectError: true,
|
||||
@@ -914,7 +914,7 @@ func TestImageProxySettingsIsValid(t *testing.T) {
|
||||
{
|
||||
Name: "atmos/camo, missing options",
|
||||
Enable: true,
|
||||
ImageProxyType: IMAGE_PROXY_TYPE_ATMOS_CAMO,
|
||||
ImageProxyType: ImageProxyTypeAtmosCamo,
|
||||
RemoteImageProxyURL: "someurl",
|
||||
RemoteImageProxyOptions: "",
|
||||
ExpectError: true,
|
||||
@@ -1303,17 +1303,17 @@ func TestConfigSanitize(t *testing.T) {
|
||||
|
||||
c.Sanitize()
|
||||
|
||||
assert.Equal(t, FAKE_SETTING, *c.LdapSettings.BindPassword)
|
||||
assert.Equal(t, FAKE_SETTING, *c.FileSettings.PublicLinkSalt)
|
||||
assert.Equal(t, FAKE_SETTING, *c.FileSettings.AmazonS3SecretAccessKey)
|
||||
assert.Equal(t, FAKE_SETTING, *c.EmailSettings.SMTPPassword)
|
||||
assert.Equal(t, FAKE_SETTING, *c.GitLabSettings.Secret)
|
||||
assert.Equal(t, FAKE_SETTING, *c.OpenIdSettings.Secret)
|
||||
assert.Equal(t, FAKE_SETTING, *c.SqlSettings.DataSource)
|
||||
assert.Equal(t, FAKE_SETTING, *c.SqlSettings.AtRestEncryptKey)
|
||||
assert.Equal(t, FAKE_SETTING, *c.ElasticsearchSettings.Password)
|
||||
assert.Equal(t, FAKE_SETTING, c.SqlSettings.DataSourceReplicas[0])
|
||||
assert.Equal(t, FAKE_SETTING, c.SqlSettings.DataSourceSearchReplicas[0])
|
||||
assert.Equal(t, FakeSetting, *c.LdapSettings.BindPassword)
|
||||
assert.Equal(t, FakeSetting, *c.FileSettings.PublicLinkSalt)
|
||||
assert.Equal(t, FakeSetting, *c.FileSettings.AmazonS3SecretAccessKey)
|
||||
assert.Equal(t, FakeSetting, *c.EmailSettings.SMTPPassword)
|
||||
assert.Equal(t, FakeSetting, *c.GitLabSettings.Secret)
|
||||
assert.Equal(t, FakeSetting, *c.OpenIdSettings.Secret)
|
||||
assert.Equal(t, FakeSetting, *c.SqlSettings.DataSource)
|
||||
assert.Equal(t, FakeSetting, *c.SqlSettings.AtRestEncryptKey)
|
||||
assert.Equal(t, FakeSetting, *c.ElasticsearchSettings.Password)
|
||||
assert.Equal(t, FakeSetting, c.SqlSettings.DataSourceReplicas[0])
|
||||
assert.Equal(t, FakeSetting, c.SqlSettings.DataSourceSearchReplicas[0])
|
||||
}
|
||||
|
||||
func TestConfigFilteredByTag(t *testing.T) {
|
||||
@@ -1368,18 +1368,18 @@ func TestConfigMarketplaceDefaults(t *testing.T) {
|
||||
c.SetDefaults()
|
||||
|
||||
require.True(t, *c.PluginSettings.EnableMarketplace)
|
||||
require.Equal(t, PLUGIN_SETTINGS_DEFAULT_MARKETPLACE_URL, *c.PluginSettings.MarketplaceUrl)
|
||||
require.Equal(t, PluginSettingsDefaultMarketplaceUrl, *c.PluginSettings.MarketplaceUrl)
|
||||
})
|
||||
|
||||
t.Run("old marketplace url", func(t *testing.T) {
|
||||
c := Config{}
|
||||
c.SetDefaults()
|
||||
|
||||
*c.PluginSettings.MarketplaceUrl = PLUGIN_SETTINGS_OLD_MARKETPLACE_URL
|
||||
*c.PluginSettings.MarketplaceUrl = PluginSettingsOldMarketplaceUrl
|
||||
c.SetDefaults()
|
||||
|
||||
require.True(t, *c.PluginSettings.EnableMarketplace)
|
||||
require.Equal(t, PLUGIN_SETTINGS_DEFAULT_MARKETPLACE_URL, *c.PluginSettings.MarketplaceUrl)
|
||||
require.Equal(t, PluginSettingsDefaultMarketplaceUrl, *c.PluginSettings.MarketplaceUrl)
|
||||
})
|
||||
|
||||
t.Run("custom marketplace url", func(t *testing.T) {
|
||||
|
||||
@@ -12,11 +12,11 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
EMOJI_NAME_MAX_LENGTH = 64
|
||||
EMOJI_SORT_BY_NAME = "name"
|
||||
EmojiNameMaxLength = 64
|
||||
EmojiSortByName = "name"
|
||||
)
|
||||
|
||||
var EMOJI_PATTERN = regexp.MustCompile(`:[a-zA-Z0-9_+-]+:`)
|
||||
var EmojiPattern = regexp.MustCompile(`:[a-zA-Z0-9_+-]+:`)
|
||||
|
||||
var ReverseSystemEmojisMap = makeReverseEmojiMap()
|
||||
|
||||
@@ -80,7 +80,7 @@ func (emoji *Emoji) IsValid() *AppError {
|
||||
}
|
||||
|
||||
func IsValidEmojiName(name string) *AppError {
|
||||
if name == "" || len(name) > EMOJI_NAME_MAX_LENGTH || !IsValidAlphaNumHyphenUnderscorePlus(name) || inSystemEmoji(name) {
|
||||
if name == "" || len(name) > EmojiNameMaxLength || !IsValidAlphaNumHyphenUnderscorePlus(name) || inSystemEmoji(name) {
|
||||
return NewAppError("Emoji.IsValid", "model.emoji.name.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
|
||||
@@ -15,8 +15,8 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
FILEINFO_SORT_BY_CREATED = "CreateAt"
|
||||
FILEINFO_SORT_BY_SIZE = "Size"
|
||||
FileinfoSortByCreated = "CreateAt"
|
||||
FileinfoSortBySize = "Size"
|
||||
)
|
||||
|
||||
// GetFileInfosOptions contains options for getting FileInfos
|
||||
|
||||
@@ -37,9 +37,9 @@ func (o *FileInfoList) ToJson() string {
|
||||
b, err := json.Marshal(o)
|
||||
if err != nil {
|
||||
return ""
|
||||
} else {
|
||||
return string(b)
|
||||
}
|
||||
|
||||
return string(b)
|
||||
}
|
||||
|
||||
func (o *FileInfoList) MakeNonNil() {
|
||||
|
||||
@@ -4,5 +4,5 @@
|
||||
package model
|
||||
|
||||
const (
|
||||
USER_AUTH_SERVICE_GITLAB = "gitlab"
|
||||
UserAuthServiceGitlab = "gitlab"
|
||||
)
|
||||
|
||||
@@ -27,7 +27,7 @@ type GitLabUser struct {
|
||||
|
||||
func init() {
|
||||
provider := &GitLabProvider{}
|
||||
einterfaces.RegisterOauthProvider(model.USER_AUTH_SERVICE_GITLAB, provider)
|
||||
einterfaces.RegisterOAuthProvider(model.UserAuthServiceGitlab, provider)
|
||||
}
|
||||
|
||||
func userFromGitLabUser(glu *GitLabUser) *model.User {
|
||||
@@ -51,7 +51,7 @@ func userFromGitLabUser(glu *GitLabUser) *model.User {
|
||||
user.Email = strings.ToLower(user.Email)
|
||||
userId := glu.getAuthData()
|
||||
user.AuthData = &userId
|
||||
user.AuthService = model.USER_AUTH_SERVICE_GITLAB
|
||||
user.AuthService = model.UserAuthServiceGitlab
|
||||
|
||||
return user
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ func (i *GuestsInvite) IsValid() *AppError {
|
||||
}
|
||||
|
||||
for _, email := range i.Emails {
|
||||
if len(email) > USER_EMAIL_MAX_LENGTH || email == "" || !IsValidEmail(email) {
|
||||
if len(email) > UserEmailMaxLength || email == "" || !IsValidEmail(email) {
|
||||
return NewAppError("GuestsInvite.IsValid", "model.guest.is_valid.email.app_error", nil, "email="+email, http.StatusBadRequest)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
DEFAULT_WEBHOOK_USERNAME = "webhook"
|
||||
DefaultWebhookUsername = "webhook"
|
||||
)
|
||||
|
||||
type IncomingWebhook struct {
|
||||
|
||||
@@ -22,9 +22,9 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
POST_ACTION_TYPE_BUTTON = "button"
|
||||
POST_ACTION_TYPE_SELECT = "select"
|
||||
INTERACTIVE_DIALOG_TRIGGER_TIMEOUT_MILLISECONDS = 3000
|
||||
PostActionTypeButton = "button"
|
||||
PostActionTypeSelect = "select"
|
||||
InteractiveDialogTriggerTimeoutMilliseconds = 3000
|
||||
)
|
||||
|
||||
var PostActionRetainPropKeys = []string{"from_webhook", "override_username", "override_icon_url"}
|
||||
@@ -289,8 +289,8 @@ func DecodeAndVerifyTriggerId(triggerId string, s *ecdsa.PrivateKey) (string, st
|
||||
timestamp, _ := strconv.ParseInt(timestampStr, 10, 64)
|
||||
|
||||
now := GetMillis()
|
||||
if now-timestamp > INTERACTIVE_DIALOG_TRIGGER_TIMEOUT_MILLISECONDS {
|
||||
return "", "", NewAppError("DecodeAndVerifyTriggerId", "interactive_message.decode_trigger_id.expired", map[string]interface{}{"Seconds": INTERACTIVE_DIALOG_TRIGGER_TIMEOUT_MILLISECONDS / 1000}, "", http.StatusBadRequest)
|
||||
if now-timestamp > InteractiveDialogTriggerTimeoutMilliseconds {
|
||||
return "", "", NewAppError("DecodeAndVerifyTriggerId", "interactive_message.decode_trigger_id.expired", map[string]interface{}{"Seconds": InteractiveDialogTriggerTimeoutMilliseconds / 1000}, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
signature, err := base64.StdEncoding.DecodeString(split[3])
|
||||
|
||||
128
model/job.go
128
model/job.go
@@ -11,50 +11,50 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
JOB_TYPE_DATA_RETENTION = "data_retention"
|
||||
JOB_TYPE_MESSAGE_EXPORT = "message_export"
|
||||
JOB_TYPE_ELASTICSEARCH_POST_INDEXING = "elasticsearch_post_indexing"
|
||||
JOB_TYPE_ELASTICSEARCH_POST_AGGREGATION = "elasticsearch_post_aggregation"
|
||||
JOB_TYPE_BLEVE_POST_INDEXING = "bleve_post_indexing"
|
||||
JOB_TYPE_LDAP_SYNC = "ldap_sync"
|
||||
JOB_TYPE_MIGRATIONS = "migrations"
|
||||
JOB_TYPE_PLUGINS = "plugins"
|
||||
JOB_TYPE_EXPIRY_NOTIFY = "expiry_notify"
|
||||
JOB_TYPE_PRODUCT_NOTICES = "product_notices"
|
||||
JOB_TYPE_ACTIVE_USERS = "active_users"
|
||||
JOB_TYPE_IMPORT_PROCESS = "import_process"
|
||||
JOB_TYPE_IMPORT_DELETE = "import_delete"
|
||||
JOB_TYPE_EXPORT_PROCESS = "export_process"
|
||||
JOB_TYPE_EXPORT_DELETE = "export_delete"
|
||||
JOB_TYPE_CLOUD = "cloud"
|
||||
JOB_TYPE_RESEND_INVITATION_EMAIL = "resend_invitation_email"
|
||||
JobTypeDataRetention = "data_retention"
|
||||
JobTypeMessageExport = "message_export"
|
||||
JobTypeElasticsearchPostIndexing = "elasticsearch_post_indexing"
|
||||
JobTypeElasticsearchPostAggregation = "elasticsearch_post_aggregation"
|
||||
JobTypeBlevePostIndexing = "bleve_post_indexing"
|
||||
JobTypeLdapSync = "ldap_sync"
|
||||
JobTypeMigrations = "migrations"
|
||||
JobTypePlugins = "plugins"
|
||||
JobTypeExpiryNotify = "expiry_notify"
|
||||
JobTypeProductNotices = "product_notices"
|
||||
JobTypeActiveUsers = "active_users"
|
||||
JobTypeImportProcess = "import_process"
|
||||
JobTypeImportDelete = "import_delete"
|
||||
JobTypeExportProcess = "export_process"
|
||||
JobTypeExportDelete = "export_delete"
|
||||
JobTypeCloud = "cloud"
|
||||
JobTypeResendInvitationEmail = "resend_invitation_email"
|
||||
|
||||
JOB_STATUS_PENDING = "pending"
|
||||
JOB_STATUS_IN_PROGRESS = "in_progress"
|
||||
JOB_STATUS_SUCCESS = "success"
|
||||
JOB_STATUS_ERROR = "error"
|
||||
JOB_STATUS_CANCEL_REQUESTED = "cancel_requested"
|
||||
JOB_STATUS_CANCELED = "canceled"
|
||||
JOB_STATUS_WARNING = "warning"
|
||||
JobStatusPending = "pending"
|
||||
JobStatusInProgress = "in_progress"
|
||||
JobStatusSuccess = "success"
|
||||
JobStatusError = "error"
|
||||
JobStatusCancelRequested = "cancel_requested"
|
||||
JobStatusCanceled = "canceled"
|
||||
JobStatusWarning = "warning"
|
||||
)
|
||||
|
||||
var ALL_JOB_TYPES = [...]string{
|
||||
JOB_TYPE_DATA_RETENTION,
|
||||
JOB_TYPE_MESSAGE_EXPORT,
|
||||
JOB_TYPE_ELASTICSEARCH_POST_INDEXING,
|
||||
JOB_TYPE_ELASTICSEARCH_POST_AGGREGATION,
|
||||
JOB_TYPE_BLEVE_POST_INDEXING,
|
||||
JOB_TYPE_LDAP_SYNC,
|
||||
JOB_TYPE_MIGRATIONS,
|
||||
JOB_TYPE_PLUGINS,
|
||||
JOB_TYPE_EXPIRY_NOTIFY,
|
||||
JOB_TYPE_PRODUCT_NOTICES,
|
||||
JOB_TYPE_ACTIVE_USERS,
|
||||
JOB_TYPE_IMPORT_PROCESS,
|
||||
JOB_TYPE_IMPORT_DELETE,
|
||||
JOB_TYPE_EXPORT_PROCESS,
|
||||
JOB_TYPE_EXPORT_DELETE,
|
||||
JOB_TYPE_CLOUD,
|
||||
var AllJobTypes = [...]string{
|
||||
JobTypeDataRetention,
|
||||
JobTypeMessageExport,
|
||||
JobTypeElasticsearchPostIndexing,
|
||||
JobTypeElasticsearchPostAggregation,
|
||||
JobTypeBlevePostIndexing,
|
||||
JobTypeLdapSync,
|
||||
JobTypeMigrations,
|
||||
JobTypePlugins,
|
||||
JobTypeExpiryNotify,
|
||||
JobTypeProductNotices,
|
||||
JobTypeActiveUsers,
|
||||
JobTypeImportProcess,
|
||||
JobTypeImportDelete,
|
||||
JobTypeExportProcess,
|
||||
JobTypeExportDelete,
|
||||
JobTypeCloud,
|
||||
}
|
||||
|
||||
type Job struct {
|
||||
@@ -79,34 +79,34 @@ func (j *Job) IsValid() *AppError {
|
||||
}
|
||||
|
||||
switch j.Type {
|
||||
case JOB_TYPE_DATA_RETENTION:
|
||||
case JOB_TYPE_ELASTICSEARCH_POST_INDEXING:
|
||||
case JOB_TYPE_ELASTICSEARCH_POST_AGGREGATION:
|
||||
case JOB_TYPE_BLEVE_POST_INDEXING:
|
||||
case JOB_TYPE_LDAP_SYNC:
|
||||
case JOB_TYPE_MESSAGE_EXPORT:
|
||||
case JOB_TYPE_MIGRATIONS:
|
||||
case JOB_TYPE_PLUGINS:
|
||||
case JOB_TYPE_PRODUCT_NOTICES:
|
||||
case JOB_TYPE_EXPIRY_NOTIFY:
|
||||
case JOB_TYPE_ACTIVE_USERS:
|
||||
case JOB_TYPE_IMPORT_PROCESS:
|
||||
case JOB_TYPE_IMPORT_DELETE:
|
||||
case JOB_TYPE_EXPORT_PROCESS:
|
||||
case JOB_TYPE_EXPORT_DELETE:
|
||||
case JOB_TYPE_CLOUD:
|
||||
case JOB_TYPE_RESEND_INVITATION_EMAIL:
|
||||
case JobTypeDataRetention:
|
||||
case JobTypeElasticsearchPostIndexing:
|
||||
case JobTypeElasticsearchPostAggregation:
|
||||
case JobTypeBlevePostIndexing:
|
||||
case JobTypeLdapSync:
|
||||
case JobTypeMessageExport:
|
||||
case JobTypeMigrations:
|
||||
case JobTypePlugins:
|
||||
case JobTypeProductNotices:
|
||||
case JobTypeExpiryNotify:
|
||||
case JobTypeActiveUsers:
|
||||
case JobTypeImportProcess:
|
||||
case JobTypeImportDelete:
|
||||
case JobTypeExportProcess:
|
||||
case JobTypeExportDelete:
|
||||
case JobTypeCloud:
|
||||
case JobTypeResendInvitationEmail:
|
||||
default:
|
||||
return NewAppError("Job.IsValid", "model.job.is_valid.type.app_error", nil, "id="+j.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
switch j.Status {
|
||||
case JOB_STATUS_PENDING:
|
||||
case JOB_STATUS_IN_PROGRESS:
|
||||
case JOB_STATUS_SUCCESS:
|
||||
case JOB_STATUS_ERROR:
|
||||
case JOB_STATUS_CANCEL_REQUESTED:
|
||||
case JOB_STATUS_CANCELED:
|
||||
case JobStatusPending:
|
||||
case JobStatusInProgress:
|
||||
case JobStatusSuccess:
|
||||
case JobStatusError:
|
||||
case JobStatusCancelRequested:
|
||||
case JobStatusCanceled:
|
||||
default:
|
||||
return NewAppError("Job.IsValid", "model.job.is_valid.status.app_error", nil, "id="+j.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
package model
|
||||
|
||||
const (
|
||||
USER_AUTH_SERVICE_LDAP = "ldap"
|
||||
LDAP_PUBLIC_CERTIFICATE_NAME = "ldap-public.crt"
|
||||
LDAP_PRIVATE_KEY_NAME = "ldap-private.key"
|
||||
UserAuthServiceLdap = "ldap"
|
||||
LdapPublicCertificateName = "ldap-public.crt"
|
||||
LdapPrivateKeyName = "ldap-private.key"
|
||||
)
|
||||
|
||||
@@ -12,16 +12,14 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
EXPIRED_LICENSE_ERROR = "api.license.add_license.expired.app_error"
|
||||
INVALID_LICENSE_ERROR = "api.license.add_license.invalid.app_error"
|
||||
LICENSE_GRACE_PERIOD = 1000 * 60 * 60 * 24 * 10 //10 days
|
||||
LICENSE_RENEWAL_LINK = "https://mattermost.com/renew/"
|
||||
ExpiredLicenseError = "api.license.add_license.expired.app_error"
|
||||
InvalidLicenseError = "api.license.add_license.invalid.app_error"
|
||||
LicenseGracePeriod = 1000 * 60 * 60 * 24 * 10 //10 days
|
||||
LicenseRenewalLink = "https://mattermost.com/renew/"
|
||||
)
|
||||
|
||||
const (
|
||||
SIXTY_DAYS = 60
|
||||
FIFTY_EIGHT = 58
|
||||
LICENSE_UP_FOR_RENEWAL_EMAIL_SENT = "LicenseUpForRenewalEmailSent"
|
||||
LicenseUpForRenewalEmailSent = "LicenseUpForRenewalEmailSent"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -269,12 +267,12 @@ func (l *License) IsExpired() bool {
|
||||
|
||||
func (l *License) IsPastGracePeriod() bool {
|
||||
timeDiff := GetMillis() - l.ExpiresAt
|
||||
return timeDiff > LICENSE_GRACE_PERIOD
|
||||
return timeDiff > LicenseGracePeriod
|
||||
}
|
||||
|
||||
func (l *License) IsWithinExpirationPeriod() bool {
|
||||
days := l.DaysToExpiration()
|
||||
return days <= SIXTY_DAYS && days >= FIFTY_EIGHT
|
||||
return days <= 60 && days >= 58
|
||||
}
|
||||
|
||||
func (l *License) DaysToExpiration() int {
|
||||
|
||||
@@ -126,7 +126,7 @@ func TestLicenseIsExpired(t *testing.T) {
|
||||
|
||||
func TestLicenseIsPastGracePeriod(t *testing.T) {
|
||||
l1 := License{}
|
||||
l1.ExpiresAt = GetMillis() - LICENSE_GRACE_PERIOD - 1000
|
||||
l1.ExpiresAt = GetMillis() - LicenseGracePeriod - 1000
|
||||
assert.True(t, l1.IsPastGracePeriod())
|
||||
|
||||
l1.ExpiresAt = GetMillis() + 1000
|
||||
|
||||
@@ -16,10 +16,10 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
LINK_METADATA_TYPE_IMAGE LinkMetadataType = "image"
|
||||
LINK_METADATA_TYPE_NONE LinkMetadataType = "none"
|
||||
LINK_METADATA_TYPE_OPENGRAPH LinkMetadataType = "opengraph"
|
||||
MAX_IMAGES int = 5
|
||||
LinkMetadataTypeImage LinkMetadataType = "image"
|
||||
LinkMetadataTypeNone LinkMetadataType = "none"
|
||||
LinkMetadataTypeOpengraph LinkMetadataType = "opengraph"
|
||||
LinkMetadataMaxImages int = 5
|
||||
)
|
||||
|
||||
type LinkMetadataType string
|
||||
@@ -51,8 +51,8 @@ func truncateText(original string) string {
|
||||
}
|
||||
|
||||
func firstNImages(images []*opengraph.Image, maxImages int) []*opengraph.Image {
|
||||
if maxImages < 0 { // dont break stuff, if it's weird, go for sane defaults
|
||||
maxImages = MAX_IMAGES
|
||||
if maxImages < 0 { // don't break stuff, if it's weird, go for sane defaults
|
||||
maxImages = LinkMetadataMaxImages
|
||||
}
|
||||
numImages := len(images)
|
||||
if numImages > maxImages {
|
||||
@@ -76,7 +76,7 @@ func TruncateOpenGraph(ogdata *opengraph.OpenGraph) *opengraph.OpenGraph {
|
||||
ogdata.Determiner = empty.Determiner
|
||||
ogdata.Locale = empty.Locale
|
||||
ogdata.LocalesAlternate = empty.LocalesAlternate
|
||||
ogdata.Images = firstNImages(ogdata.Images, MAX_IMAGES)
|
||||
ogdata.Images = firstNImages(ogdata.Images, LinkMetadataMaxImages)
|
||||
ogdata.Audios = empty.Audios
|
||||
ogdata.Videos = empty.Videos
|
||||
}
|
||||
@@ -97,7 +97,7 @@ func (o *LinkMetadata) IsValid() *AppError {
|
||||
}
|
||||
|
||||
switch o.Type {
|
||||
case LINK_METADATA_TYPE_IMAGE:
|
||||
case LinkMetadataTypeImage:
|
||||
if o.Data == nil {
|
||||
return NewAppError("LinkMetadata.IsValid", "model.link_metadata.is_valid.data.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
@@ -105,11 +105,11 @@ func (o *LinkMetadata) IsValid() *AppError {
|
||||
if _, ok := o.Data.(*PostImage); !ok {
|
||||
return NewAppError("LinkMetadata.IsValid", "model.link_metadata.is_valid.data_type.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
case LINK_METADATA_TYPE_NONE:
|
||||
case LinkMetadataTypeNone:
|
||||
if o.Data != nil {
|
||||
return NewAppError("LinkMetadata.IsValid", "model.link_metadata.is_valid.data_type.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
case LINK_METADATA_TYPE_OPENGRAPH:
|
||||
case LinkMetadataTypeOpengraph:
|
||||
if o.Data == nil {
|
||||
return NewAppError("LinkMetadata.IsValid", "model.link_metadata.is_valid.data.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
@@ -146,13 +146,13 @@ func (o *LinkMetadata) DeserializeDataToConcreteType() error {
|
||||
var err error
|
||||
|
||||
switch o.Type {
|
||||
case LINK_METADATA_TYPE_IMAGE:
|
||||
case LinkMetadataTypeImage:
|
||||
image := &PostImage{}
|
||||
|
||||
err = json.Unmarshal(b, &image)
|
||||
|
||||
data = image
|
||||
case LINK_METADATA_TYPE_OPENGRAPH:
|
||||
case LinkMetadataTypeOpengraph:
|
||||
og := &opengraph.OpenGraph{}
|
||||
|
||||
json.Unmarshal(b, &og)
|
||||
|
||||
@@ -38,7 +38,7 @@ func TestLinkMetadataIsValid(t *testing.T) {
|
||||
Metadata: &LinkMetadata{
|
||||
URL: "http://example.com",
|
||||
Timestamp: 1546300800000,
|
||||
Type: LINK_METADATA_TYPE_IMAGE,
|
||||
Type: LinkMetadataTypeImage,
|
||||
Data: &PostImage{},
|
||||
},
|
||||
Expected: true,
|
||||
@@ -48,7 +48,7 @@ func TestLinkMetadataIsValid(t *testing.T) {
|
||||
Metadata: &LinkMetadata{
|
||||
URL: "http://example.com",
|
||||
Timestamp: 1546300800000,
|
||||
Type: LINK_METADATA_TYPE_OPENGRAPH,
|
||||
Type: LinkMetadataTypeOpengraph,
|
||||
Data: &opengraph.OpenGraph{},
|
||||
},
|
||||
Expected: true,
|
||||
@@ -58,7 +58,7 @@ func TestLinkMetadataIsValid(t *testing.T) {
|
||||
Metadata: &LinkMetadata{
|
||||
URL: "http://example.com",
|
||||
Timestamp: 1546300800000,
|
||||
Type: LINK_METADATA_TYPE_NONE,
|
||||
Type: LinkMetadataTypeNone,
|
||||
Data: nil,
|
||||
},
|
||||
Expected: true,
|
||||
@@ -67,7 +67,7 @@ func TestLinkMetadataIsValid(t *testing.T) {
|
||||
Name: "should be invalid because of empty URL",
|
||||
Metadata: &LinkMetadata{
|
||||
Timestamp: 1546300800000,
|
||||
Type: LINK_METADATA_TYPE_IMAGE,
|
||||
Type: LinkMetadataTypeImage,
|
||||
Data: &PostImage{},
|
||||
},
|
||||
Expected: false,
|
||||
@@ -76,7 +76,7 @@ func TestLinkMetadataIsValid(t *testing.T) {
|
||||
Name: "should be invalid because of empty timestamp",
|
||||
Metadata: &LinkMetadata{
|
||||
URL: "http://example.com",
|
||||
Type: LINK_METADATA_TYPE_IMAGE,
|
||||
Type: LinkMetadataTypeImage,
|
||||
Data: &PostImage{},
|
||||
},
|
||||
Expected: false,
|
||||
@@ -86,7 +86,7 @@ func TestLinkMetadataIsValid(t *testing.T) {
|
||||
Metadata: &LinkMetadata{
|
||||
URL: "http://example.com",
|
||||
Timestamp: 1546300800001,
|
||||
Type: LINK_METADATA_TYPE_IMAGE,
|
||||
Type: LinkMetadataTypeImage,
|
||||
Data: &PostImage{},
|
||||
},
|
||||
Expected: false,
|
||||
@@ -106,7 +106,7 @@ func TestLinkMetadataIsValid(t *testing.T) {
|
||||
Metadata: &LinkMetadata{
|
||||
URL: "http://example.com",
|
||||
Timestamp: 1546300800000,
|
||||
Type: LINK_METADATA_TYPE_IMAGE,
|
||||
Type: LinkMetadataTypeImage,
|
||||
},
|
||||
Expected: false,
|
||||
},
|
||||
@@ -115,7 +115,7 @@ func TestLinkMetadataIsValid(t *testing.T) {
|
||||
Metadata: &LinkMetadata{
|
||||
URL: "http://example.com",
|
||||
Timestamp: 1546300800000,
|
||||
Type: LINK_METADATA_TYPE_IMAGE,
|
||||
Type: LinkMetadataTypeImage,
|
||||
Data: &opengraph.OpenGraph{},
|
||||
},
|
||||
Expected: false,
|
||||
@@ -125,7 +125,7 @@ func TestLinkMetadataIsValid(t *testing.T) {
|
||||
Metadata: &LinkMetadata{
|
||||
URL: "http://example.com",
|
||||
Timestamp: 1546300800000,
|
||||
Type: LINK_METADATA_TYPE_OPENGRAPH,
|
||||
Type: LinkMetadataTypeOpengraph,
|
||||
Data: &PostImage{},
|
||||
},
|
||||
Expected: false,
|
||||
@@ -135,7 +135,7 @@ func TestLinkMetadataIsValid(t *testing.T) {
|
||||
Metadata: &LinkMetadata{
|
||||
URL: "http://example.com",
|
||||
Timestamp: 1546300800000,
|
||||
Type: LINK_METADATA_TYPE_OPENGRAPH,
|
||||
Type: LinkMetadataTypeOpengraph,
|
||||
Data: &Channel{},
|
||||
},
|
||||
Expected: false,
|
||||
@@ -161,7 +161,7 @@ func TestLinkMetadataDeserializeDataToConcreteType(t *testing.T) {
|
||||
}
|
||||
|
||||
metadata := &LinkMetadata{
|
||||
Type: LINK_METADATA_TYPE_IMAGE,
|
||||
Type: LinkMetadataTypeImage,
|
||||
Data: []byte(image.ToJson()),
|
||||
}
|
||||
|
||||
@@ -190,7 +190,7 @@ func TestLinkMetadataDeserializeDataToConcreteType(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
metadata := &LinkMetadata{
|
||||
Type: LINK_METADATA_TYPE_OPENGRAPH,
|
||||
Type: LinkMetadataTypeOpengraph,
|
||||
Data: b,
|
||||
}
|
||||
|
||||
@@ -205,7 +205,7 @@ func TestLinkMetadataDeserializeDataToConcreteType(t *testing.T) {
|
||||
|
||||
t.Run("should ignore data of the correct type", func(t *testing.T) {
|
||||
metadata := &LinkMetadata{
|
||||
Type: LINK_METADATA_TYPE_OPENGRAPH,
|
||||
Type: LinkMetadataTypeOpengraph,
|
||||
Data: 1234,
|
||||
}
|
||||
|
||||
@@ -227,7 +227,7 @@ func TestLinkMetadataDeserializeDataToConcreteType(t *testing.T) {
|
||||
|
||||
t.Run("should return error for invalid data", func(t *testing.T) {
|
||||
metadata := &LinkMetadata{
|
||||
Type: LINK_METADATA_TYPE_IMAGE,
|
||||
Type: LinkMetadataTypeImage,
|
||||
Data: "garbage",
|
||||
}
|
||||
|
||||
@@ -283,7 +283,7 @@ func TestFirstNImages(t *testing.T) {
|
||||
sampleImage("fifth.ico"),
|
||||
sampleImage("notme.tiff"),
|
||||
}
|
||||
assert.Len(t, firstNImages(six, -10), MAX_IMAGES, "On negative, go for defaults")
|
||||
assert.Len(t, firstNImages(six, -10), LinkMetadataMaxImages, "On negative, go for defaults")
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
@@ -4,35 +4,35 @@
|
||||
package model
|
||||
|
||||
const (
|
||||
ADVANCED_PERMISSIONS_MIGRATION_KEY = "AdvancedPermissionsMigrationComplete"
|
||||
MIGRATION_KEY_ADVANCED_PERMISSIONS_PHASE_2 = "migration_advanced_permissions_phase_2"
|
||||
AdvancedPermissionsMigrationKey = "AdvancedPermissionsMigrationComplete"
|
||||
MigrationKeyAdvancedPermissionsPhase2 = "migration_advanced_permissions_phase_2"
|
||||
|
||||
MIGRATION_KEY_EMOJI_PERMISSIONS_SPLIT = "emoji_permissions_split"
|
||||
MIGRATION_KEY_WEBHOOK_PERMISSIONS_SPLIT = "webhook_permissions_split"
|
||||
MIGRATION_KEY_LIST_JOIN_PUBLIC_PRIVATE_TEAMS = "list_join_public_private_teams"
|
||||
MIGRATION_KEY_REMOVE_PERMANENT_DELETE_USER = "remove_permanent_delete_user"
|
||||
MIGRATION_KEY_ADD_BOT_PERMISSIONS = "add_bot_permissions"
|
||||
MIGRATION_KEY_APPLY_CHANNEL_MANAGE_DELETE_TO_CHANNEL_USER = "apply_channel_manage_delete_to_channel_user"
|
||||
MIGRATION_KEY_REMOVE_CHANNEL_MANAGE_DELETE_FROM_TEAM_USER = "remove_channel_manage_delete_from_team_user"
|
||||
MIGRATION_KEY_VIEW_MEMBERS_NEW_PERMISSION = "view_members_new_permission"
|
||||
MIGRATION_KEY_ADD_MANAGE_GUESTS_PERMISSIONS = "add_manage_guests_permissions"
|
||||
MIGRATION_KEY_CHANNEL_MODERATIONS_PERMISSIONS = "channel_moderations_permissions"
|
||||
MIGRATION_KEY_ADD_USE_GROUP_MENTIONS_PERMISSION = "add_use_group_mentions_permission"
|
||||
MIGRATION_KEY_ADD_SYSTEM_CONSOLE_PERMISSIONS = "add_system_console_permissions"
|
||||
MIGRATION_KEY_SIDEBAR_CATEGORIES_PHASE_2 = "migration_sidebar_categories_phase_2"
|
||||
MIGRATION_KEY_ADD_CONVERT_CHANNEL_PERMISSIONS = "add_convert_channel_permissions"
|
||||
MIGRATION_KEY_ADD_SYSTEM_ROLES_PERMISSIONS = "add_system_roles_permissions"
|
||||
MIGRATION_KEY_ADD_BILLING_PERMISSIONS = "add_billing_permissions"
|
||||
MIGRATION_KEY_ADD_MANAGE_SHARED_CHANNEL_PERMISSIONS = "manage_shared_channel_permissions"
|
||||
MIGRATION_KEY_ADD_MANAGE_SECURE_CONNECTIONS_PERMISSIONS = "manage_secure_connections_permissions"
|
||||
MIGRATION_KEY_ADD_DOWNLOAD_COMPLIANCE_EXPORT_RESULTS = "download_compliance_export_results"
|
||||
MIGRATION_KEY_ADD_COMPLIANCE_SUBSECTION_PERMISSIONS = "compliance_subsection_permissions"
|
||||
MIGRATION_KEY_ADD_EXPERIMENTAL_SUBSECTION_PERMISSIONS = "experimental_subsection_permissions"
|
||||
MIGRATION_KEY_ADD_AUTHENTICATION_SUBSECTION_PERMISSIONS = "authentication_subsection_permissions"
|
||||
MIGRATION_KEY_ADD_SITE_SUBSECTION_PERMISSIONS = "site_subsection_permissions"
|
||||
MIGRATION_KEY_ADD_ENVIRONMENT_SUBSECTION_PERMISSIONS = "environment_subsection_permissions"
|
||||
MIGRATION_KEY_ADD_REPORTING_SUBSECTION_PERMISSIONS = "reporting_subsection_permissions"
|
||||
MIGRATION_KEY_ADD_TEST_EMAIL_ANCILLARY_PERMISSION = "test_email_ancillary_permission"
|
||||
MIGRATION_KEY_ADD_ABOUT_SUBSECTION_PERMISSIONS = "about_subsection_permissions"
|
||||
MIGRATION_KEY_ADD_INTEGRATIONS_SUBSECTION_PERMISSIONS = "integrations_subsection_permissions"
|
||||
MigrationKeyEmojiPermissionsSplit = "emoji_permissions_split"
|
||||
MigrationKeyWebhookPermissionsSplit = "webhook_permissions_split"
|
||||
MigrationKeyListJoinPublicPrivateTeams = "list_join_public_private_teams"
|
||||
MigrationKeyRemovePermanentDeleteUser = "remove_permanent_delete_user"
|
||||
MigrationKeyAddBotPermissions = "add_bot_permissions"
|
||||
MigrationKeyApplyChannelManageDeleteToChannelUser = "apply_channel_manage_delete_to_channel_user"
|
||||
MigrationKeyRemoveChannelManageDeleteFromTeamUser = "remove_channel_manage_delete_from_team_user"
|
||||
MigrationKeyViewMembersNewPermission = "view_members_new_permission"
|
||||
MigrationKeyAddManageGuestsPermissions = "add_manage_guests_permissions"
|
||||
MigrationKeyChannelModerationsPermissions = "channel_moderations_permissions"
|
||||
MigrationKeyAddUseGroupMentionsPermission = "add_use_group_mentions_permission"
|
||||
MigrationKeyAddSystemConsolePermissions = "add_system_console_permissions"
|
||||
MigrationKeySidebarCategoriesPhase2 = "migration_sidebar_categories_phase_2"
|
||||
MigrationKeyAddConvertChannelPermissions = "add_convert_channel_permissions"
|
||||
MigrationKeyAddSystemRolesPermissions = "add_system_roles_permissions"
|
||||
MigrationKeyAddBillingPermissions = "add_billing_permissions"
|
||||
MigrationKeyAddManageSharedChannelPermissions = "manage_shared_channel_permissions"
|
||||
MigrationKeyAddManageSecureConnectionsPermissions = "manage_secure_connections_permissions"
|
||||
MigrationKeyAddDownloadComplianceExportResults = "download_compliance_export_results"
|
||||
MigrationKeyAddComplianceSubsectionPermissions = "compliance_subsection_permissions"
|
||||
MigrationKeyAddExperimentalSubsectionPermissions = "experimental_subsection_permissions"
|
||||
MigrationKeyAddAuthenticationSubsectionPermissions = "authentication_subsection_permissions"
|
||||
MigrationKeyAddSiteSubsectionPermissions = "site_subsection_permissions"
|
||||
MigrationKeyAddEnvironmentSubsectionPermissions = "environment_subsection_permissions"
|
||||
MigrationKeyAddReportingSubsectionPermissions = "reporting_subsection_permissions"
|
||||
MigrationKeyAddTestEmailAncillaryPermission = "test_email_ancillary_permission"
|
||||
MigrationKeyAddAboutSubsectionPermissions = "about_subsection_permissions"
|
||||
MigrationKeyAddIntegrationsSubsectionPermissions = "integrations_subsection_permissions"
|
||||
)
|
||||
|
||||
@@ -12,11 +12,11 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
OAUTH_ACTION_SIGNUP = "signup"
|
||||
OAUTH_ACTION_LOGIN = "login"
|
||||
OAUTH_ACTION_EMAIL_TO_SSO = "email_to_sso"
|
||||
OAUTH_ACTION_SSO_TO_EMAIL = "sso_to_email"
|
||||
OAUTH_ACTION_MOBILE = "mobile"
|
||||
OAuthActionSignup = "signup"
|
||||
OAuthActionLogin = "login"
|
||||
OAuthActionEmailToSSO = "email_to_sso"
|
||||
OAuthActionSSOToEmail = "sso_to_email"
|
||||
OAuthActionMobile = "mobile"
|
||||
)
|
||||
|
||||
type OAuthApp struct {
|
||||
|
||||
@@ -57,7 +57,7 @@ type OutgoingWebhookResponse struct {
|
||||
ResponseType string `json:"response_type"`
|
||||
}
|
||||
|
||||
const OUTGOING_HOOK_RESPONSE_TYPE_COMMENT = "comment"
|
||||
const OutgoingHookResponseTypeComment = "comment"
|
||||
|
||||
func (o *OutgoingWebhookPayload) ToJSON() string {
|
||||
b, _ := json.Marshal(o)
|
||||
|
||||
1516
model/permission.go
1516
model/permission.go
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
@@ -4,8 +4,8 @@
|
||||
package model
|
||||
|
||||
const (
|
||||
PluginClusterEventSendTypeReliable = CLUSTER_SEND_RELIABLE
|
||||
PluginClusterEventSendTypeBestEffort = CLUSTER_SEND_BEST_EFFORT
|
||||
PluginClusterEventSendTypeReliable = ClusterSendReliable
|
||||
PluginClusterEventSendTypeBestEffort = ClusterSendBestEffort
|
||||
)
|
||||
|
||||
// PluginClusterEvent is used to allow intra-cluster plugin communication.
|
||||
|
||||
@@ -9,8 +9,8 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
KEY_VALUE_PLUGIN_ID_MAX_RUNES = 190
|
||||
KEY_VALUE_KEY_MAX_RUNES = 50
|
||||
KeyValuePluginIdMaxRunes = 190
|
||||
KeyValueKeyMaxRunes = 50
|
||||
)
|
||||
|
||||
type PluginKeyValue struct {
|
||||
@@ -21,12 +21,12 @@ type PluginKeyValue struct {
|
||||
}
|
||||
|
||||
func (kv *PluginKeyValue) IsValid() *AppError {
|
||||
if kv.PluginId == "" || utf8.RuneCountInString(kv.PluginId) > KEY_VALUE_PLUGIN_ID_MAX_RUNES {
|
||||
return NewAppError("PluginKeyValue.IsValid", "model.plugin_key_value.is_valid.plugin_id.app_error", map[string]interface{}{"Max": KEY_VALUE_KEY_MAX_RUNES, "Min": 0}, "key="+kv.Key, http.StatusBadRequest)
|
||||
if kv.PluginId == "" || utf8.RuneCountInString(kv.PluginId) > KeyValuePluginIdMaxRunes {
|
||||
return NewAppError("PluginKeyValue.IsValid", "model.plugin_key_value.is_valid.plugin_id.app_error", map[string]interface{}{"Max": KeyValueKeyMaxRunes, "Min": 0}, "key="+kv.Key, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if kv.Key == "" || utf8.RuneCountInString(kv.Key) > KEY_VALUE_KEY_MAX_RUNES {
|
||||
return NewAppError("PluginKeyValue.IsValid", "model.plugin_key_value.is_valid.key.app_error", map[string]interface{}{"Max": KEY_VALUE_KEY_MAX_RUNES, "Min": 0}, "key="+kv.Key, http.StatusBadRequest)
|
||||
if kv.Key == "" || utf8.RuneCountInString(kv.Key) > KeyValueKeyMaxRunes {
|
||||
return NewAppError("PluginKeyValue.IsValid", "model.plugin_key_value.is_valid.key.app_error", map[string]interface{}{"Max": KeyValueKeyMaxRunes, "Min": 0}, "key="+kv.Key, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
186
model/post.go
186
model/post.go
@@ -18,56 +18,58 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
POST_SYSTEM_MESSAGE_PREFIX = "system_"
|
||||
POST_DEFAULT = ""
|
||||
POST_SLACK_ATTACHMENT = "slack_attachment"
|
||||
POST_SYSTEM_GENERIC = "system_generic"
|
||||
POST_JOIN_LEAVE = "system_join_leave" // Deprecated, use POST_JOIN_CHANNEL or POST_LEAVE_CHANNEL instead
|
||||
POST_JOIN_CHANNEL = "system_join_channel"
|
||||
POST_GUEST_JOIN_CHANNEL = "system_guest_join_channel"
|
||||
POST_LEAVE_CHANNEL = "system_leave_channel"
|
||||
POST_JOIN_TEAM = "system_join_team"
|
||||
POST_LEAVE_TEAM = "system_leave_team"
|
||||
POST_AUTO_RESPONDER = "system_auto_responder"
|
||||
POST_ADD_REMOVE = "system_add_remove" // Deprecated, use POST_ADD_TO_CHANNEL or POST_REMOVE_FROM_CHANNEL instead
|
||||
POST_ADD_TO_CHANNEL = "system_add_to_channel"
|
||||
POST_ADD_GUEST_TO_CHANNEL = "system_add_guest_to_chan"
|
||||
POST_REMOVE_FROM_CHANNEL = "system_remove_from_channel"
|
||||
POST_MOVE_CHANNEL = "system_move_channel"
|
||||
POST_ADD_TO_TEAM = "system_add_to_team"
|
||||
POST_REMOVE_FROM_TEAM = "system_remove_from_team"
|
||||
POST_HEADER_CHANGE = "system_header_change"
|
||||
POST_DISPLAYNAME_CHANGE = "system_displayname_change"
|
||||
POST_CONVERT_CHANNEL = "system_convert_channel"
|
||||
POST_PURPOSE_CHANGE = "system_purpose_change"
|
||||
POST_CHANNEL_DELETED = "system_channel_deleted"
|
||||
POST_CHANNEL_RESTORED = "system_channel_restored"
|
||||
POST_EPHEMERAL = "system_ephemeral"
|
||||
POST_CHANGE_CHANNEL_PRIVACY = "system_change_chan_privacy"
|
||||
POST_ADD_BOT_TEAMS_CHANNELS = "add_bot_teams_channels"
|
||||
POST_FILEIDS_MAX_RUNES = 300
|
||||
POST_FILENAMES_MAX_RUNES = 4000
|
||||
POST_HASHTAGS_MAX_RUNES = 1000
|
||||
POST_MESSAGE_MAX_RUNES_V1 = 4000
|
||||
POST_MESSAGE_MAX_BYTES_V2 = 65535 // Maximum size of a TEXT column in MySQL
|
||||
POST_MESSAGE_MAX_RUNES_V2 = POST_MESSAGE_MAX_BYTES_V2 / 4 // Assume a worst-case representation
|
||||
POST_PROPS_MAX_RUNES = 8000
|
||||
POST_PROPS_MAX_USER_RUNES = POST_PROPS_MAX_RUNES - 400 // Leave some room for system / pre-save modifications
|
||||
POST_CUSTOM_TYPE_PREFIX = "custom_"
|
||||
POST_ME = "me"
|
||||
PROPS_ADD_CHANNEL_MEMBER = "add_channel_member"
|
||||
PostSystemMessagePrefix = "system_"
|
||||
PostTypeDefault = ""
|
||||
PostTypeSlackAttachment = "slack_attachment"
|
||||
PostTypeSystemGeneric = "system_generic"
|
||||
PostTypeJoinLeave = "system_join_leave" // Deprecated, use PostJoinChannel or PostLeaveChannel instead
|
||||
PostTypeJoinChannel = "system_join_channel"
|
||||
PostTypeGuestJoinChannel = "system_guest_join_channel"
|
||||
PostTypeLeaveChannel = "system_leave_channel"
|
||||
PostTypeJoinTeam = "system_join_team"
|
||||
PostTypeLeaveTeam = "system_leave_team"
|
||||
PostTypeAutoResponder = "system_auto_responder"
|
||||
PostTypeAddRemove = "system_add_remove" // Deprecated, use PostAddToChannel or PostRemoveFromChannel instead
|
||||
PostTypeAddToChannel = "system_add_to_channel"
|
||||
PostTypeAddGuestToChannel = "system_add_guest_to_chan"
|
||||
PostTypeRemoveFromChannel = "system_remove_from_channel"
|
||||
PostTypeMoveChannel = "system_move_channel"
|
||||
PostTypeAddToTeam = "system_add_to_team"
|
||||
PostTypeRemoveFromTeam = "system_remove_from_team"
|
||||
PostTypeHeaderChange = "system_header_change"
|
||||
PostTypeDisplaynameChange = "system_displayname_change"
|
||||
PostTypeConvertChannel = "system_convert_channel"
|
||||
PostTypePurposeChange = "system_purpose_change"
|
||||
PostTypeChannelDeleted = "system_channel_deleted"
|
||||
PostTypeChannelRestored = "system_channel_restored"
|
||||
PostTypeEphemeral = "system_ephemeral"
|
||||
PostTypeChangeChannelPrivacy = "system_change_chan_privacy"
|
||||
PostTypeAddBotTeamsChannels = "add_bot_teams_channels"
|
||||
PostTypeSystemWarnMetricStatus = "warn_metric_status"
|
||||
PostTypeMe = "me"
|
||||
PostCustomTypePrefix = "custom_"
|
||||
|
||||
POST_PROPS_ADDED_USER_ID = "addedUserId"
|
||||
POST_PROPS_DELETE_BY = "deleteBy"
|
||||
POST_PROPS_OVERRIDE_ICON_URL = "override_icon_url"
|
||||
POST_PROPS_OVERRIDE_ICON_EMOJI = "override_icon_emoji"
|
||||
PostFileidsMaxRunes = 300
|
||||
PostFilenamesMaxRunes = 4000
|
||||
PostHashtagsMaxRunes = 1000
|
||||
PostMessageMaxRunesV1 = 4000
|
||||
PostMessageMaxBytesV2 = 65535 // Maximum size of a TEXT column in MySQL
|
||||
PostMessageMaxRunesV2 = PostMessageMaxBytesV2 / 4 // Assume a worst-case representation
|
||||
PostPropsMaxRunes = 8000
|
||||
PostPropsMaxUserRunes = PostPropsMaxRunes - 400 // Leave some room for system / pre-save modifications
|
||||
|
||||
POST_PROPS_MENTION_HIGHLIGHT_DISABLED = "mentionHighlightDisabled"
|
||||
POST_PROPS_GROUP_HIGHLIGHT_DISABLED = "disable_group_highlight"
|
||||
POST_SYSTEM_WARN_METRIC_STATUS = "warn_metric_status"
|
||||
PropsAddChannelMember = "add_channel_member"
|
||||
|
||||
PostPropsAddedUserId = "addedUserId"
|
||||
PostPropsDeleteBy = "deleteBy"
|
||||
PostPropsOverrideIconUrl = "override_icon_url"
|
||||
PostPropsOverrideIconEmoji = "override_icon_emoji"
|
||||
|
||||
PostPropsMentionHighlightDisabled = "mentionHighlightDisabled"
|
||||
PostPropsGroupHighlightDisabled = "disable_group_highlight"
|
||||
)
|
||||
|
||||
var AT_MENTION_PATTEN = regexp.MustCompile(`\B@`)
|
||||
var AtMentionPattern = regexp.MustCompile(`\B@`)
|
||||
|
||||
type Post struct {
|
||||
Id string `json:"id"`
|
||||
@@ -316,54 +318,54 @@ func (o *Post) IsValid(maxPostSize int) *AppError {
|
||||
return NewAppError("Post.IsValid", "model.post.is_valid.msg.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(o.Hashtags) > POST_HASHTAGS_MAX_RUNES {
|
||||
if utf8.RuneCountInString(o.Hashtags) > PostHashtagsMaxRunes {
|
||||
return NewAppError("Post.IsValid", "model.post.is_valid.hashtags.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
switch o.Type {
|
||||
case
|
||||
POST_DEFAULT,
|
||||
POST_SYSTEM_GENERIC,
|
||||
POST_JOIN_LEAVE,
|
||||
POST_AUTO_RESPONDER,
|
||||
POST_ADD_REMOVE,
|
||||
POST_JOIN_CHANNEL,
|
||||
POST_GUEST_JOIN_CHANNEL,
|
||||
POST_LEAVE_CHANNEL,
|
||||
POST_JOIN_TEAM,
|
||||
POST_LEAVE_TEAM,
|
||||
POST_ADD_TO_CHANNEL,
|
||||
POST_ADD_GUEST_TO_CHANNEL,
|
||||
POST_REMOVE_FROM_CHANNEL,
|
||||
POST_MOVE_CHANNEL,
|
||||
POST_ADD_TO_TEAM,
|
||||
POST_REMOVE_FROM_TEAM,
|
||||
POST_SLACK_ATTACHMENT,
|
||||
POST_HEADER_CHANGE,
|
||||
POST_PURPOSE_CHANGE,
|
||||
POST_DISPLAYNAME_CHANGE,
|
||||
POST_CONVERT_CHANNEL,
|
||||
POST_CHANNEL_DELETED,
|
||||
POST_CHANNEL_RESTORED,
|
||||
POST_CHANGE_CHANNEL_PRIVACY,
|
||||
POST_ME,
|
||||
POST_ADD_BOT_TEAMS_CHANNELS,
|
||||
POST_SYSTEM_WARN_METRIC_STATUS:
|
||||
PostTypeDefault,
|
||||
PostTypeSystemGeneric,
|
||||
PostTypeJoinLeave,
|
||||
PostTypeAutoResponder,
|
||||
PostTypeAddRemove,
|
||||
PostTypeJoinChannel,
|
||||
PostTypeGuestJoinChannel,
|
||||
PostTypeLeaveChannel,
|
||||
PostTypeJoinTeam,
|
||||
PostTypeLeaveTeam,
|
||||
PostTypeAddToChannel,
|
||||
PostTypeAddGuestToChannel,
|
||||
PostTypeRemoveFromChannel,
|
||||
PostTypeMoveChannel,
|
||||
PostTypeAddToTeam,
|
||||
PostTypeRemoveFromTeam,
|
||||
PostTypeSlackAttachment,
|
||||
PostTypeHeaderChange,
|
||||
PostTypePurposeChange,
|
||||
PostTypeDisplaynameChange,
|
||||
PostTypeConvertChannel,
|
||||
PostTypeChannelDeleted,
|
||||
PostTypeChannelRestored,
|
||||
PostTypeChangeChannelPrivacy,
|
||||
PostTypeAddBotTeamsChannels,
|
||||
PostTypeSystemWarnMetricStatus,
|
||||
PostTypeMe:
|
||||
default:
|
||||
if !strings.HasPrefix(o.Type, POST_CUSTOM_TYPE_PREFIX) {
|
||||
if !strings.HasPrefix(o.Type, PostCustomTypePrefix) {
|
||||
return NewAppError("Post.IsValid", "model.post.is_valid.type.app_error", nil, "id="+o.Type, http.StatusBadRequest)
|
||||
}
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(ArrayToJson(o.Filenames)) > POST_FILENAMES_MAX_RUNES {
|
||||
if utf8.RuneCountInString(ArrayToJson(o.Filenames)) > PostFilenamesMaxRunes {
|
||||
return NewAppError("Post.IsValid", "model.post.is_valid.filenames.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(ArrayToJson(o.FileIds)) > POST_FILEIDS_MAX_RUNES {
|
||||
if utf8.RuneCountInString(ArrayToJson(o.FileIds)) > PostFileidsMaxRunes {
|
||||
return NewAppError("Post.IsValid", "model.post.is_valid.file_ids.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(StringInterfaceToJson(o.GetProps())) > POST_PROPS_MAX_RUNES {
|
||||
if utf8.RuneCountInString(StringInterfaceToJson(o.GetProps())) > PostPropsMaxRunes {
|
||||
return NewAppError("Post.IsValid", "model.post.is_valid.props.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
@@ -375,7 +377,7 @@ func (o *Post) SanitizeProps() {
|
||||
return
|
||||
}
|
||||
membersToSanitize := []string{
|
||||
PROPS_ADD_CHANNEL_MEMBER,
|
||||
PropsAddChannelMember,
|
||||
}
|
||||
|
||||
for _, member := range membersToSanitize {
|
||||
@@ -469,7 +471,7 @@ func (o *Post) GetProp(key string) interface{} {
|
||||
}
|
||||
|
||||
func (o *Post) IsSystemMessage() bool {
|
||||
return len(o.Type) >= len(POST_SYSTEM_MESSAGE_PREFIX) && o.Type[:len(POST_SYSTEM_MESSAGE_PREFIX)] == POST_SYSTEM_MESSAGE_PREFIX
|
||||
return len(o.Type) >= len(PostSystemMessagePrefix) && o.Type[:len(PostSystemMessagePrefix)] == PostSystemMessagePrefix
|
||||
}
|
||||
|
||||
// IsRemote returns true if the post originated on a remote cluster.
|
||||
@@ -486,16 +488,16 @@ func (o *Post) GetRemoteID() string {
|
||||
}
|
||||
|
||||
func (o *Post) IsJoinLeaveMessage() bool {
|
||||
return o.Type == POST_JOIN_LEAVE ||
|
||||
o.Type == POST_ADD_REMOVE ||
|
||||
o.Type == POST_JOIN_CHANNEL ||
|
||||
o.Type == POST_LEAVE_CHANNEL ||
|
||||
o.Type == POST_JOIN_TEAM ||
|
||||
o.Type == POST_LEAVE_TEAM ||
|
||||
o.Type == POST_ADD_TO_CHANNEL ||
|
||||
o.Type == POST_REMOVE_FROM_CHANNEL ||
|
||||
o.Type == POST_ADD_TO_TEAM ||
|
||||
o.Type == POST_REMOVE_FROM_TEAM
|
||||
return o.Type == PostTypeJoinLeave ||
|
||||
o.Type == PostTypeAddRemove ||
|
||||
o.Type == PostTypeJoinChannel ||
|
||||
o.Type == PostTypeLeaveChannel ||
|
||||
o.Type == PostTypeJoinTeam ||
|
||||
o.Type == PostTypeLeaveTeam ||
|
||||
o.Type == PostTypeAddToChannel ||
|
||||
o.Type == PostTypeRemoveFromChannel ||
|
||||
o.Type == PostTypeAddToTeam ||
|
||||
o.Type == PostTypeRemoveFromTeam
|
||||
}
|
||||
|
||||
func (o *Post) Patch(patch *PostPatch) {
|
||||
@@ -568,7 +570,7 @@ func (o *Post) ChannelMentions() []string {
|
||||
func (o *Post) DisableMentionHighlights() string {
|
||||
mention, hasMentions := findAtChannelMention(o.Message)
|
||||
if hasMentions {
|
||||
o.AddProp(POST_PROPS_MENTION_HIGHLIGHT_DISABLED, true)
|
||||
o.AddProp(PostPropsMentionHighlightDisabled, true)
|
||||
}
|
||||
return mention
|
||||
}
|
||||
@@ -582,7 +584,7 @@ func (o *PostPatch) DisableMentionHighlights() {
|
||||
if o.Props == nil {
|
||||
o.Props = &StringInterface{}
|
||||
}
|
||||
(*o.Props)[POST_PROPS_MENTION_HIGHLIGHT_DISABLED] = true
|
||||
(*o.Props)[PostPropsMentionHighlightDisabled] = true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
package model
|
||||
|
||||
const (
|
||||
POST_EMBED_IMAGE PostEmbedType = "image"
|
||||
POST_EMBED_MESSAGE_ATTACHMENT PostEmbedType = "message_attachment"
|
||||
POST_EMBED_OPENGRAPH PostEmbedType = "opengraph"
|
||||
POST_EMBED_LINK PostEmbedType = "link"
|
||||
PostEmbedImage PostEmbedType = "image"
|
||||
PostEmbedMessageAttachment PostEmbedType = "message_attachment"
|
||||
PostEmbedOpengraph PostEmbedType = "opengraph"
|
||||
PostEmbedLink PostEmbedType = "link"
|
||||
)
|
||||
|
||||
type PostEmbedType string
|
||||
|
||||
@@ -81,7 +81,7 @@ func TestPostIsValid(t *testing.T) {
|
||||
err = o.IsValid(maxPostSize)
|
||||
require.NotNil(t, err)
|
||||
|
||||
o.Type = POST_CUSTOM_TYPE_PREFIX + "type"
|
||||
o.Type = PostCustomTypePrefix + "type"
|
||||
err = o.IsValid(maxPostSize)
|
||||
require.Nil(t, err)
|
||||
}
|
||||
@@ -107,7 +107,7 @@ func TestPostIsSystemMessage(t *testing.T) {
|
||||
|
||||
require.False(t, post1.IsSystemMessage())
|
||||
|
||||
post2 := Post{Message: "test_2", Type: POST_JOIN_LEAVE}
|
||||
post2 := Post{Message: "test_2", Type: PostTypeJoinLeave}
|
||||
post2.PreSave()
|
||||
|
||||
require.True(t, post2.IsSystemMessage())
|
||||
@@ -125,30 +125,30 @@ func TestPostSanitizeProps(t *testing.T) {
|
||||
|
||||
post1.SanitizeProps()
|
||||
|
||||
require.Nil(t, post1.GetProp(PROPS_ADD_CHANNEL_MEMBER))
|
||||
require.Nil(t, post1.GetProp(PropsAddChannelMember))
|
||||
|
||||
post2 := &Post{
|
||||
Message: "test",
|
||||
Props: StringInterface{
|
||||
PROPS_ADD_CHANNEL_MEMBER: "test",
|
||||
PropsAddChannelMember: "test",
|
||||
},
|
||||
}
|
||||
|
||||
post2.SanitizeProps()
|
||||
|
||||
require.Nil(t, post2.GetProp(PROPS_ADD_CHANNEL_MEMBER))
|
||||
require.Nil(t, post2.GetProp(PropsAddChannelMember))
|
||||
|
||||
post3 := &Post{
|
||||
Message: "test",
|
||||
Props: StringInterface{
|
||||
PROPS_ADD_CHANNEL_MEMBER: "no good",
|
||||
"attachments": "good",
|
||||
PropsAddChannelMember: "no good",
|
||||
"attachments": "good",
|
||||
},
|
||||
}
|
||||
|
||||
post3.SanitizeProps()
|
||||
|
||||
require.Nil(t, post3.GetProp(PROPS_ADD_CHANNEL_MEMBER))
|
||||
require.Nil(t, post3.GetProp(PropsAddChannelMember))
|
||||
|
||||
require.NotNil(t, post3.GetProp("attachments"))
|
||||
}
|
||||
@@ -778,21 +778,21 @@ func TestPostDisableMentionHighlights(t *testing.T) {
|
||||
"",
|
||||
},
|
||||
{
|
||||
"Sets POST_PROPS_MENTION_HIGHLIGHT_DISABLED and returns mention",
|
||||
"Sets PostPropsMentionHighlightDisabled and returns mention",
|
||||
"Sample message with @here",
|
||||
StringInterface{POST_PROPS_MENTION_HIGHLIGHT_DISABLED: true},
|
||||
StringInterface{PostPropsMentionHighlightDisabled: true},
|
||||
"@here",
|
||||
},
|
||||
{
|
||||
"Sets POST_PROPS_MENTION_HIGHLIGHT_DISABLED and returns mention",
|
||||
"Sets PostPropsMentionHighlightDisabled and returns mention",
|
||||
"Sample message with @channel",
|
||||
StringInterface{POST_PROPS_MENTION_HIGHLIGHT_DISABLED: true},
|
||||
StringInterface{PostPropsMentionHighlightDisabled: true},
|
||||
"@channel",
|
||||
},
|
||||
{
|
||||
"Sets POST_PROPS_MENTION_HIGHLIGHT_DISABLED and returns mention",
|
||||
"Sets PostPropsMentionHighlightDisabled and returns mention",
|
||||
"Sample message with @all",
|
||||
StringInterface{POST_PROPS_MENTION_HIGHLIGHT_DISABLED: true},
|
||||
StringInterface{PostPropsMentionHighlightDisabled: true},
|
||||
"@all",
|
||||
},
|
||||
}
|
||||
@@ -821,19 +821,19 @@ func TestPostPatchDisableMentionHighlights(t *testing.T) {
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"Sets POST_PROPS_MENTION_HIGHLIGHT_DISABLED",
|
||||
"Sets PostPropsMentionHighlightDisabled",
|
||||
"Sample message with @here",
|
||||
&StringInterface{POST_PROPS_MENTION_HIGHLIGHT_DISABLED: true},
|
||||
&StringInterface{PostPropsMentionHighlightDisabled: true},
|
||||
},
|
||||
{
|
||||
"Sets POST_PROPS_MENTION_HIGHLIGHT_DISABLED",
|
||||
"Sets PostPropsMentionHighlightDisabled",
|
||||
"Sample message with @channel",
|
||||
&StringInterface{POST_PROPS_MENTION_HIGHLIGHT_DISABLED: true},
|
||||
&StringInterface{PostPropsMentionHighlightDisabled: true},
|
||||
},
|
||||
{
|
||||
"Sets POST_PROPS_MENTION_HIGHLIGHT_DISABLED",
|
||||
"Sets PostPropsMentionHighlightDisabled",
|
||||
"Sample message with @all",
|
||||
&StringInterface{POST_PROPS_MENTION_HIGHLIGHT_DISABLED: true},
|
||||
&StringInterface{PostPropsMentionHighlightDisabled: true},
|
||||
},
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
|
||||
@@ -13,48 +13,48 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW = "direct_channel_show"
|
||||
PREFERENCE_CATEGORY_GROUP_CHANNEL_SHOW = "group_channel_show"
|
||||
PREFERENCE_CATEGORY_TUTORIAL_STEPS = "tutorial_step"
|
||||
PREFERENCE_CATEGORY_ADVANCED_SETTINGS = "advanced_settings"
|
||||
PREFERENCE_CATEGORY_FLAGGED_POST = "flagged_post"
|
||||
PREFERENCE_CATEGORY_FAVORITE_CHANNEL = "favorite_channel"
|
||||
PREFERENCE_CATEGORY_SIDEBAR_SETTINGS = "sidebar_settings"
|
||||
PreferenceCategoryDirectChannelShow = "direct_channel_show"
|
||||
PreferenceCategoryGroupChannelShow = "group_channel_show"
|
||||
PreferenceCategoryTutorialSteps = "tutorial_step"
|
||||
PreferenceCategoryAdvancedSettings = "advanced_settings"
|
||||
PreferenceCategoryFlaggedPost = "flagged_post"
|
||||
PreferenceCategoryFavoriteChannel = "favorite_channel"
|
||||
PreferenceCategorySidebarSettings = "sidebar_settings"
|
||||
|
||||
PREFERENCE_CATEGORY_DISPLAY_SETTINGS = "display_settings"
|
||||
PREFERENCE_NAME_COLLAPSED_THREADS_ENABLED = "collapsed_reply_threads"
|
||||
PREFERENCE_NAME_CHANNEL_DISPLAY_MODE = "channel_display_mode"
|
||||
PREFERENCE_NAME_COLLAPSE_SETTING = "collapse_previews"
|
||||
PREFERENCE_NAME_MESSAGE_DISPLAY = "message_display"
|
||||
PREFERENCE_NAME_NAME_FORMAT = "name_format"
|
||||
PREFERENCE_NAME_USE_MILITARY_TIME = "use_military_time"
|
||||
PreferenceCategoryDisplaySettings = "display_settings"
|
||||
PreferenceNameCollapsedThreadsEnabled = "collapsed_reply_threads"
|
||||
PreferenceNameChannelDisplayMode = "channel_display_mode"
|
||||
PreferenceNameCollapseSetting = "collapse_previews"
|
||||
PreferenceNameMessageDisplay = "message_display"
|
||||
PreferenceNameNameFormat = "name_format"
|
||||
PreferenceNameUseMilitaryTime = "use_military_time"
|
||||
|
||||
PREFERENCE_CATEGORY_THEME = "theme"
|
||||
PreferenceCategoryTheme = "theme"
|
||||
// the name for theme props is the team id
|
||||
|
||||
PREFERENCE_CATEGORY_AUTHORIZED_OAUTH_APP = "oauth_app"
|
||||
PreferenceCategoryAuthorizedOAuthApp = "oauth_app"
|
||||
// the name for oauth_app is the client_id and value is the current scope
|
||||
|
||||
PREFERENCE_CATEGORY_LAST = "last"
|
||||
PREFERENCE_NAME_LAST_CHANNEL = "channel"
|
||||
PREFERENCE_NAME_LAST_TEAM = "team"
|
||||
PreferenceCategoryLast = "last"
|
||||
PreferenceNameLastChannel = "channel"
|
||||
PreferenceNameLastTeam = "team"
|
||||
|
||||
PREFERENCE_CATEGORY_CUSTOM_STATUS = "custom_status"
|
||||
PREFERENCE_NAME_RECENT_CUSTOM_STATUSES = "recent_custom_statuses"
|
||||
PREFERENCE_NAME_CUSTOM_STATUS_TUTORIAL_STATE = "custom_status_tutorial_state"
|
||||
PreferenceCategoryCustomStatus = "custom_status"
|
||||
PreferenceNameRecentCustomStatuses = "recent_custom_statuses"
|
||||
PreferenceNameCustomStatusTutorialState = "custom_status_tutorial_state"
|
||||
|
||||
PREFERENCE_CUSTOM_STATUS_MODAL_VIEWED = "custom_status_modal_viewed"
|
||||
PreferenceCustomStatusModalViewed = "custom_status_modal_viewed"
|
||||
|
||||
PREFERENCE_CATEGORY_NOTIFICATIONS = "notifications"
|
||||
PREFERENCE_NAME_EMAIL_INTERVAL = "email_interval"
|
||||
PreferenceCategoryNotifications = "notifications"
|
||||
PreferenceNameEmailInterval = "email_interval"
|
||||
|
||||
PREFERENCE_EMAIL_INTERVAL_NO_BATCHING_SECONDS = "30" // the "immediate" setting is actually 30s
|
||||
PREFERENCE_EMAIL_INTERVAL_BATCHING_SECONDS = "900" // fifteen minutes is 900 seconds
|
||||
PREFERENCE_EMAIL_INTERVAL_IMMEDIATELY = "immediately"
|
||||
PREFERENCE_EMAIL_INTERVAL_FIFTEEN = "fifteen"
|
||||
PREFERENCE_EMAIL_INTERVAL_FIFTEEN_AS_SECONDS = "900"
|
||||
PREFERENCE_EMAIL_INTERVAL_HOUR = "hour"
|
||||
PREFERENCE_EMAIL_INTERVAL_HOUR_AS_SECONDS = "3600"
|
||||
PreferenceEmailIntervalNoBatchingSeconds = "30" // the "immediate" setting is actually 30s
|
||||
PreferenceEmailIntervalBatchingSeconds = "900" // fifteen minutes is 900 seconds
|
||||
PreferenceEmailIntervalImmediately = "immediately"
|
||||
PreferenceEmailIntervalFifteen = "fifteen"
|
||||
PreferenceEmailIntervalFifteenAsSeconds = "900"
|
||||
PreferenceEmailIntervalHour = "hour"
|
||||
PreferenceEmailIntervalHourAsSeconds = "3600"
|
||||
)
|
||||
|
||||
type Preference struct {
|
||||
@@ -92,7 +92,7 @@ func (o *Preference) IsValid() *AppError {
|
||||
return NewAppError("Preference.IsValid", "model.preference.is_valid.value.app_error", nil, "value="+o.Value, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if o.Category == PREFERENCE_CATEGORY_THEME {
|
||||
if o.Category == PreferenceCategoryTheme {
|
||||
var unused map[string]string
|
||||
if err := json.NewDecoder(strings.NewReader(o.Value)).Decode(&unused); err != nil {
|
||||
return NewAppError("Preference.IsValid", "model.preference.is_valid.theme.app_error", nil, "value="+o.Value, http.StatusBadRequest)
|
||||
@@ -103,7 +103,7 @@ func (o *Preference) IsValid() *AppError {
|
||||
}
|
||||
|
||||
func (o *Preference) PreUpdate() {
|
||||
if o.Category == PREFERENCE_CATEGORY_THEME {
|
||||
if o.Category == PreferenceCategoryTheme {
|
||||
// decode the value of theme (a map of strings to string) and eliminate any invalid values
|
||||
var props map[string]string
|
||||
if err := json.NewDecoder(strings.NewReader(o.Value)).Decode(&props); err != nil {
|
||||
|
||||
@@ -14,7 +14,7 @@ import (
|
||||
func TestPreferenceIsValid(t *testing.T) {
|
||||
preference := Preference{
|
||||
UserId: "1234garbage",
|
||||
Category: PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW,
|
||||
Category: PreferenceCategoryDirectChannelShow,
|
||||
Name: NewId(),
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ func TestPreferenceIsValid(t *testing.T) {
|
||||
preference.Category = strings.Repeat("01234567890", 20)
|
||||
require.NotNil(t, preference.IsValid())
|
||||
|
||||
preference.Category = PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW
|
||||
preference.Category = PreferenceCategoryDirectChannelShow
|
||||
require.Nil(t, preference.IsValid())
|
||||
|
||||
preference.Name = strings.Repeat("01234567890", 20)
|
||||
@@ -41,7 +41,7 @@ func TestPreferenceIsValid(t *testing.T) {
|
||||
preference.Value = "1234garbage"
|
||||
require.Nil(t, preference.IsValid())
|
||||
|
||||
preference.Category = PREFERENCE_CATEGORY_THEME
|
||||
preference.Category = PreferenceCategoryTheme
|
||||
require.NotNil(t, preference.IsValid())
|
||||
|
||||
preference.Value = `{"color": "#ff0000", "color2": "#faf"}`
|
||||
@@ -50,7 +50,7 @@ func TestPreferenceIsValid(t *testing.T) {
|
||||
|
||||
func TestPreferencePreUpdate(t *testing.T) {
|
||||
preference := Preference{
|
||||
Category: PREFERENCE_CATEGORY_THEME,
|
||||
Category: PreferenceCategoryTheme,
|
||||
Value: `{"color": "#ff0000", "color2": "#faf", "codeTheme": "github", "invalid": "invalid"}`,
|
||||
}
|
||||
|
||||
|
||||
@@ -32,11 +32,11 @@ type ProductNotice struct {
|
||||
}
|
||||
|
||||
func (n *ProductNotice) SysAdminOnly() bool {
|
||||
return n.Conditions.Audience != nil && *n.Conditions.Audience == NoticeAudience_Sysadmin
|
||||
return n.Conditions.Audience != nil && *n.Conditions.Audience == NoticeAudienceSysadmin
|
||||
}
|
||||
|
||||
func (n *ProductNotice) TeamAdminOnly() bool {
|
||||
return n.Conditions.Audience != nil && *n.Conditions.Audience == NoticeAudience_TeamAdmin
|
||||
return n.Conditions.Audience != nil && *n.Conditions.Audience == NoticeAudienceTeamAdmin
|
||||
}
|
||||
|
||||
type Conditions struct {
|
||||
@@ -91,23 +91,23 @@ func NewNoticeAudience(s NoticeAudience) *NoticeAudience {
|
||||
|
||||
func (a *NoticeAudience) Matches(sysAdmin bool, teamAdmin bool) bool {
|
||||
switch *a {
|
||||
case NoticeAudience_All:
|
||||
case NoticeAudienceAll:
|
||||
return true
|
||||
case NoticeAudience_Member:
|
||||
case NoticeAudienceMember:
|
||||
return !sysAdmin && !teamAdmin
|
||||
case NoticeAudience_Sysadmin:
|
||||
case NoticeAudienceSysadmin:
|
||||
return sysAdmin
|
||||
case NoticeAudience_TeamAdmin:
|
||||
case NoticeAudienceTeamAdmin:
|
||||
return teamAdmin
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
const (
|
||||
NoticeAudience_All NoticeAudience = "all"
|
||||
NoticeAudience_Member NoticeAudience = "member"
|
||||
NoticeAudience_Sysadmin NoticeAudience = "sysadmin"
|
||||
NoticeAudience_TeamAdmin NoticeAudience = "teamadmin"
|
||||
NoticeAudienceAll NoticeAudience = "all"
|
||||
NoticeAudienceMember NoticeAudience = "member"
|
||||
NoticeAudienceSysadmin NoticeAudience = "sysadmin"
|
||||
NoticeAudienceTeamAdmin NoticeAudience = "teamadmin"
|
||||
)
|
||||
|
||||
// Only show the notice on specific clients. Defaults to 'all'
|
||||
@@ -119,36 +119,36 @@ func NewNoticeClientType(s NoticeClientType) *NoticeClientType { return &s }
|
||||
|
||||
func (c *NoticeClientType) Matches(other NoticeClientType) bool {
|
||||
switch *c {
|
||||
case NoticeClientType_All:
|
||||
case NoticeClientTypeAll:
|
||||
return true
|
||||
case NoticeClientType_Mobile:
|
||||
return other == NoticeClientType_MobileIos || other == NoticeClientType_MobileAndroid
|
||||
case NoticeClientTypeMobile:
|
||||
return other == NoticeClientTypeMobileIos || other == NoticeClientTypeMobileAndroid
|
||||
default:
|
||||
return *c == other
|
||||
}
|
||||
}
|
||||
|
||||
const (
|
||||
NoticeClientType_All NoticeClientType = "all"
|
||||
NoticeClientType_Desktop NoticeClientType = "desktop"
|
||||
NoticeClientType_Mobile NoticeClientType = "mobile"
|
||||
NoticeClientType_MobileAndroid NoticeClientType = "mobile-android"
|
||||
NoticeClientType_MobileIos NoticeClientType = "mobile-ios"
|
||||
NoticeClientType_Web NoticeClientType = "web"
|
||||
NoticeClientTypeAll NoticeClientType = "all"
|
||||
NoticeClientTypeDesktop NoticeClientType = "desktop"
|
||||
NoticeClientTypeMobile NoticeClientType = "mobile"
|
||||
NoticeClientTypeMobileAndroid NoticeClientType = "mobile-android"
|
||||
NoticeClientTypeMobileIos NoticeClientType = "mobile-ios"
|
||||
NoticeClientTypeWeb NoticeClientType = "web"
|
||||
)
|
||||
|
||||
func NoticeClientTypeFromString(s string) (NoticeClientType, error) {
|
||||
switch s {
|
||||
case "web":
|
||||
return NoticeClientType_Web, nil
|
||||
return NoticeClientTypeWeb, nil
|
||||
case "mobile-ios":
|
||||
return NoticeClientType_MobileIos, nil
|
||||
return NoticeClientTypeMobileIos, nil
|
||||
case "mobile-android":
|
||||
return NoticeClientType_MobileAndroid, nil
|
||||
return NoticeClientTypeMobileAndroid, nil
|
||||
case "desktop":
|
||||
return NoticeClientType_Desktop, nil
|
||||
return NoticeClientTypeDesktop, nil
|
||||
}
|
||||
return NoticeClientType_All, errors.New("Invalid client type supplied")
|
||||
return NoticeClientTypeAll, errors.New("Invalid client type supplied")
|
||||
}
|
||||
|
||||
// Instance type. Defaults to "both"
|
||||
@@ -156,22 +156,22 @@ type NoticeInstanceType string
|
||||
|
||||
func NewNoticeInstanceType(n NoticeInstanceType) *NoticeInstanceType { return &n }
|
||||
func (t *NoticeInstanceType) Matches(isCloud bool) bool {
|
||||
if *t == NoticeInstanceType_Both {
|
||||
if *t == NoticeInstanceTypeBoth {
|
||||
return true
|
||||
}
|
||||
if *t == NoticeInstanceType_Cloud && !isCloud {
|
||||
if *t == NoticeInstanceTypeCloud && !isCloud {
|
||||
return false
|
||||
}
|
||||
if *t == NoticeInstanceType_OnPrem && isCloud {
|
||||
if *t == NoticeInstanceTypeOnPrem && isCloud {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
const (
|
||||
NoticeInstanceType_Both NoticeInstanceType = "both"
|
||||
NoticeInstanceType_Cloud NoticeInstanceType = "cloud"
|
||||
NoticeInstanceType_OnPrem NoticeInstanceType = "onprem"
|
||||
NoticeInstanceTypeBoth NoticeInstanceType = "both"
|
||||
NoticeInstanceTypeCloud NoticeInstanceType = "cloud"
|
||||
NoticeInstanceTypeOnPrem NoticeInstanceType = "onprem"
|
||||
)
|
||||
|
||||
// SKU. Defaults to "all"
|
||||
@@ -180,9 +180,9 @@ type NoticeSKU string
|
||||
func NewNoticeSKU(s NoticeSKU) *NoticeSKU { return &s }
|
||||
func (c *NoticeSKU) Matches(s string) bool {
|
||||
switch *c {
|
||||
case NoticeSKU_All:
|
||||
case NoticeSKUAll:
|
||||
return true
|
||||
case NoticeSKU_E0, NoticeSKU_Team:
|
||||
case NoticeSKUE0, NoticeSKUTeam:
|
||||
return s == ""
|
||||
default:
|
||||
return s == string(*c)
|
||||
@@ -190,11 +190,11 @@ func (c *NoticeSKU) Matches(s string) bool {
|
||||
}
|
||||
|
||||
const (
|
||||
NoticeSKU_E0 NoticeSKU = "e0"
|
||||
NoticeSKU_E10 NoticeSKU = "e10"
|
||||
NoticeSKU_E20 NoticeSKU = "e20"
|
||||
NoticeSKU_All NoticeSKU = "all"
|
||||
NoticeSKU_Team NoticeSKU = "team"
|
||||
NoticeSKUE0 NoticeSKU = "e0"
|
||||
NoticeSKUE10 NoticeSKU = "e10"
|
||||
NoticeSKUE20 NoticeSKU = "e20"
|
||||
NoticeSKUAll NoticeSKU = "all"
|
||||
NoticeSKUTeam NoticeSKU = "team"
|
||||
)
|
||||
|
||||
// Optional action to perform on action button click. (defaults to closing the notice)
|
||||
|
||||
@@ -11,29 +11,29 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
PUSH_NOTIFY_APPLE = "apple"
|
||||
PUSH_NOTIFY_ANDROID = "android"
|
||||
PUSH_NOTIFY_APPLE_REACT_NATIVE = "apple_rn"
|
||||
PUSH_NOTIFY_ANDROID_REACT_NATIVE = "android_rn"
|
||||
PushNotifyApple = "apple"
|
||||
PushNotifyAndroid = "android"
|
||||
PushNotifyAppleReactNative = "apple_rn"
|
||||
PushNotifyAndroidReactNative = "android_rn"
|
||||
|
||||
PUSH_TYPE_MESSAGE = "message"
|
||||
PUSH_TYPE_CLEAR = "clear"
|
||||
PUSH_TYPE_UPDATE_BADGE = "update_badge"
|
||||
PUSH_TYPE_SESSION = "session"
|
||||
PUSH_MESSAGE_V2 = "v2"
|
||||
PushTypeMessage = "message"
|
||||
PushTypeClear = "clear"
|
||||
PushTypeUpdateBadge = "update_badge"
|
||||
PushTypeSession = "session"
|
||||
PushMessageV2 = "v2"
|
||||
|
||||
PUSH_SOUND_NONE = "none"
|
||||
PushSoundNone = "none"
|
||||
|
||||
// The category is set to handle a set of interactive Actions
|
||||
// with the push notifications
|
||||
CATEGORY_CAN_REPLY = "CAN_REPLY"
|
||||
CategoryCanReply = "CAN_REPLY"
|
||||
|
||||
MHPNS = "https://push.mattermost.com"
|
||||
|
||||
PUSH_SEND_PREPARE = "Prepared to send"
|
||||
PUSH_SEND_SUCCESS = "Successful"
|
||||
PUSH_NOT_SENT = "Not Sent due to preferences"
|
||||
PUSH_RECEIVED = "Received by device"
|
||||
PushSendPrepare = "Prepared to send"
|
||||
PushSendSuccess = "Successful"
|
||||
PushNotSent = "Not Sent due to preferences"
|
||||
PushReceived = "Received by device"
|
||||
)
|
||||
|
||||
type PushNotificationAck struct {
|
||||
|
||||
@@ -9,31 +9,31 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
PUSH_STATUS = "status"
|
||||
PUSH_STATUS_OK = "OK"
|
||||
PUSH_STATUS_FAIL = "FAIL"
|
||||
PUSH_STATUS_REMOVE = "REMOVE"
|
||||
PUSH_STATUS_ERROR_MSG = "error"
|
||||
PushStatus = "status"
|
||||
PushStatusOk = "OK"
|
||||
PushStatusFail = "FAIL"
|
||||
PushStatusRemove = "REMOVE"
|
||||
PushStatusErrorMsg = "error"
|
||||
)
|
||||
|
||||
type PushResponse map[string]string
|
||||
|
||||
func NewOkPushResponse() PushResponse {
|
||||
m := make(map[string]string)
|
||||
m[PUSH_STATUS] = PUSH_STATUS_OK
|
||||
m[PushStatus] = PushStatusOk
|
||||
return m
|
||||
}
|
||||
|
||||
func NewRemovePushResponse() PushResponse {
|
||||
m := make(map[string]string)
|
||||
m[PUSH_STATUS] = PUSH_STATUS_REMOVE
|
||||
m[PushStatus] = PushStatusRemove
|
||||
return m
|
||||
}
|
||||
|
||||
func NewErrorPushResponse(message string) PushResponse {
|
||||
m := make(map[string]string)
|
||||
m[PUSH_STATUS] = PUSH_STATUS_FAIL
|
||||
m[PUSH_STATUS_ERROR_MSG] = message
|
||||
m[PushStatus] = PushStatusFail
|
||||
m[PushStatusErrorMsg] = message
|
||||
return m
|
||||
}
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ func (o *Reaction) IsValid() *AppError {
|
||||
|
||||
validName := regexp.MustCompile(`^[a-zA-Z0-9\-\+_]+$`)
|
||||
|
||||
if o.EmojiName == "" || len(o.EmojiName) > EMOJI_NAME_MAX_LENGTH || !validName.MatchString(o.EmojiName) {
|
||||
if o.EmojiName == "" || len(o.EmojiName) > EmojiNameMaxLength || !validName.MatchString(o.EmojiName) {
|
||||
return NewAppError("Reaction.IsValid", "model.reaction.is_valid.emoji_name.app_error", nil, "emoji_name="+o.EmojiName, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
|
||||
726
model/role.go
726
model/role.go
@@ -21,317 +21,317 @@ var NewSystemRoleIDs []string
|
||||
|
||||
func init() {
|
||||
NewSystemRoleIDs = []string{
|
||||
SYSTEM_USER_MANAGER_ROLE_ID,
|
||||
SYSTEM_READ_ONLY_ADMIN_ROLE_ID,
|
||||
SYSTEM_MANAGER_ROLE_ID,
|
||||
SystemUserManagerRoleId,
|
||||
SystemReadOnlyAdminRoleId,
|
||||
SystemManagerRoleId,
|
||||
}
|
||||
|
||||
BuiltInSchemeManagedRoleIDs = append([]string{
|
||||
SYSTEM_GUEST_ROLE_ID,
|
||||
SYSTEM_USER_ROLE_ID,
|
||||
SYSTEM_ADMIN_ROLE_ID,
|
||||
SYSTEM_POST_ALL_ROLE_ID,
|
||||
SYSTEM_POST_ALL_PUBLIC_ROLE_ID,
|
||||
SYSTEM_USER_ACCESS_TOKEN_ROLE_ID,
|
||||
SystemGuestRoleId,
|
||||
SystemUserRoleId,
|
||||
SystemAdminRoleId,
|
||||
SystemPostAllRoleId,
|
||||
SystemPostAllPublicRoleId,
|
||||
SystemUserAccessTokenRoleId,
|
||||
|
||||
TEAM_GUEST_ROLE_ID,
|
||||
TEAM_USER_ROLE_ID,
|
||||
TEAM_ADMIN_ROLE_ID,
|
||||
TEAM_POST_ALL_ROLE_ID,
|
||||
TEAM_POST_ALL_PUBLIC_ROLE_ID,
|
||||
TeamGuestRoleId,
|
||||
TeamUserRoleId,
|
||||
TeamAdminRoleId,
|
||||
TeamPostAllRoleId,
|
||||
TeamPostAllPublicRoleId,
|
||||
|
||||
CHANNEL_GUEST_ROLE_ID,
|
||||
CHANNEL_USER_ROLE_ID,
|
||||
CHANNEL_ADMIN_ROLE_ID,
|
||||
ChannelGuestRoleId,
|
||||
ChannelUserRoleId,
|
||||
ChannelAdminRoleId,
|
||||
}, NewSystemRoleIDs...)
|
||||
|
||||
// When updating the values here, the values in mattermost-redux must also be updated.
|
||||
SysconsoleAncillaryPermissions = map[string][]*Permission{
|
||||
PERMISSION_SYSCONSOLE_READ_ABOUT_EDITION_AND_LICENSE.Id: {
|
||||
PERMISSION_READ_LICENSE_INFORMATION,
|
||||
PermissionSysconsoleReadAboutEditionAndLicense.Id: {
|
||||
PermissionReadLicenseInformation,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_ABOUT_EDITION_AND_LICENSE.Id: {
|
||||
PERMISSION_MANAGE_LICENSE_INFORMATION,
|
||||
PermissionSysconsoleWriteAboutEditionAndLicense.Id: {
|
||||
PermissionManageLicenseInformation,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_CHANNELS.Id: {
|
||||
PERMISSION_READ_PUBLIC_CHANNEL,
|
||||
PERMISSION_READ_CHANNEL,
|
||||
PERMISSION_READ_PUBLIC_CHANNEL_GROUPS,
|
||||
PERMISSION_READ_PRIVATE_CHANNEL_GROUPS,
|
||||
PermissionSysconsoleReadUserManagementChannels.Id: {
|
||||
PermissionReadPublicChannel,
|
||||
PermissionReadChannel,
|
||||
PermissionReadPublicChannelGroups,
|
||||
PermissionReadPrivateChannelGroups,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_USERS.Id: {
|
||||
PERMISSION_READ_OTHER_USERS_TEAMS,
|
||||
PERMISSION_GET_ANALYTICS,
|
||||
PermissionSysconsoleReadUserManagementUsers.Id: {
|
||||
PermissionReadOtherUsersTeams,
|
||||
PermissionGetAnalytics,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_TEAMS.Id: {
|
||||
PERMISSION_LIST_PRIVATE_TEAMS,
|
||||
PERMISSION_LIST_PUBLIC_TEAMS,
|
||||
PERMISSION_VIEW_TEAM,
|
||||
PermissionSysconsoleReadUserManagementTeams.Id: {
|
||||
PermissionListPrivateTeams,
|
||||
PermissionListPublicTeams,
|
||||
PermissionViewTeam,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_ELASTICSEARCH.Id: {
|
||||
PERMISSION_READ_ELASTICSEARCH_POST_INDEXING_JOB,
|
||||
PERMISSION_READ_ELASTICSEARCH_POST_AGGREGATION_JOB,
|
||||
PermissionSysconsoleReadEnvironmentElasticsearch.Id: {
|
||||
PermissionReadElasticsearchPostIndexingJob,
|
||||
PermissionReadElasticsearchPostAggregationJob,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_WEB_SERVER.Id: {
|
||||
PERMISSION_TEST_SITE_URL,
|
||||
PERMISSION_RELOAD_CONFIG,
|
||||
PERMISSION_INVALIDATE_CACHES,
|
||||
PermissionSysconsoleWriteEnvironmentWebServer.Id: {
|
||||
PermissionTestSiteUrl,
|
||||
PermissionReloadConfig,
|
||||
PermissionInvalidateCaches,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_DATABASE.Id: {
|
||||
PERMISSION_RECYCLE_DATABASE_CONNECTIONS,
|
||||
PermissionSysconsoleWriteEnvironmentDatabase.Id: {
|
||||
PermissionRecycleDatabaseConnections,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_ELASTICSEARCH.Id: {
|
||||
PERMISSION_TEST_ELASTICSEARCH,
|
||||
PERMISSION_CREATE_ELASTICSEARCH_POST_INDEXING_JOB,
|
||||
PERMISSION_CREATE_ELASTICSEARCH_POST_AGGREGATION_JOB,
|
||||
PERMISSION_PURGE_ELASTICSEARCH_INDEXES,
|
||||
PermissionSysconsoleWriteEnvironmentElasticsearch.Id: {
|
||||
PermissionTestElasticsearch,
|
||||
PermissionCreateElasticsearchPostIndexingJob,
|
||||
PermissionCreateElasticsearchPostAggregationJob,
|
||||
PermissionPurgeElasticsearchIndexes,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_FILE_STORAGE.Id: {
|
||||
PERMISSION_TEST_S3,
|
||||
PermissionSysconsoleWriteEnvironmentFileStorage.Id: {
|
||||
PermissionTestS3,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_SMTP.Id: {
|
||||
PERMISSION_TEST_EMAIL,
|
||||
PermissionSysconsoleWriteEnvironmentSmtp.Id: {
|
||||
PermissionTestEmail,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_READ_REPORTING_SERVER_LOGS.Id: {
|
||||
PERMISSION_GET_LOGS,
|
||||
PermissionSysconsoleReadReportingServerLogs.Id: {
|
||||
PermissionGetLogs,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_READ_REPORTING_SITE_STATISTICS.Id: {
|
||||
PERMISSION_GET_ANALYTICS,
|
||||
PermissionSysconsoleReadReportingSiteStatistics.Id: {
|
||||
PermissionGetAnalytics,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_READ_REPORTING_TEAM_STATISTICS.Id: {
|
||||
PERMISSION_VIEW_TEAM,
|
||||
PermissionSysconsoleReadReportingTeamStatistics.Id: {
|
||||
PermissionViewTeam,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_USERS.Id: {
|
||||
PERMISSION_EDIT_OTHER_USERS,
|
||||
PERMISSION_DEMOTE_TO_GUEST,
|
||||
PERMISSION_PROMOTE_GUEST,
|
||||
PermissionSysconsoleWriteUserManagementUsers.Id: {
|
||||
PermissionEditOtherUsers,
|
||||
PermissionDemoteToGuest,
|
||||
PermissionPromoteGuest,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_CHANNELS.Id: {
|
||||
PERMISSION_MANAGE_TEAM,
|
||||
PERMISSION_MANAGE_PUBLIC_CHANNEL_PROPERTIES,
|
||||
PERMISSION_MANAGE_PRIVATE_CHANNEL_PROPERTIES,
|
||||
PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS,
|
||||
PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS,
|
||||
PERMISSION_DELETE_PRIVATE_CHANNEL,
|
||||
PERMISSION_DELETE_PUBLIC_CHANNEL,
|
||||
PERMISSION_MANAGE_CHANNEL_ROLES,
|
||||
PERMISSION_CONVERT_PUBLIC_CHANNEL_TO_PRIVATE,
|
||||
PERMISSION_CONVERT_PRIVATE_CHANNEL_TO_PUBLIC,
|
||||
PermissionSysconsoleWriteUserManagementChannels.Id: {
|
||||
PermissionManageTeam,
|
||||
PermissionManagePublicChannelProperties,
|
||||
PermissionManagePrivateChannelProperties,
|
||||
PermissionManagePrivateChannelMembers,
|
||||
PermissionManagePublicChannelMembers,
|
||||
PermissionDeletePrivateChannel,
|
||||
PermissionDeletePublicChannel,
|
||||
PermissionManageChannelRoles,
|
||||
PermissionConvertPublicChannelToPrivate,
|
||||
PermissionConvertPrivateChannelToPublic,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_TEAMS.Id: {
|
||||
PERMISSION_MANAGE_TEAM,
|
||||
PERMISSION_MANAGE_TEAM_ROLES,
|
||||
PERMISSION_REMOVE_USER_FROM_TEAM,
|
||||
PERMISSION_JOIN_PRIVATE_TEAMS,
|
||||
PERMISSION_JOIN_PUBLIC_TEAMS,
|
||||
PERMISSION_ADD_USER_TO_TEAM,
|
||||
PermissionSysconsoleWriteUserManagementTeams.Id: {
|
||||
PermissionManageTeam,
|
||||
PermissionManageTeamRoles,
|
||||
PermissionRemoveUserFromTeam,
|
||||
PermissionJoinPrivateTeams,
|
||||
PermissionJoinPublicTeams,
|
||||
PermissionAddUserToTeam,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_GROUPS.Id: {
|
||||
PERMISSION_MANAGE_TEAM,
|
||||
PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS,
|
||||
PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS,
|
||||
PERMISSION_CONVERT_PUBLIC_CHANNEL_TO_PRIVATE,
|
||||
PERMISSION_CONVERT_PRIVATE_CHANNEL_TO_PUBLIC,
|
||||
PermissionSysconsoleWriteUserManagementGroups.Id: {
|
||||
PermissionManageTeam,
|
||||
PermissionManagePrivateChannelMembers,
|
||||
PermissionManagePublicChannelMembers,
|
||||
PermissionConvertPublicChannelToPrivate,
|
||||
PermissionConvertPrivateChannelToPublic,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_SITE_CUSTOMIZATION.Id: {
|
||||
PERMISSION_EDIT_BRAND,
|
||||
PermissionSysconsoleWriteSiteCustomization.Id: {
|
||||
PermissionEditBrand,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_COMPLIANCE_DATA_RETENTION_POLICY.Id: {
|
||||
PERMISSION_CREATE_DATA_RETENTION_JOB,
|
||||
PermissionSysconsoleWriteComplianceDataRetentionPolicy.Id: {
|
||||
PermissionCreateDataRetentionJob,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_READ_COMPLIANCE_DATA_RETENTION_POLICY.Id: {
|
||||
PERMISSION_READ_DATA_RETENTION_JOB,
|
||||
PermissionSysconsoleReadComplianceDataRetentionPolicy.Id: {
|
||||
PermissionReadDataRetentionJob,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_COMPLIANCE_COMPLIANCE_EXPORT.Id: {
|
||||
PERMISSION_CREATE_COMPLIANCE_EXPORT_JOB,
|
||||
PERMISSION_DOWNLOAD_COMPLIANCE_EXPORT_RESULT,
|
||||
PermissionSysconsoleWriteComplianceComplianceExport.Id: {
|
||||
PermissionCreateComplianceExportJob,
|
||||
PermissionDownloadComplianceExportResult,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_READ_COMPLIANCE_COMPLIANCE_EXPORT.Id: {
|
||||
PERMISSION_READ_COMPLIANCE_EXPORT_JOB,
|
||||
PERMISSION_DOWNLOAD_COMPLIANCE_EXPORT_RESULT,
|
||||
PermissionSysconsoleReadComplianceComplianceExport.Id: {
|
||||
PermissionReadComplianceExportJob,
|
||||
PermissionDownloadComplianceExportResult,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_READ_COMPLIANCE_CUSTOM_TERMS_OF_SERVICE.Id: {
|
||||
PERMISSION_READ_AUDITS,
|
||||
PermissionSysconsoleReadComplianceCustomTermsOfService.Id: {
|
||||
PermissionReadAudits,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_EXPERIMENTAL_BLEVE.Id: {
|
||||
PERMISSION_CREATE_POST_BLEVE_INDEXES_JOB,
|
||||
PERMISSION_PURGE_BLEVE_INDEXES,
|
||||
PermissionSysconsoleWriteExperimentalBleve.Id: {
|
||||
PermissionCreatePostBleveIndexesJob,
|
||||
PermissionPurgeBleveIndexes,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_AUTHENTICATION_LDAP.Id: {
|
||||
PERMISSION_CREATE_LDAP_SYNC_JOB,
|
||||
PERMISSION_ADD_LDAP_PUBLIC_CERT,
|
||||
PERMISSION_REMOVE_LDAP_PUBLIC_CERT,
|
||||
PERMISSION_ADD_LDAP_PRIVATE_CERT,
|
||||
PERMISSION_REMOVE_LDAP_PRIVATE_CERT,
|
||||
PermissionSysconsoleWriteAuthenticationLdap.Id: {
|
||||
PermissionCreateLdapSyncJob,
|
||||
PermissionAddLdapPublicCert,
|
||||
PermissionRemoveLdapPublicCert,
|
||||
PermissionAddLdapPrivateCert,
|
||||
PermissionRemoveLdapPrivateCert,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_LDAP.Id: {
|
||||
PERMISSION_TEST_LDAP,
|
||||
PERMISSION_READ_LDAP_SYNC_JOB,
|
||||
PermissionSysconsoleReadAuthenticationLdap.Id: {
|
||||
PermissionTestLdap,
|
||||
PermissionReadLdapSyncJob,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_AUTHENTICATION_EMAIL.Id: {
|
||||
PERMISSION_INVALIDATE_EMAIL_INVITE,
|
||||
PermissionSysconsoleWriteAuthenticationEmail.Id: {
|
||||
PermissionInvalidateEmailInvite,
|
||||
},
|
||||
PERMISSION_SYSCONSOLE_WRITE_AUTHENTICATION_SAML.Id: {
|
||||
PERMISSION_GET_SAML_METADATA_FROM_IDP,
|
||||
PERMISSION_ADD_SAML_PUBLIC_CERT,
|
||||
PERMISSION_ADD_SAML_PRIVATE_CERT,
|
||||
PERMISSION_ADD_SAML_IDP_CERT,
|
||||
PERMISSION_REMOVE_SAML_PUBLIC_CERT,
|
||||
PERMISSION_REMOVE_SAML_PRIVATE_CERT,
|
||||
PERMISSION_REMOVE_SAML_IDP_CERT,
|
||||
PERMISSION_GET_SAML_CERT_STATUS,
|
||||
PermissionSysconsoleWriteAuthenticationSaml.Id: {
|
||||
PermissionGetSamlMetadataFromIdp,
|
||||
PermissionAddSamlPublicCert,
|
||||
PermissionAddSamlPrivateCert,
|
||||
PermissionAddSamlIdpCert,
|
||||
PermissionRemoveSamlPublicCert,
|
||||
PermissionRemoveSamlPrivateCert,
|
||||
PermissionRemoveSamlIdpCert,
|
||||
PermissionGetSamlCertStatus,
|
||||
},
|
||||
}
|
||||
|
||||
SystemUserManagerDefaultPermissions = []string{
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_GROUPS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_TEAMS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_CHANNELS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_PERMISSIONS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_GROUPS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_TEAMS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_CHANNELS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_SIGNUP.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_EMAIL.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_PASSWORD.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_MFA.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_LDAP.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_SAML.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_OPENID.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_GUEST_ACCESS.Id,
|
||||
PermissionSysconsoleReadUserManagementGroups.Id,
|
||||
PermissionSysconsoleReadUserManagementTeams.Id,
|
||||
PermissionSysconsoleReadUserManagementChannels.Id,
|
||||
PermissionSysconsoleReadUserManagementPermissions.Id,
|
||||
PermissionSysconsoleWriteUserManagementGroups.Id,
|
||||
PermissionSysconsoleWriteUserManagementTeams.Id,
|
||||
PermissionSysconsoleWriteUserManagementChannels.Id,
|
||||
PermissionSysconsoleReadAuthenticationSignup.Id,
|
||||
PermissionSysconsoleReadAuthenticationEmail.Id,
|
||||
PermissionSysconsoleReadAuthenticationPassword.Id,
|
||||
PermissionSysconsoleReadAuthenticationMfa.Id,
|
||||
PermissionSysconsoleReadAuthenticationLdap.Id,
|
||||
PermissionSysconsoleReadAuthenticationSaml.Id,
|
||||
PermissionSysconsoleReadAuthenticationOpenid.Id,
|
||||
PermissionSysconsoleReadAuthenticationGuestAccess.Id,
|
||||
}
|
||||
|
||||
SystemReadOnlyAdminDefaultPermissions = []string{
|
||||
PERMISSION_SYSCONSOLE_READ_ABOUT_EDITION_AND_LICENSE.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_REPORTING_SITE_STATISTICS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_REPORTING_TEAM_STATISTICS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_REPORTING_SERVER_LOGS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_USERS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_GROUPS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_TEAMS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_CHANNELS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_PERMISSIONS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_WEB_SERVER.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_DATABASE.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_ELASTICSEARCH.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_FILE_STORAGE.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_IMAGE_PROXY.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_SMTP.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_PUSH_NOTIFICATION_SERVER.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_HIGH_AVAILABILITY.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_RATE_LIMITING.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_LOGGING.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_SESSION_LENGTHS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_PERFORMANCE_MONITORING.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_DEVELOPER.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_CUSTOMIZATION.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_LOCALIZATION.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_USERS_AND_TEAMS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_NOTIFICATIONS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_ANNOUNCEMENT_BANNER.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_EMOJI.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_POSTS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_FILE_SHARING_AND_DOWNLOADS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_PUBLIC_LINKS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_NOTICES.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_SIGNUP.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_EMAIL.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_PASSWORD.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_MFA.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_LDAP.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_SAML.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_OPENID.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_GUEST_ACCESS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_PLUGINS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_INTEGRATIONS_INTEGRATION_MANAGEMENT.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_INTEGRATIONS_BOT_ACCOUNTS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_INTEGRATIONS_GIF.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_INTEGRATIONS_CORS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_COMPLIANCE_DATA_RETENTION_POLICY.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_COMPLIANCE_COMPLIANCE_EXPORT.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_COMPLIANCE_COMPLIANCE_MONITORING.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_COMPLIANCE_CUSTOM_TERMS_OF_SERVICE.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_EXPERIMENTAL_FEATURES.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_EXPERIMENTAL_FEATURE_FLAGS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_EXPERIMENTAL_BLEVE.Id,
|
||||
PermissionSysconsoleReadAboutEditionAndLicense.Id,
|
||||
PermissionSysconsoleReadReportingSiteStatistics.Id,
|
||||
PermissionSysconsoleReadReportingTeamStatistics.Id,
|
||||
PermissionSysconsoleReadReportingServerLogs.Id,
|
||||
PermissionSysconsoleReadUserManagementUsers.Id,
|
||||
PermissionSysconsoleReadUserManagementGroups.Id,
|
||||
PermissionSysconsoleReadUserManagementTeams.Id,
|
||||
PermissionSysconsoleReadUserManagementChannels.Id,
|
||||
PermissionSysconsoleReadUserManagementPermissions.Id,
|
||||
PermissionSysconsoleReadEnvironmentWebServer.Id,
|
||||
PermissionSysconsoleReadEnvironmentDatabase.Id,
|
||||
PermissionSysconsoleReadEnvironmentElasticsearch.Id,
|
||||
PermissionSysconsoleReadEnvironmentFileStorage.Id,
|
||||
PermissionSysconsoleReadEnvironmentImageProxy.Id,
|
||||
PermissionSysconsoleReadEnvironmentSmtp.Id,
|
||||
PermissionSysconsoleReadEnvironmentPushNotificationServer.Id,
|
||||
PermissionSysconsoleReadEnvironmentHighAvailability.Id,
|
||||
PermissionSysconsoleReadEnvironmentRateLimiting.Id,
|
||||
PermissionSysconsoleReadEnvironmentLogging.Id,
|
||||
PermissionSysconsoleReadEnvironmentSessionLengths.Id,
|
||||
PermissionSysconsoleReadEnvironmentPerformanceMonitoring.Id,
|
||||
PermissionSysconsoleReadEnvironmentDeveloper.Id,
|
||||
PermissionSysconsoleReadSiteCustomization.Id,
|
||||
PermissionSysconsoleReadSiteLocalization.Id,
|
||||
PermissionSysconsoleReadSiteUsersAndTeams.Id,
|
||||
PermissionSysconsoleReadSiteNotifications.Id,
|
||||
PermissionSysconsoleReadSiteAnnouncementBanner.Id,
|
||||
PermissionSysconsoleReadSiteEmoji.Id,
|
||||
PermissionSysconsoleReadSitePosts.Id,
|
||||
PermissionSysconsoleReadSiteFileSharingAndDownloads.Id,
|
||||
PermissionSysconsoleReadSitePublicLinks.Id,
|
||||
PermissionSysconsoleReadSiteNotices.Id,
|
||||
PermissionSysconsoleReadAuthenticationSignup.Id,
|
||||
PermissionSysconsoleReadAuthenticationEmail.Id,
|
||||
PermissionSysconsoleReadAuthenticationPassword.Id,
|
||||
PermissionSysconsoleReadAuthenticationMfa.Id,
|
||||
PermissionSysconsoleReadAuthenticationLdap.Id,
|
||||
PermissionSysconsoleReadAuthenticationSaml.Id,
|
||||
PermissionSysconsoleReadAuthenticationOpenid.Id,
|
||||
PermissionSysconsoleReadAuthenticationGuestAccess.Id,
|
||||
PermissionSysconsoleReadPlugins.Id,
|
||||
PermissionSysconsoleReadIntegrationsIntegrationManagement.Id,
|
||||
PermissionSysconsoleReadIntegrationsBotAccounts.Id,
|
||||
PermissionSysconsoleReadIntegrationsGif.Id,
|
||||
PermissionSysconsoleReadIntegrationsCors.Id,
|
||||
PermissionSysconsoleReadComplianceDataRetentionPolicy.Id,
|
||||
PermissionSysconsoleReadComplianceComplianceExport.Id,
|
||||
PermissionSysconsoleReadComplianceComplianceMonitoring.Id,
|
||||
PermissionSysconsoleReadComplianceCustomTermsOfService.Id,
|
||||
PermissionSysconsoleReadExperimentalFeatures.Id,
|
||||
PermissionSysconsoleReadExperimentalFeatureFlags.Id,
|
||||
PermissionSysconsoleReadExperimentalBleve.Id,
|
||||
}
|
||||
|
||||
SystemManagerDefaultPermissions = []string{
|
||||
PERMISSION_SYSCONSOLE_READ_ABOUT_EDITION_AND_LICENSE.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_REPORTING_SITE_STATISTICS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_REPORTING_TEAM_STATISTICS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_REPORTING_SERVER_LOGS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_GROUPS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_TEAMS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_CHANNELS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_USERMANAGEMENT_PERMISSIONS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_GROUPS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_TEAMS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_CHANNELS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_USERMANAGEMENT_PERMISSIONS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_WEB_SERVER.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_DATABASE.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_ELASTICSEARCH.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_FILE_STORAGE.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_IMAGE_PROXY.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_SMTP.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_PUSH_NOTIFICATION_SERVER.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_HIGH_AVAILABILITY.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_RATE_LIMITING.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_LOGGING.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_SESSION_LENGTHS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_PERFORMANCE_MONITORING.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_ENVIRONMENT_DEVELOPER.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_WEB_SERVER.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_DATABASE.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_ELASTICSEARCH.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_FILE_STORAGE.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_IMAGE_PROXY.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_SMTP.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_PUSH_NOTIFICATION_SERVER.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_HIGH_AVAILABILITY.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_RATE_LIMITING.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_LOGGING.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_SESSION_LENGTHS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_PERFORMANCE_MONITORING.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_ENVIRONMENT_DEVELOPER.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_CUSTOMIZATION.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_SITE_CUSTOMIZATION.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_LOCALIZATION.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_SITE_LOCALIZATION.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_USERS_AND_TEAMS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_SITE_USERS_AND_TEAMS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_NOTIFICATIONS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_SITE_NOTIFICATIONS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_ANNOUNCEMENT_BANNER.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_SITE_ANNOUNCEMENT_BANNER.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_EMOJI.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_SITE_EMOJI.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_POSTS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_SITE_POSTS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_FILE_SHARING_AND_DOWNLOADS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_SITE_FILE_SHARING_AND_DOWNLOADS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_PUBLIC_LINKS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_SITE_PUBLIC_LINKS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_SITE_NOTICES.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_SITE_NOTICES.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_SIGNUP.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_EMAIL.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_PASSWORD.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_MFA.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_LDAP.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_SAML.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_OPENID.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_AUTHENTICATION_GUEST_ACCESS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_PLUGINS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_INTEGRATIONS_INTEGRATION_MANAGEMENT.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_INTEGRATIONS_BOT_ACCOUNTS.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_INTEGRATIONS_GIF.Id,
|
||||
PERMISSION_SYSCONSOLE_READ_INTEGRATIONS_CORS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_INTEGRATIONS_INTEGRATION_MANAGEMENT.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_INTEGRATIONS_BOT_ACCOUNTS.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_INTEGRATIONS_GIF.Id,
|
||||
PERMISSION_SYSCONSOLE_WRITE_INTEGRATIONS_CORS.Id,
|
||||
PermissionSysconsoleReadAboutEditionAndLicense.Id,
|
||||
PermissionSysconsoleReadReportingSiteStatistics.Id,
|
||||
PermissionSysconsoleReadReportingTeamStatistics.Id,
|
||||
PermissionSysconsoleReadReportingServerLogs.Id,
|
||||
PermissionSysconsoleReadUserManagementGroups.Id,
|
||||
PermissionSysconsoleReadUserManagementTeams.Id,
|
||||
PermissionSysconsoleReadUserManagementChannels.Id,
|
||||
PermissionSysconsoleReadUserManagementPermissions.Id,
|
||||
PermissionSysconsoleWriteUserManagementGroups.Id,
|
||||
PermissionSysconsoleWriteUserManagementTeams.Id,
|
||||
PermissionSysconsoleWriteUserManagementChannels.Id,
|
||||
PermissionSysconsoleWriteUserManagementPermissions.Id,
|
||||
PermissionSysconsoleReadEnvironmentWebServer.Id,
|
||||
PermissionSysconsoleReadEnvironmentDatabase.Id,
|
||||
PermissionSysconsoleReadEnvironmentElasticsearch.Id,
|
||||
PermissionSysconsoleReadEnvironmentFileStorage.Id,
|
||||
PermissionSysconsoleReadEnvironmentImageProxy.Id,
|
||||
PermissionSysconsoleReadEnvironmentSmtp.Id,
|
||||
PermissionSysconsoleReadEnvironmentPushNotificationServer.Id,
|
||||
PermissionSysconsoleReadEnvironmentHighAvailability.Id,
|
||||
PermissionSysconsoleReadEnvironmentRateLimiting.Id,
|
||||
PermissionSysconsoleReadEnvironmentLogging.Id,
|
||||
PermissionSysconsoleReadEnvironmentSessionLengths.Id,
|
||||
PermissionSysconsoleReadEnvironmentPerformanceMonitoring.Id,
|
||||
PermissionSysconsoleReadEnvironmentDeveloper.Id,
|
||||
PermissionSysconsoleWriteEnvironmentWebServer.Id,
|
||||
PermissionSysconsoleWriteEnvironmentDatabase.Id,
|
||||
PermissionSysconsoleWriteEnvironmentElasticsearch.Id,
|
||||
PermissionSysconsoleWriteEnvironmentFileStorage.Id,
|
||||
PermissionSysconsoleWriteEnvironmentImageProxy.Id,
|
||||
PermissionSysconsoleWriteEnvironmentSmtp.Id,
|
||||
PermissionSysconsoleWriteEnvironmentPushNotificationServer.Id,
|
||||
PermissionSysconsoleWriteEnvironmentHighAvailability.Id,
|
||||
PermissionSysconsoleWriteEnvironmentRateLimiting.Id,
|
||||
PermissionSysconsoleWriteEnvironmentLogging.Id,
|
||||
PermissionSysconsoleWriteEnvironmentSessionLengths.Id,
|
||||
PermissionSysconsoleWriteEnvironmentPerformanceMonitoring.Id,
|
||||
PermissionSysconsoleWriteEnvironmentDeveloper.Id,
|
||||
PermissionSysconsoleReadSiteCustomization.Id,
|
||||
PermissionSysconsoleWriteSiteCustomization.Id,
|
||||
PermissionSysconsoleReadSiteLocalization.Id,
|
||||
PermissionSysconsoleWriteSiteLocalization.Id,
|
||||
PermissionSysconsoleReadSiteUsersAndTeams.Id,
|
||||
PermissionSysconsoleWriteSiteUsersAndTeams.Id,
|
||||
PermissionSysconsoleReadSiteNotifications.Id,
|
||||
PermissionSysconsoleWriteSiteNotifications.Id,
|
||||
PermissionSysconsoleReadSiteAnnouncementBanner.Id,
|
||||
PermissionSysconsoleWriteSiteAnnouncementBanner.Id,
|
||||
PermissionSysconsoleReadSiteEmoji.Id,
|
||||
PermissionSysconsoleWriteSiteEmoji.Id,
|
||||
PermissionSysconsoleReadSitePosts.Id,
|
||||
PermissionSysconsoleWriteSitePosts.Id,
|
||||
PermissionSysconsoleReadSiteFileSharingAndDownloads.Id,
|
||||
PermissionSysconsoleWriteSiteFileSharingAndDownloads.Id,
|
||||
PermissionSysconsoleReadSitePublicLinks.Id,
|
||||
PermissionSysconsoleWriteSitePublicLinks.Id,
|
||||
PermissionSysconsoleReadSiteNotices.Id,
|
||||
PermissionSysconsoleWriteSiteNotices.Id,
|
||||
PermissionSysconsoleReadAuthenticationSignup.Id,
|
||||
PermissionSysconsoleReadAuthenticationEmail.Id,
|
||||
PermissionSysconsoleReadAuthenticationPassword.Id,
|
||||
PermissionSysconsoleReadAuthenticationMfa.Id,
|
||||
PermissionSysconsoleReadAuthenticationLdap.Id,
|
||||
PermissionSysconsoleReadAuthenticationSaml.Id,
|
||||
PermissionSysconsoleReadAuthenticationOpenid.Id,
|
||||
PermissionSysconsoleReadAuthenticationGuestAccess.Id,
|
||||
PermissionSysconsoleReadPlugins.Id,
|
||||
PermissionSysconsoleReadIntegrationsIntegrationManagement.Id,
|
||||
PermissionSysconsoleReadIntegrationsBotAccounts.Id,
|
||||
PermissionSysconsoleReadIntegrationsGif.Id,
|
||||
PermissionSysconsoleReadIntegrationsCors.Id,
|
||||
PermissionSysconsoleWriteIntegrationsIntegrationManagement.Id,
|
||||
PermissionSysconsoleWriteIntegrationsBotAccounts.Id,
|
||||
PermissionSysconsoleWriteIntegrationsGif.Id,
|
||||
PermissionSysconsoleWriteIntegrationsCors.Id,
|
||||
}
|
||||
|
||||
// Add the ancillary permissions to each system role
|
||||
@@ -344,29 +344,29 @@ type RoleType string
|
||||
type RoleScope string
|
||||
|
||||
const (
|
||||
SYSTEM_GUEST_ROLE_ID = "system_guest"
|
||||
SYSTEM_USER_ROLE_ID = "system_user"
|
||||
SYSTEM_ADMIN_ROLE_ID = "system_admin"
|
||||
SYSTEM_POST_ALL_ROLE_ID = "system_post_all"
|
||||
SYSTEM_POST_ALL_PUBLIC_ROLE_ID = "system_post_all_public"
|
||||
SYSTEM_USER_ACCESS_TOKEN_ROLE_ID = "system_user_access_token"
|
||||
SYSTEM_USER_MANAGER_ROLE_ID = "system_user_manager"
|
||||
SYSTEM_READ_ONLY_ADMIN_ROLE_ID = "system_read_only_admin"
|
||||
SYSTEM_MANAGER_ROLE_ID = "system_manager"
|
||||
SystemGuestRoleId = "system_guest"
|
||||
SystemUserRoleId = "system_user"
|
||||
SystemAdminRoleId = "system_admin"
|
||||
SystemPostAllRoleId = "system_post_all"
|
||||
SystemPostAllPublicRoleId = "system_post_all_public"
|
||||
SystemUserAccessTokenRoleId = "system_user_access_token"
|
||||
SystemUserManagerRoleId = "system_user_manager"
|
||||
SystemReadOnlyAdminRoleId = "system_read_only_admin"
|
||||
SystemManagerRoleId = "system_manager"
|
||||
|
||||
TEAM_GUEST_ROLE_ID = "team_guest"
|
||||
TEAM_USER_ROLE_ID = "team_user"
|
||||
TEAM_ADMIN_ROLE_ID = "team_admin"
|
||||
TEAM_POST_ALL_ROLE_ID = "team_post_all"
|
||||
TEAM_POST_ALL_PUBLIC_ROLE_ID = "team_post_all_public"
|
||||
TeamGuestRoleId = "team_guest"
|
||||
TeamUserRoleId = "team_user"
|
||||
TeamAdminRoleId = "team_admin"
|
||||
TeamPostAllRoleId = "team_post_all"
|
||||
TeamPostAllPublicRoleId = "team_post_all_public"
|
||||
|
||||
CHANNEL_GUEST_ROLE_ID = "channel_guest"
|
||||
CHANNEL_USER_ROLE_ID = "channel_user"
|
||||
CHANNEL_ADMIN_ROLE_ID = "channel_admin"
|
||||
ChannelGuestRoleId = "channel_guest"
|
||||
ChannelUserRoleId = "channel_user"
|
||||
ChannelAdminRoleId = "channel_admin"
|
||||
|
||||
ROLE_NAME_MAX_LENGTH = 64
|
||||
ROLE_DISPLAY_NAME_MAX_LENGTH = 128
|
||||
ROLE_DESCRIPTION_MAX_LENGTH = 1024
|
||||
RoleNameMaxLength = 64
|
||||
RoleDisplayNameMaxLength = 128
|
||||
RoleDescriptionMaxLength = 1024
|
||||
|
||||
RoleScopeSystem RoleScope = "System"
|
||||
RoleScopeTeam RoleScope = "Team"
|
||||
@@ -456,7 +456,7 @@ func (r *Role) MergeChannelHigherScopedPermissions(higherScopedPermissions *Role
|
||||
// For the channel admin role always look to the higher scope to determine if the role has their permission.
|
||||
// The channel admin is a special case because they're not part of the UI to be "channel moderated", only
|
||||
// channel members and channel guests are.
|
||||
if higherScopedPermissions.RoleID == CHANNEL_ADMIN_ROLE_ID && presentOnHigherScope {
|
||||
if higherScopedPermissions.RoleID == ChannelAdminRoleId && presentOnHigherScope {
|
||||
mergedPermissions = append(mergedPermissions, cp.Id)
|
||||
continue
|
||||
}
|
||||
@@ -569,9 +569,9 @@ func (r *Role) GetChannelModeratedPermissions(channelType string) map[string]boo
|
||||
|
||||
if moderated == permission {
|
||||
// Special case where the channel moderated permission for `manage_members` is different depending on whether the channel is private or public
|
||||
if moderated == PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id || moderated == PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id {
|
||||
canManagePublic := channelType == CHANNEL_OPEN && moderated == PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id
|
||||
canManagePrivate := channelType == CHANNEL_PRIVATE && moderated == PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id
|
||||
if moderated == PermissionManagePublicChannelMembers.Id || moderated == PermissionManagePrivateChannelMembers.Id {
|
||||
canManagePublic := channelType == ChannelTypeOpen && moderated == PermissionManagePublicChannelMembers.Id
|
||||
canManagePrivate := channelType == ChannelTypePrivate && moderated == PermissionManagePrivateChannelMembers.Id
|
||||
moderatedPermissions[moderatedPermissionValue] = canManagePublic || canManagePrivate
|
||||
} else {
|
||||
moderatedPermissions[moderatedPermissionValue] = true
|
||||
@@ -650,11 +650,11 @@ func (r *Role) IsValidWithoutId() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
if r.DisplayName == "" || len(r.DisplayName) > ROLE_DISPLAY_NAME_MAX_LENGTH {
|
||||
if r.DisplayName == "" || len(r.DisplayName) > RoleDisplayNameMaxLength {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(r.Description) > ROLE_DESCRIPTION_MAX_LENGTH {
|
||||
if len(r.Description) > RoleDescriptionMaxLength {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -694,7 +694,7 @@ func CleanRoleNames(roleNames []string) ([]string, bool) {
|
||||
}
|
||||
|
||||
func IsValidRoleName(roleName string) bool {
|
||||
if roleName == "" || len(roleName) > ROLE_NAME_MAX_LENGTH {
|
||||
if roleName == "" || len(roleName) > RoleNameMaxLength {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -708,192 +708,192 @@ func IsValidRoleName(roleName string) bool {
|
||||
func MakeDefaultRoles() map[string]*Role {
|
||||
roles := make(map[string]*Role)
|
||||
|
||||
roles[CHANNEL_GUEST_ROLE_ID] = &Role{
|
||||
roles[ChannelGuestRoleId] = &Role{
|
||||
Name: "channel_guest",
|
||||
DisplayName: "authentication.roles.channel_guest.name",
|
||||
Description: "authentication.roles.channel_guest.description",
|
||||
Permissions: []string{
|
||||
PERMISSION_READ_CHANNEL.Id,
|
||||
PERMISSION_ADD_REACTION.Id,
|
||||
PERMISSION_REMOVE_REACTION.Id,
|
||||
PERMISSION_UPLOAD_FILE.Id,
|
||||
PERMISSION_EDIT_POST.Id,
|
||||
PERMISSION_CREATE_POST.Id,
|
||||
PERMISSION_USE_CHANNEL_MENTIONS.Id,
|
||||
PERMISSION_USE_SLASH_COMMANDS.Id,
|
||||
PermissionReadChannel.Id,
|
||||
PermissionAddReaction.Id,
|
||||
PermissionRemoveReaction.Id,
|
||||
PermissionUploadFile.Id,
|
||||
PermissionEditPost.Id,
|
||||
PermissionCreatePost.Id,
|
||||
PermissionUseChannelMentions.Id,
|
||||
PermissionUseSlashCommands.Id,
|
||||
},
|
||||
SchemeManaged: true,
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[CHANNEL_USER_ROLE_ID] = &Role{
|
||||
roles[ChannelUserRoleId] = &Role{
|
||||
Name: "channel_user",
|
||||
DisplayName: "authentication.roles.channel_user.name",
|
||||
Description: "authentication.roles.channel_user.description",
|
||||
Permissions: []string{
|
||||
PERMISSION_READ_CHANNEL.Id,
|
||||
PERMISSION_ADD_REACTION.Id,
|
||||
PERMISSION_REMOVE_REACTION.Id,
|
||||
PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id,
|
||||
PERMISSION_UPLOAD_FILE.Id,
|
||||
PERMISSION_GET_PUBLIC_LINK.Id,
|
||||
PERMISSION_CREATE_POST.Id,
|
||||
PERMISSION_USE_CHANNEL_MENTIONS.Id,
|
||||
PERMISSION_USE_SLASH_COMMANDS.Id,
|
||||
PermissionReadChannel.Id,
|
||||
PermissionAddReaction.Id,
|
||||
PermissionRemoveReaction.Id,
|
||||
PermissionManagePublicChannelMembers.Id,
|
||||
PermissionUploadFile.Id,
|
||||
PermissionGetPublicLink.Id,
|
||||
PermissionCreatePost.Id,
|
||||
PermissionUseChannelMentions.Id,
|
||||
PermissionUseSlashCommands.Id,
|
||||
},
|
||||
SchemeManaged: true,
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[CHANNEL_ADMIN_ROLE_ID] = &Role{
|
||||
roles[ChannelAdminRoleId] = &Role{
|
||||
Name: "channel_admin",
|
||||
DisplayName: "authentication.roles.channel_admin.name",
|
||||
Description: "authentication.roles.channel_admin.description",
|
||||
Permissions: []string{
|
||||
PERMISSION_MANAGE_CHANNEL_ROLES.Id,
|
||||
PERMISSION_USE_GROUP_MENTIONS.Id,
|
||||
PermissionManageChannelRoles.Id,
|
||||
PermissionUseGroupMentions.Id,
|
||||
},
|
||||
SchemeManaged: true,
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[TEAM_GUEST_ROLE_ID] = &Role{
|
||||
roles[TeamGuestRoleId] = &Role{
|
||||
Name: "team_guest",
|
||||
DisplayName: "authentication.roles.team_guest.name",
|
||||
Description: "authentication.roles.team_guest.description",
|
||||
Permissions: []string{
|
||||
PERMISSION_VIEW_TEAM.Id,
|
||||
PermissionViewTeam.Id,
|
||||
},
|
||||
SchemeManaged: true,
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[TEAM_USER_ROLE_ID] = &Role{
|
||||
roles[TeamUserRoleId] = &Role{
|
||||
Name: "team_user",
|
||||
DisplayName: "authentication.roles.team_user.name",
|
||||
Description: "authentication.roles.team_user.description",
|
||||
Permissions: []string{
|
||||
PERMISSION_LIST_TEAM_CHANNELS.Id,
|
||||
PERMISSION_JOIN_PUBLIC_CHANNELS.Id,
|
||||
PERMISSION_READ_PUBLIC_CHANNEL.Id,
|
||||
PERMISSION_VIEW_TEAM.Id,
|
||||
PermissionListTeamChannels.Id,
|
||||
PermissionJoinPublicChannels.Id,
|
||||
PermissionReadPublicChannel.Id,
|
||||
PermissionViewTeam.Id,
|
||||
},
|
||||
SchemeManaged: true,
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[TEAM_POST_ALL_ROLE_ID] = &Role{
|
||||
roles[TeamPostAllRoleId] = &Role{
|
||||
Name: "team_post_all",
|
||||
DisplayName: "authentication.roles.team_post_all.name",
|
||||
Description: "authentication.roles.team_post_all.description",
|
||||
Permissions: []string{
|
||||
PERMISSION_CREATE_POST.Id,
|
||||
PERMISSION_USE_CHANNEL_MENTIONS.Id,
|
||||
PermissionCreatePost.Id,
|
||||
PermissionUseChannelMentions.Id,
|
||||
},
|
||||
SchemeManaged: false,
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[TEAM_POST_ALL_PUBLIC_ROLE_ID] = &Role{
|
||||
roles[TeamPostAllPublicRoleId] = &Role{
|
||||
Name: "team_post_all_public",
|
||||
DisplayName: "authentication.roles.team_post_all_public.name",
|
||||
Description: "authentication.roles.team_post_all_public.description",
|
||||
Permissions: []string{
|
||||
PERMISSION_CREATE_POST_PUBLIC.Id,
|
||||
PERMISSION_USE_CHANNEL_MENTIONS.Id,
|
||||
PermissionCreatePostPublic.Id,
|
||||
PermissionUseChannelMentions.Id,
|
||||
},
|
||||
SchemeManaged: false,
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[TEAM_ADMIN_ROLE_ID] = &Role{
|
||||
roles[TeamAdminRoleId] = &Role{
|
||||
Name: "team_admin",
|
||||
DisplayName: "authentication.roles.team_admin.name",
|
||||
Description: "authentication.roles.team_admin.description",
|
||||
Permissions: []string{
|
||||
PERMISSION_REMOVE_USER_FROM_TEAM.Id,
|
||||
PERMISSION_MANAGE_TEAM.Id,
|
||||
PERMISSION_IMPORT_TEAM.Id,
|
||||
PERMISSION_MANAGE_TEAM_ROLES.Id,
|
||||
PERMISSION_MANAGE_CHANNEL_ROLES.Id,
|
||||
PERMISSION_MANAGE_OTHERS_INCOMING_WEBHOOKS.Id,
|
||||
PERMISSION_MANAGE_OTHERS_OUTGOING_WEBHOOKS.Id,
|
||||
PERMISSION_MANAGE_SLASH_COMMANDS.Id,
|
||||
PERMISSION_MANAGE_OTHERS_SLASH_COMMANDS.Id,
|
||||
PERMISSION_MANAGE_INCOMING_WEBHOOKS.Id,
|
||||
PERMISSION_MANAGE_OUTGOING_WEBHOOKS.Id,
|
||||
PERMISSION_CONVERT_PUBLIC_CHANNEL_TO_PRIVATE.Id,
|
||||
PERMISSION_CONVERT_PRIVATE_CHANNEL_TO_PUBLIC.Id,
|
||||
PermissionRemoveUserFromTeam.Id,
|
||||
PermissionManageTeam.Id,
|
||||
PermissionImportTeam.Id,
|
||||
PermissionManageTeamRoles.Id,
|
||||
PermissionManageChannelRoles.Id,
|
||||
PermissionManageOthersIncomingWebhooks.Id,
|
||||
PermissionManageOthersOutgoingWebhooks.Id,
|
||||
PermissionManageSlashCommands.Id,
|
||||
PermissionManageOthersSlashCommands.Id,
|
||||
PermissionManageIncomingWebhooks.Id,
|
||||
PermissionManageOutgoingWebhooks.Id,
|
||||
PermissionConvertPublicChannelToPrivate.Id,
|
||||
PermissionConvertPrivateChannelToPublic.Id,
|
||||
},
|
||||
SchemeManaged: true,
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[SYSTEM_GUEST_ROLE_ID] = &Role{
|
||||
roles[SystemGuestRoleId] = &Role{
|
||||
Name: "system_guest",
|
||||
DisplayName: "authentication.roles.global_guest.name",
|
||||
Description: "authentication.roles.global_guest.description",
|
||||
Permissions: []string{
|
||||
PERMISSION_CREATE_DIRECT_CHANNEL.Id,
|
||||
PERMISSION_CREATE_GROUP_CHANNEL.Id,
|
||||
PermissionCreateDirectChannel.Id,
|
||||
PermissionCreateGroupChannel.Id,
|
||||
},
|
||||
SchemeManaged: true,
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[SYSTEM_USER_ROLE_ID] = &Role{
|
||||
roles[SystemUserRoleId] = &Role{
|
||||
Name: "system_user",
|
||||
DisplayName: "authentication.roles.global_user.name",
|
||||
Description: "authentication.roles.global_user.description",
|
||||
Permissions: []string{
|
||||
PERMISSION_LIST_PUBLIC_TEAMS.Id,
|
||||
PERMISSION_JOIN_PUBLIC_TEAMS.Id,
|
||||
PERMISSION_CREATE_DIRECT_CHANNEL.Id,
|
||||
PERMISSION_CREATE_GROUP_CHANNEL.Id,
|
||||
PERMISSION_VIEW_MEMBERS.Id,
|
||||
PermissionListPublicTeams.Id,
|
||||
PermissionJoinPublicTeams.Id,
|
||||
PermissionCreateDirectChannel.Id,
|
||||
PermissionCreateGroupChannel.Id,
|
||||
PermissionViewMembers.Id,
|
||||
},
|
||||
SchemeManaged: true,
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[SYSTEM_POST_ALL_ROLE_ID] = &Role{
|
||||
roles[SystemPostAllRoleId] = &Role{
|
||||
Name: "system_post_all",
|
||||
DisplayName: "authentication.roles.system_post_all.name",
|
||||
Description: "authentication.roles.system_post_all.description",
|
||||
Permissions: []string{
|
||||
PERMISSION_CREATE_POST.Id,
|
||||
PERMISSION_USE_CHANNEL_MENTIONS.Id,
|
||||
PermissionCreatePost.Id,
|
||||
PermissionUseChannelMentions.Id,
|
||||
},
|
||||
SchemeManaged: false,
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[SYSTEM_POST_ALL_PUBLIC_ROLE_ID] = &Role{
|
||||
roles[SystemPostAllPublicRoleId] = &Role{
|
||||
Name: "system_post_all_public",
|
||||
DisplayName: "authentication.roles.system_post_all_public.name",
|
||||
Description: "authentication.roles.system_post_all_public.description",
|
||||
Permissions: []string{
|
||||
PERMISSION_CREATE_POST_PUBLIC.Id,
|
||||
PERMISSION_USE_CHANNEL_MENTIONS.Id,
|
||||
PermissionCreatePostPublic.Id,
|
||||
PermissionUseChannelMentions.Id,
|
||||
},
|
||||
SchemeManaged: false,
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[SYSTEM_USER_ACCESS_TOKEN_ROLE_ID] = &Role{
|
||||
roles[SystemUserAccessTokenRoleId] = &Role{
|
||||
Name: "system_user_access_token",
|
||||
DisplayName: "authentication.roles.system_user_access_token.name",
|
||||
Description: "authentication.roles.system_user_access_token.description",
|
||||
Permissions: []string{
|
||||
PERMISSION_CREATE_USER_ACCESS_TOKEN.Id,
|
||||
PERMISSION_READ_USER_ACCESS_TOKEN.Id,
|
||||
PERMISSION_REVOKE_USER_ACCESS_TOKEN.Id,
|
||||
PermissionCreateUserAccessToken.Id,
|
||||
PermissionReadUserAccessToken.Id,
|
||||
PermissionRevokeUserAccessToken.Id,
|
||||
},
|
||||
SchemeManaged: false,
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[SYSTEM_USER_MANAGER_ROLE_ID] = &Role{
|
||||
roles[SystemUserManagerRoleId] = &Role{
|
||||
Name: "system_user_manager",
|
||||
DisplayName: "authentication.roles.system_user_manager.name",
|
||||
Description: "authentication.roles.system_user_manager.description",
|
||||
@@ -902,7 +902,7 @@ func MakeDefaultRoles() map[string]*Role {
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[SYSTEM_READ_ONLY_ADMIN_ROLE_ID] = &Role{
|
||||
roles[SystemReadOnlyAdminRoleId] = &Role{
|
||||
Name: "system_read_only_admin",
|
||||
DisplayName: "authentication.roles.system_read_only_admin.name",
|
||||
Description: "authentication.roles.system_read_only_admin.description",
|
||||
@@ -911,7 +911,7 @@ func MakeDefaultRoles() map[string]*Role {
|
||||
BuiltIn: true,
|
||||
}
|
||||
|
||||
roles[SYSTEM_MANAGER_ROLE_ID] = &Role{
|
||||
roles[SystemManagerRoleId] = &Role{
|
||||
Name: "system_manager",
|
||||
DisplayName: "authentication.roles.system_manager.name",
|
||||
Description: "authentication.roles.system_manager.description",
|
||||
@@ -925,7 +925,7 @@ func MakeDefaultRoles() map[string]*Role {
|
||||
allPermissionIDs = append(allPermissionIDs, permission.Id)
|
||||
}
|
||||
|
||||
roles[SYSTEM_ADMIN_ROLE_ID] = &Role{
|
||||
roles[SystemAdminRoleId] = &Role{
|
||||
Name: "system_admin",
|
||||
DisplayName: "authentication.roles.global_admin.name",
|
||||
Description: "authentication.roles.global_admin.description",
|
||||
|
||||
@@ -25,25 +25,25 @@ func TestChannelModeratedPermissionsChangedByPatch(t *testing.T) {
|
||||
{
|
||||
"Adds permissions to empty initial permissions list",
|
||||
[]string{},
|
||||
[]string{PERMISSION_CREATE_POST.Id, PERMISSION_ADD_REACTION.Id},
|
||||
[]string{PermissionCreatePost.Id, PermissionAddReaction.Id},
|
||||
[]string{ChannelModeratedPermissions[0], ChannelModeratedPermissions[1]},
|
||||
},
|
||||
{
|
||||
"Ignores non moderated permissions in initial permissions list",
|
||||
[]string{PERMISSION_ASSIGN_BOT.Id},
|
||||
[]string{PERMISSION_CREATE_POST.Id, PERMISSION_REMOVE_REACTION.Id},
|
||||
[]string{PermissionAssignBot.Id},
|
||||
[]string{PermissionCreatePost.Id, PermissionRemoveReaction.Id},
|
||||
[]string{ChannelModeratedPermissions[0], ChannelModeratedPermissions[1]},
|
||||
},
|
||||
{
|
||||
"Adds removed moderated permissions from initial permissions list",
|
||||
[]string{PERMISSION_CREATE_POST.Id},
|
||||
[]string{PermissionCreatePost.Id},
|
||||
[]string{},
|
||||
[]string{PERMISSION_CREATE_POST.Id},
|
||||
[]string{PermissionCreatePost.Id},
|
||||
},
|
||||
{
|
||||
"No changes returns empty slice",
|
||||
[]string{PERMISSION_CREATE_POST.Id, PERMISSION_ASSIGN_BOT.Id},
|
||||
[]string{PERMISSION_CREATE_POST.Id},
|
||||
[]string{PermissionCreatePost.Id, PermissionAssignBot.Id},
|
||||
[]string{PermissionCreatePost.Id},
|
||||
[]string{},
|
||||
},
|
||||
}
|
||||
@@ -64,22 +64,22 @@ func TestRolePatchFromChannelModerationsPatch(t *testing.T) {
|
||||
channelMentions := ChannelModeratedPermissions[3]
|
||||
|
||||
basePermissions := []string{
|
||||
PERMISSION_ADD_REACTION.Id,
|
||||
PERMISSION_REMOVE_REACTION.Id,
|
||||
PERMISSION_CREATE_POST.Id,
|
||||
PERMISSION_USE_CHANNEL_MENTIONS.Id,
|
||||
PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id,
|
||||
PERMISSION_UPLOAD_FILE.Id,
|
||||
PERMISSION_GET_PUBLIC_LINK.Id,
|
||||
PERMISSION_USE_SLASH_COMMANDS.Id,
|
||||
PermissionAddReaction.Id,
|
||||
PermissionRemoveReaction.Id,
|
||||
PermissionCreatePost.Id,
|
||||
PermissionUseChannelMentions.Id,
|
||||
PermissionManagePublicChannelMembers.Id,
|
||||
PermissionUploadFile.Id,
|
||||
PermissionGetPublicLink.Id,
|
||||
PermissionUseSlashCommands.Id,
|
||||
}
|
||||
|
||||
baseModeratedPermissions := []string{
|
||||
PERMISSION_ADD_REACTION.Id,
|
||||
PERMISSION_REMOVE_REACTION.Id,
|
||||
PERMISSION_CREATE_POST.Id,
|
||||
PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id,
|
||||
PERMISSION_USE_CHANNEL_MENTIONS.Id,
|
||||
PermissionAddReaction.Id,
|
||||
PermissionRemoveReaction.Id,
|
||||
PermissionCreatePost.Id,
|
||||
PermissionManagePublicChannelMembers.Id,
|
||||
PermissionUseChannelMentions.Id,
|
||||
}
|
||||
|
||||
testCases := []struct {
|
||||
@@ -143,7 +143,7 @@ func TestRolePatchFromChannelModerationsPatch(t *testing.T) {
|
||||
},
|
||||
},
|
||||
"members",
|
||||
[]string{PERMISSION_CREATE_POST.Id},
|
||||
[]string{PermissionCreatePost.Id},
|
||||
},
|
||||
{
|
||||
"Patch to guest role removing multiple channel moderated permissions",
|
||||
@@ -163,11 +163,11 @@ func TestRolePatchFromChannelModerationsPatch(t *testing.T) {
|
||||
},
|
||||
},
|
||||
"guests",
|
||||
[]string{PERMISSION_CREATE_POST.Id},
|
||||
[]string{PermissionCreatePost.Id},
|
||||
},
|
||||
{
|
||||
"Patch enabling and removing multiple channel moderated permissions ",
|
||||
[]string{PERMISSION_ADD_REACTION.Id, PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id},
|
||||
[]string{PermissionAddReaction.Id, PermissionManagePublicChannelMembers.Id},
|
||||
[]*ChannelModerationPatch{
|
||||
{
|
||||
Name: &createReactions,
|
||||
@@ -187,11 +187,11 @@ func TestRolePatchFromChannelModerationsPatch(t *testing.T) {
|
||||
},
|
||||
},
|
||||
"members",
|
||||
[]string{PERMISSION_CREATE_POST.Id, PERMISSION_USE_CHANNEL_MENTIONS.Id},
|
||||
[]string{PermissionCreatePost.Id, PermissionUseChannelMentions.Id},
|
||||
},
|
||||
{
|
||||
"Patch enabling a partially enabled permission",
|
||||
[]string{PERMISSION_ADD_REACTION.Id},
|
||||
[]string{PermissionAddReaction.Id},
|
||||
[]*ChannelModerationPatch{
|
||||
{
|
||||
Name: &createReactions,
|
||||
@@ -199,11 +199,11 @@ func TestRolePatchFromChannelModerationsPatch(t *testing.T) {
|
||||
},
|
||||
},
|
||||
"members",
|
||||
[]string{PERMISSION_ADD_REACTION.Id, PERMISSION_REMOVE_REACTION.Id},
|
||||
[]string{PermissionAddReaction.Id, PermissionRemoveReaction.Id},
|
||||
},
|
||||
{
|
||||
"Patch disabling a partially disabled permission",
|
||||
[]string{PERMISSION_ADD_REACTION.Id},
|
||||
[]string{PermissionAddReaction.Id},
|
||||
[]*ChannelModerationPatch{
|
||||
{
|
||||
Name: &createReactions,
|
||||
@@ -215,7 +215,7 @@ func TestRolePatchFromChannelModerationsPatch(t *testing.T) {
|
||||
},
|
||||
},
|
||||
"members",
|
||||
[]string{PERMISSION_CREATE_POST.Id},
|
||||
[]string{PermissionCreatePost.Id},
|
||||
},
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
@@ -236,14 +236,14 @@ func TestGetChannelModeratedPermissions(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
"Filters non moderated permissions",
|
||||
[]string{PERMISSION_CREATE_BOT.Id},
|
||||
CHANNEL_OPEN,
|
||||
[]string{PermissionCreateBot.Id},
|
||||
ChannelTypeOpen,
|
||||
map[string]bool{},
|
||||
},
|
||||
{
|
||||
"Returns a map of moderated permissions",
|
||||
[]string{PERMISSION_CREATE_POST.Id, PERMISSION_ADD_REACTION.Id, PERMISSION_REMOVE_REACTION.Id, PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id, PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, PERMISSION_USE_CHANNEL_MENTIONS.Id},
|
||||
CHANNEL_OPEN,
|
||||
[]string{PermissionCreatePost.Id, PermissionAddReaction.Id, PermissionRemoveReaction.Id, PermissionManagePublicChannelMembers.Id, PermissionManagePrivateChannelMembers.Id, PermissionUseChannelMentions.Id},
|
||||
ChannelTypeOpen,
|
||||
map[string]bool{
|
||||
ChannelModeratedPermissions[0]: true,
|
||||
ChannelModeratedPermissions[1]: true,
|
||||
@@ -253,8 +253,8 @@ func TestGetChannelModeratedPermissions(t *testing.T) {
|
||||
},
|
||||
{
|
||||
"Returns a map of moderated permissions when non moderated present",
|
||||
[]string{PERMISSION_CREATE_POST.Id, PERMISSION_CREATE_DIRECT_CHANNEL.Id},
|
||||
CHANNEL_OPEN,
|
||||
[]string{PermissionCreatePost.Id, PermissionCreateDirectChannel.Id},
|
||||
ChannelTypeOpen,
|
||||
map[string]bool{
|
||||
ChannelModeratedPermissions[0]: true,
|
||||
},
|
||||
@@ -262,7 +262,7 @@ func TestGetChannelModeratedPermissions(t *testing.T) {
|
||||
{
|
||||
"Returns a nothing when no permissions present",
|
||||
[]string{},
|
||||
CHANNEL_OPEN,
|
||||
ChannelTypeOpen,
|
||||
map[string]bool{},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -11,11 +11,11 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
USER_AUTH_SERVICE_SAML = "saml"
|
||||
USER_AUTH_SERVICE_SAML_TEXT = "SAML"
|
||||
USER_AUTH_SERVICE_IS_SAML = "isSaml"
|
||||
USER_AUTH_SERVICE_IS_MOBILE = "isMobile"
|
||||
USER_AUTH_SERVICE_IS_OAUTH = "isOAuthUser"
|
||||
UserAuthServiceSaml = "saml"
|
||||
UserAuthServiceSamlText = "SAML"
|
||||
UserAuthServiceIsSaml = "isSaml"
|
||||
UserAuthServiceIsMobile = "isMobile"
|
||||
UserAuthServiceIsOAuth = "isOAuthUser"
|
||||
)
|
||||
|
||||
type SamlAuthRequest struct {
|
||||
|
||||
@@ -13,71 +13,71 @@ import (
|
||||
)
|
||||
|
||||
func TestCreateTask(t *testing.T) {
|
||||
TASK_NAME := "Test Task"
|
||||
TASK_TIME := time.Second * 2
|
||||
TaskName := "Test Task"
|
||||
TaskTime := time.Second * 2
|
||||
|
||||
executionCount := new(int32)
|
||||
testFunc := func() {
|
||||
atomic.AddInt32(executionCount, 1)
|
||||
}
|
||||
|
||||
task := CreateTask(TASK_NAME, testFunc, TASK_TIME)
|
||||
task := CreateTask(TaskName, testFunc, TaskTime)
|
||||
assert.EqualValues(t, 0, atomic.LoadInt32(executionCount))
|
||||
|
||||
time.Sleep(TASK_TIME + time.Second)
|
||||
time.Sleep(TaskTime + time.Second)
|
||||
|
||||
assert.EqualValues(t, 1, atomic.LoadInt32(executionCount))
|
||||
assert.Equal(t, TASK_NAME, task.Name)
|
||||
assert.Equal(t, TASK_TIME, task.Interval)
|
||||
assert.Equal(t, TaskName, task.Name)
|
||||
assert.Equal(t, TaskTime, task.Interval)
|
||||
assert.False(t, task.Recurring)
|
||||
}
|
||||
|
||||
func TestCreateRecurringTask(t *testing.T) {
|
||||
TASK_NAME := "Test Recurring Task"
|
||||
TASK_TIME := time.Second * 2
|
||||
TaskName := "Test Recurring Task"
|
||||
TaskTime := time.Second * 2
|
||||
|
||||
executionCount := new(int32)
|
||||
testFunc := func() {
|
||||
atomic.AddInt32(executionCount, 1)
|
||||
}
|
||||
|
||||
task := CreateRecurringTask(TASK_NAME, testFunc, TASK_TIME)
|
||||
task := CreateRecurringTask(TaskName, testFunc, TaskTime)
|
||||
assert.EqualValues(t, 0, atomic.LoadInt32(executionCount))
|
||||
|
||||
time.Sleep(TASK_TIME + time.Second)
|
||||
time.Sleep(TaskTime + time.Second)
|
||||
|
||||
assert.EqualValues(t, 1, atomic.LoadInt32(executionCount))
|
||||
|
||||
time.Sleep(TASK_TIME)
|
||||
time.Sleep(TaskTime)
|
||||
|
||||
assert.EqualValues(t, 2, atomic.LoadInt32(executionCount))
|
||||
assert.Equal(t, TASK_NAME, task.Name)
|
||||
assert.Equal(t, TASK_TIME, task.Interval)
|
||||
assert.Equal(t, TaskName, task.Name)
|
||||
assert.Equal(t, TaskTime, task.Interval)
|
||||
assert.True(t, task.Recurring)
|
||||
|
||||
task.Cancel()
|
||||
}
|
||||
|
||||
func TestCancelTask(t *testing.T) {
|
||||
TASK_NAME := "Test Task"
|
||||
TASK_TIME := time.Second
|
||||
TaskName := "Test Task"
|
||||
TaskTime := time.Second
|
||||
|
||||
executionCount := new(int32)
|
||||
testFunc := func() {
|
||||
atomic.AddInt32(executionCount, 1)
|
||||
}
|
||||
|
||||
task := CreateTask(TASK_NAME, testFunc, TASK_TIME)
|
||||
task := CreateTask(TaskName, testFunc, TaskTime)
|
||||
assert.EqualValues(t, 0, atomic.LoadInt32(executionCount))
|
||||
task.Cancel()
|
||||
|
||||
time.Sleep(TASK_TIME + time.Second)
|
||||
time.Sleep(TaskTime + time.Second)
|
||||
assert.EqualValues(t, 0, atomic.LoadInt32(executionCount))
|
||||
}
|
||||
|
||||
func TestCreateRecurringTaskFromNextIntervalTime(t *testing.T) {
|
||||
TASK_NAME := "Test Recurring Task starting from next interval time"
|
||||
TASK_TIME := time.Second * 2
|
||||
TaskName := "Test Recurring Task starting from next interval time"
|
||||
TaskTime := time.Second * 2
|
||||
|
||||
var executionTime time.Time
|
||||
var mu sync.Mutex
|
||||
@@ -87,22 +87,22 @@ func TestCreateRecurringTaskFromNextIntervalTime(t *testing.T) {
|
||||
mu.Unlock()
|
||||
}
|
||||
|
||||
task := CreateRecurringTaskFromNextIntervalTime(TASK_NAME, testFunc, TASK_TIME)
|
||||
task := CreateRecurringTaskFromNextIntervalTime(TaskName, testFunc, TaskTime)
|
||||
defer task.Cancel()
|
||||
|
||||
time.Sleep(TASK_TIME)
|
||||
time.Sleep(TaskTime)
|
||||
mu.Lock()
|
||||
expectedSeconds := executionTime.Second()
|
||||
mu.Unlock()
|
||||
assert.EqualValues(t, 0, expectedSeconds%2)
|
||||
|
||||
time.Sleep(TASK_TIME)
|
||||
time.Sleep(TaskTime)
|
||||
mu.Lock()
|
||||
expectedSeconds = executionTime.Second()
|
||||
mu.Unlock()
|
||||
assert.EqualValues(t, 0, expectedSeconds%2)
|
||||
|
||||
assert.Equal(t, TASK_NAME, task.Name)
|
||||
assert.Equal(t, TASK_TIME, task.Interval)
|
||||
assert.Equal(t, TaskName, task.Name)
|
||||
assert.Equal(t, TaskTime, task.Interval)
|
||||
assert.True(t, task.Recurring)
|
||||
}
|
||||
|
||||
@@ -11,11 +11,11 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
SCHEME_DISPLAY_NAME_MAX_LENGTH = 128
|
||||
SCHEME_NAME_MAX_LENGTH = 64
|
||||
SCHEME_DESCRIPTION_MAX_LENGTH = 1024
|
||||
SCHEME_SCOPE_TEAM = "team"
|
||||
SCHEME_SCOPE_CHANNEL = "channel"
|
||||
SchemeDisplayNameMaxLength = 128
|
||||
SchemeNameMaxLength = 64
|
||||
SchemeDescriptionMaxLength = 1024
|
||||
SchemeScopeTeam = "team"
|
||||
SchemeScopeChannel = "channel"
|
||||
)
|
||||
|
||||
type Scheme struct {
|
||||
@@ -114,7 +114,7 @@ func (scheme *Scheme) IsValid() bool {
|
||||
}
|
||||
|
||||
func (scheme *Scheme) IsValidForCreate() bool {
|
||||
if scheme.DisplayName == "" || len(scheme.DisplayName) > SCHEME_DISPLAY_NAME_MAX_LENGTH {
|
||||
if scheme.DisplayName == "" || len(scheme.DisplayName) > SchemeDisplayNameMaxLength {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -122,12 +122,12 @@ func (scheme *Scheme) IsValidForCreate() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(scheme.Description) > SCHEME_DESCRIPTION_MAX_LENGTH {
|
||||
if len(scheme.Description) > SchemeDescriptionMaxLength {
|
||||
return false
|
||||
}
|
||||
|
||||
switch scheme.Scope {
|
||||
case SCHEME_SCOPE_TEAM, SCHEME_SCOPE_CHANNEL:
|
||||
case SchemeScopeTeam, SchemeScopeChannel:
|
||||
default:
|
||||
return false
|
||||
}
|
||||
@@ -144,7 +144,7 @@ func (scheme *Scheme) IsValidForCreate() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
if scheme.Scope == SCHEME_SCOPE_TEAM {
|
||||
if scheme.Scope == SchemeScopeTeam {
|
||||
if !IsValidRoleName(scheme.DefaultTeamAdminRole) {
|
||||
return false
|
||||
}
|
||||
@@ -158,7 +158,7 @@ func (scheme *Scheme) IsValidForCreate() bool {
|
||||
}
|
||||
}
|
||||
|
||||
if scheme.Scope == SCHEME_SCOPE_CHANNEL {
|
||||
if scheme.Scope == SchemeScopeChannel {
|
||||
if scheme.DefaultTeamAdminRole != "" {
|
||||
return false
|
||||
}
|
||||
@@ -210,7 +210,7 @@ func (p *SchemeIDPatch) ToJson() string {
|
||||
}
|
||||
|
||||
func IsValidSchemeName(name string) bool {
|
||||
re := regexp.MustCompile(fmt.Sprintf("^[a-z0-9_]{2,%d}$", SCHEME_NAME_MAX_LENGTH))
|
||||
re := regexp.MustCompile(fmt.Sprintf("^[a-z0-9_]{2,%d}$", SchemeNameMaxLength))
|
||||
return re.MatchString(name)
|
||||
}
|
||||
|
||||
|
||||
@@ -13,23 +13,23 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
SESSION_COOKIE_TOKEN = "MMAUTHTOKEN"
|
||||
SESSION_COOKIE_USER = "MMUSERID"
|
||||
SESSION_COOKIE_CSRF = "MMCSRF"
|
||||
SESSION_CACHE_SIZE = 35000
|
||||
SESSION_PROP_PLATFORM = "platform"
|
||||
SESSION_PROP_OS = "os"
|
||||
SESSION_PROP_BROWSER = "browser"
|
||||
SESSION_PROP_TYPE = "type"
|
||||
SESSION_PROP_USER_ACCESS_TOKEN_ID = "user_access_token_id"
|
||||
SESSION_PROP_IS_BOT = "is_bot"
|
||||
SESSION_PROP_IS_BOT_VALUE = "true"
|
||||
SESSION_TYPE_USER_ACCESS_TOKEN = "UserAccessToken"
|
||||
SESSION_TYPE_CLOUD_KEY = "CloudKey"
|
||||
SESSION_TYPE_REMOTECLUSTER_TOKEN = "RemoteClusterToken"
|
||||
SESSION_PROP_IS_GUEST = "is_guest"
|
||||
SESSION_ACTIVITY_TIMEOUT = 1000 * 60 * 5 // 5 minutes
|
||||
SESSION_USER_ACCESS_TOKEN_EXPIRY = 100 * 365 // 100 years
|
||||
SessionCookieToken = "MMAUTHTOKEN"
|
||||
SessionCookieUser = "MMUSERID"
|
||||
SessionCookieCsrf = "MMCSRF"
|
||||
SessionCacheSize = 35000
|
||||
SessionPropPlatform = "platform"
|
||||
SessionPropOs = "os"
|
||||
SessionPropBrowser = "browser"
|
||||
SessionPropType = "type"
|
||||
SessionPropUserAccessTokenId = "user_access_token_id"
|
||||
SessionPropIsBot = "is_bot"
|
||||
SessionPropIsBotValue = "true"
|
||||
SessionTypeUserAccessToken = "UserAccessToken"
|
||||
SessionTypeCloudKey = "CloudKey"
|
||||
SessionTypeRemoteclusterToken = "RemoteClusterToken"
|
||||
SessionPropIsGuest = "is_guest"
|
||||
SessionActivityTimeout = 1000 * 60 * 5 // 5 minutes
|
||||
SessionUserAccessTokenExpiry = 100 * 365 // 100 years
|
||||
)
|
||||
|
||||
//msgp StringMap
|
||||
@@ -160,7 +160,7 @@ func (s *Session) IsMobileApp() bool {
|
||||
}
|
||||
|
||||
func (s *Session) IsMobile() bool {
|
||||
val, ok := s.Props[USER_AUTH_SERVICE_IS_MOBILE]
|
||||
val, ok := s.Props[UserAuthServiceIsMobile]
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
@@ -173,7 +173,7 @@ func (s *Session) IsMobile() bool {
|
||||
}
|
||||
|
||||
func (s *Session) IsSaml() bool {
|
||||
val, ok := s.Props[USER_AUTH_SERVICE_IS_SAML]
|
||||
val, ok := s.Props[UserAuthServiceIsSaml]
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
@@ -186,7 +186,7 @@ func (s *Session) IsSaml() bool {
|
||||
}
|
||||
|
||||
func (s *Session) IsOAuthUser() bool {
|
||||
val, ok := s.Props[USER_AUTH_SERVICE_IS_OAUTH]
|
||||
val, ok := s.Props[UserAuthServiceIsOAuth]
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -81,10 +81,10 @@ func TestSessionIsOAuthUser(t *testing.T) {
|
||||
isOAuthUser bool
|
||||
}{
|
||||
{"False on empty props", Session{}, false},
|
||||
{"True when key is set to true", Session{Props: StringMap{USER_AUTH_SERVICE_IS_OAUTH: strconv.FormatBool(true)}}, true},
|
||||
{"False when key is set to false", Session{Props: StringMap{USER_AUTH_SERVICE_IS_OAUTH: strconv.FormatBool(false)}}, false},
|
||||
{"Not affected by Session.IsOauth being true", Session{IsOAuth: true}, false},
|
||||
{"Not affected by Session.IsOauth being false", Session{IsOAuth: false, Props: StringMap{USER_AUTH_SERVICE_IS_OAUTH: strconv.FormatBool(true)}}, true},
|
||||
{"True when key is set to true", Session{Props: StringMap{UserAuthServiceIsOAuth: strconv.FormatBool(true)}}, true},
|
||||
{"False when key is set to false", Session{Props: StringMap{UserAuthServiceIsOAuth: strconv.FormatBool(false)}}, false},
|
||||
{"Not affected by Session.IsOAuth being true", Session{IsOAuth: true}, false},
|
||||
{"Not affected by Session.IsOAuth being false", Session{IsOAuth: false, Props: StringMap{UserAuthServiceIsOAuth: strconv.FormatBool(true)}}, true},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
|
||||
@@ -47,7 +47,7 @@ func (sc *SharedChannel) IsValid() *AppError {
|
||||
return NewAppError("SharedChannel.IsValid", "model.channel.is_valid.id.app_error", nil, "ChannelId="+sc.ChannelId, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if sc.Type != CHANNEL_DIRECT && !IsValidId(sc.TeamId) {
|
||||
if sc.Type != ChannelTypeDirect && !IsValidId(sc.TeamId) {
|
||||
return NewAppError("SharedChannel.IsValid", "model.channel.is_valid.id.app_error", nil, "TeamId="+sc.TeamId, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ func (sc *SharedChannel) IsValid() *AppError {
|
||||
return NewAppError("SharedChannel.IsValid", "model.channel.is_valid.update_at.app_error", nil, "id="+sc.ChannelId, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(sc.ShareDisplayName) > CHANNEL_DISPLAY_NAME_MAX_RUNES {
|
||||
if utf8.RuneCountInString(sc.ShareDisplayName) > ChannelDisplayNameMaxRunes {
|
||||
return NewAppError("SharedChannel.IsValid", "model.channel.is_valid.display_name.app_error", nil, "id="+sc.ChannelId, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
@@ -67,11 +67,11 @@ func (sc *SharedChannel) IsValid() *AppError {
|
||||
return NewAppError("SharedChannel.IsValid", "model.channel.is_valid.2_or_more.app_error", nil, "id="+sc.ChannelId, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(sc.ShareHeader) > CHANNEL_HEADER_MAX_RUNES {
|
||||
if utf8.RuneCountInString(sc.ShareHeader) > ChannelHeaderMaxRunes {
|
||||
return NewAppError("SharedChannel.IsValid", "model.channel.is_valid.header.app_error", nil, "id="+sc.ChannelId, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(sc.SharePurpose) > CHANNEL_PURPOSE_MAX_RUNES {
|
||||
if utf8.RuneCountInString(sc.SharePurpose) > ChannelPurposeMaxRunes {
|
||||
return NewAppError("SharedChannel.IsValid", "model.channel.is_valid.purpose.app_error", nil, "id="+sc.ChannelId, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
|
||||
@@ -165,7 +165,7 @@ func StringifySlackFieldValue(a []*SlackAttachment) []*SlackAttachment {
|
||||
// all else should be set in the post which is passed
|
||||
func ParseSlackAttachment(post *Post, attachments []*SlackAttachment) {
|
||||
if post.Type == "" {
|
||||
post.Type = POST_SLACK_ATTACHMENT
|
||||
post.Type = PostTypeSlackAttachment
|
||||
}
|
||||
|
||||
postAttachments := []*SlackAttachment{}
|
||||
|
||||
@@ -17,7 +17,7 @@ func TestParseSlackAttachment(t *testing.T) {
|
||||
ParseSlackAttachment(post, attachments)
|
||||
|
||||
expectedPost := &Post{
|
||||
Type: POST_SLACK_ATTACHMENT,
|
||||
Type: PostTypeSlackAttachment,
|
||||
Props: map[string]interface{}{
|
||||
"attachments": []*SlackAttachment{},
|
||||
},
|
||||
@@ -34,7 +34,7 @@ func TestParseSlackAttachment(t *testing.T) {
|
||||
ParseSlackAttachment(post, attachments)
|
||||
|
||||
expectedPost := &Post{
|
||||
Type: POST_SLACK_ATTACHMENT,
|
||||
Type: PostTypeSlackAttachment,
|
||||
Props: map[string]interface{}{
|
||||
"attachments": []*SlackAttachment{},
|
||||
},
|
||||
|
||||
@@ -9,14 +9,14 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
STATUS_OUT_OF_OFFICE = "ooo"
|
||||
STATUS_OFFLINE = "offline"
|
||||
STATUS_AWAY = "away"
|
||||
STATUS_DND = "dnd"
|
||||
STATUS_ONLINE = "online"
|
||||
STATUS_CACHE_SIZE = SESSION_CACHE_SIZE
|
||||
STATUS_CHANNEL_TIMEOUT = 20000 // 20 seconds
|
||||
STATUS_MIN_UPDATE_TIME = 120000 // 2 minutes
|
||||
StatusOutOfOffice = "ooo"
|
||||
StatusOffline = "offline"
|
||||
StatusAway = "away"
|
||||
StatusDnd = "dnd"
|
||||
StatusOnline = "online"
|
||||
StatusCacheSize = SessionCacheSize
|
||||
StatusChannelTimeout = 20000 // 20 seconds
|
||||
StatusMinUpdateTime = 120000 // 2 minutes
|
||||
)
|
||||
|
||||
type Status struct {
|
||||
@@ -70,7 +70,7 @@ func StatusMapToInterfaceMap(statusMap map[string]*Status) map[string]interface{
|
||||
interfaceMap := map[string]interface{}{}
|
||||
for _, s := range statusMap {
|
||||
// Omitted statues mean offline
|
||||
if s.Status != STATUS_OFFLINE {
|
||||
if s.Status != StatusOffline {
|
||||
interfaceMap[s.UserId] = s.Status
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
)
|
||||
|
||||
func TestStatus(t *testing.T) {
|
||||
status := Status{NewId(), STATUS_ONLINE, true, 0, "123", 0, ""}
|
||||
status := Status{NewId(), StatusOnline, true, 0, "123", 0, ""}
|
||||
json := status.ToJson()
|
||||
status2 := StatusFromJson(strings.NewReader(json))
|
||||
|
||||
@@ -29,7 +29,7 @@ func TestStatus(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestStatusListToJson(t *testing.T) {
|
||||
statuses := []*Status{{NewId(), STATUS_ONLINE, true, 0, "123", 0, ""}, {NewId(), STATUS_OFFLINE, true, 0, "", 0, ""}}
|
||||
statuses := []*Status{{NewId(), StatusOnline, true, 0, "123", 0, ""}, {NewId(), StatusOffline, true, 0, "", 0, ""}}
|
||||
jsonStatuses := StatusListToJson(statuses)
|
||||
|
||||
var dat []map[string]interface{}
|
||||
|
||||
@@ -30,26 +30,26 @@ func SwitchRequestFromJson(data io.Reader) *SwitchRequest {
|
||||
}
|
||||
|
||||
func (o *SwitchRequest) EmailToOAuth() bool {
|
||||
return o.CurrentService == USER_AUTH_SERVICE_EMAIL &&
|
||||
(o.NewService == USER_AUTH_SERVICE_SAML ||
|
||||
o.NewService == USER_AUTH_SERVICE_GITLAB ||
|
||||
o.NewService == SERVICE_GOOGLE ||
|
||||
o.NewService == SERVICE_OFFICE365 ||
|
||||
o.NewService == SERVICE_OPENID)
|
||||
return o.CurrentService == UserAuthServiceEmail &&
|
||||
(o.NewService == UserAuthServiceSaml ||
|
||||
o.NewService == UserAuthServiceGitlab ||
|
||||
o.NewService == ServiceGoogle ||
|
||||
o.NewService == ServiceOffice365 ||
|
||||
o.NewService == ServiceOpenid)
|
||||
}
|
||||
|
||||
func (o *SwitchRequest) OAuthToEmail() bool {
|
||||
return (o.CurrentService == USER_AUTH_SERVICE_SAML ||
|
||||
o.CurrentService == USER_AUTH_SERVICE_GITLAB ||
|
||||
o.CurrentService == SERVICE_GOOGLE ||
|
||||
o.CurrentService == SERVICE_OFFICE365 ||
|
||||
o.CurrentService == SERVICE_OPENID) && o.NewService == USER_AUTH_SERVICE_EMAIL
|
||||
return (o.CurrentService == UserAuthServiceSaml ||
|
||||
o.CurrentService == UserAuthServiceGitlab ||
|
||||
o.CurrentService == ServiceGoogle ||
|
||||
o.CurrentService == ServiceOffice365 ||
|
||||
o.CurrentService == ServiceOpenid) && o.NewService == UserAuthServiceEmail
|
||||
}
|
||||
|
||||
func (o *SwitchRequest) EmailToLdap() bool {
|
||||
return o.CurrentService == USER_AUTH_SERVICE_EMAIL && o.NewService == USER_AUTH_SERVICE_LDAP
|
||||
return o.CurrentService == UserAuthServiceEmail && o.NewService == UserAuthServiceLdap
|
||||
}
|
||||
|
||||
func (o *SwitchRequest) LdapToEmail() bool {
|
||||
return o.CurrentService == USER_AUTH_SERVICE_LDAP && o.NewService == USER_AUTH_SERVICE_EMAIL
|
||||
return o.CurrentService == UserAuthServiceLdap && o.NewService == UserAuthServiceEmail
|
||||
}
|
||||
|
||||
118
model/system.go
118
model/system.go
@@ -10,45 +10,45 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
SYSTEM_TELEMETRY_ID = "DiagnosticId"
|
||||
SYSTEM_RAN_UNIT_TESTS = "RanUnitTests"
|
||||
SYSTEM_LAST_SECURITY_TIME = "LastSecurityTime"
|
||||
SYSTEM_ACTIVE_LICENSE_ID = "ActiveLicenseId"
|
||||
SYSTEM_LICENSE_RENEWAL_TOKEN = "LicenseRenewalToken"
|
||||
SYSTEM_LAST_COMPLIANCE_TIME = "LastComplianceTime"
|
||||
SYSTEM_ASYMMETRIC_SIGNING_KEY = "AsymmetricSigningKey"
|
||||
SYSTEM_POST_ACTION_COOKIE_SECRET = "PostActionCookieSecret"
|
||||
SYSTEM_INSTALLATION_DATE_KEY = "InstallationDate"
|
||||
SYSTEM_FIRST_SERVER_RUN_TIMESTAMP_KEY = "FirstServerRunTimestamp"
|
||||
SYSTEM_CLUSTER_ENCRYPTION_KEY = "ClusterEncryptionKey"
|
||||
SYSTEM_UPGRADED_FROM_TE_ID = "UpgradedFromTE"
|
||||
SYSTEM_WARN_METRIC_NUMBER_OF_TEAMS_5 = "warn_metric_number_of_teams_5"
|
||||
SYSTEM_WARN_METRIC_NUMBER_OF_CHANNELS_50 = "warn_metric_number_of_channels_50"
|
||||
SYSTEM_WARN_METRIC_MFA = "warn_metric_mfa"
|
||||
SYSTEM_WARN_METRIC_EMAIL_DOMAIN = "warn_metric_email_domain"
|
||||
SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_100 = "warn_metric_number_of_active_users_100"
|
||||
SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_200 = "warn_metric_number_of_active_users_200"
|
||||
SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_300 = "warn_metric_number_of_active_users_300"
|
||||
SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_500 = "warn_metric_number_of_active_users_500"
|
||||
SYSTEM_WARN_METRIC_NUMBER_OF_POSTS_2M = "warn_metric_number_of_posts_2M"
|
||||
SYSTEM_WARN_METRIC_LAST_RUN_TIMESTAMP_KEY = "LastWarnMetricRunTimestamp"
|
||||
SYSTEM_METRIC_SUPPORT_EMAIL_NOT_CONFIGURED = "warn_metric_support_email_not_configured"
|
||||
SYSTEM_FIRST_ADMIN_VISIT_MARKETPLACE = "FirstAdminVisitMarketplace"
|
||||
AWS_METERING_REPORT_INTERVAL = 1
|
||||
AWS_METERING_DIMENSION_USAGE_HRS = "UsageHrs"
|
||||
USER_LIMIT_OVERAGE_CYCLE_END_DATE = "UserLimitOverageCycleEndDate"
|
||||
OVER_USER_LIMIT_FORGIVEN_COUNT = "OverUserLimitForgivenCount"
|
||||
OVER_USER_LIMIT_LAST_EMAIL_SENT = "OverUserLimitLastEmailSent"
|
||||
SystemTelemetryId = "DiagnosticId"
|
||||
SystemRanUnitTests = "RanUnitTests"
|
||||
SystemLastSecurityTime = "LastSecurityTime"
|
||||
SystemActiveLicenseId = "ActiveLicenseId"
|
||||
SystemLicenseRenewalToken = "LicenseRenewalToken"
|
||||
SystemLastComplianceTime = "LastComplianceTime"
|
||||
SystemAsymmetricSigningKeyKey = "AsymmetricSigningKey"
|
||||
SystemPostActionCookieSecretKey = "PostActionCookieSecret"
|
||||
SystemInstallationDateKey = "InstallationDate"
|
||||
SystemFirstServerRunTimestampKey = "FirstServerRunTimestamp"
|
||||
SystemClusterEncryptionKey = "ClusterEncryptionKey"
|
||||
SystemUpgradedFromTeId = "UpgradedFromTE"
|
||||
SystemWarnMetricNumberOfTeams5 = "warn_metric_number_of_teams_5"
|
||||
SystemWarnMetricNumberOfChannels50 = "warn_metric_number_of_channels_50"
|
||||
SystemWarnMetricMfa = "warn_metric_mfa"
|
||||
SystemWarnMetricEmailDomain = "warn_metric_email_domain"
|
||||
SystemWarnMetricNumberOfActiveUsers100 = "warn_metric_number_of_active_users_100"
|
||||
SystemWarnMetricNumberOfActiveUsers200 = "warn_metric_number_of_active_users_200"
|
||||
SystemWarnMetricNumberOfActiveUsers300 = "warn_metric_number_of_active_users_300"
|
||||
SystemWarnMetricNumberOfActiveUsers500 = "warn_metric_number_of_active_users_500"
|
||||
SystemWarnMetricNumberOfPosts2m = "warn_metric_number_of_posts_2M"
|
||||
SystemWarnMetricLastRunTimestampKey = "LastWarnMetricRunTimestamp"
|
||||
SystemMetricSupportEmailNotConfigured = "warn_metric_support_email_not_configured"
|
||||
SystemFirstAdminVisitMarketplace = "FirstAdminVisitMarketplace"
|
||||
AwsMeteringReportInterval = 1
|
||||
AwsMeteringDimensionUsageHrs = "UsageHrs"
|
||||
UserLimitOverageCycleEndDate = "UserLimitOverageCycleEndDate"
|
||||
OverUserLimitForgivenCount = "OverUserLimitForgivenCount"
|
||||
OverUserLimitLastEmailSent = "OverUserLimitLastEmailSent"
|
||||
)
|
||||
|
||||
const (
|
||||
WARN_METRIC_STATUS_LIMIT_REACHED = "true"
|
||||
WARN_METRIC_STATUS_RUNONCE = "runonce"
|
||||
WARN_METRIC_STATUS_ACK = "ack"
|
||||
WARN_METRIC_STATUS_STORE_PREFIX = "warn_metric_"
|
||||
WARN_METRIC_JOB_INTERVAL = 24 * 7
|
||||
WARN_METRIC_NUMBER_OF_ACTIVE_USERS_25 = 25
|
||||
WARN_METRIC_JOB_WAIT_TIME = 1000 * 3600 * 24 * 7 // 7 days
|
||||
WarnMetricStatusLimitReached = "true"
|
||||
WarnMetricStatusRunonce = "runonce"
|
||||
WarnMetricStatusAck = "ack"
|
||||
WarnMetricStatusStorePrefix = "warn_metric_"
|
||||
WarnMetricJobInterval = 24 * 7
|
||||
WarnMetricNumberOfActiveUsers25 = 25
|
||||
WarnMetricJobWaitTime = 1000 * 3600 * 24 * 7 // 7 days
|
||||
)
|
||||
|
||||
type System struct {
|
||||
@@ -84,9 +84,9 @@ type SystemECDSAKey struct {
|
||||
|
||||
// ServerBusyState provides serialization for app.Busy.
|
||||
type ServerBusyState struct {
|
||||
Busy bool `json:"busy"`
|
||||
Expires int64 `json:"expires"`
|
||||
Expires_ts string `json:"expires_ts,omitempty"`
|
||||
Busy bool `json:"busy"`
|
||||
Expires int64 `json:"expires"`
|
||||
ExpiresTS string `json:"expires_ts,omitempty"`
|
||||
}
|
||||
|
||||
type SupportPacket struct {
|
||||
@@ -117,62 +117,62 @@ func ServerBusyStateFromJson(r io.Reader) *ServerBusyState {
|
||||
}
|
||||
|
||||
var WarnMetricsTable = map[string]WarnMetric{
|
||||
SYSTEM_WARN_METRIC_MFA: {
|
||||
Id: SYSTEM_WARN_METRIC_MFA,
|
||||
SystemWarnMetricMfa: {
|
||||
Id: SystemWarnMetricMfa,
|
||||
Limit: -1,
|
||||
IsBotOnly: true,
|
||||
IsRunOnce: true,
|
||||
},
|
||||
SYSTEM_WARN_METRIC_EMAIL_DOMAIN: {
|
||||
Id: SYSTEM_WARN_METRIC_EMAIL_DOMAIN,
|
||||
SystemWarnMetricEmailDomain: {
|
||||
Id: SystemWarnMetricEmailDomain,
|
||||
Limit: -1,
|
||||
IsBotOnly: true,
|
||||
IsRunOnce: true,
|
||||
},
|
||||
SYSTEM_WARN_METRIC_NUMBER_OF_TEAMS_5: {
|
||||
Id: SYSTEM_WARN_METRIC_NUMBER_OF_TEAMS_5,
|
||||
SystemWarnMetricNumberOfTeams5: {
|
||||
Id: SystemWarnMetricNumberOfTeams5,
|
||||
Limit: 5,
|
||||
IsBotOnly: true,
|
||||
IsRunOnce: true,
|
||||
},
|
||||
SYSTEM_WARN_METRIC_NUMBER_OF_CHANNELS_50: {
|
||||
Id: SYSTEM_WARN_METRIC_NUMBER_OF_CHANNELS_50,
|
||||
SystemWarnMetricNumberOfChannels50: {
|
||||
Id: SystemWarnMetricNumberOfChannels50,
|
||||
Limit: 50,
|
||||
IsBotOnly: true,
|
||||
IsRunOnce: true,
|
||||
},
|
||||
SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_100: {
|
||||
Id: SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_100,
|
||||
SystemWarnMetricNumberOfActiveUsers100: {
|
||||
Id: SystemWarnMetricNumberOfActiveUsers100,
|
||||
Limit: 100,
|
||||
IsBotOnly: true,
|
||||
IsRunOnce: true,
|
||||
},
|
||||
SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_200: {
|
||||
Id: SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_200,
|
||||
SystemWarnMetricNumberOfActiveUsers200: {
|
||||
Id: SystemWarnMetricNumberOfActiveUsers200,
|
||||
Limit: 200,
|
||||
IsBotOnly: true,
|
||||
IsRunOnce: true,
|
||||
},
|
||||
SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_300: {
|
||||
Id: SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_300,
|
||||
SystemWarnMetricNumberOfActiveUsers300: {
|
||||
Id: SystemWarnMetricNumberOfActiveUsers300,
|
||||
Limit: 300,
|
||||
IsBotOnly: true,
|
||||
IsRunOnce: true,
|
||||
},
|
||||
SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_500: {
|
||||
Id: SYSTEM_WARN_METRIC_NUMBER_OF_ACTIVE_USERS_500,
|
||||
SystemWarnMetricNumberOfActiveUsers500: {
|
||||
Id: SystemWarnMetricNumberOfActiveUsers500,
|
||||
Limit: 500,
|
||||
IsBotOnly: false,
|
||||
IsRunOnce: true,
|
||||
},
|
||||
SYSTEM_WARN_METRIC_NUMBER_OF_POSTS_2M: {
|
||||
Id: SYSTEM_WARN_METRIC_NUMBER_OF_POSTS_2M,
|
||||
SystemWarnMetricNumberOfPosts2m: {
|
||||
Id: SystemWarnMetricNumberOfPosts2m,
|
||||
Limit: 2000000,
|
||||
IsBotOnly: false,
|
||||
IsRunOnce: true,
|
||||
},
|
||||
SYSTEM_METRIC_SUPPORT_EMAIL_NOT_CONFIGURED: {
|
||||
Id: SYSTEM_METRIC_SUPPORT_EMAIL_NOT_CONFIGURED,
|
||||
SystemMetricSupportEmailNotConfigured: {
|
||||
Id: SystemMetricSupportEmailNotConfigured,
|
||||
Limit: -1,
|
||||
IsBotOnly: true,
|
||||
IsRunOnce: false,
|
||||
|
||||
@@ -14,15 +14,15 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
TEAM_OPEN = "O"
|
||||
TEAM_INVITE = "I"
|
||||
TEAM_ALLOWED_DOMAINS_MAX_LENGTH = 500
|
||||
TEAM_COMPANY_NAME_MAX_LENGTH = 64
|
||||
TEAM_DESCRIPTION_MAX_LENGTH = 255
|
||||
TEAM_DISPLAY_NAME_MAX_RUNES = 64
|
||||
TEAM_EMAIL_MAX_LENGTH = 128
|
||||
TEAM_NAME_MAX_LENGTH = 64
|
||||
TEAM_NAME_MIN_LENGTH = 2
|
||||
TeamOpen = "O"
|
||||
TeamInvite = "I"
|
||||
TeamAllowedDomainsMaxLength = 500
|
||||
TeamCompanyNameMaxLength = 64
|
||||
TeamDescriptionMaxLength = 255
|
||||
TeamDisplayNameMaxRunes = 64
|
||||
TeamEmailMaxLength = 128
|
||||
TeamNameMaxLength = 64
|
||||
TeamNameMinLength = 2
|
||||
)
|
||||
|
||||
type Team struct {
|
||||
@@ -149,7 +149,7 @@ func (o *Team) IsValid() *AppError {
|
||||
return NewAppError("Team.IsValid", "model.team.is_valid.update_at.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if len(o.Email) > TEAM_EMAIL_MAX_LENGTH {
|
||||
if len(o.Email) > TeamEmailMaxLength {
|
||||
return NewAppError("Team.IsValid", "model.team.is_valid.email.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
@@ -157,15 +157,15 @@ func (o *Team) IsValid() *AppError {
|
||||
return NewAppError("Team.IsValid", "model.team.is_valid.email.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(o.DisplayName) == 0 || utf8.RuneCountInString(o.DisplayName) > TEAM_DISPLAY_NAME_MAX_RUNES {
|
||||
if utf8.RuneCountInString(o.DisplayName) == 0 || utf8.RuneCountInString(o.DisplayName) > TeamDisplayNameMaxRunes {
|
||||
return NewAppError("Team.IsValid", "model.team.is_valid.name.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if len(o.Name) > TEAM_NAME_MAX_LENGTH {
|
||||
if len(o.Name) > TeamNameMaxLength {
|
||||
return NewAppError("Team.IsValid", "model.team.is_valid.url.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if len(o.Description) > TEAM_DESCRIPTION_MAX_LENGTH {
|
||||
if len(o.Description) > TeamDescriptionMaxLength {
|
||||
return NewAppError("Team.IsValid", "model.team.is_valid.description.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
@@ -181,15 +181,15 @@ func (o *Team) IsValid() *AppError {
|
||||
return NewAppError("Team.IsValid", "model.team.is_valid.characters.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if !(o.Type == TEAM_OPEN || o.Type == TEAM_INVITE) {
|
||||
if !(o.Type == TeamOpen || o.Type == TeamInvite) {
|
||||
return NewAppError("Team.IsValid", "model.team.is_valid.type.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if len(o.CompanyName) > TEAM_COMPANY_NAME_MAX_LENGTH {
|
||||
if len(o.CompanyName) > TeamCompanyNameMaxLength {
|
||||
return NewAppError("Team.IsValid", "model.team.is_valid.company.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if len(o.AllowedDomains) > TEAM_ALLOWED_DOMAINS_MAX_LENGTH {
|
||||
if len(o.AllowedDomains) > TeamAllowedDomainsMaxLength {
|
||||
return NewAppError("Team.IsValid", "model.team.is_valid.domains.app_error", nil, "id="+o.Id, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
@@ -239,7 +239,7 @@ func IsValidTeamName(s string) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(s) < TEAM_NAME_MIN_LENGTH {
|
||||
if len(s) < TeamNameMinLength {
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ func TestTeamIsValid(t *testing.T) {
|
||||
require.NotNil(t, err, "should be invalid")
|
||||
|
||||
o.Name = "zzzzz"
|
||||
o.Type = TEAM_OPEN
|
||||
o.Type = TeamOpen
|
||||
o.InviteId = NewId()
|
||||
err = o.IsValid()
|
||||
require.Nil(t, err, err)
|
||||
|
||||
@@ -11,8 +11,6 @@ import (
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
const TERMS_OF_SERVICE_CACHE_SIZE = 1
|
||||
|
||||
type TermsOfService struct {
|
||||
Id string `json:"id"`
|
||||
CreateAt int64 `json:"create_at"`
|
||||
@@ -33,7 +31,7 @@ func (t *TermsOfService) IsValid() *AppError {
|
||||
return InvalidTermsOfServiceError("user_id", t.Id)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(t.Text) > POST_MESSAGE_MAX_RUNES_V2 {
|
||||
if utf8.RuneCountInString(t.Text) > PostMessageMaxRunesV2 {
|
||||
return InvalidTermsOfServiceError("text", t.Id)
|
||||
}
|
||||
|
||||
@@ -57,7 +55,7 @@ func InvalidTermsOfServiceError(fieldName string, termsOfServiceId string) *AppE
|
||||
if termsOfServiceId != "" {
|
||||
details = "terms_of_service_id=" + termsOfServiceId
|
||||
}
|
||||
return NewAppError("TermsOfService.IsValid", id, map[string]interface{}{"MaxLength": POST_MESSAGE_MAX_RUNES_V2}, details, http.StatusBadRequest)
|
||||
return NewAppError("TermsOfService.IsValid", id, map[string]interface{}{"MaxLength": PostMessageMaxRunesV2}, details, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
func (t *TermsOfService) PreSave() {
|
||||
|
||||
@@ -24,10 +24,10 @@ func TestTermsOfServiceIsValid(t *testing.T) {
|
||||
s.UserId = NewId()
|
||||
assert.Nil(t, s.IsValid(), "should be valid")
|
||||
|
||||
s.Text = strings.Repeat("0", POST_MESSAGE_MAX_RUNES_V2+1)
|
||||
s.Text = strings.Repeat("0", PostMessageMaxRunesV2+1)
|
||||
assert.NotNil(t, s.IsValid(), "should be invalid")
|
||||
|
||||
s.Text = strings.Repeat("0", POST_MESSAGE_MAX_RUNES_V2)
|
||||
s.Text = strings.Repeat("0", PostMessageMaxRunesV2)
|
||||
assert.Nil(t, s.IsValid(), "should be valid")
|
||||
|
||||
s.Text = "test"
|
||||
|
||||
@@ -8,9 +8,9 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
TOKEN_SIZE = 64
|
||||
MAX_TOKEN_EXIPRY_TIME = 1000 * 60 * 60 * 48 // 48 hour
|
||||
TOKEN_TYPE_OAUTH = "oauth"
|
||||
TokenSize = 64
|
||||
MaxTokenExipryTime = 1000 * 60 * 60 * 48 // 48 hour
|
||||
TokenTypeOAuth = "oauth"
|
||||
)
|
||||
|
||||
type Token struct {
|
||||
@@ -22,7 +22,7 @@ type Token struct {
|
||||
|
||||
func NewToken(tokentype, extra string) *Token {
|
||||
return &Token{
|
||||
Token: NewRandomString(TOKEN_SIZE),
|
||||
Token: NewRandomString(TokenSize),
|
||||
CreateAt: GetMillis(),
|
||||
Type: tokentype,
|
||||
Extra: extra,
|
||||
@@ -30,7 +30,7 @@ func NewToken(tokentype, extra string) *Token {
|
||||
}
|
||||
|
||||
func (t *Token) IsValid() *AppError {
|
||||
if len(t.Token) != TOKEN_SIZE {
|
||||
if len(t.Token) != TokenSize {
|
||||
return NewAppError("Token.IsValid", "model.token.is_valid.size", nil, "", http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
|
||||
166
model/user.go
166
model/user.go
@@ -23,41 +23,41 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
ME = "me"
|
||||
USER_NOTIFY_ALL = "all"
|
||||
USER_NOTIFY_HERE = "here"
|
||||
USER_NOTIFY_MENTION = "mention"
|
||||
USER_NOTIFY_NONE = "none"
|
||||
DESKTOP_NOTIFY_PROP = "desktop"
|
||||
DESKTOP_SOUND_NOTIFY_PROP = "desktop_sound"
|
||||
MARK_UNREAD_NOTIFY_PROP = "mark_unread"
|
||||
PUSH_NOTIFY_PROP = "push"
|
||||
PUSH_STATUS_NOTIFY_PROP = "push_status"
|
||||
EMAIL_NOTIFY_PROP = "email"
|
||||
CHANNEL_MENTIONS_NOTIFY_PROP = "channel"
|
||||
COMMENTS_NOTIFY_PROP = "comments"
|
||||
MENTION_KEYS_NOTIFY_PROP = "mention_keys"
|
||||
COMMENTS_NOTIFY_NEVER = "never"
|
||||
COMMENTS_NOTIFY_ROOT = "root"
|
||||
COMMENTS_NOTIFY_ANY = "any"
|
||||
FIRST_NAME_NOTIFY_PROP = "first_name"
|
||||
AUTO_RESPONDER_ACTIVE_NOTIFY_PROP = "auto_responder_active"
|
||||
AUTO_RESPONDER_MESSAGE_NOTIFY_PROP = "auto_responder_message"
|
||||
Me = "me"
|
||||
UserNotifyAll = "all"
|
||||
UserNotifyHere = "here"
|
||||
UserNotifyMention = "mention"
|
||||
UserNotifyNone = "none"
|
||||
DesktopNotifyProp = "desktop"
|
||||
DesktopSoundNotifyProp = "desktop_sound"
|
||||
MarkUnreadNotifyProp = "mark_unread"
|
||||
PushNotifyProp = "push"
|
||||
PushStatusNotifyProp = "push_status"
|
||||
EmailNotifyProp = "email"
|
||||
ChannelMentionsNotifyProp = "channel"
|
||||
CommentsNotifyProp = "comments"
|
||||
MentionKeysNotifyProp = "mention_keys"
|
||||
CommentsNotifyNever = "never"
|
||||
CommentsNotifyRoot = "root"
|
||||
CommentsNotifyAny = "any"
|
||||
FirstNameNotifyProp = "first_name"
|
||||
AutoResponderActiveNotifyProp = "auto_responder_active"
|
||||
AutoResponderMessageNotifyProp = "auto_responder_message"
|
||||
|
||||
DEFAULT_LOCALE = "en"
|
||||
USER_AUTH_SERVICE_EMAIL = "email"
|
||||
DefaultLocale = "en"
|
||||
UserAuthServiceEmail = "email"
|
||||
|
||||
USER_EMAIL_MAX_LENGTH = 128
|
||||
USER_NICKNAME_MAX_RUNES = 64
|
||||
USER_POSITION_MAX_RUNES = 128
|
||||
USER_FIRST_NAME_MAX_RUNES = 64
|
||||
USER_LAST_NAME_MAX_RUNES = 64
|
||||
USER_AUTH_DATA_MAX_LENGTH = 128
|
||||
USER_NAME_MAX_LENGTH = 64
|
||||
USER_NAME_MIN_LENGTH = 1
|
||||
USER_PASSWORD_MAX_LENGTH = 72
|
||||
USER_LOCALE_MAX_LENGTH = 5
|
||||
USER_TIMEZONE_MAX_RUNES = 256
|
||||
UserEmailMaxLength = 128
|
||||
UserNicknameMaxRunes = 64
|
||||
UserPositionMaxRunes = 128
|
||||
UserFirstNameMaxRunes = 64
|
||||
UserLastNameMaxRunes = 64
|
||||
UserAuthDataMaxLength = 128
|
||||
UserNameMaxLength = 64
|
||||
UserNameMinLength = 1
|
||||
UserPasswordMaxLength = 72
|
||||
UserLocaleMaxLength = 5
|
||||
UserTimezoneMaxRunes = 256
|
||||
)
|
||||
|
||||
//msgp:tuple User
|
||||
@@ -282,27 +282,27 @@ func (u *User) IsValid() *AppError {
|
||||
}
|
||||
}
|
||||
|
||||
if len(u.Email) > USER_EMAIL_MAX_LENGTH || u.Email == "" || !IsValidEmail(u.Email) {
|
||||
if len(u.Email) > UserEmailMaxLength || u.Email == "" || !IsValidEmail(u.Email) {
|
||||
return InvalidUserError("email", u.Id)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(u.Nickname) > USER_NICKNAME_MAX_RUNES {
|
||||
if utf8.RuneCountInString(u.Nickname) > UserNicknameMaxRunes {
|
||||
return InvalidUserError("nickname", u.Id)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(u.Position) > USER_POSITION_MAX_RUNES {
|
||||
if utf8.RuneCountInString(u.Position) > UserPositionMaxRunes {
|
||||
return InvalidUserError("position", u.Id)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(u.FirstName) > USER_FIRST_NAME_MAX_RUNES {
|
||||
if utf8.RuneCountInString(u.FirstName) > UserFirstNameMaxRunes {
|
||||
return InvalidUserError("first_name", u.Id)
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(u.LastName) > USER_LAST_NAME_MAX_RUNES {
|
||||
if utf8.RuneCountInString(u.LastName) > UserLastNameMaxRunes {
|
||||
return InvalidUserError("last_name", u.Id)
|
||||
}
|
||||
|
||||
if u.AuthData != nil && len(*u.AuthData) > USER_AUTH_DATA_MAX_LENGTH {
|
||||
if u.AuthData != nil && len(*u.AuthData) > UserAuthDataMaxLength {
|
||||
return InvalidUserError("auth_data", u.Id)
|
||||
}
|
||||
|
||||
@@ -314,7 +314,7 @@ func (u *User) IsValid() *AppError {
|
||||
return InvalidUserError("auth_data_pwd", u.Id)
|
||||
}
|
||||
|
||||
if len(u.Password) > USER_PASSWORD_MAX_LENGTH {
|
||||
if len(u.Password) > UserPasswordMaxLength {
|
||||
return InvalidUserError("password_limit", u.Id)
|
||||
}
|
||||
|
||||
@@ -325,7 +325,7 @@ func (u *User) IsValid() *AppError {
|
||||
if len(u.Timezone) > 0 {
|
||||
if tzJSON, err := json.Marshal(u.Timezone); err != nil {
|
||||
return NewAppError("User.IsValid", "model.user.is_valid.marshal.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||
} else if utf8.RuneCount(tzJSON) > USER_TIMEZONE_MAX_RUNES {
|
||||
} else if utf8.RuneCount(tzJSON) > UserTimezoneMaxRunes {
|
||||
return InvalidUserError("timezone_limit", u.Id)
|
||||
}
|
||||
}
|
||||
@@ -382,7 +382,7 @@ func (u *User) PreSave() {
|
||||
u.MfaActive = false
|
||||
|
||||
if u.Locale == "" {
|
||||
u.Locale = DEFAULT_LOCALE
|
||||
u.Locale = DefaultLocale
|
||||
}
|
||||
|
||||
if u.Props == nil {
|
||||
@@ -425,30 +425,30 @@ func (u *User) PreUpdate() {
|
||||
|
||||
if u.NotifyProps == nil || len(u.NotifyProps) == 0 {
|
||||
u.SetDefaultNotifications()
|
||||
} else if _, ok := u.NotifyProps[MENTION_KEYS_NOTIFY_PROP]; ok {
|
||||
} else if _, ok := u.NotifyProps[MentionKeysNotifyProp]; ok {
|
||||
// Remove any blank mention keys
|
||||
splitKeys := strings.Split(u.NotifyProps[MENTION_KEYS_NOTIFY_PROP], ",")
|
||||
splitKeys := strings.Split(u.NotifyProps[MentionKeysNotifyProp], ",")
|
||||
goodKeys := []string{}
|
||||
for _, key := range splitKeys {
|
||||
if key != "" {
|
||||
goodKeys = append(goodKeys, strings.ToLower(key))
|
||||
}
|
||||
}
|
||||
u.NotifyProps[MENTION_KEYS_NOTIFY_PROP] = strings.Join(goodKeys, ",")
|
||||
u.NotifyProps[MentionKeysNotifyProp] = strings.Join(goodKeys, ",")
|
||||
}
|
||||
}
|
||||
|
||||
func (u *User) SetDefaultNotifications() {
|
||||
u.NotifyProps = make(map[string]string)
|
||||
u.NotifyProps[EMAIL_NOTIFY_PROP] = "true"
|
||||
u.NotifyProps[PUSH_NOTIFY_PROP] = USER_NOTIFY_MENTION
|
||||
u.NotifyProps[DESKTOP_NOTIFY_PROP] = USER_NOTIFY_MENTION
|
||||
u.NotifyProps[DESKTOP_SOUND_NOTIFY_PROP] = "true"
|
||||
u.NotifyProps[MENTION_KEYS_NOTIFY_PROP] = ""
|
||||
u.NotifyProps[CHANNEL_MENTIONS_NOTIFY_PROP] = "true"
|
||||
u.NotifyProps[PUSH_STATUS_NOTIFY_PROP] = STATUS_AWAY
|
||||
u.NotifyProps[COMMENTS_NOTIFY_PROP] = COMMENTS_NOTIFY_NEVER
|
||||
u.NotifyProps[FIRST_NAME_NOTIFY_PROP] = "false"
|
||||
u.NotifyProps[EmailNotifyProp] = "true"
|
||||
u.NotifyProps[PushNotifyProp] = UserNotifyMention
|
||||
u.NotifyProps[DesktopNotifyProp] = UserNotifyMention
|
||||
u.NotifyProps[DesktopSoundNotifyProp] = "true"
|
||||
u.NotifyProps[MentionKeysNotifyProp] = ""
|
||||
u.NotifyProps[ChannelMentionsNotifyProp] = "true"
|
||||
u.NotifyProps[PushStatusNotifyProp] = StatusAway
|
||||
u.NotifyProps[CommentsNotifyProp] = CommentsNotifyNever
|
||||
u.NotifyProps[FirstNameNotifyProp] = "false"
|
||||
}
|
||||
|
||||
func (u *User) UpdateMentionKeysFromUsername(oldUsername string) {
|
||||
@@ -459,16 +459,16 @@ func (u *User) UpdateMentionKeysFromUsername(oldUsername string) {
|
||||
}
|
||||
}
|
||||
|
||||
u.NotifyProps[MENTION_KEYS_NOTIFY_PROP] = ""
|
||||
u.NotifyProps[MentionKeysNotifyProp] = ""
|
||||
if len(nonUsernameKeys) > 0 {
|
||||
u.NotifyProps[MENTION_KEYS_NOTIFY_PROP] += "," + strings.Join(nonUsernameKeys, ",")
|
||||
u.NotifyProps[MentionKeysNotifyProp] += "," + strings.Join(nonUsernameKeys, ",")
|
||||
}
|
||||
}
|
||||
|
||||
func (u *User) GetMentionKeys() []string {
|
||||
var keys []string
|
||||
|
||||
for _, key := range strings.Split(u.NotifyProps[MENTION_KEYS_NOTIFY_PROP], ",") {
|
||||
for _, key := range strings.Split(u.NotifyProps[MentionKeysNotifyProp], ",") {
|
||||
trimmedKey := strings.TrimSpace(key)
|
||||
|
||||
if trimmedKey == "" {
|
||||
@@ -642,13 +642,13 @@ func (u *User) GetFullName() string {
|
||||
func (u *User) getDisplayName(baseName, nameFormat string) string {
|
||||
displayName := baseName
|
||||
|
||||
if nameFormat == SHOW_NICKNAME_FULLNAME {
|
||||
if nameFormat == ShowNicknameFullName {
|
||||
if u.Nickname != "" {
|
||||
displayName = u.Nickname
|
||||
} else if fullName := u.GetFullName(); fullName != "" {
|
||||
displayName = fullName
|
||||
}
|
||||
} else if nameFormat == SHOW_FULLNAME {
|
||||
} else if nameFormat == ShowFullName {
|
||||
if fullName := u.GetFullName(); fullName != "" {
|
||||
displayName = fullName
|
||||
}
|
||||
@@ -698,11 +698,11 @@ func IsValidUserRoles(userRoles string) bool {
|
||||
// Make sure you acually want to use this function. In context.go there are functions to check permissions
|
||||
// This function should not be used to check permissions.
|
||||
func (u *User) IsGuest() bool {
|
||||
return IsInRole(u.Roles, SYSTEM_GUEST_ROLE_ID)
|
||||
return IsInRole(u.Roles, SystemGuestRoleId)
|
||||
}
|
||||
|
||||
func (u *User) IsSystemAdmin() bool {
|
||||
return IsInRole(u.Roles, SYSTEM_ADMIN_ROLE_ID)
|
||||
return IsInRole(u.Roles, SystemAdminRoleId)
|
||||
}
|
||||
|
||||
// Make sure you acually want to use this function. In context.go there are functions to check permissions
|
||||
@@ -726,22 +726,22 @@ func IsInRole(userRoles string, inRole string) bool {
|
||||
}
|
||||
|
||||
func (u *User) IsSSOUser() bool {
|
||||
return u.AuthService != "" && u.AuthService != USER_AUTH_SERVICE_EMAIL
|
||||
return u.AuthService != "" && u.AuthService != UserAuthServiceEmail
|
||||
}
|
||||
|
||||
func (u *User) IsOAuthUser() bool {
|
||||
return u.AuthService == SERVICE_GITLAB ||
|
||||
u.AuthService == SERVICE_GOOGLE ||
|
||||
u.AuthService == SERVICE_OFFICE365 ||
|
||||
u.AuthService == SERVICE_OPENID
|
||||
return u.AuthService == ServiceGitlab ||
|
||||
u.AuthService == ServiceGoogle ||
|
||||
u.AuthService == ServiceOffice365 ||
|
||||
u.AuthService == ServiceOpenid
|
||||
}
|
||||
|
||||
func (u *User) IsLDAPUser() bool {
|
||||
return u.AuthService == USER_AUTH_SERVICE_LDAP
|
||||
return u.AuthService == UserAuthServiceLdap
|
||||
}
|
||||
|
||||
func (u *User) IsSAMLUser() bool {
|
||||
return u.AuthService == USER_AUTH_SERVICE_SAML
|
||||
return u.AuthService == UserAuthServiceSaml
|
||||
}
|
||||
|
||||
func (u *User) GetPreferredTimezone() string {
|
||||
@@ -877,7 +877,7 @@ var restrictedUsernames = map[string]struct{}{
|
||||
}
|
||||
|
||||
func IsValidUsername(s string) bool {
|
||||
if len(s) < USER_NAME_MIN_LENGTH || len(s) > USER_NAME_MAX_LENGTH {
|
||||
if len(s) < UserNameMinLength || len(s) > UserNameMaxLength {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -890,7 +890,7 @@ func IsValidUsername(s string) bool {
|
||||
}
|
||||
|
||||
func IsValidUsernameAllowRemote(s string) bool {
|
||||
if len(s) < USER_NAME_MIN_LENGTH || len(s) > USER_NAME_MAX_LENGTH {
|
||||
if len(s) < UserNameMinLength || len(s) > UserNameMaxLength {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -932,32 +932,32 @@ func CleanUsername(username string) string {
|
||||
}
|
||||
|
||||
func IsValidUserNotifyLevel(notifyLevel string) bool {
|
||||
return notifyLevel == CHANNEL_NOTIFY_ALL ||
|
||||
notifyLevel == CHANNEL_NOTIFY_MENTION ||
|
||||
notifyLevel == CHANNEL_NOTIFY_NONE
|
||||
return notifyLevel == ChannelNotifyAll ||
|
||||
notifyLevel == ChannelNotifyMention ||
|
||||
notifyLevel == ChannelNotifyNone
|
||||
}
|
||||
|
||||
func IsValidPushStatusNotifyLevel(notifyLevel string) bool {
|
||||
return notifyLevel == STATUS_ONLINE ||
|
||||
notifyLevel == STATUS_AWAY ||
|
||||
notifyLevel == STATUS_OFFLINE
|
||||
return notifyLevel == StatusOnline ||
|
||||
notifyLevel == StatusAway ||
|
||||
notifyLevel == StatusOffline
|
||||
}
|
||||
|
||||
func IsValidCommentsNotifyLevel(notifyLevel string) bool {
|
||||
return notifyLevel == COMMENTS_NOTIFY_ANY ||
|
||||
notifyLevel == COMMENTS_NOTIFY_ROOT ||
|
||||
notifyLevel == COMMENTS_NOTIFY_NEVER
|
||||
return notifyLevel == CommentsNotifyAny ||
|
||||
notifyLevel == CommentsNotifyRoot ||
|
||||
notifyLevel == CommentsNotifyNever
|
||||
}
|
||||
|
||||
func IsValidEmailBatchingInterval(emailInterval string) bool {
|
||||
return emailInterval == PREFERENCE_EMAIL_INTERVAL_IMMEDIATELY ||
|
||||
emailInterval == PREFERENCE_EMAIL_INTERVAL_FIFTEEN ||
|
||||
emailInterval == PREFERENCE_EMAIL_INTERVAL_HOUR
|
||||
return emailInterval == PreferenceEmailIntervalImmediately ||
|
||||
emailInterval == PreferenceEmailIntervalFifteen ||
|
||||
emailInterval == PreferenceEmailIntervalHour
|
||||
}
|
||||
|
||||
func IsValidLocale(locale string) bool {
|
||||
if locale != "" {
|
||||
if len(locale) > USER_LOCALE_MAX_LENGTH {
|
||||
if len(locale) > UserLocaleMaxLength {
|
||||
return false
|
||||
} else if _, err := language.Parse(locale); err != nil {
|
||||
return false
|
||||
|
||||
@@ -8,8 +8,8 @@ import (
|
||||
"io"
|
||||
)
|
||||
|
||||
const USER_SEARCH_MAX_LIMIT = 1000
|
||||
const USER_SEARCH_DEFAULT_LIMIT = 100
|
||||
const UserSearchMaxLimit = 1000
|
||||
const UserSearchDefaultLimit = 100
|
||||
|
||||
// UserSearch captures the parameters provided by a client for initiating a user search.
|
||||
type UserSearch struct {
|
||||
@@ -41,7 +41,7 @@ func UserSearchFromJson(data io.Reader) *UserSearch {
|
||||
json.NewDecoder(data).Decode(&us)
|
||||
|
||||
if us.Limit == 0 {
|
||||
us.Limit = USER_SEARCH_DEFAULT_LIMIT
|
||||
us.Limit = UserSearchDefaultLimit
|
||||
}
|
||||
|
||||
return &us
|
||||
|
||||
@@ -178,37 +178,37 @@ func TestUserGetFullName(t *testing.T) {
|
||||
func TestUserGetDisplayName(t *testing.T) {
|
||||
user := User{Username: "username"}
|
||||
|
||||
assert.Equal(t, user.GetDisplayName(SHOW_FULLNAME), "username", "Display name should be username")
|
||||
assert.Equal(t, user.GetDisplayName(SHOW_NICKNAME_FULLNAME), "username", "Display name should be username")
|
||||
assert.Equal(t, user.GetDisplayName(SHOW_USERNAME), "username", "Display name should be username")
|
||||
assert.Equal(t, user.GetDisplayName(ShowFullName), "username", "Display name should be username")
|
||||
assert.Equal(t, user.GetDisplayName(ShowNicknameFullName), "username", "Display name should be username")
|
||||
assert.Equal(t, user.GetDisplayName(ShowUsername), "username", "Display name should be username")
|
||||
|
||||
user.FirstName = "first"
|
||||
user.LastName = "last"
|
||||
|
||||
assert.Equal(t, user.GetDisplayName(SHOW_FULLNAME), "first last", "Display name should be full name")
|
||||
assert.Equal(t, user.GetDisplayName(SHOW_NICKNAME_FULLNAME), "first last", "Display name should be full name since there is no nickname")
|
||||
assert.Equal(t, user.GetDisplayName(SHOW_USERNAME), "username", "Display name should be username")
|
||||
assert.Equal(t, user.GetDisplayName(ShowFullName), "first last", "Display name should be full name")
|
||||
assert.Equal(t, user.GetDisplayName(ShowNicknameFullName), "first last", "Display name should be full name since there is no nickname")
|
||||
assert.Equal(t, user.GetDisplayName(ShowUsername), "username", "Display name should be username")
|
||||
|
||||
user.Nickname = "nickname"
|
||||
assert.Equal(t, user.GetDisplayName(SHOW_NICKNAME_FULLNAME), "nickname", "Display name should be nickname")
|
||||
assert.Equal(t, user.GetDisplayName(ShowNicknameFullName), "nickname", "Display name should be nickname")
|
||||
}
|
||||
|
||||
func TestUserGetDisplayNameWithPrefix(t *testing.T) {
|
||||
user := User{Username: "username"}
|
||||
|
||||
assert.Equal(t, user.GetDisplayNameWithPrefix(SHOW_FULLNAME, "@"), "@username", "Display name should be username")
|
||||
assert.Equal(t, user.GetDisplayNameWithPrefix(SHOW_NICKNAME_FULLNAME, "@"), "@username", "Display name should be username")
|
||||
assert.Equal(t, user.GetDisplayNameWithPrefix(SHOW_USERNAME, "@"), "@username", "Display name should be username")
|
||||
assert.Equal(t, user.GetDisplayNameWithPrefix(ShowFullName, "@"), "@username", "Display name should be username")
|
||||
assert.Equal(t, user.GetDisplayNameWithPrefix(ShowNicknameFullName, "@"), "@username", "Display name should be username")
|
||||
assert.Equal(t, user.GetDisplayNameWithPrefix(ShowUsername, "@"), "@username", "Display name should be username")
|
||||
|
||||
user.FirstName = "first"
|
||||
user.LastName = "last"
|
||||
|
||||
assert.Equal(t, user.GetDisplayNameWithPrefix(SHOW_FULLNAME, "@"), "first last", "Display name should be full name")
|
||||
assert.Equal(t, user.GetDisplayNameWithPrefix(SHOW_NICKNAME_FULLNAME, "@"), "first last", "Display name should be full name since there is no nickname")
|
||||
assert.Equal(t, user.GetDisplayNameWithPrefix(SHOW_USERNAME, "@"), "@username", "Display name should be username")
|
||||
assert.Equal(t, user.GetDisplayNameWithPrefix(ShowFullName, "@"), "first last", "Display name should be full name")
|
||||
assert.Equal(t, user.GetDisplayNameWithPrefix(ShowNicknameFullName, "@"), "first last", "Display name should be full name since there is no nickname")
|
||||
assert.Equal(t, user.GetDisplayNameWithPrefix(ShowUsername, "@"), "@username", "Display name should be username")
|
||||
|
||||
user.Nickname = "nickname"
|
||||
assert.Equal(t, user.GetDisplayNameWithPrefix(SHOW_NICKNAME_FULLNAME, "@"), "nickname", "Display name should be nickname")
|
||||
assert.Equal(t, user.GetDisplayNameWithPrefix(ShowNicknameFullName, "@"), "nickname", "Display name should be nickname")
|
||||
}
|
||||
|
||||
type usernamesTest struct {
|
||||
|
||||
@@ -27,11 +27,11 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
LOWERCASE_LETTERS = "abcdefghijklmnopqrstuvwxyz"
|
||||
UPPERCASE_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
NUMBERS = "0123456789"
|
||||
SYMBOLS = " !\"\\#$%&'()*+,-./:;<=>?@[]^_`|~"
|
||||
MB = 1 << 20
|
||||
LowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
|
||||
UppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
NUMBERS = "0123456789"
|
||||
SYMBOLS = " !\"\\#$%&'()*+,-./:;<=>?@[]^_`|~"
|
||||
MB = 1 << 20
|
||||
)
|
||||
|
||||
type StringInterface map[string]interface{}
|
||||
@@ -415,7 +415,7 @@ func IsValidChannelIdentifier(s string) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(s) < CHANNEL_NAME_MIN_LENGTH {
|
||||
if len(s) < ChannelNameMinLength {
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
SOCKET_MAX_MESSAGE_SIZE_KB = 8 * 1024 // 8KB
|
||||
PING_TIMEOUT_BUFFER_SECONDS = 5
|
||||
SocketMaxMessageSizeKb = 8 * 1024 // 8KB
|
||||
PingTimeoutBufferSeconds = 5
|
||||
)
|
||||
|
||||
type msgType int
|
||||
@@ -66,15 +66,15 @@ func NewWebSocketClient(url, authToken string) (*WebSocketClient, *AppError) {
|
||||
// NewWebSocketClientWithDialer constructs a new WebSocket client with convenience
|
||||
// methods for talking to the server using a custom dialer.
|
||||
func NewWebSocketClientWithDialer(dialer *websocket.Dialer, url, authToken string) (*WebSocketClient, *AppError) {
|
||||
conn, _, err := dialer.Dial(url+API_URL_SUFFIX+"/websocket", nil)
|
||||
conn, _, err := dialer.Dial(url+ApiUrlSuffix+"/websocket", nil)
|
||||
if err != nil {
|
||||
return nil, NewAppError("NewWebSocketClient", "model.websocket_client.connect_fail.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
client := &WebSocketClient{
|
||||
Url: url,
|
||||
ApiUrl: url + API_URL_SUFFIX,
|
||||
ConnectUrl: url + API_URL_SUFFIX + "/websocket",
|
||||
ApiUrl: url + ApiUrlSuffix,
|
||||
ConnectUrl: url + ApiUrlSuffix + "/websocket",
|
||||
Conn: conn,
|
||||
AuthToken: authToken,
|
||||
Sequence: 1,
|
||||
@@ -90,7 +90,7 @@ func NewWebSocketClientWithDialer(dialer *websocket.Dialer, url, authToken strin
|
||||
client.configurePingHandling()
|
||||
go client.writer()
|
||||
|
||||
client.SendMessage(WEBSOCKET_AUTHENTICATION_CHALLENGE, map[string]interface{}{"token": authToken})
|
||||
client.SendMessage(WebsocketAuthenticationChallenge, map[string]interface{}{"token": authToken})
|
||||
|
||||
return client, nil
|
||||
}
|
||||
@@ -136,7 +136,7 @@ func (wsc *WebSocketClient) ConnectWithDialer(dialer *websocket.Dialer) *AppErro
|
||||
wsc.EventChannel = make(chan *WebSocketEvent, 100)
|
||||
wsc.ResponseChannel = make(chan *WebSocketResponse, 100)
|
||||
|
||||
wsc.SendMessage(WEBSOCKET_AUTHENTICATION_CHALLENGE, map[string]interface{}{"token": wsc.AuthToken})
|
||||
wsc.SendMessage(WebsocketAuthenticationChallenge, map[string]interface{}{"token": wsc.AuthToken})
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -282,7 +282,7 @@ func (wsc *WebSocketClient) GetStatusesByIds(userIds []string) {
|
||||
|
||||
func (wsc *WebSocketClient) configurePingHandling() {
|
||||
wsc.Conn.SetPingHandler(wsc.pingHandler)
|
||||
wsc.pingTimeoutTimer = time.NewTimer(time.Second * (60 + PING_TIMEOUT_BUFFER_SECONDS))
|
||||
wsc.pingTimeoutTimer = time.NewTimer(time.Second * (60 + PingTimeoutBufferSeconds))
|
||||
go wsc.pingWatchdog()
|
||||
}
|
||||
|
||||
@@ -309,11 +309,11 @@ func (wsc *WebSocketClient) pingWatchdog() {
|
||||
if !wsc.pingTimeoutTimer.Stop() {
|
||||
<-wsc.pingTimeoutTimer.C
|
||||
}
|
||||
wsc.pingTimeoutTimer.Reset(time.Second * (60 + PING_TIMEOUT_BUFFER_SECONDS))
|
||||
wsc.pingTimeoutTimer.Reset(time.Second * (60 + PingTimeoutBufferSeconds))
|
||||
|
||||
case <-wsc.pingTimeoutTimer.C:
|
||||
wsc.PingTimeoutChannel <- true
|
||||
wsc.pingTimeoutTimer.Reset(time.Second * (60 + PING_TIMEOUT_BUFFER_SECONDS))
|
||||
wsc.pingTimeoutTimer.Reset(time.Second * (60 + PingTimeoutBufferSeconds))
|
||||
case <-wsc.quitPingWatchdog:
|
||||
return
|
||||
}
|
||||
|
||||
@@ -11,69 +11,69 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
WEBSOCKET_EVENT_TYPING = "typing"
|
||||
WEBSOCKET_EVENT_POSTED = "posted"
|
||||
WEBSOCKET_EVENT_POST_EDITED = "post_edited"
|
||||
WEBSOCKET_EVENT_POST_DELETED = "post_deleted"
|
||||
WEBSOCKET_EVENT_POST_UNREAD = "post_unread"
|
||||
WEBSOCKET_EVENT_CHANNEL_CONVERTED = "channel_converted"
|
||||
WEBSOCKET_EVENT_CHANNEL_CREATED = "channel_created"
|
||||
WEBSOCKET_EVENT_CHANNEL_DELETED = "channel_deleted"
|
||||
WEBSOCKET_EVENT_CHANNEL_RESTORED = "channel_restored"
|
||||
WEBSOCKET_EVENT_CHANNEL_UPDATED = "channel_updated"
|
||||
WEBSOCKET_EVENT_CHANNEL_MEMBER_UPDATED = "channel_member_updated"
|
||||
WEBSOCKET_EVENT_CHANNEL_SCHEME_UPDATED = "channel_scheme_updated"
|
||||
WEBSOCKET_EVENT_DIRECT_ADDED = "direct_added"
|
||||
WEBSOCKET_EVENT_GROUP_ADDED = "group_added"
|
||||
WEBSOCKET_EVENT_NEW_USER = "new_user"
|
||||
WEBSOCKET_EVENT_ADDED_TO_TEAM = "added_to_team"
|
||||
WEBSOCKET_EVENT_LEAVE_TEAM = "leave_team"
|
||||
WEBSOCKET_EVENT_UPDATE_TEAM = "update_team"
|
||||
WEBSOCKET_EVENT_DELETE_TEAM = "delete_team"
|
||||
WEBSOCKET_EVENT_RESTORE_TEAM = "restore_team"
|
||||
WEBSOCKET_EVENT_UPDATE_TEAM_SCHEME = "update_team_scheme"
|
||||
WEBSOCKET_EVENT_USER_ADDED = "user_added"
|
||||
WEBSOCKET_EVENT_USER_UPDATED = "user_updated"
|
||||
WEBSOCKET_EVENT_USER_ROLE_UPDATED = "user_role_updated"
|
||||
WEBSOCKET_EVENT_MEMBERROLE_UPDATED = "memberrole_updated"
|
||||
WEBSOCKET_EVENT_USER_REMOVED = "user_removed"
|
||||
WEBSOCKET_EVENT_PREFERENCE_CHANGED = "preference_changed"
|
||||
WEBSOCKET_EVENT_PREFERENCES_CHANGED = "preferences_changed"
|
||||
WEBSOCKET_EVENT_PREFERENCES_DELETED = "preferences_deleted"
|
||||
WEBSOCKET_EVENT_EPHEMERAL_MESSAGE = "ephemeral_message"
|
||||
WEBSOCKET_EVENT_STATUS_CHANGE = "status_change"
|
||||
WEBSOCKET_EVENT_HELLO = "hello"
|
||||
WEBSOCKET_AUTHENTICATION_CHALLENGE = "authentication_challenge"
|
||||
WEBSOCKET_EVENT_REACTION_ADDED = "reaction_added"
|
||||
WEBSOCKET_EVENT_REACTION_REMOVED = "reaction_removed"
|
||||
WEBSOCKET_EVENT_RESPONSE = "response"
|
||||
WEBSOCKET_EVENT_EMOJI_ADDED = "emoji_added"
|
||||
WEBSOCKET_EVENT_CHANNEL_VIEWED = "channel_viewed"
|
||||
WEBSOCKET_EVENT_PLUGIN_STATUSES_CHANGED = "plugin_statuses_changed"
|
||||
WEBSOCKET_EVENT_PLUGIN_ENABLED = "plugin_enabled"
|
||||
WEBSOCKET_EVENT_PLUGIN_DISABLED = "plugin_disabled"
|
||||
WEBSOCKET_EVENT_ROLE_UPDATED = "role_updated"
|
||||
WEBSOCKET_EVENT_LICENSE_CHANGED = "license_changed"
|
||||
WEBSOCKET_EVENT_CONFIG_CHANGED = "config_changed"
|
||||
WEBSOCKET_EVENT_OPEN_DIALOG = "open_dialog"
|
||||
WEBSOCKET_EVENT_GUESTS_DEACTIVATED = "guests_deactivated"
|
||||
WEBSOCKET_EVENT_USER_ACTIVATION_STATUS_CHANGE = "user_activation_status_change"
|
||||
WEBSOCKET_EVENT_RECEIVED_GROUP = "received_group"
|
||||
WEBSOCKET_EVENT_RECEIVED_GROUP_ASSOCIATED_TO_TEAM = "received_group_associated_to_team"
|
||||
WEBSOCKET_EVENT_RECEIVED_GROUP_NOT_ASSOCIATED_TO_TEAM = "received_group_not_associated_to_team"
|
||||
WEBSOCKET_EVENT_RECEIVED_GROUP_ASSOCIATED_TO_CHANNEL = "received_group_associated_to_channel"
|
||||
WEBSOCKET_EVENT_RECEIVED_GROUP_NOT_ASSOCIATED_TO_CHANNEL = "received_group_not_associated_to_channel"
|
||||
WEBSOCKET_EVENT_SIDEBAR_CATEGORY_CREATED = "sidebar_category_created"
|
||||
WEBSOCKET_EVENT_SIDEBAR_CATEGORY_UPDATED = "sidebar_category_updated"
|
||||
WEBSOCKET_EVENT_SIDEBAR_CATEGORY_DELETED = "sidebar_category_deleted"
|
||||
WEBSOCKET_EVENT_SIDEBAR_CATEGORY_ORDER_UPDATED = "sidebar_category_order_updated"
|
||||
WEBSOCKET_WARN_METRIC_STATUS_RECEIVED = "warn_metric_status_received"
|
||||
WEBSOCKET_WARN_METRIC_STATUS_REMOVED = "warn_metric_status_removed"
|
||||
WEBSOCKET_EVENT_CLOUD_PAYMENT_STATUS_UPDATED = "cloud_payment_status_updated"
|
||||
WEBSOCKET_EVENT_THREAD_UPDATED = "thread_updated"
|
||||
WEBSOCKET_EVENT_THREAD_FOLLOW_CHANGED = "thread_follow_changed"
|
||||
WEBSOCKET_EVENT_THREAD_READ_CHANGED = "thread_read_changed"
|
||||
WEBSOCKET_FIRST_ADMIN_VISIT_MARKETPLACE_STATUS_RECEIVED = "first_admin_visit_marketplace_status_received"
|
||||
WebsocketEventTyping = "typing"
|
||||
WebsocketEventPosted = "posted"
|
||||
WebsocketEventPostEdited = "post_edited"
|
||||
WebsocketEventPostDeleted = "post_deleted"
|
||||
WebsocketEventPostUnread = "post_unread"
|
||||
WebsocketEventChannelConverted = "channel_converted"
|
||||
WebsocketEventChannelCreated = "channel_created"
|
||||
WebsocketEventChannelDeleted = "channel_deleted"
|
||||
WebsocketEventChannelRestored = "channel_restored"
|
||||
WebsocketEventChannelUpdated = "channel_updated"
|
||||
WebsocketEventChannelMemberUpdated = "channel_member_updated"
|
||||
WebsocketEventChannelSchemeUpdated = "channel_scheme_updated"
|
||||
WebsocketEventDirectAdded = "direct_added"
|
||||
WebsocketEventGroupAdded = "group_added"
|
||||
WebsocketEventNewUser = "new_user"
|
||||
WebsocketEventAddedToTeam = "added_to_team"
|
||||
WebsocketEventLeaveTeam = "leave_team"
|
||||
WebsocketEventUpdateTeam = "update_team"
|
||||
WebsocketEventDeleteTeam = "delete_team"
|
||||
WebsocketEventRestoreTeam = "restore_team"
|
||||
WebsocketEventUpdateTeamScheme = "update_team_scheme"
|
||||
WebsocketEventUserAdded = "user_added"
|
||||
WebsocketEventUserUpdated = "user_updated"
|
||||
WebsocketEventUserRoleUpdated = "user_role_updated"
|
||||
WebsocketEventMemberroleUpdated = "memberrole_updated"
|
||||
WebsocketEventUserRemoved = "user_removed"
|
||||
WebsocketEventPreferenceChanged = "preference_changed"
|
||||
WebsocketEventPreferencesChanged = "preferences_changed"
|
||||
WebsocketEventPreferencesDeleted = "preferences_deleted"
|
||||
WebsocketEventEphemeralMessage = "ephemeral_message"
|
||||
WebsocketEventStatusChange = "status_change"
|
||||
WebsocketEventHello = "hello"
|
||||
WebsocketAuthenticationChallenge = "authentication_challenge"
|
||||
WebsocketEventReactionAdded = "reaction_added"
|
||||
WebsocketEventReactionRemoved = "reaction_removed"
|
||||
WebsocketEventResponse = "response"
|
||||
WebsocketEventEmojiAdded = "emoji_added"
|
||||
WebsocketEventChannelViewed = "channel_viewed"
|
||||
WebsocketEventPluginStatusesChanged = "plugin_statuses_changed"
|
||||
WebsocketEventPluginEnabled = "plugin_enabled"
|
||||
WebsocketEventPluginDisabled = "plugin_disabled"
|
||||
WebsocketEventRoleUpdated = "role_updated"
|
||||
WebsocketEventLicenseChanged = "license_changed"
|
||||
WebsocketEventConfigChanged = "config_changed"
|
||||
WebsocketEventOpenDialog = "open_dialog"
|
||||
WebsocketEventGuestsDeactivated = "guests_deactivated"
|
||||
WebsocketEventUserActivationStatusChange = "user_activation_status_change"
|
||||
WebsocketEventReceivedGroup = "received_group"
|
||||
WebsocketEventReceivedGroupAssociatedToTeam = "received_group_associated_to_team"
|
||||
WebsocketEventReceivedGroupNotAssociatedToTeam = "received_group_not_associated_to_team"
|
||||
WebsocketEventReceivedGroupAssociatedToChannel = "received_group_associated_to_channel"
|
||||
WebsocketEventReceivedGroupNotAssociatedToChannel = "received_group_not_associated_to_channel"
|
||||
WebsocketEventSidebarCategoryCreated = "sidebar_category_created"
|
||||
WebsocketEventSidebarCategoryUpdated = "sidebar_category_updated"
|
||||
WebsocketEventSidebarCategoryDeleted = "sidebar_category_deleted"
|
||||
WebsocketEventSidebarCategoryOrderUpdated = "sidebar_category_order_updated"
|
||||
WebsocketWarnMetricStatusReceived = "warn_metric_status_received"
|
||||
WebsocketWarnMetricStatusRemoved = "warn_metric_status_removed"
|
||||
WebsocketEventCloudPaymentStatusUpdated = "cloud_payment_status_updated"
|
||||
WebsocketEventThreadUpdated = "thread_updated"
|
||||
WebsocketEventThreadFollowChanged = "thread_follow_changed"
|
||||
WebsocketEventThreadReadChanged = "thread_read_changed"
|
||||
WebsocketFirstAdminVisitMarketplaceStatusReceived = "first_admin_visit_marketplace_status_received"
|
||||
)
|
||||
|
||||
type WebSocketMessage interface {
|
||||
@@ -264,7 +264,7 @@ func NewWebSocketResponse(status string, seqReply int64, data map[string]interfa
|
||||
}
|
||||
|
||||
func NewWebSocketError(seqReply int64, err *AppError) *WebSocketResponse {
|
||||
return &WebSocketResponse{Status: STATUS_FAIL, SeqReply: seqReply, Error: err}
|
||||
return &WebSocketResponse{Status: StatusFail, SeqReply: seqReply, Error: err}
|
||||
}
|
||||
|
||||
func (m *WebSocketResponse) IsValid() bool {
|
||||
@@ -272,7 +272,7 @@ func (m *WebSocketResponse) IsValid() bool {
|
||||
}
|
||||
|
||||
func (m *WebSocketResponse) EventType() string {
|
||||
return WEBSOCKET_EVENT_RESPONSE
|
||||
return WebsocketEventResponse
|
||||
}
|
||||
|
||||
func (m *WebSocketResponse) ToJson() string {
|
||||
|
||||
@@ -105,7 +105,7 @@ func TestWebSocketResponse(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestWebSocketEvent_PrecomputeJSON(t *testing.T) {
|
||||
event := NewWebSocketEvent(WEBSOCKET_EVENT_POSTED, "foo", "bar", "baz", nil)
|
||||
event := NewWebSocketEvent(WebsocketEventPosted, "foo", "bar", "baz", nil)
|
||||
event = event.SetSequence(7)
|
||||
|
||||
before := event.ToJson()
|
||||
@@ -118,7 +118,7 @@ func TestWebSocketEvent_PrecomputeJSON(t *testing.T) {
|
||||
var stringSink string
|
||||
|
||||
func BenchmarkWebSocketEvent_ToJson(b *testing.B) {
|
||||
event := NewWebSocketEvent(WEBSOCKET_EVENT_POSTED, "foo", "bar", "baz", nil)
|
||||
event := NewWebSocketEvent(WebsocketEventPosted, "foo", "bar", "baz", nil)
|
||||
for i := 0; i < 100; i++ {
|
||||
event.GetData()[NewId()] = NewId()
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user