| 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"` |
| } |