ruby_smb 3.1.4 → 3.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/ruby_smb/client/authentication.rb +17 -2
  4. data/lib/ruby_smb/client.rb +10 -1
  5. data/lib/ruby_smb/dcerpc/error.rb +13 -0
  6. data/lib/ruby_smb/dcerpc/fault.rb +83 -0
  7. data/lib/ruby_smb/dcerpc/ndr.rb +19 -8
  8. data/lib/ruby_smb/dcerpc/request.rb +15 -10
  9. data/lib/ruby_smb/dcerpc/rrp_rpc_unicode_string.rb +5 -0
  10. data/lib/ruby_smb/dcerpc/samr/samr_create_user2_in_domain_request.rb +24 -0
  11. data/lib/ruby_smb/dcerpc/samr/samr_create_user2_in_domain_response.rb +24 -0
  12. data/lib/ruby_smb/dcerpc/samr/samr_delete_user_request.rb +21 -0
  13. data/lib/ruby_smb/dcerpc/samr/samr_delete_user_response.rb +22 -0
  14. data/lib/ruby_smb/dcerpc/samr/samr_enumerate_domains_in_sam_server_request.rb +25 -0
  15. data/lib/ruby_smb/dcerpc/samr/samr_enumerate_domains_in_sam_server_response.rb +25 -0
  16. data/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_response.rb +0 -31
  17. data/lib/ruby_smb/dcerpc/samr/samr_get_alias_membership_response.rb +1 -14
  18. data/lib/ruby_smb/dcerpc/samr/samr_lookup_names_in_domain_request.rb +23 -0
  19. data/lib/ruby_smb/dcerpc/samr/samr_lookup_names_in_domain_response.rb +23 -0
  20. data/lib/ruby_smb/dcerpc/samr/samr_set_information_user2_request.rb +23 -0
  21. data/lib/ruby_smb/dcerpc/samr/samr_set_information_user2_response.rb +21 -0
  22. data/lib/ruby_smb/dcerpc/samr.rb +453 -83
  23. data/lib/ruby_smb/dcerpc.rb +1 -0
  24. data/lib/ruby_smb/smb1/pipe.rb +4 -1
  25. data/lib/ruby_smb/smb2/pipe.rb +4 -2
  26. data/lib/ruby_smb/version.rb +1 -1
  27. data/spec/lib/ruby_smb/client_spec.rb +1 -0
  28. data/spec/lib/ruby_smb/dcerpc/samr/samr_create_user2_in_domain_request_spec.rb +69 -0
  29. data/spec/lib/ruby_smb/dcerpc/samr/samr_create_user2_in_domain_response_spec.rb +69 -0
  30. data/spec/lib/ruby_smb/dcerpc/samr/samr_delete_user_request_spec.rb +42 -0
  31. data/spec/lib/ruby_smb/dcerpc/samr/samr_delete_user_response_spec.rb +51 -0
  32. data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_domains_in_sam_server_request_spec.rb +60 -0
  33. data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_domains_in_sam_server_response_spec.rb +75 -0
  34. data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_response_spec.rb +0 -195
  35. data/spec/lib/ruby_smb/dcerpc/samr/samr_lookup_names_in_domain_request_spec.rb +62 -0
  36. data/spec/lib/ruby_smb/dcerpc/samr/samr_lookup_names_in_domain_response_spec.rb +54 -0
  37. data/spec/lib/ruby_smb/dcerpc/samr/samr_set_information_user2_request_spec.rb +67 -0
  38. data/spec/lib/ruby_smb/dcerpc/samr/samr_set_information_user2_response_spec.rb +35 -0
  39. data/spec/lib/ruby_smb/dcerpc/samr_spec.rb +194 -0
  40. data.tar.gz.sig +0 -0
  41. metadata +33 -2
  42. metadata.gz.sig +0 -0
@@ -0,0 +1,69 @@
1
+ RSpec.describe RubySMB::Dcerpc::Samr::SamrCreateUser2InDomainRequest do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :domain_handle }
5
+ it { is_expected.to respond_to :name }
6
+ it { is_expected.to respond_to :account_type }
7
+ it { is_expected.to respond_to :desired_access }
8
+ it { is_expected.to respond_to :opnum }
9
+
10
+ it 'is little endian' do
11
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
12
+ end
13
+
14
+ it 'is a BinData::Record' do
15
+ expect(packet).to be_a(BinData::Record)
16
+ end
17
+
18
+ describe '#domain_handle' do
19
+ it 'is a SamprHandle structure' do
20
+ expect(packet.domain_handle).to be_a RubySMB::Dcerpc::Samr::SamprHandle
21
+ end
22
+ end
23
+
24
+ describe '#name' do
25
+ it 'is a RpcUnicodeString' do
26
+ expect(packet.name).to be_a RubySMB::Dcerpc::RpcUnicodeString
27
+ end
28
+ end
29
+
30
+ describe '#account_type' do
31
+ it 'is a NdrUint32 structure' do
32
+ expect(packet.account_type).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
33
+ end
34
+ end
35
+
36
+ describe '#desired_access' do
37
+ it 'is a NdrUint32 structure' do
38
+ expect(packet.desired_access).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
39
+ end
40
+ end
41
+
42
+ describe '#initialize_instance' do
43
+ it 'sets #opnum to SAMR_CREATE_USER2_IN_DOMAIN constant' do
44
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Samr::SAMR_CREATE_USER2_IN_DOMAIN)
45
+ end
46
+ end
47
+
48
+ it 'reads itself' do
49
+ new_packet = described_class.new({
50
+ domain_handle: {
51
+ context_handle_attributes: 0,
52
+ context_handle_uuid: "fc873b90-d9a9-46a4-b9ea-f44bb1c272a7"
53
+ },
54
+ name: 'test',
55
+ account_type: 1,
56
+ desired_access: 2
57
+ })
58
+ expected_output = {
59
+ domain_handle: {
60
+ context_handle_attributes: 0,
61
+ context_handle_uuid: "fc873b90-d9a9-46a4-b9ea-f44bb1c272a7"
62
+ },
63
+ name: {:buffer=>"test".encode('utf-16le'), :buffer_length=>8, :maximum_length=>8},
64
+ account_type: 1,
65
+ desired_access: 2
66
+ }
67
+ expect(packet.read(new_packet.to_binary_s)).to eq(expected_output)
68
+ end
69
+ end
@@ -0,0 +1,69 @@
1
+ RSpec.describe RubySMB::Dcerpc::Samr::SamrCreateUser2InDomainResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :user_handle }
5
+ it { is_expected.to respond_to :granted_access }
6
+ it { is_expected.to respond_to :relative_id }
7
+ it { is_expected.to respond_to :error_status }
8
+ it { is_expected.to respond_to :opnum }
9
+
10
+ it 'is little endian' do
11
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
12
+ end
13
+
14
+ it 'is a BinData::Record' do
15
+ expect(packet).to be_a(BinData::Record)
16
+ end
17
+
18
+ describe '#user_handle' do
19
+ it 'is a SamprHandle structure' do
20
+ expect(packet.user_handle).to be_a RubySMB::Dcerpc::Samr::SamprHandle
21
+ end
22
+ end
23
+
24
+ describe '#granted_access' do
25
+ it 'is a NdrUint32' do
26
+ expect(packet.granted_access).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
27
+ end
28
+ end
29
+
30
+ describe '#relative_id' do
31
+ it 'is a NdrUint32 structure' do
32
+ expect(packet.relative_id).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
33
+ end
34
+ end
35
+
36
+ describe '#error_status' do
37
+ it 'is a NdrUint32 structure' do
38
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
39
+ end
40
+ end
41
+
42
+ describe '#initialize_instance' do
43
+ it 'sets #opnum to SAMR_CREATE_USER2_IN_DOMAIN constant' do
44
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Samr::SAMR_CREATE_USER2_IN_DOMAIN)
45
+ end
46
+ end
47
+
48
+ it 'reads itself' do
49
+ new_packet = described_class.new({
50
+ user_handle: {
51
+ context_handle_attributes: 0,
52
+ context_handle_uuid: "fc873b90-d9a9-46a4-b9ea-f44bb1c272a7"
53
+ },
54
+ granted_access: 1,
55
+ relative_id: 2,
56
+ error_status: 0x11223344
57
+ })
58
+ expected_output = {
59
+ user_handle: {
60
+ context_handle_attributes: 0,
61
+ context_handle_uuid: "fc873b90-d9a9-46a4-b9ea-f44bb1c272a7"
62
+ },
63
+ granted_access: 1,
64
+ relative_id: 2,
65
+ error_status: 0x11223344
66
+ }
67
+ expect(packet.read(new_packet.to_binary_s)).to eq(expected_output)
68
+ end
69
+ end
@@ -0,0 +1,42 @@
1
+ RSpec.describe RubySMB::Dcerpc::Samr::SamrDeleteUserRequest do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :user_handle }
5
+ it { is_expected.to respond_to :opnum }
6
+
7
+ it 'is little endian' do
8
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
9
+ end
10
+
11
+ it 'is a BinData::Record' do
12
+ expect(packet).to be_a(BinData::Record)
13
+ end
14
+
15
+ describe '#user_handle' do
16
+ it 'is a SamprHandle structure' do
17
+ expect(packet.user_handle).to be_a RubySMB::Dcerpc::Samr::SamprHandle
18
+ end
19
+ end
20
+
21
+ describe '#initialize_instance' do
22
+ it 'sets #opnum to SAMR_DELETE_USER constant' do
23
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Samr::SAMR_DELETE_USER)
24
+ end
25
+ end
26
+
27
+ it 'reads itself' do
28
+ new_packet = described_class.new({
29
+ user_handle: {
30
+ context_handle_attributes: 0,
31
+ context_handle_uuid: "fc873b90-d9a9-46a4-b9ea-f44bb1c272a7"
32
+ }
33
+ })
34
+ expected_output = {
35
+ user_handle: {
36
+ context_handle_attributes: 0,
37
+ context_handle_uuid: "fc873b90-d9a9-46a4-b9ea-f44bb1c272a7"
38
+ }
39
+ }
40
+ expect(packet.read(new_packet.to_binary_s)).to eq(expected_output)
41
+ end
42
+ end
@@ -0,0 +1,51 @@
1
+ RSpec.describe RubySMB::Dcerpc::Samr::SamrDeleteUserResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :user_handle }
5
+ it { is_expected.to respond_to :error_status }
6
+ it { is_expected.to respond_to :opnum }
7
+
8
+ it 'is little endian' do
9
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
10
+ end
11
+
12
+ it 'is a BinData::Record' do
13
+ expect(packet).to be_a(BinData::Record)
14
+ end
15
+
16
+ describe '#user_handle' do
17
+ it 'is a SamprHandle structure' do
18
+ expect(packet.user_handle).to be_a RubySMB::Dcerpc::Samr::SamprHandle
19
+ end
20
+ end
21
+
22
+ describe '#error_status' do
23
+ it 'is a NdrUint32 structure' do
24
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
25
+ end
26
+ end
27
+
28
+ describe '#initialize_instance' do
29
+ it 'sets #opnum to SAMR_DELETE_USER constant' do
30
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Samr::SAMR_DELETE_USER)
31
+ end
32
+ end
33
+
34
+ it 'reads itself' do
35
+ new_packet = described_class.new({
36
+ user_handle: {
37
+ context_handle_attributes: 0,
38
+ context_handle_uuid: "fc873b90-d9a9-46a4-b9ea-f44bb1c272a7"
39
+ },
40
+ error_status: 0x11223344
41
+ })
42
+ expected_output = {
43
+ user_handle: {
44
+ context_handle_attributes: 0,
45
+ context_handle_uuid: "fc873b90-d9a9-46a4-b9ea-f44bb1c272a7"
46
+ },
47
+ error_status: 0x11223344
48
+ }
49
+ expect(packet.read(new_packet.to_binary_s)).to eq(expected_output)
50
+ end
51
+ end
@@ -0,0 +1,60 @@
1
+ RSpec.describe RubySMB::Dcerpc::Samr::SamrEnumerateDomainsInSamServerRequest do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :server_handle }
5
+ it { is_expected.to respond_to :enumeration_context }
6
+ it { is_expected.to respond_to :prefered_maximum_length }
7
+ it { is_expected.to respond_to :opnum }
8
+
9
+ it 'is little endian' do
10
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
11
+ end
12
+
13
+ it 'is a BinData::Record' do
14
+ expect(packet).to be_a(BinData::Record)
15
+ end
16
+
17
+ describe '#server_handle' do
18
+ it 'is a SamprHandle structure' do
19
+ expect(packet.server_handle).to be_a RubySMB::Dcerpc::Samr::SamprHandle
20
+ end
21
+ end
22
+
23
+ describe '#enumeration_context' do
24
+ it 'is a NdrUint32 structure' do
25
+ expect(packet.enumeration_context).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
26
+ end
27
+ end
28
+
29
+ describe '#prefered_maximum_length' do
30
+ it 'is a NdrUint32 structure' do
31
+ expect(packet.prefered_maximum_length).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
32
+ end
33
+ end
34
+
35
+ describe '#initialize_instance' do
36
+ it 'sets #opnum to SAMR_ENUMERATE_DOMAINS_IN_SAM_SERVER constant' do
37
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Samr::SAMR_ENUMERATE_DOMAINS_IN_SAM_SERVER)
38
+ end
39
+ end
40
+
41
+ it 'reads itself' do
42
+ new_packet = described_class.new({
43
+ server_handle: {
44
+ context_handle_attributes: 0,
45
+ context_handle_uuid: "fc873b90-d9a9-46a4-b9ea-f44bb1c272a7"
46
+ },
47
+ enumeration_context: 1,
48
+ prefered_maximum_length: 2
49
+ })
50
+ expected_output = {
51
+ server_handle: {
52
+ context_handle_attributes: 0,
53
+ context_handle_uuid: "fc873b90-d9a9-46a4-b9ea-f44bb1c272a7"
54
+ },
55
+ enumeration_context: 1,
56
+ prefered_maximum_length: 2
57
+ }
58
+ expect(packet.read(new_packet.to_binary_s)).to eq(expected_output)
59
+ end
60
+ end
@@ -0,0 +1,75 @@
1
+ RSpec.describe RubySMB::Dcerpc::Samr::SamrEnumerateDomainsInSamServerResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :enumeration_context }
5
+ it { is_expected.to respond_to :buffer }
6
+ it { is_expected.to respond_to :count_returned }
7
+ it { is_expected.to respond_to :error_status }
8
+ it { is_expected.to respond_to :opnum }
9
+
10
+ it 'is little endian' do
11
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
12
+ end
13
+
14
+ it 'is a BinData::Record' do
15
+ expect(packet).to be_a(BinData::Record)
16
+ end
17
+
18
+ describe '#enumeration_context' do
19
+ it 'is a NdrUint32 structure' do
20
+ expect(packet.enumeration_context).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
21
+ end
22
+ end
23
+
24
+ describe '#buffer' do
25
+ it 'is a PsamprEnumerationBuffer structure' do
26
+ expect(packet.buffer).to be_a RubySMB::Dcerpc::Samr::PsamprEnumerationBuffer
27
+ end
28
+ end
29
+
30
+ describe '#count_returned' do
31
+ it 'is a NdrUint32 structure' do
32
+ expect(packet.count_returned).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
33
+ end
34
+ end
35
+
36
+ describe '#error_status' do
37
+ it 'is a NdrUint32 structure' do
38
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
39
+ end
40
+ end
41
+
42
+ describe '#initialize_instance' do
43
+ it 'sets #opnum to SAMR_ENUMERATE_DOMAINS_IN_SAM_SERVER constant' do
44
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Samr::SAMR_ENUMERATE_DOMAINS_IN_SAM_SERVER)
45
+ end
46
+ end
47
+
48
+ it 'reads itself' do
49
+ new_packet = described_class.new({
50
+ enumeration_context: 1,
51
+ buffer: {
52
+ entries_read: 2,
53
+ buffer: [
54
+ {relative_id: 500, name: { buffer_length: 26, maximum_length: 26, buffer: "Builtin".encode('utf-16le') }},
55
+ {relative_id: 501, name: { buffer_length: 10, maximum_length: 10, buffer: "RUBYSMB".encode('utf-16le') }},
56
+ ]
57
+ },
58
+ count_returned: 2,
59
+ error_status: 0x11223344
60
+ })
61
+ expected_output = {
62
+ enumeration_context: 1,
63
+ buffer: {
64
+ entries_read: 2,
65
+ buffer: [
66
+ {relative_id: 500, name: { buffer_length: 26, maximum_length: 26, buffer: "Builtin".encode('utf-16le') }},
67
+ {relative_id: 501, name: { buffer_length: 10, maximum_length: 10, buffer: "RUBYSMB".encode('utf-16le') }},
68
+ ]
69
+ },
70
+ count_returned: 2,
71
+ error_status: 0x11223344
72
+ }
73
+ expect(packet.read(new_packet.to_binary_s)).to eq(expected_output)
74
+ end
75
+ end
@@ -1,197 +1,3 @@
1
- RSpec.describe RubySMB::Dcerpc::Samr::SamprRidEnumeration do
2
- subject(:packet) { described_class.new }
3
-
4
- it { is_expected.to respond_to :relative_id }
5
- it { is_expected.to respond_to :name }
6
-
7
- it 'is little endian' do
8
- expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
9
- end
10
- it 'is a Ndr::NdrStruct' do
11
- expect(packet).to be_a(RubySMB::Dcerpc::Ndr::NdrStruct)
12
- end
13
- it 'is four-byte aligned' do
14
- expect(packet.eval_parameter(:byte_align)).to eq(4)
15
- end
16
- describe '#relative_id' do
17
- it 'is a NdrUint32 structure' do
18
- expect(packet.relative_id).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
19
- end
20
- end
21
- describe '#name' do
22
- it 'is a RpcUnicodeString structure' do
23
- expect(packet.name).to be_a RubySMB::Dcerpc::RpcUnicodeString
24
- end
25
- end
26
- it 'reads itself' do
27
- new_packet = described_class.new(relative_id: 4, name: 'Test String')
28
- expected_output = {
29
- relative_id: 4,
30
- name: {
31
- buffer_length: 22,
32
- maximum_length: 22,
33
- buffer: "Test String".encode('utf-16le')
34
- }
35
- }
36
- expect(packet.read(new_packet.to_binary_s)).to eq(expected_output)
37
- end
38
- end
39
-
40
- RSpec.describe RubySMB::Dcerpc::Samr::SamprRidEnumerationArray do
41
- subject(:packet) { described_class.new }
42
-
43
- it 'is a Ndr::NdrConfArray' do
44
- expect(packet).to be_a(RubySMB::Dcerpc::Ndr::NdrConfArray)
45
- end
46
- it 'has element of type SamprRidEnumeration' do
47
- packet << {relative_id: 4, name: ''}
48
- expect(packet[0]).to be_a(RubySMB::Dcerpc::Samr::SamprRidEnumeration)
49
- end
50
- it 'reads itself' do
51
- new_packet = described_class.new([
52
- {relative_id: 4, name: 'Test1'},
53
- {relative_id: 1, name: 'Test2'}
54
- ])
55
- expected_output = [
56
- {
57
- relative_id: 4,
58
- name: {
59
- buffer_length: 10,
60
- maximum_length: 10,
61
- buffer: "Test1".encode('utf-16le')
62
- }
63
- },
64
- {
65
- relative_id: 1,
66
- name: {
67
- buffer_length: 10,
68
- maximum_length: 10,
69
- buffer: "Test2".encode('utf-16le')
70
- }
71
- }]
72
- expect(packet.read(new_packet.to_binary_s)).to eq(expected_output)
73
- end
74
- end
75
-
76
- RSpec.describe RubySMB::Dcerpc::Samr::PsamprRidEnumerationArray do
77
- subject(:packet) { described_class.new }
78
-
79
- it 'is a SamprRidEnumerationArray' do
80
- expect(packet).to be_a(RubySMB::Dcerpc::Samr::SamprRidEnumerationArray)
81
- end
82
- it 'is a NdrPointer' do
83
- expect(described_class).to be_a(RubySMB::Dcerpc::Ndr::PointerClassPlugin)
84
- expect(packet).to be_a(RubySMB::Dcerpc::Ndr::PointerPlugin)
85
- end
86
- it 'is four-byte aligned' do
87
- expect(packet.eval_parameter(:byte_align)).to eq(4)
88
- end
89
- it 'reads itself' do
90
- new_packet = described_class.new([
91
- {relative_id: 4, name: 'Test1'},
92
- {relative_id: 1, name: 'Test2'}
93
- ])
94
- expected_output = [
95
- {
96
- relative_id: 4,
97
- name: {
98
- buffer_length: 10,
99
- maximum_length: 10,
100
- buffer: "Test1".encode('utf-16le')
101
- }
102
- },
103
- {
104
- relative_id: 1,
105
- name: {
106
- buffer_length: 10,
107
- maximum_length: 10,
108
- buffer: "Test2".encode('utf-16le')
109
- }
110
- }]
111
- expect(packet.read(new_packet.to_binary_s)).to eq(expected_output)
112
- end
113
- end
114
-
115
- RSpec.describe RubySMB::Dcerpc::Samr::SamprEnumerationBuffer do
116
- subject(:packet) { described_class.new }
117
-
118
- it { is_expected.to respond_to :entries_read }
119
- it { is_expected.to respond_to :buffer }
120
-
121
- it 'is little endian' do
122
- expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
123
- end
124
- it 'is a Ndr::NdrStruct' do
125
- expect(packet).to be_a(RubySMB::Dcerpc::Ndr::NdrStruct)
126
- end
127
- it 'is four-byte aligned' do
128
- expect(packet.eval_parameter(:byte_align)).to eq(4)
129
- end
130
- describe '#entries_read' do
131
- it 'is a NdrUint32 structure' do
132
- expect(packet.entries_read).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
133
- end
134
- end
135
- describe '#buffer' do
136
- it 'is a PsamprRidEnumerationArray structure' do
137
- expect(packet.buffer).to be_a RubySMB::Dcerpc::Samr::PsamprRidEnumerationArray
138
- end
139
- end
140
- it 'reads itself' do
141
- new_packet = described_class.new(
142
- entries_read: 3,
143
- buffer: [
144
- { relative_id: 500, name: "Administrator" },
145
- { relative_id: 501, name: "Guest" },
146
- { relative_id: 1001, name: "WIN-DP0M1BC768$" }
147
- ]
148
- )
149
- expected_output = {
150
- entries_read: 3,
151
- buffer: [
152
- {relative_id: 500, name: { buffer_length: 26, maximum_length: 26, buffer: "Administrator".encode('utf-16le') }},
153
- {relative_id: 501, name: { buffer_length: 10, maximum_length: 10, buffer: "Guest".encode('utf-16le') }},
154
- {relative_id: 1001, name: { buffer_length: 30, maximum_length: 30, buffer: "WIN-DP0M1BC768$".encode('utf-16le') }}
155
- ]
156
- }
157
- expect(packet.read(new_packet.to_binary_s)).to eq(expected_output)
158
- end
159
- end
160
-
161
- RSpec.describe RubySMB::Dcerpc::Samr::PsamprEnumerationBuffer do
162
- subject(:packet) { described_class.new }
163
-
164
- it 'is a SamprEnumerationBuffer' do
165
- expect(packet).to be_a(RubySMB::Dcerpc::Samr::SamprEnumerationBuffer)
166
- end
167
- it 'is a NdrPointer' do
168
- expect(described_class).to be_a(RubySMB::Dcerpc::Ndr::PointerClassPlugin)
169
- expect(packet).to be_a(RubySMB::Dcerpc::Ndr::PointerPlugin)
170
- end
171
- it 'is four-byte aligned' do
172
- expect(packet.eval_parameter(:byte_align)).to eq(4)
173
- end
174
- it 'reads itself' do
175
- new_packet = described_class.new(
176
- entries_read: 3,
177
- buffer: [
178
- { relative_id: 500, name: "Administrator" },
179
- { relative_id: 501, name: "Guest" },
180
- { relative_id: 1001, name: "WIN-DP0M1BC768$" }
181
- ]
182
- )
183
- expected_output = {
184
- entries_read: 3,
185
- buffer: [
186
- {relative_id: 500, name: { buffer_length: 26, maximum_length: 26, buffer: "Administrator".encode('utf-16le') }},
187
- {relative_id: 501, name: { buffer_length: 10, maximum_length: 10, buffer: "Guest".encode('utf-16le') }},
188
- {relative_id: 1001, name: { buffer_length: 30, maximum_length: 30, buffer: "WIN-DP0M1BC768$".encode('utf-16le') }}
189
- ]
190
- }
191
- expect(packet.read(new_packet.to_binary_s)).to eq(expected_output)
192
- end
193
- end
194
-
195
1
  RSpec.describe RubySMB::Dcerpc::Samr::SamrEnumerateUsersInDomainResponse do
196
2
  subject(:packet) { described_class.new }
197
3
 
@@ -262,4 +68,3 @@ RSpec.describe RubySMB::Dcerpc::Samr::SamrEnumerateUsersInDomainResponse do
262
68
  expect(packet.read(new_packet.to_binary_s)).to eq(expected_output)
263
69
  end
264
70
  end
265
-
@@ -0,0 +1,62 @@
1
+ RSpec.describe RubySMB::Dcerpc::Samr::SamrLookupNamesInDomainRequest do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :domain_handle }
5
+ it { is_expected.to respond_to :names_count }
6
+ it { is_expected.to respond_to :names }
7
+ it { is_expected.to respond_to :opnum }
8
+
9
+ it 'is little endian' do
10
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
11
+ end
12
+
13
+ it 'is a BinData::Record' do
14
+ expect(packet).to be_a(BinData::Record)
15
+ end
16
+
17
+ describe '#domain_handle' do
18
+ it 'is a SamprHandle structure' do
19
+ expect(packet.domain_handle).to be_a RubySMB::Dcerpc::Samr::SamprHandle
20
+ end
21
+ end
22
+
23
+ describe '#names_count' do
24
+ it 'is a NdrUint32 structure' do
25
+ expect(packet.names_count).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
26
+ end
27
+ end
28
+
29
+ describe '#names' do
30
+ it 'is a RpcUnicodeStringConfVarArray structure' do
31
+ expect(packet.names).to be_a RubySMB::Dcerpc::RpcUnicodeStringConfVarArray
32
+ end
33
+ end
34
+
35
+ describe '#initialize_instance' do
36
+ it 'sets #opnum to SAMR_LOOKUP_NAMES_IN_DOMAIN constant' do
37
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Samr::SAMR_LOOKUP_NAMES_IN_DOMAIN)
38
+ end
39
+ end
40
+
41
+ it 'reads itself' do
42
+ new_packet = described_class.new({
43
+ domain_handle: {
44
+ context_handle_attributes: 0,
45
+ context_handle_uuid: "fc873b90-d9a9-46a4-b9ea-f44bb1c272a7"
46
+ },
47
+ names_count: 1,
48
+ names: [ 'TEST' ]
49
+ })
50
+ expected_output = {
51
+ domain_handle: {
52
+ context_handle_attributes: 0,
53
+ context_handle_uuid: "fc873b90-d9a9-46a4-b9ea-f44bb1c272a7"
54
+ },
55
+ names_count: 1,
56
+ names: [
57
+ { buffer_length: 8, maximum_length: 8, buffer: "TEST".encode('utf-16le') }
58
+ ]
59
+ }
60
+ expect(packet.read(new_packet.to_binary_s)).to eq(expected_output)
61
+ end
62
+ end
@@ -0,0 +1,54 @@
1
+ RSpec.describe RubySMB::Dcerpc::Samr::SamrLookupNamesInDomainResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :relative_ids }
5
+ it { is_expected.to respond_to :use }
6
+ it { is_expected.to respond_to :error_status }
7
+ it { is_expected.to respond_to :opnum }
8
+
9
+ it 'is little endian' do
10
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
11
+ end
12
+
13
+ it 'is a BinData::Record' do
14
+ expect(packet).to be_a(BinData::Record)
15
+ end
16
+
17
+ describe '#relative_ids' do
18
+ it 'is a SamprHandle structure' do
19
+ expect(packet.relative_ids).to be_a RubySMB::Dcerpc::Samr::SamprUlongArray
20
+ end
21
+ end
22
+
23
+ describe '#use' do
24
+ it 'is a SamprHandle structure' do
25
+ expect(packet.use).to be_a RubySMB::Dcerpc::Samr::SamprUlongArray
26
+ end
27
+ end
28
+
29
+ describe '#error_status' do
30
+ it 'is a NdrUint32 structure' do
31
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
32
+ end
33
+ end
34
+
35
+ describe '#initialize_instance' do
36
+ it 'sets #opnum to SAMR_LOOKUP_NAMES_IN_DOMAIN constant' do
37
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Samr::SAMR_LOOKUP_NAMES_IN_DOMAIN)
38
+ end
39
+ end
40
+
41
+ it 'reads itself' do
42
+ new_packet = described_class.new({
43
+ relative_ids: { element_count: 2, elements: [ 500, 501 ] },
44
+ use: { element_count: 2, elements: [ 1, 2 ] },
45
+ error_status: 0x11223344
46
+ })
47
+ expected_output = {
48
+ relative_ids: { element_count: 2, elements: [ 500, 501 ] },
49
+ use: { element_count: 2, elements: [ 1, 2 ] },
50
+ error_status: 0x11223344
51
+ }
52
+ expect(packet.read(new_packet.to_binary_s)).to eq(expected_output)
53
+ end
54
+ end