Skip to content

Commit

Permalink
Marshal SAMLForceAuthn to/from string/bool.
Browse files Browse the repository at this point in the history
  • Loading branch information
Joerger committed Oct 30, 2024
1 parent 3922335 commit ca0e6af
Showing 1 changed file with 112 additions and 0 deletions.
112 changes: 112 additions & 0 deletions api/types/mfa.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ package types

import (
"bytes"
"encoding/json"
"strings"
"time"

"github.com/gogo/protobuf/jsonpb"
Expand Down Expand Up @@ -173,3 +175,113 @@ func (d *MFADevice) UnmarshalJSON(buf []byte) error {
err := unmarshaler.Unmarshal(bytes.NewReader(buf), d)
return trace.Wrap(err)
}

// MarshalJSON marshals SAMLForceAuthn to string.
func (s *SAMLForceAuthn) MarshalYAML() (interface{}, error) {
val, err := s.encode()
if err != nil {
return nil, trace.Wrap(err)
}
return val, nil
}

// UnmarshalYAML supports parsing SAMLForceAuthn from string.
func (s *SAMLForceAuthn) UnmarshalYAML(unmarshal func(interface{}) error) error {
var val interface{}
err := unmarshal(&val)
if err != nil {
return trace.Wrap(err)
}

err = s.decode(val)
return trace.Wrap(err)
}

// MarshalJSON marshals SAMLForceAuthn to string.
func (s *SAMLForceAuthn) MarshalJSON() ([]byte, error) {
val, err := s.encode()
if err != nil {
return nil, trace.Wrap(err)
}
out, err := json.Marshal(val)
return out, trace.Wrap(err)
}

// UnmarshalJSON supports parsing SAMLForceAuthn from string.
func (s *SAMLForceAuthn) UnmarshalJSON(data []byte) error {
var val interface{}
err := json.Unmarshal(data, &val)
if err != nil {
return trace.Wrap(err)
}

err = s.decode(val)
return trace.Wrap(err)
}

const (
// SAMLForceAuthnOTPString is the string representation of SAMLForceAuthn_SECOND_FACTOR_TYPE_OTP
SAMLForceAuthnOTPString = "otp"
// SAMLForceAuthnWebauthnString is the string representation of SAMLForceAuthn_SECOND_FACTOR_TYPE_WEBAUTHN
SAMLForceAuthnWebauthnString = "webauthn"
// SAMLForceAuthnSSOString is the string representation of SAMLForceAuthn_SECOND_FACTOR_TYPE_SSO
SAMLForceAuthnSSOString = "sso"
)

func (s *SAMLForceAuthn) encode() (string, error) {
switch *s {
case SAMLForceAuthn_FORCE_AUTHN_UNSPECIFIED:
return "", nil
case SAMLForceAuthn_FORCE_AUTHN_NO:
return "no", nil
case SAMLForceAuthn_FORCE_AUTHN_YES:
return "yes", nil
default:
return "", trace.BadParameter("SAMLForceAuthn invalid value %v", *s)
}
}

func (s *SAMLForceAuthn) decode(val any) error {
switch v := val.(type) {
case string:
// try parsing as a boolean
switch strings.ToLower(v) {
case "":
*s = SAMLForceAuthn_FORCE_AUTHN_UNSPECIFIED
case "yes", "yeah", "y", "true", "1", "on":
*s = SAMLForceAuthn_FORCE_AUTHN_YES
case "no", "nope", "n", "false", "0", "off":
*s = SAMLForceAuthn_FORCE_AUTHN_NO
default:
return trace.BadParameter("SAMLForceAuthn invalid value %v", val)
}
case bool:
if v {
*s = SAMLForceAuthn_FORCE_AUTHN_YES
} else {
*s = SAMLForceAuthn_FORCE_AUTHN_NO
}
case int32:
return trace.Wrap(s.setFromEnum(v))
case int64:
return trace.Wrap(s.setFromEnum(int32(v)))
case int:
return trace.Wrap(s.setFromEnum(int32(v)))
case float64:
return trace.Wrap(s.setFromEnum(int32(v)))
case float32:
return trace.Wrap(s.setFromEnum(int32(v)))
default:
return trace.BadParameter("SAMLForceAuthn invalid type %T", val)
}
return nil
}

// setFromEnum sets the value from enum value as int32.
func (s *SAMLForceAuthn) setFromEnum(val int32) error {
if _, ok := SAMLForceAuthn_name[val]; !ok {
return trace.BadParameter("invalid SAMLForceAuthn enum %v", val)
}
*s = SAMLForceAuthn(val)
return nil
}

0 comments on commit ca0e6af

Please sign in to comment.