Skip to content

Commit 2ad0cf0

Browse files
committed
change default value of column 'enable_parent', small refactoring of function check_security_policy(), check_security_policy_internal() now takes role as parameter
1 parent f4e71de commit 2ad0cf0

File tree

5 files changed

+31
-15
lines changed

5 files changed

+31
-15
lines changed

expected/pathman_permissions.out

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ INSERT INTO permissions.user1_table SELECT g, g FROM generate_series(1, 20) as g
1717
SET ROLE user2;
1818
SELECT create_range_partitions('permissions.user1_table', 'id', 1, 10, 2);
1919
NOTICE: sequence "user1_table_seq" does not exist, skipping
20-
ERROR: only the owner or superuser can change partitioning configuration of table "user1_table"
20+
WARNING: only the owner or superuser can change partitioning configuration of table "user1_table"
21+
ERROR: new row violates row-level security policy for table "pathman_config"
2122
/* Should be ok */
2223
SET ROLE user1;
2324
SELECT create_range_partitions('permissions.user1_table', 'id', 1, 10, 2);
@@ -44,14 +45,16 @@ SELECT * FROM pathman_config_params;
4445
/* Should fail */
4546
SET ROLE user2;
4647
SELECT set_enable_parent('permissions.user1_table', true);
47-
ERROR: only the owner or superuser can change partitioning configuration of table "user1_table"
48+
WARNING: only the owner or superuser can change partitioning configuration of table "user1_table"
49+
ERROR: new row violates row-level security policy for table "pathman_config_params"
4850
SELECT set_auto('permissions.user1_table', false);
49-
ERROR: only the owner or superuser can change partitioning configuration of table "user1_table"
51+
WARNING: only the owner or superuser can change partitioning configuration of table "user1_table"
52+
ERROR: new row violates row-level security policy for table "pathman_config_params"
5053
/* Should fail */
5154
SET ROLE user2;
5255
DELETE FROM pathman_config
5356
WHERE partrel = 'permissions.user1_table'::regclass;
54-
ERROR: only the owner or superuser can change partitioning configuration of table "user1_table"
57+
WARNING: only the owner or superuser can change partitioning configuration of table "user1_table"
5558
/* No rights to insert, should fail */
5659
SET ROLE user2;
5760
INSERT INTO permissions.user1_table (id, a) VALUES (35, 0);

init.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ CREATE TABLE IF NOT EXISTS @extschema@.pathman_config (
3535
*/
3636
CREATE TABLE IF NOT EXISTS @extschema@.pathman_config_params (
3737
partrel REGCLASS NOT NULL PRIMARY KEY,
38-
enable_parent BOOLEAN NOT NULL DEFAULT TRUE,
38+
enable_parent BOOLEAN NOT NULL DEFAULT FALSE,
3939
auto BOOLEAN NOT NULL DEFAULT TRUE,
4040
init_callback REGPROCEDURE NOT NULL DEFAULT 0
4141
);

src/pl_funcs.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ build_check_constraint_name_attname(PG_FUNCTION_ARGS)
538538
elog(ERROR, "Invalid relation %u", relid);
539539

540540
if (attnum == InvalidAttrNumber)
541-
elog(ERROR, "Relation \"%s\" has no column '%s'",
541+
elog(ERROR, "relation \"%s\" has no column \"%s\"",
542542
get_rel_name_or_relid(relid), text_to_cstring(attname));
543543

544544
result = build_check_constraint_name_internal(relid, attnum);
@@ -870,7 +870,19 @@ invoke_on_partition_created_callback(PG_FUNCTION_ARGS)
870870
Datum
871871
check_security_policy(PG_FUNCTION_ARGS)
872872
{
873-
PG_RETURN_BOOL(check_security_policy_internal(PG_GETARG_OID(0)));
873+
Oid relid = PG_GETARG_OID(0);
874+
875+
if (!check_security_policy_internal(relid, GetUserId()))
876+
{
877+
elog(WARNING, "only the owner or superuser can change "
878+
"partitioning configuration of table \"%s\"",
879+
get_rel_name_or_relid(relid));
880+
881+
PG_RETURN_BOOL(false);
882+
}
883+
884+
/* Else return TRUE */
885+
PG_RETURN_BOOL(true);
874886
}
875887

876888

src/utils.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -759,27 +759,28 @@ validate_on_part_init_cb(Oid procid, bool emit_error)
759759
* better to check user permissions in order to let other users participate.
760760
*/
761761
bool
762-
check_security_policy_internal(Oid relid)
762+
check_security_policy_internal(Oid relid, Oid role)
763763
{
764-
Oid owner;
764+
Oid owner;
765765

766766
/* Superuser is allowed to do anything */
767767
if (superuser())
768768
return true;
769769

770+
/* Fetch the owner */
771+
owner = get_rel_owner(relid);
772+
770773
/*
771774
* Sometimes the relation doesn't exist anymore but there is still
772775
* a record in config. For instance, it happens in DDL event trigger.
773776
* Still we should be able to remove this record.
774777
*/
775-
if ((owner = get_rel_owner(relid)) == InvalidOid)
778+
if (owner == InvalidOid)
776779
return true;
777780

778781
/* Check if current user is the owner of the relation */
779-
if (owner != GetUserId())
780-
elog(ERROR, "only the owner or superuser can change "
781-
"partitioning configuration of table \"%s\"",
782-
get_rel_name_or_relid(relid));
782+
if (owner != role)
783+
return false;
783784

784785
return true;
785786
}

src/utils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ bool clause_contains_params(Node *clause);
5050
bool is_date_type_internal(Oid typid);
5151
bool is_string_type_internal(Oid typid);
5252
bool validate_on_part_init_cb(Oid procid, bool emit_error);
53-
bool check_security_policy_internal(Oid relid);
53+
bool check_security_policy_internal(Oid relid, Oid role);
5454

5555
/*
5656
* Misc.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy