add challenges_for
parent
e514ea66df
commit
f4f38a41a5
|
@ -9,16 +9,80 @@ describe "Mechanize AuthStore test" do
|
|||
realm = ""
|
||||
auth_store.add_auth(url, user, password)
|
||||
auth_store.auth_accounts[url].size.should eq 1
|
||||
auth_store.auth_accounts[url][realm].should eq(["kanezoh", "password", nil])
|
||||
auth_store.auth_accounts[url][realm].should eq(["kanezoh", "password", ""])
|
||||
end
|
||||
|
||||
it "credentials_for" do
|
||||
it "test_add_auth_domain" do
|
||||
auth_store = Mechanize::HTTP::AuthStore.new
|
||||
url = URI.parse("http://example.com/")
|
||||
user = "kanezoh"
|
||||
password = "password"
|
||||
domain = "domain"
|
||||
realm = ""
|
||||
auth_store.add_auth(url, user, password)
|
||||
auth_store.credentials_for(url, realm).should eq ["kanezoh", "password", nil]
|
||||
auth_store.add_auth(url, user, password, nil, domain)
|
||||
auth_store.auth_accounts[url][realm].should eq(["kanezoh", "password", "domain"])
|
||||
end
|
||||
|
||||
it "test_add_auth_realm" do
|
||||
auth_store = Mechanize::HTTP::AuthStore.new
|
||||
url = URI.parse("http://example.com/")
|
||||
auth_store.add_auth url, "user1", "pass"
|
||||
auth_store.add_auth url, "user2", "pass", "realm"
|
||||
|
||||
expected = {
|
||||
url => {
|
||||
"" => ["user1", "pass", ""],
|
||||
"realm" => ["user2", "pass", ""],
|
||||
},
|
||||
}
|
||||
|
||||
auth_store.auth_accounts.should eq expected
|
||||
end
|
||||
|
||||
it "test_add_auth_realm_case" do
|
||||
auth_store = Mechanize::HTTP::AuthStore.new
|
||||
url = URI.parse("http://example.com/")
|
||||
auth_store.add_auth url, "user1", "pass", "realm"
|
||||
auth_store.add_auth url, "user2", "pass", "Realm"
|
||||
|
||||
expected = {
|
||||
url => {
|
||||
"realm" => ["user1", "pass", ""],
|
||||
"Realm" => ["user2", "pass", ""],
|
||||
},
|
||||
}
|
||||
|
||||
auth_store.auth_accounts.should eq expected
|
||||
end
|
||||
|
||||
it "test_add_auth_string" do
|
||||
auth_store = Mechanize::HTTP::AuthStore.new
|
||||
url = URI.parse("http://example.com/")
|
||||
auth_store.add_auth "#{url}/path", "user", "pass"
|
||||
|
||||
expected = {
|
||||
url => {
|
||||
"" => ["user", "pass", ""],
|
||||
},
|
||||
}
|
||||
|
||||
auth_store.auth_accounts.should eq expected
|
||||
end
|
||||
|
||||
it "test_credentials_eh" do
|
||||
auth_store = Mechanize::HTTP::AuthStore.new
|
||||
url = URI.parse("http://example.com/")
|
||||
|
||||
challenges = [
|
||||
Mechanize::HTTP::AuthChallenge.new("Basic", {"realm" => "r"}),
|
||||
Mechanize::HTTP::AuthChallenge.new("Digest", {"realm" => "r"}),
|
||||
]
|
||||
|
||||
auth_store.credentials?(url, challenges).should_not eq true
|
||||
|
||||
auth_store.add_auth url, "user", "pass"
|
||||
|
||||
auth_store.credentials?(url, challenges).should eq true
|
||||
auth_store.credentials?("#{url}/path", challenges).should eq true
|
||||
end
|
||||
end
|
||||
|
|
|
@ -65,8 +65,6 @@ describe "Mechanize HTTP Authentication test" do
|
|||
result[1].raw.should eq expect[1].raw
|
||||
end
|
||||
|
||||
|
||||
|
||||
it "test_parse_multiple_without_comma_delimiter" do
|
||||
expect = [
|
||||
challenge("Basic", {"realm" => "foo"}, "Basic realm=foo"),
|
||||
|
|
|
@ -37,7 +37,12 @@ class Mechanize
|
|||
# The name of the realm for this challenge
|
||||
|
||||
def realm_name
|
||||
params["realm"] if Hash === params # NTLM has a string for params
|
||||
params_value = params
|
||||
if params_value.is_a?(Hash)
|
||||
params_value["realm"] # NTLM has a string for params
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
|
|
|
@ -2,38 +2,54 @@ class Mechanize
|
|||
module HTTP
|
||||
# This class store info for HTTP Authentication.
|
||||
class AuthStore
|
||||
getter auth_accounts : Hash(URI, Hash(String, Array(String?)))
|
||||
getter auth_accounts : Hash(URI, Hash(String, Array(String)))
|
||||
|
||||
def initialize
|
||||
@auth_accounts = Hash(URI, Hash(String, Array(String?))).new
|
||||
@auth_accounts = Hash(URI, Hash(String, Array(String))).new
|
||||
end
|
||||
|
||||
def add_auth(uri : String | URI, user : String, pass : String, realm : String? = nil, domain : String? = nil)
|
||||
unless uri.is_a?(URI)
|
||||
uri = URI.new(uri)
|
||||
uri = URI.parse(uri)
|
||||
end
|
||||
# uri += '/'
|
||||
uri.path = "/"
|
||||
uri.user = nil
|
||||
uri.password = nil
|
||||
if realm.nil?
|
||||
realm = ""
|
||||
end
|
||||
realm = "" if realm.nil?
|
||||
domain = "" if domain.nil?
|
||||
|
||||
realm_hash = {realm => [user, pass, domain]}
|
||||
if auth_accounts.has_key?(uri)
|
||||
auth_accounts[uri].merge!(realm_hash)
|
||||
else
|
||||
auth_accounts[uri] = realm_hash
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# Returns true if credentials exist for the +challenges+ from the server at
|
||||
# +uri+.
|
||||
|
||||
def credentials?(uri, challenges)
|
||||
challenges.any? do |challenge|
|
||||
credentials_for uri, challenge.realm_name
|
||||
end
|
||||
end
|
||||
|
||||
# Retrieves credentials for +realm+ on the server at +uri+.
|
||||
def credentials_for(uri : String | URI, realm : String) : Array(String?)
|
||||
def credentials_for(uri : String | URI, realm : String?) : Array(String)?
|
||||
unless uri.is_a?(URI)
|
||||
uri = URI.new(uri)
|
||||
uri = URI.parse(uri)
|
||||
end
|
||||
# uri += '/'
|
||||
uri.path = "/"
|
||||
uri.user = nil
|
||||
uri.password = nil
|
||||
realm = "" if realm.nil?
|
||||
|
||||
realms = auth_accounts[uri]
|
||||
realms = auth_accounts.fetch(uri, nil)
|
||||
return nil if realms.nil?
|
||||
|
||||
realms[realm]
|
||||
realms.fetch(realm, nil) || realms.fetch("", nil)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue