Commit: 9c423d75c6d43f2324e8a190348b089c7a959ba7
Parent: 20a3f6cd831aff55ec1ef1a27333912d618d531e
Author: Randy Palamar
Date: Wed, 4 Jan 2023 20:54:30 -0700
vis: seamlessly edit gpg encrypted files
Diffstat:
2 files changed, 56 insertions(+), 0 deletions(-)
diff --git a/.config/vis/gpg.lua b/.config/vis/gpg.lua
@@ -0,0 +1,55 @@
+require('util')
+
+gpg = { key = 0 }
+
+local function decrypt(file)
+ local f, e = util:splitext(file.name)
+ if e ~= '.gpg' then return end
+
+ local err, ostr, estr = vis:pipe(file, {start = 0, finish = file.size}, "gpg -d")
+ if err ~= 0 then return false end
+
+ local i = string.find(estr, "ID")
+ local j = string.find(estr, ",", i)
+ local keyid = string.sub(estr, i+3, j-1)
+ if keyid ~= gpg.key then
+ vis:info(estr)
+ gpg.key = keyid
+ end
+
+ file:delete(0, file.size)
+ file:insert(0, ostr)
+ file.modified = false
+ return true
+end
+vis.events.subscribe(vis.events.FILE_OPEN, decrypt)
+vis.events.subscribe(vis.events.FILE_SAVE_POST, decrypt)
+
+local function encrypt(file, path)
+ local f, e = util:splitext(file.name)
+ if e ~= '.gpg' then return end
+
+ if gpg.key == 0 then
+ vis:info('encrypt: keyid not found. file not saved.')
+ return false
+ end
+
+ local tfn = os.tmpname()
+ local cmd = "gpg --yes -o " .. tfn .. " -e -r " .. gpg.key
+ local err, ostr, estr = vis:pipe(file, {start = 0, finish = file.size}, cmd)
+ if err ~= 0 then
+ if estr then
+ vis:message(estr)
+ end
+ return false
+ end
+
+ local tf = io.open(tfn, 'rb')
+ file:delete(0, file.size)
+ file:insert(0, tf:read("a"))
+ tf:close()
+ os.remove(tfn)
+
+ return true
+end
+vis.events.subscribe(vis.events.FILE_SAVE_PRE, encrypt)
diff --git a/.config/vis/visrc.lua b/.config/vis/visrc.lua
@@ -2,6 +2,7 @@ require('vis')
require('util')
require('build')
require('macros')
+require('gpg')
spell = require('plugins/vis-spellcheck')
spell.lang = "en_US"