diff --git a/api.go b/api.go index fdde4c9..e04f2b6 100644 --- a/api.go +++ b/api.go @@ -129,10 +129,18 @@ func (app *appContext) checkInvites() { msg, err := app.email.constructExpiry(code, data, app, false) if err != nil { app.err.Printf("%s: Failed to construct expiry notification: %v", code, err) - } else if err := app.email.send(msg, addr); err != nil { - app.err.Printf("%s: Failed to send expiry notification: %v", code, err) } else { - app.info.Printf("Sent expiry notification to %s", addr) + // Check whether notify "address" is an email address of Jellyfin ID + if strings.Contains(addr, "@") { + err = app.email.send(msg, addr) + } else { + err = app.sendByID(msg, addr) + } + if err != nil { + app.err.Printf("%s: Failed to send expiry notification: %v", code, err) + } else { + app.info.Printf("Sent expiry notification to %s", addr) + } } }(address) } @@ -171,10 +179,18 @@ func (app *appContext) checkInvite(code string, used bool, username string) bool msg, err := app.email.constructExpiry(code, inv, app, false) if err != nil { app.err.Printf("%s: Failed to construct expiry notification: %v", code, err) - } else if err := app.email.send(msg, addr); err != nil { - app.err.Printf("%s: Failed to send expiry notification: %v", code, err) } else { - app.info.Printf("Sent expiry notification to %s", addr) + // Check whether notify "address" is an email address of Jellyfin ID + if strings.Contains(addr, "@") { + err = app.email.send(msg, addr) + } else { + err = app.sendByID(msg, addr) + } + if err != nil { + app.err.Printf("%s: Failed to send expiry notification: %v", code, err) + } else { + app.info.Printf("Sent expiry notification to %s", addr) + } } }(address) } @@ -470,10 +486,18 @@ func (app *appContext) newUser(req newUserDTO, confirmed bool) (f errorFunc, suc msg, err := app.email.constructCreated(req.Code, req.Username, req.Email, invite, app, false) if err != nil { app.err.Printf("%s: Failed to construct user creation notification: %v", req.Code, err) - } else if err := app.email.send(msg, address); err != nil { - app.err.Printf("%s: Failed to send user creation notification: %v", req.Code, err) } else { - app.info.Printf("%s: Sent user creation notification to %v", req.Code, address) + // Check whether notify "address" is an email address of Jellyfin ID + if strings.Contains(address, "@") { + err = app.email.send(msg, address) + } else { + err = app.sendByID(msg, address) + } + if err != nil { + app.err.Printf("%s: Failed to send user creation notification: %v", req.Code, err) + } else { + app.info.Printf("Sent user creation notification to %s", address) + } } }() } @@ -1340,15 +1364,16 @@ func (app *appContext) SetNotify(gc *gin.Context) { return } var address string - if app.config.Section("ui").Key("jellyfin_login").MustBool(false) { - addr, ok := app.storage.emails[gc.GetString("jfId")] - if !ok { - app.err.Printf("%s: Couldn't find email address. Make sure it's set", code) + jellyfinLogin := app.config.Section("ui").Key("jellyfin_login").MustBool(false) + if jellyfinLogin { + var addressAvailable bool = app.getAddressOrName(gc.GetString("jfId")) != "" + if !addressAvailable { + app.err.Printf("%s: Couldn't find contact method for admin. Make sure one is set.", code) app.debug.Printf("%s: User ID \"%s\"", code, gc.GetString("jfId")) - respond(500, "Missing user email", gc) + respond(500, "Missing user contact method", gc) return } - address = addr.Addr + address = gc.GetString("jfId") } else { address = app.config.Section("ui").Key("email").String() } diff --git a/lang/email/en-us.json b/lang/email/en-us.json index c14b242..2bc8698 100644 --- a/lang/email/en-us.json +++ b/lang/email/en-us.json @@ -12,14 +12,14 @@ "title": "Notice: User created", "aUserWasCreated": "A user was created using code {code}.", "time": "Time", - "notificationNotice": "Note: Notification emails can be toggled on the admin dashboard." + "notificationNotice": "Note: Notification messages can be toggled on the admin dashboard." }, "inviteExpiry": { "name": "Invite expiry", "title": "Notice: Invite expired", "inviteExpired": "Invite expired.", "expiredAt": "Code {code} expired at {time}.", - "notificationNotice": "Note: Notification emails can be toggled on the admin dashboard." + "notificationNotice": "Note: Notification messages can be toggled on the admin dashboard." }, "passwordReset": { "name": "Password reset", diff --git a/migrations.go b/migrations.go index d83e2dd..eb84c62 100644 --- a/migrations.go +++ b/migrations.go @@ -13,6 +13,7 @@ func runMigrations(app *appContext) { migrateProfiles(app) migrateBootstrap(app) migrateEmailStorage(app) + migrateNotificationMethods(app) // migrateHyphens(app) } @@ -123,6 +124,40 @@ func migrateEmailStorage(app *appContext) error { return nil } +// Pre-0.3.10, Admin notifications for invites were indexed by and only sent to email addresses. Now, when Jellyfin Login is enabled, They are indexed by the admin's Jellyfin ID, and send by any method enabled for them. This migrates storage to that format. +func migrateNotificationMethods(app *appContext) error { + if !app.config.Section("ui").Key("jellyfin_login").MustBool(false) { + return nil + } + changes := false + for code, invite := range app.storage.invites { + if invite.Notify == nil { + continue + } + for address, notifyPrefs := range invite.Notify { + if !strings.Contains(address, "@") { + continue + } + for id, email := range app.storage.emails { + if email.Addr == address { + invite.Notify[id] = notifyPrefs + delete(invite.Notify, address) + changes = true + break + } + } + } + if changes { + app.storage.invites[code] = invite + } + } + if changes { + app.info.Printf("Migrated to modified invite storage format.") + return app.storage.storeInvites() + } + return nil +} + // Migrate between hyphenated & non-hyphenated user IDs. Doesn't seem to happen anymore, so disabled. // func migrateHyphens(app *appContext) { // checkVersion := func(version string) int {