Skip to content

Commit 4123399

Browse files
committed
Support schema privileges in default_privileges
1 parent 80d95ff commit 4123399

File tree

3 files changed

+142
-1
lines changed

3 files changed

+142
-1
lines changed

manifests/server/default_privileges.pp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
/(?i:^ROUTINES$)/,
2222
/(?i:^SEQUENCES$)/,
2323
/(?i:^TABLES$)/,
24-
/(?i:^TYPES$)/
24+
/(?i:^TYPES$)/,
25+
/(?i:^SCHEMAS$)/
2526
] $object_type,
2627
String $schema = 'public',
2728
String $psql_db = $postgresql::server::default_database,
@@ -129,6 +130,18 @@
129130
}
130131
$_check_type = 'T'
131132
}
133+
'SCHEMAS': {
134+
if $schema != '' {
135+
fail('Cannot alter default schema permissions within a schema')
136+
}
137+
case $_privilege {
138+
/^ALL$/: { $_check_privilege = 'UC' }
139+
/^USAGE$/: { $_check_privilege = 'U' }
140+
/^CREATE$/: { $_check_privilege = 'C' }
141+
default: { fail('Illegal value for $privilege parameter') }
142+
}
143+
$_check_type = 'n'
144+
}
132145
default: {
133146
fail("Missing privilege validation for object type ${_object_type}")
134147
}

spec/acceptance/server/default_privileges_spec.rb

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,67 @@ class { 'postgresql::server': }
6868
MANIFEST
6969
end
7070

71+
let(:schema_check_command) do
72+
"SELECT * FROM pg_default_acl WHERE '#{user}=UC' = ANY (defaclacl) AND defaclnamespace = 0 and defaclobjtype = 'n';"
73+
end
74+
75+
let(:pp_schema) do
76+
<<-MANIFEST.unindent
77+
$db = #{db}
78+
$user = #{user}
79+
$group = #{group}
80+
$password = #{password}
81+
82+
class { 'postgresql::server': }
83+
84+
postgresql::server::role { $user:
85+
password_hash => postgresql::postgresql_password($user, $password),
86+
}
87+
88+
postgresql::server::database { $db:
89+
require => Postgresql::Server::Role[$user],
90+
}
91+
92+
# Set default privileges on tables
93+
postgresql::server::default_privileges { "alter default privileges grant all on tables to ${user}":
94+
db => $db,
95+
role => $user,
96+
privilege => 'ALL',
97+
object_type => 'SCHEMAS',
98+
schema => '',
99+
require => Postgresql::Server::Database[$db],
100+
}
101+
MANIFEST
102+
end
103+
let(:pp_schema_revoke) do
104+
<<-MANIFEST
105+
$db = #{db}
106+
$user = #{user}
107+
$group = #{group}
108+
$password = #{password}
109+
110+
class { 'postgresql::server': }
111+
112+
postgresql::server::role { $user:
113+
password_hash => postgresql::postgresql_password($user, $password),
114+
}
115+
postgresql::server::database { $db:
116+
require => Postgresql::Server::Role[$user],
117+
}
118+
119+
# Removes default privileges on tables
120+
postgresql::server::default_privileges { "alter default privileges revoke all on tables for ${user}":
121+
db => $db,
122+
role => $user,
123+
privilege => 'ALL',
124+
object_type => 'SCHEMAS',
125+
schema => '',
126+
ensure => 'absent',
127+
require => Postgresql::Server::Database[$db],
128+
}
129+
MANIFEST
130+
end
131+
71132
let(:all_schemas_check_command) do
72133
"SELECT * FROM pg_default_acl a WHERE '#{user}=arwdDxt' = ANY (defaclacl) AND defaclnamespace = 0 and defaclobjtype = 'r';"
73134
end
@@ -152,6 +213,29 @@ class { 'postgresql::server': }
152213
end
153214
end
154215

216+
it 'grants default privileges to an user' do
217+
if Gem::Version.new(postgresql_version) >= Gem::Version.new('9.6')
218+
idempotent_apply(pp_schema)
219+
220+
psql("--command=\"SET client_min_messages = 'error';#{schema_check_command}\" --db=#{db}") do |r|
221+
expect(r.stdout).to match(%r{\(1 row\)})
222+
expect(r.stderr).to eq('')
223+
end
224+
end
225+
end
226+
227+
it 'revokes default privileges for an user' do
228+
if Gem::Version.new(postgresql_version) >= Gem::Version.new('9.6')
229+
apply_manifest(pp_schema, catch_failures: true)
230+
apply_manifest(pp_schema_revoke, expect_changes: true)
231+
232+
psql("--command=\"SET client_min_messages = 'error';#{schema_check_command}\" --db=#{db}") do |r|
233+
expect(r.stdout).to match(%r{\(0 rows\)})
234+
expect(r.stderr).to eq('')
235+
end
236+
end
237+
end
238+
155239
it 'grants default privileges on all schemas to a user' do
156240
if Gem::Version.new(postgresql_version) >= Gem::Version.new('9.6')
157241
idempotent_apply(pp_unset_schema)

spec/unit/defines/server/default_privileges_spec.rb

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,50 @@
133133

134134
it { is_expected.to compile.and_raise_error(%r{Illegal value for \$privilege parameter}) }
135135
end
136+
137+
context 'schemas' do
138+
let :params do
139+
{
140+
db: 'test',
141+
role: 'test',
142+
privilege: 'all',
143+
object_type: 'schemas',
144+
schema: '',
145+
}
146+
end
147+
148+
let :pre_condition do
149+
"class {'postgresql::server':}"
150+
end
151+
152+
it { is_expected.to compile.with_all_deps }
153+
it { is_expected.to contain_postgresql__server__default_privileges('test') }
154+
it do
155+
# rubocop:disable Layout/LineLength
156+
is_expected.to contain_postgresql_psql('default_privileges:test')
157+
.with_command('ALTER DEFAULT PRIVILEGES GRANT ALL ON SCHEMAS TO "test"')
158+
.with_unless("SELECT 1 WHERE EXISTS (SELECT * FROM pg_default_acl AS da LEFT JOIN pg_namespace AS n ON da.defaclnamespace = n.oid WHERE 'test=UC' = ANY (defaclacl) and defaclobjtype = 'n')")
159+
# rubocop:enable Layout/LineLength
160+
end
161+
end
162+
163+
context 'nested schemas are invalid' do
164+
let :params do
165+
{
166+
db: 'test',
167+
role: 'test',
168+
privilege: 'all',
169+
object_type: 'schemas',
170+
schema: 'public',
171+
}
172+
end
173+
174+
let :pre_condition do
175+
"class {'postgresql::server':}"
176+
end
177+
178+
it { is_expected.to compile.and_raise_error(%r{Cannot alter default schema permissions within a schema}) }
179+
end
136180
end
137181

138182
context 'with specific db connection settings - default port' do

0 commit comments

Comments
 (0)