diff --git a/CHANGELOG.md b/CHANGELOG.md index 68ab3708..f0f41659 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,11 +14,15 @@ The following log documentes the history of the server project. #### Upgrade Guide -* Please define a new environment variable `WebURL` whose value is the URL to your Dnote server, without the trailing slash. (e.g. `https://my-server.com`) (Please see #290) +* Please define the follwoing new environment variables: + + - `WebURL`: the URL to your Dnote server, without the trailing slash. (e.g. `https://my-server.com`) (Please see #290) + - `SmtpPort`: the SMTP port. (e.g. `465`) optional - required *if you want to configure email* #### Fixed - Allow to customize the app URL in the emails (#290) +- Allow to customize the SMTP port ### 0.2.0 - 2019-10-28 diff --git a/pkg/server/.env.dev b/pkg/server/.env.dev index 9e9644f0..61f93035 100644 --- a/pkg/server/.env.dev +++ b/pkg/server/.env.dev @@ -9,5 +9,6 @@ DBPassword= SmtpUsername=mock-SmtpUsername SmtpPassword=mock-SmtpPassword SmtpHost=mock-SmtpHost +SmtpPort=465 WebURL=http://localhost:3000 diff --git a/pkg/server/.env.test b/pkg/server/.env.test index 06585243..834dc925 100644 --- a/pkg/server/.env.test +++ b/pkg/server/.env.test @@ -9,5 +9,6 @@ DBPassword= SmtpUsername=mock-SmtpUsername SmtpPassword=mock-SmtpPassword SmtpHost=mock-SmtpHost +SmtpPort=465 WebURL=http://localhost:3000 diff --git a/pkg/server/api/handlers/auth_test.go b/pkg/server/api/handlers/auth_test.go index cb47f727..12cb10fe 100644 --- a/pkg/server/api/handlers/auth_test.go +++ b/pkg/server/api/handlers/auth_test.go @@ -35,7 +35,7 @@ func TestGetMe(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -63,7 +63,7 @@ func TestCreateResetToken(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -96,7 +96,7 @@ func TestCreateResetToken(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -125,7 +125,7 @@ func TestResetPassword(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -171,7 +171,7 @@ func TestResetPassword(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -209,7 +209,7 @@ func TestResetPassword(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -246,7 +246,7 @@ func TestResetPassword(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -294,7 +294,7 @@ func TestResetPassword(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() diff --git a/pkg/server/api/handlers/classic_test.go b/pkg/server/api/handlers/classic_test.go index 05b88469..3a5b3f50 100644 --- a/pkg/server/api/handlers/classic_test.go +++ b/pkg/server/api/handlers/classic_test.go @@ -77,7 +77,7 @@ func TestClassicPresignin(t *testing.T) { t.Run(fmt.Sprintf("presignin %s", tc.email), func(t *testing.T) { // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -105,7 +105,7 @@ func TestClassicPresignin_MissingParams(t *testing.T) { defer testutils.ClearData() // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -128,7 +128,7 @@ func TestClassicSignin(t *testing.T) { testutils.MustExec(t, db.Save(&alice), "saving alice") // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -226,7 +226,7 @@ func TestClassicSignin_Failure(t *testing.T) { t.Run(fmt.Sprintf("signin %s %s", tc.email, tc.authKey), func(t *testing.T) { // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() diff --git a/pkg/server/api/handlers/health_test.go b/pkg/server/api/handlers/health_test.go index c778755c..6a574f6d 100644 --- a/pkg/server/api/handlers/health_test.go +++ b/pkg/server/api/handlers/health_test.go @@ -31,7 +31,7 @@ func TestCheckHealth(t *testing.T) { defer testutils.ClearData() // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() diff --git a/pkg/server/api/handlers/notes_test.go b/pkg/server/api/handlers/notes_test.go index afed2591..648f7c88 100644 --- a/pkg/server/api/handlers/notes_test.go +++ b/pkg/server/api/handlers/notes_test.go @@ -43,7 +43,7 @@ func TestGetNotes(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -186,7 +186,7 @@ func TestGetNote(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() diff --git a/pkg/server/api/handlers/repetition_rules_test.go b/pkg/server/api/handlers/repetition_rules_test.go index 665955e2..993dcf3d 100644 --- a/pkg/server/api/handlers/repetition_rules_test.go +++ b/pkg/server/api/handlers/repetition_rules_test.go @@ -42,7 +42,7 @@ func TestGetRepetitionRule(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -116,7 +116,7 @@ func TestGetRepetitionRules(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -225,7 +225,7 @@ func TestCreateRepetitionRules(t *testing.T) { t0 := time.Date(2009, time.November, 1, 2, 3, 4, 5, time.UTC) c.SetNow(t0) - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: c, }) defer server.Close() @@ -283,7 +283,7 @@ func TestCreateRepetitionRules(t *testing.T) { t0 := time.Date(2009, time.November, 1, 2, 3, 4, 5, time.UTC) c.SetNow(t0) - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: c, }) defer server.Close() @@ -346,7 +346,7 @@ func TestUpdateRepetitionRules(t *testing.T) { c := clock.NewMock() t0 := time.Date(2009, time.November, 1, 2, 3, 4, 5, time.UTC) c.SetNow(t0) - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: c, }) defer server.Close() @@ -420,7 +420,7 @@ func TestDeleteRepetitionRules(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -545,7 +545,7 @@ func TestCreateUpdateRepetitionRules_BadRequest(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -589,7 +589,7 @@ func TestCreateUpdateRepetitionRules_BadRequest(t *testing.T) { } testutils.MustExec(t, db.Save(&b1), "preparing book1") - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -628,7 +628,7 @@ func TestCreateRepetitionRules_BadRequest(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() diff --git a/pkg/server/api/handlers/routes_test.go b/pkg/server/api/handlers/routes_test.go index b4ca5f4d..01683d90 100644 --- a/pkg/server/api/handlers/routes_test.go +++ b/pkg/server/api/handlers/routes_test.go @@ -681,7 +681,7 @@ func TestNotSupportedVersions(t *testing.T) { } // setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() diff --git a/pkg/server/api/handlers/testutils.go b/pkg/server/api/handlers/testutils.go index dde58712..ca979b2f 100644 --- a/pkg/server/api/handlers/testutils.go +++ b/pkg/server/api/handlers/testutils.go @@ -26,9 +26,9 @@ import ( "github.com/pkg/errors" ) -// mustNewServer is a test utility function to initialize a new server +// MustNewServer is a test utility function to initialize a new server // with the given app paratmers -func mustNewServer(t *testing.T, app *App) *httptest.Server { +func MustNewServer(t *testing.T, app *App) *httptest.Server { app.WebURL = os.Getenv("WebURL") r, err := NewRouter(app) diff --git a/pkg/server/api/handlers/user_test.go b/pkg/server/api/handlers/user_test.go index 809fea3e..efe3dd39 100644 --- a/pkg/server/api/handlers/user_test.go +++ b/pkg/server/api/handlers/user_test.go @@ -46,7 +46,7 @@ func TestUpdatePassword(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -74,7 +74,7 @@ func TestUpdatePassword(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -100,7 +100,7 @@ func TestUpdatePassword(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -134,7 +134,7 @@ func TestCreateVerificationToken(t *testing.T) { templatePath := fmt.Sprintf("%s/mailer/templates/src", testutils.ServerPath) mailer.InitTemplates(&templatePath) - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -167,7 +167,7 @@ func TestCreateVerificationToken(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -200,7 +200,7 @@ func TestVerifyEmail(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -241,7 +241,7 @@ func TestVerifyEmail(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -285,7 +285,7 @@ func TestVerifyEmail(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -327,7 +327,7 @@ func TestVerifyEmail(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -372,7 +372,7 @@ func TestUpdateEmail(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -406,7 +406,7 @@ func TestUpdateEmailPreference(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -432,7 +432,7 @@ func TestUpdateEmailPreference(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -472,7 +472,7 @@ func TestUpdateEmailPreference(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -506,7 +506,7 @@ func TestUpdateEmailPreference(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -542,7 +542,7 @@ func TestUpdateEmailPreference(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -578,7 +578,7 @@ func TestUpdateEmailPreference(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -604,7 +604,7 @@ func TestUpdateEmailPreference(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -640,7 +640,7 @@ func TestGetEmailPreference(t *testing.T) { defer testutils.ClearData() // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() diff --git a/pkg/server/api/handlers/v3_auth_test.go b/pkg/server/api/handlers/v3_auth_test.go index 8faa482d..b81d6631 100644 --- a/pkg/server/api/handlers/v3_auth_test.go +++ b/pkg/server/api/handlers/v3_auth_test.go @@ -90,7 +90,7 @@ func TestRegister(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -133,7 +133,7 @@ func TestRegisterMissingParams(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -160,7 +160,7 @@ func TestRegisterMissingParams(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -188,7 +188,7 @@ func TestRegisterDuplicateEmail(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -225,7 +225,7 @@ func TestSignIn(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -255,7 +255,7 @@ func TestSignIn(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -286,7 +286,7 @@ func TestSignIn(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -317,7 +317,7 @@ func TestSignIn(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -360,7 +360,7 @@ func TestSignout(t *testing.T) { testutils.MustExec(t, db.Save(&session2), "preparing session2") // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -411,7 +411,7 @@ func TestSignout(t *testing.T) { testutils.MustExec(t, db.Save(&session2), "preparing session2") // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() diff --git a/pkg/server/api/handlers/v3_books_test.go b/pkg/server/api/handlers/v3_books_test.go index 01184947..76da8332 100644 --- a/pkg/server/api/handlers/v3_books_test.go +++ b/pkg/server/api/handlers/v3_books_test.go @@ -42,7 +42,7 @@ func TestGetBooks(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -121,7 +121,7 @@ func TestGetBooksByName(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -206,7 +206,7 @@ func TestDeleteBook(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -356,7 +356,7 @@ func TestCreateBook(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -417,7 +417,7 @@ func TestCreateBookDuplicate(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -496,7 +496,7 @@ func TestUpdateBook(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() diff --git a/pkg/server/api/handlers/v3_notes_test.go b/pkg/server/api/handlers/v3_notes_test.go index 19e311c4..a1b05c99 100644 --- a/pkg/server/api/handlers/v3_notes_test.go +++ b/pkg/server/api/handlers/v3_notes_test.go @@ -38,7 +38,7 @@ func TestCreateNote(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -171,7 +171,7 @@ func TestUpdateNote(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() @@ -264,7 +264,7 @@ func TestDeleteNote(t *testing.T) { db := database.DBConn // Setup - server := mustNewServer(t, &App{ + server := MustNewServer(t, &App{ Clock: clock.NewMock(), }) defer server.Close() diff --git a/pkg/server/mailer/mailer.go b/pkg/server/mailer/mailer.go index 9d4942a8..410e97bb 100644 --- a/pkg/server/mailer/mailer.go +++ b/pkg/server/mailer/mailer.go @@ -25,6 +25,7 @@ import ( "html/template" "os" "path" + "strconv" "github.com/aymerick/douceur/inliner" "github.com/gobuffalo/packr/v2" @@ -124,6 +125,30 @@ func NewEmail(from string, to []string, subject string) *Email { } } +type dialerParams struct { + Host string + Port int + Username string + Password string +} + +func getSMTPParams() (*dialerParams, error) { + portStr := os.Getenv("SmtpPort") + port, err := strconv.Atoi(portStr) + if err != nil { + return nil, errors.Wrap(err, "parsing SMTP port") + } + + p := &dialerParams{ + Host: os.Getenv("SmtpHost"), + Port: port, + Username: os.Getenv("SmtpUsername"), + Password: os.Getenv("SmtpPassword"), + } + + return p, nil +} + // Send sends the email func (e *Email) Send() error { // If not production, never actually send an email @@ -134,16 +159,18 @@ func (e *Email) Send() error { return nil } - smtpPort := 465 - m := gomail.NewMessage() m.SetHeader("From", e.from) m.SetHeader("To", e.to...) m.SetHeader("Subject", e.subject) m.SetBody("text/html", e.Body) - d := gomail.NewPlainDialer(os.Getenv("SmtpHost"), smtpPort, os.Getenv("SmtpUsername"), os.Getenv("SmtpPassword")) + p, err := getSMTPParams() + if err != nil { + return errors.Wrap(err, "getting dialer params") + } + d := gomail.NewPlainDialer(p.Host, p.Port, p.Username, p.Password) if err := d.DialAndSend(m); err != nil { return err }