From 56ce9fa2f89991ea78b689b9349bebf956bf1563 Mon Sep 17 00:00:00 2001 From: Lucas Schumacher Date: Sun, 1 Sep 2024 20:23:31 -0400 Subject: [PATCH] Add .env file support --- .env.template | 13 +++++++++++++ go.mod | 1 + go.sum | 2 ++ main.go | 26 +++++++++++++++++++++++--- models/email.go | 5 ----- 5 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 .env.template diff --git a/.env.template b/.env.template new file mode 100644 index 0000000..c6e7510 --- /dev/null +++ b/.env.template @@ -0,0 +1,13 @@ +# Cryptographic key for generating secure CSRF protection tokens +LENSLOCKED_CSRF_KEY= + +# Postgresql DB c nnection settings +# Make sure to enable ssl when deploying to production +LENSLOCKED_DB_STRING="host=localhost port=5432 user=changeme dbname=lenslocked sslmode=disable" + +# SMTP Email settings +LENSLOCKED_EMAIL_HOST= +LENSLOCKED_EMAIL_PORT= +LENSLOCKED_EMAIL_USERNAME= +LENSLOCKED_EMAIL_PASSWORD= +LENSLOCKED_EMAIL_FROM= diff --git a/go.mod b/go.mod index 8149f29..7e7518a 100644 --- a/go.mod +++ b/go.mod @@ -20,6 +20,7 @@ require ( github.com/jackc/pgproto3/v2 v2.3.3 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/pgtype v1.14.0 // indirect + github.com/joho/godotenv v1.5.1 // indirect github.com/mfridman/interpolate v0.0.2 // indirect github.com/sethvargo/go-retry v0.2.4 // indirect go.uber.org/multierr v1.11.0 // indirect diff --git a/go.sum b/go.sum index 9c38fda..686e0c1 100644 --- a/go.sum +++ b/go.sum @@ -78,6 +78,8 @@ github.com/jackc/pgx/v4 v4.18.3/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= diff --git a/main.go b/main.go index 9a76d53..c104834 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "io/fs" "net/http" "os" + "strconv" userctx "git.kealoha.me/lks/lenslocked/context" ctrlrs "git.kealoha.me/lks/lenslocked/controllers" @@ -13,6 +14,7 @@ import ( "git.kealoha.me/lks/lenslocked/models" "github.com/go-chi/chi/v5" "github.com/gorilla/csrf" + "github.com/joho/godotenv" "github.com/pressly/goose/v3" "github.com/go-chi/chi/v5/middleware" @@ -53,20 +55,38 @@ func MigrateDB(db *sql.DB, subfs fs.FS) error { } func main() { - csrfKey := []byte(os.Getenv("LENSLOCKED_CSRF_KEY")) + err := godotenv.Load() + if err != nil { + fmt.Println("Warning: Could not load .env file") + } + + var ( + email_host = os.Getenv("LENSLOCKED_EMAIL_HOST") + email_port_str = os.Getenv("LENSLOCKED_EMAIL_PORT") + email_username = os.Getenv("LENSLOCKED_EMAIL_USERNAME") + email_pass = os.Getenv("LENSLOCKED_EMAIL_PASSWORD") + email_sender = os.Getenv("LENSLOCKED_EMAIL_FROM") + csrfKey = []byte(os.Getenv("LENSLOCKED_CSRF_KEY")) + ) if len(csrfKey) < 32 { - panic("Error: bad csrf protection key\nPlease set a key with the LENSLOCKED_CSRF_KEY env var.") + panic("Error: no or bad csrf protection key\nPlease set the LENSLOCKED_CSRF_KEY env var to a key at least 32 characters long.") + } + email_port, err := strconv.Atoi(email_port_str) + if err != nil { + fmt.Println("Warning: Invalid STMP port set in LENSLOCKED_EMAIL_PORT. Using port 587") + email_port = 587 } db := ConnectDB() defer db.Close() - err := MigrateDB(db, migrations.FS) + err = MigrateDB(db, migrations.FS) if err != nil { panic(err) } userService := models.UserService{DB: db} sessionService := models.SessionService{DB: db} + _ = models.NewEmailService(email_host, email_port, email_username, email_pass, email_sender) var usersCtrlr ctrlrs.Users = ctrlrs.Default(&userService, &sessionService) umw := userctx.UserMiddleware{SS: &sessionService} diff --git a/models/email.go b/models/email.go index e58dfad..b4080dc 100644 --- a/models/email.go +++ b/models/email.go @@ -2,15 +2,10 @@ package models import ( "fmt" - "os" "github.com/go-mail/mail/v2" ) -var ( - defaultSender = os.Getenv("LENSLOCKED_EMAIL_FROM") -) - type Email struct { To string Subject string