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

Commit 9d04d99

Browse files
authored
Add Oracle SSO authentication (#36)
Custom 'oracle_sso' function, retrieves download URL from Oracle.com, authenticate against Oracle SSO if needed.
1 parent 1767324 commit 9d04d99

File tree

5 files changed

+171
-6
lines changed

5 files changed

+171
-6
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
module Puppet::Parser::Functions
2+
require 'puppet_x/util.rb'
3+
4+
newfunction(:oracle_sso, :type => :rvalue) do |args|
5+
fileuri = args[0]
6+
ssousername = args[1]
7+
password = args[2]
8+
9+
cookies = ['oraclelicense=accept-securebackup-cookie']
10+
auth_required = false
11+
12+
#
13+
# Step 1: try unauthenticated download from given URI
14+
# Success: URI contains AuthParam parameter and HEAD request returns 200
15+
# Failure: 404 or redirect to Oracle SSO
16+
#
17+
18+
begin
19+
response, _ = PuppetX::Util.request(fileuri, 'HEAD', cookies)
20+
if response.uri.host == 'login.oracle.com'
21+
debug("Authentication required for #{fileuri}")
22+
elsif response.uri.request_uri.include?('AuthParam=')
23+
debug("Authentication not required for #{fileuri}")
24+
return response.uri.to_s
25+
else
26+
raise "Unknown failure while fetching #{fileuri}"
27+
end
28+
rescue Net::HTTPServerException => e
29+
debug("File not found at #{fileuri}")
30+
debug('Trying authenticated download...')
31+
auth_required = true
32+
fileuri = fileuri.gsub!('otn-pub', 'otn')
33+
end
34+
35+
#
36+
# Step 2: authenticate against Oracle SSO
37+
# Success: requested form contains OAM_REQ parameter and POST returns a redirect
38+
# Failure: POST returns 200 or http error
39+
#
40+
41+
# retrieve SSO form and read OAM_REQ parameter value
42+
debug('Retrieving Oracle.com SSO form.')
43+
response, cookies = PuppetX::Util.request(fileuri, 'GET', cookies)
44+
matchdata = /name="OAM_REQ" value="(.+?)"/.match(response.body)
45+
if matchdata and !matchdata.captures.nil?
46+
oamreq = matchdata[1]
47+
debug('Found OAM_REQ parameter from Oracle.com SSO form.')
48+
else
49+
raise 'Could not retrieve OAM_REQ parameter from Oracle.com SSO form.'
50+
end
51+
52+
# submit authentication form
53+
debug('Submitting Oracle.com SSO form.')
54+
ssouri = URI('https://login.oracle.com/oam/server/sso/auth_cred_submit')
55+
cookies.push('s_cc=true')
56+
57+
request = Net::HTTP::Post.new(ssouri, {'user-agent' => 'Mozilla/5.0 (Puppet)', 'cookie' => cookies.join('; ')})
58+
request.set_form_data('ssousername' => ssousername, 'password' => password)
59+
request.body += "&OAM_REQ=#{oamreq}"
60+
61+
response = Net::HTTP.start(ssouri.host, ssouri.port, :use_ssl => true) { |http| http.request(request) }
62+
case response
63+
when Net::HTTPRedirection
64+
location = response['location']
65+
if URI(location).request_uri.start_with?('/osso_login_success')
66+
debug('Sign-on success.')
67+
response.get_fields('set-cookie').each { |c| cookies.push(c.split('; ')[0]) }
68+
else
69+
raise 'Sign-on failed. Check your Oracle.com credentials.'
70+
end
71+
else
72+
raise 'Sign-on failed. Check your Oracle.com credentials.'
73+
end
74+
75+
#
76+
# Step 3: try authenticated download from transformed URI
77+
# Success: URI contains AuthParam parameter and HEAD request returns 200
78+
# Failure: 404 or redirect to Oracle SSO
79+
#
80+
81+
begin
82+
response, _ = PuppetX::Util.request(location, 'HEAD', cookies)
83+
if response.uri.request_uri.include?('AuthParam=')
84+
return response.uri.to_s
85+
else
86+
raise "Unknown failure while fetching #{fileuri}"
87+
end
88+
rescue Net::HTTPServerException => e
89+
raise "File not found at #{fileuri}"
90+
end
91+
end
92+
end

lib/puppet_x/util.rb

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
module PuppetX
2+
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, {'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 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+
45+
end

manifests/download.pp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,22 @@
2222
}
2323

2424
Archive {
25-
cookie => 'oraclelicense=accept-securebackup-cookie',
26-
source => "${oracle_java::download_url_real}/${oracle_java::filename_real}",
2725
proxy_server => $oracle_java::proxy_server,
2826
proxy_type => $oracle_java::proxy_type,
2927
require => File[$oracle_java::install_path]
3028
}
3129

30+
# pass credentials to Oracle SSO for authenticated downloads
31+
if $oracle_java::oracle_url {
32+
Archive {
33+
source => oracle_sso("${oracle_java::download_url_real}/${oracle_java::filename_real}", $oracle_java::ssousername, $oracle_java::ssopassword)
34+
}
35+
} else {
36+
Archive {
37+
source => "${oracle_java::download_url_real}/${oracle_java::filename_real}"
38+
}
39+
}
40+
3241
# with checksum check
3342
if $oracle_java::check_checksum {
3443
Archive {

manifests/init.pp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
# envionment type to install (valid: 'jre'|'jdk')
1313
# [*format*]
1414
# archive format (valid: 'rpm'|'tar.gz')
15+
# [*ssousername*]
16+
# user name of oracle.com account
17+
# [*ssopassword*]
18+
# password of oracle.com account
1519
# [*install_path*]
1620
# defines the root path where the Java archives are extracted. Requires 'tar.gz' format
1721
# [*check_checksum*]
@@ -56,6 +60,8 @@
5660
$build = undef,
5761
$type = 'jre',
5862
$format = undef,
63+
$ssousername = undef,
64+
$ssopassword = undef,
5965
$check_checksum = true,
6066
$checksum = undef,
6167
$add_alternative = false,
@@ -178,8 +184,10 @@
178184
# define download URL
179185
if !$download_url {
180186
$download_url_real = "http://download.oracle.com/otn-pub/java/jdk/${version_final}${build_real}${urlcode_real}"
187+
$oracle_url = true
181188
} else {
182189
$download_url_real = $download_url
190+
$oracle_url = false
183191
}
184192

185193
# define package name

manifests/installation.pp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@
125125
# associate build number to release version
126126
case $maj_version {
127127
'9' : {
128-
case $oracle_java::min_version {
128+
case $min_version {
129129
'0' : { $buildnumber = '+181' }
130-
default : { fail("Unreleased Java SE version ${oracle_java::version_real}") }
130+
default : { fail("Unreleased Java SE version ${version_real}") }
131131
}
132132
}
133133
'8' : {
@@ -224,8 +224,10 @@
224224
# define download URL
225225
if !$download_url {
226226
$download_url_real = "http://download.oracle.com/otn-pub/java/jdk/${version_final}${build_real}${urlcode_real}"
227+
$oracle_url = true
227228
} else {
228229
$download_url_real = $download_url
230+
$oracle_url = false
229231
}
230232

231233
# -------------#
@@ -552,13 +554,22 @@
552554
}
553555

554556
Archive {
555-
cookie => 'oraclelicense=accept-securebackup-cookie',
556-
source => "${download_url_real}/${filename_real}",
557557
proxy_server => $proxy_server,
558558
proxy_type => $proxy_type,
559559
require => File[$install_path]
560560
}
561561

562+
# pass credentials to Oracle SSO for authenticated downloads
563+
if $oracle_url {
564+
Archive {
565+
source => oracle_sso("${download_url_real}/${filename_real}", $oracle_java::ssousername, $oracle_java::ssopassword)
566+
}
567+
} else {
568+
Archive {
569+
source => "${download_url_real}/${filename_real}",
570+
}
571+
}
572+
562573
# download archive
563574
if $maj_version == '6' {
564575
archive { "${install_path}/${filename_real}":

0 commit comments

Comments
 (0)