@@ -12,7 +12,7 @@ index 80209a1..0000000
12
12
- .cache
13
13
- test*
14
14
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
15
- index 77209b9..2a88809 100644
15
+ index 77209b9..64cf218 100644
16
16
--- a/.github/workflows/test.yml
17
17
+++ b/.github/workflows/test.yml
18
18
@@ -1,12 +1,24 @@
@@ -31,7 +31,7 @@ index 77209b9..2a88809 100644
31
31
runs-on: ubuntu-latest
32
32
+ strategy:
33
33
+ matrix:
34
- + pg-version: ['13', '14', '15', '16']
34
+ + pg-version: ['13', '14', '15', '16', '17' ]
35
35
+
36
36
steps:
37
37
- - uses: actions/checkout@v2
@@ -139,13 +139,13 @@ index 8c33ac1..e9f0e08 100644
139
139
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
140
140
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
141
141
diff --git a/Makefile b/Makefile
142
- index 7f66766..d78d401 100644
142
+ index 7f66766..af0ef00 100644
143
143
--- a/Makefile
144
144
+++ b/Makefile
145
145
@@ -1,5 +1,25 @@
146
146
+ PG_CFLAGS = -std=c99 -Werror -Wno-declaration-after-statement
147
147
EXTENSION = supabase_vault
148
- + EXTVERSION = 0.3.1
148
+ + EXTVERSION = 0.3.0
149
149
+
150
150
DATA = $(wildcard sql/*--*.sql)
151
151
+
@@ -307,7 +307,7 @@ index 0000000..575051e
307
307
+ (mkAttributes false) // (mkAttributes true)
308
308
diff --git a/nix/postgresql/generic.nix b/nix/postgresql/generic.nix
309
309
new file mode 100644
310
- index 0000000..ba730c4
310
+ index 0000000..54bfdcd
311
311
--- /dev/null
312
312
+++ b/nix/postgresql/generic.nix
313
313
@@ -0,0 +1,311 @@
@@ -509,7 +509,7 @@ index 0000000..ba730c4
509
509
+ wrapProgram $out/bin/initdb --prefix PATH ":" ${glibc.bin}/bin
510
510
+ '';
511
511
+
512
- + doCheck = !stdenv'.isDarwin ;
512
+ + doCheck = false ;
513
513
+ # autodetection doesn't seem to able to find this, but it's there.
514
514
+ checkTarget = "check";
515
515
+
@@ -923,7 +923,7 @@ index 4ecd1de..0000000
923
923
- docker exec -it $DB_HOST psql -U "$SU" $@
924
924
diff --git a/shell.nix b/shell.nix
925
925
new file mode 100644
926
- index 0000000..758d40d
926
+ index 0000000..e21cb68
927
927
--- /dev/null
928
928
+++ b/shell.nix
929
929
@@ -0,0 +1,36 @@
@@ -947,7 +947,7 @@ index 0000000..758d40d
947
947
+ postgresql_14
948
948
+ postgresql_15
949
949
+ postgresql_16
950
- + # ourPg.postgresql_17
950
+ + ourPg.postgresql_17
951
951
+ ];
952
952
+ pgWithExt = { pg }: pg.withPackages (p: [
953
953
+ (callPackage ./nix/pgsodium.nix { postgresql = pg; })
@@ -965,10 +965,10 @@ index 0000000..758d40d
965
965
+ }
966
966
diff --git a/sql/supabase_vault--0.2.8--0.3.0.sql b/sql/supabase_vault--0.2.8--0.3.0.sql
967
967
new file mode 100644
968
- index 0000000..df6565a
968
+ index 0000000..5e4837a
969
969
--- /dev/null
970
970
+++ b/sql/supabase_vault--0.2.8--0.3.0.sql
971
- @@ -0,0 +1,135 @@
971
+ @@ -0,0 +1,148 @@
972
972
+ CREATE OR REPLACE FUNCTION vault._crypto_aead_det_encrypt(message bytea, additional bytea, key_id bigint, context bytea = 'pgsodium', nonce bytea = NULL)
973
973
+ RETURNS bytea
974
974
+ AS 'MODULE_PATHNAME', 'pgsodium_crypto_aead_det_encrypt_by_id'
@@ -984,6 +984,8 @@ index 0000000..df6565a
984
984
+ AS 'MODULE_PATHNAME', 'pgsodium_crypto_aead_det_noncegen'
985
985
+ LANGUAGE c IMMUTABLE;
986
986
+
987
+ + ALTER TABLE vault.secrets OWNER TO current_user;
988
+ +
987
989
+ SECURITY LABEL ON COLUMN vault.secrets.secret IS NULL;
988
990
+
989
991
+ DROP TRIGGER IF EXISTS secrets_encrypt_secret_trigger_secret ON vault.secrets;
@@ -1037,8 +1039,6 @@ index 0000000..df6565a
1037
1039
+ s.updated_at
1038
1040
+ FROM vault.secrets s;
1039
1041
+
1040
- + GRANT ALL ON vault.decrypted_secrets TO pgsodium_keyiduser;
1041
- +
1042
1042
+ CREATE OR REPLACE FUNCTION vault.create_secret(
1043
1043
+ new_secret text,
1044
1044
+ new_name text = NULL,
@@ -1047,6 +1047,7 @@ index 0000000..df6565a
1047
1047
+ new_key_id uuid = NULL
1048
1048
+ )
1049
1049
+ RETURNS uuid
1050
+ + SECURITY DEFINER
1050
1051
+ LANGUAGE plpgsql
1051
1052
+ SET search_path = ''
1052
1053
+ AS $$
@@ -1082,6 +1083,7 @@ index 0000000..df6565a
1082
1083
+ new_key_id uuid = NULL
1083
1084
+ )
1084
1085
+ RETURNS void
1086
+ + SECURITY DEFINER
1085
1087
+ LANGUAGE plpgsql
1086
1088
+ SET search_path = ''
1087
1089
+ AS $$
@@ -1104,31 +1106,23 @@ index 0000000..df6565a
1104
1106
+ WHERE s.id = secret_id;
1105
1107
+ END
1106
1108
+ $$;
1107
- diff --git a/sql/supabase_vault--0.2.8.sql b/sql/supabase_vault--0.2.8.sql
1108
- index ee40004..8973fe0 100644
1109
- --- a/sql/supabase_vault--0.2.8.sql
1110
- +++ b/sql/supabase_vault--0.2.8.sql
1111
- @@ -8,7 +8,6 @@ CREATE TABLE vault.secrets (
1112
- created_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP,
1113
- updated_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP
1114
- );
1115
- - ALTER TABLE vault.secrets OWNER TO session_user;
1116
-
1117
- COMMENT ON TABLE vault.secrets IS 'Table with encrypted `secret` column for storing sensitive information on disk.';
1118
-
1119
- diff --git a/sql/supabase_vault--0.3.0--0.3.1.sql b/sql/supabase_vault--0.3.0--0.3.1.sql
1120
- new file mode 100644
1121
- index 0000000..ee25f24
1122
- --- /dev/null
1123
- +++ b/sql/supabase_vault--0.3.0--0.3.1.sql
1124
- @@ -0,0 +1 @@
1125
- + -- no SQL changes in 0.3.1
1109
+ +
1110
+ + REVOKE ALL ON SCHEMA vault FROM pgsodium_keyiduser;
1111
+ + REVOKE ALL ON vault.decrypted_secrets, vault.secrets FROM pgsodium_keyiduser;
1112
+ +
1113
+ + REVOKE ALL ON FUNCTION
1114
+ + vault._crypto_aead_det_encrypt,
1115
+ + vault._crypto_aead_det_decrypt,
1116
+ + vault._crypto_aead_det_noncegen,
1117
+ + vault.create_secret,
1118
+ + vault.update_secret
1119
+ + FROM PUBLIC;
1126
1120
diff --git a/sql/supabase_vault--0.3.0.sql b/sql/supabase_vault--0.3.0.sql
1127
1121
new file mode 100644
1128
- index 0000000..af6abe2
1122
+ index 0000000..b0e5998
1129
1123
--- /dev/null
1130
1124
+++ b/sql/supabase_vault--0.3.0.sql
1131
- @@ -0,0 +1,123 @@
1125
+ @@ -0,0 +1,129 @@
1132
1126
+ CREATE OR REPLACE FUNCTION vault._crypto_aead_det_encrypt(message bytea, additional bytea, key_id bigint, context bytea = 'pgsodium', nonce bytea = NULL)
1133
1127
+ RETURNS bytea
1134
1128
+ AS 'MODULE_PATHNAME', 'pgsodium_crypto_aead_det_encrypt_by_id'
@@ -1181,10 +1175,6 @@ index 0000000..af6abe2
1181
1175
+ s.updated_at
1182
1176
+ FROM vault.secrets s;
1183
1177
+
1184
- + GRANT ALL ON SCHEMA vault TO pgsodium_keyiduser;
1185
- + GRANT ALL ON TABLE vault.secrets TO pgsodium_keyiduser;
1186
- + GRANT ALL ON vault.decrypted_secrets TO pgsodium_keyiduser;
1187
- +
1188
1178
+ CREATE OR REPLACE FUNCTION vault.create_secret(
1189
1179
+ new_secret text,
1190
1180
+ new_name text = NULL,
@@ -1193,6 +1183,7 @@ index 0000000..af6abe2
1193
1183
+ new_key_id uuid = NULL
1194
1184
+ )
1195
1185
+ RETURNS uuid
1186
+ + SECURITY DEFINER
1196
1187
+ LANGUAGE plpgsql
1197
1188
+ SET search_path = ''
1198
1189
+ AS $$
@@ -1228,6 +1219,7 @@ index 0000000..af6abe2
1228
1219
+ new_key_id uuid = NULL
1229
1220
+ )
1230
1221
+ RETURNS void
1222
+ + SECURITY DEFINER
1231
1223
+ LANGUAGE plpgsql
1232
1224
+ SET search_path = ''
1233
1225
+ AS $$
@@ -1251,6 +1243,14 @@ index 0000000..af6abe2
1251
1243
+ END
1252
1244
+ $$;
1253
1245
+
1246
+ + REVOKE ALL ON FUNCTION
1247
+ + vault._crypto_aead_det_encrypt,
1248
+ + vault._crypto_aead_det_decrypt,
1249
+ + vault._crypto_aead_det_noncegen,
1250
+ + vault.create_secret,
1251
+ + vault.update_secret
1252
+ + FROM PUBLIC;
1253
+ +
1254
1254
+ SELECT pg_catalog.pg_extension_config_dump('vault.secrets', '');
1255
1255
diff --git a/src/crypto_aead_det_xchacha20.c b/src/crypto_aead_det_xchacha20.c
1256
1256
new file mode 100644
@@ -1441,7 +1441,7 @@ index 0000000..91eca9a
1441
1441
+ #endif
1442
1442
diff --git a/src/pgsodium.c b/src/pgsodium.c
1443
1443
new file mode 100644
1444
- index 0000000..563c55f
1444
+ index 0000000..d337fff
1445
1445
--- /dev/null
1446
1446
+++ b/src/pgsodium.c
1447
1447
@@ -0,0 +1,144 @@
@@ -1559,7 +1559,7 @@ index 0000000..563c55f
1559
1559
+ {
1560
1560
+ nonce = NULL;
1561
1561
+ }
1562
- + ERRORIF (VARSIZE_ANY_EXHDR (ciphertext) <
1562
+ + ERRORIF (VARSIZE_ANY_EXHDR (ciphertext) <=
1563
1563
+ crypto_aead_det_xchacha20_ABYTES, "%s: invalid message");
1564
1564
+ result_len =
1565
1565
+ VARSIZE_ANY_EXHDR (ciphertext) - crypto_aead_det_xchacha20_ABYTES;
@@ -1999,10 +1999,10 @@ index e6221c2..0000000
1999
1999
- select * from finish();
2000
2000
diff --git a/test/expected/test.out b/test/expected/test.out
2001
2001
new file mode 100644
2002
- index 0000000..1d69ec5
2002
+ index 0000000..84c4c15
2003
2003
--- /dev/null
2004
2004
+++ b/test/expected/test.out
2005
- @@ -0,0 +1,110 @@
2005
+ @@ -0,0 +1,86 @@
2006
2006
+ select no_plan();
2007
2007
+ no_plan
2008
2008
+ ---------
@@ -2083,63 +2083,36 @@ index 0000000..1d69ec5
2083
2083
+ ok 5 - bob can query an updated secret
2084
2084
+ (1 row)
2085
2085
+
2086
- + truncate vault.secrets;
2087
- + reset role;
2088
- + do $$
2089
- + begin
2090
- + perform vault.create_secret(
2091
- + new_secret := '',
2092
- + new_name := 'empty_secret'
2093
- + );
2094
- + end
2095
- + $$;
2096
- + select results_eq(
2097
- + $test$
2098
- + select decrypted_secret collate "default"
2099
- + from vault.decrypted_secrets
2100
- + where name = 'empty_secret'
2101
- + $test$,
2102
- + $results$values ('')$results$,
2103
- + 'secret can be an empty string'
2104
- + );
2105
- + results_eq
2106
- + --------------------------------------
2107
- + ok 6 - secret can be an empty string
2108
- + (1 row)
2109
- +
2110
2086
+ select * from finish();
2111
2087
+ finish
2112
2088
+ --------
2113
- + 1..6
2089
+ + 1..5
2114
2090
+ (1 row)
2115
2091
+
2116
2092
diff --git a/test/fixtures.sql b/test/fixtures.sql
2117
2093
new file mode 100644
2118
- index 0000000..b323d22
2094
+ index 0000000..d4c00c8
2119
2095
--- /dev/null
2120
2096
+++ b/test/fixtures.sql
2121
- @@ -0,0 +1,15 @@
2097
+ @@ -0,0 +1,12 @@
2122
2098
+ CREATE ROLE bob login password 'bob';
2123
2099
+
2124
- + CREATE ROLE pgsodium_keyiduser WITH
2125
- + NOLOGIN
2126
- + NOSUPERUSER
2127
- + NOCREATEDB
2128
- + NOCREATEROLE
2129
- + INHERIT
2130
- + NOREPLICATION
2131
- + CONNECTION LIMIT -1;
2132
- +
2133
2100
+ CREATE EXTENSION IF NOT EXISTS pgtap;
2134
2101
+ CREATE EXTENSION supabase_vault CASCADE;
2135
2102
+
2136
- + GRANT pgsodium_keyiduser TO bob;
2103
+ + GRANT USAGE ON SCHEMA vault TO bob WITH GRANT OPTION;
2104
+ + GRANT SELECT ON vault.secrets, vault.decrypted_secrets TO bob WITH GRANT OPTION;
2105
+ + GRANT EXECUTE ON FUNCTION
2106
+ + vault.create_secret,
2107
+ + vault.update_secret,
2108
+ + vault._crypto_aead_det_decrypt
2109
+ + TO bob WITH GRANT OPTION;
2137
2110
diff --git a/test/sql/test.sql b/test/sql/test.sql
2138
2111
new file mode 100644
2139
- index 0000000..69dbccd
2112
+ index 0000000..064e382
2140
2113
--- /dev/null
2141
2114
+++ b/test/sql/test.sql
2142
- @@ -0,0 +1,84 @@
2115
+ @@ -0,0 +1,62 @@
2143
2116
+ select no_plan();
2144
2117
+
2145
2118
+ do $$
@@ -2201,26 +2174,4 @@ index 0000000..69dbccd
2201
2174
+ $results$values ('fooz', 'barz', 'bazz')$results$,
2202
2175
+ 'bob can query an updated secret');
2203
2176
+
2204
- + truncate vault.secrets;
2205
- + reset role;
2206
- +
2207
- + do $$
2208
- + begin
2209
- + perform vault.create_secret(
2210
- + new_secret := '',
2211
- + new_name := 'empty_secret'
2212
- + );
2213
- + end
2214
- + $$;
2215
- +
2216
- + select results_eq(
2217
- + $test$
2218
- + select decrypted_secret collate "default"
2219
- + from vault.decrypted_secrets
2220
- + where name = 'empty_secret'
2221
- + $test$,
2222
- + $results$values ('')$results$,
2223
- + 'secret can be an empty string'
2224
- + );
2225
- +
2226
2177
+ select * from finish();
0 commit comments