Move file backend to its own service (#9435)

* Move file backend to its own service

* Moving utils/inbucket to mailservice package
Этот коммит содержится в:
Jesús Espino
2018-09-20 19:07:03 +02:00
коммит произвёл Christopher Speller
родитель f1be975d7a
Коммит a08df883b4
18 изменённых файлов: 273 добавлений и 43 удалений

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

@@ -287,6 +287,10 @@ store-mocks: ## Creates mock files.
go get -u github.com/vektra/mockery/... go get -u github.com/vektra/mockery/...
$(GOPATH)/bin/mockery -dir store -all -output store/storetest/mocks -note 'Regenerate this file using `make store-mocks`.' $(GOPATH)/bin/mockery -dir store -all -output store/storetest/mocks -note 'Regenerate this file using `make store-mocks`.'
filesstore-mocks: ## Creates mock files.
go get -u github.com/vektra/mockery/...
$(GOPATH)/bin/mockery -dir services/filesstore -all -output services/filesstore/mocks -note 'Regenerate this file using `make filesstore-mocks`.'
ldap-mocks: ## Creates mock files for ldap. ldap-mocks: ## Creates mock files for ldap.
go get -u github.com/vektra/mockery/... go get -u github.com/vektra/mockery/...
$(GOPATH)/bin/mockery -dir enterprise/ldap -all -output enterprise/ldap/mocks -note 'Regenerate this file using `make ldap-mocks`.' $(GOPATH)/bin/mockery -dir enterprise/ldap -all -output enterprise/ldap/mocks -note 'Regenerate this file using `make ldap-mocks`.'

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

@@ -12,7 +12,7 @@ import (
"github.com/mattermost/mattermost-server/mlog" "github.com/mattermost/mattermost-server/mlog"
"github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/utils" "github.com/mattermost/mattermost-server/services/filesstore"
) )
func (api *API) InitSystem() { func (api *API) InitSystem() {
@@ -427,7 +427,7 @@ func testS3(c *Context, w http.ResponseWriter, r *http.Request) {
return return
} }
err := utils.CheckMandatoryS3Fields(&cfg.FileSettings) err := filesstore.CheckMandatoryS3Fields(&cfg.FileSettings)
if err != nil { if err != nil {
c.Err = err c.Err = err
return return
@@ -438,7 +438,7 @@ func testS3(c *Context, w http.ResponseWriter, r *http.Request) {
} }
license := c.App.License() license := c.App.License()
backend, appErr := utils.NewFileBackend(&cfg.FileSettings, license != nil && *license.Features.Compliance) backend, appErr := filesstore.NewFileBackend(&cfg.FileSettings, license != nil && *license.Features.Compliance)
if appErr == nil { if appErr == nil {
appErr = backend.TestConnection() appErr = backend.TestConnection()
} }

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

@@ -15,6 +15,7 @@ import (
"github.com/mattermost/mattermost-server/app" "github.com/mattermost/mattermost-server/app"
"github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/services/mailservice"
"github.com/mattermost/mattermost-server/utils" "github.com/mattermost/mattermost-server/utils"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@@ -1894,8 +1895,8 @@ func TestInviteUsersToTeam(t *testing.T) {
emailList := []string{user1, user2} emailList := []string{user1, user2}
//Delete all the messages before check the sample email //Delete all the messages before check the sample email
utils.DeleteMailBox(user1) mailservice.DeleteMailBox(user1)
utils.DeleteMailBox(user2) mailservice.DeleteMailBox(user2)
enableEmailInvitations := *th.App.Config().ServiceSettings.EnableEmailInvitations enableEmailInvitations := *th.App.Config().ServiceSettings.EnableEmailInvitations
restrictCreationToDomains := th.App.Config().TeamSettings.RestrictCreationToDomains restrictCreationToDomains := th.App.Config().TeamSettings.RestrictCreationToDomains
@@ -1925,10 +1926,10 @@ func TestInviteUsersToTeam(t *testing.T) {
//Check if the email was send to the rigth email address //Check if the email was send to the rigth email address
for _, email := range emailList { for _, email := range emailList {
var resultsMailbox utils.JSONMessageHeaderInbucket var resultsMailbox mailservice.JSONMessageHeaderInbucket
err := utils.RetryInbucket(5, func() error { err := mailservice.RetryInbucket(5, func() error {
var err error var err error
resultsMailbox, err = utils.GetMailBox(email) resultsMailbox, err = mailservice.GetMailBox(email)
return err return err
}) })
if err != nil { if err != nil {
@@ -1939,7 +1940,7 @@ func TestInviteUsersToTeam(t *testing.T) {
if !strings.ContainsAny(resultsMailbox[len(resultsMailbox)-1].To[0], email) { if !strings.ContainsAny(resultsMailbox[len(resultsMailbox)-1].To[0], email) {
t.Fatal("Wrong To recipient") t.Fatal("Wrong To recipient")
} else { } else {
if resultsEmail, err := utils.GetMessageFromMailbox(email, resultsMailbox[len(resultsMailbox)-1].ID); err == nil { if resultsEmail, err := mailservice.GetMessageFromMailbox(email, resultsMailbox[len(resultsMailbox)-1].ID); err == nil {
if resultsEmail.Subject != expectedSubject { if resultsEmail.Subject != expectedSubject {
t.Log(resultsEmail.Subject) t.Log(resultsEmail.Subject)
t.Log(expectedSubject) t.Log(expectedSubject)

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

@@ -1919,7 +1919,7 @@ func TestUpdateUserPassword(t *testing.T) {
Client.Logout() Client.Logout()
user := th.BasicUser user := th.BasicUser
// Delete all the messages before check the reset password // Delete all the messages before check the reset password
utils.DeleteMailBox(user.Email) mailservice.DeleteMailBox(user.Email)
success, resp := Client.SendPasswordResetEmail(user.Email) success, resp := Client.SendPasswordResetEmail(user.Email)
CheckNoError(t, resp) CheckNoError(t, resp)
if !success { if !success {
@@ -1934,10 +1934,10 @@ func TestUpdateUserPassword(t *testing.T) {
t.Fatal("should have succeeded") t.Fatal("should have succeeded")
} }
// Check if the email was send to the right email address and the recovery key match // Check if the email was send to the right email address and the recovery key match
var resultsMailbox utils.JSONMessageHeaderInbucket var resultsMailbox mailservice.JSONMessageHeaderInbucket
err := utils.RetryInbucket(5, func() error { err := mailservice.RetryInbucket(5, func() error {
var err error var err error
resultsMailbox, err = utils.GetMailBox(user.Email) resultsMailbox, err = mailservice.GetMailBox(user.Email)
return err return err
}) })
if err != nil { if err != nil {
@@ -1949,7 +1949,7 @@ func TestUpdateUserPassword(t *testing.T) {
if !strings.ContainsAny(resultsMailbox[0].To[0], user.Email) { if !strings.ContainsAny(resultsMailbox[0].To[0], user.Email) {
t.Fatal("Wrong To recipient") t.Fatal("Wrong To recipient")
} else { } else {
if resultsEmail, err := utils.GetMessageFromMailbox(user.Email, resultsMailbox[0].ID); err == nil { if resultsEmail, err := mailservice.GetMessageFromMailbox(user.Email, resultsMailbox[0].ID); err == nil {
loc := strings.Index(resultsEmail.Body.Text, "token=") loc := strings.Index(resultsEmail.Body.Text, "token=")
if loc == -1 { if loc == -1 {
t.Log(resultsEmail.Body.Text) t.Log(resultsEmail.Body.Text)

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

@@ -15,6 +15,7 @@ import (
"github.com/mattermost/mattermost-server/mlog" "github.com/mattermost/mattermost-server/mlog"
"github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/services/mailservice"
"github.com/mattermost/mattermost-server/utils" "github.com/mattermost/mattermost-server/utils"
) )
@@ -242,7 +243,7 @@ func (a *App) TestEmail(userId string, cfg *model.Config) *model.AppError {
} else { } else {
T := utils.GetUserTranslations(user.Locale) T := utils.GetUserTranslations(user.Locale)
license := a.License() license := a.License()
if err := utils.SendMailUsingConfig(user.Email, T("api.admin.test_email.subject"), T("api.admin.test_email.body"), cfg, license != nil && *license.Features.Compliance); err != nil { if err := mailservice.SendMailUsingConfig(user.Email, T("api.admin.test_email.subject"), T("api.admin.test_email.body"), cfg, license != nil && *license.Features.Compliance); err != nil {
return model.NewAppError("testEmail", "app.admin.test_email.failure", map[string]interface{}{"Error": err.Error()}, "", http.StatusInternalServerError) return model.NewAppError("testEmail", "app.admin.test_email.failure", map[string]interface{}{"Error": err.Error()}, "", http.StatusInternalServerError)
} }
} }

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

@@ -16,6 +16,7 @@ import (
"github.com/mattermost/mattermost-server/mlog" "github.com/mattermost/mattermost-server/mlog"
"github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/services/mailservice"
"github.com/mattermost/mattermost-server/utils" "github.com/mattermost/mattermost-server/utils"
) )
@@ -402,5 +403,5 @@ func (a *App) SendDeactivateAccountEmail(email string, locale, siteURL string) *
func (a *App) SendMail(to, subject, htmlBody string) *model.AppError { func (a *App) SendMail(to, subject, htmlBody string) *model.AppError {
license := a.License() license := a.License()
return utils.SendMailUsingConfig(to, subject, htmlBody, a.Config(), license != nil && *license.Features.Compliance) return mailservice.SendMailUsingConfig(to, subject, htmlBody, a.Config(), license != nil && *license.Features.Compliance)
} }

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

@@ -29,6 +29,7 @@ import (
"github.com/mattermost/mattermost-server/mlog" "github.com/mattermost/mattermost-server/mlog"
"github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/plugin" "github.com/mattermost/mattermost-server/plugin"
"github.com/mattermost/mattermost-server/services/filesstore"
"github.com/mattermost/mattermost-server/utils" "github.com/mattermost/mattermost-server/utils"
) )
@@ -58,9 +59,9 @@ const (
IMAGE_PREVIEW_PIXEL_WIDTH = 1920 IMAGE_PREVIEW_PIXEL_WIDTH = 1920
) )
func (a *App) FileBackend() (utils.FileBackend, *model.AppError) { func (a *App) FileBackend() (filesstore.FileBackend, *model.AppError) {
license := a.License() license := a.License()
return utils.NewFileBackend(&a.Config().FileSettings, license != nil && *license.Features.Compliance) return filesstore.NewFileBackend(&a.Config().FileSettings, license != nil && *license.Features.Compliance)
} }
func (a *App) ReadFile(path string) ([]byte, *model.AppError) { func (a *App) ReadFile(path string) ([]byte, *model.AppError) {

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

@@ -17,6 +17,7 @@ import (
"github.com/mattermost/mattermost-server/manualtesting" "github.com/mattermost/mattermost-server/manualtesting"
"github.com/mattermost/mattermost-server/mlog" "github.com/mattermost/mattermost-server/mlog"
"github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/services/mailservice"
"github.com/mattermost/mattermost-server/utils" "github.com/mattermost/mattermost-server/utils"
"github.com/mattermost/mattermost-server/web" "github.com/mattermost/mattermost-server/web"
"github.com/mattermost/mattermost-server/wsapi" "github.com/mattermost/mattermost-server/wsapi"
@@ -67,7 +68,7 @@ func runServer(configFileLocation string, disableConfigWatch bool, usedPlatform
} }
defer a.Shutdown() defer a.Shutdown()
utils.TestConnection(a.Config()) mailservice.TestConnection(a.Config())
pwd, _ := os.Getwd() pwd, _ := os.Getwd()
if usedPlatform { if usedPlatform {

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

@@ -5,7 +5,7 @@ count=0
for fileType in GoFiles; do for fileType in GoFiles; do
for file in `go list -f $'{{range .GoFiles}}{{$.Dir}}/{{.}}\n{{end}}' "$@"`; do for file in `go list -f $'{{range .GoFiles}}{{$.Dir}}/{{.}}\n{{end}}' "$@"`; do
case $file in case $file in
*/utils/lru.go|*/store/storetest/mocks/*|*/app/plugin/jira/plugin_*|*/plugin/plugintest/*|*/app/plugin/zoom/plugin_*) */utils/lru.go|*/store/storetest/mocks/*|*/services/*/mocks/*|*/app/plugin/jira/plugin_*|*/plugin/plugintest/*|*/app/plugin/zoom/plugin_*)
# Third-party, doesn't require a header. # Third-party, doesn't require a header.
;; ;;
*) *)

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

@@ -1,7 +1,7 @@
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information. // See License.txt for license information.
package utils package filesstore
import ( import (
"io" "io"

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

@@ -1,7 +1,7 @@
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information. // See License.txt for license information.
package utils package filesstore
import ( import (
"bytes" "bytes"
@@ -15,6 +15,7 @@ import (
"github.com/mattermost/mattermost-server/mlog" "github.com/mattermost/mattermost-server/mlog"
"github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/utils"
) )
type FileBackendTestSuite struct { type FileBackendTestSuite struct {
@@ -81,7 +82,7 @@ func runBackendTest(t *testing.T, encrypt bool) {
} }
func (s *FileBackendTestSuite) SetupTest() { func (s *FileBackendTestSuite) SetupTest() {
TranslationsPreInit() utils.TranslationsPreInit()
backend, err := NewFileBackend(&s.settings, true) backend, err := NewFileBackend(&s.settings, true)
require.Nil(s.T(), err) require.Nil(s.T(), err)

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

@@ -1,7 +1,7 @@
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information. // See License.txt for license information.
package utils package filesstore
import ( import (
"bytes" "bytes"
@@ -13,6 +13,7 @@ import (
"github.com/mattermost/mattermost-server/mlog" "github.com/mattermost/mattermost-server/mlog"
"github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/utils"
) )
const ( const (
@@ -62,7 +63,7 @@ func (b *LocalFileBackend) FileExists(path string) (bool, *model.AppError) {
} }
func (b *LocalFileBackend) CopyFile(oldPath, newPath string) *model.AppError { func (b *LocalFileBackend) CopyFile(oldPath, newPath string) *model.AppError {
if err := CopyFile(filepath.Join(b.directory, oldPath), filepath.Join(b.directory, newPath)); err != nil { if err := utils.CopyFile(filepath.Join(b.directory, oldPath), filepath.Join(b.directory, newPath)); err != nil {
return model.NewAppError("copyFile", "api.file.move_file.rename.app_error", nil, err.Error(), http.StatusInternalServerError) return model.NewAppError("copyFile", "api.file.move_file.rename.app_error", nil, err.Error(), http.StatusInternalServerError)
} }
return nil return nil

215
services/filesstore/mocks/FileBackend.go Обычный файл
Просмотреть файл

@@ -0,0 +1,215 @@
// Code generated by mockery v1.0.0. DO NOT EDIT.
// Regenerate this file using `make files-store-mocks`.
package mocks
import io "io"
import mock "github.com/stretchr/testify/mock"
import model "github.com/mattermost/mattermost-server/model"
// FileBackend is an autogenerated mock type for the FileBackend type
type FileBackend struct {
mock.Mock
}
// CopyFile provides a mock function with given fields: oldPath, newPath
func (_m *FileBackend) CopyFile(oldPath string, newPath string) *model.AppError {
ret := _m.Called(oldPath, newPath)
var r0 *model.AppError
if rf, ok := ret.Get(0).(func(string, string) *model.AppError); ok {
r0 = rf(oldPath, newPath)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*model.AppError)
}
}
return r0
}
// FileExists provides a mock function with given fields: path
func (_m *FileBackend) FileExists(path string) (bool, *model.AppError) {
ret := _m.Called(path)
var r0 bool
if rf, ok := ret.Get(0).(func(string) bool); ok {
r0 = rf(path)
} else {
r0 = ret.Get(0).(bool)
}
var r1 *model.AppError
if rf, ok := ret.Get(1).(func(string) *model.AppError); ok {
r1 = rf(path)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*model.AppError)
}
}
return r0, r1
}
// ListDirectory provides a mock function with given fields: path
func (_m *FileBackend) ListDirectory(path string) (*[]string, *model.AppError) {
ret := _m.Called(path)
var r0 *[]string
if rf, ok := ret.Get(0).(func(string) *[]string); ok {
r0 = rf(path)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*[]string)
}
}
var r1 *model.AppError
if rf, ok := ret.Get(1).(func(string) *model.AppError); ok {
r1 = rf(path)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*model.AppError)
}
}
return r0, r1
}
// MoveFile provides a mock function with given fields: oldPath, newPath
func (_m *FileBackend) MoveFile(oldPath string, newPath string) *model.AppError {
ret := _m.Called(oldPath, newPath)
var r0 *model.AppError
if rf, ok := ret.Get(0).(func(string, string) *model.AppError); ok {
r0 = rf(oldPath, newPath)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*model.AppError)
}
}
return r0
}
// ReadFile provides a mock function with given fields: path
func (_m *FileBackend) ReadFile(path string) ([]byte, *model.AppError) {
ret := _m.Called(path)
var r0 []byte
if rf, ok := ret.Get(0).(func(string) []byte); ok {
r0 = rf(path)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).([]byte)
}
}
var r1 *model.AppError
if rf, ok := ret.Get(1).(func(string) *model.AppError); ok {
r1 = rf(path)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*model.AppError)
}
}
return r0, r1
}
// Reader provides a mock function with given fields: path
func (_m *FileBackend) Reader(path string) (io.ReadCloser, *model.AppError) {
ret := _m.Called(path)
var r0 io.ReadCloser
if rf, ok := ret.Get(0).(func(string) io.ReadCloser); ok {
r0 = rf(path)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(io.ReadCloser)
}
}
var r1 *model.AppError
if rf, ok := ret.Get(1).(func(string) *model.AppError); ok {
r1 = rf(path)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*model.AppError)
}
}
return r0, r1
}
// RemoveDirectory provides a mock function with given fields: path
func (_m *FileBackend) RemoveDirectory(path string) *model.AppError {
ret := _m.Called(path)
var r0 *model.AppError
if rf, ok := ret.Get(0).(func(string) *model.AppError); ok {
r0 = rf(path)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*model.AppError)
}
}
return r0
}
// RemoveFile provides a mock function with given fields: path
func (_m *FileBackend) RemoveFile(path string) *model.AppError {
ret := _m.Called(path)
var r0 *model.AppError
if rf, ok := ret.Get(0).(func(string) *model.AppError); ok {
r0 = rf(path)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*model.AppError)
}
}
return r0
}
// TestConnection provides a mock function with given fields:
func (_m *FileBackend) TestConnection() *model.AppError {
ret := _m.Called()
var r0 *model.AppError
if rf, ok := ret.Get(0).(func() *model.AppError); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*model.AppError)
}
}
return r0
}
// WriteFile provides a mock function with given fields: fr, path
func (_m *FileBackend) WriteFile(fr io.Reader, path string) (int64, *model.AppError) {
ret := _m.Called(fr, path)
var r0 int64
if rf, ok := ret.Get(0).(func(io.Reader, string) int64); ok {
r0 = rf(fr, path)
} else {
r0 = ret.Get(0).(int64)
}
var r1 *model.AppError
if rf, ok := ret.Get(1).(func(io.Reader, string) *model.AppError); ok {
r1 = rf(fr, path)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*model.AppError)
}
}
return r0, r1
}

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

@@ -1,7 +1,7 @@
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information. // See License.txt for license information.
package utils package filesstore
import ( import (
"bytes" "bytes"

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

@@ -1,7 +1,7 @@
// Copyright (c) 2018-present Mattermost, Inc. All Rights Reserved. // Copyright (c) 2018-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information. // See License.txt for license information.
package utils package filesstore
import ( import (
"testing" "testing"

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

@@ -1,7 +1,7 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information. // See License.txt for license information.
package utils package mailservice
import ( import (
"bytes" "bytes"

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

@@ -1,7 +1,7 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information. // See License.txt for license information.
package utils package mailservice
import ( import (
"crypto/tls" "crypto/tls"
@@ -21,6 +21,8 @@ import (
"github.com/jaytaylor/html2text" "github.com/jaytaylor/html2text"
"github.com/mattermost/mattermost-server/mlog" "github.com/mattermost/mattermost-server/mlog"
"github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/services/filesstore"
"github.com/mattermost/mattermost-server/utils"
) )
func encodeRFC2047Word(s string) string { func encodeRFC2047Word(s string) string {
@@ -160,7 +162,7 @@ func NewSMTPClientAdvanced(conn net.Conn, hostname string, connectionInfo *SmtpC
func NewSMTPClient(conn net.Conn, config *model.Config) (*smtp.Client, *model.AppError) { func NewSMTPClient(conn net.Conn, config *model.Config) (*smtp.Client, *model.AppError) {
return NewSMTPClientAdvanced( return NewSMTPClientAdvanced(
conn, conn,
GetHostnameFromSiteURL(*config.ServiceSettings.SiteURL), utils.GetHostnameFromSiteURL(*config.ServiceSettings.SiteURL),
&SmtpConnectionInfo{ &SmtpConnectionInfo{
ConnectionSecurity: config.EmailSettings.ConnectionSecurity, ConnectionSecurity: config.EmailSettings.ConnectionSecurity,
SkipCertVerification: *config.EmailSettings.SkipServerCertificateVerification, SkipCertVerification: *config.EmailSettings.SkipServerCertificateVerification,
@@ -181,14 +183,14 @@ func TestConnection(config *model.Config) {
conn, err1 := ConnectToSMTPServer(config) conn, err1 := ConnectToSMTPServer(config)
if err1 != nil { if err1 != nil {
mlog.Error(fmt.Sprintf("SMTP server settings do not appear to be configured properly err=%v details=%v", T(err1.Message), err1.DetailedError)) mlog.Error(fmt.Sprintf("SMTP server settings do not appear to be configured properly err=%v details=%v", utils.T(err1.Message), err1.DetailedError))
return return
} }
defer conn.Close() defer conn.Close()
c, err2 := NewSMTPClient(conn, config) c, err2 := NewSMTPClient(conn, config)
if err2 != nil { if err2 != nil {
mlog.Error(fmt.Sprintf("SMTP server settings do not appear to be configured properly err=%v details=%v", T(err2.Message), err2.DetailedError)) mlog.Error(fmt.Sprintf("SMTP server settings do not appear to be configured properly err=%v details=%v", utils.T(err2.Message), err2.DetailedError))
return return
} }
defer c.Quit() defer c.Quit()
@@ -220,7 +222,7 @@ func SendMailUsingConfigAdvanced(mimeTo, smtpTo string, from mail.Address, subje
defer c.Quit() defer c.Quit()
defer c.Close() defer c.Close()
fileBackend, err := NewFileBackend(&config.FileSettings, enableComplianceFeatures) fileBackend, err := filesstore.NewFileBackend(&config.FileSettings, enableComplianceFeatures)
if err != nil { if err != nil {
return err return err
} }
@@ -228,7 +230,7 @@ func SendMailUsingConfigAdvanced(mimeTo, smtpTo string, from mail.Address, subje
return SendMail(c, mimeTo, smtpTo, from, subject, htmlBody, attachments, mimeHeaders, fileBackend, time.Now()) return SendMail(c, mimeTo, smtpTo, from, subject, htmlBody, attachments, mimeHeaders, fileBackend, time.Now())
} }
func SendMail(c *smtp.Client, mimeTo, smtpTo string, from mail.Address, subject, htmlBody string, attachments []*model.FileInfo, mimeHeaders map[string]string, fileBackend FileBackend, date time.Time) *model.AppError { func SendMail(c *smtp.Client, mimeTo, smtpTo string, from mail.Address, subject, htmlBody string, attachments []*model.FileInfo, mimeHeaders map[string]string, fileBackend filesstore.FileBackend, date time.Time) *model.AppError {
mlog.Debug(fmt.Sprintf("sending mail to %v with subject of '%v'", smtpTo, subject)) mlog.Debug(fmt.Sprintf("sending mail to %v with subject of '%v'", smtpTo, subject))
htmlMessage := "\r\n<html><body>" + htmlBody + "</body></html>" htmlMessage := "\r\n<html><body>" + htmlBody + "</body></html>"

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

@@ -1,7 +1,7 @@
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information. // See License.txt for license information.
package utils package mailservice
import ( import (
"bytes" "bytes"
@@ -13,12 +13,14 @@ import (
"net/smtp" "net/smtp"
"github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/services/filesstore"
"github.com/mattermost/mattermost-server/utils"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
func TestMailConnectionFromConfig(t *testing.T) { func TestMailConnectionFromConfig(t *testing.T) {
cfg, _, _, err := LoadConfig("config.json") cfg, _, _, err := utils.LoadConfig("config.json")
require.Nil(t, err) require.Nil(t, err)
if conn, err := ConnectToSMTPServer(cfg); err != nil { if conn, err := ConnectToSMTPServer(cfg); err != nil {
@@ -41,7 +43,7 @@ func TestMailConnectionFromConfig(t *testing.T) {
} }
func TestMailConnectionAdvanced(t *testing.T) { func TestMailConnectionAdvanced(t *testing.T) {
cfg, _, _, err := LoadConfig("config.json") cfg, _, _, err := utils.LoadConfig("config.json")
require.Nil(t, err) require.Nil(t, err)
if conn, err := ConnectToSMTPServerAdvanced( if conn, err := ConnectToSMTPServerAdvanced(
@@ -58,7 +60,7 @@ func TestMailConnectionAdvanced(t *testing.T) {
} else { } else {
if _, err1 := NewSMTPClientAdvanced( if _, err1 := NewSMTPClientAdvanced(
conn, conn,
GetHostnameFromSiteURL(*cfg.ServiceSettings.SiteURL), utils.GetHostnameFromSiteURL(*cfg.ServiceSettings.SiteURL),
&SmtpConnectionInfo{ &SmtpConnectionInfo{
ConnectionSecurity: cfg.EmailSettings.ConnectionSecurity, ConnectionSecurity: cfg.EmailSettings.ConnectionSecurity,
SkipCertVerification: *cfg.EmailSettings.SkipServerCertificateVerification, SkipCertVerification: *cfg.EmailSettings.SkipServerCertificateVerification,
@@ -91,9 +93,9 @@ func TestMailConnectionAdvanced(t *testing.T) {
} }
func TestSendMailUsingConfig(t *testing.T) { func TestSendMailUsingConfig(t *testing.T) {
cfg, _, _, err := LoadConfig("config.json") cfg, _, _, err := utils.LoadConfig("config.json")
require.Nil(t, err) require.Nil(t, err)
T = GetUserTranslations("en") utils.T = utils.GetUserTranslations("en")
var emailTo = "test@example.com" var emailTo = "test@example.com"
var emailSubject = "Testing this email" var emailSubject = "Testing this email"
@@ -133,9 +135,9 @@ func TestSendMailUsingConfig(t *testing.T) {
} }
func TestSendMailUsingConfigAdvanced(t *testing.T) { func TestSendMailUsingConfigAdvanced(t *testing.T) {
cfg, _, _, err := LoadConfig("config.json") cfg, _, _, err := utils.LoadConfig("config.json")
require.Nil(t, err) require.Nil(t, err)
T = GetUserTranslations("en") utils.T = utils.GetUserTranslations("en")
var mimeTo = "test@example.com" var mimeTo = "test@example.com"
var smtpTo = "test2@example.com" var smtpTo = "test2@example.com"
@@ -146,7 +148,7 @@ func TestSendMailUsingConfigAdvanced(t *testing.T) {
//Delete all the messages before check the sample email //Delete all the messages before check the sample email
DeleteMailBox(smtpTo) DeleteMailBox(smtpTo)
fileBackend, err := NewFileBackend(&cfg.FileSettings, true) fileBackend, err := filesstore.NewFileBackend(&cfg.FileSettings, true)
assert.Nil(t, err) assert.Nil(t, err)
// create two files with the same name that will both be attached to the email // create two files with the same name that will both be attached to the email