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.
Files changed (444) hide show
  1. package/README.md +16 -6
  2. package/dist/claims.d.ts +2 -0
  3. package/dist/claims.js +13 -4
  4. package/dist/door.d.ts +4 -0
  5. package/dist/door.js +31 -0
  6. package/dist/fedipod.d.ts +15 -0
  7. package/dist/fedipod.js +13 -0
  8. package/dist/front.d.ts +3 -0
  9. package/dist/front.js +92 -0
  10. package/dist/handler.d.ts +36 -101
  11. package/dist/handler.js +93 -644
  12. package/dist/handler.jsonld +2 -30
  13. package/dist/identities.d.ts +71 -0
  14. package/dist/identities.js +236 -0
  15. package/dist/mounts.d.ts +43 -0
  16. package/dist/mounts.js +123 -0
  17. package/dist/opt-in.d.ts +46 -0
  18. package/dist/opt-in.js +176 -0
  19. package/dist/private-read.d.ts +4 -0
  20. package/dist/private-read.js +34 -0
  21. package/package.json +12 -20
  22. package/lib/client/c2s.mjs +0 -636
  23. package/lib/client/localapi.mjs +0 -87
  24. package/lib/client/masto/accounts.mjs +0 -310
  25. package/lib/client/masto/body.mjs +0 -156
  26. package/lib/client/masto/index.mjs +0 -206
  27. package/lib/client/masto/instance.mjs +0 -112
  28. package/lib/client/masto/media.mjs +0 -79
  29. package/lib/client/masto/oauth.mjs +0 -656
  30. package/lib/client/masto/render.mjs +0 -518
  31. package/lib/client/masto/statuses.mjs +0 -372
  32. package/lib/client/masto/timelines.mjs +0 -438
  33. package/lib/client/oidc-auth.mjs +0 -62
  34. package/lib/client/streaming.mjs +0 -154
  35. package/lib/client/webpush.mjs +0 -98
  36. package/lib/connections/acctfeed.mjs +0 -257
  37. package/lib/connections/atproto.mjs +0 -309
  38. package/lib/connections/bskyfeed.mjs +0 -243
  39. package/lib/connections/bskygroup.mjs +0 -162
  40. package/lib/connections/fediacct.mjs +0 -253
  41. package/lib/connections/import.mjs +0 -357
  42. package/lib/connections/tagfeed.mjs +0 -212
  43. package/lib/connections/vault.mjs +0 -114
  44. package/lib/core/as2.mjs +0 -206
  45. package/lib/core/contexts/activitystreams.json +0 -379
  46. package/lib/core/contexts/anno.json +0 -126
  47. package/lib/core/contexts/did-v1.json +0 -57
  48. package/lib/core/contexts/fep-5711.json +0 -36
  49. package/lib/core/contexts/gotosocial.json +0 -86
  50. package/lib/core/contexts/identity-v1.json +0 -152
  51. package/lib/core/contexts/index.mjs +0 -63
  52. package/lib/core/contexts/join-lemmy.json +0 -33
  53. package/lib/core/contexts/joinmastodon.json +0 -28
  54. package/lib/core/contexts/litepub-0.1.json +0 -60
  55. package/lib/core/contexts/map.json +0 -19
  56. package/lib/core/contexts/miscellany.json +0 -19
  57. package/lib/core/contexts/quotes.json +0 -18
  58. package/lib/core/contexts/schemaorg.json +0 -8845
  59. package/lib/core/contexts/security-data-integrity-v1.json +0 -78
  60. package/lib/core/contexts/security-data-integrity-v2.json +0 -81
  61. package/lib/core/contexts/security-multikey-v1.json +0 -35
  62. package/lib/core/contexts/security-v1.json +0 -74
  63. package/lib/core/contexts/webfinger.json +0 -10
  64. package/lib/core/deliver.mjs +0 -387
  65. package/lib/core/graphview.mjs +0 -327
  66. package/lib/core/intake/activities.mjs +0 -649
  67. package/lib/core/intake/activity.mjs +0 -318
  68. package/lib/core/intake/channel.mjs +0 -144
  69. package/lib/core/intake/group.mjs +0 -258
  70. package/lib/core/intake/index.mjs +0 -732
  71. package/lib/core/intake/notes.mjs +0 -367
  72. package/lib/core/intake/verify.mjs +0 -142
  73. package/lib/core/keys.mjs +0 -153
  74. package/lib/core/lease.mjs +0 -206
  75. package/lib/core/place.mjs +0 -82
  76. package/lib/core/polls.mjs +0 -105
  77. package/lib/core/profile-page.mjs +0 -104
  78. package/lib/core/proof.mjs +0 -79
  79. package/lib/core/publisher/collections.mjs +0 -272
  80. package/lib/core/publisher/index.mjs +0 -522
  81. package/lib/core/publisher/notes.mjs +0 -519
  82. package/lib/core/publisher/own.mjs +0 -143
  83. package/lib/core/publisher/questions.mjs +0 -241
  84. package/lib/core/publisher/restore.mjs +0 -224
  85. package/lib/core/shapes/activitystreams.ttl +0 -157
  86. package/lib/core/shapes/index.mjs +0 -132
  87. package/lib/core/shapes/shapes-text.mjs +0 -13
  88. package/lib/core/social.mjs +0 -561
  89. package/lib/core/storage.mjs +0 -176
  90. package/lib/core/store.mjs +0 -578
  91. package/lib/core/wire-quotes.mjs +0 -71
  92. package/lib/core/wire.mjs +0 -925
  93. package/lib/device/account.mjs +0 -87
  94. package/lib/device/admin/index.mjs +0 -13
  95. package/lib/device/admin/origins.mjs +0 -35
  96. package/lib/device/admin/routes/connections.mjs +0 -144
  97. package/lib/device/admin/routes/gateway.mjs +0 -199
  98. package/lib/device/admin/routes/lifecycle.mjs +0 -200
  99. package/lib/device/admin/routes/owner.mjs +0 -322
  100. package/lib/device/admin/routes/setup.mjs +0 -428
  101. package/lib/device/admin/routes/social.mjs +0 -188
  102. package/lib/device/admin/server.mjs +0 -95
  103. package/lib/device/admin/static.mjs +0 -247
  104. package/lib/device/admin/surface.mjs +0 -315
  105. package/lib/device/certs.mjs +0 -281
  106. package/lib/device/cli/commands/account.mjs +0 -586
  107. package/lib/device/cli/commands/run.mjs +0 -278
  108. package/lib/device/cli/commands/service.mjs +0 -221
  109. package/lib/device/cli/commands/setup.mjs +0 -489
  110. package/lib/device/cli/commands/state.mjs +0 -561
  111. package/lib/device/cli/context.mjs +0 -288
  112. package/lib/device/export-collections.mjs +0 -161
  113. package/lib/device/gateway-move.mjs +0 -58
  114. package/lib/device/home.mjs +0 -161
  115. package/lib/device/migrate.mjs +0 -115
  116. package/lib/device/ports.mjs +0 -27
  117. package/lib/device/remote.mjs +0 -54
  118. package/lib/device/setup.mjs +0 -496
  119. package/lib/device/update.mjs +0 -96
  120. package/lib/gateway/caches.mjs +0 -36
  121. package/lib/gateway/directory.mjs +0 -90
  122. package/lib/gateway/front-core.mjs +0 -966
  123. package/lib/gateway/gateway-core.mjs +0 -244
  124. package/lib/gateway/headers.mjs +0 -49
  125. package/lib/gateway/httpsig.mjs +0 -159
  126. package/lib/gateway/notices.mjs +0 -84
  127. package/lib/gateway/quiet.mjs +0 -189
  128. package/lib/gateway/relay-extras.mjs +0 -89
  129. package/lib/gateway/token-claims.mjs +0 -16
  130. package/lib/pod/README.md +0 -61
  131. package/lib/pod/actor.mjs +0 -96
  132. package/lib/pod/collection.mjs +0 -77
  133. package/lib/pod/containers.mjs +0 -140
  134. package/lib/pod/discovery.mjs +0 -46
  135. package/lib/pod/featured.mjs +0 -18
  136. package/lib/pod/followers.mjs +0 -24
  137. package/lib/pod/following.mjs +0 -10
  138. package/lib/pod/http.mjs +0 -74
  139. package/lib/pod/inbox.mjs +0 -166
  140. package/lib/pod/links.mjs +0 -35
  141. package/lib/pod/location.mjs +0 -52
  142. package/lib/pod/media.mjs +0 -27
  143. package/lib/pod/notes.mjs +0 -78
  144. package/lib/pod/notifications.mjs +0 -89
  145. package/lib/pod/outbox.mjs +0 -18
  146. package/lib/pod/package.json +0 -19
  147. package/lib/pod/policy.mjs +0 -58
  148. package/lib/pod/private.mjs +0 -19
  149. package/lib/pod/root.mjs +0 -104
  150. package/lib/pod/state.mjs +0 -40
  151. package/lib/pod/transport.mjs +0 -674
  152. package/lib/pod/type-index.mjs +0 -101
  153. package/lib/pod/urls.mjs +0 -91
  154. package/lib/server/embed.mjs +0 -424
  155. package/lib/session/README.md +0 -137
  156. package/lib/session/demo.html +0 -94
  157. package/lib/session/fedi-account.mjs +0 -417
  158. package/lib/session/fedi-login.mjs +0 -123
  159. package/lib/session/oidc-session.mjs +0 -233
  160. package/lib/session/package.json +0 -49
  161. package/lib/shared/guard.mjs +0 -213
  162. package/lib/shared/links.mjs +0 -9
  163. package/lib/shared/safefetch.mjs +0 -235
  164. package/lib/shared/ua.mjs +0 -29
  165. package/phanpy/dist/404.html +0 -40
  166. package/phanpy/dist/_headers +0 -2
  167. package/phanpy/dist/apple-touch-icon.png +0 -0
  168. package/phanpy/dist/assets/ICONS-DIPJeU0C.js +0 -2
  169. package/phanpy/dist/assets/ICONS-DIPJeU0C.js.map +0 -1
  170. package/phanpy/dist/assets/ScheduledAtField-D-Abfo4J.js +0 -183
  171. package/phanpy/dist/assets/ScheduledAtField-D-Abfo4J.js.map +0 -1
  172. package/phanpy/dist/assets/Temml-CCjoacWt.woff2 +0 -0
  173. package/phanpy/dist/assets/__vite-browser-external-C7iut881.js +0 -2
  174. package/phanpy/dist/assets/__vite-browser-external-C7iut881.js.map +0 -1
  175. package/phanpy/dist/assets/boosts-carousel-BiOaNdMT.jpg +0 -0
  176. package/phanpy/dist/assets/catch-up-O5q5C75Z.png +0 -0
  177. package/phanpy/dist/assets/chunk-aKtaBQYM.js +0 -1
  178. package/phanpy/dist/assets/compose-CFEx7wb4.js +0 -2
  179. package/phanpy/dist/assets/compose-CFEx7wb4.js.map +0 -1
  180. package/phanpy/dist/assets/compose-ZJN5xSb4.js +0 -35
  181. package/phanpy/dist/assets/compose-ZJN5xSb4.js.map +0 -1
  182. package/phanpy/dist/assets/debug.module-YFQgwnIr.js +0 -52
  183. package/phanpy/dist/assets/debug.module-YFQgwnIr.js.map +0 -1
  184. package/phanpy/dist/assets/dom-p1YcJ5Rw.js +0 -2
  185. package/phanpy/dist/assets/dom-p1YcJ5Rw.js.map +0 -1
  186. package/phanpy/dist/assets/home-mobile-dark@2x-Dc-J8-SM.png +0 -0
  187. package/phanpy/dist/assets/home-mobile-light@2x-Bd3fod8m.png +0 -0
  188. package/phanpy/dist/assets/home-tablet-dark@2x-BgcNI8le.png +0 -0
  189. package/phanpy/dist/assets/home-tablet-light@2x-BW2RV9T6.png +0 -0
  190. package/phanpy/dist/assets/icons/add-circle-line-WD0mwORD.js +0 -1
  191. package/phanpy/dist/assets/icons/alert-line-CpFUMf9s.js +0 -1
  192. package/phanpy/dist/assets/icons/android-2-line-Bzxnrd3S.js +0 -1
  193. package/phanpy/dist/assets/icons/announcement-line-5nwaJFJm.js +0 -1
  194. package/phanpy/dist/assets/icons/arrow-down-circle-line-a7Id9-Iv.js +0 -1
  195. package/phanpy/dist/assets/icons/arrow-down-line-B8uzXzq6.js +0 -1
  196. package/phanpy/dist/assets/icons/arrow-left-line-CGrGT9C-.js +0 -1
  197. package/phanpy/dist/assets/icons/arrow-right-line-CE-HERfX.js +0 -1
  198. package/phanpy/dist/assets/icons/arrow-to-up-line-CvdQjmcy.js +0 -1
  199. package/phanpy/dist/assets/icons/arrow-up-circle-line-DEparSNF.js +0 -1
  200. package/phanpy/dist/assets/icons/arrow-up-line-C7yBeugc.js +0 -1
  201. package/phanpy/dist/assets/icons/arrows-right-line-BtbXmJGP.js +0 -1
  202. package/phanpy/dist/assets/icons/at-line-CF66Bznk.js +0 -1
  203. package/phanpy/dist/assets/icons/attachment-line-BY8It-l9.js +0 -1
  204. package/phanpy/dist/assets/icons/blockquote-line-BS6pU_hm.js +0 -1
  205. package/phanpy/dist/assets/icons/board-line-C0UWXyA6.js +0 -1
  206. package/phanpy/dist/assets/icons/bookmark-line-1CtX5JLF.js +0 -1
  207. package/phanpy/dist/assets/icons/building-5-line-Dd59MzbO.js +0 -1
  208. package/phanpy/dist/assets/icons/bus-2-line-6_dvA0GG.js +0 -1
  209. package/phanpy/dist/assets/icons/calendar-day-line-Crpl_fmu.js +0 -1
  210. package/phanpy/dist/assets/icons/calendar-month-line-vommts2C.js +0 -1
  211. package/phanpy/dist/assets/icons/calendar-time-add-line-BU_DTlQk.js +0 -1
  212. package/phanpy/dist/assets/icons/camera-line-Cv69MEei.js +0 -1
  213. package/phanpy/dist/assets/icons/celebrate-line-B8DvIoi0.js +0 -1
  214. package/phanpy/dist/assets/icons/chart-bar-line-FK-QOmtF.js +0 -1
  215. package/phanpy/dist/assets/icons/chart-line-line-BGcJAFWw.js +0 -1
  216. package/phanpy/dist/assets/icons/chat-3-line-YFK2-hwz.js +0 -1
  217. package/phanpy/dist/assets/icons/check-circle-line-DsAxFr5-.js +0 -1
  218. package/phanpy/dist/assets/icons/clipboard-line-BBp364gJ.js +0 -1
  219. package/phanpy/dist/assets/icons/close-circle-line-CICdiuGz.js +0 -1
  220. package/phanpy/dist/assets/icons/close-line-DYrFWcjv.js +0 -1
  221. package/phanpy/dist/assets/icons/cloud-line-tiQAbah8.js +0 -1
  222. package/phanpy/dist/assets/icons/code-line-fAl8iiV3.js +0 -1
  223. package/phanpy/dist/assets/icons/comment-2-line-CR3g7WeB.js +0 -1
  224. package/phanpy/dist/assets/icons/copy-2-line-CLW69yF5.js +0 -1
  225. package/phanpy/dist/assets/icons/delete-2-line-B8xmbr4n.js +0 -1
  226. package/phanpy/dist/assets/icons/document-3-line-DBGNhAg2.js +0 -1
  227. package/phanpy/dist/assets/icons/document-line-C7mb9sb7.js +0 -1
  228. package/phanpy/dist/assets/icons/down-line-BGqSSThd.js +0 -1
  229. package/phanpy/dist/assets/icons/edit-4-line-DcgGaEhx.js +0 -1
  230. package/phanpy/dist/assets/icons/emoji-2-line-D8YgnM-y.js +0 -1
  231. package/phanpy/dist/assets/icons/exit-line-Dc07BS-x.js +0 -1
  232. package/phanpy/dist/assets/icons/external-link-line-BvpSkmjO.js +0 -1
  233. package/phanpy/dist/assets/icons/eye-2-line-CiWXx-f_.js +0 -1
  234. package/phanpy/dist/assets/icons/eye-close-line-BgTaSJ4P.js +0 -1
  235. package/phanpy/dist/assets/icons/filter-2-line-B_mR2usy.js +0 -1
  236. package/phanpy/dist/assets/icons/filter-line-C_nm-3cU.js +0 -1
  237. package/phanpy/dist/assets/icons/flag-1-line-C2HB05I0.js +0 -1
  238. package/phanpy/dist/assets/icons/forbid-circle-line-D3LTT9yd.js +0 -1
  239. package/phanpy/dist/assets/icons/formula-line-DLrt2d6j.js +0 -1
  240. package/phanpy/dist/assets/icons/grid-line-CgUmEikf.js +0 -1
  241. package/phanpy/dist/assets/icons/group-line-C5fnX0wU.js +0 -1
  242. package/phanpy/dist/assets/icons/hand-finger-2-line-BGgxbuL9.js +0 -1
  243. package/phanpy/dist/assets/icons/hashtag-line-CyTEEXBb.js +0 -1
  244. package/phanpy/dist/assets/icons/heart-crack-line-BZddbO2C.js +0 -1
  245. package/phanpy/dist/assets/icons/heart-line-CJ7K47J4.js +0 -1
  246. package/phanpy/dist/assets/icons/history-2-line-kWWvFzqv.js +0 -1
  247. package/phanpy/dist/assets/icons/history-line-bGQiwbTH.js +0 -1
  248. package/phanpy/dist/assets/icons/home-3-line-fRU1zeLG.js +0 -1
  249. package/phanpy/dist/assets/icons/information-line-iNk6-sOY.js +0 -1
  250. package/phanpy/dist/assets/icons/keyboard-line-DsCyuQNz.js +0 -1
  251. package/phanpy/dist/assets/icons/layout-4-line-CZkOX52Z.js +0 -1
  252. package/phanpy/dist/assets/icons/layout-5-line-B_znt5wO.js +0 -1
  253. package/phanpy/dist/assets/icons/left-line-eUw0tya4.js +0 -1
  254. package/phanpy/dist/assets/icons/lightning-line-DaKoDdix.js +0 -1
  255. package/phanpy/dist/assets/icons/link-2-line-DCqLmMA7.js +0 -1
  256. package/phanpy/dist/assets/icons/list-check-line-BAxosBh9.js +0 -1
  257. package/phanpy/dist/assets/icons/lock-line-CPoaXeUW.js +0 -1
  258. package/phanpy/dist/assets/icons/mail-line-B0P8aa1L.js +0 -1
  259. package/phanpy/dist/assets/icons/moon-line-CEqNAToP.js +0 -1
  260. package/phanpy/dist/assets/icons/more-1-fill-Dw2e5xab.js +0 -1
  261. package/phanpy/dist/assets/icons/more-3-line-BIiVjYTz.js +0 -1
  262. package/phanpy/dist/assets/icons/notification-line-BZZq2Gtu.js +0 -1
  263. package/phanpy/dist/assets/icons/pencil-line-CKh8-A1v.js +0 -1
  264. package/phanpy/dist/assets/icons/photo-album-line-Bnfg2u40.js +0 -1
  265. package/phanpy/dist/assets/icons/pin-line-DpTolyhs.js +0 -1
  266. package/phanpy/dist/assets/icons/play-fill-B0-G_8lX.js +0 -1
  267. package/phanpy/dist/assets/icons/qrcode-2-line-B6SPCaHn.js +0 -1
  268. package/phanpy/dist/assets/icons/quill-pen-line-B6LUrnCP.js +0 -1
  269. package/phanpy/dist/assets/icons/quote-left-fill-hQZ1cj_6.js +0 -1
  270. package/phanpy/dist/assets/icons/radar-line-CKyroTth.js +0 -1
  271. package/phanpy/dist/assets/icons/react-line-CoIKhhtK.js +0 -1
  272. package/phanpy/dist/assets/icons/refresh-2-line-D0mTF97S.js +0 -1
  273. package/phanpy/dist/assets/icons/right-line-B3KWJaqc.js +0 -1
  274. package/phanpy/dist/assets/icons/rocket-line-4KZl537D.js +0 -1
  275. package/phanpy/dist/assets/icons/round-fill-C69NTrZ0.js +0 -1
  276. package/phanpy/dist/assets/icons/round-line-B9k_1uo-.js +0 -1
  277. package/phanpy/dist/assets/icons/route-line-B28ReHcE.js +0 -1
  278. package/phanpy/dist/assets/icons/rows-4-line-CrBniagM.js +0 -1
  279. package/phanpy/dist/assets/icons/scan-line-DSf74YdP.js +0 -1
  280. package/phanpy/dist/assets/icons/search-2-line-B6geIU1z.js +0 -1
  281. package/phanpy/dist/assets/icons/settings-3-line-azJwK47w.js +0 -1
  282. package/phanpy/dist/assets/icons/settings-6-line-C_5zc5YR.js +0 -1
  283. package/phanpy/dist/assets/icons/share-2-line-D5MxWjrm.js +0 -1
  284. package/phanpy/dist/assets/icons/share-forward-line-Cp61fZzZ.js +0 -1
  285. package/phanpy/dist/assets/icons/sparkles-2-line-DYYyXTaW.js +0 -1
  286. package/phanpy/dist/assets/icons/sparkles-line-C2hY1s6I.js +0 -1
  287. package/phanpy/dist/assets/icons/time-line-BF3eet1v.js +0 -1
  288. package/phanpy/dist/assets/icons/transfer-4-line-oisfvTBw.js +0 -1
  289. package/phanpy/dist/assets/icons/translate-line-BFWol2Ce.js +0 -1
  290. package/phanpy/dist/assets/icons/unlock-line-X_x5vwv3.js +0 -1
  291. package/phanpy/dist/assets/icons/upload-3-line-DgzwUJeW.js +0 -1
  292. package/phanpy/dist/assets/icons/user-4-line-BVSynZCp.js +0 -1
  293. package/phanpy/dist/assets/icons/user-add-2-line-BlGS5Q8q.js +0 -1
  294. package/phanpy/dist/assets/icons/user-add-line-BbXdHG4z.js +0 -1
  295. package/phanpy/dist/assets/icons/user-edit-line-BFAHOV0X.js +0 -1
  296. package/phanpy/dist/assets/icons/user-follow-line-BXux0wSd.js +0 -1
  297. package/phanpy/dist/assets/icons/user-star-line-DdYlpHLU.js +0 -1
  298. package/phanpy/dist/assets/icons/user-warning-line-Cj43j0_E.js +0 -1
  299. package/phanpy/dist/assets/icons/user-x-line-DIDgNlPH.js +0 -1
  300. package/phanpy/dist/assets/icons/volume-line-Bs390KQt.js +0 -1
  301. package/phanpy/dist/assets/icons/volume-mute-line-DzlzIqFZ.js +0 -1
  302. package/phanpy/dist/assets/icons/walk-line-yNXfB-md.js +0 -1
  303. package/phanpy/dist/assets/icons/world-2-line-CenkGIwj.js +0 -1
  304. package/phanpy/dist/assets/icons/zoom-in-line-CaENUphf.js +0 -1
  305. package/phanpy/dist/assets/icons/zoom-out-line-BDNk0EWo.js +0 -1
  306. package/phanpy/dist/assets/instances-BNPptnn-.json +0 -333
  307. package/phanpy/dist/assets/locales/ar-SA-CfheRbCu.js +0 -1
  308. package/phanpy/dist/assets/locales/ca-ES-DHRW86Tz.js +0 -1
  309. package/phanpy/dist/assets/locales/cs-CZ-CKoqEuA1.js +0 -1
  310. package/phanpy/dist/assets/locales/de-DE-ByRPMRFy.js +0 -1
  311. package/phanpy/dist/assets/locales/eo-UY-CPC7wLCS.js +0 -1
  312. package/phanpy/dist/assets/locales/es-ES-dJa0Fd9t.js +0 -1
  313. package/phanpy/dist/assets/locales/eu-ES-C3djlPR2.js +0 -1
  314. package/phanpy/dist/assets/locales/fa-IR-DTT490Ck.js +0 -1
  315. package/phanpy/dist/assets/locales/fi-FI-B23MCPuz.js +0 -1
  316. package/phanpy/dist/assets/locales/fr-FR-BcaQsO5C.js +0 -1
  317. package/phanpy/dist/assets/locales/gl-ES-BR-CVKBN.js +0 -1
  318. package/phanpy/dist/assets/locales/he-IL-CfheRbCu.js +0 -1
  319. package/phanpy/dist/assets/locales/hu-HU-CfheRbCu.js +0 -1
  320. package/phanpy/dist/assets/locales/it-IT-C1136UFV.js +0 -1
  321. package/phanpy/dist/assets/locales/ja-JP-CRZmRAhD.js +0 -1
  322. package/phanpy/dist/assets/locales/kab-Cz8xH_TT.js +0 -1
  323. package/phanpy/dist/assets/locales/ko-KR-CG9UiY4o.js +0 -1
  324. package/phanpy/dist/assets/locales/lt-LT-CJcI6sHZ.js +0 -1
  325. package/phanpy/dist/assets/locales/nb-NO-CfheRbCu.js +0 -1
  326. package/phanpy/dist/assets/locales/nl-NL-DxN4Yc1t.js +0 -1
  327. package/phanpy/dist/assets/locales/oc-FR-CfheRbCu.js +0 -1
  328. package/phanpy/dist/assets/locales/pl-PL-DkwGXf6P.js +0 -1
  329. package/phanpy/dist/assets/locales/pseudo-LOCALE-CQ4XxkQ0.js +0 -1
  330. package/phanpy/dist/assets/locales/pt-BR-nGL0HdFS.js +0 -1
  331. package/phanpy/dist/assets/locales/pt-PT-Cp17aj2z.js +0 -1
  332. package/phanpy/dist/assets/locales/ru-RU-0Y8cIoaK.js +0 -1
  333. package/phanpy/dist/assets/locales/th-TH-CfheRbCu.js +0 -1
  334. package/phanpy/dist/assets/locales/tok-CfheRbCu.js +0 -1
  335. package/phanpy/dist/assets/locales/tr-TR-CfheRbCu.js +0 -1
  336. package/phanpy/dist/assets/locales/uk-UA-C5E3dFBf.js +0 -1
  337. package/phanpy/dist/assets/locales/zh-CN-BHJi7_et.js +0 -1
  338. package/phanpy/dist/assets/locales/zh-TW-CfheRbCu.js +0 -1
  339. package/phanpy/dist/assets/main-BdqNbG-a.js +0 -26
  340. package/phanpy/dist/assets/main-BdqNbG-a.js.map +0 -1
  341. package/phanpy/dist/assets/mock-home-DGhR__He.js +0 -2
  342. package/phanpy/dist/assets/mock-home-DGhR__He.js.map +0 -1
  343. package/phanpy/dist/assets/multi-column-ROck0NVt.jpg +0 -0
  344. package/phanpy/dist/assets/multi-hashtag-timeline-DH5INVHi.jpg +0 -0
  345. package/phanpy/dist/assets/nested-comments-thread-hv59kZLc.jpg +0 -0
  346. package/phanpy/dist/assets/polyfill-force-H8sUkLGp.js +0 -2
  347. package/phanpy/dist/assets/polyfill-force-H8sUkLGp.js.map +0 -1
  348. package/phanpy/dist/assets/pwa-viewport-ogKbF51K.js +0 -20
  349. package/phanpy/dist/assets/pwa-viewport-ogKbF51K.js.map +0 -1
  350. package/phanpy/dist/assets/style-B1iLPTPR.css +0 -2
  351. package/phanpy/dist/assets/temml-DuyIQMei.js +0 -97
  352. package/phanpy/dist/assets/temml-DuyIQMei.js.map +0 -1
  353. package/phanpy/dist/assets/tinyld.light.node-DtbBhLYC.js +0 -2
  354. package/phanpy/dist/assets/tinyld.light.node-DtbBhLYC.js.map +0 -1
  355. package/phanpy/dist/assets/year-in-posts-B2lywqdx.png +0 -0
  356. package/phanpy/dist/assets/year-in-posts-DJv_star.js +0 -3
  357. package/phanpy/dist/assets/year-in-posts-DJv_star.js.map +0 -1
  358. package/phanpy/dist/compose/index.html +0 -20
  359. package/phanpy/dist/favicon.ico +0 -0
  360. package/phanpy/dist/index.html +0 -73
  361. package/phanpy/dist/logo-192.png +0 -0
  362. package/phanpy/dist/logo-512.png +0 -0
  363. package/phanpy/dist/logo-badge-72.png +0 -0
  364. package/phanpy/dist/logo-maskable-512.png +0 -0
  365. package/phanpy/dist/logo-monochrome-512.png +0 -0
  366. package/phanpy/dist/logo-monochrome-maskable-512.png +0 -0
  367. package/phanpy/dist/manifest.webmanifest +0 -1
  368. package/phanpy/dist/og-image-2.jpg +0 -0
  369. package/phanpy/dist/og-image.png +0 -0
  370. package/phanpy/dist/robots.txt +0 -2
  371. package/phanpy/dist/sw.js +0 -2
  372. package/phanpy/dist/sw.js.map +0 -1
  373. package/phanpy/dist/version.json +0 -1
  374. package/run-agent.mjs +0 -899
  375. package/vendor/gate.cjs +0 -138
  376. package/vendor/idp-grant.cjs +0 -394
  377. package/vendor/jfetch.cjs +0 -16
  378. package/web/admin/actors.js +0 -147
  379. package/web/admin/bar.css +0 -126
  380. package/web/admin/bar.js +0 -99
  381. package/web/admin/client/client.js +0 -66
  382. package/web/admin/client/index.html +0 -69
  383. package/web/admin/client-pick.js +0 -79
  384. package/web/admin/common.js +0 -23
  385. package/web/admin/connections.js +0 -112
  386. package/web/admin/gateway.js +0 -133
  387. package/web/admin/group.js +0 -258
  388. package/web/admin/index.html +0 -612
  389. package/web/admin/notices-bar.js +0 -90
  390. package/web/admin/oauth-signin.mjs +0 -37
  391. package/web/admin/record.js +0 -393
  392. package/web/admin/setup/index.html +0 -257
  393. package/web/admin/setup/setup.js +0 -339
  394. package/web/admin/tokens.css +0 -68
  395. package/web/admin/upkeep.js +0 -177
  396. package/web/admin/window.css +0 -55
  397. package/web/admin/window.js +0 -136
  398. package/web/app/README.md +0 -81
  399. package/web/app/admin-facade.mjs +0 -588
  400. package/web/app/agent.mjs +0 -672
  401. package/web/app/atproto-browser.mjs +0 -86
  402. package/web/app/authorize_interaction.html +0 -56
  403. package/web/app/authorize_interaction.js +0 -69
  404. package/web/app/boot.mjs +0 -616
  405. package/web/app/deliver-relay.mjs +0 -129
  406. package/web/app/dist/boot.js +0 -34562
  407. package/web/app/dist/boot.js.map +0 -7
  408. package/web/app/dist/sw.js +0 -73456
  409. package/web/app/dist/sw.js.map +0 -7
  410. package/web/app/fediacct-browser.mjs +0 -146
  411. package/web/app/gateway-move.mjs +0 -60
  412. package/web/app/idb-kv.mjs +0 -35
  413. package/web/app/index.html +0 -258
  414. package/web/app/keys-browser.mjs +0 -71
  415. package/web/app/keystore.mjs +0 -82
  416. package/web/app/oidc-session.mjs +0 -6
  417. package/web/app/pod-auth.mjs +0 -248
  418. package/web/app/pod-remote.mjs +0 -84
  419. package/web/app/shims/_globals.mjs +0 -2
  420. package/web/app/shims/fedify-sig.mjs +0 -77
  421. package/web/app/shims/node-crypto.mjs +0 -113
  422. package/web/app/shims/node-fs.mjs +0 -17
  423. package/web/app/shims/node-path.mjs +0 -19
  424. package/web/app/shims/node-url.mjs +0 -7
  425. package/web/app/shims/prelude.js +0 -58
  426. package/web/app/shims/safefetch.mjs +0 -58
  427. package/web/app/shims/shapes-text.mjs +0 -8
  428. package/web/app/shims/web-push.mjs +0 -14
  429. package/web/app/signup.mjs +0 -357
  430. package/web/app/sw-src.mjs +0 -220
  431. package/web/app/update.js +0 -70
  432. package/web/front/admin.html +0 -55
  433. package/web/front/admin.js +0 -89
  434. package/web/front/install.sh +0 -69
  435. package/web/front/new-account.html +0 -35
  436. package/web/front/new-account.js +0 -13
  437. package/web/front/notices.html +0 -69
  438. package/web/front/notices.js +0 -107
  439. package/web/front/run.html +0 -64
  440. package/web/front/run.js +0 -221
  441. package/web/front/solid-oidc-client.js +0 -6
  442. package/web/icons/forum.svg +0 -11
  443. package/web/icons/gateway.svg +0 -14
  444. 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
- })();
@@ -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 &amp; 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>
@@ -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
- })();
@@ -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>
@@ -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(() => {});
@@ -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 &amp; 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>
@@ -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
- })();
@@ -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 &amp; 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>