Skip to content

Commit f7dc3b3

Browse files
authored
got something working
- moved service worker script to root dir so that fetch events would be caught - lazily copied page code into sw - imp note saved page
1 parent e45603f commit f7dc3b3

7 files changed

Lines changed: 90 additions & 23 deletions

File tree

assets/manifest.json

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,14 @@
66
"theme_color": "#000000",
77
"background_color": "#ffffff",
88
"serviceworker": {
9-
"src": "/assets/service-worker.js"
9+
"src": "/service-worker.js"
1010
},
1111
"share_target": {
12-
"action": "/assets/share-target/",
12+
"action": "/share-target/",
1313
"method": "POST",
1414
"enctype": "multipart/form-data",
1515
"params": {
16-
"text": "text",
17-
"files": [
18-
{
19-
"name": "img",
20-
"accept": [
21-
"image/*"
22-
]
23-
}
24-
]
16+
"text": "text"
2517
}
2618
}
2719
}

mokintoken.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,12 @@ func cleanUpDb(db *sql.DB) {
235235
}
236236
}
237237

238+
func serveSingle(pattern string, filename string) {
239+
http.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) {
240+
http.ServeFile(w, r, filename)
241+
})
242+
}
243+
238244
func main() {
239245

240246
db, err := sql.Open("sqlite3", "./database/mokintoken.sqlite")
@@ -256,6 +262,9 @@ func main() {
256262
// this should be handled by a cdn
257263
http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("assets"))))
258264

265+
serveSingle("/service-worker.js", "./assets/service-worker.js")
266+
267+
259268
port := os.Getenv("PORT")
260269
if port == "" {
261270
port = "8080"

resources/js/index.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ main()
1919
const registerServiceWorker = async () => {
2020
if ("serviceWorker" in navigator) {
2121
try {
22-
const registration = await navigator.serviceWorker.register("/assets/service-worker.js", {
23-
scope: "/assets/",
22+
const registration = await navigator.serviceWorker.register("/service-worker.js", {
23+
scope: "/",
2424
})
2525
if (registration.installing) {
2626
console.log("Service worker installing")
@@ -34,6 +34,7 @@ const registerServiceWorker = async () => {
3434
}
3535
}
3636
}
37-
38-
registerServiceWorker();
37+
if (window.matchMedia('(display-mode: standalone)').matches) {
38+
registerServiceWorker()
39+
}
3940

resources/js/noteSaved.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
1+
import QRCode from 'qrcode'
2+
3+
14
export class NoteSaved {
25

36
constructor() {
4-
console.log('note saved todo')
7+
const hash = window.location.hash.slice(1)
8+
const id = new URLSearchParams(window.location.search).get('id')
9+
10+
const clearnetShareLink = `${document.querySelector('meta[name="clearnet"]').getAttribute('content')}/decrypt/${id}#${hash}`
11+
document.getElementById('clearnetShareLink').href = clearnetShareLink
12+
13+
const dakrnetShareLink = `${document.querySelector('meta[name="darknet"]').getAttribute('content')}/decrypt/${id}#${hash}`
14+
document.getElementById('dakrnetShareLink').href = dakrnetShareLink
15+
16+
Promise.all([
17+
QRCode.toCanvas(document.getElementById('clearnetShareQR'), clearnetShareLink),
18+
QRCode.toCanvas(document.getElementById('darknetShareQR'), dakrnetShareLink)
19+
])
520
}
621
}

resources/js/service-worker.js

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,65 @@ import nacl from 'tweetnacl'
22
import naclUutil from 'tweetnacl-util'
33
import { Base64 } from 'js-base64'
44

5-
console.log("ass" + nacl + naclUutil + Base64)
6-
7-
5+
console.log("ass " + nacl + naclUutil + Base64)
6+
// https://stackoverflow.com/questions/51562781/service-worker-fetch-event-is-not-firing
7+
self.addEventListener('activate', function (event) {
8+
console.log('Claiming control')
9+
return self.clients.claim()
10+
})
811
self.addEventListener("fetch", (event) => {
12+
913
// Regular requests not related to Web Share Target.
10-
if (event.request.method !== "POST" || new URL(event.request.url).pathname != "/assets/share-target") {
14+
if (event.request.method !== "POST" || new URL(event.request.url).pathname != "/share-target/") {
1115
event.respondWith(fetch(event.request))
1216
return
1317
}
1418

1519
// Requests related to Web Share Target.
1620
event.respondWith(
1721
(async () => {
22+
1823
const formData = await event.request.formData()
24+
const nonce = nacl.randomBytes(nacl.secretbox.nonceLength)
25+
const key = nacl.randomBytes(nacl.secretbox.keyLength)
1926
// encrypt note or image
2027
// send to fetch api
28+
const imgBase64 = null // todo - base64
29+
const f = await fetch('/api/save-note', {
30+
method: 'POST',
31+
headers: {
32+
'Content-Type': 'application/json'
33+
},
34+
body: JSON.stringify({
35+
encryptedText: naclUutil.encodeBase64(
36+
nacl.secretbox(
37+
naclUutil.decodeUTF8(formData.get('text')),
38+
nonce,
39+
key
40+
)
41+
),
42+
encryptedImg: imgBase64 != null ? naclUutil.encodeBase64(
43+
nacl.secretbox(
44+
naclUutil.decodeUTF8(imgBase64),
45+
nonce,
46+
key
47+
)
48+
) : null,
49+
// code is hard
50+
expiresHours: "4",
51+
expiresViews: "1"
52+
})
53+
})
54+
const { id } = await f.json()
55+
56+
const hash = Base64.encode(
57+
JSON.stringify({
58+
nonce: naclUutil.encodeBase64(nonce),
59+
key: naclUutil.encodeBase64(key)
60+
})
61+
)
2162
// respond with saved note page
22-
return Response.redirect('/noteSaved#todoshitinthehash', 303)
63+
return Response.redirect(`/noteSaved?id=${id}#${hash}`, 303)
2364
})(),
2465
)
2566
})

resources/js/welcome.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export class Welcome {
3838
try {
3939

4040
const imgBase64 = await getImgBase64(document.getElementById('img'))
41-
41+
// maybe refactor this with service worker code
4242
const f = await fetch('/api/save-note', {
4343
method: 'POST',
4444
headers: {

views/noteSaved.html

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
{{define "content"}}
22

33
<main>
4-
<h1 class="tc f1 pv6">NOTE SAVED TODO/h1>
4+
<div id="" class="tc">
5+
<h1>note successfully encrypted and ready to share</h1>
6+
<h4>either share <a id="clearnetShareLink" target="_blank" style="margin-right: 7px;">this link</a></h4>
7+
<div class="db"> <canvas id="clearnetShareQR" style="display:block; margin: auto;"></canvas></div>
8+
<h5>or this QR code</h5>
9+
<hr />
10+
<h4>For hidden service access <a id="dakrnetShareLink" target="_blank" style="margin-right: 7px;">link</a></h4>
11+
<div class="db"> <canvas id="darknetShareQR" style="display:block; margin: auto;"></canvas></div>
12+
13+
</div>
514
</main>
615
{{end}}

0 commit comments

Comments
 (0)