From 97d2298178592acf6c6cb014876d74220073dafd Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 27 Jul 2023 13:27:53 -0500 Subject: [PATCH 1/9] toActor: don't require the nip05 Related: https://gitlab.com/soapbox-pub/ditto/-/issues/30 --- src/controllers/activitypub/actor.ts | 2 +- src/transformers/nostr-to-activitypub.ts | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/controllers/activitypub/actor.ts b/src/controllers/activitypub/actor.ts index 8d09255..5d78609 100644 --- a/src/controllers/activitypub/actor.ts +++ b/src/controllers/activitypub/actor.ts @@ -12,7 +12,7 @@ const actorController: AppController = async (c) => { const event = await getAuthor(user.pubkey); if (!event) return notFound(c); - const actor = await toActor(event); + const actor = await toActor(event, user.username); if (!actor) return notFound(c); return activityJson(c, actor); diff --git a/src/transformers/nostr-to-activitypub.ts b/src/transformers/nostr-to-activitypub.ts index 82f328d..ae7ea77 100644 --- a/src/transformers/nostr-to-activitypub.ts +++ b/src/transformers/nostr-to-activitypub.ts @@ -6,13 +6,9 @@ import type { Event } from '@/event.ts'; import type { Actor } from '@/schemas/activitypub.ts'; /** Nostr metadata event to ActivityPub actor. */ -async function toActor(event: Event<0>): Promise { +async function toActor(event: Event<0>, username: string): Promise { const content = parseMetaContent(event); - if (!content.nip05) return; - const [username, hostname] = content.nip05.split('@'); - if (hostname !== Conf.url.hostname) return; - return { type: 'Person', id: Conf.local(`/users/${username}`), From f2a3f285fae4b6350c40cd3abe69a336df58ca7a Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 4 Aug 2023 14:11:13 -0500 Subject: [PATCH 2/9] Use Deno.serve instead of deprecated "serve" from deno_std --- src/deps.ts | 1 - src/server.ts | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/deps.ts b/src/deps.ts index d3091e1..fe6398b 100644 --- a/src/deps.ts +++ b/src/deps.ts @@ -50,4 +50,3 @@ export { generateSeededRsa } from 'https://gitlab.com/soapbox-pub/seeded-rsa/-/r export * as secp from 'npm:@noble/secp256k1@^1.7.1'; export { LRUCache } from 'npm:lru-cache@^10.0.0'; export { DB as Sqlite } from 'https://deno.land/x/sqlite@v3.7.0/mod.ts'; -export { serve } from 'https://deno.land/std@0.177.0/http/server.ts'; diff --git a/src/server.ts b/src/server.ts index c9d3f4f..d377d4a 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,6 +1,5 @@ import 'https://deno.land/std@0.177.0/dotenv/load.ts'; -import { serve } from '@/deps.ts'; import app from './app.ts'; -serve(app.fetch); +Deno.serve(app.fetch); From e58e11e425ec3264afa30f209bc08e823c8e2ced Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 4 Aug 2023 14:13:58 -0500 Subject: [PATCH 3/9] Upgrade dotenv to 0.197.0 --- src/server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server.ts b/src/server.ts index d377d4a..a479b27 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,4 +1,4 @@ -import 'https://deno.land/std@0.177.0/dotenv/load.ts'; +import 'https://deno.land/std@0.197.0/dotenv/load.ts'; import app from './app.ts'; From 8ee1a0d888e6bb2a73b44d0020efe578436aaa12 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 4 Aug 2023 14:17:50 -0500 Subject: [PATCH 4/9] Load dotenv in config.ts, ignore .env.defaults and .env.example --- src/config.ts | 9 ++++++++- src/deps.ts | 1 + src/server.ts | 2 -- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/config.ts b/src/config.ts index 69d0057..dcdc3f8 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,4 +1,11 @@ -import { nip19, secp } from '@/deps.ts'; +import { dotenv, nip19, secp } from '@/deps.ts'; + +/** Load environment config from `.env` */ +await dotenv.load({ + export: true, + defaultsPath: null, + examplePath: null, +}); /** Application-wide configuration. */ const Conf = { diff --git a/src/deps.ts b/src/deps.ts index fe6398b..800a669 100644 --- a/src/deps.ts +++ b/src/deps.ts @@ -50,3 +50,4 @@ export { generateSeededRsa } from 'https://gitlab.com/soapbox-pub/seeded-rsa/-/r export * as secp from 'npm:@noble/secp256k1@^1.7.1'; export { LRUCache } from 'npm:lru-cache@^10.0.0'; export { DB as Sqlite } from 'https://deno.land/x/sqlite@v3.7.0/mod.ts'; +export * as dotenv from 'https://deno.land/std@0.197.0/dotenv/mod.ts'; diff --git a/src/server.ts b/src/server.ts index a479b27..76cbc9f 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,5 +1,3 @@ -import 'https://deno.land/std@0.197.0/dotenv/load.ts'; - import app from './app.ts'; Deno.serve(app.fetch); From 0ca9367bd130e7bd036128f987c0b2a93d493774 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 4 Aug 2023 14:36:25 -0500 Subject: [PATCH 5/9] deno.json: harden permissions --- deno.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deno.json b/deno.json index f0c10e6..8d94b58 100644 --- a/deno.json +++ b/deno.json @@ -2,7 +2,7 @@ "$schema": "https://deno.land/x/deno@v1.32.3/cli/schemas/config-file.v1.json", "lock": false, "tasks": { - "dev": "deno run --allow-read --allow-write --allow-env --allow-net --allow-ffi --unstable --watch src/server.ts", + "dev": "deno run --allow-read --allow-write=data --allow-env --allow-net --unstable --watch src/server.ts", "test": "deno test -A --unstable src" }, "imports": { From ae7dd4e2eebba45f671cef959431822fdba6e4c0 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 4 Aug 2023 14:37:23 -0500 Subject: [PATCH 6/9] deno task dev --> deno task start --- deno.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deno.json b/deno.json index 8d94b58..372b5e2 100644 --- a/deno.json +++ b/deno.json @@ -2,7 +2,7 @@ "$schema": "https://deno.land/x/deno@v1.32.3/cli/schemas/config-file.v1.json", "lock": false, "tasks": { - "dev": "deno run --allow-read --allow-write=data --allow-env --allow-net --unstable --watch src/server.ts", + "start": "deno run --allow-read --allow-write=data --allow-env --allow-net --unstable --watch src/server.ts", "test": "deno test -A --unstable src" }, "imports": { From 72f63a677e02764986b19aaaa2e04f343822371e Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 4 Aug 2023 14:41:08 -0500 Subject: [PATCH 7/9] deno.json: harden test permissions --- deno.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deno.json b/deno.json index 372b5e2..d61224b 100644 --- a/deno.json +++ b/deno.json @@ -3,7 +3,7 @@ "lock": false, "tasks": { "start": "deno run --allow-read --allow-write=data --allow-env --allow-net --unstable --watch src/server.ts", - "test": "deno test -A --unstable src" + "test": "deno test --allow-read --allow-write=data --allow-env --unstable src" }, "imports": { "@/": "./src/" From f418496bbbe3636af8c43c1fee2da1475d8a5dee Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 4 Aug 2023 14:42:42 -0500 Subject: [PATCH 8/9] Upgrade Deno to 1.36.0 --- .gitlab-ci.yml | 2 +- .tool-versions | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9b2675e..e0479c6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: denoland/deno:1.33.2 +image: denoland/deno:1.36.0 default: interruptible: true diff --git a/.tool-versions b/.tool-versions index f2c3d11..d2861dc 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -deno 1.33.2 +deno 1.36.0 From dc6b52f6d83716496b62e17f76c006093e66f1b2 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 4 Aug 2023 14:48:37 -0500 Subject: [PATCH 9/9] Upgrade deps --- .gitlab-ci.yml | 4 ++++ deno.json | 3 ++- src/config.ts | 2 +- src/deps.ts | 27 +++++++++++++-------------- src/utils/rsa.ts | 2 +- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e0479c6..5afd11d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,6 +14,10 @@ lint: stage: test script: deno lint +check: + stage: test + script: deno task check + test: stage: test script: deno task test \ No newline at end of file diff --git a/deno.json b/deno.json index d61224b..b3a4d58 100644 --- a/deno.json +++ b/deno.json @@ -3,7 +3,8 @@ "lock": false, "tasks": { "start": "deno run --allow-read --allow-write=data --allow-env --allow-net --unstable --watch src/server.ts", - "test": "deno test --allow-read --allow-write=data --allow-env --unstable src" + "test": "deno test --allow-read --allow-write=data --allow-env --unstable src", + "check": "deno check --unstable src/server.ts" }, "imports": { "@/": "./src/" diff --git a/src/config.ts b/src/config.ts index dcdc3f8..07e899d 100644 --- a/src/config.ts +++ b/src/config.ts @@ -29,7 +29,7 @@ const Conf = { get cryptoKey() { return crypto.subtle.importKey( 'raw', - secp.utils.hexToBytes(Conf.seckey), + secp.etc.hexToBytes(Conf.seckey), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign', 'verify'], diff --git a/src/deps.ts b/src/deps.ts index 800a669..12800d2 100644 --- a/src/deps.ts +++ b/src/deps.ts @@ -3,12 +3,12 @@ export { type Env as HonoEnv, type Handler, Hono, + HTTPException, type MiddlewareHandler, -} from 'https://deno.land/x/hono@v3.0.2/mod.ts'; -export { HTTPException } from 'https://deno.land/x/hono@v3.0.2/http-exception.ts'; -export { cors, logger } from 'https://deno.land/x/hono@v3.0.2/middleware.ts'; +} from 'https://deno.land/x/hono@v3.3.4/mod.ts'; +export { cors, logger } from 'https://deno.land/x/hono@v3.3.4/middleware.ts'; export { z } from 'https://deno.land/x/zod@v3.21.4/mod.ts'; -export { Author, RelayPool } from 'https://dev.jspm.io/nostr-relaypool@0.5.3'; +export { Author, RelayPool } from 'https://dev.jspm.io/nostr-relaypool@0.6.28'; export { type Filter, finishEvent, @@ -21,24 +21,23 @@ export { nip19, nip21, verifySignature, -} from 'npm:nostr-tools@^1.12.1'; +} from 'npm:nostr-tools@^1.14.0'; export { findReplyTag } from 'https://gitlab.com/soapbox-pub/mostr/-/raw/c67064aee5ade5e01597c6d23e22e53c628ef0e2/src/nostr/tags.ts'; export { parseFormData } from 'npm:formdata-helper@^0.3.0'; // @deno-types="npm:@types/lodash@4.14.194" export { default as lodash } from 'https://esm.sh/lodash@4.17.21'; -export { default as linkify } from 'npm:linkifyjs@^4.1.0'; -export { default as linkifyStr } from 'npm:linkify-string@^4.1.0'; -import 'npm:linkify-plugin-hashtag@^4.1.0'; +export { default as linkify } from 'npm:linkifyjs@^4.1.1'; +export { default as linkifyStr } from 'npm:linkify-string@^4.1.1'; +import 'npm:linkify-plugin-hashtag@^4.1.1'; // @deno-types="npm:@types/mime@3.0.0" export { default as mime } from 'npm:mime@^3.0.0'; export { unfurl } from 'npm:unfurl.js@^6.3.2'; -export { default as TTLCache } from 'npm:@isaacs/ttlcache@^1.4.0'; +export { default as TTLCache } from 'npm:@isaacs/ttlcache@^1.4.1'; export { default as uuid62 } from 'npm:uuid62@^1.0.2'; // @deno-types="npm:@types/sanitize-html@2.9.0" -export { default as sanitizeHtml } from 'npm:sanitize-html@^2.10.0'; +export { default as sanitizeHtml } from 'npm:sanitize-html@^2.11.0'; export { default as ISO6391 } from 'npm:iso-639-1@2.1.15'; -export { Dongoose } from 'https://raw.githubusercontent.com/alexgleason/dongoose/68b7ad9dd7b6ec0615e246a9f1603123c1709793/mod.ts'; -export { createPentagon } from 'https://deno.land/x/pentagon@v0.1.1/mod.ts'; +export { createPentagon } from 'https://deno.land/x/pentagon@v0.1.4/mod.ts'; export { type ParsedSignature, pemToPublicKey, @@ -47,7 +46,7 @@ export { verifyRequest, } from 'https://gitlab.com/soapbox-pub/fedisign/-/raw/v0.2.1/mod.ts'; export { generateSeededRsa } from 'https://gitlab.com/soapbox-pub/seeded-rsa/-/raw/v1.0.0/mod.ts'; -export * as secp from 'npm:@noble/secp256k1@^1.7.1'; +export * as secp from 'npm:@noble/secp256k1@^2.0.0'; export { LRUCache } from 'npm:lru-cache@^10.0.0'; -export { DB as Sqlite } from 'https://deno.land/x/sqlite@v3.7.0/mod.ts'; +export { DB as Sqlite } from 'https://deno.land/x/sqlite@v3.7.3/mod.ts'; export * as dotenv from 'https://deno.land/std@0.197.0/dotenv/mod.ts'; diff --git a/src/utils/rsa.ts b/src/utils/rsa.ts index b6865b4..9155a72 100644 --- a/src/utils/rsa.ts +++ b/src/utils/rsa.ts @@ -11,7 +11,7 @@ async function buildSeed(pubkey: string): Promise { const key = await Conf.cryptoKey; const data = new TextEncoder().encode(pubkey); const signature = await window.crypto.subtle.sign('HMAC', key, data); - return secp.utils.bytesToHex(new Uint8Array(signature)); + return secp.etc.bytesToHex(new Uint8Array(signature)); } async function getPublicKeyPem(pubkey: string): Promise {