lib/api/members/members_client/compound_auth.go

68 lines
2.0 KiB
Go

// (c) 2012-2020 by Taxnexus, Inc.
// All rights reserved worldwide.
// Proprietary product; unlicensed use is not allowed
package members_client
import (
"errors"
"fmt"
"github.com/go-openapi/runtime"
"github.com/go-openapi/strfmt"
)
const maxCredentialLength = 8192
// NewMembersCompoundAuth returns the auth writer required by governed Members
// operations: a service API key plus the active human kvSession cookie.
//
// Credential values are retained only inside the returned closure. Validation
// errors identify the invalid field without including its value.
func NewMembersCompoundAuth(apiKey, sessionToken string) (runtime.ClientAuthInfoWriter, error) {
if err := validateHeaderCredential("Members API key", apiKey); err != nil {
return nil, err
}
if err := validateCookieCredential("Members session token", sessionToken); err != nil {
return nil, err
}
return runtime.ClientAuthInfoWriterFunc(func(request runtime.ClientRequest, _ strfmt.Registry) error {
if err := request.SetHeaderParam("X-API-Key", apiKey); err != nil {
return fmt.Errorf("set Members API key header: %w", err)
}
if err := request.SetHeaderParam("Cookie", "kvSession="+sessionToken); err != nil {
return fmt.Errorf("set Members session cookie: %w", err)
}
return nil
}), nil
}
func validateHeaderCredential(name, value string) error {
if value == "" {
return fmt.Errorf("%s is required", name)
}
if len(value) > maxCredentialLength {
return fmt.Errorf("%s exceeds the maximum length", name)
}
for index := 0; index < len(value); index++ {
if value[index] < 0x21 || value[index] > 0x7e {
return fmt.Errorf("%s contains an invalid header byte", name)
}
}
return nil
}
func validateCookieCredential(name, value string) error {
if err := validateHeaderCredential(name, value); err != nil {
return err
}
for index := 0; index < len(value); index++ {
character := value[index]
if character == '"' || character == ',' || character == ';' || character == '\\' {
return errors.New(name + " contains an invalid cookie byte")
}
}
return nil
}