From 6ba46976d477ecbe09c44ee14a451cd014d2fd0b Mon Sep 17 00:00:00 2001 From: V1K1NGbg Date: Sun, 28 Jul 2024 00:47:36 +0300 Subject: signing --- src/luarocks/core/cfg.d.tl | 1 + src/luarocks/fs.d.tl | 3 +++ src/luarocks/signing-original.lua | 48 +++++++++++++++++++++++++++++++++++++++ src/luarocks/signing.tl | 48 +++++++++++++++++++++++++++++++++++++++ src/luarocks/util.lua | 2 +- 5 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 src/luarocks/signing-original.lua create mode 100644 src/luarocks/signing.tl (limited to 'src') diff --git a/src/luarocks/core/cfg.d.tl b/src/luarocks/core/cfg.d.tl index f21bd64c..2218c172 100644 --- a/src/luarocks/core/cfg.d.tl +++ b/src/luarocks/core/cfg.d.tl @@ -59,6 +59,7 @@ local record cfg record variables LUA: string + GPG: string end rocks_provided: {Rockspec} end diff --git a/src/luarocks/fs.d.tl b/src/luarocks/fs.d.tl index fe96b742..17a367cc 100644 --- a/src/luarocks/fs.d.tl +++ b/src/luarocks/fs.d.tl @@ -14,6 +14,9 @@ local record fs current_dir: function(): string list_dir: function(string): {string} delete: function(string) + -- signing + is_tool_available: function(string, string): string, string + execute: function(...: string): boolean --? boolean? src/luarocks/signing.tl: 27 end return fs diff --git a/src/luarocks/signing-original.lua b/src/luarocks/signing-original.lua new file mode 100644 index 00000000..cb91643a --- /dev/null +++ b/src/luarocks/signing-original.lua @@ -0,0 +1,48 @@ +local signing = {} + +local cfg = require("luarocks.core.cfg") +local fs = require("luarocks.fs") + +local function get_gpg() + local vars = cfg.variables + local gpg = vars.GPG + local gpg_ok, err = fs.is_tool_available(gpg, "gpg") + if not gpg_ok then + return nil, err + end + return gpg +end + +function signing.signature_url(url) + return url .. ".asc" +end + +function signing.sign_file(file) + local gpg, err = get_gpg() + if not gpg then + return nil, err + end + + local sigfile = file .. ".asc" + if fs.execute(gpg, "--armor", "--output", sigfile, "--detach-sign", file) then + return sigfile + else + return nil, "failed running " .. gpg .. " to sign " .. file + end +end + +function signing.verify_signature(file, sigfile) + local gpg, err = get_gpg() + if not gpg then + return nil, err + end + + if fs.execute(gpg, "--verify", sigfile, file) then + return true + else + return nil, "GPG returned a verification error" + end + +end + +return signing diff --git a/src/luarocks/signing.tl b/src/luarocks/signing.tl new file mode 100644 index 00000000..114be6c8 --- /dev/null +++ b/src/luarocks/signing.tl @@ -0,0 +1,48 @@ +local signing = {} + +local cfg = require("luarocks.core.cfg") +local fs = require("luarocks.fs") + +local function get_gpg(): string, string + local vars = cfg.variables + local gpg = vars.GPG --? string from line 30 + local gpg_ok, err = fs.is_tool_available(gpg, "gpg") + if not gpg_ok then + return nil, err + end + return gpg +end + +function signing.signature_url(url: string): string + return url .. ".asc" +end + +function signing.sign_file(file: string): string, string + local gpg, err = get_gpg() + if not gpg then + return nil, err + end + + local sigfile = file .. ".asc" + if fs.execute(gpg, "--armor", "--output", sigfile, "--detach-sign", file) then + return sigfile + else + return nil, "failed running " .. gpg .. " to sign " .. file + end +end + +function signing.verify_signature(file: string, sigfile: string): boolean, string + local gpg, err = get_gpg() + if not gpg then + return nil, err + end + + if fs.execute(gpg, "--verify", sigfile, file) then + return true + else + return nil, "GPG returned a verification error" + end + +end + +return signing diff --git a/src/luarocks/util.lua b/src/luarocks/util.lua index cca7aa85..165cb8fa 100644 --- a/src/luarocks/util.lua +++ b/src/luarocks/util.lua @@ -63,7 +63,7 @@ local scheduled_functions = {} function util.schedule_function(f, ...) - local pack = table.pack or function(...) return { n = select("#", ...), ... } end --TEST + local pack = table.pack or function(...) return { n = select("#", ...), ... } end --! FOR TESTS TO PASS local item = { fn = f, args = pack(...) } table.insert(scheduled_functions, item) -- cgit v1.2.3-55-g6feb