fedipod-server 0.29.0 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -6
- package/dist/claims.d.ts +2 -0
- package/dist/claims.js +13 -4
- package/dist/door.d.ts +4 -0
- package/dist/door.js +31 -0
- package/dist/fedipod.d.ts +15 -0
- package/dist/fedipod.js +13 -0
- package/dist/front.d.ts +3 -0
- package/dist/front.js +92 -0
- package/dist/handler.d.ts +36 -101
- package/dist/handler.js +93 -644
- package/dist/handler.jsonld +2 -30
- package/dist/identities.d.ts +71 -0
- package/dist/identities.js +236 -0
- package/dist/mounts.d.ts +43 -0
- package/dist/mounts.js +123 -0
- package/dist/opt-in.d.ts +46 -0
- package/dist/opt-in.js +176 -0
- package/dist/private-read.d.ts +4 -0
- package/dist/private-read.js +34 -0
- package/package.json +12 -20
- package/lib/client/c2s.mjs +0 -636
- package/lib/client/localapi.mjs +0 -87
- package/lib/client/masto/accounts.mjs +0 -310
- package/lib/client/masto/body.mjs +0 -156
- package/lib/client/masto/index.mjs +0 -206
- package/lib/client/masto/instance.mjs +0 -112
- package/lib/client/masto/media.mjs +0 -79
- package/lib/client/masto/oauth.mjs +0 -656
- package/lib/client/masto/render.mjs +0 -518
- package/lib/client/masto/statuses.mjs +0 -372
- package/lib/client/masto/timelines.mjs +0 -438
- package/lib/client/oidc-auth.mjs +0 -62
- package/lib/client/streaming.mjs +0 -154
- package/lib/client/webpush.mjs +0 -98
- package/lib/connections/acctfeed.mjs +0 -257
- package/lib/connections/atproto.mjs +0 -309
- package/lib/connections/bskyfeed.mjs +0 -243
- package/lib/connections/bskygroup.mjs +0 -162
- package/lib/connections/fediacct.mjs +0 -253
- package/lib/connections/import.mjs +0 -357
- package/lib/connections/tagfeed.mjs +0 -212
- package/lib/connections/vault.mjs +0 -114
- package/lib/core/as2.mjs +0 -206
- package/lib/core/contexts/activitystreams.json +0 -379
- package/lib/core/contexts/anno.json +0 -126
- package/lib/core/contexts/did-v1.json +0 -57
- package/lib/core/contexts/fep-5711.json +0 -36
- package/lib/core/contexts/gotosocial.json +0 -86
- package/lib/core/contexts/identity-v1.json +0 -152
- package/lib/core/contexts/index.mjs +0 -63
- package/lib/core/contexts/join-lemmy.json +0 -33
- package/lib/core/contexts/joinmastodon.json +0 -28
- package/lib/core/contexts/litepub-0.1.json +0 -60
- package/lib/core/contexts/map.json +0 -19
- package/lib/core/contexts/miscellany.json +0 -19
- package/lib/core/contexts/quotes.json +0 -18
- package/lib/core/contexts/schemaorg.json +0 -8845
- package/lib/core/contexts/security-data-integrity-v1.json +0 -78
- package/lib/core/contexts/security-data-integrity-v2.json +0 -81
- package/lib/core/contexts/security-multikey-v1.json +0 -35
- package/lib/core/contexts/security-v1.json +0 -74
- package/lib/core/contexts/webfinger.json +0 -10
- package/lib/core/deliver.mjs +0 -387
- package/lib/core/graphview.mjs +0 -327
- package/lib/core/intake/activities.mjs +0 -649
- package/lib/core/intake/activity.mjs +0 -318
- package/lib/core/intake/channel.mjs +0 -144
- package/lib/core/intake/group.mjs +0 -258
- package/lib/core/intake/index.mjs +0 -732
- package/lib/core/intake/notes.mjs +0 -367
- package/lib/core/intake/verify.mjs +0 -142
- package/lib/core/keys.mjs +0 -153
- package/lib/core/lease.mjs +0 -206
- package/lib/core/place.mjs +0 -82
- package/lib/core/polls.mjs +0 -105
- package/lib/core/profile-page.mjs +0 -104
- package/lib/core/proof.mjs +0 -79
- package/lib/core/publisher/collections.mjs +0 -272
- package/lib/core/publisher/index.mjs +0 -522
- package/lib/core/publisher/notes.mjs +0 -519
- package/lib/core/publisher/own.mjs +0 -143
- package/lib/core/publisher/questions.mjs +0 -241
- package/lib/core/publisher/restore.mjs +0 -224
- package/lib/core/shapes/activitystreams.ttl +0 -157
- package/lib/core/shapes/index.mjs +0 -132
- package/lib/core/shapes/shapes-text.mjs +0 -13
- package/lib/core/social.mjs +0 -561
- package/lib/core/storage.mjs +0 -176
- package/lib/core/store.mjs +0 -578
- package/lib/core/wire-quotes.mjs +0 -71
- package/lib/core/wire.mjs +0 -925
- package/lib/device/account.mjs +0 -87
- package/lib/device/admin/index.mjs +0 -13
- package/lib/device/admin/origins.mjs +0 -35
- package/lib/device/admin/routes/connections.mjs +0 -144
- package/lib/device/admin/routes/gateway.mjs +0 -199
- package/lib/device/admin/routes/lifecycle.mjs +0 -200
- package/lib/device/admin/routes/owner.mjs +0 -322
- package/lib/device/admin/routes/setup.mjs +0 -428
- package/lib/device/admin/routes/social.mjs +0 -188
- package/lib/device/admin/server.mjs +0 -95
- package/lib/device/admin/static.mjs +0 -247
- package/lib/device/admin/surface.mjs +0 -315
- package/lib/device/certs.mjs +0 -281
- package/lib/device/cli/commands/account.mjs +0 -586
- package/lib/device/cli/commands/run.mjs +0 -278
- package/lib/device/cli/commands/service.mjs +0 -221
- package/lib/device/cli/commands/setup.mjs +0 -489
- package/lib/device/cli/commands/state.mjs +0 -561
- package/lib/device/cli/context.mjs +0 -288
- package/lib/device/export-collections.mjs +0 -161
- package/lib/device/gateway-move.mjs +0 -58
- package/lib/device/home.mjs +0 -161
- package/lib/device/migrate.mjs +0 -115
- package/lib/device/ports.mjs +0 -27
- package/lib/device/remote.mjs +0 -54
- package/lib/device/setup.mjs +0 -496
- package/lib/device/update.mjs +0 -96
- package/lib/gateway/caches.mjs +0 -36
- package/lib/gateway/directory.mjs +0 -90
- package/lib/gateway/front-core.mjs +0 -966
- package/lib/gateway/gateway-core.mjs +0 -244
- package/lib/gateway/headers.mjs +0 -49
- package/lib/gateway/httpsig.mjs +0 -159
- package/lib/gateway/notices.mjs +0 -84
- package/lib/gateway/quiet.mjs +0 -189
- package/lib/gateway/relay-extras.mjs +0 -89
- package/lib/gateway/token-claims.mjs +0 -16
- package/lib/pod/README.md +0 -61
- package/lib/pod/actor.mjs +0 -96
- package/lib/pod/collection.mjs +0 -77
- package/lib/pod/containers.mjs +0 -140
- package/lib/pod/discovery.mjs +0 -46
- package/lib/pod/featured.mjs +0 -18
- package/lib/pod/followers.mjs +0 -24
- package/lib/pod/following.mjs +0 -10
- package/lib/pod/http.mjs +0 -74
- package/lib/pod/inbox.mjs +0 -166
- package/lib/pod/links.mjs +0 -35
- package/lib/pod/location.mjs +0 -52
- package/lib/pod/media.mjs +0 -27
- package/lib/pod/notes.mjs +0 -78
- package/lib/pod/notifications.mjs +0 -89
- package/lib/pod/outbox.mjs +0 -18
- package/lib/pod/package.json +0 -19
- package/lib/pod/policy.mjs +0 -58
- package/lib/pod/private.mjs +0 -19
- package/lib/pod/root.mjs +0 -104
- package/lib/pod/state.mjs +0 -40
- package/lib/pod/transport.mjs +0 -674
- package/lib/pod/type-index.mjs +0 -101
- package/lib/pod/urls.mjs +0 -91
- package/lib/server/embed.mjs +0 -424
- package/lib/session/README.md +0 -137
- package/lib/session/demo.html +0 -94
- package/lib/session/fedi-account.mjs +0 -417
- package/lib/session/fedi-login.mjs +0 -123
- package/lib/session/oidc-session.mjs +0 -233
- package/lib/session/package.json +0 -49
- package/lib/shared/guard.mjs +0 -213
- package/lib/shared/links.mjs +0 -9
- package/lib/shared/safefetch.mjs +0 -235
- package/lib/shared/ua.mjs +0 -29
- package/phanpy/dist/404.html +0 -40
- package/phanpy/dist/_headers +0 -2
- package/phanpy/dist/apple-touch-icon.png +0 -0
- package/phanpy/dist/assets/ICONS-DIPJeU0C.js +0 -2
- package/phanpy/dist/assets/ICONS-DIPJeU0C.js.map +0 -1
- package/phanpy/dist/assets/ScheduledAtField-D-Abfo4J.js +0 -183
- package/phanpy/dist/assets/ScheduledAtField-D-Abfo4J.js.map +0 -1
- package/phanpy/dist/assets/Temml-CCjoacWt.woff2 +0 -0
- package/phanpy/dist/assets/__vite-browser-external-C7iut881.js +0 -2
- package/phanpy/dist/assets/__vite-browser-external-C7iut881.js.map +0 -1
- package/phanpy/dist/assets/boosts-carousel-BiOaNdMT.jpg +0 -0
- package/phanpy/dist/assets/catch-up-O5q5C75Z.png +0 -0
- package/phanpy/dist/assets/chunk-aKtaBQYM.js +0 -1
- package/phanpy/dist/assets/compose-CFEx7wb4.js +0 -2
- package/phanpy/dist/assets/compose-CFEx7wb4.js.map +0 -1
- package/phanpy/dist/assets/compose-ZJN5xSb4.js +0 -35
- package/phanpy/dist/assets/compose-ZJN5xSb4.js.map +0 -1
- package/phanpy/dist/assets/debug.module-YFQgwnIr.js +0 -52
- package/phanpy/dist/assets/debug.module-YFQgwnIr.js.map +0 -1
- package/phanpy/dist/assets/dom-p1YcJ5Rw.js +0 -2
- package/phanpy/dist/assets/dom-p1YcJ5Rw.js.map +0 -1
- package/phanpy/dist/assets/home-mobile-dark@2x-Dc-J8-SM.png +0 -0
- package/phanpy/dist/assets/home-mobile-light@2x-Bd3fod8m.png +0 -0
- package/phanpy/dist/assets/home-tablet-dark@2x-BgcNI8le.png +0 -0
- package/phanpy/dist/assets/home-tablet-light@2x-BW2RV9T6.png +0 -0
- package/phanpy/dist/assets/icons/add-circle-line-WD0mwORD.js +0 -1
- package/phanpy/dist/assets/icons/alert-line-CpFUMf9s.js +0 -1
- package/phanpy/dist/assets/icons/android-2-line-Bzxnrd3S.js +0 -1
- package/phanpy/dist/assets/icons/announcement-line-5nwaJFJm.js +0 -1
- package/phanpy/dist/assets/icons/arrow-down-circle-line-a7Id9-Iv.js +0 -1
- package/phanpy/dist/assets/icons/arrow-down-line-B8uzXzq6.js +0 -1
- package/phanpy/dist/assets/icons/arrow-left-line-CGrGT9C-.js +0 -1
- package/phanpy/dist/assets/icons/arrow-right-line-CE-HERfX.js +0 -1
- package/phanpy/dist/assets/icons/arrow-to-up-line-CvdQjmcy.js +0 -1
- package/phanpy/dist/assets/icons/arrow-up-circle-line-DEparSNF.js +0 -1
- package/phanpy/dist/assets/icons/arrow-up-line-C7yBeugc.js +0 -1
- package/phanpy/dist/assets/icons/arrows-right-line-BtbXmJGP.js +0 -1
- package/phanpy/dist/assets/icons/at-line-CF66Bznk.js +0 -1
- package/phanpy/dist/assets/icons/attachment-line-BY8It-l9.js +0 -1
- package/phanpy/dist/assets/icons/blockquote-line-BS6pU_hm.js +0 -1
- package/phanpy/dist/assets/icons/board-line-C0UWXyA6.js +0 -1
- package/phanpy/dist/assets/icons/bookmark-line-1CtX5JLF.js +0 -1
- package/phanpy/dist/assets/icons/building-5-line-Dd59MzbO.js +0 -1
- package/phanpy/dist/assets/icons/bus-2-line-6_dvA0GG.js +0 -1
- package/phanpy/dist/assets/icons/calendar-day-line-Crpl_fmu.js +0 -1
- package/phanpy/dist/assets/icons/calendar-month-line-vommts2C.js +0 -1
- package/phanpy/dist/assets/icons/calendar-time-add-line-BU_DTlQk.js +0 -1
- package/phanpy/dist/assets/icons/camera-line-Cv69MEei.js +0 -1
- package/phanpy/dist/assets/icons/celebrate-line-B8DvIoi0.js +0 -1
- package/phanpy/dist/assets/icons/chart-bar-line-FK-QOmtF.js +0 -1
- package/phanpy/dist/assets/icons/chart-line-line-BGcJAFWw.js +0 -1
- package/phanpy/dist/assets/icons/chat-3-line-YFK2-hwz.js +0 -1
- package/phanpy/dist/assets/icons/check-circle-line-DsAxFr5-.js +0 -1
- package/phanpy/dist/assets/icons/clipboard-line-BBp364gJ.js +0 -1
- package/phanpy/dist/assets/icons/close-circle-line-CICdiuGz.js +0 -1
- package/phanpy/dist/assets/icons/close-line-DYrFWcjv.js +0 -1
- package/phanpy/dist/assets/icons/cloud-line-tiQAbah8.js +0 -1
- package/phanpy/dist/assets/icons/code-line-fAl8iiV3.js +0 -1
- package/phanpy/dist/assets/icons/comment-2-line-CR3g7WeB.js +0 -1
- package/phanpy/dist/assets/icons/copy-2-line-CLW69yF5.js +0 -1
- package/phanpy/dist/assets/icons/delete-2-line-B8xmbr4n.js +0 -1
- package/phanpy/dist/assets/icons/document-3-line-DBGNhAg2.js +0 -1
- package/phanpy/dist/assets/icons/document-line-C7mb9sb7.js +0 -1
- package/phanpy/dist/assets/icons/down-line-BGqSSThd.js +0 -1
- package/phanpy/dist/assets/icons/edit-4-line-DcgGaEhx.js +0 -1
- package/phanpy/dist/assets/icons/emoji-2-line-D8YgnM-y.js +0 -1
- package/phanpy/dist/assets/icons/exit-line-Dc07BS-x.js +0 -1
- package/phanpy/dist/assets/icons/external-link-line-BvpSkmjO.js +0 -1
- package/phanpy/dist/assets/icons/eye-2-line-CiWXx-f_.js +0 -1
- package/phanpy/dist/assets/icons/eye-close-line-BgTaSJ4P.js +0 -1
- package/phanpy/dist/assets/icons/filter-2-line-B_mR2usy.js +0 -1
- package/phanpy/dist/assets/icons/filter-line-C_nm-3cU.js +0 -1
- package/phanpy/dist/assets/icons/flag-1-line-C2HB05I0.js +0 -1
- package/phanpy/dist/assets/icons/forbid-circle-line-D3LTT9yd.js +0 -1
- package/phanpy/dist/assets/icons/formula-line-DLrt2d6j.js +0 -1
- package/phanpy/dist/assets/icons/grid-line-CgUmEikf.js +0 -1
- package/phanpy/dist/assets/icons/group-line-C5fnX0wU.js +0 -1
- package/phanpy/dist/assets/icons/hand-finger-2-line-BGgxbuL9.js +0 -1
- package/phanpy/dist/assets/icons/hashtag-line-CyTEEXBb.js +0 -1
- package/phanpy/dist/assets/icons/heart-crack-line-BZddbO2C.js +0 -1
- package/phanpy/dist/assets/icons/heart-line-CJ7K47J4.js +0 -1
- package/phanpy/dist/assets/icons/history-2-line-kWWvFzqv.js +0 -1
- package/phanpy/dist/assets/icons/history-line-bGQiwbTH.js +0 -1
- package/phanpy/dist/assets/icons/home-3-line-fRU1zeLG.js +0 -1
- package/phanpy/dist/assets/icons/information-line-iNk6-sOY.js +0 -1
- package/phanpy/dist/assets/icons/keyboard-line-DsCyuQNz.js +0 -1
- package/phanpy/dist/assets/icons/layout-4-line-CZkOX52Z.js +0 -1
- package/phanpy/dist/assets/icons/layout-5-line-B_znt5wO.js +0 -1
- package/phanpy/dist/assets/icons/left-line-eUw0tya4.js +0 -1
- package/phanpy/dist/assets/icons/lightning-line-DaKoDdix.js +0 -1
- package/phanpy/dist/assets/icons/link-2-line-DCqLmMA7.js +0 -1
- package/phanpy/dist/assets/icons/list-check-line-BAxosBh9.js +0 -1
- package/phanpy/dist/assets/icons/lock-line-CPoaXeUW.js +0 -1
- package/phanpy/dist/assets/icons/mail-line-B0P8aa1L.js +0 -1
- package/phanpy/dist/assets/icons/moon-line-CEqNAToP.js +0 -1
- package/phanpy/dist/assets/icons/more-1-fill-Dw2e5xab.js +0 -1
- package/phanpy/dist/assets/icons/more-3-line-BIiVjYTz.js +0 -1
- package/phanpy/dist/assets/icons/notification-line-BZZq2Gtu.js +0 -1
- package/phanpy/dist/assets/icons/pencil-line-CKh8-A1v.js +0 -1
- package/phanpy/dist/assets/icons/photo-album-line-Bnfg2u40.js +0 -1
- package/phanpy/dist/assets/icons/pin-line-DpTolyhs.js +0 -1
- package/phanpy/dist/assets/icons/play-fill-B0-G_8lX.js +0 -1
- package/phanpy/dist/assets/icons/qrcode-2-line-B6SPCaHn.js +0 -1
- package/phanpy/dist/assets/icons/quill-pen-line-B6LUrnCP.js +0 -1
- package/phanpy/dist/assets/icons/quote-left-fill-hQZ1cj_6.js +0 -1
- package/phanpy/dist/assets/icons/radar-line-CKyroTth.js +0 -1
- package/phanpy/dist/assets/icons/react-line-CoIKhhtK.js +0 -1
- package/phanpy/dist/assets/icons/refresh-2-line-D0mTF97S.js +0 -1
- package/phanpy/dist/assets/icons/right-line-B3KWJaqc.js +0 -1
- package/phanpy/dist/assets/icons/rocket-line-4KZl537D.js +0 -1
- package/phanpy/dist/assets/icons/round-fill-C69NTrZ0.js +0 -1
- package/phanpy/dist/assets/icons/round-line-B9k_1uo-.js +0 -1
- package/phanpy/dist/assets/icons/route-line-B28ReHcE.js +0 -1
- package/phanpy/dist/assets/icons/rows-4-line-CrBniagM.js +0 -1
- package/phanpy/dist/assets/icons/scan-line-DSf74YdP.js +0 -1
- package/phanpy/dist/assets/icons/search-2-line-B6geIU1z.js +0 -1
- package/phanpy/dist/assets/icons/settings-3-line-azJwK47w.js +0 -1
- package/phanpy/dist/assets/icons/settings-6-line-C_5zc5YR.js +0 -1
- package/phanpy/dist/assets/icons/share-2-line-D5MxWjrm.js +0 -1
- package/phanpy/dist/assets/icons/share-forward-line-Cp61fZzZ.js +0 -1
- package/phanpy/dist/assets/icons/sparkles-2-line-DYYyXTaW.js +0 -1
- package/phanpy/dist/assets/icons/sparkles-line-C2hY1s6I.js +0 -1
- package/phanpy/dist/assets/icons/time-line-BF3eet1v.js +0 -1
- package/phanpy/dist/assets/icons/transfer-4-line-oisfvTBw.js +0 -1
- package/phanpy/dist/assets/icons/translate-line-BFWol2Ce.js +0 -1
- package/phanpy/dist/assets/icons/unlock-line-X_x5vwv3.js +0 -1
- package/phanpy/dist/assets/icons/upload-3-line-DgzwUJeW.js +0 -1
- package/phanpy/dist/assets/icons/user-4-line-BVSynZCp.js +0 -1
- package/phanpy/dist/assets/icons/user-add-2-line-BlGS5Q8q.js +0 -1
- package/phanpy/dist/assets/icons/user-add-line-BbXdHG4z.js +0 -1
- package/phanpy/dist/assets/icons/user-edit-line-BFAHOV0X.js +0 -1
- package/phanpy/dist/assets/icons/user-follow-line-BXux0wSd.js +0 -1
- package/phanpy/dist/assets/icons/user-star-line-DdYlpHLU.js +0 -1
- package/phanpy/dist/assets/icons/user-warning-line-Cj43j0_E.js +0 -1
- package/phanpy/dist/assets/icons/user-x-line-DIDgNlPH.js +0 -1
- package/phanpy/dist/assets/icons/volume-line-Bs390KQt.js +0 -1
- package/phanpy/dist/assets/icons/volume-mute-line-DzlzIqFZ.js +0 -1
- package/phanpy/dist/assets/icons/walk-line-yNXfB-md.js +0 -1
- package/phanpy/dist/assets/icons/world-2-line-CenkGIwj.js +0 -1
- package/phanpy/dist/assets/icons/zoom-in-line-CaENUphf.js +0 -1
- package/phanpy/dist/assets/icons/zoom-out-line-BDNk0EWo.js +0 -1
- package/phanpy/dist/assets/instances-BNPptnn-.json +0 -333
- package/phanpy/dist/assets/locales/ar-SA-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/ca-ES-DHRW86Tz.js +0 -1
- package/phanpy/dist/assets/locales/cs-CZ-CKoqEuA1.js +0 -1
- package/phanpy/dist/assets/locales/de-DE-ByRPMRFy.js +0 -1
- package/phanpy/dist/assets/locales/eo-UY-CPC7wLCS.js +0 -1
- package/phanpy/dist/assets/locales/es-ES-dJa0Fd9t.js +0 -1
- package/phanpy/dist/assets/locales/eu-ES-C3djlPR2.js +0 -1
- package/phanpy/dist/assets/locales/fa-IR-DTT490Ck.js +0 -1
- package/phanpy/dist/assets/locales/fi-FI-B23MCPuz.js +0 -1
- package/phanpy/dist/assets/locales/fr-FR-BcaQsO5C.js +0 -1
- package/phanpy/dist/assets/locales/gl-ES-BR-CVKBN.js +0 -1
- package/phanpy/dist/assets/locales/he-IL-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/hu-HU-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/it-IT-C1136UFV.js +0 -1
- package/phanpy/dist/assets/locales/ja-JP-CRZmRAhD.js +0 -1
- package/phanpy/dist/assets/locales/kab-Cz8xH_TT.js +0 -1
- package/phanpy/dist/assets/locales/ko-KR-CG9UiY4o.js +0 -1
- package/phanpy/dist/assets/locales/lt-LT-CJcI6sHZ.js +0 -1
- package/phanpy/dist/assets/locales/nb-NO-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/nl-NL-DxN4Yc1t.js +0 -1
- package/phanpy/dist/assets/locales/oc-FR-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/pl-PL-DkwGXf6P.js +0 -1
- package/phanpy/dist/assets/locales/pseudo-LOCALE-CQ4XxkQ0.js +0 -1
- package/phanpy/dist/assets/locales/pt-BR-nGL0HdFS.js +0 -1
- package/phanpy/dist/assets/locales/pt-PT-Cp17aj2z.js +0 -1
- package/phanpy/dist/assets/locales/ru-RU-0Y8cIoaK.js +0 -1
- package/phanpy/dist/assets/locales/th-TH-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/tok-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/tr-TR-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/locales/uk-UA-C5E3dFBf.js +0 -1
- package/phanpy/dist/assets/locales/zh-CN-BHJi7_et.js +0 -1
- package/phanpy/dist/assets/locales/zh-TW-CfheRbCu.js +0 -1
- package/phanpy/dist/assets/main-BdqNbG-a.js +0 -26
- package/phanpy/dist/assets/main-BdqNbG-a.js.map +0 -1
- package/phanpy/dist/assets/mock-home-DGhR__He.js +0 -2
- package/phanpy/dist/assets/mock-home-DGhR__He.js.map +0 -1
- package/phanpy/dist/assets/multi-column-ROck0NVt.jpg +0 -0
- package/phanpy/dist/assets/multi-hashtag-timeline-DH5INVHi.jpg +0 -0
- package/phanpy/dist/assets/nested-comments-thread-hv59kZLc.jpg +0 -0
- package/phanpy/dist/assets/polyfill-force-H8sUkLGp.js +0 -2
- package/phanpy/dist/assets/polyfill-force-H8sUkLGp.js.map +0 -1
- package/phanpy/dist/assets/pwa-viewport-ogKbF51K.js +0 -20
- package/phanpy/dist/assets/pwa-viewport-ogKbF51K.js.map +0 -1
- package/phanpy/dist/assets/style-B1iLPTPR.css +0 -2
- package/phanpy/dist/assets/temml-DuyIQMei.js +0 -97
- package/phanpy/dist/assets/temml-DuyIQMei.js.map +0 -1
- package/phanpy/dist/assets/tinyld.light.node-DtbBhLYC.js +0 -2
- package/phanpy/dist/assets/tinyld.light.node-DtbBhLYC.js.map +0 -1
- package/phanpy/dist/assets/year-in-posts-B2lywqdx.png +0 -0
- package/phanpy/dist/assets/year-in-posts-DJv_star.js +0 -3
- package/phanpy/dist/assets/year-in-posts-DJv_star.js.map +0 -1
- package/phanpy/dist/compose/index.html +0 -20
- package/phanpy/dist/favicon.ico +0 -0
- package/phanpy/dist/index.html +0 -73
- package/phanpy/dist/logo-192.png +0 -0
- package/phanpy/dist/logo-512.png +0 -0
- package/phanpy/dist/logo-badge-72.png +0 -0
- package/phanpy/dist/logo-maskable-512.png +0 -0
- package/phanpy/dist/logo-monochrome-512.png +0 -0
- package/phanpy/dist/logo-monochrome-maskable-512.png +0 -0
- package/phanpy/dist/manifest.webmanifest +0 -1
- package/phanpy/dist/og-image-2.jpg +0 -0
- package/phanpy/dist/og-image.png +0 -0
- package/phanpy/dist/robots.txt +0 -2
- package/phanpy/dist/sw.js +0 -2
- package/phanpy/dist/sw.js.map +0 -1
- package/phanpy/dist/version.json +0 -1
- package/run-agent.mjs +0 -899
- package/vendor/gate.cjs +0 -138
- package/vendor/idp-grant.cjs +0 -394
- package/vendor/jfetch.cjs +0 -16
- package/web/admin/actors.js +0 -147
- package/web/admin/bar.css +0 -126
- package/web/admin/bar.js +0 -99
- package/web/admin/client/client.js +0 -66
- package/web/admin/client/index.html +0 -69
- package/web/admin/client-pick.js +0 -79
- package/web/admin/common.js +0 -23
- package/web/admin/connections.js +0 -112
- package/web/admin/gateway.js +0 -133
- package/web/admin/group.js +0 -258
- package/web/admin/index.html +0 -612
- package/web/admin/notices-bar.js +0 -90
- package/web/admin/oauth-signin.mjs +0 -37
- package/web/admin/record.js +0 -393
- package/web/admin/setup/index.html +0 -257
- package/web/admin/setup/setup.js +0 -339
- package/web/admin/tokens.css +0 -68
- package/web/admin/upkeep.js +0 -177
- package/web/admin/window.css +0 -55
- package/web/admin/window.js +0 -136
- package/web/app/README.md +0 -81
- package/web/app/admin-facade.mjs +0 -588
- package/web/app/agent.mjs +0 -672
- package/web/app/atproto-browser.mjs +0 -86
- package/web/app/authorize_interaction.html +0 -56
- package/web/app/authorize_interaction.js +0 -69
- package/web/app/boot.mjs +0 -616
- package/web/app/deliver-relay.mjs +0 -129
- package/web/app/dist/boot.js +0 -34562
- package/web/app/dist/boot.js.map +0 -7
- package/web/app/dist/sw.js +0 -73456
- package/web/app/dist/sw.js.map +0 -7
- package/web/app/fediacct-browser.mjs +0 -146
- package/web/app/gateway-move.mjs +0 -60
- package/web/app/idb-kv.mjs +0 -35
- package/web/app/index.html +0 -258
- package/web/app/keys-browser.mjs +0 -71
- package/web/app/keystore.mjs +0 -82
- package/web/app/oidc-session.mjs +0 -6
- package/web/app/pod-auth.mjs +0 -248
- package/web/app/pod-remote.mjs +0 -84
- package/web/app/shims/_globals.mjs +0 -2
- package/web/app/shims/fedify-sig.mjs +0 -77
- package/web/app/shims/node-crypto.mjs +0 -113
- package/web/app/shims/node-fs.mjs +0 -17
- package/web/app/shims/node-path.mjs +0 -19
- package/web/app/shims/node-url.mjs +0 -7
- package/web/app/shims/prelude.js +0 -58
- package/web/app/shims/safefetch.mjs +0 -58
- package/web/app/shims/shapes-text.mjs +0 -8
- package/web/app/shims/web-push.mjs +0 -14
- package/web/app/signup.mjs +0 -357
- package/web/app/sw-src.mjs +0 -220
- package/web/app/update.js +0 -70
- package/web/front/admin.html +0 -55
- package/web/front/admin.js +0 -89
- package/web/front/install.sh +0 -69
- package/web/front/new-account.html +0 -35
- package/web/front/new-account.js +0 -13
- package/web/front/notices.html +0 -69
- package/web/front/notices.js +0 -107
- package/web/front/run.html +0 -64
- package/web/front/run.js +0 -221
- package/web/front/solid-oidc-client.js +0 -6
- package/web/icons/forum.svg +0 -11
- package/web/icons/gateway.svg +0 -14
- package/web/icons/local.svg +0 -11
package/web/app/update.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
// update.js — a fedipod.net page notices a newer build and reloads itself once.
|
|
2
|
-
//
|
|
3
|
-
// The page carries the version it was staged with (a meta tag); the site
|
|
4
|
-
// answers its current version at the handle probe. When they differ, the
|
|
5
|
-
// worker is asked to update — it installs and takes over at once (sw-src.mjs
|
|
6
|
-
// skips waiting and claims) — and the page reloads when the new worker takes
|
|
7
|
-
// over, or after a moment if only the pages changed. A page with text in a
|
|
8
|
-
// composer is not reloaded from under it: it shows a line with a button.
|
|
9
|
-
(() => {
|
|
10
|
-
const mine = document.querySelector('meta[name="fedipod-version"]')?.content;
|
|
11
|
-
// The build this page was staged from. A version changes when a release is
|
|
12
|
-
// cut; a build changes every time the site is deployed, which is what a
|
|
13
|
-
// reader with the page open actually needs to hear about.
|
|
14
|
-
const myBuild = document.querySelector('meta[name="fedipod-build"]')?.content || null;
|
|
15
|
-
if (!mine) return;
|
|
16
|
-
const loadedAt = Date.now();
|
|
17
|
-
let acted = false;
|
|
18
|
-
const drafting = () => [...document.querySelectorAll('textarea')].some((t) => t.value.trim());
|
|
19
|
-
const banner = () => {
|
|
20
|
-
if (document.getElementById('fedipod-update')) return;
|
|
21
|
-
const d = document.createElement('div');
|
|
22
|
-
d.id = 'fedipod-update';
|
|
23
|
-
d.setAttribute('role', 'status');
|
|
24
|
-
d.style.cssText = 'position:fixed;left:0;right:0;bottom:0;z-index:2147483647;padding:1rem 1.25rem;'
|
|
25
|
-
+ 'font:1rem/1.5 Arial, Helvetica, sans-serif;background:#1d1d1d;color:#fff;display:flex;gap:1rem;align-items:center;justify-content:center;flex-wrap:wrap';
|
|
26
|
-
const t = document.createElement('span');
|
|
27
|
-
t.textContent = 'A new version of FediPod is ready. Reload when you have finished writing.';
|
|
28
|
-
const b = document.createElement('button');
|
|
29
|
-
b.type = 'button'; b.textContent = 'Reload now';
|
|
30
|
-
b.style.cssText = 'font:inherit;padding:.5rem 1rem;border-radius:.5rem;border:1px solid #fff;background:#fff;color:#1d1d1d;cursor:pointer';
|
|
31
|
-
b.addEventListener('click', () => location.reload());
|
|
32
|
-
d.append(t, b);
|
|
33
|
-
document.body.append(d);
|
|
34
|
-
};
|
|
35
|
-
const go = () => {
|
|
36
|
-
if (acted) return;
|
|
37
|
-
acted = true;
|
|
38
|
-
if (drafting()) { acted = false; banner(); return; }
|
|
39
|
-
location.reload();
|
|
40
|
-
};
|
|
41
|
-
// A worker taking over a page that has been open a while is a new build;
|
|
42
|
-
// in a page's first seconds it is the boot, not an update.
|
|
43
|
-
if ('serviceWorker' in navigator) {
|
|
44
|
-
navigator.serviceWorker.addEventListener('controllerchange', () => { if (Date.now() - loadedAt > 5000) go(); });
|
|
45
|
-
}
|
|
46
|
-
const check = async () => {
|
|
47
|
-
try {
|
|
48
|
-
// The build first: it moves with every deploy. The version is the
|
|
49
|
-
// fallback for a page staged before builds were stamped.
|
|
50
|
-
if (myBuild) {
|
|
51
|
-
const b = await fetch('/build.json', { cache: 'no-store', headers: { accept: 'application/json' } })
|
|
52
|
-
.then(x => (x.ok ? x.json() : null)).catch(() => null);
|
|
53
|
-
if (b?.build && b.build !== myBuild) { go(); return; }
|
|
54
|
-
// A build that matched is the whole answer. Falling through here asked
|
|
55
|
-
// the site's function the same question once a minute from every open
|
|
56
|
-
// tab, for nothing — a third of everything the site was doing.
|
|
57
|
-
if (b?.build) return;
|
|
58
|
-
}
|
|
59
|
-
const r = await fetch('/api/handle?handle=__probe__', { cache: 'no-store', headers: { accept: 'application/json' } });
|
|
60
|
-
const v = (await r.json())?.version;
|
|
61
|
-
if (!v || v === mine) return;
|
|
62
|
-
const reg = await navigator.serviceWorker.getRegistration();
|
|
63
|
-
await reg?.update().catch(() => {});
|
|
64
|
-
setTimeout(go, 4000); // a pages-only change: no new worker will take over
|
|
65
|
-
} catch { /* offline, or the site did not answer: try again later */ }
|
|
66
|
-
};
|
|
67
|
-
// Often enough that a reader watching a page being worked on sees it.
|
|
68
|
-
setTimeout(check, 5000);
|
|
69
|
-
setInterval(check, 60 * 1000);
|
|
70
|
-
})();
|
package/web/front/admin.html
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<title>FediPod — accounts on this server</title>
|
|
7
|
-
<link rel="icon" href="/icons/gateway.svg" type="image/svg+xml">
|
|
8
|
-
<style>
|
|
9
|
-
:root { color-scheme: light dark; --line:#d9d4c7; --dim:#45443d; --accent:#6a8a5a; }
|
|
10
|
-
@media (prefers-color-scheme: dark) { :root { --dim:#c2c0b4; } }
|
|
11
|
-
body { font: 20px/1.6 Arial, Helvetica, sans-serif; max-width: 44rem; margin: 2rem auto; padding: 0 1.1rem; }
|
|
12
|
-
h1 { font-size: 1.7rem; margin: 0 0 .2rem; }
|
|
13
|
-
p.lede { color: var(--dim); margin-top: 0; }
|
|
14
|
-
label { display: block; font-weight: 600; margin: .8rem 0 .2rem; }
|
|
15
|
-
input[type=url] { width: 100%; padding: .5rem .6rem; font: inherit;
|
|
16
|
-
border: 1px solid var(--line); border-radius: 8px; box-sizing: border-box; }
|
|
17
|
-
.hint { color: var(--dim); font-size: .95rem; }
|
|
18
|
-
.primary { background: var(--accent); color: #fff; border: none; border-radius: 9px;
|
|
19
|
-
padding: .6rem 1.1rem; font: inherit; cursor: pointer; }
|
|
20
|
-
.primary[disabled] { opacity: .5; cursor: not-allowed; }
|
|
21
|
-
button { font: inherit; cursor: pointer; }
|
|
22
|
-
[hidden] { display: none !important; }
|
|
23
|
-
table { border-collapse: collapse; width: 100%; margin: 1.2rem 0; }
|
|
24
|
-
th, td { text-align: left; padding: .5rem .7rem; border-bottom: 1px solid var(--line); }
|
|
25
|
-
th { font-weight: 600; }
|
|
26
|
-
</style>
|
|
27
|
-
</head>
|
|
28
|
-
<body>
|
|
29
|
-
<h1>Accounts on this server</h1>
|
|
30
|
-
<p class="lede">Every name this server answers for: accounts whose identity lives here, and
|
|
31
|
-
accounts that only use it as their gateway. Sign in as the server's admin to see them.
|
|
32
|
-
<a href="/notices">Notices</a> — what every account sees behind the bell in its bar — are
|
|
33
|
-
written on their own page.</p>
|
|
34
|
-
|
|
35
|
-
<form id="roster-form">
|
|
36
|
-
<p class="field">
|
|
37
|
-
<label for="roster-issuer">Your identity provider</label>
|
|
38
|
-
<input type="url" id="roster-issuer" autocomplete="off" value="https://solidcommunity.net">
|
|
39
|
-
</p>
|
|
40
|
-
<p class="actions">
|
|
41
|
-
<button type="submit" id="roster-signin" class="primary">Sign in & list accounts</button>
|
|
42
|
-
</p>
|
|
43
|
-
<p class="hint" id="roster-note" hidden></p>
|
|
44
|
-
</form>
|
|
45
|
-
|
|
46
|
-
<table id="roster-table" hidden>
|
|
47
|
-
<thead>
|
|
48
|
-
<tr><th>Account</th><th>Kind</th><th>Identity</th><th>Pod</th><th>Remove</th></tr>
|
|
49
|
-
</thead>
|
|
50
|
-
<tbody id="roster-rows"></tbody>
|
|
51
|
-
</table>
|
|
52
|
-
|
|
53
|
-
<script type="module" src="/admin.js"></script>
|
|
54
|
-
</body>
|
|
55
|
-
</html>
|
package/web/front/admin.js
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
// admin.js — the roster page's script, in a file of its own.
|
|
2
|
-
//
|
|
3
|
-
// It lived inline in admin.html until 2026-09-09. Out here the page can be
|
|
4
|
-
// served under `script-src 'self'`, which is what stops a stray bit of markup
|
|
5
|
-
// from becoming running code; inline script cannot be told apart from injected
|
|
6
|
-
// script by any policy. Served by the front at /admin.js.
|
|
7
|
-
const $ = (id) => document.getElementById(id);
|
|
8
|
-
const note = (text) => { const n = $('roster-note'); n.hidden = !text; n.textContent = text || ''; };
|
|
9
|
-
|
|
10
|
-
// The Solid-OIDC client for the sign-in round trip. Constructed once; the
|
|
11
|
-
// redirect state lives in this tab's sessionStorage, so the same session
|
|
12
|
-
// finishes the login on the way back.
|
|
13
|
-
let session = null;
|
|
14
|
-
try {
|
|
15
|
-
const { SessionCore } = await import('/solid-oidc-client.js');
|
|
16
|
-
session = new SessionCore({ redirect_uris: [location.origin + '/roster'], client_name: 'FediPod admin' });
|
|
17
|
-
} catch { /* leave null — the "did not load" note fires */ }
|
|
18
|
-
|
|
19
|
-
$('roster-issuer').addEventListener('input', () => {
|
|
20
|
-
$('roster-signin').disabled = !/^https?:\/\/\S+/.test($('roster-issuer').value.trim());
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
$('roster-form').addEventListener('submit', (ev) => {
|
|
24
|
-
ev.preventDefault();
|
|
25
|
-
if (!session) { note('the sign-in library did not load — reload and try again'); return; }
|
|
26
|
-
session.login($('roster-issuer').value.trim(), location.origin + '/roster')
|
|
27
|
-
.catch((e) => note('sign-in failed to start: ' + e.message));
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
// Back from the identity provider: read the roster with the proven login.
|
|
31
|
-
(async () => {
|
|
32
|
-
if (!session) return;
|
|
33
|
-
await session.handleRedirectFromLogin().catch(() => {});
|
|
34
|
-
if (!session.isActive) return;
|
|
35
|
-
const webId = session.webId;
|
|
36
|
-
|
|
37
|
-
// Signed fetches build a DPoP proof from the URL, so it must be absolute.
|
|
38
|
-
const load = async () => {
|
|
39
|
-
let res;
|
|
40
|
-
try { res = await session.authFetch(location.origin + '/api/roster'); }
|
|
41
|
-
catch (e) { note('the roster request failed: ' + e.message); return; }
|
|
42
|
-
const d = await res.json().catch(() => ({}));
|
|
43
|
-
if (res.status === 403) { note('signed in as ' + webId + ', which is not this server’s admin'); return; }
|
|
44
|
-
if (res.status === 501) { note('this server names no admin — set FEDIPOD_ADMIN_WEBID and redeploy'); return; }
|
|
45
|
-
if (res.status !== 200) { note('roster unavailable: ' + (d.error || 'HTTP ' + res.status)); return; }
|
|
46
|
-
const rows = $('roster-rows');
|
|
47
|
-
rows.textContent = '';
|
|
48
|
-
for (const a of d.accounts || []) {
|
|
49
|
-
const tr = document.createElement('tr');
|
|
50
|
-
const cell = (child) => { const td = document.createElement('td'); td.append(child); tr.append(td); };
|
|
51
|
-
cell(a.address);
|
|
52
|
-
cell(a.kind);
|
|
53
|
-
cell(a.fronted ? 'lives here' : 'gateway only');
|
|
54
|
-
const pod = document.createElement('a');
|
|
55
|
-
// The pod as a person names it: its host, plus its path for a pod on a
|
|
56
|
-
// path of a shared host. The trailing segment is the FediPod root.
|
|
57
|
-
const u = new URL(a.podHome);
|
|
58
|
-
pod.href = a.podHome;
|
|
59
|
-
pod.textContent = u.host + u.pathname.replace(/[^/]+\/$/u, '').replace(/\/$/u, '');
|
|
60
|
-
cell(pod);
|
|
61
|
-
const rm = document.createElement('button');
|
|
62
|
-
rm.type = 'button'; rm.textContent = 'Remove';
|
|
63
|
-
rm.onclick = () => revoke(a);
|
|
64
|
-
cell(rm);
|
|
65
|
-
rows.append(tr);
|
|
66
|
-
}
|
|
67
|
-
$('roster-table').hidden = false;
|
|
68
|
-
note((d.accounts || []).length + ' account(s) on ' + d.host);
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
const revoke = async (a) => {
|
|
72
|
-
if (!confirm('Remove ' + a.address + ' from this server? The name stops resolving here; nothing on their pod is touched.')) return;
|
|
73
|
-
let res;
|
|
74
|
-
try {
|
|
75
|
-
res = await session.authFetch(location.origin + '/api/revoke', {
|
|
76
|
-
method: 'POST', headers: { 'content-type': 'application/json' },
|
|
77
|
-
body: JSON.stringify({ handle: a.handle }),
|
|
78
|
-
});
|
|
79
|
-
} catch (e) { note('the remove request failed: ' + e.message); return; }
|
|
80
|
-
const d = await res.json().catch(() => ({}));
|
|
81
|
-
if (res.status !== 200) { note('remove refused: ' + (d.error || 'HTTP ' + res.status)); return; }
|
|
82
|
-
if (!d.removed) { note(a.address + ' stays: ' + d.reason); return; }
|
|
83
|
-
await load();
|
|
84
|
-
note('removed ' + a.address);
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
note('signed in as ' + webId + ' — reading the roster…');
|
|
88
|
-
await load();
|
|
89
|
-
})();
|
package/web/front/install.sh
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
#!/bin/sh
|
|
2
|
-
# FediPod installer. Usage: curl -fsSL https://fedipod.net/install | sh
|
|
3
|
-
# Installs into ~/FediPod (or $FEDIPOD_DIR); re-running updates the install.
|
|
4
|
-
#
|
|
5
|
-
# A signup page may append parameters (sh -s -- --gateway ... --secret ...);
|
|
6
|
-
# they are saved for the first start, whose setup opens pre-filled and
|
|
7
|
-
# attaches to the gateway when it completes.
|
|
8
|
-
set -eu
|
|
9
|
-
|
|
10
|
-
REPO="https://github.com/jeff-zucker/FediPod"
|
|
11
|
-
DIR="${FEDIPOD_DIR:-$HOME/FediPod}"
|
|
12
|
-
|
|
13
|
-
say() { printf '%s\n' "$*"; }
|
|
14
|
-
fail() { printf 'fedipod install: %s\n' "$*" >&2; exit 1; }
|
|
15
|
-
|
|
16
|
-
GATEWAY= SECRET= POD= ISSUER= HANDLE= KIND=person FRONTED=false
|
|
17
|
-
while [ $# -gt 0 ]; do
|
|
18
|
-
case "$1" in
|
|
19
|
-
--gateway) GATEWAY=$2; shift 2;;
|
|
20
|
-
--secret) SECRET=$2; shift 2;;
|
|
21
|
-
--pod) POD=$2; shift 2;;
|
|
22
|
-
--issuer) ISSUER=$2; shift 2;;
|
|
23
|
-
--handle) HANDLE=$2; shift 2;;
|
|
24
|
-
--kind) KIND=$2; shift 2;;
|
|
25
|
-
--fronted) FRONTED=true; shift;;
|
|
26
|
-
*) fail "unknown option $1";;
|
|
27
|
-
esac
|
|
28
|
-
done
|
|
29
|
-
|
|
30
|
-
command -v git >/dev/null 2>&1 || fail "git is required — install it from https://git-scm.com/ and re-run"
|
|
31
|
-
command -v node >/dev/null 2>&1 || fail "node 20 or newer is required — install it from https://nodejs.org/ and re-run"
|
|
32
|
-
command -v npm >/dev/null 2>&1 || fail "npm is required (it ships with node) — install node from https://nodejs.org/ and re-run"
|
|
33
|
-
|
|
34
|
-
major=$(node -v | sed 's/^v//' | cut -d. -f1)
|
|
35
|
-
[ "$major" -ge 20 ] 2>/dev/null || fail "node 20 or newer is required (found $(node -v))"
|
|
36
|
-
|
|
37
|
-
if [ -d "$DIR/.git" ]; then
|
|
38
|
-
say "updating the existing install in $DIR"
|
|
39
|
-
git -C "$DIR" pull --ff-only || fail "could not update $DIR — it has local changes; update it by hand"
|
|
40
|
-
elif [ -e "$DIR" ]; then
|
|
41
|
-
fail "$DIR exists and is not a FediPod checkout — set FEDIPOD_DIR to another location and re-run"
|
|
42
|
-
else
|
|
43
|
-
say "installing into $DIR"
|
|
44
|
-
git clone --depth 1 "$REPO" "$DIR"
|
|
45
|
-
fi
|
|
46
|
-
|
|
47
|
-
cd "$DIR"
|
|
48
|
-
npm install --omit=dev --no-audit --no-fund
|
|
49
|
-
|
|
50
|
-
# Put `fedipod` on PATH, the same command an `npm install -g fedipod` gives.
|
|
51
|
-
# Everything printed from here on — the docs, the agent's own advice, the
|
|
52
|
-
# command a signup page hands you — names it that way, and a checkout that
|
|
53
|
-
# skipped this step could run none of them.
|
|
54
|
-
if npm link >/dev/null 2>&1; then
|
|
55
|
-
say "linked: the fedipod command is on your PATH"
|
|
56
|
-
else
|
|
57
|
-
say "note: could not link the fedipod command — run it as: node $DIR/bin/fedipod.mjs"
|
|
58
|
-
fi
|
|
59
|
-
|
|
60
|
-
if [ -n "$HANDLE" ]; then
|
|
61
|
-
printf '{"handle":"%s","kind":"%s","pod":"%s","issuer":"%s","gateway":"%s","secret":"%s","fronted":%s}\n' \
|
|
62
|
-
"$HANDLE" "$KIND" "$POD" "$ISSUER" "$GATEWAY" "$SECRET" "$FRONTED" > "$DIR/first-run.json"
|
|
63
|
-
chmod 600 "$DIR/first-run.json"
|
|
64
|
-
fi
|
|
65
|
-
|
|
66
|
-
say ""
|
|
67
|
-
say "Installed. To start (first run opens setup in your browser):"
|
|
68
|
-
say ""
|
|
69
|
-
say " fedipod start"
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<title>FediPod — access the Fediverse and ATProto from a Solid pod</title>
|
|
7
|
-
<link rel="icon" href="/icons/gateway.svg" type="image/svg+xml">
|
|
8
|
-
<style>
|
|
9
|
-
:root { color-scheme: light dark; --line:#d9d4c7; --dim:#45443d; --accent:#6a8a5a; }
|
|
10
|
-
@media (prefers-color-scheme: dark) { :root { --dim:#c2c0b4; } }
|
|
11
|
-
body { font: 20px/1.6 Arial, Helvetica, sans-serif; max-width: 44rem; margin: 2rem auto; padding: 0 1.1rem; }
|
|
12
|
-
h1 { font-size: 1.7rem; margin: 0 0 .2rem; }
|
|
13
|
-
h2 { font-size: 1.2rem; margin: 1.4rem 0 .4rem; }
|
|
14
|
-
p.lede { color: var(--dim); margin-top: 0; }
|
|
15
|
-
.hint { color: var(--dim); font-size: .95rem; }
|
|
16
|
-
code { background: rgba(120,120,120,.12); padding: .05em .35em; border-radius: 4px; }
|
|
17
|
-
pre { background: rgba(120,120,120,.12); padding: .7rem .9rem; border-radius: 8px; overflow-x: auto; }
|
|
18
|
-
ol.steps li { margin: .5rem 0; }
|
|
19
|
-
[hidden] { display: none !important; }
|
|
20
|
-
</style>
|
|
21
|
-
</head>
|
|
22
|
-
<body>
|
|
23
|
-
<h1>FediPod - join the Fediverse from a Solid pod.</h1>
|
|
24
|
-
<p class="lede">Welcome to <b>FediPod</b>! Here, you can get a free pod and Fediverse account or link to your existing pod/account.</p>
|
|
25
|
-
|
|
26
|
-
<p class="hint" id="current-version" hidden>Current FediPod: <strong id="current-version-num"></strong><br>
|
|
27
|
-
— install or update an existing install with <code id="current-version-cmd"></code></p>
|
|
28
|
-
|
|
29
|
-
<p>
|
|
30
|
-
FediPod is experimental and free to use. See the <a href="https://github.com/jeff-zucker/FediPod">FediPod repository</a> for details.
|
|
31
|
-
</p>
|
|
32
|
-
|
|
33
|
-
<script src="/new-account.js"></script>
|
|
34
|
-
</body>
|
|
35
|
-
</html>
|
package/web/front/new-account.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
// new-account.js — the sign-up page's script, in a file of its own.
|
|
2
|
-
//
|
|
3
|
-
// It lived inline in new-account.html until 2026-09-09. Out here the page can
|
|
4
|
-
// be served under `script-src 'self'`, which is what stops a stray bit of
|
|
5
|
-
// markup from becoming running code; inline script cannot be told apart from
|
|
6
|
-
// injected script by any policy. Served by the front at /new-account.js.
|
|
7
|
-
fetch('/api/handle?handle=__probe__').then(r => r.json()).then(d => {
|
|
8
|
-
if (d.version) {
|
|
9
|
-
document.getElementById('current-version-num').textContent = d.version;
|
|
10
|
-
document.getElementById('current-version-cmd').textContent = `curl -fsSL ${location.origin}/install | sh`;
|
|
11
|
-
document.getElementById('current-version').hidden = false;
|
|
12
|
-
}
|
|
13
|
-
}).catch(() => {});
|
package/web/front/notices.html
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<title>FediPod — notices</title>
|
|
7
|
-
<link rel="icon" href="/icons/gateway.svg" type="image/svg+xml">
|
|
8
|
-
<style>
|
|
9
|
-
:root { color-scheme: light dark; --line:#d9d4c7; --dim:#45443d; --accent:#6a8a5a; --danger:#b00020; }
|
|
10
|
-
@media (prefers-color-scheme: dark) { :root { --dim:#c2c0b4; --danger:#ff8a9a; } }
|
|
11
|
-
body { font: 20px/1.6 Arial, Helvetica, sans-serif; max-width: 44rem; margin: 2rem auto; padding: 0 1.1rem; }
|
|
12
|
-
h1 { font-size: 1.7rem; margin: 0 0 .2rem; }
|
|
13
|
-
h2 { font-size: 1.25rem; margin: 1.6rem 0 .4rem; }
|
|
14
|
-
p.lede { color: var(--dim); margin-top: 0; }
|
|
15
|
-
label { display: block; font-weight: 600; margin: .8rem 0 .2rem; }
|
|
16
|
-
input[type=url], input[type=text], textarea { width: 100%; padding: .5rem .6rem; font: inherit;
|
|
17
|
-
border: 1px solid var(--line); border-radius: 8px; box-sizing: border-box; }
|
|
18
|
-
textarea { min-height: 9rem; resize: vertical; }
|
|
19
|
-
.hint { color: var(--dim); font-size: .95rem; }
|
|
20
|
-
.primary { background: var(--accent); color: #fff; border: none; border-radius: 9px;
|
|
21
|
-
padding: .6rem 1.1rem; font: inherit; cursor: pointer; }
|
|
22
|
-
.primary[disabled] { opacity: .5; cursor: not-allowed; }
|
|
23
|
-
button { font: inherit; cursor: pointer; }
|
|
24
|
-
button.danger { color: var(--danger); background: none; border: 1px solid var(--danger); border-radius: 9px; padding: .4rem .8rem; }
|
|
25
|
-
[hidden] { display: none !important; }
|
|
26
|
-
ul.notices { list-style: none; padding: 0; margin: 1rem 0; }
|
|
27
|
-
ul.notices li { padding: .8rem 0; border-bottom: 1px solid var(--line); }
|
|
28
|
-
ul.notices .title { font-weight: 600; }
|
|
29
|
-
ul.notices .when { color: var(--dim); font-size: .95rem; margin-left: .6rem; }
|
|
30
|
-
ul.notices .body { white-space: pre-wrap; margin: .3rem 0 .6rem; }
|
|
31
|
-
ul.notices .actions button { margin-right: .6rem; }
|
|
32
|
-
</style>
|
|
33
|
-
</head>
|
|
34
|
-
<body>
|
|
35
|
-
<h1>Notices</h1>
|
|
36
|
-
<p class="lede">What every account on this server sees behind the bell in its bar. Sign in as the
|
|
37
|
-
server's admin to write, change or remove them. <a href="/roster">Back to the roster.</a></p>
|
|
38
|
-
|
|
39
|
-
<form id="notices-form">
|
|
40
|
-
<p class="field">
|
|
41
|
-
<label for="notices-issuer">Your identity provider</label>
|
|
42
|
-
<input type="url" id="notices-issuer" autocomplete="off" value="https://solidcommunity.net">
|
|
43
|
-
</p>
|
|
44
|
-
<p class="actions">
|
|
45
|
-
<button type="submit" id="notices-signin" class="primary">Sign in & manage notices</button>
|
|
46
|
-
</p>
|
|
47
|
-
<p class="hint" id="notices-note" hidden></p>
|
|
48
|
-
</form>
|
|
49
|
-
|
|
50
|
-
<section id="notices-editor" hidden>
|
|
51
|
-
<h2 id="editor-title">New notice</h2>
|
|
52
|
-
<form id="editor-form">
|
|
53
|
-
<label for="notice-title">Title</label>
|
|
54
|
-
<input type="text" id="notice-title" maxlength="120" autocomplete="off" required>
|
|
55
|
-
<label for="notice-body">Text</label>
|
|
56
|
-
<textarea id="notice-body" maxlength="4000" required></textarea>
|
|
57
|
-
<p class="hint">Plain text. A blank line starts a new paragraph; a web address becomes a link.</p>
|
|
58
|
-
<p class="actions">
|
|
59
|
-
<button type="submit" id="notice-save" class="primary">Publish</button>
|
|
60
|
-
<button type="button" id="notice-cancel" hidden>Cancel</button>
|
|
61
|
-
</p>
|
|
62
|
-
</form>
|
|
63
|
-
<h2>Published</h2>
|
|
64
|
-
<ul class="notices" id="notices-list"></ul>
|
|
65
|
-
</section>
|
|
66
|
-
|
|
67
|
-
<script type="module" src="/notices.js"></script>
|
|
68
|
-
</body>
|
|
69
|
-
</html>
|
package/web/front/notices.js
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
// notices.js — the notices page's script: the admin signs in, then writes,
|
|
2
|
-
// changes and removes the notices every account here sees behind the bell.
|
|
3
|
-
// Served by the front at /notices.js, like admin.js for the roster.
|
|
4
|
-
const $ = (id) => document.getElementById(id);
|
|
5
|
-
const note = (text) => { const n = $('notices-note'); n.hidden = !text; n.textContent = text || ''; };
|
|
6
|
-
|
|
7
|
-
let session = null;
|
|
8
|
-
try {
|
|
9
|
-
const { SessionCore } = await import('/solid-oidc-client.js');
|
|
10
|
-
session = new SessionCore({ redirect_uris: [location.origin + '/notices'], client_name: 'FediPod admin' });
|
|
11
|
-
} catch { /* leave null — the "did not load" note fires */ }
|
|
12
|
-
|
|
13
|
-
$('notices-issuer').addEventListener('input', () => {
|
|
14
|
-
$('notices-signin').disabled = !/^https?:\/\/\S+/.test($('notices-issuer').value.trim());
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
$('notices-form').addEventListener('submit', (ev) => {
|
|
18
|
-
ev.preventDefault();
|
|
19
|
-
if (!session) { note('the sign-in library did not load — reload and try again'); return; }
|
|
20
|
-
session.login($('notices-issuer').value.trim(), location.origin + '/notices')
|
|
21
|
-
.catch((e) => note('sign-in failed to start: ' + e.message));
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
(async () => {
|
|
25
|
-
if (!session) return;
|
|
26
|
-
await session.handleRedirectFromLogin().catch(() => {});
|
|
27
|
-
if (!session.isActive) return;
|
|
28
|
-
const webId = session.webId;
|
|
29
|
-
let editing = null; // the notice being changed, or null for a new one
|
|
30
|
-
|
|
31
|
-
const when = (iso) => { try { return new Date(iso).toLocaleString(); } catch { return iso; } };
|
|
32
|
-
|
|
33
|
-
const send = async (body) => {
|
|
34
|
-
let res;
|
|
35
|
-
try {
|
|
36
|
-
res = await session.authFetch(location.origin + '/api/notices', {
|
|
37
|
-
method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(body),
|
|
38
|
-
});
|
|
39
|
-
} catch (e) { note('the request failed: ' + e.message); return null; }
|
|
40
|
-
const d = await res.json().catch(() => ({}));
|
|
41
|
-
if (res.status === 403) { note('signed in as ' + webId + ', which is not this server’s admin'); return null; }
|
|
42
|
-
if (res.status === 501) { note('this server keeps no notices'); return null; }
|
|
43
|
-
if (res.status >= 400) { note('refused: ' + (d.error || 'HTTP ' + res.status)); return null; }
|
|
44
|
-
return d;
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const startEdit = (n) => {
|
|
48
|
-
editing = n;
|
|
49
|
-
$('editor-title').textContent = n ? 'Change this notice' : 'New notice';
|
|
50
|
-
$('notice-title').value = n ? n.title : '';
|
|
51
|
-
$('notice-body').value = n ? n.body : '';
|
|
52
|
-
$('notice-save').textContent = n ? 'Save changes' : 'Publish';
|
|
53
|
-
$('notice-cancel').hidden = !n;
|
|
54
|
-
$('notice-title').focus();
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
const load = async () => {
|
|
58
|
-
let res;
|
|
59
|
-
try { res = await fetch(location.origin + '/api/notices', { headers: { accept: 'application/json' }, cache: 'no-store' }); }
|
|
60
|
-
catch (e) { note('the notices could not be read: ' + e.message); return; }
|
|
61
|
-
if (res.status === 501) { note('this server keeps no notices'); return; }
|
|
62
|
-
const d = await res.json().catch(() => ({}));
|
|
63
|
-
const ul = $('notices-list');
|
|
64
|
-
ul.textContent = '';
|
|
65
|
-
for (const n of d.notices || []) {
|
|
66
|
-
const li = document.createElement('li');
|
|
67
|
-
const head = document.createElement('div');
|
|
68
|
-
const t = document.createElement('span'); t.className = 'title'; t.textContent = n.title;
|
|
69
|
-
const w = document.createElement('span'); w.className = 'when';
|
|
70
|
-
w.textContent = when(n.at) + (n.updatedAt && n.updatedAt !== n.at ? ' (changed ' + when(n.updatedAt) + ')' : '');
|
|
71
|
-
head.append(t, w);
|
|
72
|
-
const b = document.createElement('p'); b.className = 'body'; b.textContent = n.body;
|
|
73
|
-
const acts = document.createElement('p'); acts.className = 'actions';
|
|
74
|
-
const edit = document.createElement('button'); edit.type = 'button'; edit.textContent = 'Change';
|
|
75
|
-
edit.onclick = () => startEdit(n);
|
|
76
|
-
const rm = document.createElement('button'); rm.type = 'button'; rm.textContent = 'Remove'; rm.className = 'danger';
|
|
77
|
-
rm.onclick = async () => {
|
|
78
|
-
if (!confirm('Remove the notice “' + n.title + '”? Everyone stops seeing it.')) return;
|
|
79
|
-
if (await send({ action: 'delete', id: n.id })) { note('removed “' + n.title + '”'); await load(); }
|
|
80
|
-
};
|
|
81
|
-
acts.append(edit, rm);
|
|
82
|
-
li.append(head, b, acts);
|
|
83
|
-
ul.append(li);
|
|
84
|
-
}
|
|
85
|
-
if (!(d.notices || []).length) { const li = document.createElement('li'); li.textContent = 'No notices yet.'; ul.append(li); }
|
|
86
|
-
$('notices-editor').hidden = false;
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
$('editor-form').addEventListener('submit', async (ev) => {
|
|
90
|
-
ev.preventDefault();
|
|
91
|
-
const title = $('notice-title').value.trim();
|
|
92
|
-
const body = $('notice-body').value.trim();
|
|
93
|
-
if (!title || !body) { note('a title and a text are both needed'); return; }
|
|
94
|
-
$('notice-save').disabled = true;
|
|
95
|
-
const r = await send(editing ? { action: 'update', id: editing.id, title, body } : { action: 'create', title, body });
|
|
96
|
-
$('notice-save').disabled = false;
|
|
97
|
-
if (!r) return;
|
|
98
|
-
note(editing ? 'changed “' + title + '”' : 'published “' + title + '” — everyone sees it within a minute');
|
|
99
|
-
startEdit(null);
|
|
100
|
-
await load();
|
|
101
|
-
});
|
|
102
|
-
$('notice-cancel').addEventListener('click', () => startEdit(null));
|
|
103
|
-
|
|
104
|
-
note('signed in as ' + webId);
|
|
105
|
-
$('notices-form').hidden = true;
|
|
106
|
-
await load();
|
|
107
|
-
})();
|
package/web/front/run.html
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<title>FediPod — turn your pod into a Fediverse account</title>
|
|
7
|
-
<link rel="icon" href="/icons/gateway.svg" type="image/svg+xml">
|
|
8
|
-
<style>
|
|
9
|
-
:root { color-scheme: light dark; --line:#d9d4c7; --dim:#45443d; --accent:#6a8a5a; }
|
|
10
|
-
@media (prefers-color-scheme: dark) { :root { --dim:#c2c0b4; } }
|
|
11
|
-
body { font: 20px/1.6 Arial, Helvetica, sans-serif; max-width: 44rem; margin: 2rem auto; padding: 0 1.1rem; }
|
|
12
|
-
h1 { font-size: 1.7rem; margin: 0 0 .2rem; }
|
|
13
|
-
p.lede { color: var(--dim); margin-top: 0; }
|
|
14
|
-
label { display: block; font-weight: 600; margin: .8rem 0 .2rem; }
|
|
15
|
-
input[type=text], input[type=url] { width: 100%; padding: .5rem .6rem; font: inherit;
|
|
16
|
-
border: 1px solid var(--line); border-radius: 8px; box-sizing: border-box; }
|
|
17
|
-
.hint { color: var(--dim); font-size: .95rem; }
|
|
18
|
-
.pod { border: 1px solid var(--line); border-radius: 9px; padding: .9rem 1.1rem; margin: .8rem 0; }
|
|
19
|
-
.pod p { margin: .3rem 0; }
|
|
20
|
-
.pod .actions { margin-top: .8rem; }
|
|
21
|
-
.primary { background: var(--accent); color: #fff; border: none; border-radius: 9px;
|
|
22
|
-
padding: .6rem 1.1rem; font: inherit; cursor: pointer; }
|
|
23
|
-
button { font: inherit; }
|
|
24
|
-
.primary[disabled], button[disabled] { opacity: .5; cursor: not-allowed; }
|
|
25
|
-
[hidden] { display: none !important; }
|
|
26
|
-
code { background: rgba(120,120,120,.12); padding: .05em .35em; border-radius: 4px; }
|
|
27
|
-
.pod code { background: #fff3c4; color: #1a1a1a; font-size: 16px; }
|
|
28
|
-
@media (prefers-color-scheme: dark) { .pod code { background: #5a4a00; color: #fff; } }
|
|
29
|
-
pre { background: rgba(120,120,120,.12); padding: .7rem .9rem; border-radius: 8px; overflow-x: auto; }
|
|
30
|
-
</style>
|
|
31
|
-
</head>
|
|
32
|
-
<body>
|
|
33
|
-
<h1>Turn your pod into a Fediverse account</h1>
|
|
34
|
-
<p class="lede">Users with pods on this server may opt-in below to create a Fediverse account
|
|
35
|
-
that stores your data on your pod. You'll be able to interact with Mastodon and users of other
|
|
36
|
-
Fediverse services straight from your pod.</p>
|
|
37
|
-
|
|
38
|
-
<section id="run-known" hidden aria-live="polite"></section>
|
|
39
|
-
|
|
40
|
-
<form id="run-form">
|
|
41
|
-
<p class="field">
|
|
42
|
-
<label for="run-pod-url">Your pod's address on this server</label>
|
|
43
|
-
<input type="url" id="run-pod-url" autocomplete="off" placeholder="https://you.this.server/">
|
|
44
|
-
</p>
|
|
45
|
-
<p class="field">
|
|
46
|
-
<label for="run-issuer">Your identity provider</label>
|
|
47
|
-
<input type="url" id="run-issuer" autocomplete="off" placeholder="https://this.server">
|
|
48
|
-
</p>
|
|
49
|
-
<p class="field">
|
|
50
|
-
<label for="run-container">Store your data in a container named fedipod, inside this container</label>
|
|
51
|
-
<input type="text" id="run-container" autocomplete="off" spellcheck="false" placeholder="/"
|
|
52
|
-
aria-describedby="run-container-hint">
|
|
53
|
-
</p>
|
|
54
|
-
<p class="hint" id="run-container-hint">Leave it empty for your pod's root. This is permanent.</p>
|
|
55
|
-
<p class="actions">
|
|
56
|
-
<button type="button" id="run-continue" class="primary" disabled>Sign in with your pod & opt in</button>
|
|
57
|
-
<button type="button" id="run-leave">Stop running it here</button>
|
|
58
|
-
</p>
|
|
59
|
-
</form>
|
|
60
|
-
<div class="hint" id="run-note" hidden></div>
|
|
61
|
-
|
|
62
|
-
<script type="module" src="/run.js"></script>
|
|
63
|
-
</body>
|
|
64
|
-
</html>
|