1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
# frozen_string_literal: true
module HTTPX
module Plugins
#
# https://gitlab.com/os85/httpx/wikis/Auth#ntlm-auth
#
module NTLMAuth
class << self
def load_dependencies(klass)
require_relative "auth/ntlm"
klass.plugin(:auth)
end
def extra_options(options)
options.merge(max_concurrent_requests: 1)
end
end
module OptionsMethods
private
def option_ntlm(value)
raise TypeError, ":ntlm must be a #{Authentication::Ntlm}" unless value.is_a?(Authentication::Ntlm)
value
end
end
module InstanceMethods
def ntlm_auth(user, password, domain = nil)
with(ntlm: Authentication::Ntlm.new(user, password, domain: domain))
end
private
def send_requests(*requests)
requests.flat_map do |request|
ntlm = request.options.ntlm
if ntlm
request.authorize(ntlm.negotiate)
probe_response = wrap { super(request).first }
return probe_response unless probe_response.is_a?(Response)
if probe_response.status == 401 && ntlm.can_authenticate?(probe_response.headers["www-authenticate"])
request.transition(:idle)
request.unauthorize!
request.authorize(ntlm.authenticate(request, probe_response.headers["www-authenticate"]).encode("utf-8"))
super(request)
else
probe_response
end
else
super(request)
end
end
end
end
end
register_plugin :ntlm_auth, NTLMAuth
end
end
|