Skip to content
This repository was archived by the owner on Dec 19, 2024. It is now read-only.

Commit cb5c29c

Browse files
authored
Fix SSO errors in agent/server mode (#38)
* Handle include LoadError * Fix "undefined method `empty?' for #<URI::HTTP:>"
1 parent f5f502f commit cb5c29c

File tree

3 files changed

+60
-57
lines changed

3 files changed

+60
-57
lines changed

lib/puppet/parser/functions/oracle_sso.rb

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
module Puppet::Parser::Functions
2-
require 'puppet_x/util.rb'
2+
begin
3+
require 'puppet_x/aco/util'
4+
rescue LoadError
5+
mod = Puppet::Module.find('oracle_java', Puppet[:environment].to_s)
6+
require File.join mod.path, 'lib/puppet_x/aco/util'
7+
end
38

49
newfunction(:oracle_sso, :type => :rvalue) do |args|
510
fileuri = args[0]
611
ssousername = args[1]
712
password = args[2]
813

914
cookies = ['oraclelicense=accept-securebackup-cookie']
10-
auth_required = false
1115

1216
#
1317
# Step 1: try unauthenticated download from given URI
@@ -16,19 +20,18 @@ module Puppet::Parser::Functions
1620
#
1721

1822
begin
19-
response, _ = PuppetX::Util.request(fileuri, 'HEAD', cookies)
20-
if response.uri.host == 'login.oracle.com'
23+
uri, _, _ = PuppetX::Aco::Util.request(fileuri, 'HEAD', cookies)
24+
if uri.host == 'login.oracle.com'
2125
debug("Authentication required for #{fileuri}")
22-
elsif response.uri.request_uri.include?('AuthParam=')
26+
elsif uri.query.include?('AuthParam=')
2327
debug("Authentication not required for #{fileuri}")
24-
return response.uri.to_s
28+
return uri.to_s
2529
else
2630
raise "Unknown failure while fetching #{fileuri}"
2731
end
2832
rescue Net::HTTPServerException => e
2933
debug("File not found at #{fileuri}")
3034
debug('Trying authenticated download...')
31-
auth_required = true
3235
fileuri = fileuri.gsub!('otn-pub', 'otn')
3336
end
3437

@@ -40,7 +43,7 @@ module Puppet::Parser::Functions
4043

4144
# retrieve SSO form and read OAM_REQ parameter value
4245
debug('Retrieving Oracle.com SSO form.')
43-
response, cookies = PuppetX::Util.request(fileuri, 'GET', cookies)
46+
_, response, cookies = PuppetX::Aco::Util.request(fileuri, 'GET', cookies)
4447
matchdata = /name="OAM_REQ" value="(.+?)"/.match(response.body)
4548
if matchdata and !matchdata.captures.nil?
4649
oamreq = matchdata[1]
@@ -54,7 +57,7 @@ module Puppet::Parser::Functions
5457
ssouri = URI('https://login.oracle.com/oam/server/sso/auth_cred_submit')
5558
cookies.push('s_cc=true')
5659

57-
request = Net::HTTP::Post.new(ssouri, {'user-agent' => 'Mozilla/5.0 (Puppet)', 'cookie' => cookies.join('; ')})
60+
request = Net::HTTP::Post.new(ssouri.request_uri, {'user-agent' => 'Mozilla/5.0 (Puppet)', 'cookie' => cookies.join('; ')})
5861
request.set_form_data('ssousername' => ssousername, 'password' => password)
5962
request.body += "&OAM_REQ=#{oamreq}"
6063

@@ -79,9 +82,9 @@ module Puppet::Parser::Functions
7982
#
8083

8184
begin
82-
response, _ = PuppetX::Util.request(location, 'HEAD', cookies)
83-
if response.uri.request_uri.include?('AuthParam=')
84-
return response.uri.to_s
85+
uri, _, _ = PuppetX::Aco::Util.request(location, 'HEAD', cookies)
86+
if uri.query.include?('AuthParam=')
87+
return uri.to_s
8588
else
8689
raise "Unknown failure while fetching #{fileuri}"
8790
end

lib/puppet_x/aco/util.rb

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
module PuppetX
2+
module Aco
3+
module Util
4+
5+
require 'net/http'
6+
7+
def self.request(uri_str, method = nil, cookies = [], limit = 10)
8+
raise ArgumentError, 'too many HTTP redirects' if limit == 0
9+
10+
uri = URI(uri_str)
11+
12+
case method
13+
when 'POST' then
14+
reqmethod = Net::HTTP::Post
15+
when 'HEAD' then
16+
reqmethod = Net::HTTP::Head
17+
else
18+
reqmethod = Net::HTTP::Get
19+
end
20+
21+
request = reqmethod.new(uri.request_uri, {'user-agent' => 'Mozilla/5.0 (Puppet)', 'cookie' => cookies.join('; ')})
22+
response = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
23+
http.request(request)
24+
end
25+
26+
# cache cookies for subsequent requests
27+
response_cookies = response.get_fields('set-cookie')
28+
if !response_cookies.nil?
29+
response_cookies.each { |c| cookies.push(c.split('; ')[0]) }
30+
end
31+
32+
case response
33+
when Net::HTTPSuccess then
34+
return uri, response, cookies
35+
when Net::HTTPRedirection then
36+
location = response['location']
37+
request(location, method = method, cookies, limit - 1)
38+
else
39+
return response.value, nil
40+
end
41+
end
42+
43+
end
44+
end
45+
end

lib/puppet_x/util.rb

Lines changed: 0 additions & 45 deletions
This file was deleted.

0 commit comments

Comments
 (0)