Skip to content

Commit

Permalink
pam/gdm: Use debug assertions only during tests
Browse files Browse the repository at this point in the history
We may want to enable some checks only during checks or debug builds to
be used in integration tests, so let's abstract things a bit more by
exposing some features at runtime only.

This allows to generate normal builds without debug checks but at the
same time, to avoid having to define special build tags when testing,
leaving the room for using special tags for building different binaries
for integration tests or local debugging.
  • Loading branch information
3v1n0 committed Dec 15, 2023
1 parent 09ac43c commit 67503f3
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 15 deletions.
6 changes: 6 additions & 0 deletions pam/gdm/export_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package gdm

func init() {
checkMembersFunc = checkMembersDebug
validateJSONFunc = validateJSONDebug
}
14 changes: 9 additions & 5 deletions pam/gdm/extension.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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
Expand Down
24 changes: 14 additions & 10 deletions pam/gdm/protocol.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -66,14 +64,20 @@ 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 {
case DataType_unknownType:
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
}

Expand All @@ -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
}

Expand All @@ -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
}

Expand All @@ -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 {
Expand Down

0 comments on commit 67503f3

Please sign in to comment.