winrm 2.2.3 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +13 -1
  3. data/.travis.yml +10 -11
  4. data/Gemfile +2 -3
  5. data/README.md +1 -1
  6. data/Rakefile +3 -4
  7. data/appveyor.yml +1 -2
  8. data/bin/rwinrm +90 -97
  9. data/changelog.md +5 -0
  10. data/lib/winrm.rb +3 -5
  11. data/lib/winrm/connection.rb +84 -86
  12. data/lib/winrm/connection_opts.rb +90 -91
  13. data/lib/winrm/exceptions.rb +14 -2
  14. data/lib/winrm/http/response_handler.rb +127 -96
  15. data/lib/winrm/http/transport.rb +462 -427
  16. data/lib/winrm/http/transport_factory.rb +1 -5
  17. data/lib/winrm/output.rb +1 -2
  18. data/lib/winrm/psrp/fragment.rb +0 -2
  19. data/lib/winrm/psrp/message.rb +1 -3
  20. data/lib/winrm/psrp/message_data.rb +0 -2
  21. data/lib/winrm/psrp/message_data/base.rb +0 -2
  22. data/lib/winrm/psrp/message_data/error_record.rb +0 -2
  23. data/lib/winrm/psrp/message_data/pipeline_host_call.rb +0 -2
  24. data/lib/winrm/psrp/message_data/pipeline_output.rb +48 -54
  25. data/lib/winrm/psrp/message_data/pipeline_state.rb +0 -2
  26. data/lib/winrm/psrp/message_data/runspacepool_host_call.rb +0 -2
  27. data/lib/winrm/psrp/message_data/runspacepool_state.rb +0 -2
  28. data/lib/winrm/psrp/message_data/session_capability.rb +0 -2
  29. data/lib/winrm/psrp/message_defragmenter.rb +2 -2
  30. data/lib/winrm/psrp/message_factory.rb +2 -3
  31. data/lib/winrm/psrp/message_fragmenter.rb +1 -3
  32. data/lib/winrm/psrp/powershell_output_decoder.rb +0 -2
  33. data/lib/winrm/psrp/receive_response_reader.rb +3 -5
  34. data/lib/winrm/psrp/uuid.rb +1 -2
  35. data/lib/winrm/shells/base.rb +6 -4
  36. data/lib/winrm/shells/cmd.rb +63 -65
  37. data/lib/winrm/shells/power_shell.rb +207 -202
  38. data/lib/winrm/shells/retryable.rb +44 -45
  39. data/lib/winrm/shells/shell_factory.rb +0 -2
  40. data/lib/winrm/version.rb +1 -3
  41. data/lib/winrm/wsmv/base.rb +0 -2
  42. data/lib/winrm/wsmv/cleanup_command.rb +1 -2
  43. data/lib/winrm/wsmv/close_shell.rb +1 -2
  44. data/lib/winrm/wsmv/command.rb +2 -3
  45. data/lib/winrm/wsmv/command_output.rb +2 -3
  46. data/lib/winrm/wsmv/command_output_decoder.rb +1 -2
  47. data/lib/winrm/wsmv/configuration.rb +0 -2
  48. data/lib/winrm/wsmv/create_pipeline.rb +0 -2
  49. data/lib/winrm/wsmv/create_shell.rb +2 -6
  50. data/lib/winrm/wsmv/header.rb +213 -215
  51. data/lib/winrm/wsmv/init_runspace_pool.rb +96 -95
  52. data/lib/winrm/wsmv/iso8601_duration.rb +0 -2
  53. data/lib/winrm/wsmv/keep_alive.rb +0 -2
  54. data/lib/winrm/wsmv/receive_response_reader.rb +128 -126
  55. data/lib/winrm/wsmv/send_data.rb +0 -2
  56. data/lib/winrm/wsmv/soap.rb +0 -2
  57. data/lib/winrm/wsmv/wql_pull.rb +54 -56
  58. data/lib/winrm/wsmv/wql_query.rb +98 -99
  59. data/lib/winrm/wsmv/write_stdin.rb +0 -2
  60. data/tests/integration/auth_timeout_spec.rb +0 -1
  61. data/tests/integration/cmd_spec.rb +2 -3
  62. data/tests/integration/issue_59_spec.rb +0 -1
  63. data/tests/integration/powershell_spec.rb +4 -5
  64. data/tests/integration/spec_helper.rb +3 -6
  65. data/tests/integration/transport_spec.rb +0 -1
  66. data/tests/integration/wql_spec.rb +33 -34
  67. data/tests/matchers.rb +2 -3
  68. data/tests/spec/configuration_spec.rb +0 -1
  69. data/tests/spec/connection_spec.rb +0 -2
  70. data/tests/spec/exception_spec.rb +0 -1
  71. data/tests/spec/http/transport_factory_spec.rb +1 -3
  72. data/tests/spec/http/transport_spec.rb +0 -1
  73. data/tests/spec/output_spec.rb +4 -3
  74. data/tests/spec/psrp/fragment_spec.rb +0 -2
  75. data/tests/spec/psrp/message_data/base_spec.rb +0 -2
  76. data/tests/spec/psrp/message_data/error_record_spec.rb +0 -2
  77. data/tests/spec/psrp/message_data/pipeline_host_call_spec.rb +0 -2
  78. data/tests/spec/psrp/message_data/pipeline_output_spec.rb +0 -2
  79. data/tests/spec/psrp/message_data/pipeline_state_spec.rb +0 -2
  80. data/tests/spec/psrp/message_data/runspace_pool_host_call_spec.rb +0 -2
  81. data/tests/spec/psrp/message_data/runspacepool_state_spec.rb +0 -2
  82. data/tests/spec/psrp/message_data/session_capability_spec.rb +0 -2
  83. data/tests/spec/psrp/message_data_spec.rb +0 -2
  84. data/tests/spec/psrp/message_defragmenter_spec.rb +0 -2
  85. data/tests/spec/psrp/message_fragmenter_spec.rb +0 -2
  86. data/tests/spec/psrp/powershell_output_decoder_spec.rb +0 -2
  87. data/tests/spec/psrp/psrp_message_spec.rb +10 -7
  88. data/tests/spec/psrp/recieve_response_reader_spec.rb +0 -2
  89. data/tests/spec/psrp/uuid_spec.rb +2 -2
  90. data/tests/spec/response_handler_spec.rb +69 -61
  91. data/tests/spec/shells/base_spec.rb +7 -5
  92. data/tests/spec/shells/cmd_spec.rb +4 -4
  93. data/tests/spec/shells/powershell_spec.rb +221 -175
  94. data/tests/spec/spec_helper.rb +0 -1
  95. data/tests/spec/stubs/responses/get_omi_command_output_response.xml.erb +23 -0
  96. data/tests/spec/stubs/responses/get_omi_command_output_response_not_done.xml.erb +24 -0
  97. data/tests/spec/stubs/responses/get_omi_config_response.xml +45 -0
  98. data/tests/spec/stubs/responses/get_omi_powershell_keepalive_response.xml.erb +33 -0
  99. data/tests/spec/stubs/responses/open_shell_omi.xml +43 -0
  100. data/tests/spec/stubs/responses/soap_fault_omi.xml +31 -0
  101. data/tests/spec/wsmv/cleanup_command_spec.rb +0 -2
  102. data/tests/spec/wsmv/close_shell_spec.rb +0 -2
  103. data/tests/spec/wsmv/command_output_decoder_spec.rb +0 -2
  104. data/tests/spec/wsmv/command_output_spec.rb +1 -3
  105. data/tests/spec/wsmv/command_spec.rb +0 -2
  106. data/tests/spec/wsmv/configuration_spec.rb +0 -2
  107. data/tests/spec/wsmv/create_pipeline_spec.rb +2 -3
  108. data/tests/spec/wsmv/create_shell_spec.rb +6 -5
  109. data/tests/spec/wsmv/init_runspace_pool_spec.rb +38 -36
  110. data/tests/spec/wsmv/keep_alive_spec.rb +4 -4
  111. data/tests/spec/wsmv/receive_response_reader_spec.rb +124 -123
  112. data/tests/spec/wsmv/send_data_spec.rb +4 -4
  113. data/tests/spec/wsmv/wql_query_spec.rb +11 -13
  114. data/tests/spec/wsmv/write_stdin_spec.rb +0 -2
  115. data/winrm.gemspec +11 -12
  116. metadata +73 -67
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
data/lib/winrm/version.rb CHANGED
@@ -1,7 +1,5 @@
1
- # encoding: UTF-8
2
-
3
1
  # WinRM module
4
2
  module WinRM
5
3
  # The version of the WinRM library
6
- VERSION = '2.2.3'.freeze
4
+ VERSION = '2.3.0'.freeze
7
5
  end
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +21,7 @@ module WinRM
23
21
  def initialize(session_opts, opts)
24
22
  raise 'opts[:shell_id] is required' unless opts[:shell_id]
25
23
  raise 'opts[:command_id] is required' unless opts[:command_id]
24
+
26
25
  @session_opts = session_opts
27
26
  @shell_id = opts[:shell_id]
28
27
  @command_id = opts[:command_id]
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,6 +20,7 @@ module WinRM
22
20
  class CloseShell < Base
23
21
  def initialize(session_opts, shell_opts)
24
22
  raise 'shell_opts[:shell_id] is required' unless shell_opts[:shell_id]
23
+
25
24
  @session_opts = session_opts
26
25
  @shell_id = shell_opts[:shell_id]
27
26
  @shell_uri = shell_opts[:shell_uri] || RESOURCE_URI_CMD
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -85,12 +83,13 @@ module WinRM
85
83
 
86
84
  def command_header_opts
87
85
  return {} if @shell_uri != RESOURCE_URI_CMD
86
+
88
87
  # this is only needed for the regular Windows shell
89
88
  {
90
89
  "#{NS_WSMAN_DMTF}:OptionSet" => {
91
90
  "#{NS_WSMAN_DMTF}:Option" => [@consolemode, @skipcmd], :attributes! => {
92
91
  "#{NS_WSMAN_DMTF}:Option" => {
93
- 'Name' => %w(WINRS_CONSOLEMODE_STDIN WINRS_SKIP_CMD_SHELL)
92
+ 'Name' => %w[WINRS_CONSOLEMODE_STDIN WINRS_SKIP_CMD_SHELL]
94
93
  }
95
94
  }
96
95
  }
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,11 +21,12 @@ module WinRM
23
21
  def initialize(session_opts, command_out_opts)
24
22
  raise 'command_out_opts[:shell_id] is required' unless command_out_opts[:shell_id]
25
23
  raise 'command_out_opts[:command_id] is required' unless command_out_opts[:command_id]
24
+
26
25
  @session_opts = session_opts
27
26
  @shell_id = command_out_opts[:shell_id]
28
27
  @command_id = command_out_opts[:command_id]
29
28
  @shell_uri = command_out_opts[:shell_uri] || RESOURCE_URI_CMD
30
- @out_streams = command_out_opts[:out_streams] || %w(stdout stderr)
29
+ @out_streams = command_out_opts[:out_streams] || %w[stdout stderr]
31
30
  end
32
31
 
33
32
  protected
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -39,6 +37,7 @@ module WinRM
39
37
 
40
38
  def handle_invalid_encoding(decoded_text)
41
39
  return decoded_text if decoded_text.valid_encoding?
40
+
42
41
  if decoded_text.respond_to?(:scrub)
43
42
  decoded_text.scrub
44
43
  else
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Matt Wrock <matt@mattwrock.com>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Matt Wrock <matt@mattwrock.com>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
1
  # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
2
  #
5
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -62,9 +60,7 @@ module WinRM
62
60
  "#{NS_WIN_SHELL}:OutputStreams" => @o_stream
63
61
  }
64
62
  body["#{NS_WIN_SHELL}:WorkingDirectory"] = @working_directory if @working_directory
65
- if @idle_timeout
66
- body["#{NS_WIN_SHELL}:IdleTimeOut"] = format_idle_timeout(@idle_timeout)
67
- end
63
+ body["#{NS_WIN_SHELL}:IdleTimeOut"] = format_idle_timeout(@idle_timeout) if @idle_timeout
68
64
  body["#{NS_WIN_SHELL}:Environment"] = environment_vars_body if @env_vars
69
65
  body
70
66
  end
@@ -108,7 +104,7 @@ module WinRM
108
104
  "#{NS_WSMAN_DMTF}:OptionSet" => {
109
105
  "#{NS_WSMAN_DMTF}:Option" => [@noprofile, @codepage], :attributes! => {
110
106
  "#{NS_WSMAN_DMTF}:Option" => {
111
- 'Name' => %w(WINRS_NOPROFILE WINRS_CODEPAGE)
107
+ 'Name' => %w[WINRS_NOPROFILE WINRS_CODEPAGE]
112
108
  }
113
109
  }
114
110
  }
@@ -1,215 +1,213 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
-
17
- # rubocop:disable Metrics/MethodLength
18
-
19
- require_relative 'soap'
20
- require_relative 'iso8601_duration'
21
-
22
- module WinRM
23
- module WSMV
24
- # SOAP header utility mixin
25
- module Header
26
- # WSMan URI of the regular Windows cmd shell
27
- RESOURCE_URI_CMD = 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd'.freeze
28
-
29
- # WSMan URI for PowerShell
30
- RESOURCE_URI_POWERSHELL = 'http://schemas.microsoft.com/powershell/Microsoft.PowerShell'.freeze
31
-
32
- # Merge the various header hashes and make sure we carry all of the attributes
33
- # through instead of overwriting them.
34
- def merge_headers(*headers)
35
- hdr = {}
36
- headers.each do |h|
37
- hdr.merge!(h) do |k, v1, v2|
38
- v1.merge!(v2) if k == :attributes!
39
- end
40
- end
41
- hdr
42
- end
43
-
44
- def shared_headers(session_opts)
45
- {
46
- "#{SOAP::NS_ADDRESSING}:To" => session_opts[:endpoint],
47
- "#{SOAP::NS_ADDRESSING}:ReplyTo" => {
48
- "#{SOAP::NS_ADDRESSING}:Address" =>
49
- 'http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous',
50
- :attributes! => {
51
- "#{SOAP::NS_ADDRESSING}:Address" => {
52
- 'mustUnderstand' => true
53
- }
54
- }
55
- },
56
- "#{SOAP::NS_WSMAN_DMTF}:MaxEnvelopeSize" => session_opts[:max_envelope_size],
57
- "#{SOAP::NS_ADDRESSING}:MessageID" => "uuid:#{SecureRandom.uuid.to_s.upcase}",
58
- "#{SOAP::NS_WSMAN_MSFT}:SessionId" => "uuid:#{session_opts[:session_id]}",
59
- "#{SOAP::NS_WSMAN_DMTF}:Locale/" => '',
60
- "#{SOAP::NS_WSMAN_MSFT}:DataLocale/" => '',
61
- "#{SOAP::NS_WSMAN_DMTF}:OperationTimeout" =>
62
- Iso8601Duration.sec_to_dur(session_opts[:operation_timeout]),
63
- :attributes! => {
64
- "#{SOAP::NS_WSMAN_DMTF}:MaxEnvelopeSize" => { 'mustUnderstand' => true },
65
- "#{SOAP::NS_WSMAN_DMTF}:Locale/" => {
66
- 'xml:lang' => session_opts[:locale], 'mustUnderstand' => false
67
- },
68
- "#{SOAP::NS_WSMAN_MSFT}:DataLocale/" => {
69
- 'xml:lang' => session_opts[:locale], 'mustUnderstand' => false
70
- },
71
- "#{SOAP::NS_WSMAN_MSFT}:SessionId" => { 'mustUnderstand' => false }
72
- }
73
- }
74
- end
75
-
76
- # Helper methods for SOAP Headers
77
-
78
- def resource_uri_shell(shell_uri)
79
- {
80
- "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" => shell_uri, :attributes! => {
81
- "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" => {
82
- 'mustUnderstand' => true
83
- }
84
- }
85
- }
86
- end
87
-
88
- def resource_uri_cmd
89
- resource_uri_shell(RESOURCE_URI_CMD)
90
- end
91
-
92
- def resource_uri_wmi(namespace = 'root/cimv2/*')
93
- {
94
- "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" =>
95
- "http://schemas.microsoft.com/wbem/wsman/1/wmi/#{namespace}",
96
- :attributes! => {
97
- "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" => {
98
- 'mustUnderstand' => true
99
- }
100
- }
101
- }
102
- end
103
-
104
- def action_get
105
- {
106
- "#{SOAP::NS_ADDRESSING}:Action" =>
107
- 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Get',
108
- :attributes! => {
109
- "#{SOAP::NS_ADDRESSING}:Action" => {
110
- 'mustUnderstand' => true
111
- }
112
- }
113
- }
114
- end
115
-
116
- def action_delete
117
- {
118
- "#{SOAP::NS_ADDRESSING}:Action" =>
119
- 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete',
120
- :attributes! => {
121
- "#{SOAP::NS_ADDRESSING}:Action" => {
122
- 'mustUnderstand' => true
123
- }
124
- }
125
- }
126
- end
127
-
128
- def action_command
129
- {
130
- "#{SOAP::NS_ADDRESSING}:Action" =>
131
- 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Command',
132
- :attributes! => {
133
- "#{SOAP::NS_ADDRESSING}:Action" => {
134
- 'mustUnderstand' => true
135
- }
136
- }
137
- }
138
- end
139
-
140
- def action_receive
141
- {
142
- "#{SOAP::NS_ADDRESSING}:Action" =>
143
- 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Receive',
144
- :attributes! => {
145
- "#{SOAP::NS_ADDRESSING}:Action" => {
146
- 'mustUnderstand' => true
147
- }
148
- }
149
- }
150
- end
151
-
152
- def action_send
153
- {
154
- "#{SOAP::NS_ADDRESSING}:Action" =>
155
- 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Send',
156
- :attributes! => {
157
- "#{SOAP::NS_ADDRESSING}:Action" => {
158
- 'mustUnderstand' => true
159
- }
160
- }
161
- }
162
- end
163
-
164
- def action_signal
165
- {
166
- "#{SOAP::NS_ADDRESSING}:Action" =>
167
- 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Signal',
168
- :attributes! => {
169
- "#{SOAP::NS_ADDRESSING}:Action" => {
170
- 'mustUnderstand' => true
171
- }
172
- }
173
- }
174
- end
175
-
176
- def action_enumerate
177
- {
178
- "#{SOAP::NS_ADDRESSING}:Action" =>
179
- 'http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate',
180
- :attributes! => {
181
- "#{SOAP::NS_ADDRESSING}:Action" => {
182
- 'mustUnderstand' => true
183
- }
184
- }
185
- }
186
- end
187
-
188
- def action_enumerate_pull
189
- {
190
- "#{SOAP::NS_ADDRESSING}:Action" =>
191
- 'http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull',
192
- :attributes! => {
193
- "#{SOAP::NS_ADDRESSING}:Action" => {
194
- 'mustUnderstand' => true
195
- }
196
- }
197
- }
198
- end
199
-
200
- def selector_shell_id(shell_id)
201
- {
202
- "#{SOAP::NS_WSMAN_DMTF}:SelectorSet" => {
203
- "#{SOAP::NS_WSMAN_DMTF}:Selector" => shell_id, :attributes! => {
204
- "#{SOAP::NS_WSMAN_DMTF}:Selector" => {
205
- 'Name' => 'ShellId'
206
- }
207
- }
208
- }
209
- }
210
- end
211
- end
212
- end
213
- end
214
-
215
- # rubocop:enable Metrics/MethodLength
1
+ # Copyright 2016 Shawn Neal <sneal@sneal.net>
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # rubocop:disable Metrics/MethodLength
16
+
17
+ require_relative 'soap'
18
+ require_relative 'iso8601_duration'
19
+
20
+ module WinRM
21
+ module WSMV
22
+ # SOAP header utility mixin
23
+ module Header
24
+ # WSMan URI of the regular Windows cmd shell
25
+ RESOURCE_URI_CMD = 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd'.freeze
26
+
27
+ # WSMan URI for PowerShell
28
+ RESOURCE_URI_POWERSHELL = 'http://schemas.microsoft.com/powershell/Microsoft.PowerShell'.freeze
29
+
30
+ # Merge the various header hashes and make sure we carry all of the attributes
31
+ # through instead of overwriting them.
32
+ def merge_headers(*headers)
33
+ hdr = {}
34
+ headers.each do |h|
35
+ hdr.merge!(h) do |k, v1, v2|
36
+ v1.merge!(v2) if k == :attributes!
37
+ end
38
+ end
39
+ hdr
40
+ end
41
+
42
+ def shared_headers(session_opts)
43
+ {
44
+ "#{SOAP::NS_ADDRESSING}:To" => session_opts[:endpoint],
45
+ "#{SOAP::NS_ADDRESSING}:ReplyTo" => {
46
+ "#{SOAP::NS_ADDRESSING}:Address" =>
47
+ 'http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous',
48
+ :attributes! => {
49
+ "#{SOAP::NS_ADDRESSING}:Address" => {
50
+ 'mustUnderstand' => true
51
+ }
52
+ }
53
+ },
54
+ "#{SOAP::NS_WSMAN_DMTF}:MaxEnvelopeSize" => session_opts[:max_envelope_size],
55
+ "#{SOAP::NS_ADDRESSING}:MessageID" => "uuid:#{SecureRandom.uuid.to_s.upcase}",
56
+ "#{SOAP::NS_WSMAN_MSFT}:SessionId" => "uuid:#{session_opts[:session_id]}",
57
+ "#{SOAP::NS_WSMAN_DMTF}:Locale/" => '',
58
+ "#{SOAP::NS_WSMAN_MSFT}:DataLocale/" => '',
59
+ "#{SOAP::NS_WSMAN_DMTF}:OperationTimeout" =>
60
+ Iso8601Duration.sec_to_dur(session_opts[:operation_timeout]),
61
+ :attributes! => {
62
+ "#{SOAP::NS_WSMAN_DMTF}:MaxEnvelopeSize" => { 'mustUnderstand' => true },
63
+ "#{SOAP::NS_WSMAN_DMTF}:Locale/" => {
64
+ 'xml:lang' => session_opts[:locale], 'mustUnderstand' => false
65
+ },
66
+ "#{SOAP::NS_WSMAN_MSFT}:DataLocale/" => {
67
+ 'xml:lang' => session_opts[:locale], 'mustUnderstand' => false
68
+ },
69
+ "#{SOAP::NS_WSMAN_MSFT}:SessionId" => { 'mustUnderstand' => false }
70
+ }
71
+ }
72
+ end
73
+
74
+ # Helper methods for SOAP Headers
75
+
76
+ def resource_uri_shell(shell_uri)
77
+ {
78
+ "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" => shell_uri, :attributes! => {
79
+ "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" => {
80
+ 'mustUnderstand' => true
81
+ }
82
+ }
83
+ }
84
+ end
85
+
86
+ def resource_uri_cmd
87
+ resource_uri_shell(RESOURCE_URI_CMD)
88
+ end
89
+
90
+ def resource_uri_wmi(namespace = 'root/cimv2/*')
91
+ {
92
+ "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" =>
93
+ "http://schemas.microsoft.com/wbem/wsman/1/wmi/#{namespace}",
94
+ :attributes! => {
95
+ "#{SOAP::NS_WSMAN_DMTF}:ResourceURI" => {
96
+ 'mustUnderstand' => true
97
+ }
98
+ }
99
+ }
100
+ end
101
+
102
+ def action_get
103
+ {
104
+ "#{SOAP::NS_ADDRESSING}:Action" =>
105
+ 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Get',
106
+ :attributes! => {
107
+ "#{SOAP::NS_ADDRESSING}:Action" => {
108
+ 'mustUnderstand' => true
109
+ }
110
+ }
111
+ }
112
+ end
113
+
114
+ def action_delete
115
+ {
116
+ "#{SOAP::NS_ADDRESSING}:Action" =>
117
+ 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete',
118
+ :attributes! => {
119
+ "#{SOAP::NS_ADDRESSING}:Action" => {
120
+ 'mustUnderstand' => true
121
+ }
122
+ }
123
+ }
124
+ end
125
+
126
+ def action_command
127
+ {
128
+ "#{SOAP::NS_ADDRESSING}:Action" =>
129
+ 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Command',
130
+ :attributes! => {
131
+ "#{SOAP::NS_ADDRESSING}:Action" => {
132
+ 'mustUnderstand' => true
133
+ }
134
+ }
135
+ }
136
+ end
137
+
138
+ def action_receive
139
+ {
140
+ "#{SOAP::NS_ADDRESSING}:Action" =>
141
+ 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Receive',
142
+ :attributes! => {
143
+ "#{SOAP::NS_ADDRESSING}:Action" => {
144
+ 'mustUnderstand' => true
145
+ }
146
+ }
147
+ }
148
+ end
149
+
150
+ def action_send
151
+ {
152
+ "#{SOAP::NS_ADDRESSING}:Action" =>
153
+ 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Send',
154
+ :attributes! => {
155
+ "#{SOAP::NS_ADDRESSING}:Action" => {
156
+ 'mustUnderstand' => true
157
+ }
158
+ }
159
+ }
160
+ end
161
+
162
+ def action_signal
163
+ {
164
+ "#{SOAP::NS_ADDRESSING}:Action" =>
165
+ 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Signal',
166
+ :attributes! => {
167
+ "#{SOAP::NS_ADDRESSING}:Action" => {
168
+ 'mustUnderstand' => true
169
+ }
170
+ }
171
+ }
172
+ end
173
+
174
+ def action_enumerate
175
+ {
176
+ "#{SOAP::NS_ADDRESSING}:Action" =>
177
+ 'http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate',
178
+ :attributes! => {
179
+ "#{SOAP::NS_ADDRESSING}:Action" => {
180
+ 'mustUnderstand' => true
181
+ }
182
+ }
183
+ }
184
+ end
185
+
186
+ def action_enumerate_pull
187
+ {
188
+ "#{SOAP::NS_ADDRESSING}:Action" =>
189
+ 'http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull',
190
+ :attributes! => {
191
+ "#{SOAP::NS_ADDRESSING}:Action" => {
192
+ 'mustUnderstand' => true
193
+ }
194
+ }
195
+ }
196
+ end
197
+
198
+ def selector_shell_id(shell_id)
199
+ {
200
+ "#{SOAP::NS_WSMAN_DMTF}:SelectorSet" => {
201
+ "#{SOAP::NS_WSMAN_DMTF}:Selector" => shell_id, :attributes! => {
202
+ "#{SOAP::NS_WSMAN_DMTF}:Selector" => {
203
+ 'Name' => 'ShellId'
204
+ }
205
+ }
206
+ }
207
+ }
208
+ end
209
+ end
210
+ end
211
+ end
212
+
213
+ # rubocop:enable Metrics/MethodLength