7 "github.com/mjl-/mox/mlog"
8 "github.com/mjl-/mox/store"
11// AccountAuth is for user accounts, with username/password, and sessions stored in
12// memory and in the database with lifetimes that are automatically extended.
13var Accounts SessionAuth = accountSessionAuth{}
15type accountSessionAuth struct{}
17func (accountSessionAuth) login(ctx context.Context, log mlog.Log, username, password string) (valid, disabled bool, accName string, rerr error) {
18 acc, accName, err := store.OpenEmailAuth(log, username, password, true)
19 if err != nil && errors.Is(err, store.ErrUnknownCredentials) {
20 return false, false, accName, nil
21 } else if err != nil && errors.Is(err, store.ErrLoginDisabled) {
22 return false, true, accName, err // Returning error, for its message.
23 } else if err != nil {
24 return false, false, accName, err
28 log.Check(err, "closing account")
30 return true, false, accName, nil
33func (accountSessionAuth) add(ctx context.Context, log mlog.Log, accountName string, loginAddress string) (sessionToken store.SessionToken, csrfToken store.CSRFToken, rerr error) {
34 return store.SessionAdd(ctx, log, accountName, loginAddress)
37func (accountSessionAuth) use(ctx context.Context, log mlog.Log, accountName string, sessionToken store.SessionToken, csrfToken store.CSRFToken) (loginAddress string, rerr error) {
38 ls, err := store.SessionUse(ctx, log, accountName, sessionToken, csrfToken)
42 return ls.LoginAddress, nil
45func (accountSessionAuth) remove(ctx context.Context, log mlog.Log, accountName string, sessionToken store.SessionToken) error {
46 return store.SessionRemove(ctx, log, accountName, sessionToken)