Skip to content

Commit 504c409

Browse files
committed
(CAT-1417) Nested require support for authz_core mod
1 parent abb8410 commit 504c409

File tree

7 files changed

+160
-0
lines changed

7 files changed

+160
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# frozen_string_literal: true
2+
3+
# @summary
4+
# Function to generate the authz_core configuration directives.
5+
#
6+
Puppet::Functions.create_function(:'apache::authz_core_config') do
7+
# @param config
8+
# The input as JSON format.
9+
#
10+
# @return
11+
# Returns the authz_core config directives in array.
12+
#
13+
# @example
14+
#
15+
# arg = {
16+
# require_all => {
17+
# 'require_any' => {
18+
# 'require' => ['user superadmin'],
19+
# 'require_all' => {
20+
# 'require' => ['group admins', 'ldap-group "cn=Administrators,o=Airius"'],
21+
# },
22+
# },
23+
# 'require_none' => {
24+
# 'require' => ['group temps', 'ldap-group "cn=Temporary Employees,o=Airius"']
25+
# }
26+
# }
27+
# }
28+
#
29+
# apache::bool2httpd(arg)
30+
# returns :
31+
# [
32+
# "<RequireAll>",
33+
# "<RequireAny>",
34+
# "Require user superadmin",
35+
# "<RequireAll>",
36+
# "Require group admins",
37+
# "Require ldap-group \"cn=Administrators,o=Airius\"",
38+
# "</RequireAll>",
39+
# "</RequireAny>",
40+
# "<RequireNone>",
41+
# "Require group temps",
42+
# "Require ldap-group \"cn=Temporary Employees,o=Airius\"",
43+
# "</RequireNone>",
44+
# "</RequireAll>"
45+
# ]
46+
#
47+
dispatch :authz_core_config do
48+
param 'Hash', :config
49+
return_type 'Array'
50+
end
51+
52+
def build_directive(value)
53+
value.split('_').map(&:capitalize).join
54+
end
55+
56+
def authz_core_config(config)
57+
result_string = []
58+
config.map do |key, value|
59+
directive = build_directive(key)
60+
if value.is_a?(Hash)
61+
result_string << "<#{directive}>"
62+
result_string << authz_core_config(value)
63+
result_string << "</#{directive}>"
64+
else
65+
value.map do |v|
66+
result_string << "#{directive} #{v}"
67+
end
68+
end
69+
end
70+
result_string.flatten
71+
end
72+
end

manifests/mod/authz_core.pp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# @summary
2+
# Installs `mod_authz_core`.
3+
#
4+
# @see https://httpd.apache.org/docs/current/mod/mod_authz_core.html for additional documentation.
5+
#
6+
class apache::mod::authz_core {
7+
::apache::mod { 'authz_core':
8+
id => 'authz_core_module',
9+
}
10+
}

manifests/vhost.pp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,6 +1455,33 @@
14551455
# }
14561456
# ```
14571457
#
1458+
# lint:ignore:parameter_documentation
1459+
# @param authz_core
1460+
# lint:endignore
1461+
# Specifies mod_authz_core parameters for particular directories in a virtual host directory
1462+
# ```puppet
1463+
# apache::vhost { 'sample.example.net':
1464+
# docroot => '/path/to/directory',
1465+
# directories => [
1466+
# { path => '/path/to/different/dir',
1467+
# authz_core => {
1468+
# require_all => {
1469+
# 'require_any' => {
1470+
# 'require' => ['user superadmin'],
1471+
# 'require_all' => {
1472+
# 'require' => ['group admins', 'ldap-group "cn=Administrators,o=Airius"'],
1473+
# },
1474+
# },
1475+
# 'require_none' => {
1476+
# 'require' => ['group temps', 'ldap-group "cn=Temporary Employees,o=Airius"']
1477+
# }
1478+
# }
1479+
# }
1480+
# },
1481+
# ],
1482+
# }
1483+
# ```
1484+
#
14581485
# @param ssl
14591486
# Enables SSL for the virtual host. SSL virtual hosts only respond to HTTPS queries.
14601487
#
@@ -2301,6 +2328,11 @@
23012328
include apache::mod::auth_gssapi
23022329
}
23032330

2331+
if 'authz_core' in $directory {
2332+
include apache::mod::authn_file
2333+
include apache::mod::authz_user
2334+
}
2335+
23042336
if $directory['provider'] and $directory['provider'] =~ 'location' and ('proxy_pass' in $directory or 'proxy_pass_match' in $directory) {
23052337
include apache::mod::proxy_http
23062338

spec/acceptance/mod_auth_core_spec.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper_acceptance'
4+
apache_hash = apache_settings_hash
5+
6+
describe 'apache::mod::authz_core' do
7+
context 'Default ldap module installation' do
8+
pp = <<-MANIFEST
9+
class { 'apache': }
10+
class { 'apache::mod::authz_core': }
11+
MANIFEST
12+
13+
it 'succeeds in installing the ldap module' do
14+
apply_manifest(pp, catch_failures: true)
15+
end
16+
17+
describe file("#{apache_hash['mod_dir']}/authz_core.load") do
18+
it { is_expected.to contain 'mod_authz_core.so' }
19+
end
20+
end
21+
end
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
describe 'apache::authz_core_config' do
6+
let(:input) do
7+
{
8+
'Require' => [
9+
'user foo',
10+
'user bar',
11+
]
12+
}
13+
end
14+
15+
it { is_expected.to run.with_params(nil).and_raise_error(StandardError) }
16+
it { is_expected.to run.with_params([]).and_raise_error(StandardError) }
17+
it { is_expected.to run.with_params({}).and_return([]) }
18+
it { is_expected.to run.with_params(input).and_return(['Require user foo', 'Require user bar']) }
19+
end

templates/vhost/_authz_core.epp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<% $authz_core_config.each |$line| { -%>
2+
<%= $line %>
3+
<%- } -%>

templates/vhost/_directories.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,9 @@
544544
<%- if directory['custom_fragment'] -%>
545545
<%= directory['custom_fragment'] %>
546546
<%- end -%>
547+
<%- if directory['authz_core'] -%>
548+
<%= scope.call_function('epp',["apache/vhost/_authz_core.epp", 'authz_core_config' => scope.call_function('apache::authz_core_config', directory['authz_core'])]) -%>
549+
<%- end -%>
547550
<%- if directory['gssapi'] -%>
548551
<%= scope.call_function('epp',["apache/vhost/_gssapi.epp", directory['gssapi']]) -%>
549552
<%- end -%>

0 commit comments

Comments
 (0)