blob: 2b375dab27bd585fd9e5b6ba8fe3907fa54cc985 [file] [log] [blame]
package mstypes
import (
"bytes"
"errors"
"gopkg.in/jcmturner/rpc.v1/ndr"
)
// Compression format assigned numbers.
const (
CompressionFormatNone uint16 = 0
CompressionFormatLZNT1 uint16 = 2
CompressionFormatXPress uint16 = 3
CompressionFormatXPressHuff uint16 = 4
)
// ClaimsSourceTypeAD https://msdn.microsoft.com/en-us/library/hh553809.aspx
const ClaimsSourceTypeAD uint16 = 1
// Claim Type assigned numbers
const (
ClaimTypeIDInt64 uint16 = 1
ClaimTypeIDUInt64 uint16 = 2
ClaimTypeIDString uint16 = 3
ClaimsTypeIDBoolean uint16 = 6
)
// ClaimsBlob implements https://msdn.microsoft.com/en-us/library/hh554119.aspx
type ClaimsBlob struct {
Size uint32
EncodedBlob EncodedBlob
}
// EncodedBlob are the bytes of the encoded Claims
type EncodedBlob []byte
// Size returns the size of the bytes of the encoded Claims
func (b EncodedBlob) Size(c interface{}) int {
cb := c.(ClaimsBlob)
return int(cb.Size)
}
// ClaimsSetMetadata implements https://msdn.microsoft.com/en-us/library/hh554073.aspx
type ClaimsSetMetadata struct {
ClaimsSetSize uint32
ClaimsSetBytes []byte `ndr:"pointer,conformant"`
CompressionFormat uint16 // Enum see constants for options
UncompressedClaimsSetSize uint32
ReservedType uint16
ReservedFieldSize uint32
ReservedField []byte `ndr:"pointer,conformant"`
}
// ClaimsSet reads the ClaimsSet type from the NDR encoded ClaimsSetBytes in the ClaimsSetMetadata
func (m *ClaimsSetMetadata) ClaimsSet() (c ClaimsSet, err error) {
if len(m.ClaimsSetBytes) < 1 {
err = errors.New("no bytes available for ClaimsSet")
return
}
// TODO switch statement to decompress ClaimsSetBytes
if m.CompressionFormat != CompressionFormatNone {
err = errors.New("compressed ClaimsSet not currently supported")
return
}
dec := ndr.NewDecoder(bytes.NewReader(m.ClaimsSetBytes))
err = dec.Decode(&c)
return
}
// ClaimsSet implements https://msdn.microsoft.com/en-us/library/hh554122.aspx
type ClaimsSet struct {
ClaimsArrayCount uint32
ClaimsArrays []ClaimsArray `ndr:"pointer,conformant"`
ReservedType uint16
ReservedFieldSize uint32
ReservedField []byte `ndr:"pointer,conformant"`
}
// ClaimsArray implements https://msdn.microsoft.com/en-us/library/hh536458.aspx
type ClaimsArray struct {
ClaimsSourceType uint16
ClaimsCount uint32
ClaimEntries []ClaimEntry `ndr:"pointer,conformant"`
}
// ClaimEntry is a NDR union that implements https://msdn.microsoft.com/en-us/library/hh536374.aspx
type ClaimEntry struct {
ID string `ndr:"pointer,conformant,varying"`
Type uint16 `ndr:"unionTag"`
TypeInt64 ClaimTypeInt64 `ndr:"unionField"`
TypeUInt64 ClaimTypeUInt64 `ndr:"unionField"`
TypeString ClaimTypeString `ndr:"unionField"`
TypeBool ClaimTypeBoolean `ndr:"unionField"`
}
// SwitchFunc is the ClaimEntry union field selection function
func (u ClaimEntry) SwitchFunc(_ interface{}) string {
switch u.Type {
case ClaimTypeIDInt64:
return "TypeInt64"
case ClaimTypeIDUInt64:
return "TypeUInt64"
case ClaimTypeIDString:
return "TypeString"
case ClaimsTypeIDBoolean:
return "TypeBool"
}
return ""
}
// ClaimTypeInt64 is a claim of type int64
type ClaimTypeInt64 struct {
ValueCount uint32
Value []int64 `ndr:"pointer,conformant"`
}
// ClaimTypeUInt64 is a claim of type uint64
type ClaimTypeUInt64 struct {
ValueCount uint32
Value []uint64 `ndr:"pointer,conformant"`
}
// ClaimTypeString is a claim of type string
type ClaimTypeString struct {
ValueCount uint32
Value []LPWSTR `ndr:"pointer,conformant"`
}
// ClaimTypeBoolean is a claim of type bool
type ClaimTypeBoolean struct {
ValueCount uint32
Value []bool `ndr:"pointer,conformant"`
}