@@ -12,7 +12,7 @@ index 80209a1..0000000
1212- .cache
1313- test*
1414diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
15- index 77209b9..2a88809 100644
15+ index 77209b9..64cf218 100644
1616--- a/.github/workflows/test.yml
1717+++ b/.github/workflows/test.yml
1818@@ -1,12 +1,24 @@
@@ -31,7 +31,7 @@ index 77209b9..2a88809 100644
3131 runs-on: ubuntu-latest
3232+ strategy:
3333+ matrix:
34- + pg-version: ['13', '14', '15', '16']
34+ + pg-version: ['13', '14', '15', '16', '17' ]
3535+
3636 steps:
3737- - uses: actions/checkout@v2
@@ -139,13 +139,13 @@ index 8c33ac1..e9f0e08 100644
139139+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
140140+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
141141diff --git a/Makefile b/Makefile
142- index 7f66766..d78d401 100644
142+ index 7f66766..af0ef00 100644
143143--- a/Makefile
144144+++ b/Makefile
145145@@ -1,5 +1,25 @@
146146+ PG_CFLAGS = -std=c99 -Werror -Wno-declaration-after-statement
147147 EXTENSION = supabase_vault
148- + EXTVERSION = 0.3.1
148+ + EXTVERSION = 0.3.0
149149+
150150 DATA = $(wildcard sql/*--*.sql)
151151+
@@ -307,7 +307,7 @@ index 0000000..575051e
307307+ (mkAttributes false) // (mkAttributes true)
308308diff --git a/nix/postgresql/generic.nix b/nix/postgresql/generic.nix
309309new file mode 100644
310- index 0000000..ba730c4
310+ index 0000000..54bfdcd
311311--- /dev/null
312312+++ b/nix/postgresql/generic.nix
313313@@ -0,0 +1,311 @@
@@ -509,7 +509,7 @@ index 0000000..ba730c4
509509+ wrapProgram $out/bin/initdb --prefix PATH ":" ${glibc.bin}/bin
510510+ '';
511511+
512- + doCheck = !stdenv'.isDarwin ;
512+ + doCheck = false ;
513513+ # autodetection doesn't seem to able to find this, but it's there.
514514+ checkTarget = "check";
515515+
@@ -923,7 +923,7 @@ index 4ecd1de..0000000
923923- docker exec -it $DB_HOST psql -U "$SU" $@
924924diff --git a/shell.nix b/shell.nix
925925new file mode 100644
926- index 0000000..758d40d
926+ index 0000000..e21cb68
927927--- /dev/null
928928+++ b/shell.nix
929929@@ -0,0 +1,36 @@
@@ -947,7 +947,7 @@ index 0000000..758d40d
947947+ postgresql_14
948948+ postgresql_15
949949+ postgresql_16
950- + # ourPg.postgresql_17
950+ + ourPg.postgresql_17
951951+ ];
952952+ pgWithExt = { pg }: pg.withPackages (p: [
953953+ (callPackage ./nix/pgsodium.nix { postgresql = pg; })
@@ -965,10 +965,10 @@ index 0000000..758d40d
965965+ }
966966diff --git a/sql/supabase_vault--0.2.8--0.3.0.sql b/sql/supabase_vault--0.2.8--0.3.0.sql
967967new file mode 100644
968- index 0000000..df6565a
968+ index 0000000..5e4837a
969969--- /dev/null
970970+++ b/sql/supabase_vault--0.2.8--0.3.0.sql
971- @@ -0,0 +1,135 @@
971+ @@ -0,0 +1,148 @@
972972+ CREATE OR REPLACE FUNCTION vault._crypto_aead_det_encrypt(message bytea, additional bytea, key_id bigint, context bytea = 'pgsodium', nonce bytea = NULL)
973973+ RETURNS bytea
974974+ AS 'MODULE_PATHNAME', 'pgsodium_crypto_aead_det_encrypt_by_id'
@@ -984,6 +984,8 @@ index 0000000..df6565a
984984+ AS 'MODULE_PATHNAME', 'pgsodium_crypto_aead_det_noncegen'
985985+ LANGUAGE c IMMUTABLE;
986986+
987+ + ALTER TABLE vault.secrets OWNER TO current_user;
988+ +
987989+ SECURITY LABEL ON COLUMN vault.secrets.secret IS NULL;
988990+
989991+ DROP TRIGGER IF EXISTS secrets_encrypt_secret_trigger_secret ON vault.secrets;
@@ -1037,8 +1039,6 @@ index 0000000..df6565a
10371039+ s.updated_at
10381040+ FROM vault.secrets s;
10391041+
1040- + GRANT ALL ON vault.decrypted_secrets TO pgsodium_keyiduser;
1041- +
10421042+ CREATE OR REPLACE FUNCTION vault.create_secret(
10431043+ new_secret text,
10441044+ new_name text = NULL,
@@ -1047,6 +1047,7 @@ index 0000000..df6565a
10471047+ new_key_id uuid = NULL
10481048+ )
10491049+ RETURNS uuid
1050+ + SECURITY DEFINER
10501051+ LANGUAGE plpgsql
10511052+ SET search_path = ''
10521053+ AS $$
@@ -1082,6 +1083,7 @@ index 0000000..df6565a
10821083+ new_key_id uuid = NULL
10831084+ )
10841085+ RETURNS void
1086+ + SECURITY DEFINER
10851087+ LANGUAGE plpgsql
10861088+ SET search_path = ''
10871089+ AS $$
@@ -1104,31 +1106,23 @@ index 0000000..df6565a
11041106+ WHERE s.id = secret_id;
11051107+ END
11061108+ $$;
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;
11261120diff --git a/sql/supabase_vault--0.3.0.sql b/sql/supabase_vault--0.3.0.sql
11271121new file mode 100644
1128- index 0000000..af6abe2
1122+ index 0000000..b0e5998
11291123--- /dev/null
11301124+++ b/sql/supabase_vault--0.3.0.sql
1131- @@ -0,0 +1,123 @@
1125+ @@ -0,0 +1,129 @@
11321126+ CREATE OR REPLACE FUNCTION vault._crypto_aead_det_encrypt(message bytea, additional bytea, key_id bigint, context bytea = 'pgsodium', nonce bytea = NULL)
11331127+ RETURNS bytea
11341128+ AS 'MODULE_PATHNAME', 'pgsodium_crypto_aead_det_encrypt_by_id'
@@ -1181,10 +1175,6 @@ index 0000000..af6abe2
11811175+ s.updated_at
11821176+ FROM vault.secrets s;
11831177+
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- +
11881178+ CREATE OR REPLACE FUNCTION vault.create_secret(
11891179+ new_secret text,
11901180+ new_name text = NULL,
@@ -1193,6 +1183,7 @@ index 0000000..af6abe2
11931183+ new_key_id uuid = NULL
11941184+ )
11951185+ RETURNS uuid
1186+ + SECURITY DEFINER
11961187+ LANGUAGE plpgsql
11971188+ SET search_path = ''
11981189+ AS $$
@@ -1228,6 +1219,7 @@ index 0000000..af6abe2
12281219+ new_key_id uuid = NULL
12291220+ )
12301221+ RETURNS void
1222+ + SECURITY DEFINER
12311223+ LANGUAGE plpgsql
12321224+ SET search_path = ''
12331225+ AS $$
@@ -1251,6 +1243,14 @@ index 0000000..af6abe2
12511243+ END
12521244+ $$;
12531245+
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+ +
12541254+ SELECT pg_catalog.pg_extension_config_dump('vault.secrets', '');
12551255diff --git a/src/crypto_aead_det_xchacha20.c b/src/crypto_aead_det_xchacha20.c
12561256new file mode 100644
@@ -1441,7 +1441,7 @@ index 0000000..91eca9a
14411441+ #endif
14421442diff --git a/src/pgsodium.c b/src/pgsodium.c
14431443new file mode 100644
1444- index 0000000..563c55f
1444+ index 0000000..d337fff
14451445--- /dev/null
14461446+++ b/src/pgsodium.c
14471447@@ -0,0 +1,144 @@
@@ -1559,7 +1559,7 @@ index 0000000..563c55f
15591559+ {
15601560+ nonce = NULL;
15611561+ }
1562- + ERRORIF (VARSIZE_ANY_EXHDR (ciphertext) <
1562+ + ERRORIF (VARSIZE_ANY_EXHDR (ciphertext) <=
15631563+ crypto_aead_det_xchacha20_ABYTES, "%s: invalid message");
15641564+ result_len =
15651565+ VARSIZE_ANY_EXHDR (ciphertext) - crypto_aead_det_xchacha20_ABYTES;
@@ -1999,10 +1999,10 @@ index e6221c2..0000000
19991999- select * from finish();
20002000diff --git a/test/expected/test.out b/test/expected/test.out
20012001new file mode 100644
2002- index 0000000..1d69ec5
2002+ index 0000000..84c4c15
20032003--- /dev/null
20042004+++ b/test/expected/test.out
2005- @@ -0,0 +1,110 @@
2005+ @@ -0,0 +1,86 @@
20062006+ select no_plan();
20072007+ no_plan
20082008+ ---------
@@ -2083,63 +2083,36 @@ index 0000000..1d69ec5
20832083+ ok 5 - bob can query an updated secret
20842084+ (1 row)
20852085+
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- +
21102086+ select * from finish();
21112087+ finish
21122088+ --------
2113- + 1..6
2089+ + 1..5
21142090+ (1 row)
21152091+
21162092diff --git a/test/fixtures.sql b/test/fixtures.sql
21172093new file mode 100644
2118- index 0000000..b323d22
2094+ index 0000000..d4c00c8
21192095--- /dev/null
21202096+++ b/test/fixtures.sql
2121- @@ -0,0 +1,15 @@
2097+ @@ -0,0 +1,12 @@
21222098+ CREATE ROLE bob login password 'bob';
21232099+
2124- + CREATE ROLE pgsodium_keyiduser WITH
2125- + NOLOGIN
2126- + NOSUPERUSER
2127- + NOCREATEDB
2128- + NOCREATEROLE
2129- + INHERIT
2130- + NOREPLICATION
2131- + CONNECTION LIMIT -1;
2132- +
21332100+ CREATE EXTENSION IF NOT EXISTS pgtap;
21342101+ CREATE EXTENSION supabase_vault CASCADE;
21352102+
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;
21372110diff --git a/test/sql/test.sql b/test/sql/test.sql
21382111new file mode 100644
2139- index 0000000..69dbccd
2112+ index 0000000..064e382
21402113--- /dev/null
21412114+++ b/test/sql/test.sql
2142- @@ -0,0 +1,84 @@
2115+ @@ -0,0 +1,62 @@
21432116+ select no_plan();
21442117+
21452118+ do $$
@@ -2201,26 +2174,4 @@ index 0000000..69dbccd
22012174+ $results$values ('fooz', 'barz', 'bazz')$results$,
22022175+ 'bob can query an updated secret');
22032176+
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- +
22262177+ select * from finish();
0 commit comments