Merge branch 'master' of github.com:mattermost/mattermost-server into MM-47853-true-up-review-telemetry-off-non-air-gapped

Этот коммит содержится в:
Conor Macpherson
2023-01-03 13:54:38 -05:00
родитель e31a6a47b0 c8e70718c2
Коммит 40724ae44d
23 изменённых файлов: 111 добавлений и 131 удалений

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

@@ -8,7 +8,6 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http" "net/http"
"os"
"sort" "sort"
"strings" "strings"
"sync" "sync"
@@ -4584,8 +4583,6 @@ func TestViewChannelWithoutCollapsedThreads(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.ThreadAutoFollow = true
*cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn

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

@@ -124,7 +124,6 @@ func deleteDraft(c *Context, w http.ResponseWriter, r *http.Request) {
switch { switch {
case err.StatusCode == http.StatusNotFound: case err.StatusCode == http.StatusNotFound:
// If the draft doesn't exist in the server, we don't need to delete. // If the draft doesn't exist in the server, we don't need to delete.
mlog.Debug("Unable to find the draft", mlog.Err(err))
ReturnStatusOK(w) ReturnStatusOK(w)
default: default:
c.Err = err c.Err = err

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

@@ -12,7 +12,6 @@ import (
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"net/url" "net/url"
"os"
"reflect" "reflect"
"sort" "sort"
"strings" "strings"
@@ -2954,8 +2953,6 @@ func TestSetChannelUnread(t *testing.T) {
} }
func TestSetPostUnreadWithoutCollapsedThreads(t *testing.T) { func TestSetPostUnreadWithoutCollapsedThreads(t *testing.T) {
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {

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

@@ -2017,9 +2017,15 @@ func loginCWS(c *Context, w http.ResponseWriter, r *http.Request) {
redirectURL := *c.App.Config().ServiceSettings.SiteURL redirectURL := *c.App.Config().ServiceSettings.SiteURL
if campaign != "" { if campaign != "" {
if url, ok := campaignToURL[campaign]; ok { if url, ok := campaignToURL[campaign]; ok {
properties := map[string]any{
"category": "acquisition",
"redirect_to": strings.TrimSuffix(url, "/"),
}
c.App.Srv().GetTelemetryService().SendTelemetry("product_start_redirect", properties)
redirectURL += url redirectURL += url
} }
} }
http.Redirect(w, r, redirectURL, http.StatusFound) http.Redirect(w, r, redirectURL, http.StatusFound)
} }

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

@@ -5794,8 +5794,6 @@ func TestUpdatePassword(t *testing.T) {
func TestGetThreadsForUser(t *testing.T) { func TestGetThreadsForUser(t *testing.T) {
os.Setenv("MM_FEATUREFLAGS_POSTPRIORITY", "true") os.Setenv("MM_FEATUREFLAGS_POSTPRIORITY", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_POSTPRIORITY") defer os.Unsetenv("MM_FEATUREFLAGS_POSTPRIORITY")
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
@@ -6151,8 +6149,6 @@ func TestGetThreadsForUser(t *testing.T) {
func TestThreadSocketEvents(t *testing.T) { func TestThreadSocketEvents(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.ConfigStore.SetReadOnlyFF(false) th.ConfigStore.SetReadOnlyFF(false)
defer th.ConfigStore.SetReadOnlyFF(true) defer th.ConfigStore.SetReadOnlyFF(true)
@@ -6533,8 +6529,6 @@ func TestMaintainUnreadRepliesInThread(t *testing.T) {
defer th.UnlinkUserFromTeam(th.SystemAdminUser, th.BasicTeam) defer th.UnlinkUserFromTeam(th.SystemAdminUser, th.BasicTeam)
th.AddUserToChannel(th.SystemAdminUser, th.BasicChannel) th.AddUserToChannel(th.SystemAdminUser, th.BasicChannel)
defer th.RemoveUserFromChannel(th.SystemAdminUser, th.BasicChannel) defer th.RemoveUserFromChannel(th.SystemAdminUser, th.BasicChannel)
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.ThreadAutoFollow = true
*cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn
@@ -6590,8 +6584,7 @@ func TestMaintainUnreadRepliesInThread(t *testing.T) {
func TestThreadCounts(t *testing.T) { func TestThreadCounts(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.ThreadAutoFollow = true
*cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn
@@ -6633,8 +6626,6 @@ func TestThreadCounts(t *testing.T) {
func TestSingleThreadGet(t *testing.T) { func TestSingleThreadGet(t *testing.T) {
os.Setenv("MM_FEATUREFLAGS_POSTPRIORITY", "true") os.Setenv("MM_FEATUREFLAGS_POSTPRIORITY", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_POSTPRIORITY") defer os.Unsetenv("MM_FEATUREFLAGS_POSTPRIORITY")
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
@@ -6704,8 +6695,7 @@ func TestMaintainUnreadMentionsInThread(t *testing.T) {
th.AddUserToChannel(th.SystemAdminUser, th.BasicChannel) th.AddUserToChannel(th.SystemAdminUser, th.BasicChannel)
defer th.RemoveUserFromChannel(th.SystemAdminUser, th.BasicChannel) defer th.RemoveUserFromChannel(th.SystemAdminUser, th.BasicChannel)
client := th.Client client := th.Client
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.ThreadAutoFollow = true
*cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn
@@ -6768,8 +6758,7 @@ func TestMaintainUnreadMentionsInThread(t *testing.T) {
func TestReadThreads(t *testing.T) { func TestReadThreads(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.ThreadAutoFollow = true
*cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn
@@ -6872,8 +6861,7 @@ func TestReadThreads(t *testing.T) {
func TestMarkThreadUnreadMentionCount(t *testing.T) { func TestMarkThreadUnreadMentionCount(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.ThreadAutoFollow = true
*cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn

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

@@ -8,7 +8,6 @@ import (
"errors" "errors"
"fmt" "fmt"
"net/http" "net/http"
"os"
"sort" "sort"
"strings" "strings"
"sync" "sync"
@@ -2127,8 +2126,7 @@ func TestViewChannelCollapsedThreadsTurnedOff(t *testing.T) {
th.AddUserToChannel(u2, c1) th.AddUserToChannel(u2, c1)
// Enable CRT // Enable CRT
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.ThreadAutoFollow = true
*cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn
@@ -2198,8 +2196,6 @@ func TestViewChannelCollapsedThreadsTurnedOff(t *testing.T) {
func TestMarkChannelAsUnreadFromPostCollapsedThreadsTurnedOff(t *testing.T) { func TestMarkChannelAsUnreadFromPostCollapsedThreadsTurnedOff(t *testing.T) {
// Enable CRT // Enable CRT
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
@@ -2286,8 +2282,7 @@ func TestMarkChannelAsUnreadFromPostCollapsedThreadsTurnedOff(t *testing.T) {
} }
func TestMarkUnreadCRTOffUpdatesThreads(t *testing.T) { func TestMarkUnreadCRTOffUpdatesThreads(t *testing.T) {
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {

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

@@ -46,7 +46,7 @@ func (s *Server) doAdvancedPermissionsMigration() {
// If this failed for reasons other than the role already existing, don't mark the migration as done. // If this failed for reasons other than the role already existing, don't mark the migration as done.
fetchedRole, err := s.Store().Role().GetByName(context.Background(), role.Name) fetchedRole, err := s.Store().Role().GetByName(context.Background(), role.Name)
if err != nil { if err != nil {
mlog.Critical("Failed to migrate role to database.", mlog.Err(err)) mlog.Fatal("Failed to migrate role to database.", mlog.Err(err))
allSucceeded = false allSucceeded = false
continue continue
} }
@@ -59,7 +59,7 @@ func (s *Server) doAdvancedPermissionsMigration() {
role.Id = fetchedRole.Id role.Id = fetchedRole.Id
if _, err = s.Store().Role().Save(role); err != nil { if _, err = s.Store().Role().Save(role); err != nil {
// Role is not the same, but failed to update. // Role is not the same, but failed to update.
mlog.Critical("Failed to migrate role to database.", mlog.Err(err)) mlog.Fatal("Failed to migrate role to database.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} }
} }
@@ -81,7 +81,7 @@ func (s *Server) doAdvancedPermissionsMigration() {
} }
if err := s.Store().System().Save(&system); err != nil { if err := s.Store().System().Save(&system); err != nil {
mlog.Critical("Failed to mark advanced permissions migration as completed.", mlog.Err(err)) mlog.Fatal("Failed to mark advanced permissions migration as completed.", mlog.Err(err))
} }
} }
@@ -114,21 +114,21 @@ func (s *Server) doEmojisPermissionsMigration() {
// Emoji creation is set to all by default // Emoji creation is set to all by default
role, err = s.GetRoleByName(context.Background(), model.SystemUserRoleId) role, err = s.GetRoleByName(context.Background(), model.SystemUserRoleId)
if err != nil { if err != nil {
mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.", mlog.Err(err)) mlog.Fatal("Failed to migrate emojis creation permissions from mattermost config.", mlog.Err(err))
return return
} }
if role != nil { if role != nil {
role.Permissions = append(role.Permissions, model.PermissionCreateEmojis.Id, model.PermissionDeleteEmojis.Id) role.Permissions = append(role.Permissions, model.PermissionCreateEmojis.Id, model.PermissionDeleteEmojis.Id)
if _, nErr := s.Store().Role().Save(role); nErr != nil { if _, nErr := s.Store().Role().Save(role); nErr != nil {
mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.", mlog.Err(nErr)) mlog.Fatal("Failed to migrate emojis creation permissions from mattermost config.", mlog.Err(nErr))
return return
} }
} }
systemAdminRole, err = s.GetRoleByName(context.Background(), model.SystemAdminRoleId) systemAdminRole, err = s.GetRoleByName(context.Background(), model.SystemAdminRoleId)
if err != nil { if err != nil {
mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.", mlog.Err(err)) mlog.Fatal("Failed to migrate emojis creation permissions from mattermost config.", mlog.Err(err))
return return
} }
@@ -138,7 +138,7 @@ func (s *Server) doEmojisPermissionsMigration() {
model.PermissionDeleteOthersEmojis.Id, model.PermissionDeleteOthersEmojis.Id,
) )
if _, err := s.Store().Role().Save(systemAdminRole); err != nil { if _, err := s.Store().Role().Save(systemAdminRole); err != nil {
mlog.Critical("Failed to migrate emojis creation permissions from mattermost config.", mlog.Err(err)) mlog.Fatal("Failed to migrate emojis creation permissions from mattermost config.", mlog.Err(err))
return return
} }
@@ -148,7 +148,7 @@ func (s *Server) doEmojisPermissionsMigration() {
} }
if err := s.Store().System().Save(&system); err != nil { if err := s.Store().System().Save(&system); err != nil {
mlog.Critical("Failed to mark emojis permissions migration as completed.", mlog.Err(err)) mlog.Fatal("Failed to mark emojis permissions migration as completed.", mlog.Err(err))
} }
} }
@@ -167,26 +167,26 @@ func (s *Server) doGuestRolesCreationMigration() {
allSucceeded := true allSucceeded := true
if _, err := s.Store().Role().GetByName(context.Background(), model.ChannelGuestRoleId); err != nil { if _, err := s.Store().Role().GetByName(context.Background(), model.ChannelGuestRoleId); err != nil {
if _, err := s.Store().Role().Save(roles[model.ChannelGuestRoleId]); err != nil { if _, err := s.Store().Role().Save(roles[model.ChannelGuestRoleId]); err != nil {
mlog.Critical("Failed to create new guest role to database.", mlog.Err(err)) mlog.Fatal("Failed to create new guest role to database.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} }
} }
if _, err := s.Store().Role().GetByName(context.Background(), model.TeamGuestRoleId); err != nil { if _, err := s.Store().Role().GetByName(context.Background(), model.TeamGuestRoleId); err != nil {
if _, err := s.Store().Role().Save(roles[model.TeamGuestRoleId]); err != nil { if _, err := s.Store().Role().Save(roles[model.TeamGuestRoleId]); err != nil {
mlog.Critical("Failed to create new guest role to database.", mlog.Err(err)) mlog.Fatal("Failed to create new guest role to database.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} }
} }
if _, err := s.Store().Role().GetByName(context.Background(), model.SystemGuestRoleId); err != nil { if _, err := s.Store().Role().GetByName(context.Background(), model.SystemGuestRoleId); err != nil {
if _, err := s.Store().Role().Save(roles[model.SystemGuestRoleId]); err != nil { if _, err := s.Store().Role().Save(roles[model.SystemGuestRoleId]); err != nil {
mlog.Critical("Failed to create new guest role to database.", mlog.Err(err)) mlog.Fatal("Failed to create new guest role to database.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} }
} }
schemes, err := s.Store().Scheme().GetAllPage("", 0, 1000000) schemes, err := s.Store().Scheme().GetAllPage("", 0, 1000000)
if err != nil { if err != nil {
mlog.Critical("Failed to get all schemes.", mlog.Err(err)) mlog.Fatal("Failed to get all schemes.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} }
for _, scheme := range schemes { for _, scheme := range schemes {
@@ -201,7 +201,7 @@ func (s *Server) doGuestRolesCreationMigration() {
} }
if savedRole, err := s.Store().Role().Save(teamGuestRole); err != nil { if savedRole, err := s.Store().Role().Save(teamGuestRole); err != nil {
mlog.Critical("Failed to create new guest role for custom scheme.", mlog.Err(err)) mlog.Fatal("Failed to create new guest role for custom scheme.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} else { } else {
scheme.DefaultTeamGuestRole = savedRole.Name scheme.DefaultTeamGuestRole = savedRole.Name
@@ -217,7 +217,7 @@ func (s *Server) doGuestRolesCreationMigration() {
} }
if savedRole, err := s.Store().Role().Save(channelGuestRole); err != nil { if savedRole, err := s.Store().Role().Save(channelGuestRole); err != nil {
mlog.Critical("Failed to create new guest role for custom scheme.", mlog.Err(err)) mlog.Fatal("Failed to create new guest role for custom scheme.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} else { } else {
scheme.DefaultChannelGuestRole = savedRole.Name scheme.DefaultChannelGuestRole = savedRole.Name
@@ -225,7 +225,7 @@ func (s *Server) doGuestRolesCreationMigration() {
_, err := s.Store().Scheme().Save(scheme) _, err := s.Store().Scheme().Save(scheme)
if err != nil { if err != nil {
mlog.Critical("Failed to update custom scheme.", mlog.Err(err)) mlog.Fatal("Failed to update custom scheme.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} }
} }
@@ -241,7 +241,7 @@ func (s *Server) doGuestRolesCreationMigration() {
} }
if err := s.Store().System().Save(&system); err != nil { if err := s.Store().System().Save(&system); err != nil {
mlog.Critical("Failed to mark guest roles creation migration as completed.", mlog.Err(err)) mlog.Fatal("Failed to mark guest roles creation migration as completed.", mlog.Err(err))
} }
} }
@@ -260,19 +260,19 @@ func (s *Server) doSystemConsoleRolesCreationMigration() {
allSucceeded := true allSucceeded := true
if _, err := s.Store().Role().GetByName(context.Background(), model.SystemManagerRoleId); err != nil { if _, err := s.Store().Role().GetByName(context.Background(), model.SystemManagerRoleId); err != nil {
if _, err := s.Store().Role().Save(roles[model.SystemManagerRoleId]); err != nil { if _, err := s.Store().Role().Save(roles[model.SystemManagerRoleId]); err != nil {
mlog.Critical("Failed to create new role.", mlog.Err(err), mlog.String("role", model.SystemManagerRoleId)) mlog.Fatal("Failed to create new role.", mlog.Err(err), mlog.String("role", model.SystemManagerRoleId))
allSucceeded = false allSucceeded = false
} }
} }
if _, err := s.Store().Role().GetByName(context.Background(), model.SystemReadOnlyAdminRoleId); err != nil { if _, err := s.Store().Role().GetByName(context.Background(), model.SystemReadOnlyAdminRoleId); err != nil {
if _, err := s.Store().Role().Save(roles[model.SystemReadOnlyAdminRoleId]); err != nil { if _, err := s.Store().Role().Save(roles[model.SystemReadOnlyAdminRoleId]); err != nil {
mlog.Critical("Failed to create new role.", mlog.Err(err), mlog.String("role", model.SystemReadOnlyAdminRoleId)) mlog.Fatal("Failed to create new role.", mlog.Err(err), mlog.String("role", model.SystemReadOnlyAdminRoleId))
allSucceeded = false allSucceeded = false
} }
} }
if _, err := s.Store().Role().GetByName(context.Background(), model.SystemUserManagerRoleId); err != nil { if _, err := s.Store().Role().GetByName(context.Background(), model.SystemUserManagerRoleId); err != nil {
if _, err := s.Store().Role().Save(roles[model.SystemUserManagerRoleId]); err != nil { if _, err := s.Store().Role().Save(roles[model.SystemUserManagerRoleId]); err != nil {
mlog.Critical("Failed to create new role.", mlog.Err(err), mlog.String("role", model.SystemUserManagerRoleId)) mlog.Fatal("Failed to create new role.", mlog.Err(err), mlog.String("role", model.SystemUserManagerRoleId))
allSucceeded = false allSucceeded = false
} }
} }
@@ -287,7 +287,7 @@ func (s *Server) doSystemConsoleRolesCreationMigration() {
} }
if err := s.Store().System().Save(&system); err != nil { if err := s.Store().System().Save(&system); err != nil {
mlog.Critical("Failed to mark system console roles creation migration as completed.", mlog.Err(err)) mlog.Fatal("Failed to mark system console roles creation migration as completed.", mlog.Err(err))
} }
} }
@@ -302,7 +302,7 @@ func (s *Server) doCustomGroupAdminRoleCreationMigration() {
allSucceeded := true allSucceeded := true
if _, err := s.Store().Role().GetByName(context.Background(), model.SystemCustomGroupAdminRoleId); err != nil { if _, err := s.Store().Role().GetByName(context.Background(), model.SystemCustomGroupAdminRoleId); err != nil {
if _, err := s.Store().Role().Save(roles[model.SystemCustomGroupAdminRoleId]); err != nil { if _, err := s.Store().Role().Save(roles[model.SystemCustomGroupAdminRoleId]); err != nil {
mlog.Critical("Failed to create new role.", mlog.Err(err), mlog.String("role", model.SystemCustomGroupAdminRoleId)) mlog.Fatal("Failed to create new role.", mlog.Err(err), mlog.String("role", model.SystemCustomGroupAdminRoleId))
allSucceeded = false allSucceeded = false
} }
} }
@@ -317,7 +317,7 @@ func (s *Server) doCustomGroupAdminRoleCreationMigration() {
} }
if err := s.Store().System().Save(&system); err != nil { if err := s.Store().System().Save(&system); err != nil {
mlog.Critical("Failed to mark custom group admin role creation migration as completed.", mlog.Err(err)) mlog.Fatal("Failed to mark custom group admin role creation migration as completed.", mlog.Err(err))
} }
} }
@@ -337,7 +337,7 @@ func (s *Server) doContentExtractionConfigDefaultTrueMigration() {
} }
if err := s.Store().System().Save(&system); err != nil { if err := s.Store().System().Save(&system); err != nil {
mlog.Critical("Failed to mark content extraction config migration as completed.", mlog.Err(err)) mlog.Fatal("Failed to mark content extraction config migration as completed.", mlog.Err(err))
} }
} }
@@ -352,31 +352,31 @@ func (s *Server) doPlaybooksRolesCreationMigration() {
allSucceeded := true allSucceeded := true
if _, err := s.Store().Role().GetByName(context.Background(), model.PlaybookAdminRoleId); err != nil { if _, err := s.Store().Role().GetByName(context.Background(), model.PlaybookAdminRoleId); err != nil {
if _, err := s.Store().Role().Save(roles[model.PlaybookAdminRoleId]); err != nil { if _, err := s.Store().Role().Save(roles[model.PlaybookAdminRoleId]); err != nil {
mlog.Critical("Failed to create new playbook admin role to database.", mlog.Err(err)) mlog.Fatal("Failed to create new playbook admin role to database.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} }
} }
if _, err := s.Store().Role().GetByName(context.Background(), model.PlaybookMemberRoleId); err != nil { if _, err := s.Store().Role().GetByName(context.Background(), model.PlaybookMemberRoleId); err != nil {
if _, err := s.Store().Role().Save(roles[model.PlaybookMemberRoleId]); err != nil { if _, err := s.Store().Role().Save(roles[model.PlaybookMemberRoleId]); err != nil {
mlog.Critical("Failed to create new playbook member role to database.", mlog.Err(err)) mlog.Fatal("Failed to create new playbook member role to database.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} }
} }
if _, err := s.Store().Role().GetByName(context.Background(), model.RunAdminRoleId); err != nil { if _, err := s.Store().Role().GetByName(context.Background(), model.RunAdminRoleId); err != nil {
if _, err := s.Store().Role().Save(roles[model.RunAdminRoleId]); err != nil { if _, err := s.Store().Role().Save(roles[model.RunAdminRoleId]); err != nil {
mlog.Critical("Failed to create new run admin role to database.", mlog.Err(err)) mlog.Fatal("Failed to create new run admin role to database.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} }
} }
if _, err := s.Store().Role().GetByName(context.Background(), model.RunMemberRoleId); err != nil { if _, err := s.Store().Role().GetByName(context.Background(), model.RunMemberRoleId); err != nil {
if _, err := s.Store().Role().Save(roles[model.RunMemberRoleId]); err != nil { if _, err := s.Store().Role().Save(roles[model.RunMemberRoleId]); err != nil {
mlog.Critical("Failed to create new run member role to database.", mlog.Err(err)) mlog.Fatal("Failed to create new run member role to database.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} }
} }
schemes, err := s.Store().Scheme().GetAllPage(model.SchemeScopeTeam, 0, 1000000) schemes, err := s.Store().Scheme().GetAllPage(model.SchemeScopeTeam, 0, 1000000)
if err != nil { if err != nil {
mlog.Critical("Failed to get all schemes.", mlog.Err(err)) mlog.Fatal("Failed to get all schemes.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} }
@@ -391,7 +391,7 @@ func (s *Server) doPlaybooksRolesCreationMigration() {
} }
if savedRole, err := s.Store().Role().Save(playbookAdminRole); err != nil { if savedRole, err := s.Store().Role().Save(playbookAdminRole); err != nil {
mlog.Critical("Failed to create new playbook admin role for existing custom scheme.", mlog.Err(err)) mlog.Fatal("Failed to create new playbook admin role for existing custom scheme.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} else { } else {
scheme.DefaultPlaybookAdminRole = savedRole.Name scheme.DefaultPlaybookAdminRole = savedRole.Name
@@ -406,7 +406,7 @@ func (s *Server) doPlaybooksRolesCreationMigration() {
} }
if savedRole, err := s.Store().Role().Save(playbookMember); err != nil { if savedRole, err := s.Store().Role().Save(playbookMember); err != nil {
mlog.Critical("Failed to create new playbook member role for existing custom scheme.", mlog.Err(err)) mlog.Fatal("Failed to create new playbook member role for existing custom scheme.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} else { } else {
scheme.DefaultPlaybookMemberRole = savedRole.Name scheme.DefaultPlaybookMemberRole = savedRole.Name
@@ -422,7 +422,7 @@ func (s *Server) doPlaybooksRolesCreationMigration() {
} }
if savedRole, err := s.Store().Role().Save(runAdminRole); err != nil { if savedRole, err := s.Store().Role().Save(runAdminRole); err != nil {
mlog.Critical("Failed to create new run admin role for existing custom scheme.", mlog.Err(err)) mlog.Fatal("Failed to create new run admin role for existing custom scheme.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} else { } else {
scheme.DefaultRunAdminRole = savedRole.Name scheme.DefaultRunAdminRole = savedRole.Name
@@ -438,7 +438,7 @@ func (s *Server) doPlaybooksRolesCreationMigration() {
} }
if savedRole, err := s.Store().Role().Save(runMemberRole); err != nil { if savedRole, err := s.Store().Role().Save(runMemberRole); err != nil {
mlog.Critical("Failed to create new run member role for existing custom scheme.", mlog.Err(err)) mlog.Fatal("Failed to create new run member role for existing custom scheme.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} else { } else {
scheme.DefaultRunMemberRole = savedRole.Name scheme.DefaultRunMemberRole = savedRole.Name
@@ -446,7 +446,7 @@ func (s *Server) doPlaybooksRolesCreationMigration() {
} }
_, err := s.Store().Scheme().Save(scheme) _, err := s.Store().Scheme().Save(scheme)
if err != nil { if err != nil {
mlog.Critical("Failed to update custom scheme.", mlog.Err(err)) mlog.Fatal("Failed to update custom scheme.", mlog.Err(err))
allSucceeded = false allSucceeded = false
} }
} }
@@ -462,7 +462,7 @@ func (s *Server) doPlaybooksRolesCreationMigration() {
} }
if err := s.Store().System().Save(&system); err != nil { if err := s.Store().System().Save(&system); err != nil {
mlog.Critical("Failed to mark playbook roles creation migration as completed.", mlog.Err(err)) mlog.Fatal("Failed to mark playbook roles creation migration as completed.", mlog.Err(err))
} }
} }
@@ -507,7 +507,7 @@ func (s *Server) doFirstAdminSetupCompleteMigration() {
} }
if err := s.Store().System().Save(&system); err != nil { if err := s.Store().System().Save(&system); err != nil {
mlog.Critical("Failed to mark first admin setup migration as completed.", mlog.Err(err)) mlog.Fatal("Failed to mark first admin setup migration as completed.", mlog.Err(err))
} }
} }
@@ -534,7 +534,7 @@ func (s *Server) doRemainingSchemaMigrations() {
} }
if err := s.Store().System().Save(&system); err != nil { if err := s.Store().System().Save(&system); err != nil {
mlog.Critical("Failed to mark the remaining schema migrations as completed.", mlog.Err(err)) mlog.Fatal("Failed to mark the remaining schema migrations as completed.", mlog.Err(err))
} }
} }
@@ -552,7 +552,7 @@ func (s *Server) doAppMigrations() {
// migrations. For example, it needs the guest roles migration. // migrations. For example, it needs the guest roles migration.
err := s.doPermissionsMigrations() err := s.doPermissionsMigrations()
if err != nil { if err != nil {
mlog.Critical("(app.App).DoPermissionsMigrations failed", mlog.Err(err)) mlog.Fatal("(app.App).DoPermissionsMigrations failed", mlog.Err(err))
} }
s.doContentExtractionConfigDefaultTrueMigration() s.doContentExtractionConfigDefaultTrueMigration()
s.doPlaybooksRolesCreationMigration() s.doPlaybooksRolesCreationMigration()

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

@@ -43,7 +43,7 @@ func (a *App) SendNotifications(c request.CTX, post *model.Post, team *model.Tea
return []string{}, nil return []string{}, nil
} }
isCRTAllowed := a.Config().FeatureFlags.CollapsedThreads && *a.Config().ServiceSettings.CollapsedThreads != model.CollapsedThreadsDisabled isCRTAllowed := *a.Config().ServiceSettings.CollapsedThreads != model.CollapsedThreadsDisabled
pchan := make(chan store.StoreResult, 1) pchan := make(chan store.StoreResult, 1)
go func() { go func() {

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

@@ -5,7 +5,6 @@ package app
import ( import (
"fmt" "fmt"
"os"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@@ -2734,8 +2733,7 @@ func TestReplyPostNotificationsWithCRT(t *testing.T) {
}() }()
// Enable CRT // Enable CRT
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.ThreadAutoFollow = true
*cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn *cfg.ServiceSettings.CollapsedThreads = model.CollapsedThreadsDefaultOn

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

@@ -111,7 +111,7 @@ func (pm *platformMetrics) startMetricsServer() error {
go func() { go func() {
close(notify) close(notify)
if err := pm.server.Serve(l); err != nil && err != http.ErrServerClosed { if err := pm.server.Serve(l); err != nil && err != http.ErrServerClosed {
pm.logger.Critical(err.Error()) pm.logger.Fatal(err.Error())
} }
}() }()

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

@@ -402,6 +402,8 @@ func (ch *Channels) installExtractedPlugin(manifest *model.Manifest, fromPluginD
manifest = updatedManifest manifest = updatedManifest
} }
mlog.Debug("Installing plugin", mlog.String("plugin_id", manifest.Id), mlog.String("version", manifest.Version))
return manifest, nil return manifest, nil
} }

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

@@ -2357,8 +2357,6 @@ func TestThreadMembership(t *testing.T) {
func TestFollowThreadSkipsParticipants(t *testing.T) { func TestFollowThreadSkipsParticipants(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.ThreadAutoFollow = true
@@ -2410,13 +2408,16 @@ func TestFollowThreadSkipsParticipants(t *testing.T) {
for _, p := range thread.Participants { for _, p := range thread.Participants {
require.True(t, p.Id == sysadmin.Id || p.Id == user.Id) require.True(t, p.Id == sysadmin.Id || p.Id == user.Id)
} }
threadMembership.PostId = "notfound"
_, err = th.App.GetThreadForUser(threadMembership, false)
require.NotNil(t, err)
assert.Equal(t, http.StatusNotFound, err.StatusCode)
} }
func TestAutofollowBasedOnRootPost(t *testing.T) { func TestAutofollowBasedOnRootPost(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.ThreadAutoFollow = true
@@ -2445,8 +2446,6 @@ func TestAutofollowBasedOnRootPost(t *testing.T) {
func TestViewChannelShouldNotUpdateThreads(t *testing.T) { func TestViewChannelShouldNotUpdateThreads(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.ThreadAutoFollow = true
@@ -2528,12 +2527,6 @@ func TestCollapsedThreadFetch(t *testing.T) {
}) })
t.Run("Should not panic on unexpected db error", func(t *testing.T) { t.Run("Should not panic on unexpected db error", func(t *testing.T) {
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.App.UpdateConfig(func(cfg *model.Config) {
cfg.FeatureFlags.CollapsedThreads = true
})
channel := th.CreateChannel(th.Context, th.BasicTeam) channel := th.CreateChannel(th.Context, th.BasicTeam)
th.AddUserToChannel(user2, channel) th.AddUserToChannel(user2, channel)
defer th.App.DeleteChannel(th.Context, channel, user1.Id) defer th.App.DeleteChannel(th.Context, channel, user1.Id)
@@ -2765,8 +2758,6 @@ func TestSharedChannelSyncForPostActions(t *testing.T) {
func TestAutofollowOnPostingAfterUnfollow(t *testing.T) { func TestAutofollowOnPostingAfterUnfollow(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.ThreadAutoFollow = true
@@ -2834,8 +2825,6 @@ func TestGetPostIfAuthorized(t *testing.T) {
func TestShouldNotRefollowOnOthersReply(t *testing.T) { func TestShouldNotRefollowOnOthersReply(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
th.App.UpdateConfig(func(cfg *model.Config) { th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.ThreadAutoFollow = true

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

@@ -1060,7 +1060,7 @@ func (s *Server) Start() error {
} }
if err != nil && err != http.ErrServerClosed { if err != nil && err != http.ErrServerClosed {
mlog.Critical("Error starting server", mlog.Err(err)) mlog.Fatal("Error starting server", mlog.Err(err))
time.Sleep(time.Second) time.Sleep(time.Second)
} }
@@ -1069,7 +1069,7 @@ func (s *Server) Start() error {
if *s.platform.Config().ServiceSettings.EnableLocalMode { if *s.platform.Config().ServiceSettings.EnableLocalMode {
if err := s.startLocalModeServer(); err != nil { if err := s.startLocalModeServer(); err != nil {
mlog.Critical(err.Error()) mlog.Fatal(err.Error())
} }
} }
@@ -1101,7 +1101,7 @@ func (s *Server) startLocalModeServer() error {
go func() { go func() {
err = s.localModeServer.Serve(unixListener) err = s.localModeServer.Serve(unixListener)
if err != nil && err != http.ErrServerClosed { if err != nil && err != http.ErrServerClosed {
mlog.Critical("Error starting unix socket server", mlog.Err(err)) mlog.Fatal("Error starting unix socket server", mlog.Err(err))
} }
}() }()
return nil return nil

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

@@ -2484,24 +2484,31 @@ func (a *App) GetThreadsForUser(userID, teamID string, options model.GetUserThre
} }
func (a *App) GetThreadMembershipForUser(userId, threadId string) (*model.ThreadMembership, *model.AppError) { func (a *App) GetThreadMembershipForUser(userId, threadId string) (*model.ThreadMembership, *model.AppError) {
threadMembership, err := a.Srv().Store().Thread().GetMembershipForUser(userId, threadId) threadMembership, nErr := a.Srv().Store().Thread().GetMembershipForUser(userId, threadId)
if err != nil { if nErr != nil {
return nil, model.NewAppError("GetThreadMembershipForUser", "app.user.get_thread_membership_for_user.app_error", nil, "", http.StatusInternalServerError).Wrap(err) var nfErr *store.ErrNotFound
} switch {
if threadMembership == nil { case errors.As(nErr, &nfErr):
return nil, model.NewAppError("GetThreadMembershipForUser", "app.user.get_thread_membership_for_user.not_found", nil, "thread membership not found/followed", http.StatusNotFound) return nil, model.NewAppError("GetThreadMembershipForUser", "app.user.get_thread_membership_for_user.not_found", nil, "", http.StatusNotFound).Wrap(nErr)
default:
return nil, model.NewAppError("GetThreadMembershipForUser", "app.user.get_thread_membership_for_user.app_error", nil, "", http.StatusInternalServerError).Wrap(nErr)
}
} }
return threadMembership, nil return threadMembership, nil
} }
func (a *App) GetThreadForUser(threadMembership *model.ThreadMembership, extended bool) (*model.ThreadResponse, *model.AppError) { func (a *App) GetThreadForUser(threadMembership *model.ThreadMembership, extended bool) (*model.ThreadResponse, *model.AppError) {
thread, err := a.Srv().Store().Thread().GetThreadForUser(threadMembership, extended, a.isPostPriorityEnabled()) thread, nErr := a.Srv().Store().Thread().GetThreadForUser(threadMembership, extended, a.isPostPriorityEnabled())
if err != nil { if nErr != nil {
return nil, model.NewAppError("GetThreadForUser", "app.user.get_threads_for_user.app_error", nil, "", http.StatusInternalServerError).Wrap(err) var nfErr *store.ErrNotFound
} switch {
if thread == nil { case errors.As(nErr, &nfErr):
return nil, model.NewAppError("GetThreadForUser", "app.user.get_threads_for_user.not_found", nil, "thread not found/followed", http.StatusNotFound) return nil, model.NewAppError("GetThreadForUser", "app.user.get_threads_for_user.not_found", nil, "thread not found/followed", http.StatusNotFound)
default:
return nil, model.NewAppError("GetThreadForUser", "app.user.get_threads_for_user.app_error", nil, "", http.StatusInternalServerError).Wrap(nErr)
}
} }
a.sanitizeProfiles(thread.Participants, false) a.sanitizeProfiles(thread.Participants, false)
thread.Post.SanitizeProps() thread.Post.SanitizeProps()
return thread, nil return thread, nil

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

@@ -8,7 +8,7 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"errors" "errors"
"os" "net/http"
"path/filepath" "path/filepath"
"strings" "strings"
"testing" "testing"
@@ -1673,8 +1673,6 @@ func TestPatchUser(t *testing.T) {
} }
func TestUpdateThreadReadForUser(t *testing.T) { func TestUpdateThreadReadForUser(t *testing.T) {
os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
t.Run("Ensure thread membership is created and followed", func(t *testing.T) { t.Run("Ensure thread membership is created and followed", func(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
@@ -1703,6 +1701,10 @@ func TestUpdateThreadReadForUser(t *testing.T) {
require.Nil(t, appErr) require.Nil(t, appErr)
require.NotNil(t, threadMembership) require.NotNil(t, threadMembership)
assert.True(t, threadMembership.Following) assert.True(t, threadMembership.Following)
_, appErr = th.App.GetThreadMembershipForUser(th.BasicUser.Id, "notfound")
require.NotNil(t, appErr)
assert.Equal(t, http.StatusNotFound, appErr.StatusCode)
}) })
t.Run("Ensure no panic on error", func(t *testing.T) { t.Run("Ensure no panic on error", func(t *testing.T) {

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

@@ -16,9 +16,6 @@ type FeatureFlags struct {
// all other values as false. // all other values as false.
TestBoolFeature bool TestBoolFeature bool
// Toggle on and off support for Collapsed Threads
CollapsedThreads bool
// Enable the remote cluster service for shared channels. // Enable the remote cluster service for shared channels.
EnableRemoteClusterService bool EnableRemoteClusterService bool
@@ -81,7 +78,6 @@ type FeatureFlags struct {
func (f *FeatureFlags) SetDefaults() { func (f *FeatureFlags) SetDefaults() {
f.TestFeature = "off" f.TestFeature = "off"
f.TestBoolFeature = false f.TestBoolFeature = false
f.CollapsedThreads = true
f.EnableRemoteClusterService = false f.EnableRemoteClusterService = false
f.AppsEnabled = true f.AppsEnabled = true
f.PluginApps = "" f.PluginApps = ""

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

@@ -10,6 +10,8 @@ type BootstrapSelfHostedSignupRequest struct {
type BootstrapSelfHostedSignupResponse struct { type BootstrapSelfHostedSignupResponse struct {
Progress string `json:"progress"` Progress string `json:"progress"`
// email listed on the JWT claim
Email string `json:"email"`
} }
type BootstrapSelfHostedSignupResponseInternal struct { type BootstrapSelfHostedSignupResponseInternal struct {

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

@@ -256,11 +256,15 @@ func (er *AppError) Error() string {
// render the error information // render the error information
sb.WriteString(er.Where) sb.WriteString(er.Where)
sb.WriteString(": ") sb.WriteString(": ")
sb.WriteString(er.Message) if er.Message != NoTranslation {
sb.WriteString(er.Message)
}
// only render the detailed error when it's present // only render the detailed error when it's present
if er.DetailedError != "" { if er.DetailedError != "" {
sb.WriteString(", ") if er.Message != NoTranslation {
sb.WriteString(", ")
}
sb.WriteString(er.DetailedError) sb.WriteString(er.DetailedError)
} }

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

@@ -81,6 +81,11 @@ func TestAppError(t *testing.T) {
t.Log(appErr.Error()) t.Log(appErr.Error())
} }
func TestAppErrorNoTranslation(t *testing.T) {
appErr := NewAppError("TestAppError", NoTranslation, nil, "test error", http.StatusBadRequest)
require.Equal(t, "TestAppError: test error", appErr.Error())
}
func TestAppErrorJunk(t *testing.T) { func TestAppErrorJunk(t *testing.T) {
rerr := AppErrorFromJSON(strings.NewReader("<html><body>This is a broken test</body></html>")) rerr := AppErrorFromJSON(strings.NewReader("<html><body>This is a broken test</body></html>"))
require.Equal(t, "body: <html><body>This is a broken test</body></html>", rerr.DetailedError) require.Equal(t, "body: <html><body>This is a broken test</body></html>", rerr.DetailedError)

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

@@ -330,6 +330,8 @@ func (env *Environment) Activate(id string) (manifest *model.Manifest, activated
return nil, false, fmt.Errorf("unable to start plugin: must at least have a web app or server component") return nil, false, fmt.Errorf("unable to start plugin: must at least have a web app or server component")
} }
mlog.Debug("Plugin activated", mlog.String("plugin_id", pluginInfo.Manifest.Id), mlog.String("version", pluginInfo.Manifest.Version))
return pluginInfo.Manifest, true, nil return pluginInfo.Manifest, true, nil
} }

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

@@ -333,7 +333,7 @@ func extractBinary(executablePath string, filename string) error {
if err != nil { if err != nil {
err2 := os.Rename(tmpFileName, executablePath) err2 := os.Rename(tmpFileName, executablePath)
if err2 != nil { if err2 != nil {
mlog.Critical("Unable to restore the backup of the executable file. Restore the executable file manually.") mlog.Fatal("Unable to restore the backup of the executable file. Restore the executable file manually.")
return errors.Wrap(err2, "critical error: unable to upgrade the binary or restore the old binary version. Please restore it manually") return errors.Wrap(err2, "critical error: unable to upgrade the binary or restore the old binary version. Please restore it manually")
} }
return err return err
@@ -342,13 +342,13 @@ func extractBinary(executablePath string, filename string) error {
if _, err = io.Copy(outFile, tarReader); err != nil { if _, err = io.Copy(outFile, tarReader); err != nil {
err2 := os.Remove(executablePath) err2 := os.Remove(executablePath)
if err2 != nil { if err2 != nil {
mlog.Critical("Unable to restore the backup of the executable file. Restore the executable file manually.") mlog.Fatal("Unable to restore the backup of the executable file. Restore the executable file manually.")
return errors.Wrap(err2, "critical error: unable to upgrade the binary or restore the old binary version. Please restore it manually") return errors.Wrap(err2, "critical error: unable to upgrade the binary or restore the old binary version. Please restore it manually")
} }
err2 = os.Rename(tmpFileName, executablePath) err2 = os.Rename(tmpFileName, executablePath)
if err2 != nil { if err2 != nil {
mlog.Critical("Unable to restore the backup of the executable file. Restore the executable file manually.") mlog.Fatal("Unable to restore the backup of the executable file. Restore the executable file manually.")
return errors.Wrap(err2, "critical error: unable to upgrade the binary or restore the old binary version. Please restore it manually") return errors.Wrap(err2, "critical error: unable to upgrade the binary or restore the old binary version. Please restore it manually")
} }
return err return err

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

@@ -113,13 +113,10 @@ func Error(msg string, fields ...Field) {
// Convenience method equivalent to calling `Log` with the `Critical` level. // Convenience method equivalent to calling `Log` with the `Critical` level.
// DEPRECATED: Either use Error or Fatal. // DEPRECATED: Either use Error or Fatal.
// Critical level isn't added in mlog/levels.go:StdAll so calling this doesn't
// really work. For now we just call Fatal to atleast print something.
func Critical(msg string, fields ...Field) { func Critical(msg string, fields ...Field) {
logger := getGlobalLogger() Fatal(msg, fields...)
if logger == nil {
defaultLog(LvlCritical, msg, fields...)
return
}
logger.Critical(msg, fields...)
} }
func Fatal(msg string, fields ...Field) { func Fatal(msg string, fields ...Field) {

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

@@ -24,7 +24,6 @@ func TestLoggingBeforeInitialized(t *testing.T) {
mlog.Debug("debug log") mlog.Debug("debug log")
mlog.Warn("warning log") mlog.Warn("warning log")
mlog.Error("error log") mlog.Error("error log")
mlog.Critical("critical log")
}) })
} }
@@ -40,14 +39,13 @@ func TestLoggingAfterInitialized(t *testing.T) {
Type: "file", Type: "file",
Format: "json", Format: "json",
FormatOptions: json.RawMessage(`{"enable_caller":true}`), FormatOptions: json.RawMessage(`{"enable_caller":true}`),
Levels: []mlog.Level{mlog.LvlCritical, mlog.LvlError, mlog.LvlWarn, mlog.LvlInfo, mlog.LvlDebug}, Levels: []mlog.Level{mlog.LvlError, mlog.LvlWarn, mlog.LvlInfo, mlog.LvlDebug},
}, },
[]string{ []string{
`{"timestamp":0,"level":"debug","msg":"real debug log","caller":"mlog/global_test.go:0"}`, `{"timestamp":0,"level":"debug","msg":"real debug log","caller":"mlog/global_test.go:0"}`,
`{"timestamp":0,"level":"info","msg":"real info log","caller":"mlog/global_test.go:0"}`, `{"timestamp":0,"level":"info","msg":"real info log","caller":"mlog/global_test.go:0"}`,
`{"timestamp":0,"level":"warn","msg":"real warning log","caller":"mlog/global_test.go:0"}`, `{"timestamp":0,"level":"warn","msg":"real warning log","caller":"mlog/global_test.go:0"}`,
`{"timestamp":0,"level":"error","msg":"real error log","caller":"mlog/global_test.go:0"}`, `{"timestamp":0,"level":"error","msg":"real error log","caller":"mlog/global_test.go:0"}`,
`{"timestamp":0,"level":"critical","msg":"real critical log","caller":"mlog/global_test.go:0"}`,
}, },
}, },
{ {
@@ -56,11 +54,10 @@ func TestLoggingAfterInitialized(t *testing.T) {
Type: "file", Type: "file",
Format: "json", Format: "json",
FormatOptions: json.RawMessage(`{"enable_caller":true}`), FormatOptions: json.RawMessage(`{"enable_caller":true}`),
Levels: []mlog.Level{mlog.LvlCritical, mlog.LvlError}, Levels: []mlog.Level{mlog.LvlError},
}, },
[]string{ []string{
`{"timestamp":0,"level":"error","msg":"real error log","caller":"mlog/global_test.go:0"}`, `{"timestamp":0,"level":"error","msg":"real error log","caller":"mlog/global_test.go:0"}`,
`{"timestamp":0,"level":"critical","msg":"real critical log","caller":"mlog/global_test.go:0"}`,
}, },
}, },
{ {
@@ -69,14 +66,13 @@ func TestLoggingAfterInitialized(t *testing.T) {
Type: "file", Type: "file",
Format: "plain", Format: "plain",
FormatOptions: json.RawMessage(`{"delim":" | ", "enable_caller":true}`), FormatOptions: json.RawMessage(`{"delim":" | ", "enable_caller":true}`),
Levels: []mlog.Level{mlog.LvlCritical, mlog.LvlError, mlog.LvlWarn, mlog.LvlInfo, mlog.LvlDebug}, Levels: []mlog.Level{mlog.LvlError, mlog.LvlWarn, mlog.LvlInfo, mlog.LvlDebug},
}, },
[]string{ []string{
`debug | TIME | real debug log | caller="mlog/global_test.go:0"`, `debug | TIME | real debug log | caller="mlog/global_test.go:0"`,
`info | TIME | real info log | caller="mlog/global_test.go:0"`, `info | TIME | real info log | caller="mlog/global_test.go:0"`,
`warn | TIME | real warning log | caller="mlog/global_test.go:0"`, `warn | TIME | real warning log | caller="mlog/global_test.go:0"`,
`error | TIME | real error log | caller="mlog/global_test.go:0"`, `error | TIME | real error log | caller="mlog/global_test.go:0"`,
`critical | TIME | real critical log | caller="mlog/global_test.go:0"`,
}, },
}, },
{ {
@@ -85,11 +81,10 @@ func TestLoggingAfterInitialized(t *testing.T) {
Type: "file", Type: "file",
Format: "plain", Format: "plain",
FormatOptions: json.RawMessage(`{"delim":" | ", "enable_caller":true}`), FormatOptions: json.RawMessage(`{"delim":" | ", "enable_caller":true}`),
Levels: []mlog.Level{mlog.LvlCritical, mlog.LvlError}, Levels: []mlog.Level{mlog.LvlError},
}, },
[]string{ []string{
`error | TIME | real error log | caller="mlog/global_test.go:0"`, `error | TIME | real error log | caller="mlog/global_test.go:0"`,
`critical | TIME | real critical log | caller="mlog/global_test.go:0"`,
}, },
}, },
} }
@@ -116,7 +111,6 @@ func TestLoggingAfterInitialized(t *testing.T) {
mlog.Info("real info log") mlog.Info("real info log")
mlog.Warn("real warning log") mlog.Warn("real warning log")
mlog.Error("real error log") mlog.Error("real error log")
mlog.Critical("real critical log")
logger.Shutdown() logger.Shutdown()