- hypr/apps.lua - hypr/autostart.lua - hypr/envs.lua - hypr/hyprland.lua - hypr/hyprsunset.conf - hypr/input.lua - hypr/looknfeel.lua - hypr/omasettings.lua - hypr/xdph.conf - omarchy/branding/about.txt - omarchy/branding/screensaver.txt - omarchy/extensions/omarchy-menu.jsonc - omarchy/hooks/battery-low.d/play-warning-sound.sample - omarchy/hooks/font-set.d/show-font-notification.sample - omarchy/hooks/post-boot.d/weather.sample - omarchy/hooks/post-update.d/install-voxtype.hook - omarchy/hooks/post-update.d/setup-agent.hook - omarchy/hooks/post-update.d/setup-fingerprint.hook - omarchy/hooks/post-update.d/show-update-notification.sample - omarchy/hooks/pre-refresh-pacman.d/add-custom-repo.sample - omarchy/hooks/theme-set.d/show-theme-notification.sample - omarchy/shell.json - omarchy/shell.toml - omarchy/theme.name - omarchy/themes/azure-glow/README.md - omarchy/themes/azure-glow/alacritty.toml - omarchy/themes/azure-glow/btop.theme - omarchy/themes/azure-glow/hyprland.conf - omarchy/themes/azure-glow/hyprlock.conf - omarchy/themes/azure-glow/icons.theme - … 269 more
229 lines
11 KiB
JavaScript
229 lines
11 KiB
JavaScript
#!/usr/bin/env node
|
|
// The plugin ships a compiled helper, so the panel checks it before trusting
|
|
// it: that it exists, is executable, is the right architecture, matches its
|
|
// recorded checksum, passes its own self-test, and speaks the protocol this
|
|
// panel does. Every one of those can fail on a real machine -- a partial
|
|
// clone, an LFS placeholder, a stale artifact after `git pull`, a helper from
|
|
// a newer plugin version -- and each must disable only this optional feature.
|
|
//
|
|
// Be clear about what the checksum is for. bin/SHA256SUMS sits beside the
|
|
// binary and beside the QML that reads it, so anyone able to replace one can
|
|
// replace the others. It is not tamper detection. It catches corruption,
|
|
// truncation, and staleness, which are the failures that actually happen.
|
|
//
|
|
// node tests/ssh-agent-bundle.test.js
|
|
|
|
const fs = require("fs")
|
|
const os = require("os")
|
|
const path = require("path")
|
|
const { spawnSync } = require("child_process")
|
|
|
|
const repoRoot = path.join(__dirname, "..")
|
|
const Model = {}
|
|
new Function("exports", fs.readFileSync(path.join(repoRoot, "BitwardenModel.js"), "utf8")
|
|
.replace(/^\.pragma library\s*$/m, "") + `
|
|
exports.sshAgentBundledRelative = sshAgentBundledRelative
|
|
exports.sshAgentDevelopmentRelative = sshAgentDevelopmentRelative
|
|
exports.sshAgentHelperCandidates = sshAgentHelperCandidates
|
|
exports.sshAgentHelperInspectCommand = sshAgentHelperInspectCommand
|
|
exports.parseSshAgentHelperInspection = parseSshAgentHelperInspection
|
|
exports.sshAgentHelperReady = sshAgentHelperReady
|
|
exports.sshAgentHelperSourceLabel = sshAgentHelperSourceLabel
|
|
`)(Model)
|
|
|
|
let pass = 0
|
|
const failures = []
|
|
const check = (label, ok, detail) => ok ? pass++ : failures.push(`${label}\n ${detail}`)
|
|
const eq = (label, actual, expected) =>
|
|
check(label, actual === expected, `expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`)
|
|
|
|
// -------------------------------------------------------------------------
|
|
// The shipped artifact is really in the repository
|
|
// -------------------------------------------------------------------------
|
|
|
|
const bundled = path.join(repoRoot, "bin", "x86_64-linux", "qs-bitwarden-ssh-agent")
|
|
const sums = path.join(repoRoot, "bin", "SHA256SUMS")
|
|
|
|
check("the helper is tracked in the repository", fs.existsSync(bundled), bundled)
|
|
check("its checksum is tracked beside it", fs.existsSync(sums), sums)
|
|
check("it is executable", fs.existsSync(bundled) && (fs.statSync(bundled).mode & 0o111) !== 0,
|
|
"the shipped helper is not executable, so a fresh clone cannot run it")
|
|
check("it is not a Git LFS placeholder",
|
|
fs.existsSync(bundled) && !/git-lfs/.test(fs.readFileSync(bundled).subarray(0, 200).toString("latin1")),
|
|
"an LFS smudge would leave a text pointer where the binary should be")
|
|
check("it is a real ELF binary",
|
|
fs.existsSync(bundled) && fs.readFileSync(bundled).subarray(0, 4).toString("latin1") === "\x7fELF",
|
|
"no ELF magic")
|
|
|
|
const recorded = fs.existsSync(sums) ? fs.readFileSync(sums, "utf8").trim() : ""
|
|
check("the checksum file records a path relative to bin/",
|
|
/^[0-9a-f]{64}\s+x86_64-linux\/qs-bitwarden-ssh-agent$/.test(recorded),
|
|
recorded)
|
|
if (fs.existsSync(bundled) && recorded) {
|
|
const actual = spawnSync("sha256sum", [bundled], { encoding: "utf8" }).stdout.split(" ")[0]
|
|
eq("the tracked binary matches its tracked checksum", actual, recorded.split(/\s+/)[0])
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Which helper the panel picks
|
|
// -------------------------------------------------------------------------
|
|
|
|
eq("the bundled path is architecture-scoped",
|
|
Model.sshAgentBundledRelative(), "bin/x86_64-linux/qs-bitwarden-ssh-agent")
|
|
eq("the development path is cargo's debug output",
|
|
Model.sshAgentDevelopmentRelative(), "agent/target/debug/qs-bitwarden-ssh-agent")
|
|
|
|
const candidates = Model.sshAgentHelperCandidates("/opt/bw")
|
|
eq("both candidates are offered", candidates.length, 2)
|
|
eq("the shipped helper is preferred", candidates[0].path, "/opt/bw/bin/x86_64-linux/qs-bitwarden-ssh-agent")
|
|
eq("the development build is the fallback", candidates[1].path, "/opt/bw/agent/target/debug/qs-bitwarden-ssh-agent")
|
|
eq("the preferred one is labelled", candidates[0].source, "bundled")
|
|
eq("the fallback is labelled", candidates[1].source, "development")
|
|
check("every candidate path is absolute",
|
|
candidates.every(c => c.path.charAt(0) === "/"), JSON.stringify(candidates))
|
|
eq("no plugin directory yields no candidates", Model.sshAgentHelperCandidates("").length, 0)
|
|
eq("a traversing plugin directory yields no candidates",
|
|
Model.sshAgentHelperCandidates("/opt/../etc").length, 0)
|
|
|
|
// A development build being present must not hide a broken shipped one from
|
|
// the diagnostics, but it should still let the panel run.
|
|
check("the source in use is nameable",
|
|
Model.sshAgentHelperSourceLabel("bundled").length > 0
|
|
&& Model.sshAgentHelperSourceLabel("development").length > 0,
|
|
"a user cannot tell which helper is running")
|
|
check("the development label says it is not the shipped artifact",
|
|
/develop|local|built/i.test(Model.sshAgentHelperSourceLabel("development")),
|
|
Model.sshAgentHelperSourceLabel("development"))
|
|
|
|
// -------------------------------------------------------------------------
|
|
// The inspection, run against real files
|
|
// -------------------------------------------------------------------------
|
|
|
|
function inTemp(fn) {
|
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "qsbw-bundle-"))
|
|
try { return fn(dir) } finally { fs.rmSync(dir, { recursive: true, force: true }) }
|
|
}
|
|
const inspect = (pluginDir) => {
|
|
const cmd = Model.sshAgentHelperInspectCommand(pluginDir)
|
|
const run = spawnSync(cmd[0], cmd.slice(1), { encoding: "utf8", env: { PATH: "/usr/bin:/bin" } })
|
|
return Model.parseSshAgentHelperInspection(run.stdout)
|
|
}
|
|
|
|
// The real repository: a tracked helper that should pass every check.
|
|
{
|
|
const result = inspect(repoRoot)
|
|
eq("the shipped helper is usable", result.state, "ok")
|
|
eq("and is identified as the bundled one", result.source, "bundled")
|
|
check("its version is reported", /^\d+\.\d+\.\d+$/.test(result.version), result.version)
|
|
eq("its protocol version is reported", result.protocol, 1)
|
|
eq("its checksum is confirmed", result.checksum, "match")
|
|
eq("its self-test passed", result.selfTest, "pass")
|
|
eq("the panel would enable the feature", Model.sshAgentHelperReady(result), true)
|
|
}
|
|
|
|
// Nothing there at all.
|
|
inTemp(dir => {
|
|
const result = inspect(dir)
|
|
eq("a missing helper is reported", result.state, "missing")
|
|
eq("and the feature stays off", Model.sshAgentHelperReady(result), false)
|
|
check("the message says what to do", /build|install|clone/i.test(result.message), result.message)
|
|
})
|
|
|
|
// Present but not executable -- a clone from an archive that dropped modes.
|
|
inTemp(dir => {
|
|
const target = path.join(dir, "bin", "x86_64-linux")
|
|
fs.mkdirSync(target, { recursive: true })
|
|
fs.copyFileSync(bundled, path.join(target, "qs-bitwarden-ssh-agent"))
|
|
fs.chmodSync(path.join(target, "qs-bitwarden-ssh-agent"), 0o644)
|
|
fs.mkdirSync(path.join(dir, "bin"), { recursive: true })
|
|
fs.copyFileSync(sums, path.join(dir, "bin", "SHA256SUMS"))
|
|
const result = inspect(dir)
|
|
eq("a non-executable helper is reported", result.state, "not-executable")
|
|
eq("and the feature stays off", Model.sshAgentHelperReady(result), false)
|
|
})
|
|
|
|
// Corrupt or truncated -- a partial clone, or an interrupted download.
|
|
inTemp(dir => {
|
|
const target = path.join(dir, "bin", "x86_64-linux")
|
|
fs.mkdirSync(target, { recursive: true })
|
|
const copy = path.join(target, "qs-bitwarden-ssh-agent")
|
|
fs.copyFileSync(bundled, copy)
|
|
fs.truncateSync(copy, 4096)
|
|
fs.chmodSync(copy, 0o755)
|
|
fs.copyFileSync(sums, path.join(dir, "bin", "SHA256SUMS"))
|
|
const result = inspect(dir)
|
|
check("a truncated helper is refused", result.state !== "ok", JSON.stringify(result))
|
|
eq("the checksum is what catches it", result.checksum, "mismatch")
|
|
eq("and the feature stays off", Model.sshAgentHelperReady(result), false)
|
|
check("the message names staleness or corruption",
|
|
/stale|corrupt|match|update/i.test(result.message), result.message)
|
|
})
|
|
|
|
// A Git LFS placeholder where the binary should be.
|
|
inTemp(dir => {
|
|
const target = path.join(dir, "bin", "x86_64-linux")
|
|
fs.mkdirSync(target, { recursive: true })
|
|
fs.writeFileSync(path.join(target, "qs-bitwarden-ssh-agent"),
|
|
"version https://git-lfs.github.com/spec/v1\noid sha256:deadbeef\nsize 1210560\n", { mode: 0o755 })
|
|
fs.copyFileSync(sums, path.join(dir, "bin", "SHA256SUMS"))
|
|
const result = inspect(dir)
|
|
check("an LFS placeholder is refused", result.state !== "ok", JSON.stringify(result))
|
|
eq("and the feature stays off", Model.sshAgentHelperReady(result), false)
|
|
})
|
|
|
|
// A development build with no shipped artifact: the dev loop must keep working.
|
|
inTemp(dir => {
|
|
const target = path.join(dir, "agent", "target", "debug")
|
|
fs.mkdirSync(target, { recursive: true })
|
|
fs.copyFileSync(bundled, path.join(target, "qs-bitwarden-ssh-agent"))
|
|
fs.chmodSync(path.join(target, "qs-bitwarden-ssh-agent"), 0o755)
|
|
const result = inspect(dir)
|
|
eq("a development build is usable", result.state, "ok")
|
|
eq("and is identified as such", result.source, "development")
|
|
eq("the feature is enabled from it", Model.sshAgentHelperReady(result), true)
|
|
check("no checksum is claimed for an untracked build",
|
|
result.checksum === "unchecked", result.checksum)
|
|
})
|
|
|
|
// Both present: the shipped artifact wins, but a broken one does not strand
|
|
// a developer who has a working local build.
|
|
inTemp(dir => {
|
|
const shipped = path.join(dir, "bin", "x86_64-linux")
|
|
fs.mkdirSync(shipped, { recursive: true })
|
|
fs.writeFileSync(path.join(shipped, "qs-bitwarden-ssh-agent"), "not a binary\n", { mode: 0o755 })
|
|
fs.copyFileSync(sums, path.join(dir, "bin", "SHA256SUMS"))
|
|
const dev = path.join(dir, "agent", "target", "debug")
|
|
fs.mkdirSync(dev, { recursive: true })
|
|
fs.copyFileSync(bundled, path.join(dev, "qs-bitwarden-ssh-agent"))
|
|
fs.chmodSync(path.join(dev, "qs-bitwarden-ssh-agent"), 0o755)
|
|
const result = inspect(dir)
|
|
eq("a broken shipped helper falls back to the development build", result.state, "ok")
|
|
eq("and says which one it used", result.source, "development")
|
|
})
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Failure isolation
|
|
// -------------------------------------------------------------------------
|
|
|
|
// The settings diagnostics live in SshAgentSettings.qml; the supervision that
|
|
// feeds them is still in Panel.qml. Both, or a check lands on whichever half
|
|
// happens to hold its pattern today.
|
|
const panelSrc = ["Panel.qml", "SshAgentSettings.qml"]
|
|
.map(file => fs.readFileSync(path.join(repoRoot, file), "utf8"))
|
|
.join("\n")
|
|
check("the helper is inspected before the supervisor is allowed to start",
|
|
/sshAgentHelperReady\(/.test(panelSrc), "nothing gates startup on the inspection")
|
|
check("a failed inspection disables only the agent",
|
|
/sshAgentSupervisable[\s\S]{0,400}?sshAgentHelperReady|sshAgentHelperReady[\s\S]{0,400}?sshAgentSupervisable/.test(panelSrc),
|
|
"the inspection result does not feed the supervisable gate")
|
|
check("the source in use is shown in the settings diagnostics",
|
|
/sshAgentHelperSourceLabel\(/.test(panelSrc),
|
|
"a user cannot tell whether they are running the shipped or the local helper")
|
|
|
|
if (failures.length) {
|
|
console.error(`\n${failures.length} failed, ${pass} passed\n`)
|
|
failures.forEach(f => console.error(` FAIL ${f}`))
|
|
process.exit(1)
|
|
}
|
|
console.log(`ssh-agent-bundle: ${pass} passed`)
|