Files
zeekay 241625e7d9 rename: ziti → zt across all paths
- Repo names: ziti-* → zt-*
- Go modules: github.com/hanzozt/ziti → github.com/hanzozt/zt
- Docker images: hanzozt/ziti-* → hanzozt/zt-*
- C/Java/JS symbols: ziti_* → zt_*
- File and directory names updated
2026-02-18 18:34:19 -08:00

81 lines
1.9 KiB
Go

package posture
import (
"fmt"
"time"
"github.com/hanzozt/zt/v2/common/pb/edge_ctrl_pb"
"github.com/pkg/errors"
)
const (
NoTimeout = int64(-1)
PromptGracePeriod = 5 * time.Minute
)
type MfaCheck struct {
*edge_ctrl_pb.DataState_PostureCheck
*edge_ctrl_pb.DataState_PostureCheck_Mfa
}
func (m *MfaCheck) Evaluate(state *InstanceData) *CheckError {
now := time.Now()
if state == nil {
return &CheckError{
Id: m.Id,
Name: m.Name,
Cause: NilStateError,
}
}
if state.PassedMfaAt == nil {
return &CheckError{
Id: m.Id,
Name: m.Name,
Cause: errors.New("MFA has never been passed"),
}
}
if m.TimeoutSeconds != NoTimeout {
timeout := time.Duration(m.TimeoutSeconds) * time.Second
timedOut := state.PassedMfaAt.Add(timeout).Before(time.Now())
if timedOut {
return &CheckError{
Id: m.Id,
Name: m.Name,
Cause: fmt.Errorf("last MFA check exceeded timeout of %s, last mfa at %s, checked at %s", timeout.String(), state.PassedMfaAt.String(), now.String()),
}
}
}
if m.PromptOnWake {
wokenAt := state.Woken.Time.AsTime()
wokenGraceEndsAt := wokenAt.Add(PromptGracePeriod)
if now.After(wokenGraceEndsAt) {
return &CheckError{
Id: m.Id,
Name: m.Name,
Cause: fmt.Errorf("MFA not resupplied during grace period, woken at %s, grace period: %s, supplied at %s, checked at: %s", wokenAt.String(), PromptGracePeriod.String(), state.PassedMfaAt.String(), now.String()),
}
}
}
if m.PromptOnUnlock {
unlockedAt := state.Unlocked.Time.AsTime()
unlockedGraceEndsAt := unlockedAt.Add(PromptGracePeriod)
if now.After(unlockedGraceEndsAt) {
return &CheckError{
Id: m.Id,
Name: m.Name,
Cause: fmt.Errorf("MFA not resupplied during grace period, unlocked at %s, grace period: %s, supplied at %s, checked at: %s", unlockedAt.String(), PromptGracePeriod.String(), state.PassedMfaAt.String(), now.String()),
}
}
}
return nil
}