Skip to content

Commit 2a52c3e

Browse files
committed
Merge branch 'master' of github.com:treydock/puppet-module-keycloak
2 parents 26e4251 + 85f757e commit 2a52c3e

File tree

8 files changed

+55
-71
lines changed

8 files changed

+55
-71
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -603,9 +603,9 @@ The path for `install_dir` will be joined with `bin/kcadm.sh` to produce the ful
603603
The keycloak_required_action type can be used to define actions a user must perform during the authentication process.
604604
A user will not be able to complete the authentication process until these actions are complete. For instance, change a one-time password, accept T&C, etc.
605605

606-
The name for an action is `$alias on $realm`.
606+
The name for an action is `$provider_id on $realm`.
607607

608-
**Important**: actions from puppet config and from a server are matched based on a combination of alias and realm, so edition of aliases is not supported.
608+
**Important**: The keycloak rest api documentation uses the term `alias` which will be filled with the value of `provider_id` in this module.
609609

610610
```puppet
611611
# Minimal example

lib/puppet/provider/keycloak_required_action/kcadm.rb

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def self.prefetch(resources)
1111
action_providers = instances
1212
resources.each_key do |name|
1313
provider = action_providers.find do |c|
14-
c.alias == resources[name][:alias] && c.realm == resources[name][:realm]
14+
c.provider_id == resources[name][:provider_id] && c.realm == resources[name][:realm]
1515
end
1616
if provider
1717
resources[name].provider = provider
@@ -34,7 +34,6 @@ def self.instances
3434
required_actions.each do |a|
3535
action = {
3636
ensure: :present,
37-
alias: a['alias'],
3837
display_name: a['name'],
3938
realm: realm,
4039
enabled: a['enabled'],
@@ -61,7 +60,6 @@ def self.instances
6160
unregistered_actions.each do |a|
6261
action = {
6362
ensure: :absent,
64-
alias: a['providerId'],
6563
display_name: a['name'],
6664
realm: realm,
6765
enabled: false,
@@ -105,18 +103,17 @@ def create
105103
# Asigning property_flush to is needed to make the flush method to
106104
# configure properties of the required action after the registration.
107105
@property_flush = resource.to_hash
108-
@property_hash[:alias] = resource[:provider_id] # Initially it's equal to the provider id until configuration is applied to it
109106
@property_hash[:ensure] = :present
110107
end
111108

112109
def destroy
113110
Puppet.debug('Keycloak required action: destroy')
114111
begin
115-
kcadm('delete', "authentication/required-actions/#{@property_hash[:alias]}", resource[:realm])
112+
kcadm('delete', "authentication/required-actions/#{@property_hash[:provider_id]}", resource[:realm])
116113
rescue StandardError => e
117114
raise Puppet::Error, "kcadm deletion of required action failed\nError message: #{e.message}"
118115
end
119-
Puppet.info("Keycloak: deregistered required action #{@property_hash[:alias]} for #{resource[:realm]}")
116+
Puppet.info("Keycloak: deregistered required action #{@property_hash[:provider_id]} for #{resource[:realm]}")
120117
@property_hash.clear
121118
end
122119

@@ -130,16 +127,16 @@ def flush
130127

131128
begin
132129
t = Tempfile.new('keycloak_required_action_configure')
133-
t.write(JSON.pretty_generate(alias: resource[:alias],
130+
t.write(JSON.pretty_generate(alias: resource[:provider_id],
134131
name: resource[:display_name] || @property_hash[:display_name],
135132
enabled: resource[:enabled],
136133
priority: resource[:priority],
137134
config: resource[:config] || {},
138135
defaultAction: resource[:default]))
139136
t.close
140137
Puppet.debug(IO.read(t.path))
141-
kcadm('update', "authentication/required-actions/#{@property_hash[:alias]}", resource[:realm], t.path)
142-
Puppet.info("Keycloak: configured required action #{@property_hash[:alias]} (provider #{resource[:provider_id]}) for #{resource[:realm]}")
138+
kcadm('update', "authentication/required-actions/#{@property_hash[:provider_id]}", resource[:realm], t.path)
139+
Puppet.info("Keycloak: configured required action #{@property_hash[:display_name]} (provider #{resource[:provider_id]}) for #{resource[:realm]}")
143140
rescue StandardError => e
144141
raise Puppet::Error, "kcadm configuration of required action failed\nError message: #{e.message}"
145142
end
@@ -150,7 +147,6 @@ def flush
150147

151148
def to_keycloak_representation(resource)
152149
{
153-
alias: resource[:alias],
154150
name: resource[:display_name],
155151
realm: resource[:realm],
156152
providerId: resource[:provider_id],

lib/puppet/type/keycloak_required_action.rb

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
@example Enable Webauthn Register and make it default
1010
keycloak_required_action { 'webauthn-register on master':
1111
ensure => present,
12-
alias => 'webauthn-register',
1312
provider_id => 'webauthn-register',
1413
display_name => 'Webauthn Register',
1514
default => true,
@@ -40,16 +39,9 @@
4039
desc 'realm'
4140
end
4241

43-
newparam(:alias, namevar: true) do
44-
desc 'Alias.'
45-
end
46-
47-
newparam(:provider_id) do
48-
desc 'providerId of the required action. Default to `alias`'
42+
newparam(:provider_id, namevar: true) do
43+
desc 'providerId of the required action.'
4944
munge { |v| v.to_s }
50-
defaultto do
51-
@resource[:alias]
52-
end
5345
end
5446

5547
newproperty(:display_name) do
@@ -107,7 +99,7 @@ def self.title_patterns
10799
%r{^((\S+) on (\S+))$},
108100
[
109101
[:name],
110-
[:alias],
102+
[:provider_id],
111103
[:realm]
112104
]
113105
],
@@ -122,7 +114,7 @@ def self.title_patterns
122114

123115
validate do
124116
required_properties = [
125-
:alias,
117+
:provider_id,
126118
:realm
127119
]
128120
required_properties.each do |property|

manifests/sssd.pp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
'ensure' => 'installed',
1414
'before' => Exec['libunix-dbus-java-setup'],
1515
}
16-
ensure_packages($keycloak::libunix_dbus_java_build_dependencies, $build_dependency_defaults)
16+
stdlib::ensure_packages($keycloak::libunix_dbus_java_build_dependencies, $build_dependency_defaults)
1717
}
1818

1919
file { '/usr/local/src/libunix-dbus-java':

metadata.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,31 +10,31 @@
1010
"dependencies": [
1111
{
1212
"name": "puppetlabs/stdlib",
13-
"version_requirement": ">= 4.25.0 <9.0.0"
13+
"version_requirement": ">= 9.0.0 <10.0.0"
1414
},
1515
{
1616
"name": "puppetlabs/mysql",
17-
"version_requirement": ">= 11.1.0 <15.0.0"
17+
"version_requirement": ">= 11.1.0 <16.0.0"
1818
},
1919
{
2020
"name": "puppetlabs/postgresql",
21-
"version_requirement": ">= 7.4.0 <10.0.0"
21+
"version_requirement": ">= 7.4.0 <11.0.0"
2222
},
2323
{
2424
"name": "puppetlabs/java",
25-
"version_requirement": ">= 7.3.0 <11.0.0"
25+
"version_requirement": ">= 7.3.0 <12.0.0"
2626
},
2727
{
2828
"name": "puppetlabs/java_ks",
2929
"version_requirement": ">= 1.0.0 <6.0.0"
3030
},
3131
{
3232
"name": "puppet/archive",
33-
"version_requirement": ">= 0.5.1 <7.0.0"
33+
"version_requirement": ">= 0.5.1 <8.0.0"
3434
},
3535
{
3636
"name": "puppet/systemd",
37-
"version_requirement": ">= 0.4.0 <5.0.0"
37+
"version_requirement": ">= 0.4.0 <8.0.0"
3838
}
3939
],
4040
"operatingsystem_support": [

spec/acceptance/10_required_action_spec.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,31 @@ class { 'keycloak': }
8787
end
8888
end
8989
end
90+
91+
context 'when required action with multiple realms' do
92+
it 'runs successfully' do
93+
pp = <<-PUPPET_PP
94+
class { 'keycloak': }
95+
keycloak_realm { 'test': ensure => 'present' }
96+
keycloak_realm { 'test2': ensure => 'present' }
97+
keycloak_required_action { 'webauthn-register on test':
98+
ensure => 'present',
99+
display_name => 'Webauthn Register',
100+
default => true,
101+
enabled => true,
102+
priority => 200,
103+
}
104+
keycloak_required_action { 'webauthn-register on test2':
105+
ensure => 'present',
106+
display_name => 'Webauthn Register',
107+
default => true,
108+
enabled => true,
109+
priority => 200,
110+
}
111+
PUPPET_PP
112+
113+
apply_manifest(pp, catch_failures: true)
114+
apply_manifest(pp, catch_changes: true)
115+
end
116+
end
90117
end

spec/unit/puppet/provider/keycloak_required_action/kcadm_spec.rb

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
let(:resource) do
1010
type.new(name: 'foo',
1111
realm: 'test',
12-
alias: 'somealias',
1312
provider_id: 'webauthn-register')
1413
end
1514

@@ -50,11 +49,9 @@
5049

5150
describe 'destroy' do
5251
it 'deregisters a required action' do
53-
# It suppoed to use whatever came from api and was matched by provider id
54-
# But not what developer provided
55-
resource.provider.instance_variable_set(:@property_hash, alias: 'otheralias')
52+
resource.provider.instance_variable_set(:@property_hash, resource.to_hash)
5653

57-
expect(resource.provider).to receive(:kcadm).with('delete', 'authentication/required-actions/otheralias', 'test')
54+
expect(resource.provider).to receive(:kcadm).with('delete', 'authentication/required-actions/webauthn-register', 'test')
5855

5956
resource.provider.destroy
6057

@@ -77,7 +74,7 @@
7774
temp = Tempfile.new('keycloak_required_action_configure')
7875
allow(Tempfile).to receive(:new).with('keycloak_required_action_configure').and_return(temp)
7976

80-
expect(resource.provider).to receive(:kcadm).with('update', 'authentication/required-actions/somealias', 'test', temp.path)
77+
expect(resource.provider).to receive(:kcadm).with('update', 'authentication/required-actions/webauthn-register', 'test', temp.path)
8178

8279
resource.provider.display_name = 'something'
8380
resource.provider.flush
@@ -86,11 +83,11 @@
8683
# If developer does not specify the display name, the api would use the name
8784
# that is initially returned from unregistered-required-actions
8885
it 'uses display_name from current state if none specified explicitly' do
89-
resource.provider.instance_variable_set(:@property_hash, display_name: 'display name', alias: 'somealias')
86+
resource.provider.instance_variable_set(:@property_hash, display_name: 'display name', provider_id: 'webauthn-register')
9087
temp = Tempfile.new('keycloak_required_action_configure')
9188
allow(Tempfile).to receive(:new).with('keycloak_required_action_configure').and_return(temp)
9289

93-
expect(resource.provider).to receive(:kcadm).with('update', 'authentication/required-actions/somealias', 'test', temp.path)
90+
expect(resource.provider).to receive(:kcadm).with('update', 'authentication/required-actions/webauthn-register', 'test', temp.path)
9491

9592
resource.provider.priority = 1000
9693
resource.provider.flush
@@ -106,7 +103,7 @@
106103
temp = Tempfile.new('keycloak_required_action_configure')
107104
allow(Tempfile).to receive(:new).with('keycloak_required_action_configure').and_return(temp)
108105

109-
expect(resource.provider).to receive(:kcadm).with('update', 'authentication/required-actions/somealias', 'test', temp.path)
106+
expect(resource.provider).to receive(:kcadm).with('update', 'authentication/required-actions/webauthn-register', 'test', temp.path)
110107

111108
resource.provider.priority = 200
112109
resource.provider.flush
@@ -115,18 +112,5 @@
115112
json = JSON.parse(data)
116113
expect(json['name']).to eq('something')
117114
end
118-
119-
it 'always uses alias from the current state to make edits' do
120-
resource[:display_name] = 'newalias'
121-
resource.provider.instance_variable_set(:@property_hash, alias: 'current')
122-
123-
temp = Tempfile.new('keycloak_required_action_configure')
124-
allow(Tempfile).to receive(:new).with('keycloak_required_action_configure').and_return(temp)
125-
126-
expect(resource.provider).to receive(:kcadm).with('update', 'authentication/required-actions/current', 'test', temp.path)
127-
128-
resource.provider.priority = 200
129-
resource.provider.flush
130-
end
131115
end
132116
end

spec/unit/puppet/type/keycloak_required_action_spec.rb

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
{
88
name: 'foo',
99
realm: 'test',
10-
alias: 'something',
1110
provider_id: 'some-provider'
1211
}
1312
end
@@ -25,15 +24,9 @@
2524
}.not_to raise_error
2625
end
2726

28-
it 'has alias default to provider_id' do
29-
config.delete(:provider_id)
30-
expect(resource[:provider_id]).to eq('something')
31-
end
32-
3327
it 'handles componsite name' do
3428
component = described_class.new(name: 'foo on test')
3529
expect(component[:name]).to eq('foo on test')
36-
expect(component[:alias]).to eq('foo')
3730
expect(component[:provider_id]).to eq('foo')
3831
expect(component[:realm]).to eq('test')
3932
end
@@ -49,8 +42,7 @@
4942
:realm,
5043
:name,
5144
:display_name,
52-
:provider_id,
53-
:alias
45+
:provider_id
5446
].each do |p|
5547
it "accepts a #{p}" do
5648
config[p] = 'foo'
@@ -163,16 +155,9 @@
163155
expect { resource }.to raise_error(%r{must have a realm defined})
164156
end
165157

166-
it 'requires alias' do
167-
config.delete(:provider_id)
168-
config.delete(:alias)
169-
expect { resource }.to raise_error(%r{must have a alias defined})
170-
end
171-
172-
it 'does not require provider_id for absent' do
158+
it 'requires provider_id' do
173159
config.delete(:provider_id)
174-
config[:ensure] = 'absent'
175-
expect { resource }.not_to raise_error
160+
expect { resource }.to raise_error(%r{must have a provider_id defined})
176161
end
177162
end
178163
end

0 commit comments

Comments
 (0)