mirror of https://github.com/vernonkeenan/lib
68 lines
2.0 KiB
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
|
||
|
|
}
|