Skip to content

Commit 7f578e1

Browse files
committed
tighten event trigger conditions, disable/enable event trigger when generating views, fix missing drop function so pgsodium can regenerate itself.
1 parent 580c45a commit 7f578e1

File tree

3 files changed

+125
-3
lines changed

3 files changed

+125
-3
lines changed

META.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "pgsodium",
33
"abstract": "Postgres extension for libsodium functions",
44
"description": "pgsodium is a PostgreSQL extension that exposes modern libsodium based cryptographic functions to SQL.",
5-
"version": "3.0.5",
5+
"version": "3.0.6",
66
"maintainer": [
77
"Michel Pelletier <pelletier.michel@gmail.com>"
88
],
@@ -13,7 +13,7 @@
1313
"abstract": "Postgres extension for libsodium functions",
1414
"file": "src/pgsodium.h",
1515
"docfile": "README.md",
16-
"version": "3.0.5"
16+
"version": "3.0.6"
1717
}
1818
},
1919
"prereqs": {

pgsodium.control

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# pgsodium extension
22
comment = 'Postgres extension for libsodium functions'
3-
default_version = '3.0.5'
3+
default_version = '3.0.6'
44
relocatable = false
55
schema = pgsodium

sql/pgsodium--3.0.5--3.0.6.sql

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
DROP EVENT TRIGGER @extschema@_trg_mask_update;
2+
3+
CREATE EVENT TRIGGER @extschema@_trg_mask_update
4+
ON ddl_command_end
5+
WHEN TAG IN (
6+
'SECURITY LABEL'
7+
)
8+
EXECUTE PROCEDURE @extschema@.trg_mask_update()
9+
;
10+
11+
ALTER EXTENSION pgsodium DROP FUNCTION pgsodium.key_encrypt_secret();
12+
13+
CREATE FUNCTION pgsodium.update_mask(target oid, debug boolean = false)
14+
RETURNS void AS
15+
$$
16+
BEGIN
17+
ALTER EVENT TRIGGER pgsodium_trg_mask_update DISABLE;
18+
PERFORM pgsodium.create_mask_view(objoid, objsubid, debug)
19+
FROM pg_catalog.pg_seclabel
20+
WHERE objoid = target
21+
AND label ILIKE 'ENCRYPT%'
22+
AND provider = 'pgsodium';
23+
ALTER EVENT TRIGGER pgsodium_trg_mask_update ENABLE;
24+
RETURN;
25+
END
26+
$$
27+
LANGUAGE plpgsql
28+
SECURITY DEFINER
29+
SET search_path=''
30+
;
31+
32+
CREATE OR REPLACE FUNCTION pgsodium.update_masks(debug boolean = false)
33+
RETURNS void AS
34+
$$
35+
BEGIN
36+
PERFORM pgsodium.update_mask(objoid, debug)
37+
FROM pg_catalog.pg_seclabel
38+
WHERE label ilike 'ENCRYPT%'
39+
AND provider = 'pgsodium';
40+
RETURN;
41+
END
42+
$$
43+
LANGUAGE plpgsql
44+
SET search_path=''
45+
;
46+
47+
CREATE OR REPLACE FUNCTION pgsodium.create_mask_view(relid oid, subid integer, debug boolean = false) RETURNS void AS
48+
$$
49+
DECLARE
50+
body text;
51+
source_name text;
52+
rule pgsodium.masking_rule;
53+
BEGIN
54+
SELECT * INTO STRICT rule FROM pgsodium.masking_rule WHERE attrelid = relid and attnum = subid ;
55+
56+
source_name := relid::regclass;
57+
58+
body = format(
59+
$c$
60+
DROP VIEW IF EXISTS %s;
61+
CREATE VIEW %s AS SELECT %s
62+
FROM %s;
63+
$c$,
64+
rule.view_name,
65+
rule.view_name,
66+
pgsodium.decrypted_columns(relid),
67+
source_name
68+
);
69+
IF debug THEN
70+
RAISE NOTICE '%', body;
71+
END IF;
72+
EXECUTE body;
73+
74+
body = format(
75+
$c$
76+
DROP FUNCTION IF EXISTS %s.%s_encrypt_secret() CASCADE;
77+
78+
CREATE OR REPLACE FUNCTION %s.%s_encrypt_secret()
79+
RETURNS TRIGGER
80+
LANGUAGE plpgsql
81+
AS $t$
82+
BEGIN
83+
%s;
84+
RETURN new;
85+
END;
86+
$t$;
87+
88+
DROP TRIGGER IF EXISTS %s_encrypt_secret_trigger ON %s.%s;
89+
90+
CREATE TRIGGER %s_encrypt_secret_trigger
91+
BEFORE INSERT ON %s
92+
FOR EACH ROW
93+
EXECUTE FUNCTION %s.%s_encrypt_secret ();
94+
$c$,
95+
rule.relnamespace,
96+
rule.relname,
97+
rule.relnamespace,
98+
rule.relname,
99+
pgsodium.encrypted_columns(relid),
100+
rule.relname,
101+
rule.relnamespace,
102+
rule.relname,
103+
rule.relname,
104+
source_name,
105+
rule.relnamespace,
106+
rule.relname
107+
);
108+
if debug THEN
109+
RAISE NOTICE '%', body;
110+
END IF;
111+
EXECUTE body;
112+
113+
PERFORM pgsodium.mask_role(oid::regrole, source_name, rule.view_name)
114+
FROM pg_roles WHERE pgsodium.has_mask(oid::regrole, source_name);
115+
116+
RETURN;
117+
END
118+
$$
119+
LANGUAGE plpgsql
120+
VOLATILE
121+
SET search_path='pg_catalog'
122+
;

0 commit comments

Comments
 (0)