Documentation
¶
Overview ¶
Package store keeps the panel's state in a single SQLite file.
Index ¶
- Constants
- Variables
- type Account
- type App
- type Backup
- type BackupPlan
- type Deployment
- type Detected
- type EnvVar
- type ExternalAccess
- type GitHubApp
- type KeptVolume
- type Link
- type Passkey
- type Session
- type Store
- func (s *Store) AccountByEmail(ctx context.Context, email string) (Account, error)
- func (s *Store) AccountByID(ctx context.Context, id int64) (Account, error)
- func (s *Store) AddFoundBackup(ctx context.Context, b Backup) (int64, error)
- func (s *Store) AddPasskey(ctx context.Context, p Passkey) error
- func (s *Store) App(ctx context.Context, id string) (App, error)
- func (s *Store) Apps(ctx context.Context) ([]App, error)
- func (s *Store) Backup(ctx context.Context, id int64) (Backup, error)
- func (s *Store) BackupFiles(ctx context.Context) (map[string]bool, error)
- func (s *Store) BackupPlan(ctx context.Context, app string) (BackupPlan, error)
- func (s *Store) BackupPlans(ctx context.Context) ([]BackupPlan, error)
- func (s *Store) Backups(ctx context.Context, app string) ([]Backup, error)
- func (s *Store) Close() error
- func (s *Store) ConfirmSession(ctx context.Context, hash []byte, now time.Time) error
- func (s *Store) CreateApp(ctx context.Context, a App) error
- func (s *Store) CreateDeployment(ctx context.Context, d Deployment, now time.Time) (int64, error)
- func (s *Store) CreateFirstAdmin(ctx context.Context, tokenHash []byte, email, password string, now time.Time) (User, error)
- func (s *Store) CreateLink(ctx context.Context, l Link) error
- func (s *Store) CreateSession(ctx context.Context, x Session) error
- func (s *Store) CreateVolume(ctx context.Context, v Volume) (Volume, error)
- func (s *Store) DeleteApp(ctx context.Context, id string) error
- func (s *Store) DeleteBackup(ctx context.Context, id int64) error
- func (s *Store) DeleteExpiredSessions(ctx context.Context, now time.Time) error
- func (s *Store) DeleteGitHubApp(ctx context.Context) error
- func (s *Store) DeleteKeptVolume(ctx context.Context, appID string, id int64) error
- func (s *Store) DeleteLink(ctx context.Context, appID, dbID string) error
- func (s *Store) DeleteOtherSessions(ctx context.Context, userID int64, keep []byte) error
- func (s *Store) DeletePasskey(ctx context.Context, userID int64, id []byte) error
- func (s *Store) DeleteSession(ctx context.Context, hash []byte) error
- func (s *Store) DeleteUserSession(ctx context.Context, userID int64, hash []byte) error
- func (s *Store) DeleteVolume(ctx context.Context, appID string, id int64) error
- func (s *Store) Deployment(ctx context.Context, appID string, id int64) (Deployment, error)
- func (s *Store) Deployments(ctx context.Context, appID string, limit int) ([]Deployment, error)
- func (s *Store) DropOffsiteQueue(ctx context.Context) error
- func (s *Store) Env(ctx context.Context, appID string) ([]EnvVar, error)
- func (s *Store) ExpiredBackups(ctx context.Context, now time.Time) ([]Backup, error)
- func (s *Store) ExpiredOffsite(ctx context.Context, now time.Time) ([]Backup, error)
- func (s *Store) ExternalAccess(ctx context.Context, appID string) (ExternalAccess, error)
- func (s *Store) ExternalAccesses(ctx context.Context) ([]ExternalAccess, error)
- func (s *Store) FailUnfinished(ctx context.Context, now time.Time) error
- func (s *Store) FailUnfinishedBackups(ctx context.Context, now time.Time) error
- func (s *Store) FinishBackup(ctx context.Context, id int64, file string, bytes int64, failure *msg.Msg, ...) error
- func (s *Store) FirstDelivery(ctx context.Context, id string, now time.Time) (bool, error)
- func (s *Store) GitHubApp(ctx context.Context) (GitHubApp, error)
- func (s *Store) GoLive(ctx context.Context, d Deployment, now time.Time) error
- func (s *Store) HasNewer(ctx context.Context, d Deployment) (bool, error)
- func (s *Store) Images(ctx context.Context) ([]string, error)
- func (s *Store) KeepVolume(ctx context.Context, v Volume, version string, now time.Time) (KeptVolume, error)
- func (s *Store) KeptVolumes(ctx context.Context, appID string) ([]KeptVolume, error)
- func (s *Store) Links(ctx context.Context, appID, dbID string) ([]Link, error)
- func (s *Store) LiveDeployment(ctx context.Context, appID string) (Deployment, error)
- func (s *Store) LiveDeployments(ctx context.Context) ([]Deployment, error)
- func (s *Store) OffsiteDue(ctx context.Context, now time.Time) ([]Backup, error)
- func (s *Store) OffsiteFailedAt(ctx context.Context, id int64, failure msg.Msg, tries int, next time.Time) error
- func (s *Store) OffsiteSent(ctx context.Context, id int64, at time.Time) error
- func (s *Store) Passkeys(ctx context.Context, userID int64) ([]Passkey, error)
- func (s *Store) PushTargets(ctx context.Context, repo, branch string) ([]App, error)
- func (s *Store) RecoveryCodesLeft(ctx context.Context, userID int64) (int, error)
- func (s *Store) RecoverySavedAt(ctx context.Context) (time.Time, error)
- func (s *Store) RemoveExternalAccess(ctx context.Context, appID string) error
- func (s *Store) RemoveTOTP(ctx context.Context, userID int64) error
- func (s *Store) SendOffsite(ctx context.Context, id int64, until time.Time) error
- func (s *Store) Session(ctx context.Context, hash []byte, now time.Time) (Session, error)
- func (s *Store) Sessions(ctx context.Context, userID int64, now time.Time) ([]Session, error)
- func (s *Store) SetAdapted(ctx context.Context, id int64, adapted map[string]int) error
- func (s *Store) SetBackupContents(ctx context.Context, id int64, volumes []string, size int64, changed int) error
- func (s *Store) SetBackupPlan(ctx context.Context, p BackupPlan) error
- func (s *Store) SetDeployment(ctx context.Context, d Deployment, now time.Time) error
- func (s *Store) SetDeploymentImage(ctx context.Context, id int64, image string) error
- func (s *Store) SetDetected(ctx context.Context, appID string, d Detected) error
- func (s *Store) SetEngineVersion(ctx context.Context, appID, image, version string) error
- func (s *Store) SetEnv(ctx context.Context, appID string, vars []EnvVar) error
- func (s *Store) SetExternalAccess(ctx context.Context, x ExternalAccess) error
- func (s *Store) SetGitHubApp(ctx context.Context, g GitHubApp) error
- func (s *Store) SetLocal(ctx context.Context, id int64, local bool, keep time.Time) error
- func (s *Store) SetPassword(ctx context.Context, userID int64, hash string) error
- func (s *Store) SetPruned(ctx context.Context, appID, image string) error
- func (s *Store) SetRecoveryCodes(ctx context.Context, userID int64, hashes [][]byte) error
- func (s *Store) SetRecoverySaved(ctx context.Context, at time.Time) error
- func (s *Store) SetRestored(ctx context.Context, id int64, at time.Time) error
- func (s *Store) SetSetupToken(ctx context.Context, hash []byte, expires time.Time) error
- func (s *Store) SetStopped(ctx context.Context, appID string, stopped bool) error
- func (s *Store) SetTOTP(ctx context.Context, userID int64, secret []byte, step int64) error
- func (s *Store) SetupOpen(ctx context.Context) (bool, error)
- func (s *Store) StartBackup(ctx context.Context, b Backup) (int64, error)
- func (s *Store) SuggestTest(ctx context.Context, appID, command string) (bool, error)
- func (s *Store) TouchSession(ctx context.Context, hash []byte, seen, expires time.Time) error
- func (s *Store) UnkeepVolume(ctx context.Context, k KeptVolume, now time.Time) (Volume, error)
- func (s *Store) Unpruned(ctx context.Context, appID string) ([]Deployment, error)
- func (s *Store) UpdateApp(ctx context.Context, a App) error
- func (s *Store) UpdateLink(ctx context.Context, l Link) error
- func (s *Store) UpdatePasskey(ctx context.Context, id, credential []byte, used time.Time) error
- func (s *Store) UpdateVolume(ctx context.Context, v Volume) error
- func (s *Store) UseRecoveryCode(ctx context.Context, userID int64, hash []byte) (bool, error)
- func (s *Store) UseTOTPStep(ctx context.Context, userID, step int64) (bool, error)
- func (s *Store) VerifySession(ctx context.Context, hash []byte, now, expires time.Time) error
- func (s *Store) Volumes(ctx context.Context, appID string) ([]Volume, error)
- type User
- type Volume
Constants ¶
const ( SourceImage = "image" SourceGitHub = "github" )
App sources.
const ( DeployQueued = "queued" DeployBuilding = "building" DeployTesting = "testing" DeployStarting = "starting" DeployLive = "live" DeployFailed = "failed" DeployReplaced = "replaced" // was live until a newer one took over DeploySkipped = "skipped" // a newer one came before it started )
Deployment states. A deployment moves forward through them and ends in one of the last four.
const ( CauseManual = "manual" CausePush = "push" CauseRestart = "restart" // the live image again, without a build CauseRollback = "rollback" // an earlier deployment's image CauseRecover = "recover" // the live image again, after it stopped by itself CauseRestore = "restore" // the live image again, after a backup was put back CauseBackup = "backup" // the live image again, after the app was stopped for its backup CauseUpdate = "update" // what the image's tag points at now; a database is backed up first CauseUpgrade = "upgrade" // a database's new major version, with its data dumped and loaded )
What started a deployment.
const ( BackupScheduled = "scheduled" BackupManual = "manual" // BackupRestore is the safety backup taken just before a restore. BackupRestore = "restore" // BackupFound was made elsewhere and found in off-site storage. BackupFound = "found" // BackupUploaded is a dump from another server that someone uploaded. BackupUploaded = "uploaded" // BackupUpdate is taken just before a database moves to a new image. BackupUpdate = "update" // BackupUpgrade is the dump a database's new major version loads. BackupUpgrade = "upgrade" )
Why a backup was made.
const ( BackupRunning = "running" BackupDone = "done" BackupFailed = "failed" )
Backup states.
const ( OffsitePending = "pending" OffsiteDone = "done" OffsiteFailed = "failed" )
Where a backup's off-site copy is. A backup that is not sent has none.
Variables ¶
var ( // ErrSetupDone means an administrator exists and setup is closed for good. ErrSetupDone = errors.New("setup is already complete") // ErrBadSetupToken means the setup link is wrong, used or expired. ErrBadSetupToken = errors.New("this setup link is not valid; run 'zelie setup-link' on the server for a new one") )
var ( // ErrNotFound means the thing asked for does not exist. ErrNotFound = errors.New("not found") // ErrLastFactor stops an account from removing its only second factor. ErrLastFactor = errors.New("this is the only second step left on the account; add another before removing it") )
var ErrExists = errors.New("already exists")
ErrExists is returned when a name or domain is already taken.
Functions ¶
This section is empty.
Types ¶
type Account ¶
type Account struct {
User
Password string
TOTPSecret []byte // encrypted; nil until an authenticator app is set up
Passkeys int
}
Account is a user with what is needed to log them in.
func (Account) HasSecondFactor ¶
HasSecondFactor reports whether the account has an authenticator app or a passkey. Until it does, the panel only lets it set one up.
type App ¶
type App struct {
ID string
Source string
Image string // for SourceImage
Repo string // owner/name, for SourceGitHub
Branch string
Port int
Domain string
MemoryMB int64
CPUs float64
// AutoDeploy deploys each push to the branch, for SourceGitHub.
AutoDeploy bool
// HealthPath is what the health check asks for, when the app has a
// domain.
HealthPath string
// TestCommand runs the app's tests; empty means none. TestSet is false
// until it has been decided, by a build's suggestion or by the user.
TestCommand string
TestSet bool
// Stopped is set when the user stopped the app.
Stopped bool
// The user's own commands; empty means what the build chose.
BuildCommand string
StartCommand string
// Detected is what the last build chose.
Detected Detected
// RestartPulls makes a restart build the branch's newest commit.
RestartPulls bool
// Engine is set for a database: postgres, mariadb or redis, in the
// major version EngineVersion.
Engine string
EngineVersion string
CreatedAt time.Time
}
App is something Zelie keeps running.
func (App) IsDatabase ¶
IsDatabase reports whether the app is one of Zelie's databases.
type Backup ¶
type Backup struct {
ID int64
AppID string
Engine string // what the app was when it was made; empty for volumes
Reason string
State string
File string // the core's name for it, once made
Bytes int64
Error *msg.Msg // why it failed
// For a backup of volumes: the folders in it, how much its files take
// and how many changed while they were copied.
Volumes []string
Size int64
Changed int
// For an uploaded dump: what was changed so it loads here, by kind.
Adapted map[string]int
CreatedAt time.Time
FinishedAt time.Time // zero while running
KeepUntil time.Time
RestoredAt time.Time // zero if it was never put back
// The off-site copy: its state (empty when there is none), why it
// failed, how often it was tried, when it was sent or is tried
// again, and until when it is kept.
Offsite string
OffsiteError *msg.Msg
OffsiteTries int
OffsiteAt time.Time
OffsiteUntil time.Time
// Local is false once only the off-site copy is left.
Local bool
}
Backup is one backup, made or tried.
type BackupPlan ¶
type BackupPlan struct {
AppID string
Enabled bool
Minute int // of the day, in the server's time zone
KeepDays int
// Stop stops an app for its volume backup instead of copying the
// files while it runs.
Stop bool
// Offsite sends each backup to the off-site storage, when there is
// one, where it is kept for OffsiteDays.
Offsite bool
OffsiteDays int
}
BackupPlan says when an app is backed up and for how long its backups are kept.
func AppBackupPlan ¶
func AppBackupPlan(app string) BackupPlan
AppBackupPlan is what an app has until its plan is changed: the same hours, but off, since volumes such as game worlds can be large.
func DefaultBackupPlan ¶
func DefaultBackupPlan(app string) BackupPlan
DefaultBackupPlan is what a new database gets: every night at three, kept for a week.
type Deployment ¶
type Deployment struct {
ID int64
AppID string
Version string // a branch until the commit is known
Image string
Cause string
Message string // first line of the pushed commit's message
Pruned bool // its image was deleted
State string
Error *msg.Msg // why it failed
CreatedAt time.Time
FinishedAt time.Time // zero while in progress
}
Deployment is one attempt to put a version of an app live.
type Detected ¶
type Detected struct {
Builder string `json:"builder,omitempty"` // dockerfile or railpack
Build string `json:"build,omitempty"`
Start string `json:"start,omitempty"`
}
Detected is how the last build built an app.
type EnvVar ¶
EnvVar is one environment variable of an app. For a secret one, Value is sealed for the core and the panel cannot read it.
type ExternalAccess ¶
ExternalAccess is a database open to desktop tools on a loopback port.
type GitHubApp ¶
type GitHubApp struct {
AppID int64
Slug string
Owner string
HTMLURL string
BaseURL string
Key []byte
WebhookSecret []byte
CreatedAt time.Time
}
GitHubApp is the panel's own GitHub App. Key and WebhookSecret are encrypted with the panel key; the store never sees them in the clear.
type KeptVolume ¶ added in v0.3.0
type KeptVolume struct {
ID int64
Name string
AppID string
Path string
LimitMB int64
Version string // the engine version the files belong to
KeptAt time.Time
}
KeptVolume is a database's volume from before an upgrade.
type Link ¶
type Link struct {
AppID, DBID string
// Prefix starts the names of the variables the app gets, so one app
// can have several databases.
Prefix string
CreatedAt time.Time
}
Link connects an app to a database.
type Passkey ¶
type Passkey struct {
ID []byte
UserID int64
Name string
Credential []byte // JSON, owned by the WebAuthn code
CreatedAt time.Time
UsedAt time.Time // zero if never used to log in
}
Passkey is a WebAuthn credential registered to an account.
type Session ¶
type Session struct {
Hash []byte
UserID int64
Verified bool // the second factor has been checked
CreatedAt time.Time
SeenAt time.Time
ExpiresAt time.Time
ConfirmedAt time.Time // last time the user proved it was them
IP string
Agent string
}
Session is a logged-in browser. Hash is the SHA-256 of the cookie value.
type Store ¶
type Store struct {
// contains filtered or unexported fields
}
Store is the panel's database.
func (*Store) AccountByEmail ¶
func (*Store) AccountByID ¶
func (*Store) AddFoundBackup ¶
AddFoundBackup records a backup found in off-site storage, kept there until offsite_until and not here.
func (*Store) BackupFiles ¶
BackupFiles returns every backup file on record, as app/file.
func (*Store) BackupPlan ¶
BackupPlan returns an app's plan, or ErrNotFound when it has none.
func (*Store) BackupPlans ¶
func (s *Store) BackupPlans(ctx context.Context) ([]BackupPlan, error)
BackupPlans returns every plan.
func (*Store) Backups ¶
Backups returns an app's backups, newest first. With app empty, it returns every backup whose app no longer exists.
func (*Store) ConfirmSession ¶
ConfirmSession records that the user proved it was them again.
func (*Store) CreateDeployment ¶
CreateDeployment adds d as a queued deployment and returns its id.
func (*Store) CreateFirstAdmin ¶
func (s *Store) CreateFirstAdmin(ctx context.Context, tokenHash []byte, email, password string, now time.Time) (User, error)
CreateFirstAdmin spends the setup token and creates the first administrator. Once it succeeds, setup is closed.
func (*Store) CreateVolume ¶
CreateVolume saves a new volume under a new name for the core.
func (*Store) DeleteExpiredSessions ¶
DeleteExpiredSessions keeps the table from growing forever.
func (*Store) DeleteKeptVolume ¶ added in v0.3.0
func (*Store) DeleteLink ¶
func (*Store) DeleteOtherSessions ¶
DeleteOtherSessions ends every session of the account except keep.
func (*Store) DeletePasskey ¶
DeletePasskey removes a passkey, unless it is the account's last second factor.
func (*Store) DeleteUserSession ¶
DeleteUserSession ends one of an account's sessions. The account is part of the query so no one can end another account's session.
func (*Store) DeleteVolume ¶
func (*Store) Deployment ¶
func (*Store) Deployments ¶
Deployments lists an app's most recent deployments, newest first.
func (*Store) DropOffsiteQueue ¶
DropOffsiteQueue forgets the backups still waiting to be sent, when there is no longer anywhere to send them.
func (*Store) ExpiredBackups ¶
ExpiredBackups returns the backups whose file here is due to go. The newest backup made of an app that still exists is never among them: if backups stop working, the last good one stays.
func (*Store) ExpiredOffsite ¶
ExpiredOffsite returns the backups left only off-site whose time is up there too.
func (*Store) ExternalAccess ¶
ExternalAccess returns the database's, or ErrNotFound.
func (*Store) ExternalAccesses ¶
func (s *Store) ExternalAccesses(ctx context.Context) ([]ExternalAccess, error)
ExternalAccesses lists every database open to desktop tools.
func (*Store) FailUnfinished ¶
FailUnfinished marks deployments that were in progress when the panel stopped as failed. The panel calls it on start.
func (*Store) FailUnfinishedBackups ¶
FailUnfinishedBackups marks backups that were running when the panel stopped as failed. The panel calls it on start.
func (*Store) FinishBackup ¶
func (s *Store) FinishBackup(ctx context.Context, id int64, file string, bytes int64, failure *msg.Msg, at time.Time) error
FinishBackup records how a backup ended: with a file, or with why not.
func (*Store) FirstDelivery ¶
FirstDelivery records a webhook delivery id and reports whether it is new.
func (*Store) GoLive ¶
GoLive makes d the app's live deployment and marks the one before it replaced, in one step.
func (*Store) KeepVolume ¶ added in v0.3.0
func (s *Store) KeepVolume(ctx context.Context, v Volume, version string, now time.Time) (KeptVolume, error)
KeepVolume takes v off its app and keeps it as the data of version.
func (*Store) KeptVolumes ¶ added in v0.3.0
KeptVolumes lists an app's kept volumes, newest first; appID "" lists every app's.
func (*Store) Links ¶
Links returns the databases an app is linked to, or with appID empty, the apps linked to the database dbID.
func (*Store) LiveDeployment ¶
LiveDeployment returns the deployment serving an app, if any.
func (*Store) LiveDeployments ¶ added in v0.3.0
func (s *Store) LiveDeployments(ctx context.Context) ([]Deployment, error)
LiveDeployments returns the live deployment of every app.
func (*Store) OffsiteDue ¶
OffsiteDue returns the backups to send now, oldest first.
func (*Store) OffsiteFailedAt ¶
func (s *Store) OffsiteFailedAt(ctx context.Context, id int64, failure msg.Msg, tries int, next time.Time) error
OffsiteFailedAt records a failed send, to be tried again at next.
func (*Store) OffsiteSent ¶
OffsiteSent records that a backup's copy is off-site.
func (*Store) PushTargets ¶
PushTargets lists the apps that deploy pushes to a repository's branch. GitHub names are case-insensitive.
func (*Store) RecoveryCodesLeft ¶
RecoveryCodesLeft counts the account's unused recovery codes.
func (*Store) RecoverySavedAt ¶
RecoverySavedAt returns when the backup recovery file was last saved, or the zero time.
func (*Store) RemoveExternalAccess ¶
func (*Store) RemoveTOTP ¶
RemoveTOTP turns off the authenticator app, unless the account has no passkey to fall back on.
func (*Store) SendOffsite ¶
SendOffsite marks a backup to be sent now, and kept off-site until.
func (*Store) SetAdapted ¶
SetAdapted records what an uploaded dump needed changed to load here.
func (*Store) SetBackupContents ¶
func (s *Store) SetBackupContents(ctx context.Context, id int64, volumes []string, size int64, changed int) error
SetBackupContents records what a volume backup holds.
func (*Store) SetBackupPlan ¶
func (s *Store) SetBackupPlan(ctx context.Context, p BackupPlan) error
SetBackupPlan saves a plan. Backups already made are kept for the new numbers of days, counted from when each was made.
func (*Store) SetDeployment ¶
SetDeployment records progress. Ending states also set the finish time.
func (*Store) SetDeploymentImage ¶ added in v0.3.0
SetDeploymentImage records the image a deployment runs.
func (*Store) SetDetected ¶
SetDetected records how the last build built the app.
func (*Store) SetEngineVersion ¶ added in v0.3.0
SetEngineVersion moves a database to another version of its engine.
func (*Store) SetExternalAccess ¶
func (s *Store) SetExternalAccess(ctx context.Context, x ExternalAccess) error
SetExternalAccess saves the database's port. ErrExists means another database has it.
func (*Store) SetGitHubApp ¶
SetGitHubApp saves the App, replacing the one before, if any.
func (*Store) SetLocal ¶
SetLocal records whether a backup's file is here. One brought back from off-site is kept here until keep.
func (*Store) SetPassword ¶
SetPassword replaces the account's password hash.
func (*Store) SetPruned ¶
SetPruned records that an image was deleted, for every deployment that used it.
func (*Store) SetRecoveryCodes ¶
SetRecoveryCodes replaces the account's recovery codes.
func (*Store) SetRecoverySaved ¶
func (*Store) SetRestored ¶
SetRestored records that a backup was put back.
func (*Store) SetSetupToken ¶
SetSetupToken replaces the setup token. Only the hash of the token is kept.
func (*Store) SetStopped ¶
SetStopped records whether the user stopped the app.
func (*Store) SetTOTP ¶
SetTOTP stores an encrypted authenticator secret. step is the time step of the code that confirmed it, which may not be used again.
func (*Store) StartBackup ¶
StartBackup records a backup that is about to be made and returns its id.
func (*Store) SuggestTest ¶
SuggestTest stores a build's suggested test command, unless one was decided already. It reports whether it was stored.
func (*Store) TouchSession ¶
TouchSession records activity and moves the expiry.
func (*Store) UnkeepVolume ¶ added in v0.3.0
UnkeepVolume gives a kept volume back to its app, which must have no other volume at its path.
func (*Store) Unpruned ¶
Unpruned lists the app's deployments that still have an image, newest first.
func (*Store) UpdateApp ¶
UpdateApp saves everything about an app except its id, source and creation time.
func (*Store) UpdatePasskey ¶
UpdatePasskey saves the credential after a login, which carries the authenticator's new signature counter.
func (*Store) UpdateVolume ¶
UpdateVolume changes where the app sees a volume and how large it may grow.
func (*Store) UseRecoveryCode ¶
UseRecoveryCode spends a recovery code. It reports false if the code is wrong or already used.
func (*Store) UseTOTPStep ¶
UseTOTPStep records that a code from this time step was used. It fails if a code from the same or a later step was used before, which stops a code that was seen over someone's shoulder from being replayed.
func (*Store) VerifySession ¶
VerifySession marks the second factor as checked. Finishing a login also counts as confirming.