1package mstypes
2
3import (
4	"bytes"
5	"compress/flate"
6	"encoding/hex"
7	"io/ioutil"
8	"testing"
9	"unicode/utf8"
10
11	"github.com/jcmturner/rpc/v2/ndr"
12	"github.com/stretchr/testify/assert"
13)
14
15const (
16	ClientClaimsInfoStr       = "01100800cccccccc000100000000000000000200d80000000400020000000000d8000000000000000000000000000000d800000001100800ccccccccc80000000000000000000200010000000400020000000000000000000000000001000000010000000100000008000200010000000c000200030003000100000010000200290000000000000029000000610064003a002f002f006500780074002f00730041004d004100630063006f0075006e0074004e0061006d0065003a0038003800640035006400390030003800350065006100350063003000630030000000000001000000140002000a000000000000000a00000074006500730074007500730065007200310000000000000000000000"
17	ClientClaimsInfoInt       = "01100800cccccccce00000000000000000000200b80000000400020000000000b8000000000000000000000000000000b800000001100800cccccccca80000000000000000000200010000000400020000000000000000000000000001000000010000000100000008000200010000000c0002000100010001000000100002002a000000000000002a000000610064003a002f002f006500780074002f006d007300440053002d0053007500700070006f00720074006500640045003a0038003800640035006400650061003800660031006100660035006600310039000000010000001c0000000000000000000000"
18	ClientClaimsInfoMulti     = "01100800cccccccc780100000000000000000200500100000400020000000000500100000000000000000000000000005001000001100800cccccccc400100000000000000000200010000000400020000000000000000000000000001000000010000000200000008000200020000000c000200010001000100000010000200140002000300030001000000180002002a000000000000002a000000610064003a002f002f006500780074002f006d007300440053002d0053007500700070006f00720074006500640045003a0038003800640035006400650061003800660031006100660035006600310039000000010000001c00000000000000290000000000000029000000610064003a002f002f006500780074002f00730041004d004100630063006f0075006e0074004e0061006d0065003a00380038006400350064003900300038003500650061003500630030006300300000000000010000001c0002000a000000000000000a000000740065007300740075007300650072003100000000000000"
19	ClientClaimsInfoMultiUint = "01100800ccccccccf00000000000000000000200c80000000400020000000000c8000000000000000000000000000000c800000001100800ccccccccb80000000000000000000200010000000400020000000000000000000000000001000000010000000100000008000200010000000c000200020002000400000010000200260000000000000026000000610064003a002f002f006500780074002f006f0062006a0065006300740043006c006100730073003a00380038006400350064006500370039003100650037006200320037006500360000000400000009000a000000000007000100000000000600010000000000000001000000000000000000"
20	ClientClaimsInfoMultiStr  = "01100800cccccccc480100000000000000000200200100000400020000000000200100000000000000000000000000002001000001100800cccccccc100100000000000000000200010000000400020000000000000000000000000001000000010000000100000008000200010000000c000200030003000400000010000200270000000000000027000000610064003a002f002f006500780074002f006f00740068006500720049007000500068006f006e0065003a003800380064003500640065003900660036006200340061006600390038003500000000000400000014000200180002001c000200200002000500000000000000050000007300740072003100000000000500000000000000050000007300740072003200000000000500000000000000050000007300740072003300000000000500000000000000050000007300740072003400000000000000000000000000"
21
22	ClaimsEntryIDStr            = "ad://ext/sAMAccountName:88d5d9085ea5c0c0"
23	ClaimsEntryValueStr         = "testuser1"
24	ClaimsEntryIDInt64          = "ad://ext/msDS-SupportedE:88d5dea8f1af5f19"
25	ClaimsEntryValueInt64 int64 = 28
26	ClaimsEntryIDUInt64         = "ad://ext/objectClass:88d5de791e7b27e6"
27
28	ClaimsSetBytesCompressionFormatXPressHuff = "738788888708080007000800080007000880088808088880886687888607080000808800800000000880000000000000806667080808787707767800080000000000000000000000000000000000000000000000080000000000000000000000000000000000080000000000000000000000000000000000000000000000000057000800800000007500000000000000050700000000000064760800080000008587007700000080650808000000000075888700000000700788000000000060677000000000007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e91f150e1ad792412496411f3904ff6027871529ef12043e4e79ab23c9f03aea65c0aca41e842b8d46f0321354538afe9f8c413b6e1a37377bca410ac8bc3b35398e51c0a290929e3ca764addf84e5ada9caa43c80c38de74d75cd0289a202641d26a950284dea25479c4376c3100720db619b9066d13c506c88a858a3305007490a40d7015a7528382a7c9ae54ab58204f01e1d8e044fee01925cbc46ad28cfa8d67c28e0216ce1de315aaaf43e4c88409002793b33a3823683680ce7d6606eca05f0cff9d06c88a0588dd5500d51de514570286fa148c007c699838d635b0b87ed420749011c94696fa202b002b0000"
29)
30
31func Test_TMP(t *testing.T) {
32	blz77huff, _ := hex.DecodeString("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8dc0000ff2601")
33	//b, _ := hex.DecodeString("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050555555555555555555554544040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8523ed794115be9195ff9d67cdf8d0400000000")
34	r := bytes.NewReader(blz77huff)
35	dr := flate.NewReader(r)
36	s, errr := ioutil.ReadAll(dr)
37	t.Logf("test: %s %v\n", string(s), errr)
38	ru, size := utf8.DecodeRuneInString("`")
39	t.Logf("%d %v\n", ru, size)
40}
41
42func Test_ClientClaimsInfoStr_Unmarshal(t *testing.T) {
43	b, _ := hex.DecodeString(ClientClaimsInfoStr)
44	m := new(ClaimsSetMetadata)
45	dec := ndr.NewDecoder(bytes.NewReader(b))
46	err := dec.Decode(m)
47	if err != nil {
48		t.Errorf("error decoding ClaimsSetMetadata %v", err)
49	}
50	k, err := m.ClaimsSet()
51	if err != nil {
52		t.Errorf("error retrieving ClaimsSet %v", err)
53	}
54	assert.Equal(t, uint32(1), k.ClaimsArrayCount, "claims array count not as expected")
55	assert.Equal(t, ClaimsSourceTypeAD, k.ClaimsArrays[0].ClaimsSourceType, "claims source type not as expected")
56	assert.Equal(t, uint32(1), k.ClaimsArrays[0].ClaimsCount, "claims count not as expected")
57	assert.Equal(t, uint16(3), k.ClaimsArrays[0].ClaimEntries[0].Type, "claims entry type not as expected")
58	assert.Equal(t, uint32(1), k.ClaimsArrays[0].ClaimEntries[0].TypeString.ValueCount, "claims value count not as expected")
59	assert.Equal(t, ClaimsEntryIDStr, k.ClaimsArrays[0].ClaimEntries[0].ID, "claims entry ID not as expected")
60	assert.Equal(t, []LPWSTR{{ClaimsEntryValueStr}}, k.ClaimsArrays[0].ClaimEntries[0].TypeString.Value, "claims value not as expected")
61	assert.Equal(t, CompressionFormatNone, m.CompressionFormat, "compression format not as expected")
62}
63
64func Test_ClientClaimsMultiValueUint_Unmarshal(t *testing.T) {
65	b, _ := hex.DecodeString(ClientClaimsInfoMultiUint)
66	m := new(ClaimsSetMetadata)
67	dec := ndr.NewDecoder(bytes.NewReader(b))
68	err := dec.Decode(m)
69	if err != nil {
70		t.Errorf("error decoding ClaimsSetMetadata %v", err)
71	}
72	k, err := m.ClaimsSet()
73	if err != nil {
74		t.Errorf("error retrieving ClaimsSet %v", err)
75	}
76
77	assert.Equal(t, uint32(1), k.ClaimsArrayCount, "claims array count not as expected")
78	assert.Equal(t, ClaimsSourceTypeAD, k.ClaimsArrays[0].ClaimsSourceType, "claims source type not as expected")
79	assert.Equal(t, uint32(1), k.ClaimsArrays[0].ClaimsCount, "claims count not as expected")
80	assert.Equal(t, ClaimTypeIDUInt64, k.ClaimsArrays[0].ClaimEntries[0].Type, "claims entry type not as expected")
81	assert.Equal(t, uint32(4), k.ClaimsArrays[0].ClaimEntries[0].TypeUInt64.ValueCount, "claims value count not as expected")
82	assert.Equal(t, ClaimsEntryIDUInt64, k.ClaimsArrays[0].ClaimEntries[0].ID, "claims entry ID not as expected")
83	assert.Equal(t, []uint64{655369, 65543, 65542, 65536}, k.ClaimsArrays[0].ClaimEntries[0].TypeUInt64.Value, "claims value not as expected")
84	assert.Equal(t, CompressionFormatNone, m.CompressionFormat, "compression format not as expected")
85}
86
87func Test_ClientClaimsInt_Unmarshal(t *testing.T) {
88	b, _ := hex.DecodeString(ClientClaimsInfoInt)
89	m := new(ClaimsSetMetadata)
90	dec := ndr.NewDecoder(bytes.NewReader(b))
91	err := dec.Decode(m)
92	if err != nil {
93		t.Errorf("error decoding ClaimsSetMetadata %v", err)
94	}
95	k, err := m.ClaimsSet()
96	if err != nil {
97		t.Errorf("error retrieving ClaimsSet %v", err)
98	}
99
100	assert.Equal(t, uint32(1), k.ClaimsArrayCount, "claims array count not as expected")
101	assert.Equal(t, ClaimsSourceTypeAD, k.ClaimsArrays[0].ClaimsSourceType, "claims source type not as expected")
102	assert.Equal(t, uint32(1), k.ClaimsArrays[0].ClaimsCount, "claims count not as expected")
103	assert.Equal(t, ClaimTypeIDInt64, k.ClaimsArrays[0].ClaimEntries[0].Type, "claims entry type not as expected")
104	assert.Equal(t, uint32(1), k.ClaimsArrays[0].ClaimEntries[0].TypeInt64.ValueCount, "claims value count not as expected")
105	assert.Equal(t, ClaimsEntryIDInt64, k.ClaimsArrays[0].ClaimEntries[0].ID, "claims entry ID not as expected")
106	assert.Equal(t, []int64{ClaimsEntryValueInt64}, k.ClaimsArrays[0].ClaimEntries[0].TypeInt64.Value, "claims value not as expected")
107	assert.Equal(t, CompressionFormatNone, m.CompressionFormat, "compression format not as expected")
108}
109
110func Test_ClientClaimsMultiValueStr_Unmarshal(t *testing.T) {
111	b, _ := hex.DecodeString(ClientClaimsInfoMultiStr)
112	m := new(ClaimsSetMetadata)
113	dec := ndr.NewDecoder(bytes.NewReader(b))
114	err := dec.Decode(m)
115	if err != nil {
116		t.Errorf("error decoding ClaimsSetMetadata %v", err)
117	}
118	k, err := m.ClaimsSet()
119	if err != nil {
120		t.Errorf("error retrieving ClaimsSet %v", err)
121	}
122
123	assert.Equal(t, uint32(1), k.ClaimsArrayCount, "claims array count not as expected")
124	assert.Equal(t, ClaimsSourceTypeAD, k.ClaimsArrays[0].ClaimsSourceType, "claims source type not as expected")
125	assert.Equal(t, uint32(1), k.ClaimsArrays[0].ClaimsCount, "claims count not as expected")
126	assert.Equal(t, ClaimTypeIDString, k.ClaimsArrays[0].ClaimEntries[0].Type, "claims entry type not as expected")
127	assert.Equal(t, uint32(4), k.ClaimsArrays[0].ClaimEntries[0].TypeString.ValueCount, "claims value count not as expected")
128	assert.Equal(t, "ad://ext/otherIpPhone:88d5de9f6b4af985", k.ClaimsArrays[0].ClaimEntries[0].ID, "claims entry ID not as expected")
129	assert.Equal(t, []LPWSTR{{"str1"}, {"str2"}, {"str3"}, {"str4"}}, k.ClaimsArrays[0].ClaimEntries[0].TypeString.Value, "claims value not as expected")
130	assert.Equal(t, CompressionFormatNone, m.CompressionFormat, "compression format not as expected")
131}
132
133func Test_ClientClaimsInfoMultiEntry_Unmarshal(t *testing.T) {
134	b, _ := hex.DecodeString(ClientClaimsInfoMulti)
135	m := new(ClaimsSetMetadata)
136	dec := ndr.NewDecoder(bytes.NewReader(b))
137	err := dec.Decode(m)
138	if err != nil {
139		t.Errorf("error decoding ClaimsSetMetadata %v", err)
140	}
141	k, err := m.ClaimsSet()
142	if err != nil {
143		t.Errorf("error retrieving ClaimsSet %v", err)
144	}
145
146	assert.Equal(t, uint32(1), k.ClaimsArrayCount, "claims array count not as expected")
147	assert.Equal(t, ClaimsSourceTypeAD, k.ClaimsArrays[0].ClaimsSourceType, "claims source type not as expected")
148	assert.Equal(t, uint32(2), k.ClaimsArrays[0].ClaimsCount, "claims count not as expected")
149	assert.Equal(t, uint16(1), k.ClaimsArrays[0].ClaimEntries[0].Type, "claims entry type not as expected")
150	assert.Equal(t, uint32(1), k.ClaimsArrays[0].ClaimEntries[0].TypeInt64.ValueCount, "claims value count not as expected")
151	assert.Equal(t, ClaimsEntryIDInt64, k.ClaimsArrays[0].ClaimEntries[0].ID, "claims entry ID not as expected")
152	assert.Equal(t, []int64{int64(28)}, k.ClaimsArrays[0].ClaimEntries[0].TypeInt64.Value, "claims value not as expected")
153	assert.Equal(t, uint16(3), k.ClaimsArrays[0].ClaimEntries[1].Type, "claims entry type not as expected")
154	assert.Equal(t, uint32(1), k.ClaimsArrays[0].ClaimEntries[1].TypeString.ValueCount, "claims value count not as expected")
155	assert.Equal(t, ClaimsEntryIDStr, k.ClaimsArrays[0].ClaimEntries[1].ID, "claims entry ID not as expected")
156	assert.Equal(t, []LPWSTR{{ClaimsEntryValueStr}}, k.ClaimsArrays[0].ClaimEntries[1].TypeString.Value, "claims value not as expected")
157	assert.Equal(t, CompressionFormatNone, m.CompressionFormat, "compression format not as expected")
158}
159