Skip to content

Commit c8f48c3

Browse files
committed
Compile JRE First
Previously, the JRE was the first component to be laid down on disk during the compile phase which enabled all subsequent components to use it if necessary. In a recent change, this ordering was modified such that it ran after frameworks preventing them from using the JRE during compile. This change moves the JRE back to its original position and adds additional security provider functionality that was formerly enabled by the move. [resolves cloudfoundry#432]
1 parent 91d0a6e commit c8f48c3

10 files changed

Lines changed: 123 additions & 65 deletions

config/components.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,5 @@ frameworks:
5858
- "JavaBuildpack::Framework::SpringAutoReconfiguration"
5959
- "JavaBuildpack::Framework::SpringInsight"
6060
- "JavaBuildpack::Framework::YourKitProfiler"
61+
- "JavaBuildpack::Framework::SecurityProviders"
6162
- "JavaBuildpack::Framework::JavaOpts"

lib/java_buildpack/buildpack.rb

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,10 @@ def compile
6060

6161
container = component_detection('container', @containers, true).first
6262
no_container unless container
63-
jre = component_detection('JRE', @jres, true).first
64-
frameworks = component_detection('framework', @frameworks, false)
6563

66-
frameworks.each(&:compile)
67-
jre.compile
64+
component_detection('JRE', @jres, true).first.compile
65+
component_detection('framework', @frameworks, false).each(&:compile)
66+
6867
container.compile
6968
end
7069

@@ -75,15 +74,13 @@ def compile
7574
def release
7675
container = component_detection('container', @containers, true).first
7776
no_container unless container
78-
jre = component_detection('JRE', @jres, true).first
79-
frameworks = component_detection('framework', @frameworks, false)
80-
81-
frameworks.map(&:release)
8277

8378
commands = []
84-
commands << jre.release
85-
commands << container.release
79+
commands << component_detection('JRE', @jres, true).first.release
8680

81+
component_detection('framework', @frameworks, false).map(&:release)
82+
83+
commands << container.release
8784
command = commands.flatten.compact.join(' && ')
8885

8986
payload = {

lib/java_buildpack/framework/container_security_provider.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class ContainerSecurityProvider < JavaBuildpack::Component::VersionedDependencyC
2727
# (see JavaBuildpack::Component::BaseComponent#compile)
2828
def compile
2929
download_jar
30-
@droplet.security_providers << 'org.cloudfoundry.security.CloudFoundryContainerProvider'
30+
@droplet.security_providers.insert 1, 'org.cloudfoundry.security.CloudFoundryContainerProvider'
3131
end
3232

3333
# (see JavaBuildpack::Component::BaseComponent#release)

lib/java_buildpack/framework/dyadic_ekm_security_provider.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def compile
3131
setup_ext_dir
3232

3333
@droplet.copy_resources
34-
@droplet.security_providers << 'com.dyadicsec.provider.DYCryptoProvider'
34+
@droplet.security_providers.insert 2, 'com.dyadicsec.provider.DYCryptoProvider'
3535

3636
credentials = @application.services.find_service(FILTER)['credentials']
3737
write_key credentials['key']

lib/java_buildpack/framework/luna_security_provider.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def compile
3131
setup_ext_dir
3232

3333
@droplet.copy_resources
34-
@droplet.security_providers << 'com.safenetinc.luna.provider.LunaProvider'
34+
@droplet.security_providers.insert 2, 'com.safenetinc.luna.provider.LunaProvider'
3535

3636
credentials = @application.services.find_service(FILTER)['credentials']
3737
write_client credentials['client']

lib/java_buildpack/framework/protect_app_security_provider.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def compile
3232
download_zip false
3333

3434
@droplet.copy_resources
35-
@droplet.security_providers << 'com.ingrian.security.nae.IngrianProvider'
35+
@droplet.security_providers.insert 2, 'com.ingrian.security.nae.IngrianProvider'
3636

3737
credentials = @application.services.find_service(FILTER)['credentials']
3838

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# Cloud Foundry Java Buildpack
2+
# Copyright 2013-2017 the original author or authors.
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
16+
require 'java_buildpack/component/base_component'
17+
require 'java_buildpack/framework'
18+
require 'java_buildpack/util/dash_case'
19+
20+
module JavaBuildpack
21+
module Framework
22+
23+
# Encapsulates the functionality for contributing custom Security Providers to an application.
24+
class SecurityProviders < JavaBuildpack::Component::BaseComponent
25+
26+
# (see JavaBuildpack::Component::BaseComponent#detect)
27+
def detect
28+
SecurityProviders.to_s.dash_case
29+
end
30+
31+
# (see JavaBuildpack::Component::BaseComponent#compile)
32+
def compile
33+
@droplet.security_providers.write_to java_security
34+
end
35+
36+
# (see JavaBuildpack::Component::BaseComponent#release)
37+
def release
38+
@droplet.java_opts
39+
.add_system_property('java.ext.dirs', @droplet.extension_directories.as_paths)
40+
.add_system_property('java.security.properties', java_security)
41+
end
42+
43+
private
44+
45+
def java_security
46+
@droplet.sandbox + 'java.security'
47+
end
48+
49+
end
50+
51+
end
52+
end

lib/java_buildpack/jre/open_jdk_like_security_providers.rb

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,12 @@ def detect
3131

3232
# (see JavaBuildpack::Component::BaseComponent#compile)
3333
def compile
34-
unless existing_security.nil?
35-
existing = existing_security_providers existing_security
36-
37-
@droplet.security_providers.insert 0, existing.shift
38-
@droplet.security_providers.concat existing
39-
end
40-
41-
@droplet.security_providers.write_to new_security
34+
@droplet.security_providers.concat existing_security_providers(java_security) unless java_security.nil?
4235
end
4336

4437
# (see JavaBuildpack::Component::BaseComponent#release)
4538
def release
46-
unless existing_security.nil?
47-
@droplet.extension_directories << existing_security.parent.parent + 'ext'
48-
end
49-
50-
@droplet.java_opts
51-
.add_system_property('java.ext.dirs', @droplet.extension_directories.as_paths)
52-
.add_system_property('java.security.properties', new_security)
39+
@droplet.extension_directories << java_security.parent.parent + 'ext' unless java_security.nil?
5340
end
5441

5542
private
@@ -60,12 +47,6 @@ def release
6047

6148
private_constant :JRE_SECURITY, :SERVER_JRE_SECURITY
6249

63-
def existing_security
64-
return jre_security if jre_security.exist?
65-
return server_jre_security if server_jre_security.exist?
66-
nil
67-
end
68-
6950
def existing_security_providers(existing_security)
7051
JavaBuildpack::Util::Properties.new(existing_security)
7152
.keep_if { |key, _| key =~ /security.provider/ }
@@ -77,12 +58,14 @@ def index(entry)
7758
entry.first.match(/^security\.provider\.(\d+)/).captures.first.to_i
7859
end
7960

80-
def jre_security
81-
@droplet.java_home.root + JRE_SECURITY
61+
def java_security
62+
return jre_security if jre_security.exist?
63+
return server_jre_security if server_jre_security.exist?
64+
nil
8265
end
8366

84-
def new_security
85-
@droplet.sandbox + 'java.security'
67+
def jre_security
68+
@droplet.java_home.root + JRE_SECURITY
8669
end
8770

8871
def server_jre_security
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Cloud Foundry Java Buildpack
2+
# Copyright 2013-2017 the original author or authors.
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
16+
require 'spec_helper'
17+
require 'component_helper'
18+
require 'fileutils'
19+
require 'java_buildpack/framework/security_providers'
20+
21+
describe JavaBuildpack::Framework::SecurityProviders do
22+
include_context 'component_helper'
23+
24+
it 'adds extension directories to system properties' do
25+
component.release
26+
27+
expect(java_opts).to include('-Djava.ext.dirs=$PWD/.java-buildpack/security_providers/test-extension-directory-1:' \
28+
'$PWD/.java-buildpack/security_providers/test-extension-directory-2')
29+
end
30+
31+
it 'writes new security properties' do
32+
component.compile
33+
34+
expect(sandbox + 'java.security').to exist
35+
end
36+
37+
it 'adds security properties to system properties' do
38+
component.release
39+
40+
expect(java_opts).to include('-Djava.security.properties=$PWD/.java-buildpack/security_providers/' \
41+
'java.security')
42+
end
43+
44+
end

spec/java_buildpack/jre/open_jdk_like_security_providers_spec.rb

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,22 @@
2121
describe JavaBuildpack::Jre::OpenJDKLikeSecurityProviders do
2222
include_context 'component_helper'
2323

24-
it 'adds extension directories with no JRE default to system properties' do
24+
it 'does not add extension directories with no JRE default' do
2525
component.release
2626

27-
expect(java_opts).to include('-Djava.ext.dirs=$PWD/.java-buildpack/open_jdk_like_security_providers/' \
28-
'test-extension-directory-1:$PWD/.java-buildpack/open_jdk_like_security_providers/' \
29-
'test-extension-directory-2')
27+
expect(extension_directories).to contain_exactly(sandbox + 'test-extension-directory-1',
28+
sandbox + 'test-extension-directory-2')
3029
end
3130

3231
it 'adds security providers' do
33-
3432
FileUtils.mkdir_p(java_home.root + 'lib/security')
3533
FileUtils.cp 'spec/fixtures/java.security', java_home.root + 'lib/security'
3634

3735
component.compile
3836

39-
expect(security_providers).to eq %w[sun.security.provider.Sun
40-
test-security-provider-1
37+
expect(security_providers).to eq %w[test-security-provider-1
4138
test-security-provider-2
39+
sun.security.provider.Sun
4240
sun.security.rsa.SunRsaSign sun.security.ec.SunEC
4341
com.sun.net.ssl.internal.ssl.Provider
4442
com.sun.crypto.provider.SunJCE
@@ -49,37 +47,20 @@
4947
apple.security.AppleProvider]
5048
end
5149

52-
it 'writes new security properties' do
53-
component.compile
54-
55-
expect(sandbox + 'java.security').to exist
56-
end
57-
5850
it 'adds extension directories with JRE default to system properties' do
5951
FileUtils.mkdir_p(java_home.root + 'lib/security/java.security')
6052

6153
component.release
6254

63-
expect(java_opts).to include('-Djava.ext.dirs=$PWD/.java-buildpack/open_jdk_like_security_providers/' \
64-
'test-extension-directory-1:$PWD/.java-buildpack/open_jdk_like_security_providers/' \
65-
'test-extension-directory-2:$PWD/.test-java-home/lib/ext')
55+
expect(extension_directories).to include(java_home.root + 'lib/ext')
6656
end
6757

6858
it 'adds extension directories with Server JRE default to system properties' do
6959
FileUtils.mkdir_p(java_home.root + 'jre/lib/security/java.security')
7060

7161
component.release
7262

73-
expect(java_opts).to include('-Djava.ext.dirs=$PWD/.java-buildpack/open_jdk_like_security_providers/' \
74-
'test-extension-directory-1:$PWD/.java-buildpack/open_jdk_like_security_providers/' \
75-
'test-extension-directory-2:$PWD/.test-java-home/jre/lib/ext')
76-
end
77-
78-
it 'adds security properties to system properties' do
79-
component.release
80-
81-
expect(java_opts).to include('-Djava.security.properties=$PWD/.java-buildpack/open_jdk_like_security_providers/' \
82-
'java.security')
63+
expect(extension_directories).to include(java_home.root + 'jre/lib/ext')
8364
end
8465

8566
end

0 commit comments

Comments
 (0)