Age Owner Branch data TLA Line data Source code
1 : : /*--------------------------------------------------------------------------
2 : : *
3 : : * test_rls_hooks.c
4 : : * Code for testing RLS hooks.
5 : : *
6 : : * Copyright (c) 2015-2024, PostgreSQL Global Development Group
7 : : *
8 : : * IDENTIFICATION
9 : : * src/test/modules/test_rls_hooks/test_rls_hooks.c
10 : : *
11 : : * -------------------------------------------------------------------------
12 : : */
13 : :
14 : : #include "postgres.h"
15 : :
16 : : #include "catalog/pg_type.h"
17 : : #include "fmgr.h"
18 : : #include "miscadmin.h"
19 : : #include "nodes/makefuncs.h"
20 : : #include "parser/parse_clause.h"
21 : : #include "parser/parse_collate.h"
22 : : #include "parser/parse_node.h"
23 : : #include "parser/parse_relation.h"
24 : : #include "rewrite/rowsecurity.h"
25 : : #include "test_rls_hooks.h"
26 : : #include "utils/acl.h"
27 : : #include "utils/rel.h"
28 : : #include "utils/relcache.h"
29 : :
3280 sfrost@snowman.net 30 :CBC 1 : PG_MODULE_MAGIC;
31 : :
32 : : /* Install hooks */
33 : : void
3249 bruce@momjian.us 34 : 1 : _PG_init(void)
35 : : {
36 : : /* Set our hooks */
3280 sfrost@snowman.net 37 : 1 : row_security_policy_hook_permissive = test_rls_hooks_permissive;
38 : 1 : row_security_policy_hook_restrictive = test_rls_hooks_restrictive;
39 : 1 : }
40 : :
41 : : /*
42 : : * Return permissive policies to be added
43 : : */
44 : : List *
45 : 30 : test_rls_hooks_permissive(CmdType cmdtype, Relation relation)
46 : : {
3249 bruce@momjian.us 47 : 30 : List *policies = NIL;
48 : 30 : RowSecurityPolicy *policy = palloc0(sizeof(RowSecurityPolicy));
49 : : Datum role;
50 : : FuncCall *n;
51 : : Node *e;
52 : : ColumnRef *c;
53 : : ParseState *qual_pstate;
54 : : ParseNamespaceItem *nsitem;
55 : :
1829 michael@paquier.xyz 56 [ + + ]: 30 : if (strcmp(RelationGetRelationName(relation), "rls_test_permissive") != 0 &&
57 [ + + ]: 21 : strcmp(RelationGetRelationName(relation), "rls_test_both") != 0)
3280 sfrost@snowman.net 58 : 10 : return NIL;
59 : :
60 : 20 : qual_pstate = make_parsestate(NULL);
61 : :
1564 tgl@sss.pgh.pa.us 62 : 20 : nsitem = addRangeTableEntryForRelation(qual_pstate,
63 : : relation, AccessShareLock,
64 : : NULL, false, false);
65 : 20 : addNSItemToQuery(qual_pstate, nsitem, false, true, true);
66 : :
3280 sfrost@snowman.net 67 : 20 : role = ObjectIdGetDatum(ACL_ID_PUBLIC);
68 : :
69 : 20 : policy->policy_name = pstrdup("extension policy");
70 : 20 : policy->polcmd = '*';
653 peter@eisentraut.org 71 : 20 : policy->roles = construct_array_builtin(&role, 1, OIDOID);
72 : :
73 : : /*
74 : : * policy->qual = (Expr *) makeConst(BOOLOID, -1, InvalidOid,
75 : : * sizeof(bool), BoolGetDatum(true), false, true);
76 : : */
77 : :
3280 sfrost@snowman.net 78 : 20 : n = makeFuncCall(list_make2(makeString("pg_catalog"),
79 : : makeString("current_user")),
80 : : NIL,
81 : : COERCE_EXPLICIT_CALL,
82 : : -1);
83 : :
84 : 20 : c = makeNode(ColumnRef);
85 : 20 : c->fields = list_make1(makeString("username"));
86 : 20 : c->location = 0;
87 : :
3249 bruce@momjian.us 88 : 20 : e = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", (Node *) n, (Node *) c, 0);
89 : :
90 : 20 : policy->qual = (Expr *) transformWhereClause(qual_pstate, copyObject(e),
91 : : EXPR_KIND_POLICY,
92 : : "POLICY");
93 : : /* Fix up collation information */
1951 tgl@sss.pgh.pa.us 94 : 20 : assign_expr_collations(qual_pstate, (Node *) policy->qual);
95 : :
3280 sfrost@snowman.net 96 : 20 : policy->with_check_qual = copyObject(policy->qual);
97 : 20 : policy->hassublinks = false;
98 : :
99 : 20 : policies = list_make1(policy);
100 : :
101 : 20 : return policies;
102 : : }
103 : :
104 : : /*
105 : : * Return restrictive policies to be added
106 : : *
107 : : * Note that a permissive policy must exist or the default-deny policy
108 : : * will be included and nothing will be visible. If no filtering should
109 : : * be done except for the restrictive policy, then a single "USING (true)"
110 : : * permissive policy can be used; see the regression tests.
111 : : */
112 : : List *
113 : 30 : test_rls_hooks_restrictive(CmdType cmdtype, Relation relation)
114 : : {
3249 bruce@momjian.us 115 : 30 : List *policies = NIL;
116 : 30 : RowSecurityPolicy *policy = palloc0(sizeof(RowSecurityPolicy));
117 : : Datum role;
118 : : FuncCall *n;
119 : : Node *e;
120 : : ColumnRef *c;
121 : : ParseState *qual_pstate;
122 : : ParseNamespaceItem *nsitem;
123 : :
1829 michael@paquier.xyz 124 [ + + ]: 30 : if (strcmp(RelationGetRelationName(relation), "rls_test_restrictive") != 0 &&
125 [ + + ]: 20 : strcmp(RelationGetRelationName(relation), "rls_test_both") != 0)
3280 sfrost@snowman.net 126 : 9 : return NIL;
127 : :
128 : 21 : qual_pstate = make_parsestate(NULL);
129 : :
1564 tgl@sss.pgh.pa.us 130 : 21 : nsitem = addRangeTableEntryForRelation(qual_pstate,
131 : : relation, AccessShareLock,
132 : : NULL, false, false);
133 : 21 : addNSItemToQuery(qual_pstate, nsitem, false, true, true);
134 : :
3280 sfrost@snowman.net 135 : 21 : role = ObjectIdGetDatum(ACL_ID_PUBLIC);
136 : :
137 : 21 : policy->policy_name = pstrdup("extension policy");
138 : 21 : policy->polcmd = '*';
653 peter@eisentraut.org 139 : 21 : policy->roles = construct_array_builtin(&role, 1, OIDOID);
140 : :
3280 sfrost@snowman.net 141 : 21 : n = makeFuncCall(list_make2(makeString("pg_catalog"),
142 : : makeString("current_user")),
143 : : NIL,
144 : : COERCE_EXPLICIT_CALL,
145 : : -1);
146 : :
147 : 21 : c = makeNode(ColumnRef);
148 : 21 : c->fields = list_make1(makeString("supervisor"));
149 : 21 : c->location = 0;
150 : :
3249 bruce@momjian.us 151 : 21 : e = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", (Node *) n, (Node *) c, 0);
152 : :
153 : 21 : policy->qual = (Expr *) transformWhereClause(qual_pstate, copyObject(e),
154 : : EXPR_KIND_POLICY,
155 : : "POLICY");
156 : : /* Fix up collation information */
1951 tgl@sss.pgh.pa.us 157 : 21 : assign_expr_collations(qual_pstate, (Node *) policy->qual);
158 : :
3280 sfrost@snowman.net 159 : 21 : policy->with_check_qual = copyObject(policy->qual);
160 : 21 : policy->hassublinks = false;
161 : :
162 : 21 : policies = list_make1(policy);
163 : :
164 : 21 : return policies;
165 : : }
|