From 654edd37bbf7608fa1f1889cda4604cdba76f20f Mon Sep 17 00:00:00 2001
From: Kim Alvefur <zash@zash.se>
Date: Thu, 23 Jan 2025 16:38:56 +0100
Subject: util.sql: SQLCipher support

This enables use of encrypted databases if LuaDBI or LuaSQLite3 has been
linked against SQLCipher. Using `LD_PRELOAD` may work as well.

Requires SQLCipher >= 4.0.0 due to the use of UPSERT
---
 util/sql.lua     | 6 ++++++
 util/sqlite3.lua | 6 ++++++
 2 files changed, 12 insertions(+)

(limited to 'util')

diff --git a/util/sql.lua b/util/sql.lua
index c897d734..2f0ec493 100644
--- a/util/sql.lua
+++ b/util/sql.lua
@@ -84,6 +84,12 @@ function engine:connect()
 	dbh:autocommit(false); -- don't commit automatically
 	self.conn = dbh;
 	self.prepared = {};
+	if params.password then
+		local ok, err = self:execute(("PRAGMA key='%s'"):format(dbh:quote(params.password)));
+		if not ok then
+			return ok, err;
+		end
+	end
 	local ok, err = self:set_encoding();
 	if not ok then
 		return ok, err;
diff --git a/util/sqlite3.lua b/util/sqlite3.lua
index 470eb46d..fec2d162 100644
--- a/util/sqlite3.lua
+++ b/util/sqlite3.lua
@@ -114,6 +114,12 @@ function engine:connect()
 	if not dbh then return nil, err; end
 	self.conn = dbh;
 	self.prepared = {};
+	if params.password then
+		local ok, err = self:execute(("PRAGMA key='%s'"):format((params.password:gsub("'", "''"))));
+		if not ok then
+			return ok, err;
+		end
+	end
 	local ok, err = self:set_encoding();
 	if not ok then
 		return ok, err;
-- 
cgit v1.2.3