Add pass launcher plugin (#89)
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
--!nonstrict
|
||||
|
||||
local entries = {}
|
||||
|
||||
local function shellEscape(str)
|
||||
return "'" .. str:gsub("'", "'\\''") .. "'"
|
||||
end
|
||||
|
||||
noctalia.state.watch("entries", function(value)
|
||||
entries = value or {}
|
||||
end)
|
||||
|
||||
function onQuery(query)
|
||||
local results = {}
|
||||
local action = "password"
|
||||
local search = query
|
||||
|
||||
if query:match("^otp%s+") then
|
||||
action = "otp"
|
||||
search = query:gsub("^otp%s+", "")
|
||||
end
|
||||
|
||||
for _, entry in ipairs(entries) do
|
||||
local score
|
||||
|
||||
if search == "" then
|
||||
score = 1
|
||||
else
|
||||
score = noctalia.fuzzyScore(search, entry.path)
|
||||
end
|
||||
|
||||
if score then
|
||||
local subtitle = entry.subtitle ~= "" and entry.subtitle or nil
|
||||
|
||||
if action == "otp" then
|
||||
table.insert(results, {
|
||||
id = "otp:" .. entry.id,
|
||||
title = "Copy OTP: " .. entry.title,
|
||||
subtitle = subtitle,
|
||||
glyph = "123",
|
||||
score = score,
|
||||
})
|
||||
else
|
||||
table.insert(results, {
|
||||
id = "password:" .. entry.id,
|
||||
title = entry.title,
|
||||
subtitle = subtitle,
|
||||
glyph = "key",
|
||||
score = score,
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
launcher.setResults(query, results)
|
||||
end
|
||||
|
||||
local function copyWithPass(command, path, successMessage)
|
||||
local escaped = shellEscape(path)
|
||||
|
||||
noctalia.runAsync(command .. " " .. escaped, function(result)
|
||||
if result.exitCode == 0 then
|
||||
noctalia.notify("Pass", successMessage)
|
||||
return
|
||||
end
|
||||
|
||||
local stderr = result.stderr or ""
|
||||
local err = stderr:lower()
|
||||
|
||||
if err:find("gpg") then
|
||||
noctalia.notify("Pass", noctalia.tr("notification.unlocking"))
|
||||
|
||||
noctalia.runInTerminal(command .. " " .. escaped)
|
||||
return
|
||||
end
|
||||
|
||||
if err == "" then
|
||||
err = noctalia.tr("notification.copy_failed")
|
||||
else
|
||||
err = stderr
|
||||
end
|
||||
|
||||
noctalia.notifyError("Pass", err)
|
||||
end)
|
||||
end
|
||||
|
||||
function onActivate(id)
|
||||
local action, path = id:match("^([^:]+):(.+)$")
|
||||
|
||||
if action == "otp" then
|
||||
copyWithPass("pass otp -c", path, "OTP code copied")
|
||||
else
|
||||
copyWithPass("pass -c", path or id, noctalia.tr("notification.copied"))
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user