Skip to content

Commit bdecf93

Browse files
committed
Properly quote role name in default_privileges type
Like in many other places in this module we need to ensure that user-supplied identifiers, such as role names, database names, etc. are quoted in SQL queries, because they may contain characters such as the hyphen that the SQL standard considers illegal unless the identifier is surrounded by double quotes. The `unless` clause in the default_privileges defined type constructs an SQL query to check if the ALTER DEFAULT PRIVILEGES grant is already applied, but this SQL query does not quote the role name. This leads to server-side errors when trying to run the query if the role name contains a character like the hyphen. In this example the role name is `monitoring-user`: Could not evaluate: Error evaluating 'unless' clause, returned pid 891642 exit 1: 'ERROR: unrecognized key word: "monitoring" LINE 1: ...amespace AS n ON da.defaclnamespace = n.oid WHERE 'monitori... ^ HINT: ACL key word must be "group" or "user". ' This change fixes the SQL query for the `unless` clause and contains updated spec tests. Fixes #1665
1 parent 121a455 commit bdecf93

2 files changed

Lines changed: 33 additions & 7 deletions

File tree

manifests/server/default_privileges.pp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@
145145
}
146146

147147
$_unless = $ensure ? {
148-
'absent' => "SELECT 1 WHERE NOT EXISTS (SELECT * FROM pg_default_acl AS da LEFT JOIN pg_namespace AS n ON da.defaclnamespace = n.oid WHERE '%s=%s%s' = ANY (defaclacl)%s and defaclobjtype = '%s')", # lint:ignore:140chars
149-
default => "SELECT 1 WHERE EXISTS (SELECT * FROM pg_default_acl AS da LEFT JOIN pg_namespace AS n ON da.defaclnamespace = n.oid WHERE '%s=%s%s' = ANY (defaclacl)%s and defaclobjtype = '%s')", # lint:ignore:140chars
148+
'absent' => "SELECT 1 WHERE NOT EXISTS (SELECT * FROM pg_default_acl AS da LEFT JOIN pg_namespace AS n ON da.defaclnamespace = n.oid WHERE '\"%s\"=%s%s' = ANY (defaclacl)%s and defaclobjtype = '%s')", # lint:ignore:140chars
149+
default => "SELECT 1 WHERE EXISTS (SELECT * FROM pg_default_acl AS da LEFT JOIN pg_namespace AS n ON da.defaclnamespace = n.oid WHERE '\"%s\"=%s%s' = ANY (defaclacl)%s and defaclobjtype = '%s')", # lint:ignore:140chars
150150
}
151151

152152
$unless_cmd = sprintf($_unless, $role, $_check_privilege, $_check_target_role, $_check_schema, $_check_type)

spec/defines/server/default_privileges_spec.rb

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,33 @@
9292
# rubocop:disable Layout/LineLength
9393
expect(subject).to contain_postgresql_psql('default_privileges:test')
9494
.with_command('ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO "test"')
95-
.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=arwdDxt' = ANY (defaclacl) AND nspname = 'public' and defaclobjtype = 'r')")
95+
.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\"=arwdDxt' = ANY (defaclacl) AND nspname = 'public' and defaclobjtype = 'r')")
96+
# rubocop:enable Layout/LineLength
97+
end
98+
end
99+
100+
context 'supported privilege and a role name with a hyphen' do
101+
let :params do
102+
{
103+
db: 'test',
104+
role: 'test-foo',
105+
privilege: 'all',
106+
object_type: 'tables'
107+
}
108+
end
109+
110+
let :pre_condition do
111+
"class {'postgresql::server':}"
112+
end
113+
114+
it { is_expected.to compile.with_all_deps }
115+
it { is_expected.to contain_postgresql__server__default_privileges('test') }
116+
117+
it do
118+
# rubocop:disable Layout/LineLength
119+
expect(subject).to contain_postgresql_psql('default_privileges:test')
120+
.with_command('ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO "test-foo"')
121+
.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-foo\"=arwdDxt' = ANY (defaclacl) AND nspname = 'public' and defaclobjtype = 'r')")
96122
# rubocop:enable Layout/LineLength
97123
end
98124
end
@@ -163,7 +189,7 @@ class { 'postgresql::server': }
163189
# rubocop:disable Layout/LineLength
164190
expect(subject).to contain_postgresql_psql('default_privileges:test')
165191
.with_command('ALTER DEFAULT PRIVILEGES GRANT ALL ON SCHEMAS TO "test"')
166-
.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 nspname IS NULL and defaclobjtype = 'n')")
192+
.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 nspname IS NULL and defaclobjtype = 'n')")
167193
# rubocop:enable Layout/LineLength
168194
end
169195
end
@@ -282,7 +308,7 @@ class { 'postgresql::server': }
282308
# rubocop:disable Layout/LineLength
283309
expect(subject).to contain_postgresql_psql('default_privileges:test')
284310
.with_command('ALTER DEFAULT PRIVILEGES IN SCHEMA my_schema GRANT ALL ON TABLES TO "test"')
285-
.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=arwdDxt' = ANY (defaclacl) AND nspname = 'my_schema' and defaclobjtype = 'r')")
311+
.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\"=arwdDxt' = ANY (defaclacl) AND nspname = 'my_schema' and defaclobjtype = 'r')")
286312
# rubocop:enable Layout/LineLength
287313
end
288314
end
@@ -309,7 +335,7 @@ class { 'postgresql::server': }
309335
# rubocop:disable Layout/LineLength
310336
expect(subject).to contain_postgresql_psql('default_privileges:test')
311337
.with_command('ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO "test"')
312-
.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=arwdDxt' = ANY (defaclacl) AND nspname IS NULL and defaclobjtype = 'r')")
338+
.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\"=arwdDxt' = ANY (defaclacl) AND nspname IS NULL and defaclobjtype = 'r')")
313339
# rubocop:enable Layout/LineLength
314340
end
315341
end
@@ -367,7 +393,7 @@ class {'postgresql::server':}
367393
# rubocop:disable Layout/LineLength
368394
expect(subject).to contain_postgresql_psql('default_privileges:test')
369395
.with_command('ALTER DEFAULT PRIVILEGES FOR ROLE target IN SCHEMA public GRANT ALL ON TABLES TO "test"')
370-
.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=arwdDxt/target' = ANY (defaclacl) AND nspname = 'public' and defaclobjtype = 'r')")
396+
.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\"=arwdDxt/target' = ANY (defaclacl) AND nspname = 'public' and defaclobjtype = 'r')")
371397
# rubocop:enable Layout/LineLength
372398
end
373399
end

0 commit comments

Comments
 (0)