mirror of
https://github.com/hanzozt/zt.git
synced 2026-10-30 15:04:55 +00:00
- 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
81 lines
1.9 KiB
Go
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
|
|
}
|