Class: WinRM::HTTP::HttpGSSAPI

Inherits:
HttpTransport show all
Defined in:
lib/winrm/http/transport.rb

Overview

Uses Kerberos/GSSAPI to authenticate and encrypt messages rubocop:disable Metrics/ClassLength

Constant Summary

Constants inherited from HttpTransport

WinRM::HTTP::HttpTransport::DEFAULT_RECEIVE_TIMEOUT

Instance Attribute Summary

Attributes inherited from HttpTransport

#endpoint

Instance Method Summary collapse

Methods inherited from HttpTransport

#basic_auth_only!, #no_ssl_peer_verification!, #no_sspi_auth!, #receive_timeout, #receive_timeout=, #ssl_peer_fingerprint_verification!, #verify_ssl_fingerprint, #with_untrusted_ssl_connection

Constructor Details

#initialize(endpoint, realm, service = nil, keytab = nil, opts) ⇒ HttpGSSAPI

rubocop:disable Lint/UnusedMethodArgument

Parameters:

  • endpoint (String, URI)

    the WinRM webservice endpoint

  • realm (String)

    the Kerberos realm we are authenticating to

  • service (String<optional>) (defaults to: nil)

    the service name, default is HTTP

  • keytab (String<optional>) (defaults to: nil)

    the path to a keytab file if you are using one



163
164
165
166
167
168
169
170
171
# File 'lib/winrm/http/transport.rb', line 163

def initialize(endpoint, realm, service = nil, keytab = nil, opts)
  # rubocop:enable Lint/UnusedMethodArgument
  super(endpoint)
  # Remove the GSSAPI auth from HTTPClient because we are doing our own thing
  no_sspi_auth!
  service ||= 'HTTP'
  @service = "#{service}/#{@endpoint.host}@#{realm}"
  init_krb
end

Instance Method Details

#send_request(message) ⇒ Object

Sends the SOAP payload to the WinRM service and returns the service’s SOAP response. If an error occurrs an appropriate error is raised.

Parameters:

  • The (String)

    XML SOAP message



178
179
180
181
182
183
184
185
186
187
188
189
# File 'lib/winrm/http/transport.rb', line 178

def send_request(message)
  resp = send_kerberos_request(message)

  if resp.status == 401
    @logger.debug 'Got 401 - reinitializing Kerberos and retrying one more time'
    init_krb
    resp = send_kerberos_request(message)
  end

  handler = WinRM::ResponseHandler.new(winrm_decrypt(resp.http_body.content), resp.status)
  handler.parse_to_xml
end