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