diff --git a/pam/gdm/export_test.go b/pam/gdm/export_test.go new file mode 100644 index 000000000..0438841fe --- /dev/null +++ b/pam/gdm/export_test.go @@ -0,0 +1,6 @@ +package gdm + +func init() { + checkMembersFunc = checkMembersDebug + validateJSONFunc = validateJSONDebug +} diff --git a/pam/gdm/extension.go b/pam/gdm/extension.go index f6af5a1d4..0963a7ff3 100644 --- a/pam/gdm/extension.go +++ b/pam/gdm/extension.go @@ -35,15 +35,19 @@ var ErrProtoNotSupported = errors.New("protocol not supported") // ErrInvalidJSON is an error used when processed JSON is not valid. var ErrInvalidJSON = errors.New("invalid JSON") -func validateJSON(jsonValue []byte) error { - // FIXME: Disable this check in GDM builds, this is only useful - // for testing as GDM does JSON sanity check by default. +func validateJSONDebug(jsonValue []byte) error { if !json.Valid(jsonValue) { return ErrInvalidJSON } return nil } +func validateJSONDisabled(jsonValue []byte) error { + return nil +} + +var validateJSONFunc = validateJSONDisabled + // IsPamExtensionSupported returns if the provided extension is supported func IsPamExtensionSupported(extension string) bool { cExtension := C.CString(extension) @@ -78,7 +82,7 @@ func allocateJSONProtoMessage() *jsonProtoMessage { } func newJSONProtoMessage(jsonValue []byte) (*jsonProtoMessage, error) { - if err := validateJSON(jsonValue); err != nil { + if err := validateJSONFunc(jsonValue); err != nil { return nil, err } msg := allocateJSONProtoMessage() @@ -126,7 +130,7 @@ func (msg *jsonProtoMessage) JSON() ([]byte, error) { jsonLen := C.strlen(msg.json) jsonValue := C.GoBytes(unsafe.Pointer(msg.json), C.int(jsonLen)) - if err := validateJSON(jsonValue); err != nil { + if err := validateJSONFunc(jsonValue); err != nil { return nil, err } return jsonValue, nil diff --git a/pam/gdm/protocol.go b/pam/gdm/protocol.go index 3e53a68ae..e8b646eea 100644 --- a/pam/gdm/protocol.go +++ b/pam/gdm/protocol.go @@ -40,9 +40,7 @@ func NewDataFromJSON(bytes []byte) (*Data, error) { return &gdmData, nil } -// FIXME: Do not do this when building the module in release mode, this is -// just relevant for testing purposes. -func (d *Data) checkMembers(acceptedMembers []string) error { +func checkMembersDebug(d *Data, acceptedMembers []string) error { //nolint:govet //We only redirect the value to figure out its type. val := reflect.ValueOf(*d) typ := val.Type() @@ -66,6 +64,12 @@ func (d *Data) checkMembers(acceptedMembers []string) error { return nil } +func checkMembersDisabled(d *Data, acceptedMembers []string) error { + return nil +} + +var checkMembersFunc = checkMembersDisabled + // Check allows to check the sanity of a data value. func (d *Data) Check() error { switch d.Type { @@ -73,7 +77,7 @@ func (d *Data) Check() error { return fmt.Errorf("unexpected type %v", d.Type.String()) case DataType_hello: - if err := d.checkMembers([]string{"Hello"}); err != nil { + if err := checkMembersFunc(d, []string{"Hello"}); err != nil { return err } @@ -90,12 +94,12 @@ func (d *Data) Check() error { if d.Event.Data == nil { return fmt.Errorf("missing event data") } - if err := d.checkMembers([]string{"Event"}); err != nil { + if err := checkMembersFunc(d, []string{"Event"}); err != nil { return err } case DataType_eventAck: - if err := d.checkMembers([]string{}); err != nil { + if err := checkMembersFunc(d, []string{}); err != nil { return err } @@ -109,7 +113,7 @@ func (d *Data) Check() error { if _, ok := RequestType_name[int32(d.Request.Type)]; !ok { return fmt.Errorf("unexpected request type %v", d.Request.Type) } - if err := d.checkMembers([]string{"Request"}); err != nil { + if err := checkMembersFunc(d, []string{"Request"}); err != nil { return err } @@ -123,17 +127,17 @@ func (d *Data) Check() error { if _, ok := RequestType_name[int32(d.Response.Type)]; !ok { return fmt.Errorf("unexpected request type %v", d.Response.Type) } - if err := d.checkMembers([]string{"Response"}); err != nil { + if err := checkMembersFunc(d, []string{"Response"}); err != nil { return err } case DataType_poll: - if err := d.checkMembers([]string{}); err != nil { + if err := checkMembersFunc(d, []string{}); err != nil { return err } case DataType_pollResponse: - if err := d.checkMembers([]string{"PollResponse"}); err != nil { + if err := checkMembersFunc(d, []string{"PollResponse"}); err != nil { return err } for i, response := range d.PollResponse {