diff --git a/.netlify/v1/config.json b/.netlify/v1/config.json new file mode 100644 index 0000000..0bde578 --- /dev/null +++ b/.netlify/v1/config.json @@ -0,0 +1 @@ +{"images":{"remote_images":[]},"headers":[{"for":"/_astro/*","values":{"Cache-Control":"public, max-age=31536000, immutable"}}]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 031e372..58732ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "pale-point", "version": "0.0.1", "dependencies": { - "@astrojs/netlify": "^5.2.0", + "@astrojs/netlify": "^5.5.1", "@astrojs/starlight": "^0.21.3", "astro": "^4.3.5", "sharp": "^0.32.5" @@ -90,18 +90,408 @@ } }, "node_modules/@astrojs/netlify": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@astrojs/netlify/-/netlify-5.2.0.tgz", - "integrity": "sha512-NFg3AdUToV7kbY5w2yHZY5UskqfsmIo9i0zIzQ2GgUcTwjyZCekZ89DLtKCJ1jFVle+QXJGsJAS61EYyptBDBQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@astrojs/netlify/-/netlify-5.5.1.tgz", + "integrity": "sha512-tC5L51/bMo5SjM+7/eKw+NJL4aXDr8BLGLgrN874YU+lX4Q4VqiFsy/yLjfgj7NXFHNdK8CTCrTrcg89knKryw==", "dependencies": { - "@astrojs/underscore-redirects": "^0.3.3", - "@netlify/functions": "^2.0.1", - "esbuild": "^0.19.5" + "@astrojs/internal-helpers": "0.4.1", + "@astrojs/underscore-redirects": "^0.3.4", + "@netlify/functions": "^2.8.0", + "@vercel/nft": "^0.27.2", + "esbuild": "^0.22.0" }, "peerDependencies": { "astro": "^4.2.0" } }, + "node_modules/@astrojs/netlify/node_modules/@astrojs/internal-helpers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.4.1.tgz", + "integrity": "sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==" + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/aix-ppc64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.22.0.tgz", + "integrity": "sha512-uvQR2crZ/zgzSHDvdygHyNI+ze9zwS8mqz0YtGXotSqvEE0UkYE9s+FZKQNTt1VtT719mfP3vHrUdCpxBNQZhQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/android-arm": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.22.0.tgz", + "integrity": "sha512-PBnyP+r8vJE4ifxsWys9l+Mc2UY/yYZOpX82eoyGISXXb3dRr0M21v+s4fgRKWMFPMSf/iyowqPW/u7ScSUkjQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/android-arm64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.22.0.tgz", + "integrity": "sha512-UKhPb3o2gAB/bfXcl58ZXTn1q2oVu1rEu/bKrCtmm+Nj5MKUbrOwR5WAixE2v+lk0amWuwPvhnPpBRLIGiq7ig==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/android-x64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.22.0.tgz", + "integrity": "sha512-IjTYtvIrjhR41Ijy2dDPgYjQHWG/x/A4KXYbs1fiU3efpRdoxMChK3oEZV6GPzVEzJqxFgcuBaiX1kwEvWUxSw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/darwin-arm64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.22.0.tgz", + "integrity": "sha512-mqt+Go4y9wRvEz81bhKd9RpHsQR1LwU8Xm6jZRUV/xpM7cIQFbFH6wBCLPTNsdELBvfoHeumud7X78jQQJv2TA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/darwin-x64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.22.0.tgz", + "integrity": "sha512-vTaTQ9OgYc3VTaWtOE5pSuDT6H3d/qSRFRfSBbnxFfzAvYoB3pqKXA0LEbi/oT8GUOEAutspfRMqPj2ezdFaMw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/freebsd-arm64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.22.0.tgz", + "integrity": "sha512-0e1ZgoobJzaGnR4reD7I9rYZ7ttqdh1KPvJWnquUoDJhL0rYwdneeLailBzd2/4g/U5p4e5TIHEWa68NF2hFpQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/freebsd-x64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.22.0.tgz", + "integrity": "sha512-BFgyYwlCwRWyPQJtkzqq2p6pJbiiWgp0P9PNf7a5FQ1itKY4czPuOMAlFVItirSmEpRPCeImuwePNScZS0pL5Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/linux-arm": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.22.0.tgz", + "integrity": "sha512-KEMWiA9aGuPUD4BH5yjlhElLgaRXe+Eri6gKBoDazoPBTo1BXc/e6IW5FcJO9DoL19FBeCxgONyh95hLDNepIg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/linux-arm64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.22.0.tgz", + "integrity": "sha512-V/K2rctCUgC0PCXpN7AqT4hoazXKgIYugFGu/myk2+pfe6jTW2guz/TBwq4cZ7ESqusR/IzkcQaBkcjquuBWsw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/linux-ia32": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.22.0.tgz", + "integrity": "sha512-r2ZZqkOMOrpUhzNwxI7uLAHIDwkfeqmTnrv1cjpL/rjllPWszgqmprd/om9oviKXUBpMqHbXmppvjAYgISb26Q==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/linux-loong64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.22.0.tgz", + "integrity": "sha512-qaowLrV/YOMAL2RfKQ4C/VaDzAuLDuylM2sd/LH+4OFirMl6CuDpRlCq4u49ZBaVV8pkI/Y+hTdiibvQRhojCA==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/linux-mips64el": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.22.0.tgz", + "integrity": "sha512-hgrezzjQTRxjkQ5k08J6rtZN5PNnkWx/Rz6Kmj9gnsdCAX1I4Dn4ZPqvFRkXo55Q3pnVQJBwbdtrTO7tMGtyVA==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/linux-ppc64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.22.0.tgz", + "integrity": "sha512-ewxg6FLLUio883XgSjfULEmDl3VPv/TYNnRprVAS3QeGFLdCYdx1tIudBcd7n9jIdk82v1Ajov4jx87qW7h9+g==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/linux-riscv64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.22.0.tgz", + "integrity": "sha512-Az5XbgSJC2lE8XK8pdcutsf9RgdafWdTpUK/+6uaDdfkviw/B4JCwAfh1qVeRWwOohwdsl4ywZrWBNWxwrPLFg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/linux-s390x": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.22.0.tgz", + "integrity": "sha512-8j4a2ChT9+V34NNNY9c/gMldutaJFmfMacTPq4KfNKwv2fitBCLYjee7c+Vxaha2nUhPK7cXcZpJtJ3+Y7ZdVQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/linux-x64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.22.0.tgz", + "integrity": "sha512-JUQyOnpbAkkRFOk/AhsEemz5TfWN4FJZxVObUlnlNCbe7QBl61ZNfM4cwBXayQA6laMJMUcqLHaYQHAB6YQ95Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/netbsd-x64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.22.0.tgz", + "integrity": "sha512-11PoCoHXo4HFNbLsXuMB6bpMPWGDiw7xETji6COdJss4SQZLvcgNoeSqWtATRm10Jj1uEHiaIk4N0PiN6x4Fcg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/openbsd-x64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.22.0.tgz", + "integrity": "sha512-ufjdW5tFJGUjlH9j/5cCE9lrwRffyZh+T4vYvoDKoYsC6IXbwaFeV/ENxeNXcxotF0P8CDzoICXVSbJaGBhkrw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/sunos-x64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.22.0.tgz", + "integrity": "sha512-zY6ly/AoSmKnmNTowDJsK5ehra153/5ZhqxNLfq9NRsTTltetr+yHHcQ4RW7QDqw4JC8A1uC1YmeSfK9NRcK1w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/win32-arm64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.22.0.tgz", + "integrity": "sha512-Kml5F7tv/1Maam0pbbCrvkk9vj046dPej30kFzlhXnhuCtYYBP6FGy/cLbc5yUT1lkZznGLf2OvuvmLjscO5rw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/win32-ia32": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.22.0.tgz", + "integrity": "sha512-IOgwn+mYTM3RrcydP4Og5IpXh+ftN8oF+HELTXSmbWBlujuci4Qa3DTeO+LEErceisI7KUSfEIiX+WOUlpELkw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/@esbuild/win32-x64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.22.0.tgz", + "integrity": "sha512-4bDHJrk2WHBXJPhy1y80X7/5b5iZTZP3LGcKIlAP1J+KqZ4zQAPMLEzftGyjjfcKbA4JDlPt/+2R/F1ZTeRgrw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@astrojs/netlify/node_modules/esbuild": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.22.0.tgz", + "integrity": "sha512-zNYA6bFZsVnsU481FnGAQjLDW0Pl/8BGG7EvAp15RzUvGC+ME7hf1q7LvIfStEQBz/iEHuBJCYcOwPmNCf1Tlw==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.22.0", + "@esbuild/android-arm": "0.22.0", + "@esbuild/android-arm64": "0.22.0", + "@esbuild/android-x64": "0.22.0", + "@esbuild/darwin-arm64": "0.22.0", + "@esbuild/darwin-x64": "0.22.0", + "@esbuild/freebsd-arm64": "0.22.0", + "@esbuild/freebsd-x64": "0.22.0", + "@esbuild/linux-arm": "0.22.0", + "@esbuild/linux-arm64": "0.22.0", + "@esbuild/linux-ia32": "0.22.0", + "@esbuild/linux-loong64": "0.22.0", + "@esbuild/linux-mips64el": "0.22.0", + "@esbuild/linux-ppc64": "0.22.0", + "@esbuild/linux-riscv64": "0.22.0", + "@esbuild/linux-s390x": "0.22.0", + "@esbuild/linux-x64": "0.22.0", + "@esbuild/netbsd-x64": "0.22.0", + "@esbuild/openbsd-arm64": "0.22.0", + "@esbuild/openbsd-x64": "0.22.0", + "@esbuild/sunos-x64": "0.22.0", + "@esbuild/win32-arm64": "0.22.0", + "@esbuild/win32-ia32": "0.22.0", + "@esbuild/win32-x64": "0.22.0" + } + }, "node_modules/@astrojs/prism": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.0.0.tgz", @@ -184,9 +574,9 @@ } }, "node_modules/@astrojs/underscore-redirects": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@astrojs/underscore-redirects/-/underscore-redirects-0.3.3.tgz", - "integrity": "sha512-qDAKhFO4M1KzP7mxoJfiehf8oyf3EB158MxAa6z10NeD2pR3o4K3LlOQI8CfJgXE+BDBQcnaLvVCg/Mz/Gkg4Q==" + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@astrojs/underscore-redirects/-/underscore-redirects-0.3.4.tgz", + "integrity": "sha512-vYuYtIrTwxFlDRIhuekscorsHdLL8Hr3mgOczfM1tRWVPn54dDNcKG0DmfL4DlC5YJRoqVaVdUs508Hw643NTw==" }, "node_modules/@babel/code-frame": { "version": "7.24.2", @@ -801,6 +1191,21 @@ "node": ">=12" } }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.22.0.tgz", + "integrity": "sha512-Ezlhu/YyITmXwKSB+Zu/QqD7cxrjrpiw85cc0Rbd3AWr2wsgp+dWbWOE8MqHaLW9NKMZvuL0DhbJbvzR7F6Zvg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/openbsd-x64": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", @@ -1313,6 +1718,25 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, "node_modules/@mdx-js/mdx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", @@ -1348,11 +1772,11 @@ } }, "node_modules/@netlify/functions": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-2.6.0.tgz", - "integrity": "sha512-vU20tij0fb4nRGACqb+5SQvKd50JYyTyEhQetCMHdakcJFzjLDivvRR16u1G2Oy4A7xNAtGJF1uz8reeOtTVcQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-2.8.1.tgz", + "integrity": "sha512-+6wtYdoz0yE06dSa9XkP47tw5zm6g13QMeCwM3MmHx1vn8hzwFa51JtmfraprdkL7amvb7gaNM+OOhQU1h6T8A==", "dependencies": { - "@netlify/serverless-functions-api": "1.14.0" + "@netlify/serverless-functions-api": "1.19.1" }, "engines": { "node": ">=14.0.0" @@ -1367,15 +1791,15 @@ } }, "node_modules/@netlify/serverless-functions-api": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.14.0.tgz", - "integrity": "sha512-HUNETLNvNiC2J+SB/YuRwJA9+agPrc0azSoWVk8H85GC+YE114hcS5JW+dstpKwVerp2xILE3vNWN7IMXP5Q5Q==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.19.1.tgz", + "integrity": "sha512-2KYkyluThg1AKfd0JWI7FzpS4A/fzVVGYIf6AM4ydWyNj8eI/86GQVLeRgDoH7CNOxt243R5tutWlmHpVq0/Ew==", "dependencies": { "@netlify/node-cookies": "^0.1.0", "urlpattern-polyfill": "8.0.2" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@nodelib/fs.scandir": { @@ -1475,6 +1899,23 @@ "win32" ] }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.0.tgz", @@ -1796,6 +2237,41 @@ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, + "node_modules/@vercel/nft": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.3.tgz", + "integrity": "sha512-oySTdDSzUAFDXpsSLk9Q943o+/Yu/+TCFxnehpFQEf/3khi2stMpTHPVNwFdvZq/Z4Ky93lE+MGHpXCRpMkSCA==", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.5", + "@rollup/pluginutils": "^4.0.0", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.2", + "node-gyp-build": "^4.2.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@vercel/nft/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", @@ -1807,6 +2283,14 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -1815,6 +2299,17 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -1894,6 +2389,24 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -2267,6 +2780,11 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==" + }, "node_modules/axobject-query": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", @@ -2289,6 +2807,11 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, "node_modules/bare-events": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz", @@ -2379,6 +2902,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, "node_modules/bl": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", @@ -2447,6 +2978,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -2729,6 +3269,14 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/color/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2759,6 +3307,16 @@ "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==" }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2861,6 +3419,11 @@ "node": ">=4.0.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -3203,6 +3766,11 @@ "reusify": "^1.0.4" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -3251,6 +3819,38 @@ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -3272,6 +3872,68 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3312,6 +3974,26 @@ "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -3378,6 +4060,11 @@ "node": ">=4" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -3693,6 +4380,18 @@ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", @@ -3729,6 +4428,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -4134,6 +4843,28 @@ "node": ">=12" } }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", @@ -5227,6 +5958,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -5235,6 +5977,53 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -5295,11 +6084,54 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -5338,6 +6170,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -5349,6 +6193,14 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5579,6 +6431,14 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -6398,6 +7258,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, "node_modules/restore-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", @@ -6799,6 +7667,21 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rollup": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.0.tgz", @@ -6920,6 +7803,11 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, "node_modules/sharp": { "version": "0.32.6", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", @@ -7231,6 +8119,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tar-fs": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", @@ -7254,6 +8158,19 @@ "streamx": "^2.15.0" } }, + "node_modules/tar/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7273,6 +8190,11 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -8051,6 +8973,20 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8085,6 +9021,51 @@ "node": ">=4" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", diff --git a/src/content/docs/advanced/gnupg-controller.md b/src/content/docs/advanced/gnupg-controller.md new file mode 100644 index 0000000..70b5d29 --- /dev/null +++ b/src/content/docs/advanced/gnupg-controller.md @@ -0,0 +1,140 @@ +--- +title: A Comprehensive Guide of GpgController +sidebar: + label: Gpg Controller +--- + +The **GpgController** in **GpgFrontend** is a powerful tool for configuring and +managing GPG-related settings. It provides advanced options for file operations, +password input methods, and custom GPG configurations, catering to both general +and advanced users. + +## Accessing the GpgController + +To access the **GpgController**: + +1. Navigate to the **Advanced** menu in the top toolbar. +2. Select **Open GnuPG Controller** from the dropdown menu. + + ![Open GnuPG Controller](https://image.cdn.bktus.com/i/2024/11/29/abfaa919-2945-1acc-eb35-5c86828a97ca.webp) + +The **GpgController** interface includes three tabs: **General**, **Key +Database**, and **Advanced**. Below is a detailed explanation of each tab's +features. + +## General Tab: Core Settings + +The **General** tab provides essential configuration options for GpgFrontend's interaction with GPG. + +![General Tab](https://image.cdn.bktus.com/i/2024/11/29/0ee752ca-ecd1-2a86-91b5-f6129184c7a4.webp) + +### Available Options + +1. **Use Binary Mode for File Operations** + + - This option determines the format used for encrypted or signed files: + - **Binary Mode**: Produces compact and efficient files, ideal for storage + and processing. + - **ASCII Mode**: Generates human-readable files encoded in ASCII format. + This is useful for sharing files over email or systems that might corrupt + binary files. + - **Recommendation**: Use binary mode for local file operations and ASCII + mode for file sharing or email attachments. + +2. **Use Pinentry as Password Input Dialog** + + - GpgFrontend includes a built-in password input dialog designed as a + temporary fallback when no external **Pinentry** program is available. + However, the built-in dialog has limitations and may not work for all + password input scenarios. + - **Recommendation**: Users are strongly encouraged to install a + full-featured **Pinentry** program to ensure a seamless and secure password + input experience. **Pinentry** is optimized for GnuPG's requirements and + provides additional features such as better passphrase caching and hardware + token support. + +3. **Enable GpgME Debug Log** + + - Enables verbose logging for troubleshooting GPG operations via the + **GpgME** library. This is useful for advanced users diagnosing issues in + encryption or signing workflows. + +4. **Restart Gpg Agent on Start** + + - Ensures that the GPG agent is restarted whenever GpgFrontend launches. This + helps avoid issues caused by stale GPG agent processes. + +5. **Kill All GPG Daemons at Close** + + - Terminates all GPG-related background processes when the application exits. + This ensures that no sensitive information is cached in memory or + accessible after the session ends. + - **Recommendation**: Always enable this option for improved security. + + > **Note**: Changes to any settings in the General tab will require + > restarting GpgFrontend to take effect. + +--- + +## Key Database Tab: Overview + +The **Key Database** tab allows users to manage multiple key databases. While +detailed documentation is available elsewhere, note the following key points: + +- **Add New Key Database**: Easily create and manage isolated key databases for + different projects or security requirements. +- **Switch Between Databases**: Use the **Key Toolbox** dropdown in the main + interface to select the active database. + + ![Key Database Tab](https://image.cdn.bktus.com/i/2024/11/29/7a66848e-bc23-fd13-08a4-1923de39369e.webp) + + > For more information on key database management, refer to the dedicated + > documentation. + +--- + +## Advanced Tab: Custom GnuPG Configuration + +The **Advanced** tab is designed for users who need to configure custom GPG installations. + +![Advanced Tab](https://image.cdn.bktus.com/i/2024/11/29/ba283263-c9f5-9a6b-44a7-b0adf79684e8.webp) + +### Configuring Custom GnuPG + +1. **Enable Custom GnuPG** + + - Check the **Use Custom GnuPG** box to enable this feature. + +2. **Specify GPG Configuration Path** + + - Use the **Select GnuPG Path** button to locate and set the directory where + `gpgconf` resides. This is critical because GpgFrontend relies on the paths + provided by `gpgconf` to locate essential components like `gpg`, `gpgsm`, + and `gpg-agent`. + +3. **Verifying Custom Configuration** + + - After setting the path, you can test the configuration by running `gpgconf +--list-components` in a terminal. This command lists all available GPG + components and their paths, ensuring that GpgFrontend can access them + correctly. + + ![Test gpgconf](https://image.cdn.bktus.com/i/2024/11/29/a9b9eb46-f064-610f-892e-dfc71f1a45d4.webp) + + > **Note**: If `gpgconf` is not configured correctly, GpgFrontend may fail to + > locate and execute necessary GPG binaries. + +--- + +## Tips for Using GpgController Effectively + +1. **Choose File Formats Wisely** + + - Use **Binary Mode** for efficiency in local operations and **ASCII Mode** + for readability and compatibility in file sharing. + +2. **Install a Full-Featured Pinentry** + + - Avoid relying on GpgFrontend's built-in password dialog for critical + operations. Installing **Pinentry** ensures better compatibility and + security. diff --git a/src/content/docs/advanced/key-database.md b/src/content/docs/advanced/key-database.md new file mode 100644 index 0000000..44bb2ed --- /dev/null +++ b/src/content/docs/advanced/key-database.md @@ -0,0 +1,124 @@ +--- +title: Multi-Key Database Support +sidebar: + label: Multi-Key Database +--- + +GpgFrontend introduces **Multi-Key Database Support**, providing users with a +flexible and organized way to manage multiple key databases. This feature is +ideal for users who require separate cryptographic environments for different +projects, organizations, or levels of security. + +## Features and Benefits + +### Key Features + +1. **Multiple Key Databases**: Manage distinct key databases for specific + purposes or contexts. +2. **Flexible Switching**: Easily switch between databases for different + operations without affecting other configurations. +3. **Customizable Management**: Add, edit, reorder, or remove databases as + needed. + +### Benefits + +- **Improved Security**: Isolate sensitive keys in dedicated databases to + minimize exposure. +- **Enhanced Organization**: Maintain separate databases for better operational + clarity. +- **Streamlined Workflows**: Quickly switch between databases for various + projects or encryption tasks. + +## Accessing the Multi-Key Database Feature + +### Opening the GnuPG Controller + +To manage multiple key databases, follow these steps: + +1. **Access the Advanced Menu** + + - Click on the **Advanced** menu in the top navigation bar. + - Select **Open GnuPG Controller** from the dropdown options. + + ![Open GnuPG Controller](https://image.cdn.bktus.com/i/2024/11/29/abfaa919-2945-1acc-eb35-5c86828a97ca.webp) + +2. **Navigate to the Key Database Tab** + + - In the **GnuPG Controller** window, switch to the **Key Database** tab. + - Here, you will find a list of all configured key databases. + + ![Key Database Tab](https://image.cdn.bktus.com/i/2024/11/29/7a66848e-bc23-fd13-08a4-1923de39369e.webp) + +## Managing Key Databases + +The **Key Database** tab allows you to perform the following operations: + +### 1. Adding a New Key Database + +- Click the **Add New Key Database** button. +- Specify a name and path for the new database. This will create an isolated + environment for new keys. + +### 2. Editing and Reordering Key Databases + +- Right-click on a database entry to view options like: + - **Move Up/Move Down**: Reorder the database list. + - **Move to Top**: Prioritize a database by moving it to the top. + - **Edit**: Rename or modify the path of an existing database. + - **Remove**: Delete a database from the configuration. + +![Edit and Reorder Options](https://image.cdn.bktus.com/i/2024/11/29/0fd0d56b-532c-f0a8-c263-40d288cd74ba.webp) + +> **Note**: Any changes to the key database settings will require an application +> restart to take effect. + +### 3. Switching Between Databases + +- Use the **Key Toolbox** dropdown in the main interface to switch between + configured databases. +- Select the desired database, and the corresponding keys will be displayed. + +![Switch Databases](https://image.cdn.bktus.com/i/2024/11/29/dd783ee0-df5e-2b6f-428f-784c68246186.webp) + +## Use Cases for Multi-Key Databases + +1. **Project Isolation** + + - Maintain separate databases for different projects to avoid accidental + cross-use of keys. + +2. **Organizational Separation** + + - Keep departmental or team-specific keys isolated to ensure they are only + accessible to authorized personnel. + +3. **Enhanced Security for Sensitive Keys** + - Store high-security keys in a dedicated database, minimizing the risk of + exposure during routine operations. + +## Tips for Effective Multi-Key Database Usage + +1. **Name Databases Clearly** + + - Use descriptive names for each database to make it easier to identify their + purpose. + +2. **Regular Backups** + + - Backup each database regularly to prevent loss of critical keys. Store + backups in secure, encrypted locations. + +3. **Audit Database Usage** + + - Periodically review the contents and usage of each database to ensure + proper organization and security. + +4. **Isolate Sensitive Operations** + + - For highly sensitive keys, consider using a dedicated device or environment + to manage their database. + +5. **Avoid Overloading Databases** + + - Distribute keys evenly across multiple databases instead of overloading a + single one. This enhances performance and organization. diff --git a/src/content/docs/advanced/module-controller.md b/src/content/docs/advanced/module-controller.md new file mode 100644 index 0000000..7f5dfaa --- /dev/null +++ b/src/content/docs/advanced/module-controller.md @@ -0,0 +1,214 @@ +--- +title: "Module Controller: Extending GpgFrontend Functionality" +sidebar: + label: Module Controller +--- + +The **Module Controller** in **GpgFrontend** allows users to manage modular +extensions that enhance the core functionality of the application. These modules +provide features such as email integration, version checking, and key +synchronization, offering flexibility for different workflows. + +This guide provides an overview of the **Module Controller** interface, +instructions for managing modules, and guidance for advanced users interested in +developing custom modules. + +--- + +## Accessing the Module Controller + +To access the **Module Controller**: + +1. Open the **Advanced** menu in the top toolbar. +2. Select **Open Module Controller**. + + ![Open Module Controller](https://image.cdn.bktus.com/i/2024/11/29/fa515b3c-d9b1-70f5-c355-832b6bf07a38.webp) + +The **Module Controller** interface consists of the following tabs: + +- **Registered Modules** +- **Global Register Table** + +--- + +## Registered Modules Tab + +The **Registered Modules** tab displays all available modules and provides tools +for managing their activation, metadata, and storage. + +### Key Features + +1. **Module List** + + - The left panel lists all currently available modules. + - Modules prefixed with `*` are **Integrated Modules**, meaning they are + bundled with the GpgFrontend application. + +2. **Module Information** + + - When a module is selected, detailed metadata is displayed in the right + panel, including: + + - **ID**: The unique identifier of the module. + - **Version**: The current module version. + - **SDK Version**: The version of the SDK required by the module. + - **Path**: The physical location of the module file. + - **Activation Status**: Indicates whether the module is active or set to + auto-activate. + + Example: + + ``` + - ID: com.bktus.gpgfrontend.module.email + - Version: 1.0.0 + - SDK Version: 2.1.5 + - Path: /path/to/module/file + - Auto Activate: True + - Active: True + ``` + + ![Registered Modules](https://image.cdn.bktus.com/i/2024/11/29/b35d35f9-4ae2-0d3b-917d-a6fb815711f9.webp) + +3. **Module Actions** + + - **Deactivate**: Temporarily disables the selected module. + - **Disable Auto Activate**: Prevents the module from loading automatically + when GpgFrontend starts. + +4. **Show Mods Directory** + + - Opens the directory where external modules are stored. Users can manually + add or remove custom modules by placing or deleting files in this + directory. + + > **Tip for Integrated Modules**: + + - **Windows/Mac Users**: Integrated Modules (prefixed with `*`) can be + removed by deleting the corresponding `.dll` (Windows) or `.dylib` (Mac) + file from the `modules` directory. + - **Linux Users**: Due to the nature of **AppImage** and **Flatpak** + packages, removing Integrated Modules may require recompiling and + repackaging the application. + +## Global Register Table Tab + +The **Global Register Table** provides a detailed view of the internal data +structure used by GpgFrontend and its modules. This table is primarily useful +for developers and advanced users who want to debug or inspect module +interactions with the core application. + +### Key Features + +1. **Key-Value Data** + + - Displays the hierarchical structure of global variables, including: + - Module-specific settings (e.g., version checking, state tracking). + - GnuPG paths and environment configurations. + - Example: + ``` + gpgme: + ctx: + app_path: /opt/homebrew/Cellar/gnupg/2.4.5_1/bin/gpg + gnupg_version: 2.4.5 + gpgconf_path: /opt/homebrew/bin/gpgconf + ``` + +2. **Navigation** + + - Expand nodes to explore detailed properties for modules or core components. + + ![Global Register Table](https://image.cdn.bktus.com/i/2024/11/29/e4a74c1d-c81a-166f-abd8-4f3f4f92f4d0.webp) + +## Developing Custom Modules + +The **Module Controller** supports custom modules, allowing developers to extend +GpgFrontend's functionality for specialized use cases. All modules adhere to a +strict **C ABI (Application Binary Interface)** and are dynamically linked to +the `libgpgfrontend_sdk` library. + +### Key Points for Developers + +1. **C ABI Compliance** + + - Modules must be implemented using the C ABI to ensure compatibility across + all supported platforms (Windows, macOS, Linux). + +2. **Dynamic SDK Linking** + + - Modules interact with GpgFrontend by linking dynamically to the + **libgpgfrontend_sdk** library. This library provides the necessary + interfaces for module initialization, data exchange, and runtime + interaction. + +3. **SDK Limitations** + + - The current SDK API is still under development and may not cover all + potential use cases. Developers are encouraged to contact the project + maintainer for guidance or feature requests. + +4. **Getting Started** + - Place the compiled module file (`.dll`, `.dylib`, or `.so`) in the + `modules` directory. Use the **Show Mods Directory** button to locate this + directory. + +--- + +## Tips for Managing Modules + +1. **Backup Before Changes** + + - Always create a backup of the `modules` directory before making changes, + especially when adding or removing modules. + +2. **Regular Updates** + + - Check for updates to both GpgFrontend and its modules to ensure + compatibility and access to the latest features. + +3. **Safe Removal** + + - Follow the guidelines for deleting Integrated Modules based on your + platform to avoid accidental issues. + +4. **Use Global Register Table for Debugging** + - Advanced users can verify module configurations and GPG environment paths + through the **Global Register Table**. + +--- + +## Example Module: Version Checking + +The **VersionChecking** module is a bundled example of how GpgFrontend uses +modules to provide additional functionality. + +### Features: + +- Checks the current application version. +- Displays release notes for new updates. +- Notifies users when an upgrade is available. + +### Example Metadata: + +``` +- ID: com.bktus.gpgfrontend.module.version_checking +- Version: 1.0.0 +- Auto Activate: True +``` + +### Global Register Table: + +``` +com.bktus.gpgfrontend.module.version_checking: + current_version: v2.1.5 + need_upgrade: false + latest_version: v2.1.5 +``` + +--- + +By leveraging the **Module Controller**, users can customize and extend +GpgFrontend to suit their needs. Developers interested in creating new modules +are encouraged to experiment with the SDK and collaborate with the maintainer +for additional API support. For more details, visit the [GpgFrontend Modules +GitHub +Repository](https://github.com/saturneric/GpgFrontend-Modules/blob/main/README.md). diff --git a/src/content/docs/appendix/code-binary-verify.md b/src/content/docs/appendix/code-binary-verify.md index 3782dfc..643e835 100644 --- a/src/content/docs/appendix/code-binary-verify.md +++ b/src/content/docs/appendix/code-binary-verify.md @@ -63,7 +63,7 @@ be used to verify the authenticity of our releases: #### Key Fingerprint ``` -E3379489C39B7270E70E2E303AAF1C64137CEE57 +12F7E8858CF15BEC9975FF3C5CA3DA246843FD03 ``` #### Public Key (OpenPGP) @@ -71,86 +71,13 @@ E3379489C39B7270E70E2E303AAF1C64137CEE57 ``` -----BEGIN PGP PUBLIC KEY BLOCK----- -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 -hHHFn9+/wu20 -=bgvm +mDMEZsEF1xYJKwYBBAHaRw8BAQdAPZ3dA2od9HFaiaJRr1TEEeRMfAcrBp8oqQPa +R16Icva0OHNhdHVybmVyaWMoZm9yIGNvZGUgb3IgYmluYXJ5IHNpZ24gb25seSk8 +ZXJpY0Bia3R1cy5jb20+iJkEExYKAEEWIQQS9+iFjPFb7Jl1/zxco9okaEP9AwUC +ZsEF1wIbIwUJA8JmbgULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRBco9ok +aEP9A3TTAQC/H61IVj6LiSQ0dvodo5VFb2jTJa8XVfb2NT3yc/+JDwD+KTm+nV73 +dbaEG0FOTKu+n4rVhBpTes93Bn2GcRSbQwA= +=fWZe -----END PGP PUBLIC KEY BLOCK----- ``` diff --git a/src/content/docs/appendix/system-requirement.md b/src/content/docs/appendix/system-requirement.md index 1f3ac0e..7afb0df 100644 --- a/src/content/docs/appendix/system-requirement.md +++ b/src/content/docs/appendix/system-requirement.md @@ -51,13 +51,14 @@ dependencies: This variant ensures compatibility with earlier Windows environments, extending the tool's accessibility and usability. -- **GnuPG 2.2.0 or Higher:** GpgFrontend integrates with GnuPG for its +- **GnuPG 2.1.0 or Higher:** GpgFrontend integrates with GnuPG for its cryptographic operations, including encryption, decryption, and digital - signing. GnuPG (version 2.2.0 or newer) is a necessary component to leverage - the full capabilities of GpgFrontend. Please note, GnuPG 1.x versions are not - supported by GpgFrontend due to differences in functionality and support. - Users are encouraged to use GnuPG 2.x to ensure compatibility and secure - operations. + signing. While GpgFrontend supports GnuPG version 2.1.0 or newer, some + features may not be fully functional with versions below 2.4.0. For the best + compatibility and to ensure access to all features, it is strongly recommended + to use GnuPG 2.4.0 or higher. Please note that GnuPG 1.x versions are not + supported due to significant differences in functionality and lack of modern + security updates. By catering to a wide range of operating systems and ensuring backward compatibility with older Windows versions through Qt5 support, GpgFrontend diff --git a/src/content/docs/extra/algorithms-comparison.md b/src/content/docs/extra/algorithms-comparison.md index 9c8a478..9a52ccb 100644 --- a/src/content/docs/extra/algorithms-comparison.md +++ b/src/content/docs/extra/algorithms-comparison.md @@ -6,7 +6,8 @@ sidebar: When choosing cryptographic algorithms for key management and data security, it's important to understand the differences and use cases for RSA, DSA, ECDSA, -and ECDH. Here’s a detailed comparison to help you make an informed decision: +EdDSA, and ECDH. Here’s a detailed comparison to help you make an informed +decision. ## RSA (Rivest-Shamir-Adleman) @@ -23,20 +24,6 @@ and ECDH. Here’s a detailed comparison to help you make an informed decision: - **Security**: Provides strong security, but larger key sizes are required as computational power increases. -## DSA (Digital Signature Algorithm) - -- **Key Characteristics**: DSA, introduced by NIST in 1991, is primarily used - for digital signatures and is not suitable for encryption. -- **Key Sizes**: Typically uses 1024 to 3072-bit keys, with a recommended - minimum of 2048 bits for new deployments. -- **Use Cases**: Mainly used for digital signatures in various security - protocols. It is less common than RSA and ECDSA. -- **Performance**: Faster at generating keys compared to RSA but slower in - verification. Requires a secure random number for each signature, which if - compromised, can lead to vulnerabilities. -- **Security**: Suitable for digital signatures, but less versatile and not as - widely supported as RSA and ECDSA. - ## ElGamal Encryption (ELG-E) - **Key Characteristics**: ElGamal encryption (ELG-E) is an asymmetric key @@ -84,52 +71,136 @@ used in two main algorithms: ECDH and ECDSA. ### Common ECC Algorithms and Their Use Cases -- **NIST Curves (P-256, P-384, P-521)**: These curves, standardized by the - National Institute of Standards and Technology (NIST), are widely used in - secure communication protocols. For example, **ECDH NIST P-256** provides - approximately 128-bit security, making it suitable for most encryption needs, - while **ECDSA NIST P-256** is often used for digital signatures. As the key - size increases (e.g., P-384, P-521), so does the security level, with P-521 - offering approximately 256-bit security, ideal for applications requiring the - highest level of protection. +Elliptic Curve Cryptography (ECC) offers a range of algorithms and curves +tailored to different cryptographic needs. Below is an overview of commonly used +ECC algorithms and their specific applications. -- **ED25519 and ED448**: **ED25519** is favored for its speed and security, - providing 128-bit security and commonly used in modern applications like - secure messaging (e.g., Signal) and blockchain technologies. **ECDSA ED25519** - is excellent for generating fast and secure digital signatures. **ED448**, on - the other hand, offers higher security (224-bit) and is suitable for - environments that require even stronger protection, although at a slight - performance cost. +- **NIST Curves (P-256, P-384, P-521)**: Standardized by the National Institute + of Standards and Technology (NIST), these curves are widely utilized in secure + communication protocols. For example: -- **BrainPool Curves (P-256, P-384, P-512)**: These curves are alternatives to - the NIST standards, offering similar security levels but with different - parameters. **ECDH BrainPool P-256** and **ECDSA BrainPool P-256** are used - when there is a preference for non-NIST curves, especially in regions or - industries where alternative cryptographic standards are required. The - BrainPool curves maintain the balance between security and performance across - different key sizes. + - **ECDH NIST P-256**: Provides approximately 128-bit security, making it + suitable for most encryption scenarios. + - **ECDSA NIST P-256**: Commonly employed for digital signatures, offering + robust security for authentication purposes. + - **Higher Key Sizes**: P-384 and P-521 increase security levels + proportionally, with P-521 offering around 256-bit security, making it ideal + for high-security environments. -- **CV25519 and X448**: **ECDH CV25519** is a counterpart to ED25519 but is used - specifically for key exchange. It provides approximately 128-bit security and - is widely used for its efficiency in secure communications. **ECDH X448** is - the higher-security variant (224-bit security) and is appropriate for - scenarios demanding more robust encryption, albeit with higher computational - costs. +- **BrainPool Curves (P-256, P-384, P-512)**: BrainPool curves serve as + alternatives to NIST standards, providing similar security levels but with + independently developed parameters. -## Algorithm Flexibility in Primary Keys and Subkeys + - **Use Cases**: Often used in regions or industries that prefer non-NIST + curves for compliance or operational reasons. + - **Examples**: **ECDH BrainPool P-256** and **ECDSA BrainPool P-256** offer a + balance between security and performance, catering to scenarios where NIST + standards are not desired. -Primary keys are typically limited to RSA, DSA, and ECDSA due to their critical -role in establishing trust and signing other keys. These algorithms are -well-established and extensively audited, providing robust security for identity -verification. +- **CV25519 and X448**: These curves are optimized for performance and are + widely used in modern cryptographic applications. -Subkeys, however, are often used for specific operational tasks such as -encryption and authentication. This allows them to utilize a broader range of -algorithms like ECDH, which is optimized for key exchange. The flexibility in -choosing algorithms for subkeys enhances their efficiency and allows -cryptographic operations to be tailored to specific use cases, providing both -performance and security benefits. + - **ECDH CV25519**: A counterpart to ED25519, this curve is designed for key + exchange and offers approximately 128-bit security. It is highly efficient + in secure communications. + - **ECDH X448**: A higher-security variant providing 224-bit security, + suitable for applications requiring more robust encryption. However, it + comes with a slight trade-off in computational efficiency. -By understanding the strengths and appropriate use cases for each algorithm, you -can choose the best cryptographic solution for your needs, ensuring both -security and efficiency in your operations. +- **SECP256K1**: Defined by the Standards for Efficient Cryptography Group + (SECG), SECP256K1 is distinct from NIST curves and has gained significant + traction due to its adoption in blockchain technologies. + - **Key Use Case**: Widely used for cryptographic operations in Bitcoin and + other blockchain systems, where efficient signature verification is crucial. + - **Performance**: Optimized for computational efficiency, making it an + excellent choice for environments requiring rapid cryptographic operations. + +## EdDSA (Edwards-Curve Digital Signature Algorithm) + +### **Overview** + +EdDSA is a modern digital signature algorithm based on elliptic curve +cryptography. It is specifically designed to be more efficient, secure, and +resistant to common implementation errors compared to older algorithms like DSA +or ECDSA. + +### **Key Characteristics** + +- **Deterministic Signature Generation**: Unlike ECDSA and DSA, which require + secure random numbers for each signature, EdDSA uses deterministic methods, + reducing the risk of vulnerabilities caused by poor randomness. +- **Elliptic Curves Used**: EdDSA supports two primary curves: + - **Ed25519**: Provides 128-bit security and is optimized for speed and + compact key sizes. + - **Ed448**: Provides higher 224-bit security for environments requiring + greater protection but at the cost of performance. + +### **Use Cases** + +- **Ed25519**: Ideal for secure messaging (e.g., Signal), blockchain, and other + modern cryptographic protocols where performance and efficiency are critical. +- **Ed448**: Used in environments requiring stronger security, such as highly + sensitive communications or systems with long-term security needs. + +### **Performance** + +EdDSA is faster than RSA and ECDSA for both signing and verification. Its +compact key sizes make it ideal for resource-constrained devices or systems. + +### **Compatibility** + +While Ed25519 has gained significant adoption in modern cryptographic libraries, +it is not yet universally supported in older systems or clients. Ed448 has even +more limited support. + +## Why ECDH Cannot Be Used as a Primary Key Algorithm + +### Key Difference Between ECDH and ECDSA/EdDSA + +- **ECDH (Elliptic Curve Diffie-Hellman)** is a key exchange algorithm used to + establish shared secrets between two parties. It is not designed for signing + or verification, which are essential for primary key functionalities. +- **ECDSA (Elliptic Curve Digital Signature Algorithm)** and **EdDSA** are + signature algorithms, specifically designed for identity verification and + creating/verifying digital signatures, making them suitable for primary keys. + +### Primary Key Requirements + +Primary keys are used to: + +1. **Sign Other Keys**: Establish trust relationships by signing subordinate + keys. +2. **Verify Identities**: Sign and verify data, proving ownership of the key. + +Since ECDH does not provide signature functionality, it cannot be used for these +purposes. Instead, it is commonly used for subkeys dedicated to encryption or +key exchange tasks. + +## Recommended Algorithms for Compatibility and Security + +### **1. RSA (2048-bit or 3072-bit)** + +- **Why**: RSA offers the broadest compatibility across legacy systems, + libraries, and cryptographic protocols. +- **When to Use**: Choose RSA when you need to ensure interoperability with + older clients or systems that may not support newer elliptic curve algorithms. + +### **2. Curve25519** + +- **Why**: Curve25519 is highly efficient, secure, and compact, making it a great + choice for modern cryptographic applications. +- **When to Use**: Use Curve25519 in environments where compatibility with + modern systems is sufficient, and you want to benefit from its speed and + smaller key sizes. + +### Combining RSA and Curve25519 + +For the best balance between compatibility and performance, consider using RSA +for the **primary key** (for identity verification and signing other keys) and +Curve25519 for **subkeys** (used for signing, encryption, or authentication). +This approach ensures: + +- **Maximum Compatibility**: RSA as the primary key ensures interoperability + with older systems. +- **Modern Efficiency**: Curve25519 as subkeys provides better performance for + modern operations. diff --git a/src/content/docs/guides/email.md b/src/content/docs/guides/email.md new file mode 100644 index 0000000..b632157 --- /dev/null +++ b/src/content/docs/guides/email.md @@ -0,0 +1,182 @@ +--- +title: Email Functionality +sidebar: + label: Email Operations +--- + +GpgFrontend offers a powerful and user-friendly solution for email encryption +and signing, tailored for security-conscious users. By processing emails offline +in a widely supported `.eml` format, it eliminates the need for complex +protocols while maintaining robust OpenPGP compliance. Whether you're signing, +encrypting, verifying, or decrypting emails, GpgFrontend ensures a secure and +streamlined experience. + +## **Purpose and Key Advantages** + +GpgFrontend's email processing functionality is designed to empower users to +handle PGP-signed and encrypted emails in situations where their email clients +or web-based email services lack native PGP support. The core advantages +include: + +- **Offline Verification and Decryption**: Users can securely process emails + locally without uploading their private keys to email providers. This + significantly enhances privacy and security. +- **EML Format Handling**: By leveraging the widely supported `.eml` format, + GpgFrontend avoids introducing complex protocols like IMAP or SMTP, + maintaining simplicity while offering full OpenPGP compliance. +- **Security-Focused**: For security-conscious users, GpgFrontend provides an + offline, local-first solution that minimizes exposure to online threats and + untrusted environments. + +## **Features Overview** + +### **1. OpenPGP Standards Compliance** + +GpgFrontend adheres to OpenPGP standards (RFC 4880 and 3156) for email +encryption and signing, ensuring compatibility with tools like Thunderbird and +other OpenPGP-enabled clients. + +- Emails processed in GpgFrontend can be easily verified and decrypted by + compliant email clients. +- Supports separate and combined operations, such as: + - **Sign Only**: Digitally sign the email to ensure authenticity. + - **Encrypt Only**: Encrypt the email to protect its content. + - **Sign and Encrypt Together**: Combine both operations for comprehensive + security. + - **Decrypt and Verify Together or Separately**: Flexibly handle incoming + messages. + +### **2. Creating and Processing Emails** + +#### **Creating and Signing Emails** + +1. Open GpgFrontend and click **"New E-Mail"** to create a blank email. + +![Open Email Tab](https://image.cdn.bktus.com/i/2024/11/29/19674701-548b-db30-3d19-473422618fc3.webp) + +2. Type your email content in the editor. +3. Select your private key from the **Key Toolbox**. +4. Click **"Sign"** to digitally sign the email. + - Signed emails include a PGP signature block, visible in the content. + +![Sign Email](https://image.cdn.bktus.com/i/2024/11/29/fc733201-8a5e-b2c9-8043-c17e09b5367b.webp) + +#### **Encrypting Emails** + +1. Select the recipient's public key in the **Key Toolbox**. +2. Click **"Encrypt"** to secure the email content. + - The content will be transformed into a PGP-encrypted format. + +![Encrypt Email](https://image.cdn.bktus.com/i/2024/11/29/92427d5d-937b-2285-97a5-48d7c6edf9a2.webp) + +#### **Saving Emails for Sending** + +1. Processed emails can be saved as `.eml` files using **File > Save As**. +2. Upload the `.eml` file to your email client's drafts folder or webmail + interface, then send the email. + +### **3. Receiving and Processing Emails** + +#### **Decrypting and Verifying Emails** + +1. Export the email source as an `.eml` file from your email client or copy the + raw email source. +2. Open the `.eml` file in GpgFrontend. +3. Use: + - **"Decrypt Verify"**: Decrypt and verify the email simultaneously. + - **"Verify"**: Validate the signature without decrypting. + - **"Decrypt"**: Decrypt without verifying. + +![Verify Email](https://image.cdn.bktus.com/i/2024/11/29/1147e7e4-5fc0-26e7-04a3-e1c71e17f550.webp) + +#### **Offline Validation** + +- GpgFrontend processes all email verification and decryption offline, ensuring + that no sensitive data is exposed to external servers. +- Users retain full control of their private keys, which remain stored locally. + +### **4. Why Use EML Format?** + +#### **Benefits of EML** + +- `.eml` is a widely supported format across email clients like Thunderbird, + Outlook, and webmail platforms. +- Unlike proprietary email handling protocols, `.eml` allows for seamless + export, import, and offline processing. + +#### **Why Not Use IMAP/SMTP?** + +- Avoids the complexity and potential vulnerabilities introduced by integrating + full-fledged email protocols. +- Keeps the application lightweight and focused on local cryptographic + operations. + +#### **Addressing PGP Limitations in Clients** + +- Many email clients lack robust PGP support or offer inconsistent + implementations. +- GpgFrontend provides a reliable and flexible solution for users needing + advanced PGP functionality. + +## **Key Use Cases** + +### **1. Sending Emails** + +1. Process the email in GpgFrontend (e.g., sign, encrypt, or both). +2. Save the processed email as an `.eml` file. +3. Import the `.eml` file into your email client or webmail interface, then send + it. + +### **2. Receiving Emails** + +1. Export the email source as `.eml` from your email client. +2. Open it in GpgFrontend to decrypt or verify. +3. For example: + - A signed email will display a **"Good Digital Signature"** message. + - An encrypted email will be decrypted and displayed in plaintext. + +## **Advanced Features** + +### **1. Combined Operations** + +- GpgFrontend supports simultaneous encryption and signing of outgoing emails. +- Incoming emails can also be decrypted and verified in a single operation for + convenience. + +### **2. Flexible Processing** + +- Choose separate or combined workflows for signing, encrypting, verifying, or + decrypting based on your needs. +- This flexibility makes GpgFrontend a versatile tool for various email + scenarios. + +### **3. Offline-First Design** + +- All cryptographic operations are performed locally, ensuring that private keys + and sensitive data are never exposed to external servers. + +## **Best Practices for Secure Email Handling** + +1. **Use Trusted Keys**: + + - Regularly validate public keys to prevent misuse. + - Import keys only from trusted sources. + +2. **Keep Private Keys Offline**: + + - Avoid uploading private keys to email providers. + - Store private keys securely, preferably on encrypted storage. + +3. **Leverage GpgFrontend's Local Processing**: + + - Ensure all encryption, signing, and verification tasks are performed + offline for maximum security. + +4. **Save Emails in EML Format**: + + - Use `.eml` files for cross-platform compatibility and simple integration + with various email clients. + +5. **Check Email Compatibility**: + - Ensure recipients can handle PGP-encrypted emails or provide instructions + for using tools like GpgFrontend or Thunderbird. diff --git a/src/content/docs/guides/generate-key.md b/src/content/docs/guides/generate-key.md index 9202d80..354b54c 100644 --- a/src/content/docs/guides/generate-key.md +++ b/src/content/docs/guides/generate-key.md @@ -1,5 +1,5 @@ --- -title: Generate Key Pair & Subkey +title: Generate Key Pair sidebar: order: 3 --- @@ -65,188 +65,16 @@ signing, and authentication. Follow the steps below to create your own keys. By following these steps, you can generate a secure key pair using GpgFrontend, tailored to your specific needs for encryption, signing, and authentication. -## Steps to Generate a Subkey - -![Generate A Subkey](https://image.cdn.bktus.com/i/2024/06/15/a56c83bc-72ad-6232-1764-6fef5aeceddd.webp) - -1. **Open Key Management**: - - - In the Key Management interface, right-click on the key pair you wish to - add a subkey to. Select the "New Subkey" option from the context menu. - -2. **Fill in Basic Information**: - - - **Key Type**: Select the type of subkey you want to generate. Available - options include RSA, DSA, ECDSA, ECDH, ECDH NIST P-256, ECDH NIST P-384, - ECDH NIST P-521, ECDH BrainPool P-256, ECDH BrainPool P-384, and ECDH - BrainPool P-512. - - **Key Size**: Choose the key size. This option is only applicable when the - key type is RSA or DSA. - - **Expiration Date**: Set an expiration date for the subkey. You can also - choose to check the "Never expire" checkbox to make the subkey permanent. - -3. **Set a Passphrase**: - - - If the primary key has a passphrase, the subkey's passphrase must be equal - to it. Ensure that the "Non Pass Phrase" checkbox is unchecked if you want - to set a passphrase. - -4. **Select Key Usage**: - - - Specify the usage for the subkey. Options include: - - **Encryption**: For encrypting data. - - **Signing**: For creating digital signatures. - - **Authentication**: For authentication purposes, such as SSH keys. - - Note that the certification usage is not available for subkeys. - -5. **Generate the Subkey**: - - After filling in all the necessary information and selecting the desired - options, click the "OK" button to generate your subkey. - -By following these steps, you can generate a subkey using GpgFrontend, which -enhances the functionality of your primary key pair for various cryptographic -operations. - -## Extra Note - -Below are some guidelines that may prove useful in comprehending the -aforementioned concepts and utilizing this tool accurately. - -#### Understanding Primary Keys and Subkeys - -In the realm of cryptography, key management plays a crucial role in ensuring -data security. A key pair consists of a primary key and one or more subkeys, -each serving distinct functions yet working together to secure and manage -digital identities and communications. This structure not only enhances security -but also provides flexibility in key usage and management. - -#### The Role of Primary Key and Subkeys - -- **Primary Key**: The primary key is the cornerstone of your cryptographic - identity. It is used for identity verification, which includes signing other - keys to establish trust. The primary key's signature on a subkey validates the - subkey's association with the identity of the primary key holder. - -- **Subkeys**: Subkeys are associated with the primary key and are used for - encryption and signing documents or messages. Subkeys can be thought of as - extensions of the primary key, each designated for specific tasks. This - separation of duties allows for greater security and operational flexibility. - For example, you can have separate subkeys for signing and encryption. - -#### Advantages of Using Subkeys - -1. **Enhanced Security**: By using subkeys for day-to-day operations, you - minimize the risk associated with key exposure. If a subkey is compromised, - it can be revoked without affecting the primary key or other subkeys, thereby - limiting the potential damage. - -2. **Operational Flexibility**: Subkeys allow for specific roles (e.g., signing, - encryption) to be isolated. This means you can renew or revoke subkeys as - needed without disrupting the overall cryptographic setup. - -3. **Convenient Key Rotation**: Regularly updating keys is a best practice in - cryptography. Subkeys make it easier to rotate keys for signing and - encryption without needing to re-establish the primary key's trust - relationships. - -#### Managing Primary Keys and Subkeys - -- **Secure Storage**: The primary key should be stored in a highly secure - location, preferably offline or in a hardware security module (HSM), to - prevent unauthorized access. The loss or compromise of the primary key - jeopardizes the entire cryptographic framework. - -- **Key Generation and Maintenance**: While tools like GpgFrontend provide - user-friendly interfaces for managing keys, they may lack support for advanced - operations like generating multiple subkeys. Therefore, using the command-line - `gpg` tool for such tasks is advisable. Despite this limitation, GpgFrontend - can play a critical role in monitoring the presence of the primary key, which - is essential for certain operations like adding subkeys or signing other keys. - -- **Revocation and Renewal**: Prepare revocation certificates for your primary - key and subkeys in advance. In case of key compromise or expiration, these - certificates allow you to invalidate the keys, informing others in your trust - network not to use them anymore. - -#### Practical Tips for Effective Key Management - -- **Purpose-Specific Subkeys**: If your primary key was not generated with - certain capabilities (e.g., encryption), you can create a subkey with the - required functionality. This allows the key pair to be used for the intended - cryptographic operations without regenerating the primary key. - -- **Multiple Subkeys for Different Devices**: For users operating across - multiple devices, generating separate subkeys for each device can enhance - security. If one device is compromised, only the subkey on that device needs - to be revoked, leaving the others unaffected. - -- **Backup and Recovery**: Regularly back up your key pair, including the - primary key and all subkeys. Secure backups ensure that you can recover your - cryptographic capabilities even in the event of hardware failure or data loss. - -In summary, understanding and implementing a robust key management strategy, -with a clear distinction between primary keys and subkeys, is essential for -maintaining the integrity and security of cryptographic operations. By adhering -to best practices for key usage, storage, and renewal, users can safeguard their -digital identities and ensure the confidentiality and authenticity of their -communications. - -#### Additional Note on Subkey Algorithm Types - -Subkeys in GpgFrontend offer more algorithm types than primary keys due to their -specialized roles. While primary keys focus on establishing identity and trust, -subkeys are often dedicated to specific tasks like encryption or authentication. -This task-specific design allows subkeys to utilize a broader range of -algorithms, enhancing their flexibility and functionality. For instance, while -primary keys may be restricted to certain secure algorithms for signing, subkeys -can employ diverse algorithms optimized for encryption, like ECDH, ensuring -efficient and secure operations tailored to the user's needs. - -For more Details: [Comparison of Cryptographic Algorithms](/extra/algorithms-comparison) - -**Primary Key Supported Algorithms:** +## Primary Key Supported Algorithms - RSA - DSA - ECDSA ED25519 +- EdDSA ED448 (GnuPG >2.3.0) +- ECDSA SECP256K1 (GnuPG >2.3.0) - ECDSA NIST P-256 - ECDSA NIST P-384 - ECDSA NIST P-521 - ECDSA BrainPool P-256 (GnuPG >2.3.0) - ECDSA BrainPool P-384 (GnuPG >2.3.0) - ECDSA BrainPool P-512 (GnuPG >2.3.0) - -**Subkey Supported Algorithms:** - -- RSA -- DSA -- ELG-E -- ECDSA ED25519 -- ECDSA ED448 (GnuPG >2.3.0) -- ECDH CV25519 -- ECDH X448 (GnuPG >2.3.0) -- ECDH NIST P-256 -- ECDH NIST P-384 -- ECDH NIST P-521 -- ECDH BrainPool P-256 (GnuPG >2.3.0) -- ECDH BrainPool P-384 (GnuPG >2.3.0) -- ECDH BrainPool P-512 (GnuPG >2.3.0) - -**Explanation:** - -The broader range of algorithms available for subkeys arises because subkeys are -designed for specific functions and can therefore leverage specialized -algorithms optimized for those functions. For example, ECDH (Elliptic Curve -Diffie-Hellman) is highly efficient for encryption tasks and is commonly used -for subkeys dedicated to encryption. This flexibility in algorithm choice -ensures that cryptographic operations can be optimized for both performance and -security based on the specific use case. - -Primary keys, however, are central to the user's cryptographic identity and are -primarily used for signing and certifying subkeys. This critical role -necessitates the use of well-established and highly secure algorithms to ensure -the integrity and trustworthiness of the entire cryptographic system. - -By differentiating the algorithms and roles of primary keys and subkeys, -GpgFrontend enhances both security and operational efficiency, allowing users to -maintain a robust and flexible cryptographic setup​. diff --git a/src/content/docs/guides/generate-use-subkey.md b/src/content/docs/guides/generate-use-subkey.md new file mode 100644 index 0000000..122bb9b --- /dev/null +++ b/src/content/docs/guides/generate-use-subkey.md @@ -0,0 +1,260 @@ +--- +title: Generate and Use Subkey +sidebar: + order: 3 +--- + +GpgFrontend provides comprehensive support for subkeys, allowing users to +enhance security and flexibility through proper key management. + +## Steps to Generate a Subkey + +![Generate A Subkey](https://image.cdn.bktus.com/i/2024/06/15/a56c83bc-72ad-6232-1764-6fef5aeceddd.webp) + +1. **Open Key Management**: + + - In the Key Management interface, right-click on the key pair you wish to + add a subkey to. Select the "New Subkey" option from the context menu. + +2. **Fill in Basic Information**: + + - **Key Type**: Select the type of subkey you want to generate. Available + options include RSA, DSA, ECDSA, ECDH, ECDH NIST P-256, ECDH NIST P-384, + ECDH NIST P-521, ECDH BrainPool P-256, ECDH BrainPool P-384, and ECDH + BrainPool P-512. + - **Key Size**: Choose the key size. This option is only applicable when the + key type is RSA or DSA. + - **Expiration Date**: Set an expiration date for the subkey. You can also + choose to check the "Never expire" checkbox to make the subkey permanent. + +3. **Set a Passphrase**: + + - If the primary key has a passphrase, the subkey's passphrase must be equal + to it. Ensure that the "Non Pass Phrase" checkbox is unchecked if you want + to set a passphrase. + +4. **Select Key Usage**: + + - Specify the usage for the subkey. Options include: + - **Encryption**: For encrypting data. + - **Signing**: For creating digital signatures. + - **Authentication**: For authentication purposes, such as SSH keys. + - Note that the certification usage is not available for subkeys. + +5. **Generate the Subkey**: + - After filling in all the necessary information and selecting the desired + options, click the "OK" button to generate your subkey. + +By following these steps, you can generate a subkey using GpgFrontend, which +enhances the functionality of your primary key pair for various cryptographic +operations. + +## Understanding Primary Keys and Subkeys + +In the realm of cryptography, key management plays a crucial role in ensuring +data security. A key pair consists of a primary key and one or more subkeys, +each serving distinct functions yet working together to secure and manage +digital identities and communications. This structure not only enhances security +but also provides flexibility in key usage and management. + +### The Role of Primary Key and Subkeys + +- **Primary Key**: The primary key is the cornerstone of your cryptographic + identity. It is used for identity verification, which includes signing other + keys to establish trust. The primary key's signature on a subkey validates the + subkey's association with the identity of the primary key holder. + +- **Subkeys**: Subkeys are associated with the primary key and are used for + encryption and signing documents or messages. Subkeys can be thought of as + extensions of the primary key, each designated for specific tasks. This + separation of duties allows for greater security and operational flexibility. + For example, you can have separate subkeys for signing and encryption. + +### Advantages of Using Subkeys + +1. **Enhanced Security**: By using subkeys for day-to-day operations, you + minimize the risk associated with key exposure. If a subkey is compromised, + it can be revoked without affecting the primary key or other subkeys, thereby + limiting the potential damage. + +2. **Operational Flexibility**: Subkeys allow for specific roles (e.g., signing, + encryption) to be isolated. This means you can renew or revoke subkeys as + needed without disrupting the overall cryptographic setup. + +3. **Convenient Key Rotation**: Regularly updating keys is a best practice in + cryptography. Subkeys make it easier to rotate keys for signing and + encryption without needing to re-establish the primary key's trust + relationships. + +## Best Practices for Using Subkeys + +After understanding the concepts discussed above, you might be wondering how +exactly you can effectively use subkeys to maximize their advantages. In +principle, the main goal is to separate the subkey from the primary key to +leverage better security. If your subkeys are always kept together with the +primary key, you will always need to use the complete set of keys, increasing +the risk of compromising the primary key. GpgFrontend supports the export of +individual subkeys, as well as the configuration of multiple key databases. +Using these features together, you can easily isolate a particular subkey, +export it, and import it into another key database. This allows you to secure +the primary key separately, even removing it from the original key database to +reduce exposure. For high-security environments, it is recommended that: + +> "The primary key should be stored in a highly secure location, preferably +> offline or in a hardware security module (HSM), to prevent unauthorized +> access. The loss or compromise of the primary key jeopardizes the entire +> cryptographic framework." + +### Step-by-Step Guide to Exporting Subkeys + +To demonstrate how to export an individual subkey, let's refer to the screenshot +provided. Below is a step-by-step guide to navigate the GpgFrontend interface +and successfully export a subkey: + +1. **Open Key Details View**: Open the GpgFrontend application and navigate to + the key database section. Select the desired key from the list to open the + **Key Details** view. + +2. **Access the Keychain Tab**: Click on the **Keychain** tab within the Key + Details window. Here, you will be able to see a list of all keys associated + with your selected primary key. The list includes the primary key itself, + which is displayed in the first row, as well as any subkeys. + +3. **Select a Subkey**: Locate and click on the subkey you wish to export. Once + selected, details about the subkey will appear in the lower half of the + window, providing information such as **Key ID**, **Algorithm**, **Key + Size**, and **Usage**. + +4. **Export the Subkey**: On the right side of the key details section, there is + an **Export Subkey** button, highlighted in the screenshot. Click this button + to start the export process. + +5. **Save the Subkey File**: A file dialog will appear, prompting you to specify + a location to save the exported subkey. Choose a secure directory and save + the subkey as a separate file. + +![Export Subkey](https://image.cdn.bktus.com/i/2024/11/29/15c9ab0c-a05e-0117-3244-2ac01aaed9a9.webp) + +### Step-by-Step Guide to Importing Subkeys + +To demonstrate how to import an individual subkey that has been previously +exported, let's refer to the screenshots provided. Below is a step-by-step guide +to navigate the GpgFrontend interface and successfully import a subkey: + +1. **Select the Key Database**: Choose the appropriate key database from the **Key Toolbox**. + +![Switch Key Database](https://image.cdn.bktus.com/i/2024/11/29/0e8ff19e-4189-65db-5732-1a2e79d9b8a6.webp) + +1. **Import the Subkey**: Click on the **Import Key** button in the top toolbar, + and select **File** from the dropdown menu. This action will open a dialog + where you can browse your system to locate the previously exported subkey + file. + + ![Import the Subkey](https://image.cdn.bktus.com/i/2024/11/29/8f3456ba-6275-4ef9-8e41-49b9b6bc0dfa.webp) + +2. **Select Subkey File**: Browse to the location where the subkey file is + saved, select it, and click **Open**. This will import the subkey into the + selected key database. + +3. **Verify Imported Subkey**: After importing the subkey, locate it in the + **Key Toolbox** list. Click on the subkey to open its **Key Details** view. + You should see all relevant information about the subkey, including **Key + ID**, **Algorithm**, **Key Size**, and **Usage**. + +4. **Handling Primary Key**:You can now move your master key to a safe place. Then delete it at + GpgFrontend. + + ![Verify Imported Subkey](https://image.cdn.bktus.com/i/2024/11/29/ac01142d-1ffa-ba32-daac-36ddf0729ff1.webp) + +### Confirming Primary Key Absence + +In the **Key Toolbox**, you may notice that some keys have a `#` symbol next to +their **Type** (e.g., **pub/sec#**). This symbol indicates that the primary key +for this subkey does not exist in the current key database. This is expected if +you have securely removed the primary key to minimize exposure, while retaining +the subkeys for ongoing operations. + +![Meaning of'#' Symbol](https://image.cdn.bktus.com/i/2024/11/29/78d9bc07-8b96-302b-25d1-cbb88815f16a.webp) + +You can confirm the absence of the primary key by opening the **Key Details** +view of the imported subkey. In the **Primary Key Existence** section, it should +indicate **Not Exists**. This ensures that the primary key is not present, which +enhances the overall security of your cryptographic setup. + +## Key Functionality Without a Primary Key + +When a primary key is absent from the key database, certain limitations apply. +You can confirm the absence of the primary key by checking the **Primary Key +Existence** section in the Key Details view, which will display **Not Exists**. +This setup is intentional in many cases to improve security by isolating the +primary key. + +![Primary Key Not Exists](https://image.cdn.bktus.com/i/2024/11/29/05594a4b-cdad-7ad4-070b-58e24701cce3.webp) + +### Actions Limited by the Absence of a Primary Key: + +1. **Creating New Subkeys**: The absence of the primary key prevents the + generation of additional subkeys. +2. **Adding UID**: You cannot attach new User IDs (UIDs) to the keyset without + the primary key. +3. **Key Certification**: Signing other keys to certify them as trusted is only + possible with a primary key. +4. **Key Revocation**: Generating a revocation certificate for the subkey or + primary key is impossible without the primary key. + +### Practical Example: Subkey-Only Use Case + +In scenarios where only the subkey remains, as depicted in the screenshot: + +- The subkey can be actively used for encryption purposes (e.g., encrypting + emails or files). +- Since no subkey capable of signing exists, you cannot digitally sign data. To + address this, it is advisable to generate a signing-capable subkey during the + initial key creation process. + +This setup is particularly beneficial for environments where the exposure of the +primary key poses a security risk. By isolating the primary key and relying +solely on subkeys, you can maintain a balance between functionality and +security. + +![Use Subkey to Encrypt](https://image.cdn.bktus.com/i/2024/11/29/20047766-48ab-f4a3-175c-241c7d5c0dbf.webp) + +### Tips for Secure Usage: + +1. **Inspect Subkey Capabilities**: Always verify what operations a subkey can + perform by reviewing its **Usage** field. +2. **Plan Subkey Generation**: At the time of key creation, consider creating + multiple subkeys with distinct purposes (e.g., signing, encryption, + authentication). +3. **Backup Primary Key Securely**: Store the primary key in an offline, highly + secure location to allow recovery or advanced operations if needed. + +### Additional Note on Subkey Algorithm Types + +Subkeys in GpgFrontend offer more algorithm types than primary keys due to their +specialized roles. While primary keys focus on establishing identity and trust, +subkeys are often dedicated to specific tasks like encryption or authentication. +This task-specific design allows subkeys to utilize a broader range of +algorithms, enhancing their flexibility and functionality. For instance, while +primary keys may be restricted to certain secure algorithms for signing, subkeys +can employ diverse algorithms optimized for encryption, like ECDH, ensuring +efficient and secure operations tailored to the user's needs. + +For more Details: [Comparison of Cryptographic Algorithms](/extra/algorithms-comparison) + +**Subkey Supported Algorithms:** + +- RSA +- DSA +- ELG-E +- ECDSA ED25519 +- ECDSA ED448 (GnuPG >2.3.0) +- ECDH CV25519 +- ECDH SECP256K1 (GnuPG >2.3.0) +- ECDH X448 (GnuPG >2.3.0) +- ECDH NIST P-256 +- ECDH NIST P-384 +- ECDH NIST P-521 +- ECDH BrainPool P-256 (GnuPG >2.3.0) +- ECDH BrainPool P-384 (GnuPG >2.3.0) +- ECDH BrainPool P-512 (GnuPG >2.3.0) \ No newline at end of file diff --git a/src/content/docs/guides/symmetric-encrypt-decrypt.md b/src/content/docs/guides/symmetric-encrypt-decrypt.md index 965b976..c86280d 100644 --- a/src/content/docs/guides/symmetric-encrypt-decrypt.md +++ b/src/content/docs/guides/symmetric-encrypt-decrypt.md @@ -45,16 +45,6 @@ challenge of securely exchanging the password between the sender and receiver cannot be understated. If this password is intercepted or guessed by an unauthorized party, the encrypted data's security is compromised. -In summary, GpgFrontend's support for symmetric encryption provides a powerful -tool for users needing to secure their data with a password. This method is -distinguished by its reliance on a single password for both encryption and -decryption, offering a balance between simplicity and security. Users must -exercise caution in creating a strong password and ensure its secure exchange to -maintain the confidentiality and integrity of their encrypted data. Symmetric -encryption with GpgFrontend is a testament to the versatility of cryptographic -practices, catering to a wide range of security needs with user-friendly -solutions. - ## How to Perform Symmetric Encryption Performing symmetric encryption with GpgFrontend is a straightforward process. diff --git a/src/content/docs/guides/understand-interface.md b/src/content/docs/guides/understand-interface.md index 07562f7..f854585 100644 --- a/src/content/docs/guides/understand-interface.md +++ b/src/content/docs/guides/understand-interface.md @@ -4,186 +4,100 @@ sidebar: order: 2 --- -As a beginner, you're only required to swiftly comprehend a few crucial sections -of the page. The exploration that follows will gradually unveil additional -functionalities. Bear in mind that interfaces may vary across different -versions. +This documentation explains the interface and functionality of GpgFrontend, +based on the latest UI design. It is intended to guide users through its +features effectively. -![Interface](https://image.cdn.bktus.com/i/2024/06/15/baf33505-c34f-12c7-d897-a60fc9b5b600.webp) +![Interface](https://image.cdn.bktus.com/i/2024/11/29/0b427894-0706-70fd-cd68-634d57655df4.webp) -## Text Editor +## Text Editing Zone -The text editing zone allows you the liberty to input any desired text or -establish a new tab through the "New" option in the file menu at the top. Moving -or closing tabs can be done with ease as per your needs. +The **Text Editing Zone** allows users to input any desired text or work on +existing files. You can open a new tab using the **"New"** or **"New E-Mail"** +button or load an existing file with **"Open"** from the menu bar. -Numerous operations can be performed on your text using options available in the -Operations Bar at the top of the interface. You can encrypt, decrypt, sign, and -verify text directly from this menu. Additionally, standard shortcuts like -Ctrl+C, Ctrl+V, and Ctrl+S for copy, paste, and save operations, or searching -within the text using Ctrl+F, are supported. +### Key Features: -The edited text within the text box is encoded in UTF-8 without any formatting. -This plain text format ensures that no message alteration leads to confusion. -While there are plans to introduce rich text editing in the future, the -specifics are still being deliberated. +- **Operations Bar**: Located at the top, it provides options to encrypt, + decrypt, sign, and verify text directly. +- **Standard Shortcuts**: Supports basic shortcuts like **Ctrl+C**, **Ctrl+V**, + and **Ctrl+S** for copying, pasting, and saving text. +- **Plain Text Format**: Text is encoded in UTF-8 without formatting to ensure + clarity and compatibility. Future plans may include rich text editing. -### Large Text File Support +#### Large Text File Support -GpgFrontend accommodates opening larger files without hindrance, with the -current limit set to 1MB per file. When dealing with relatively large files, -editing of the tab won't be feasible until the entire file is loaded. During -this time, despite not being able to edit the file, you still have the -capability to view it. +- Files up to **1MB** are supported. Larger files may cause performance issues + and are not recommended. +- While loading large files, editing will be temporarily disabled until the + entire file is processed. -It is important to note that opening files larger than 1MB is not supported, as -excessively long text files can cause significant performance issues with the -graphical user interface (GUI). This limitation helps maintain the application's -responsiveness and ensures a smooth user experience. +## Information Panel -## Information Board +The **Information Panel** displays the results of current operations (e.g., +encryption, decryption, signing) and their status, such as success or failure. +It provides helpful details about the operation, such as timestamps, key IDs, +and algorithms used. -GpgFrontend presents the outcome of the current tab page operation on the -Information Board, signifying the success or failure of the operation. The -Information Board's text includes supplementary details to assist in -understanding the particulars of your encryption, decryption, signature, and -other operations. Depending on your language settings, the output displayed on -the dashboard may differ. +### Color Coding for Status -The Information Board was conceived to provide a comprehensive view of more -information within the same space. However, GpgFrontend plans to incorporate a -graphical interface in the future to augment the user's comprehension of this -information. - -### Color Coding - -- **Green**: Indicates a successful operation that has been thoroughly verified - and found devoid of any issues. The appearance of green font color signifies - an all-clear. -- **Yellow**: Denotes a successful operation with some potential issues detected - during result testing. The yellow font color serves as a subtle alert for the - user, necessitating a detailed review of the operation. -- **Red**: Symbolizes an unsuccessful operation or a significant discrepancy in - the operation's outcome. The red font color acts as a clear warning, demanding - the user to meticulously inspect the operation's specifics to ensure security. - -### Customizable Font Size - -Should you find the font size on the information board to be diminutive, you can -easily adjust it under the 'Application' section in the settings. The default -font size is 10, and it can be modified to any value ranging from 9 to 18. +- **Green**: Indicates a successful operation with no issues. +- **Yellow**: Suggests a successful operation but with potential warnings. +- **Red**: Signifies an unsuccessful operation or critical errors. ### Dashboard Actions Menu -The dashboard actions menu, located below the Information Board, provides quick -and easy access to essential functions related to the content displayed. It -empowers users to efficiently manage and process large chunks of information for -various purposes. - -#### Copy - -This function allows users to swiftly capture significant portions of content -from the Information Board for use in other applications. Simply select the -content you need and use this button to copy it to the clipboard. - -#### Save File - -This operation archives the contents of the Information Board into the file -system in UTF-8 format. Although the resultant output file does not have a -suffix, it is essentially plain text and can be opened with any text editor. - -#### Clear - -This command promptly purges all content from the Information Board, including -both the displayed contents and statuses. Any new operation, such as encryption -or decryption, will automatically trigger this clearing process, ensuring that -the Information Board always displays the most current and relevant information. +- **Copy**: Copies content from the Information Panel to the clipboard. +- **Save File**: Saves the Information Panel's content as a plain text file + (UTF-8). +- **Clear**: Clears all content from the Information Panel, resetting it for the + next operation. ## Key Toolbox -The Key Toolbox on the right side of the interface lists all available keys, -including public and private keys. The columns provide details such as key type, -name, and email address. You can select keys from this list to perform various -operations such as encryption, decryption, signing, and verification. +The **Key Toolbox**, located on the right side of the interface, lists all +available keys. It provides details such as key type, name, email address, and +usage. Users can select keys for specific operations by ticking the boxes in the +first column. -### Usage +### Key Details -Most Gpg-related operations require specifying a key pair (for tasks like -encryption, decryption, signature, etc.). You can select the checkbox in the -first column of the Key Toolbox's table to designate one or more keys for your -operation. Categories that contain only public keys are frequently utilized in -cryptographic scenarios. +- **Type**: + - `pub`: Public key (for encryption or verification). + - `pub/sec`: Key pair with both public and private keys. + - `pub/sec#`: Key pair with missing primary key. + - `pub/sec^`: Key pair with components stored on a smart card. +- **Email Address**: Shows the email associated with each key. +- **Usage**: Indicates key functionality with codes: + - `C`: Certification. + - `E`: Encryption. + - `S`: Signing. + - `A`: Authentication. -### Classification +### Categories -The Toolbox showcases categories via tabbed display. None of these categories -include any expired or revoked keys. To view such keys, you should refer to the -Key Manager. The default category comprises all private and public keys. During -any operation, only the keys from the currently selected category will be -considered for input. - -### Columns - -Understanding this list is crucial. Let's walk through its components step by -step. - -- **Select**: Check the box in this column to notify GpgFrontend that you wish - to use the key from this row for your subsequent operation. - -- **Type**: This column informs you about the key type and whether the primary - key exists in your key pair. - - - `pub` signifies that it is a public key, which can be used for encryption or - verification operations. - - `pub/sec` indicates that the key pair contains both public and private keys. - It can be employed for nearly all operations (consult the 'Usage' column to - confirm this). - - `pub/sec#` shows that the key pair has a public key and a private key, but - the primary key is absent from the key pair. This suggests you won't be able - to perform certain specific operations (like adding subkeys, signing other - key pairs, etc.) - - `pub/sec^` implies that one or more keys (subkeys or master keys) from the - key pair are in the smart card. - - `pub/sec#^` denotes a simultaneous occurrence of the previous two - situations. - -- **Name**: Represents the identity information of the key pair. -- **Email Address**: Also denotes the identity information of the key pair. -- **Usage**: Determines which operations the key pair can execute. Composed of - four uppercase letters, each letter signifies a specific use. - - - `C` stands for Certificate. Key pairs containing the primary key generally - have this usage. - - `E` stands for Encrypt. The key pair can be used for encryption operations. - - `S` stands for Sign. The key pair can be used for signing operations. - - `A` stands for Authenticate. The key pair can be used to perform operations - like SSH authentication. - -- **Validity**: A Gpg concept that roughly represents the level of trust in this - key. +The toolbox categorizes keys by type (e.g., public or private) using tabs. +Expired or revoked keys are not displayed by default and can be viewed in +**Manage Keys**. ## Operations Bar -The Operations Bar at the top includes the following functions: +The **Operations Bar**, at the top of the interface, provides quick access to +all core functionalities: -1. New: Create a new text file tab. -2. Open: Open an existing text file. -3. File Browser: Browse and select files from your system. -4. Encrypt: Encrypt the text or file. -5. Encrypt Sign: Encrypt and sign the text or file. -6. Decrypt: Decrypt the text or file. -7. Decrypt Verify: Decrypt and verify the text or file. -8. Sign: Sign the text or file. -9. Verify: Verify the signature of the text or file. -10. Manage Keys: Open the key management interface. -11. Import Key: Import a new key through some approaches. - -This interface provides a comprehensive suite of tools for managing and -utilizing your cryptographic keys and performing various encryption-related -operations with ease. +1. **New E-Mail**: Create a new email or text file. +2. **Open**: Open an existing text file. +3. **File Browser**: Browse and select files from your system. +4. **Encrypt**: Encrypt text or files using selected keys. +5. **Encrypt Sign**: Encrypt and sign text or files simultaneously. +6. **Decrypt**: Decrypt text or files. +7. **Decrypt Verify**: Decrypt and verify signed files. +8. **Sign**: Digitally sign text or files. +9. **Verify**: Verify the signature of text or files. +10. **Manage Keys**: Access the key management interface. +11. **Import Key**: Import keys into your keyring. ### Customization -For operations that you may not use for a while, you have the option to uncheck -the associated function group in the top menu view. Conversely, for the -operations you frequently use, you have the ability to add them here. +You can hide unused functions or add frequently used ones via the view settings +menu in the application. diff --git a/src/content/docs/overview/glance.md b/src/content/docs/overview/glance.md index 1126e7c..43db6d4 100644 --- a/src/content/docs/overview/glance.md +++ b/src/content/docs/overview/glance.md @@ -12,7 +12,7 @@ encryption, decryption, and digital signing, offering a seamless interface for managing OpenPGP tasks. Embrace the latest features of GnuPG 2.x, enhancing your security in the digital age. -**Document Version Reference: [v2.1.4](https://github.com/saturneric/GpgFrontend/releases/tag/v2.1.4)** +**Document Version Reference: [v2.1.6](https://github.com/saturneric/GpgFrontend/releases/tag/v2.1.6)** ## User Interface Glimpse