mirror of
https://github.com/mjl-/mox.git
synced 2024-12-27 17:03:47 +03:00
46 lines
1.5 KiB
Go
46 lines
1.5 KiB
Go
|
package webauth
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"errors"
|
||
|
|
||
|
"github.com/mjl-/mox/mlog"
|
||
|
"github.com/mjl-/mox/store"
|
||
|
)
|
||
|
|
||
|
// AccountAuth is for user accounts, with username/password, and sessions stored in
|
||
|
// memory and in the database with lifetimes that are automatically extended.
|
||
|
var Accounts SessionAuth = accountSessionAuth{}
|
||
|
|
||
|
type accountSessionAuth struct{}
|
||
|
|
||
|
func (accountSessionAuth) login(ctx context.Context, log mlog.Log, username, password string) (bool, string, error) {
|
||
|
acc, err := store.OpenEmailAuth(log, username, password)
|
||
|
if err != nil && errors.Is(err, store.ErrUnknownCredentials) {
|
||
|
return false, "", nil
|
||
|
} else if err != nil {
|
||
|
return false, "", err
|
||
|
}
|
||
|
defer func() {
|
||
|
err := acc.Close()
|
||
|
log.Check(err, "closing account")
|
||
|
}()
|
||
|
return true, acc.Name, nil
|
||
|
}
|
||
|
|
||
|
func (accountSessionAuth) add(ctx context.Context, log mlog.Log, accountName string, loginAddress string) (sessionToken store.SessionToken, csrfToken store.CSRFToken, rerr error) {
|
||
|
return store.SessionAdd(ctx, log, accountName, loginAddress)
|
||
|
}
|
||
|
|
||
|
func (accountSessionAuth) use(ctx context.Context, log mlog.Log, accountName string, sessionToken store.SessionToken, csrfToken store.CSRFToken) (loginAddress string, rerr error) {
|
||
|
ls, err := store.SessionUse(ctx, log, accountName, sessionToken, csrfToken)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
return ls.LoginAddress, nil
|
||
|
}
|
||
|
|
||
|
func (accountSessionAuth) remove(ctx context.Context, log mlog.Log, accountName string, sessionToken store.SessionToken) error {
|
||
|
return store.SessionRemove(ctx, log, accountName, sessionToken)
|
||
|
}
|