Skip to content

Commit 58f3ce4

Browse files
feature (pgp): pgp widget
1 parent c1c1165 commit 58f3ce4

File tree

3 files changed

+108
-0
lines changed

3 files changed

+108
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
diff --git a/public/assets/pages/viewerpage/application_editor.js b/public/assets/pages/viewerpage/application_editor.js
2+
index f9fda1e0..c547be20 100644
3+
--- a/public/assets/pages/viewerpage/application_editor.js
4+
+++ b/public/assets/pages/viewerpage/application_editor.js
5+
@@ -27,1 +27,2 @@ class IEditor {}
6+
export default async function(render, { acl$, getFilename, getDownloadUrl, mime }) {
7+
+ if ((await import("./pgp.js")).isPGPFile(getFilename())) acl$ = rxjs.of(["GET"]);
8+
@@ -54,1 +54,1 @@ export default async function(render, { acl$, getFilename, getDownloadUrl, mime
9+
- cat(getDownloadUrl()),
10+
+ cat(await import("/plg_widget_pgp/pgp.js").then((m) => m.isPGPFile(getFilename()) ? m.decode(getDownloadUrl()) : getDownloadUrl())),
11+
diff --git a/public/assets/pages/viewerpage/application_image.js b/public/assets/pages/viewerpage/application_image.js
12+
index 1227d426..b82330aa 100644
13+
--- a/public/assets/pages/viewerpage/application_image.js
14+
+++ b/public/assets/pages/viewerpage/application_image.js
15+
@@ -65,1 +65,3 @@ export default function(render, { getFilename, getDownloadUrl, mime, hasMenubar
16+
let src = `${getDownloadUrl()}&size=${window.innerWidth}`;
17+
+ const m = await import("/plg_widget_pgp/pgp.js");
18+
+ if (m.isPGPFile(getFilename())) src = await m.decode(src);
19+
diff --git a/public/assets/pages/viewerpage/mimetype.js b/public/assets/pages/viewerpage/mimetype.js
20+
index 0adb0934..d002a70e 100644
21+
--- a/public/assets/pages/viewerpage/mimetype.js
22+
+++ b/public/assets/pages/viewerpage/mimetype.js
23+
@@ -3,1 +3,2 @@ import { get as getPlugin } from "../../model/plugin.js";
24+
export function opener(file = "", mimes) {
25+
+ file = file.replace(new RegExp(".gpg$"), "");
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { createElement } from "../../lib/skeleton/index.js";
2+
import { createModal, MODAL_RIGHT_BUTTON } from "../../components/modal.js";
3+
import notification from "../../components/notification.js";
4+
import { qs, safe } from "../../lib/dom.js";
5+
6+
import * as openpgp from "https://unpkg.com/openpgp@6.3.0/dist/openpgp.min.mjs";
7+
8+
export function isPGPFile(path) {
9+
return new RegExp(".gpg$").test(path);
10+
}
11+
12+
export async function decode(src) {
13+
const $page = createElement(`
14+
<div class="component_pgp">
15+
<textarea value=""></textarea>
16+
<style>${CSS}</style>
17+
</div>
18+
`);
19+
$page.querySelector("textarea").value = `gpg --armor --export-secret-keys me@example.com`;
20+
return new Promise((done) => createModal({ withButtonsRight: "decrypt", withButtonsLeft: "cancel" })($page, async (n) => {
21+
if (n !== MODAL_RIGHT_BUTTON) return done(src);
22+
try {
23+
const res = await fetch(src);
24+
const encrypted = await res.arrayBuffer();
25+
const message = await openpgp.readMessage({
26+
binaryMessage: new Uint8Array(encrypted),
27+
});
28+
const privateKey = await openpgp.readPrivateKey({
29+
armoredKey: qs($page, "textarea").value,
30+
});
31+
const { data } = await openpgp.decrypt({
32+
message,
33+
decryptionKeys: privateKey,
34+
format: "binary",
35+
});
36+
done(URL.createObjectURL(new Blob([data])));
37+
} catch (err) {
38+
notification.error(err);
39+
done(src);
40+
} finally {
41+
$page.remove();
42+
}
43+
}));
44+
}
45+
46+
const CSS = `
47+
.component_pgp textarea {
48+
width: 100%;
49+
border: none;
50+
height: 300px;
51+
font-size: 0.5rem;
52+
}
53+
`;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package plg_widget_chat
2+
3+
import (
4+
_ "embed"
5+
"net/http"
6+
7+
. "github.com/mickael-kerjean/filestash/server/common"
8+
9+
"github.com/gorilla/mux"
10+
)
11+
12+
//go:embed assets/pgp.js
13+
var CTRLJS []byte
14+
15+
//go:embed assets/pgp.diff
16+
var PATCH []byte
17+
18+
func init() {
19+
Hooks.Register.HttpEndpoint(func(r *mux.Router) error {
20+
r.HandleFunc(WithBase("/plg_widget_pgp/pgp.js"), func(res http.ResponseWriter, req *http.Request) {
21+
http.Redirect(res, req, WithBase("/assets/"+BUILD_REF+"/pages/viewerpage/pgp.js"), http.StatusSeeOther)
22+
})
23+
r.HandleFunc(WithBase("/assets/"+BUILD_REF+"/pages/viewerpage/pgp.js"), func(res http.ResponseWriter, req *http.Request) {
24+
res.Header().Set("Content-Type", "application/javascript")
25+
res.Write(CTRLJS)
26+
}).Methods("GET")
27+
return nil
28+
})
29+
Hooks.Register.StaticPatch(PATCH)
30+
}

0 commit comments

Comments
 (0)