solid-ui 3.1.3-13 → 3.1.3-15

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 (362) hide show
  1. package/README.md +0 -14
  2. package/dist/_virtual/_rolldown/runtime.cjs.js +1 -1
  3. package/dist/acl/access-controller.cjs.js.map +1 -1
  4. package/dist/acl/access-groups.cjs.js +1 -1
  5. package/dist/acl/access-groups.cjs.js.map +1 -1
  6. package/dist/acl/access-groups.esm.js +2 -1
  7. package/dist/acl/access-groups.esm.js.map +1 -1
  8. package/dist/acl/acl.cjs.js.map +1 -1
  9. package/dist/acl/acl.esm.js.map +1 -1
  10. package/dist/chat/bookmarks.esm.js +2 -1
  11. package/dist/chat/bookmarks.esm.js.map +1 -1
  12. package/dist/chat/chatLogic.cjs.js +1 -1
  13. package/dist/chat/chatLogic.cjs.js.map +1 -1
  14. package/dist/chat/chatLogic.esm.js +2 -2
  15. package/dist/chat/chatLogic.esm.js.map +1 -1
  16. package/dist/chat/keys.cjs.js +1 -1
  17. package/dist/chat/keys.cjs.js.map +1 -1
  18. package/dist/chat/keys.d.ts +1 -1
  19. package/dist/chat/keys.d.ts.map +1 -1
  20. package/dist/chat/keys.esm.js +5 -2
  21. package/dist/chat/keys.esm.js.map +1 -1
  22. package/dist/chat/signature.cjs.js +1 -1
  23. package/dist/chat/signature.cjs.js.map +1 -1
  24. package/dist/chat/signature.esm.js +2 -1
  25. package/dist/chat/signature.esm.js.map +1 -1
  26. package/dist/chunks/{DialogProvider-B7wEBrVN.js → DialogProvider-0HIHjONx.js} +11 -11
  27. package/dist/chunks/{DialogProvider-B7wEBrVN.js.map → DialogProvider-0HIHjONx.js.map} +1 -1
  28. package/dist/chunks/{account-DeNlj01m.js → account-Ch8h_zTv.js} +20 -21
  29. package/dist/chunks/{account-DeNlj01m.js.map → account-Ch8h_zTv.js.map} +1 -1
  30. package/dist/chunks/{auth-Knq99zZ9.js → auth-D4NUMSzc.js} +98 -72
  31. package/dist/chunks/auth-D4NUMSzc.js.map +1 -0
  32. package/dist/chunks/{avatar-DgO_p94F.js → avatar-BWtz4RlU.js} +7 -8
  33. package/dist/chunks/{avatar-DgO_p94F.js.map → avatar-BWtz4RlU.js.map} +1 -1
  34. package/dist/chunks/{button-Dvkek1tx.js → button-BJyFKOKO.js} +12 -15
  35. package/dist/chunks/{button-Dvkek1tx.js.map → button-BJyFKOKO.js.map} +1 -1
  36. package/dist/chunks/{chunk.7MPIABXH-DNcYOuE8.js → chunk.64OG2H45-BADxAtEI.js} +97 -50
  37. package/dist/chunks/chunk.64OG2H45-BADxAtEI.js.map +1 -0
  38. package/dist/chunks/{combobox-B5j4LoHY.js → combobox-0NWv9K3D.js} +106 -93
  39. package/dist/chunks/combobox-0NWv9K3D.js.map +1 -0
  40. package/dist/chunks/{combobox-option-C5lKAumO.js → combobox-option-B-twy1Zn.js} +6 -7
  41. package/dist/chunks/{combobox-option-C5lKAumO.js.map → combobox-option-B-twy1Zn.js.map} +1 -1
  42. package/dist/chunks/components-DrP7BOrs.js +1281 -0
  43. package/dist/chunks/components-DrP7BOrs.js.map +1 -0
  44. package/dist/chunks/{dialog-DZgm_Tph.js → dialog-CcMVH-Ut.js} +16 -16
  45. package/dist/chunks/{dialog-DZgm_Tph.js.map → dialog-CcMVH-Ut.js.map} +1 -1
  46. package/dist/chunks/{dialog-content-DY-ROHyi.js → dialog-content-DcD_s3hK.js} +2 -3
  47. package/dist/chunks/{dialog-content-DY-ROHyi.js.map → dialog-content-DcD_s3hK.js.map} +1 -1
  48. package/dist/chunks/{dialog-footer-BAZTjZ8J.js → dialog-footer-CHgSH7G5.js} +2 -3
  49. package/dist/chunks/{dialog-footer-BAZTjZ8J.js.map → dialog-footer-CHgSH7G5.js.map} +1 -1
  50. package/dist/chunks/{dialog-header-COzPcK8F.js → dialog-header-BjellR7_.js} +2 -3
  51. package/dist/chunks/{dialog-header-COzPcK8F.js.map → dialog-header-BjellR7_.js.map} +1 -1
  52. package/dist/chunks/{dialogs-DEuwXC46.js → dialogs-CeHuLUo5.js} +2 -2
  53. package/dist/chunks/{dialogs-DEuwXC46.js.map → dialogs-CeHuLUo5.js.map} +1 -1
  54. package/dist/chunks/{dialogs-root-BYp6fIUE.js → dialogs-root-CvsON-m8.js} +5 -6
  55. package/dist/chunks/{dialogs-root-BYp6fIUE.js.map → dialogs-root-CvsON-m8.js.map} +1 -1
  56. package/dist/chunks/{guard-DI4k0FkM.js → guard-BIesxo_f.js} +7 -8
  57. package/dist/chunks/{guard-DI4k0FkM.js.map → guard-BIesxo_f.js.map} +1 -1
  58. package/dist/chunks/{solid-logic.esm-BrMdCG2_.js → index.esm-CyyOkz04.js} +2663 -2745
  59. package/dist/chunks/index.esm-CyyOkz04.js.map +1 -0
  60. package/dist/chunks/{input-CCpEhtqA.js → input-CFDN76Y5.js} +99 -54
  61. package/dist/chunks/input-CFDN76Y5.js.map +1 -0
  62. package/dist/chunks/{jsonld-B61R4iOL.js → jsonld-52q5nY_t.js} +22 -27
  63. package/dist/chunks/{jsonld-B61R4iOL.js.map → jsonld-52q5nY_t.js.map} +1 -1
  64. package/dist/chunks/{login-button-BafqiKef.js → login-button-BhdKFJ-F.js} +8 -9
  65. package/dist/chunks/{login-button-BafqiKef.js.map → login-button-BhdKFJ-F.js.map} +1 -1
  66. package/dist/chunks/{logout-button-D54NF9EW.js → logout-button-ClbKS9ss.js} +8 -9
  67. package/dist/chunks/{logout-button-D54NF9EW.js.map → logout-button-ClbKS9ss.js.map} +1 -1
  68. package/dist/chunks/{menu-DKxtACGA.js → menu-DVgG-el5.js} +39 -35
  69. package/dist/chunks/menu-DVgG-el5.js.map +1 -0
  70. package/dist/chunks/{menu-item-D9BqJtKZ.js → menu-item-Bj3NgLzB.js} +5 -6
  71. package/dist/chunks/{menu-item-D9BqJtKZ.js.map → menu-item-Bj3NgLzB.js.map} +1 -1
  72. package/dist/chunks/{photo-capture-BoZF621r.js → photo-capture-CVKE0SKx.js} +18 -19
  73. package/dist/chunks/{photo-capture-BoZF621r.js.map → photo-capture-CVKE0SKx.js.map} +1 -1
  74. package/dist/chunks/{photo-capture-modal-BLZtHDj1.js → photo-capture-modal-DARmhHUH.js} +26 -26
  75. package/dist/chunks/{photo-capture-modal-BLZtHDj1.js.map → photo-capture-modal-DARmhHUH.js.map} +1 -1
  76. package/dist/chunks/{provider-Btl6Lnki.js → provider-CBSBzOfP.js} +9 -10
  77. package/dist/chunks/{provider-Btl6Lnki.js.map → provider-CBSBzOfP.js.map} +1 -1
  78. package/dist/chunks/rdf-form-BeuzVBOP.js +339 -0
  79. package/dist/chunks/rdf-form-BeuzVBOP.js.map +1 -0
  80. package/dist/chunks/rdf-input-n73oeSkf.js +440 -0
  81. package/dist/chunks/rdf-input-n73oeSkf.js.map +1 -0
  82. package/dist/chunks/{rolldown-runtime-B1bRi_D7.js → rolldown-runtime-Cb76FRpK.js} +2 -2
  83. package/dist/chunks/{select-XkieYvDm.js → select-BuIxSm1A.js} +9 -10
  84. package/dist/chunks/{select-XkieYvDm.js.map → select-BuIxSm1A.js.map} +1 -1
  85. package/dist/chunks/{select-option-DUg4AWzw.js → select-option-Z8qZsCQo.js} +6 -7
  86. package/dist/chunks/{select-option-DUg4AWzw.js.map → select-option-Z8qZsCQo.js.map} +1 -1
  87. package/dist/chunks/{signup-button-D5wS8_gB.js → signup-button-B-AgjjAK.js} +8 -9
  88. package/dist/chunks/{signup-button-D5wS8_gB.js.map → signup-button-B-AgjjAK.js.map} +1 -1
  89. package/dist/chunks/{solid-emblem-XHk-oomv.js → solid-emblem-D4ItOckU.js} +2 -3
  90. package/dist/chunks/{solid-emblem-XHk-oomv.js.map → solid-emblem-D4ItOckU.js.map} +1 -1
  91. package/dist/chunks/{src-CJICzMIV.js → src-B5SL8UtS.js} +2741 -3207
  92. package/dist/chunks/src-B5SL8UtS.js.map +1 -0
  93. package/dist/chunks/style-CjYxsW7j.js +536 -0
  94. package/dist/chunks/style-CjYxsW7j.js.map +1 -0
  95. package/dist/components/account/Account.cjs.js.map +1 -1
  96. package/dist/components/account.js +1 -1
  97. package/dist/components/all.cjs.js +1 -1
  98. package/dist/components/all.esm.js +2 -1
  99. package/dist/components/avatar/Avatar.cjs.js.map +1 -1
  100. package/dist/components/avatar.js +1 -1
  101. package/dist/components/button/Button.cjs.js +1 -1
  102. package/dist/components/button/Button.cjs.js.map +1 -1
  103. package/dist/components/button/Button.esm.js +1 -3
  104. package/dist/components/button/Button.esm.js.map +1 -1
  105. package/dist/components/button.js +1 -1
  106. package/dist/components/combobox/Combobox.cjs.js +2 -2
  107. package/dist/components/combobox/Combobox.cjs.js.map +1 -1
  108. package/dist/components/combobox/Combobox.d.ts +1 -0
  109. package/dist/components/combobox/Combobox.d.ts.map +1 -1
  110. package/dist/components/combobox/Combobox.esm.js +61 -47
  111. package/dist/components/combobox/Combobox.esm.js.map +1 -1
  112. package/dist/components/combobox-option/ComboboxOption.cjs.js.map +1 -1
  113. package/dist/components/combobox-option.js +1 -1
  114. package/dist/components/combobox.js +1 -1
  115. package/dist/components/dialog/Dialog.cjs.js +4 -4
  116. package/dist/components/dialog/Dialog.cjs.js.map +1 -1
  117. package/dist/components/dialog/Dialog.esm.js +5 -4
  118. package/dist/components/dialog/Dialog.esm.js.map +1 -1
  119. package/dist/components/dialog-content.js +1 -1
  120. package/dist/components/dialog-footer.js +1 -1
  121. package/dist/components/dialog-header.js +1 -1
  122. package/dist/components/dialog-provider/DialogProvider.cjs.js.map +1 -1
  123. package/dist/components/dialog-provider.js +1 -1
  124. package/dist/components/dialog.js +1 -1
  125. package/dist/components/dialogs-root/DialogsRoot.cjs.js.map +1 -1
  126. package/dist/components/dialogs-root.js +1 -1
  127. package/dist/components/guard/Guard.cjs.js.map +1 -1
  128. package/dist/components/guard.js +1 -1
  129. package/dist/components/input/Input.cjs.js +3 -2
  130. package/dist/components/input/Input.cjs.js.map +1 -1
  131. package/dist/components/input/Input.d.ts +3 -0
  132. package/dist/components/input/Input.d.ts.map +1 -1
  133. package/dist/components/input/Input.esm.js +99 -53
  134. package/dist/components/input/Input.esm.js.map +1 -1
  135. package/dist/components/input/Input.styles.cjs.js +1 -1
  136. package/dist/components/input/Input.styles.cjs.js.map +1 -1
  137. package/dist/components/input/Input.styles.esm.js +1 -1
  138. package/dist/components/input/Input.styles.esm.js.map +1 -1
  139. package/dist/components/input.js +1 -1
  140. package/dist/components/login-button/LoginButton.cjs.js.map +1 -1
  141. package/dist/components/login-button.js +1 -1
  142. package/dist/components/login-modal/LoginModal.cjs.js.map +1 -1
  143. package/dist/components/login-modal.js +1 -1
  144. package/dist/components/logout-button/LogoutButton.cjs.js.map +1 -1
  145. package/dist/components/logout-button.js +1 -1
  146. package/dist/components/menu/Menu.cjs.js +1 -1
  147. package/dist/components/menu/Menu.cjs.js.map +1 -1
  148. package/dist/components/menu/Menu.d.ts.map +1 -1
  149. package/dist/components/menu/Menu.esm.js +1 -1
  150. package/dist/components/menu/Menu.esm.js.map +1 -1
  151. package/dist/components/menu/Menu.test.d.ts +1 -0
  152. package/dist/components/menu/Menu.test.d.ts.map +1 -0
  153. package/dist/components/menu-item/MenuItem.cjs.js.map +1 -1
  154. package/dist/components/menu-item.js +1 -1
  155. package/dist/components/menu.js +1 -1
  156. package/dist/components/photo-capture/PhotoCapture.cjs.js.map +1 -1
  157. package/dist/components/photo-capture-modal/PhotoCaptureModal.cjs.js +1 -1
  158. package/dist/components/photo-capture-modal/PhotoCaptureModal.cjs.js.map +1 -1
  159. package/dist/components/photo-capture-modal/PhotoCaptureModal.esm.js +2 -1
  160. package/dist/components/photo-capture-modal/PhotoCaptureModal.esm.js.map +1 -1
  161. package/dist/components/photo-capture-modal.js +1 -1
  162. package/dist/components/photo-capture.js +1 -1
  163. package/dist/components/provider/Provider.cjs.js.map +1 -1
  164. package/dist/components/provider.js +1 -1
  165. package/dist/components/rdf-form/RDFForm.cjs.js +12 -0
  166. package/dist/components/rdf-form/RDFForm.cjs.js.map +1 -0
  167. package/dist/components/rdf-form/RDFForm.d.ts +17 -0
  168. package/dist/components/rdf-form/RDFForm.d.ts.map +1 -0
  169. package/dist/components/rdf-form/RDFForm.esm.js +344 -0
  170. package/dist/components/rdf-form/RDFForm.esm.js.map +1 -0
  171. package/dist/components/rdf-form/RDForm.stories.d.ts +20 -0
  172. package/dist/components/rdf-form/RDForm.stories.d.ts.map +1 -0
  173. package/dist/components/rdf-form/index.cjs.js +2 -0
  174. package/dist/components/rdf-form/index.cjs.js.map +1 -0
  175. package/dist/components/rdf-form/index.d.ts +4 -0
  176. package/dist/components/rdf-form/index.d.ts.map +1 -0
  177. package/dist/components/rdf-form/index.esm.js +7 -0
  178. package/dist/components/rdf-form/index.esm.js.map +1 -0
  179. package/dist/components/rdf-form.js +2 -0
  180. package/dist/components/rdf-input/RDFInput.cjs.js +11 -0
  181. package/dist/components/rdf-input/RDFInput.cjs.js.map +1 -0
  182. package/dist/components/rdf-input/RDFInput.d.ts +24 -0
  183. package/dist/components/rdf-input/RDFInput.d.ts.map +1 -0
  184. package/dist/components/rdf-input/RDFInput.esm.js +349 -0
  185. package/dist/components/rdf-input/RDFInput.esm.js.map +1 -0
  186. package/dist/components/rdf-input/index.cjs.js +2 -0
  187. package/dist/components/rdf-input/index.cjs.js.map +1 -0
  188. package/dist/components/rdf-input/index.d.ts +4 -0
  189. package/dist/components/rdf-input/index.d.ts.map +1 -0
  190. package/dist/components/rdf-input/index.esm.js +7 -0
  191. package/dist/components/rdf-input/index.esm.js.map +1 -0
  192. package/dist/components/rdf-input.js +2 -0
  193. package/dist/components/select/Select.cjs.js.map +1 -1
  194. package/dist/components/select-option/SelectOption.cjs.js.map +1 -1
  195. package/dist/components/select-option.js +1 -1
  196. package/dist/components/select.js +1 -1
  197. package/dist/components/signup-button/SignupButton.cjs.js.map +1 -1
  198. package/dist/components/signup-button.js +1 -1
  199. package/dist/components/solid-emblem.js +1 -1
  200. package/dist/components.js +26 -25
  201. package/dist/index.cjs.js +1 -1
  202. package/dist/index.cjs.js.map +1 -1
  203. package/dist/index.d.ts +1 -0
  204. package/dist/index.d.ts.map +1 -1
  205. package/dist/index.esm.js +3 -2
  206. package/dist/index.esm.js.map +1 -1
  207. package/dist/index.js +8 -7
  208. package/dist/lib/auth/SolidAuth.cjs.js +1 -1
  209. package/dist/lib/auth/SolidAuth.cjs.js.map +1 -1
  210. package/dist/lib/auth/SolidAuth.esm.js +3 -1
  211. package/dist/lib/auth/SolidAuth.esm.js.map +1 -1
  212. package/dist/lib/auth/context.cjs.js.map +1 -1
  213. package/dist/lib/components/dialog-component/DialogComponent.cjs.js.map +1 -1
  214. package/dist/lib/components/form-control-component/FormControlComponent.cjs.js.map +1 -1
  215. package/dist/lib/components/web-component/WebComponent.cjs.js +1 -1
  216. package/dist/lib/components/web-component/WebComponent.cjs.js.map +1 -1
  217. package/dist/lib/components/web-component/WebComponent.esm.js +2 -1
  218. package/dist/lib/components/web-component/WebComponent.esm.js.map +1 -1
  219. package/dist/lib/dialogs/context.cjs.js.map +1 -1
  220. package/dist/lib/file-explorer/context.cjs.js +2 -0
  221. package/dist/lib/file-explorer/context.cjs.js.map +1 -0
  222. package/dist/lib/file-explorer/context.d.ts +22 -0
  223. package/dist/lib/file-explorer/context.d.ts.map +1 -0
  224. package/dist/lib/file-explorer/context.esm.js +7 -0
  225. package/dist/lib/file-explorer/context.esm.js.map +1 -0
  226. package/dist/lib/forms/fieldParams.cjs.js +2 -0
  227. package/dist/lib/forms/fieldParams.cjs.js.map +1 -0
  228. package/dist/lib/forms/fieldParams.d.ts +21 -0
  229. package/dist/lib/forms/fieldParams.d.ts.map +1 -0
  230. package/dist/lib/forms/fieldParams.esm.js +74 -0
  231. package/dist/lib/forms/fieldParams.esm.js.map +1 -0
  232. package/dist/lib/forms/rdfFormsHelper.cjs.js +2 -0
  233. package/dist/lib/forms/rdfFormsHelper.cjs.js.map +1 -0
  234. package/dist/lib/forms/rdfFormsHelper.d.ts +16 -0
  235. package/dist/lib/forms/rdfFormsHelper.d.ts.map +1 -0
  236. package/dist/lib/forms/rdfFormsHelper.esm.js +34 -0
  237. package/dist/lib/forms/rdfFormsHelper.esm.js.map +1 -0
  238. package/dist/lib/forms/store/NoopStore.cjs.js +2 -0
  239. package/dist/lib/forms/store/NoopStore.cjs.js.map +1 -0
  240. package/dist/lib/forms/store/NoopStore.d.ts +6 -0
  241. package/dist/lib/forms/store/NoopStore.d.ts.map +1 -0
  242. package/dist/lib/forms/store/NoopStore.esm.js +10 -0
  243. package/dist/lib/forms/store/NoopStore.esm.js.map +1 -0
  244. package/dist/lib/forms/store/StoreContext.cjs.js +2 -0
  245. package/dist/lib/forms/store/StoreContext.cjs.js.map +1 -0
  246. package/dist/lib/forms/store/StoreContext.d.ts +10 -0
  247. package/dist/lib/forms/store/StoreContext.d.ts.map +1 -0
  248. package/dist/lib/forms/store/StoreContext.esm.js +8 -0
  249. package/dist/lib/forms/store/StoreContext.esm.js.map +1 -0
  250. package/dist/lib/ns.cjs.js.map +1 -1
  251. package/dist/lib/pad.cjs.js +1 -1
  252. package/dist/lib/pad.cjs.js.map +1 -1
  253. package/dist/lib/pad.esm.js +6 -5
  254. package/dist/lib/pad.esm.js.map +1 -1
  255. package/dist/lib/participation.cjs.js +1 -1
  256. package/dist/lib/participation.cjs.js.map +1 -1
  257. package/dist/lib/participation.esm.js +4 -2
  258. package/dist/lib/participation.esm.js.map +1 -1
  259. package/dist/lib/preferences.cjs.js +1 -1
  260. package/dist/lib/preferences.cjs.js.map +1 -1
  261. package/dist/lib/preferences.esm.js +9 -7
  262. package/dist/lib/preferences.esm.js.map +1 -1
  263. package/dist/lib/table.cjs.js +2 -2
  264. package/dist/lib/table.cjs.js.map +1 -1
  265. package/dist/lib/table.esm.js +2 -2
  266. package/dist/lib/table.esm.js.map +1 -1
  267. package/dist/loader.js +8 -7
  268. package/dist/login/login.cjs.js.map +1 -1
  269. package/dist/media/media-capture.esm.js +2 -1
  270. package/dist/media/media-capture.esm.js.map +1 -1
  271. package/dist/solid-ui.js +107 -156
  272. package/dist/solid-ui.min.js +107 -156
  273. package/dist/solid-ui.min.js.map +1 -1
  274. package/dist/storybook/components/StorybookProvider.d.ts +1 -0
  275. package/dist/storybook/components/StorybookProvider.d.ts.map +1 -1
  276. package/dist/storybook/store/StorybookStore.d.ts +6 -0
  277. package/dist/storybook/store/StorybookStore.d.ts.map +1 -0
  278. package/dist/utils/headerFooterHelpers.cjs.js +1 -1
  279. package/dist/utils/headerFooterHelpers.cjs.js.map +1 -1
  280. package/dist/utils/headerFooterHelpers.esm.js +2 -1
  281. package/dist/utils/headerFooterHelpers.esm.js.map +1 -1
  282. package/dist/utils/index.cjs.js +1 -1
  283. package/dist/utils/index.cjs.js.map +1 -1
  284. package/dist/utils/index.esm.js +1 -1
  285. package/dist/utils/index.esm.js.map +1 -1
  286. package/dist/utils/keyHelpers/accessData.cjs.js +1 -1
  287. package/dist/utils/keyHelpers/accessData.cjs.js.map +1 -1
  288. package/dist/utils/keyHelpers/accessData.d.ts +3 -3
  289. package/dist/utils/keyHelpers/accessData.d.ts.map +1 -1
  290. package/dist/utils/keyHelpers/accessData.esm.js +2 -1
  291. package/dist/utils/keyHelpers/accessData.esm.js.map +1 -1
  292. package/dist/utils/keyHelpers/otherHelpers.d.ts +1 -1
  293. package/dist/utils/keyHelpers/otherHelpers.d.ts.map +1 -1
  294. package/dist/widgets/buttons.cjs.js +2 -2
  295. package/dist/widgets/buttons.cjs.js.map +1 -1
  296. package/dist/widgets/buttons.esm.js +10 -5
  297. package/dist/widgets/buttons.esm.js.map +1 -1
  298. package/dist/widgets/dragAndDrop.cjs.js +1 -1
  299. package/dist/widgets/dragAndDrop.cjs.js.map +1 -1
  300. package/dist/widgets/dragAndDrop.esm.js +1 -1
  301. package/dist/widgets/dragAndDrop.esm.js.map +1 -1
  302. package/dist/widgets/forms/autocomplete/autocompleteBar.esm.js +25 -18
  303. package/dist/widgets/forms/autocomplete/autocompleteBar.esm.js.map +1 -1
  304. package/dist/widgets/forms/autocomplete/autocompleteField.cjs.js.map +1 -1
  305. package/dist/widgets/forms/autocomplete/publicData.cjs.js +1 -1
  306. package/dist/widgets/forms/autocomplete/publicData.cjs.js.map +1 -1
  307. package/dist/widgets/forms/autocomplete/publicData.d.ts +3 -3
  308. package/dist/widgets/forms/autocomplete/publicData.d.ts.map +1 -1
  309. package/dist/widgets/forms/autocomplete/publicData.esm.js +6 -4
  310. package/dist/widgets/forms/autocomplete/publicData.esm.js.map +1 -1
  311. package/dist/widgets/forms/basic.cjs.js +1 -1
  312. package/dist/widgets/forms/basic.cjs.js.map +1 -1
  313. package/dist/widgets/forms/basic.esm.js +27 -25
  314. package/dist/widgets/forms/basic.esm.js.map +1 -1
  315. package/dist/widgets/forms/formStyle.cjs.js +1 -1
  316. package/dist/widgets/forms/formStyle.cjs.js.map +1 -1
  317. package/dist/widgets/forms/formStyle.esm.js +4 -4
  318. package/dist/widgets/forms/formStyle.esm.js.map +1 -1
  319. package/dist/widgets/forms.cjs.js +2 -2
  320. package/dist/widgets/forms.cjs.js.map +1 -1
  321. package/dist/widgets/forms.esm.js +10 -8
  322. package/dist/widgets/forms.esm.js.map +1 -1
  323. package/dist/widgets/multiSelect.cjs.js +1 -1
  324. package/dist/widgets/multiSelect.cjs.js.map +1 -1
  325. package/dist/widgets/multiSelect.esm.js +2 -1
  326. package/dist/widgets/multiSelect.esm.js.map +1 -1
  327. package/dist/widgets/peoplePicker.cjs.js.map +1 -1
  328. package/package.json +4 -3
  329. package/dist/chunks/auth-Knq99zZ9.js.map +0 -1
  330. package/dist/chunks/chunk.7MPIABXH-DNcYOuE8.js.map +0 -1
  331. package/dist/chunks/combobox-B5j4LoHY.js.map +0 -1
  332. package/dist/chunks/components-BD458q30.js +0 -758
  333. package/dist/chunks/components-BD458q30.js.map +0 -1
  334. package/dist/chunks/footer-BLSjn5ur.js +0 -144
  335. package/dist/chunks/footer-BLSjn5ur.js.map +0 -1
  336. package/dist/chunks/headerFooterHelpers-CPd5d20q.js +0 -52
  337. package/dist/chunks/headerFooterHelpers-CPd5d20q.js.map +0 -1
  338. package/dist/chunks/input-CCpEhtqA.js.map +0 -1
  339. package/dist/chunks/lit-C4H1jI4q.js +0 -527
  340. package/dist/chunks/lit-C4H1jI4q.js.map +0 -1
  341. package/dist/chunks/menu-DKxtACGA.js.map +0 -1
  342. package/dist/chunks/solid-logic.esm-BrMdCG2_.js.map +0 -1
  343. package/dist/chunks/src-CJICzMIV.js.map +0 -1
  344. package/dist/components/footer/index.cjs.js +0 -1
  345. package/dist/components/footer/index.d.ts +0 -2
  346. package/dist/components/footer/index.d.ts.map +0 -1
  347. package/dist/components/footer/index.esm.js +0 -3
  348. package/dist/components/footer.js +0 -2
  349. package/dist/v2/components/layout/footer/Footer.cjs.js +0 -73
  350. package/dist/v2/components/layout/footer/Footer.cjs.js.map +0 -1
  351. package/dist/v2/components/layout/footer/Footer.d.ts +0 -60
  352. package/dist/v2/components/layout/footer/Footer.d.ts.map +0 -1
  353. package/dist/v2/components/layout/footer/Footer.esm.js +0 -143
  354. package/dist/v2/components/layout/footer/Footer.esm.js.map +0 -1
  355. package/dist/v2/components/layout/footer/Footer.test.d.ts +0 -1
  356. package/dist/v2/components/layout/footer/Footer.test.d.ts.map +0 -1
  357. package/dist/v2/components/layout/footer/index.cjs.js +0 -2
  358. package/dist/v2/components/layout/footer/index.cjs.js.map +0 -1
  359. package/dist/v2/components/layout/footer/index.d.ts +0 -3
  360. package/dist/v2/components/layout/footer/index.d.ts.map +0 -1
  361. package/dist/v2/components/layout/footer/index.esm.js +0 -8
  362. package/dist/v2/components/layout/footer/index.esm.js.map +0 -1
package/README.md CHANGED
@@ -227,20 +227,6 @@ I want this all to be presented flexible in the component.
227
227
 
228
228
  * Raptor mini: when we are on layout mobile we do not want to display the help menu at all.
229
229
 
230
- * Raptor mini: Create for me a footer Lit Component in tsy style of the components I have and under v2. Take the code from this index.ts to start with.
231
-
232
- * Raptor mini: Good. Now, I want the footer to be a rectangular with round corners, grey background and it should have an adjustable position.
233
-
234
- * Raptor mini: The content of the footer should be different upon loggedin or not.
235
- If not logged in, it should say:
236
- Title Public View
237
- You are viewving this profile as a guest,
238
- And if logged in:
239
- Title: Logged in View
240
- You are logged in as nameOfLoggedIn user.
241
-
242
- * Raptor mini: add a readme to the Footer component with example.
243
-
244
230
  * Claude Sonnet 4.6: Make the drop down as a list under the input field and enlarge the pop up, make it higher, adjustable to fit the drop down. And make the drop down arrow area larger
245
231
 
246
232
  * GPT-5.4 Model: can you wire up the keyboard interactions and aria attributes for Select?
@@ -1 +1 @@
1
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));exports.__exportAll=o,exports.__toESM=c;
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));exports.__exportAll=o,exports.__toESM=c;
@@ -1 +1 @@
1
- {"version":3,"file":"access-controller.cjs.js","names":[],"sources":["../../src/acl/access-controller.ts"],"sourcesContent":["/**\n * Contains the [[AccessController]] class\n * @packageDocumentation\n */\n\nimport { adoptACLDefault, getProspectiveHolder, makeACLGraphbyCombo, sameACL } from './acl'\nimport { fetcher, graph, NamedNode, UpdateManager } from 'rdflib'\nimport { AccessGroups } from './access-groups'\nimport { DataBrowserContext } from 'pane-registry'\nimport { shortNameForFolder } from './acl-control'\nimport * as utils from '../utils'\nimport * as debug from '../lib/debug'\nimport { style } from '../lib/style'\n\n/**\n * Rendered HTML component used in the databrowser's Sharing pane.\n */\nexport class AccessController {\n public mainCombo: AccessGroups\n public defaultsCombo: AccessGroups | null\n private readonly isContainer: boolean\n private defaultsDiffer: boolean\n private readonly rootElement: HTMLDivElement\n private isUsingDefaults: boolean\n\n constructor (\n public subject: NamedNode,\n public noun: string,\n public context: DataBrowserContext,\n private statusElement: HTMLElement,\n public targetIsProtected: boolean,\n private targetDoc: NamedNode,\n private targetACLDoc: NamedNode,\n private defaultHolder: NamedNode | null,\n private defaultACLDoc: NamedNode | null,\n private prospectiveDefaultHolder: NamedNode | undefined,\n public store,\n public dom: HTMLDocument\n ) {\n this.rootElement = dom.createElement('div')\n this.rootElement.setAttribute('style', style.aclGroupContent)\n this.isContainer = targetDoc.uri.slice(-1) === '/' // Give default for all directories\n if (defaultHolder && defaultACLDoc) {\n this.isUsingDefaults = true\n const aclDefaultStore = adoptACLDefault(this.targetDoc, targetACLDoc, defaultHolder, defaultACLDoc)\n this.mainCombo = new AccessGroups(targetDoc, targetACLDoc, this, aclDefaultStore, { defaults: this.isContainer })\n this.defaultsCombo = null\n this.defaultsDiffer = false\n } else {\n this.isUsingDefaults = false\n this.mainCombo = new AccessGroups(targetDoc, targetACLDoc, this, store)\n this.defaultsCombo = new AccessGroups(targetDoc, targetACLDoc, this, store, { defaults: this.isContainer })\n this.defaultsDiffer = !sameACL(this.mainCombo.aclMap, this.defaultsCombo.aclMap)\n }\n }\n\n public get isEditable (): boolean {\n return !this.isUsingDefaults\n }\n\n public render (): HTMLElement {\n this.rootElement.innerHTML = ''\n if (this.isUsingDefaults) {\n this.renderStatus(`The sharing for this ${this.noun} is the default for folder `)\n if (this.defaultHolder) {\n const defaultHolderLink = this.statusElement.appendChild(this.dom.createElement('a'))\n defaultHolderLink.href = this.defaultHolder.uri\n defaultHolderLink.innerText = shortNameForFolder(this.defaultHolder)\n }\n } else if (!this.defaultsDiffer && this.isContainer) {\n this.renderStatus('This is also the default for things in this folder.')\n } else {\n this.renderStatus('')\n }\n this.rootElement.appendChild(this.mainCombo.render())\n if (this.defaultsCombo && this.defaultsDiffer) {\n this.rootElement.appendChild(this.renderRemoveDefaultsController())\n this.rootElement.appendChild(this.defaultsCombo.render())\n } else if (this.isEditable && this.isContainer) {\n this.rootElement.appendChild(this.renderAddDefaultsController())\n }\n if (!this.targetIsProtected && this.isUsingDefaults) {\n this.rootElement.appendChild(this.renderAddAclsController())\n } else if (!this.targetIsProtected) {\n this.rootElement.appendChild(this.renderRemoveAclsController())\n }\n return this.rootElement\n }\n\n private renderRemoveAclsController (): HTMLElement {\n const useDefaultButton = this.dom.createElement('button')\n useDefaultButton.innerText = `Remove custom sharing settings for this ${this.noun} -- just use default${this.prospectiveDefaultHolder ? ` for ${utils.label(this.prospectiveDefaultHolder)}` : ''}`\n useDefaultButton.setAttribute('style', style.bigButton)\n useDefaultButton.addEventListener('click', () => this.removeAcls()\n .then(() => this.render())\n .catch(error => this.renderStatus(error)))\n return useDefaultButton\n }\n\n private renderAddAclsController (): HTMLElement {\n const addAclButton = this.dom.createElement('button')\n addAclButton.innerText = `Set specific sharing for this ${this.noun}`\n addAclButton.setAttribute('style', style.bigButton)\n addAclButton.addEventListener('click', () => this.addAcls()\n .then(() => this.render())\n .catch(error => this.renderStatus(error)))\n return addAclButton\n }\n\n private renderAddDefaultsController (): HTMLElement {\n const containerElement = this.dom.createElement('div')\n containerElement.setAttribute('style', style.defaultsController)\n\n const noticeElement = containerElement.appendChild(this.dom.createElement('div'))\n noticeElement.innerText = 'Sharing for things within the folder currently tracks sharing for the folder.'\n noticeElement.setAttribute('style', style.defaultsControllerNotice)\n\n const button = containerElement.appendChild(this.dom.createElement('button'))\n button.innerText = 'Set the sharing of folder contents separately from the sharing for the folder'\n button.setAttribute('style', style.bigButton)\n button.addEventListener('click', () => this.addDefaults()\n .then(() => this.render()))\n return containerElement\n }\n\n private renderRemoveDefaultsController (): HTMLElement {\n const containerElement = this.dom.createElement('div')\n containerElement.setAttribute('style', style.defaultsController)\n\n const noticeElement = containerElement.appendChild(this.dom.createElement('div'))\n noticeElement.innerText = 'Access to things within this folder:'\n noticeElement.setAttribute('style', style.defaultsControllerNotice)\n\n const button = containerElement.appendChild(this.dom.createElement('button'))\n button.innerText = 'Set default for folder contents to just track the sharing for the folder'\n button.setAttribute('style', style.bigButton)\n button.addEventListener('click', () => this.removeDefaults()\n .then(() => this.render())\n .catch(error => this.renderStatus(error)))\n return containerElement\n }\n\n public renderTemporaryStatus (message: string): void {\n // @@ TODO Introduce better system for error notification to user https://github.com/solidos/mashlib/issues/87\n this.statusElement.setAttribute('style', style.aclControlBoxStatusRevealed)\n this.statusElement.innerText = message\n this.statusElement.setAttribute('style', style.temporaryStatusInit)\n setTimeout(() => {\n this.statusElement.setAttribute('style', style.temporaryStatusEnd)\n })\n setTimeout(() => {\n this.statusElement.innerText = ''\n }, 5000)\n }\n\n public renderStatus (message: string): void {\n // @@ TODO Introduce better system for error notification to user https://github.com/solidos/mashlib/issues/87\n if (!message) {\n this.statusElement.setAttribute('style', style.aclControlBoxStatusRevealed)\n }\n this.statusElement.innerText = message\n }\n\n private async addAcls (): Promise<void> {\n if (!this.defaultHolder || !this.defaultACLDoc) {\n const message = 'Unable to find defaults to copy'\n debug.error(message)\n return Promise.reject(message)\n }\n const aclGraph = adoptACLDefault(this.targetDoc, this.targetACLDoc, this.defaultHolder, this.defaultACLDoc)\n aclGraph.statements.forEach(st => this.store.add(st.subject, st.predicate, st.object, this.targetACLDoc))\n try {\n await this.store.fetcher.putBack(this.targetACLDoc)\n this.isUsingDefaults = false\n return Promise.resolve()\n } catch (error) {\n const message = ` Error writing back access control file! ${error}`\n debug.error(message)\n return Promise.reject(message)\n }\n }\n\n private async addDefaults (): Promise<void> {\n this.defaultsCombo = new AccessGroups(this.targetDoc, this.targetACLDoc, this, this.store, { defaults: true })\n this.defaultsDiffer = true\n }\n\n private async removeAcls (): Promise<void> {\n try {\n await this.store.fetcher.delete(this.targetACLDoc.uri, {})\n this.isUsingDefaults = true\n try {\n this.prospectiveDefaultHolder = await getProspectiveHolder(this.targetDoc.uri)\n } catch (error) {\n // No need to show this error in status, but good to warn about it in console\n debug.warn(error)\n }\n } catch (error) {\n const message = `Error deleting access control file: ${this.targetACLDoc}: ${error}`\n debug.error(message)\n return Promise.reject(message)\n }\n }\n\n private async removeDefaults (): Promise<void> {\n const fallbackCombo = this.defaultsCombo\n try {\n this.defaultsCombo = null\n this.defaultsDiffer = false\n await this.save()\n } catch (error) {\n this.defaultsCombo = fallbackCombo\n this.defaultsDiffer = true\n debug.error(error)\n return Promise.reject(error)\n }\n }\n\n public save (): Promise<void> {\n // build graph\n const newAClGraph = graph()\n if (!this.isContainer) {\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, true)\n } else if (this.defaultsCombo && this.defaultsDiffer) {\n // Pair of controls\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, true)\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.defaultsCombo.byCombo, this.targetACLDoc, false, true)\n } else {\n // Linked controls\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, true, true)\n }\n\n // add authenticated fetcher\n newAClGraph.fetcher = fetcher(newAClGraph, { fetch: this.store.fetcher._fetch })\n const updater = newAClGraph.updater || new UpdateManager(newAClGraph)\n\n // save ACL resource\n return new Promise((resolve, reject) => {\n updater.put(\n this.targetACLDoc,\n newAClGraph.statementsMatching(undefined, undefined, undefined, this.targetACLDoc),\n 'text/turtle',\n (uri, ok, message) => {\n if (!ok) {\n return reject(new Error(`ACL file save failed: ${message}`))\n }\n this.store.fetcher.unload(this.targetACLDoc)\n this.store.add(newAClGraph.statements)\n this.store.fetcher.requested[this.targetACLDoc.uri] = 'done' // missing: save headers\n this.mainCombo.store = this.store\n if (this.defaultsCombo) {\n this.defaultsCombo.store = this.store\n }\n this.defaultsDiffer = !!this.defaultsCombo && !sameACL(this.mainCombo.aclMap, this.defaultsCombo.aclMap)\n debug.log('ACL modification: success!')\n resolve()\n }\n )\n })\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"access-controller.cjs.js","names":[],"sources":["../../src/acl/access-controller.ts"],"sourcesContent":["/**\n * Contains the [[AccessController]] class\n * @packageDocumentation\n */\n\nimport { adoptACLDefault, getProspectiveHolder, makeACLGraphbyCombo, sameACL } from './acl'\nimport { fetcher, graph, NamedNode, UpdateManager } from 'rdflib'\nimport { AccessGroups } from './access-groups'\nimport { DataBrowserContext } from 'pane-registry'\nimport { shortNameForFolder } from './acl-control'\nimport * as utils from '../utils'\nimport * as debug from '../lib/debug'\nimport { style } from '../lib/style'\n\n/**\n * Rendered HTML component used in the databrowser's Sharing pane.\n */\nexport class AccessController {\n public mainCombo: AccessGroups\n public defaultsCombo: AccessGroups | null\n private readonly isContainer: boolean\n private defaultsDiffer: boolean\n private readonly rootElement: HTMLDivElement\n private isUsingDefaults: boolean\n\n constructor (\n public subject: NamedNode,\n public noun: string,\n public context: DataBrowserContext,\n private statusElement: HTMLElement,\n public targetIsProtected: boolean,\n private targetDoc: NamedNode,\n private targetACLDoc: NamedNode,\n private defaultHolder: NamedNode | null,\n private defaultACLDoc: NamedNode | null,\n private prospectiveDefaultHolder: NamedNode | undefined,\n public store,\n public dom: HTMLDocument\n ) {\n this.rootElement = dom.createElement('div')\n this.rootElement.setAttribute('style', style.aclGroupContent)\n this.isContainer = targetDoc.uri.slice(-1) === '/' // Give default for all directories\n if (defaultHolder && defaultACLDoc) {\n this.isUsingDefaults = true\n const aclDefaultStore = adoptACLDefault(this.targetDoc, targetACLDoc, defaultHolder, defaultACLDoc)\n this.mainCombo = new AccessGroups(targetDoc, targetACLDoc, this, aclDefaultStore, { defaults: this.isContainer })\n this.defaultsCombo = null\n this.defaultsDiffer = false\n } else {\n this.isUsingDefaults = false\n this.mainCombo = new AccessGroups(targetDoc, targetACLDoc, this, store)\n this.defaultsCombo = new AccessGroups(targetDoc, targetACLDoc, this, store, { defaults: this.isContainer })\n this.defaultsDiffer = !sameACL(this.mainCombo.aclMap, this.defaultsCombo.aclMap)\n }\n }\n\n public get isEditable (): boolean {\n return !this.isUsingDefaults\n }\n\n public render (): HTMLElement {\n this.rootElement.innerHTML = ''\n if (this.isUsingDefaults) {\n this.renderStatus(`The sharing for this ${this.noun} is the default for folder `)\n if (this.defaultHolder) {\n const defaultHolderLink = this.statusElement.appendChild(this.dom.createElement('a'))\n defaultHolderLink.href = this.defaultHolder.uri\n defaultHolderLink.innerText = shortNameForFolder(this.defaultHolder)\n }\n } else if (!this.defaultsDiffer && this.isContainer) {\n this.renderStatus('This is also the default for things in this folder.')\n } else {\n this.renderStatus('')\n }\n this.rootElement.appendChild(this.mainCombo.render())\n if (this.defaultsCombo && this.defaultsDiffer) {\n this.rootElement.appendChild(this.renderRemoveDefaultsController())\n this.rootElement.appendChild(this.defaultsCombo.render())\n } else if (this.isEditable && this.isContainer) {\n this.rootElement.appendChild(this.renderAddDefaultsController())\n }\n if (!this.targetIsProtected && this.isUsingDefaults) {\n this.rootElement.appendChild(this.renderAddAclsController())\n } else if (!this.targetIsProtected) {\n this.rootElement.appendChild(this.renderRemoveAclsController())\n }\n return this.rootElement\n }\n\n private renderRemoveAclsController (): HTMLElement {\n const useDefaultButton = this.dom.createElement('button')\n useDefaultButton.innerText = `Remove custom sharing settings for this ${this.noun} -- just use default${this.prospectiveDefaultHolder ? ` for ${utils.label(this.prospectiveDefaultHolder)}` : ''}`\n useDefaultButton.setAttribute('style', style.bigButton)\n useDefaultButton.addEventListener('click', () => this.removeAcls()\n .then(() => this.render())\n .catch(error => this.renderStatus(error)))\n return useDefaultButton\n }\n\n private renderAddAclsController (): HTMLElement {\n const addAclButton = this.dom.createElement('button')\n addAclButton.innerText = `Set specific sharing for this ${this.noun}`\n addAclButton.setAttribute('style', style.bigButton)\n addAclButton.addEventListener('click', () => this.addAcls()\n .then(() => this.render())\n .catch(error => this.renderStatus(error)))\n return addAclButton\n }\n\n private renderAddDefaultsController (): HTMLElement {\n const containerElement = this.dom.createElement('div')\n containerElement.setAttribute('style', style.defaultsController)\n\n const noticeElement = containerElement.appendChild(this.dom.createElement('div'))\n noticeElement.innerText = 'Sharing for things within the folder currently tracks sharing for the folder.'\n noticeElement.setAttribute('style', style.defaultsControllerNotice)\n\n const button = containerElement.appendChild(this.dom.createElement('button'))\n button.innerText = 'Set the sharing of folder contents separately from the sharing for the folder'\n button.setAttribute('style', style.bigButton)\n button.addEventListener('click', () => this.addDefaults()\n .then(() => this.render()))\n return containerElement\n }\n\n private renderRemoveDefaultsController (): HTMLElement {\n const containerElement = this.dom.createElement('div')\n containerElement.setAttribute('style', style.defaultsController)\n\n const noticeElement = containerElement.appendChild(this.dom.createElement('div'))\n noticeElement.innerText = 'Access to things within this folder:'\n noticeElement.setAttribute('style', style.defaultsControllerNotice)\n\n const button = containerElement.appendChild(this.dom.createElement('button'))\n button.innerText = 'Set default for folder contents to just track the sharing for the folder'\n button.setAttribute('style', style.bigButton)\n button.addEventListener('click', () => this.removeDefaults()\n .then(() => this.render())\n .catch(error => this.renderStatus(error)))\n return containerElement\n }\n\n public renderTemporaryStatus (message: string): void {\n // @@ TODO Introduce better system for error notification to user https://github.com/solidos/mashlib/issues/87\n this.statusElement.setAttribute('style', style.aclControlBoxStatusRevealed)\n this.statusElement.innerText = message\n this.statusElement.setAttribute('style', style.temporaryStatusInit)\n setTimeout(() => {\n this.statusElement.setAttribute('style', style.temporaryStatusEnd)\n })\n setTimeout(() => {\n this.statusElement.innerText = ''\n }, 5000)\n }\n\n public renderStatus (message: string): void {\n // @@ TODO Introduce better system for error notification to user https://github.com/solidos/mashlib/issues/87\n if (!message) {\n this.statusElement.setAttribute('style', style.aclControlBoxStatusRevealed)\n }\n this.statusElement.innerText = message\n }\n\n private async addAcls (): Promise<void> {\n if (!this.defaultHolder || !this.defaultACLDoc) {\n const message = 'Unable to find defaults to copy'\n debug.error(message)\n return Promise.reject(message)\n }\n const aclGraph = adoptACLDefault(this.targetDoc, this.targetACLDoc, this.defaultHolder, this.defaultACLDoc)\n aclGraph.statements.forEach(st => this.store.add(st.subject, st.predicate, st.object, this.targetACLDoc))\n try {\n await this.store.fetcher.putBack(this.targetACLDoc)\n this.isUsingDefaults = false\n return Promise.resolve()\n } catch (error) {\n const message = ` Error writing back access control file! ${error}`\n debug.error(message)\n return Promise.reject(message)\n }\n }\n\n private async addDefaults (): Promise<void> {\n this.defaultsCombo = new AccessGroups(this.targetDoc, this.targetACLDoc, this, this.store, { defaults: true })\n this.defaultsDiffer = true\n }\n\n private async removeAcls (): Promise<void> {\n try {\n await this.store.fetcher.delete(this.targetACLDoc.uri, {})\n this.isUsingDefaults = true\n try {\n this.prospectiveDefaultHolder = await getProspectiveHolder(this.targetDoc.uri)\n } catch (error) {\n // No need to show this error in status, but good to warn about it in console\n debug.warn(error)\n }\n } catch (error) {\n const message = `Error deleting access control file: ${this.targetACLDoc}: ${error}`\n debug.error(message)\n return Promise.reject(message)\n }\n }\n\n private async removeDefaults (): Promise<void> {\n const fallbackCombo = this.defaultsCombo\n try {\n this.defaultsCombo = null\n this.defaultsDiffer = false\n await this.save()\n } catch (error) {\n this.defaultsCombo = fallbackCombo\n this.defaultsDiffer = true\n debug.error(error)\n return Promise.reject(error)\n }\n }\n\n public save (): Promise<void> {\n // build graph\n const newAClGraph = graph()\n if (!this.isContainer) {\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, true)\n } else if (this.defaultsCombo && this.defaultsDiffer) {\n // Pair of controls\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, true)\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.defaultsCombo.byCombo, this.targetACLDoc, false, true)\n } else {\n // Linked controls\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, true, true)\n }\n\n // add authenticated fetcher\n newAClGraph.fetcher = fetcher(newAClGraph, { fetch: this.store.fetcher._fetch })\n const updater = newAClGraph.updater || new UpdateManager(newAClGraph)\n\n // save ACL resource\n return new Promise((resolve, reject) => {\n updater.put(\n this.targetACLDoc,\n newAClGraph.statementsMatching(undefined, undefined, undefined, this.targetACLDoc),\n 'text/turtle',\n (uri, ok, message) => {\n if (!ok) {\n return reject(new Error(`ACL file save failed: ${message}`))\n }\n this.store.fetcher.unload(this.targetACLDoc)\n this.store.add(newAClGraph.statements)\n this.store.fetcher.requested[this.targetACLDoc.uri] = 'done' // missing: save headers\n this.mainCombo.store = this.store\n if (this.defaultsCombo) {\n this.defaultsCombo.store = this.store\n }\n this.defaultsDiffer = !!this.defaultsCombo && !sameACL(this.mainCombo.aclMap, this.defaultsCombo.aclMap)\n debug.log('ACL modification: success!')\n resolve()\n }\n )\n })\n }\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- const e=require("../lib/ns.cjs.js"),t=require("../lib/debug.cjs.js"),n=require("./acl.cjs.js"),r=require("../lib/style.cjs.js"),i=require("../widgets/dragAndDrop.cjs.js"),a=require("../widgets/buttons.cjs.js");require("../widgets/index.cjs.js");const o=require("./add-agent-buttons.cjs.js");let s=require("rdflib");var c=e.default.acl,l={13:`Owners`,9:`Owners (write locked)`,5:`Editors`,3:`Posters`,2:`Submitters`,1:`Viewers`},u={13:!0,5:!0,3:!0,2:!0,1:!0},d={13:`can read, write, and control sharing.`,9:`can read and control sharing, currently write-locked.`,5:`can read and change information`,3:`can add new information, and read but not change existing information`,2:`can add new information but not read any`,1:`can read but not change information`},f=class{doc;aclDoc;controller;_options;defaults;byCombo;aclMap;addAgentButton;rootElement;_store;constructor(e,t,i,a,s={}){this.doc=e,this.aclDoc=t,this.controller=i,this._options=s,this.defaults=this._options.defaults||!1,this._store=a,this.aclMap=n.readACL(e,t,a,this.defaults),this.byCombo=n.ACLbyCombination(this.aclMap),this.addAgentButton=new o.AddAgentButtons(this),this.rootElement=this.controller.dom.createElement(`div`),this.rootElement.setAttribute(`style`,r.style.accessGroupList)}get store(){return this._store}set store(e){this._store=e,this.aclMap=n.readACL(this.doc,this.aclDoc,e,this.defaults),this.byCombo=n.ACLbyCombination(this.aclMap)}render(){return this.rootElement.innerHTML=``,this.renderGroups().forEach(e=>this.rootElement.appendChild(e)),this.controller.isEditable&&this.rootElement.appendChild(this.addAgentButton.render()),this.rootElement}renderGroups(){let e=[];for(let t=15;t>0;t--){let n=p(t);(this.controller.isEditable&&u[t]||this.byCombo[n])&&e.push(this.renderGroup(t,n))}return e}renderGroup(e,t){let n=this.controller.dom.createElement(`div`);return n.setAttribute(`style`,r.style.accessGroupListItem),i.makeDropTarget(n,e=>this.handleDroppedUris(e,t).then(()=>this.controller.render()).catch(e=>this.controller.renderStatus(e))),this.renderGroupElements(e,t).forEach(e=>n.appendChild(e)),n}renderGroupElements(e,t){let n=this.controller.dom.createElement(`div`);if(n.setAttribute(`style`,r.style.group),this.controller.isEditable)switch(e){case 1:n.setAttribute(`style`,r.style.group1);break;case 2:n.setAttribute(`style`,r.style.group2);break;case 3:n.setAttribute(`style`,r.style.group3);break;case 5:n.setAttribute(`style`,r.style.group5);break;case 9:n.setAttribute(`style`,r.style.group9);break;case 13:n.setAttribute(`style`,r.style.group13);break;default:n.setAttribute(`style`,r.style.group)}n.innerText=l[e]||m(e);let i=this.controller.dom.createElement(`div`);if(i.setAttribute(`style`,r.style.group),this.controller.isEditable)switch(e){case 1:i.setAttribute(`style`,r.style.group1);break;case 2:i.setAttribute(`style`,r.style.group2);break;case 3:i.setAttribute(`style`,r.style.group3);break;case 5:i.setAttribute(`style`,r.style.group5);break;case 9:i.setAttribute(`style`,r.style.group9);break;case 13:i.setAttribute(`style`,r.style.group13);break;default:i.setAttribute(`style`,r.style.group)}let a=i.appendChild(this.controller.dom.createElement(`table`));(this.byCombo[t]||[]).map(([e,n])=>this.renderAgent(a,t,e,n)).forEach(e=>a.appendChild(e));let o=this.controller.dom.createElement(`div`);if(o.setAttribute(`style`,r.style.group),this.controller.isEditable)switch(e){case 1:o.setAttribute(`style`,r.style.group1);break;case 2:o.setAttribute(`style`,r.style.group2);break;case 3:o.setAttribute(`style`,r.style.group3);break;case 5:o.setAttribute(`style`,r.style.group5);break;case 9:o.setAttribute(`style`,r.style.group9);break;case 13:o.setAttribute(`style`,r.style.group13);break;default:o.setAttribute(`style`,r.style.group)}return o.innerText=d[e]||`Unusual combination`,[n,i,o]}renderAgent(e,t,n,r){let i=a.personTR(this.controller.dom,c(n),(0,s.sym)(r),this.controller.isEditable?{deleteFunction:()=>this.deleteAgent(t,n,r).then(()=>e.removeChild(i)).catch(e=>this.controller.renderStatus(e))}:{});return i}async deleteAgent(e,t,n){let r=this.byCombo[e]||[],i=r.find(([e,r])=>e===t&&r===n);i&&r.splice(r.indexOf(i),1),await this.controller.save()}async addNewURI(e){await this.handleDroppedUri(e,p(1)),await this.controller.save()}async handleDroppedUris(e,t){try{await Promise.all(e.map(e=>this.handleDroppedUri(e,t))),await this.controller.save()}catch(e){return Promise.reject(e)}}async handleDroppedUri(e,n,r=!1){let i=h(e,this.store),a=(0,s.sym)(e);if(!i&&!r){t.log(` Not obvious: looking up dropped thing ${a}`);try{await this._store?.fetcher?.load(a.doc())}catch(e){let n=`Ignore error looking up dropped thing: ${e}`;return t.error(n),Promise.reject(Error(n))}return this.handleDroppedUri(e,n,!0)}else if(!i){let n=Object.keys(this.store.findTypeURIs(a)),r=n.length>0?`Detected RDF types: ${n.join(`, `)}`:`No RDF type was detected for this URI.`,i=`Error: Failed to add access target: ${e} is not a recognized ACL target type. Expected one of: vcard:WebID, vcard:Group, foaf:Person, foaf:Agent, solid:AppProvider, solid:AppProviderClass, or recognized ACL classes. Hint: try dropping a WebID profile URI, a vcard:Group URI, or a web app origin.`+r;return t.error(i),Promise.reject(Error(i))}this.setACLCombo(n,e,i,this.controller.subject)}setACLCombo(e,n,r,i){e in this.byCombo||(this.byCombo[e]=[]),this.removeAgentFromCombos(n),this.byCombo[e].push([r.pred,r.obj.uri]),t.log(`ACL: setting access to ${i} by ${r.pred}: ${r.obj}`)}removeAgentFromCombos(e){for(let t=0;t<16;t++){let n=this.byCombo[p(t)];if(n)for(let t=0;t<n.length;t++)for(;t<n.length&&n[t][1]===e;)n.splice(t,1)}}};function p(e){let t=[`Read`,`Append`,`Write`,`Control`],n=[];for(let r=0;r<4;r++)e&1<<r&&n.push(`http://www.w3.org/ns/auth/acl#`+t[r]);return n.sort(),n.join(`
1
+ const e=require("../lib/ns.cjs.js"),t=require("../lib/debug.cjs.js"),n=require("./acl.cjs.js"),r=require("../lib/style.cjs.js"),i=require("../widgets/dragAndDrop.cjs.js"),a=require("../widgets/buttons.cjs.js");require("../widgets/index.cjs.js");const o=require("./add-agent-buttons.cjs.js");let s=require("rdflib");var c=e.default.acl,l={13:`Owners`,9:`Owners (write locked)`,5:`Editors`,3:`Posters`,2:`Submitters`,1:`Viewers`},u={13:!0,5:!0,3:!0,2:!0,1:!0},d={13:`can read, write, and control sharing.`,9:`can read and control sharing, currently write-locked.`,5:`can read and change information`,3:`can add new information, and read but not change existing information`,2:`can add new information but not read any`,1:`can read but not change information`},f=class{doc;aclDoc;controller;_options;defaults;byCombo;aclMap;addAgentButton;rootElement;_store;constructor(e,t,i,a,s={}){this.doc=e,this.aclDoc=t,this.controller=i,this._options=s,this.defaults=this._options.defaults||!1,this._store=a,this.aclMap=n.readACL(e,t,a,this.defaults),this.byCombo=n.ACLbyCombination(this.aclMap),this.addAgentButton=new o.AddAgentButtons(this),this.rootElement=this.controller.dom.createElement(`div`),this.rootElement.setAttribute(`style`,r.style.accessGroupList)}get store(){return this._store}set store(e){this._store=e,this.aclMap=n.readACL(this.doc,this.aclDoc,e,this.defaults),this.byCombo=n.ACLbyCombination(this.aclMap)}render(){return this.rootElement.innerHTML=``,this.renderGroups().forEach(e=>this.rootElement.appendChild(e)),this.controller.isEditable&&this.rootElement.appendChild(this.addAgentButton.render()),this.rootElement}renderGroups(){let e=[];for(let t=15;t>0;t--){let n=p(t);(this.controller.isEditable&&u[t]||this.byCombo[n])&&e.push(this.renderGroup(t,n))}return e}renderGroup(e,t){let n=this.controller.dom.createElement(`div`);return n.setAttribute(`style`,r.style.accessGroupListItem),i.makeDropTarget(n,e=>this.handleDroppedUris(e,t).then(()=>this.controller.render()).catch(e=>this.controller.renderStatus(e))),this.renderGroupElements(e,t).forEach(e=>n.appendChild(e)),n}renderGroupElements(e,t){let n=this.controller.dom.createElement(`div`);if(n.setAttribute(`style`,r.style.group),this.controller.isEditable)switch(e){case 1:n.setAttribute(`style`,r.style.group1);break;case 2:n.setAttribute(`style`,r.style.group2);break;case 3:n.setAttribute(`style`,r.style.group3);break;case 5:n.setAttribute(`style`,r.style.group5);break;case 9:n.setAttribute(`style`,r.style.group9);break;case 13:n.setAttribute(`style`,r.style.group13);break;default:n.setAttribute(`style`,r.style.group)}n.innerText=l[e]||m(e);let i=this.controller.dom.createElement(`div`);if(i.setAttribute(`style`,r.style.group),this.controller.isEditable)switch(e){case 1:i.setAttribute(`style`,r.style.group1);break;case 2:i.setAttribute(`style`,r.style.group2);break;case 3:i.setAttribute(`style`,r.style.group3);break;case 5:i.setAttribute(`style`,r.style.group5);break;case 9:i.setAttribute(`style`,r.style.group9);break;case 13:i.setAttribute(`style`,r.style.group13);break;default:i.setAttribute(`style`,r.style.group)}let a=i.appendChild(this.controller.dom.createElement(`table`));(this.byCombo[t]||[]).map(([e,n])=>this.renderAgent(a,t,e,n)).forEach(e=>a.appendChild(e));let o=this.controller.dom.createElement(`div`);if(o.setAttribute(`style`,r.style.group),this.controller.isEditable)switch(e){case 1:o.setAttribute(`style`,r.style.group1);break;case 2:o.setAttribute(`style`,r.style.group2);break;case 3:o.setAttribute(`style`,r.style.group3);break;case 5:o.setAttribute(`style`,r.style.group5);break;case 9:o.setAttribute(`style`,r.style.group9);break;case 13:o.setAttribute(`style`,r.style.group13);break;default:o.setAttribute(`style`,r.style.group)}return o.innerText=d[e]||`Unusual combination`,[n,i,o]}renderAgent(e,t,n,r){let i=a.personTR(this.controller.dom,c(n),(0,s.sym)(r),this.controller.isEditable?{deleteFunction:()=>this.deleteAgent(t,n,r).then(()=>e.removeChild(i)).catch(e=>this.controller.renderStatus(e))}:{});return i}async deleteAgent(e,t,n){let r=this.byCombo[e]||[],i=r.find(([e,r])=>e===t&&r===n);i&&r.splice(r.indexOf(i),1),await this.controller.save()}async addNewURI(e){await this.handleDroppedUri(e,p(1)),await this.controller.save()}async handleDroppedUris(e,t){try{await Promise.all(e.map(e=>this.handleDroppedUri(e,t))),await this.controller.save()}catch(e){return Promise.reject(e)}}async handleDroppedUri(e,n,r=!1){let i=h(e,this.store),a=(0,s.sym)(e);if(!i&&!r){t.log(` Not obvious: looking up dropped thing ${a}`);try{await this._store?.fetcher?.load(a.doc())}catch(e){let n=`Ignore error looking up dropped thing: ${e}`;return t.error(n),Promise.reject(Error(n))}return this.handleDroppedUri(e,n,!0)}if(!i){let n=Object.keys(this.store.findTypeURIs(a)),r=n.length>0?`Detected RDF types: ${n.join(`, `)}`:`No RDF type was detected for this URI.`,i=`Error: Failed to add access target: ${e} is not a recognized ACL target type. Expected one of: vcard:WebID, vcard:Group, foaf:Person, foaf:Agent, solid:AppProvider, solid:AppProviderClass, or recognized ACL classes. Hint: try dropping a WebID profile URI, a vcard:Group URI, or a web app origin.`+r;return t.error(i),Promise.reject(Error(i))}this.setACLCombo(n,e,i,this.controller.subject)}setACLCombo(e,n,r,i){e in this.byCombo||(this.byCombo[e]=[]),this.removeAgentFromCombos(n),this.byCombo[e].push([r.pred,r.obj.uri]),t.log(`ACL: setting access to ${i} by ${r.pred}: ${r.obj}`)}removeAgentFromCombos(e){for(let t=0;t<16;t++){let n=this.byCombo[p(t)];if(n)for(let t=0;t<n.length;t++)for(;t<n.length&&n[t][1]===e;)n.splice(t,1)}}};function p(e){let t=[`Read`,`Append`,`Write`,`Control`],n=[];for(let r=0;r<4;r++)e&1<<r&&n.push(`http://www.w3.org/ns/auth/acl#`+t[r]);return n.sort(),n.join(`
2
2
  `)}function m(e){let t=``,n=[`Read`,`Append`,`Write`,`Control`];for(let r=0;r<4;r++)e&1<<r&&(t+=n[r]);return t}function h(n,r){let i=(0,s.sym)(n),a=r.findTypeURIs(i);for(let e in a)t.log(` drop object type includes: `+e);if(n.startsWith(`http`)&&n.split(`/`).length===3)return{pred:`origin`,obj:i};if(n.startsWith(`http`)&&n.split(`/`).length===4&&n.endsWith(`/`))return t.log(`Assuming final slash on dragged origin URI was unintended!`),{pred:`origin`,obj:(0,s.sym)(n.slice(0,-1))};if(e.default.vcard(`WebID`).uri in a)return{pred:`agent`,obj:i};if(e.default.vcard(`Group`).uri in a)return{pred:`agentGroup`,obj:i};if(i.sameTerm(e.default.foaf(`Agent`))||i.sameTerm(e.default.acl(`AuthenticatedAgent`))||i.sameTerm(e.default.rdf(`Resource`))||i.sameTerm(e.default.owl(`Thing`)))return{pred:`agentClass`,obj:i};if(e.default.vcard(`Individual`).uri in a||e.default.foaf(`Person`).uri in a||e.default.foaf(`Agent`).uri in a){let t=r.any(i,e.default.foaf(`preferredURI`));return t?{pred:`agent`,obj:(0,s.sym)(t)}:{pred:`agent`,obj:i}}return e.default.solid(`AppProvider`).uri in a?{pred:`origin`,obj:i}:e.default.solid(`AppProviderClass`).uri in a?{pred:`originClass`,obj:i}:(t.log(` Triage fails for `+n),null)}exports.AccessGroups=f;
3
3
  //# sourceMappingURL=access-groups.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"access-groups.cjs.js","names":[],"sources":["../../src/acl/access-groups.ts"],"sourcesContent":["/**\n * Contains the [[AccessGroups]]\n * and [[AccessGroupsOptions]] classes\n * @packageDocumentation\n */\n\nimport { NamedNode, sym, Store } from 'rdflib'\nimport { ACLbyCombination, readACL } from './acl'\nimport * as widgets from '../widgets'\nimport ns from '../lib/ns'\nimport { AccessController } from './access-controller'\nimport { AgentMapMap, ComboList, PartialAgentTriple } from './types'\nimport { AddAgentButtons } from './add-agent-buttons'\nimport * as debug from '../lib/debug'\nimport { style } from '../lib/style'\n\nconst ACL = ns.acl\n\nconst COLLOQUIAL = {\n 13: 'Owners',\n 9: 'Owners (write locked)',\n 5: 'Editors',\n 3: 'Posters',\n 2: 'Submitters',\n 1: 'Viewers'\n}\n\nconst RECOMMENDED = {\n 13: true,\n 5: true,\n 3: true,\n 2: true,\n 1: true\n}\n\nconst EXPLANATION = {\n 13: 'can read, write, and control sharing.',\n 9: 'can read and control sharing, currently write-locked.',\n 5: 'can read and change information',\n 3: 'can add new information, and read but not change existing information',\n 2: 'can add new information but not read any',\n 1: 'can read but not change information'\n}\n\n/**\n * Type for the options parameter of [[AccessGroups]]\n */\nexport interface AccessGroupsOptions {\n defaults?: boolean\n}\n\n/**\n * Renders the table of Owners, Editors, Posters, Submitters, Viewers\n * for https://github.com/solidos/userguide/blob/main/views/sharing/userguide.md\n */\nexport class AccessGroups {\n private readonly defaults: boolean\n public byCombo: ComboList\n public aclMap: AgentMapMap\n private readonly addAgentButton: AddAgentButtons\n private readonly rootElement: HTMLElement\n private _store: Store // @@ was LiveStore but does not need to be connected to web\n\n constructor (\n private doc: NamedNode,\n private aclDoc: NamedNode,\n public controller: AccessController,\n store: Store, // @@ was LiveStore\n private _options: AccessGroupsOptions = {}\n ) {\n this.defaults = this._options.defaults || false\n this._store = store\n this.aclMap = readACL(doc, aclDoc, store, this.defaults)\n this.byCombo = ACLbyCombination(this.aclMap)\n this.addAgentButton = new AddAgentButtons(this)\n this.rootElement = this.controller.dom.createElement('div')\n this.rootElement.setAttribute('style', style.accessGroupList)\n }\n\n public get store () {\n return this._store\n }\n\n public set store (store) {\n this._store = store\n this.aclMap = readACL(this.doc, this.aclDoc, store, this.defaults)\n this.byCombo = ACLbyCombination(this.aclMap)\n }\n\n public render (): HTMLElement {\n this.rootElement.innerHTML = ''\n this.renderGroups().forEach(group => this.rootElement.appendChild(group))\n if (this.controller.isEditable) {\n this.rootElement.appendChild(this.addAgentButton.render())\n }\n return this.rootElement\n }\n\n private renderGroups (): HTMLElement[] {\n const groupElements: HTMLElement[] = []\n for (let comboIndex = 15; comboIndex > 0; comboIndex--) {\n const combo = kToCombo(comboIndex)\n if ((this.controller.isEditable && RECOMMENDED[comboIndex]) || this.byCombo[combo]) {\n groupElements.push(this.renderGroup(comboIndex, combo))\n }\n }\n return groupElements\n }\n\n private renderGroup (comboIndex: number, combo: string): HTMLElement {\n const groupRow = this.controller.dom.createElement('div')\n groupRow.setAttribute('style', style.accessGroupListItem)\n widgets.makeDropTarget(groupRow, (uris) => this.handleDroppedUris(uris, combo)\n .then(() => this.controller.render())\n .catch(error => this.controller.renderStatus(error)))\n const groupColumns = this.renderGroupElements(comboIndex, combo)\n groupColumns.forEach(column => groupRow.appendChild(column))\n return groupRow\n }\n\n private renderGroupElements (comboIndex, combo): HTMLElement[] {\n const groupNameColumn = this.controller.dom.createElement('div')\n groupNameColumn.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupNameColumn.setAttribute('style', style.group1)\n break\n case 2:\n groupNameColumn.setAttribute('style', style.group2)\n break\n case 3:\n groupNameColumn.setAttribute('style', style.group3)\n break\n case 5:\n groupNameColumn.setAttribute('style', style.group5)\n break\n case 9:\n groupNameColumn.setAttribute('style', style.group9)\n break\n case 13:\n groupNameColumn.setAttribute('style', style.group13)\n break\n default:\n groupNameColumn.setAttribute('style', style.group)\n }\n }\n groupNameColumn.innerText = COLLOQUIAL[comboIndex] || ktToList(comboIndex)\n\n const groupAgentsColumn = this.controller.dom.createElement('div')\n groupAgentsColumn.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupAgentsColumn.setAttribute('style', style.group1)\n break\n case 2:\n groupAgentsColumn.setAttribute('style', style.group2)\n break\n case 3:\n groupAgentsColumn.setAttribute('style', style.group3)\n break\n case 5:\n groupAgentsColumn.setAttribute('style', style.group5)\n break\n case 9:\n groupAgentsColumn.setAttribute('style', style.group9)\n break\n case 13:\n groupAgentsColumn.setAttribute('style', style.group13)\n break\n default:\n groupAgentsColumn.setAttribute('style', style.group)\n }\n }\n const groupAgentsTable = groupAgentsColumn.appendChild(this.controller.dom.createElement('table'))\n const combos = this.byCombo[combo] || []\n combos\n .map(([pred, obj]) => this.renderAgent(groupAgentsTable, combo, pred, obj))\n .forEach(agentElement => groupAgentsTable.appendChild(agentElement))\n\n const groupDescriptionElement = this.controller.dom.createElement('div')\n groupDescriptionElement.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupDescriptionElement.setAttribute('style', style.group1)\n break\n case 2:\n groupDescriptionElement.setAttribute('style', style.group2)\n break\n case 3:\n groupDescriptionElement.setAttribute('style', style.group3)\n break\n case 5:\n groupDescriptionElement.setAttribute('style', style.group5)\n break\n case 9:\n groupDescriptionElement.setAttribute('style', style.group9)\n break\n case 13:\n groupDescriptionElement.setAttribute('style', style.group13)\n break\n default:\n groupDescriptionElement.setAttribute('style', style.group)\n }\n }\n groupDescriptionElement.innerText = EXPLANATION[comboIndex] || 'Unusual combination'\n\n return [groupNameColumn, groupAgentsColumn, groupDescriptionElement]\n }\n\n private renderAgent (groupAgentsTable, combo, pred, obj): HTMLElement {\n const personRow = widgets.personTR(this.controller.dom, ACL(pred), sym(obj), this.controller.isEditable\n ? {\n deleteFunction: () => this.deleteAgent(combo, pred, obj)\n .then(() => groupAgentsTable.removeChild(personRow))\n .catch(error => this.controller.renderStatus(error))\n }\n : {})\n return personRow\n }\n\n private async deleteAgent (combo, pred, obj): Promise<void> {\n const combos = this.byCombo[combo] || []\n const comboToRemove = combos.find(([comboPred, comboObj]) => comboPred === pred && comboObj === obj)\n if (comboToRemove) {\n combos.splice(combos.indexOf(comboToRemove), 1)\n }\n await this.controller.save()\n }\n\n public async addNewURI (uri: string): Promise<void> {\n await this.handleDroppedUri(uri, kToCombo(1))\n await this.controller.save()\n }\n\n private async handleDroppedUris (uris: string[], combo: string): Promise<void> {\n try {\n await Promise.all(uris.map(uri => this.handleDroppedUri(uri, combo)))\n await this.controller.save()\n } catch (error) {\n return Promise.reject(error)\n }\n }\n\n private async handleDroppedUri (uri: string, combo: string, secondAttempt: boolean = false): Promise<void> {\n const agent = findAgent(uri, this.store) // eg 'agent', 'origin', agentClass'\n const thing = sym(uri)\n if (!agent && !secondAttempt) {\n debug.log(` Not obvious: looking up dropped thing ${thing}`)\n try {\n await this._store?.fetcher?.load(thing.doc())\n } catch (error) {\n const message = `Ignore error looking up dropped thing: ${error}`\n debug.error(message)\n return Promise.reject(new Error(message))\n }\n return this.handleDroppedUri(uri, combo, true)\n } else if (!agent) {\n const detectedTypes = Object.keys(this.store.findTypeURIs(thing))\n const typeDetails = detectedTypes.length > 0\n ? `Detected RDF types: ${detectedTypes.join(', ')}`\n : 'No RDF type was detected for this URI.'\n const error =\n `Error: Failed to add access target: ${uri} is not a recognized ACL target type.` +\n ' Expected one of: vcard:WebID, vcard:Group, foaf:Person, foaf:Agent, solid:AppProvider, solid:AppProviderClass, or recognized ACL classes.' +\n ' Hint: try dropping a WebID profile URI, a vcard:Group URI, or a web app origin.' +\n typeDetails\n debug.error(error)\n return Promise.reject(new Error(error))\n }\n this.setACLCombo(combo, uri, agent, this.controller.subject)\n }\n\n private setACLCombo (combo: string, uri: string, res: PartialAgentTriple, subject: NamedNode): void {\n if (!(combo in this.byCombo)) {\n this.byCombo[combo] = []\n }\n this.removeAgentFromCombos(uri) // Combos are mutually distinct\n this.byCombo[combo].push([res.pred, res.obj.uri])\n debug.log(`ACL: setting access to ${subject} by ${res.pred}: ${res.obj}`)\n }\n\n private removeAgentFromCombos (uri: string): void {\n for (let k = 0; k < 16; k++) {\n const combos = this.byCombo[kToCombo(k)]\n if (combos) {\n for (let i = 0; i < combos.length; i++) {\n while (i < combos.length && combos[i][1] === uri) {\n combos.splice(i, 1)\n }\n }\n }\n }\n }\n}\n\nfunction kToCombo (k: number): string {\n const y = ['Read', 'Append', 'Write', 'Control']\n const combo: string[] = []\n for (let i = 0; i < 4; i++) {\n if (k & (1 << i)) {\n combo.push('http://www.w3.org/ns/auth/acl#' + y[i])\n }\n }\n combo.sort()\n return combo.join('\\n')\n}\n\nfunction ktToList (k: number): string {\n let list = ''\n const y = ['Read', 'Append', 'Write', 'Control']\n for (let i = 0; i < 4; i++) {\n if (k & (1 << i)) {\n list += y[i]\n }\n }\n return list\n}\n\nfunction findAgent (uri, kb): PartialAgentTriple | null {\n const obj = sym(uri)\n const types = kb.findTypeURIs(obj)\n for (const ty in types) {\n debug.log(' drop object type includes: ' + ty)\n }\n // An Origin URI is one like https://fred.github.io eith no trailing slash\n if (uri.startsWith('http') && uri.split('/').length === 3) {\n // there is no third slash\n return { pred: 'origin', obj } // The only way to know an origin alas\n }\n // @@ This is an almighty kludge needed because drag and drop adds extra slashes to origins\n if (\n uri.startsWith('http') &&\n uri.split('/').length === 4 &&\n uri.endsWith('/')\n ) {\n // there IS third slash\n debug.log('Assuming final slash on dragged origin URI was unintended!')\n return { pred: 'origin', obj: sym(uri.slice(0, -1)) } // Fix a URI where the drag and drop system has added a spurious slash\n }\n\n if (ns.vcard('WebID').uri in types) return { pred: 'agent', obj }\n\n if (ns.vcard('Group').uri in types) {\n return { pred: 'agentGroup', obj } // @@ note vcard membership not RDFs\n }\n if (\n obj.sameTerm(ns.foaf('Agent')) ||\n obj.sameTerm(ns.acl('AuthenticatedAgent')) || // AuthenticatedAgent\n obj.sameTerm(ns.rdf('Resource')) ||\n obj.sameTerm(ns.owl('Thing'))\n ) {\n return { pred: 'agentClass', obj }\n }\n if (\n ns.vcard('Individual').uri in types ||\n ns.foaf('Person').uri in types ||\n ns.foaf('Agent').uri in types\n ) {\n const pref = kb.any(obj, ns.foaf('preferredURI'))\n if (pref) return { pred: 'agent', obj: sym(pref) }\n return { pred: 'agent', obj }\n }\n if (ns.solid('AppProvider').uri in types) {\n return { pred: 'origin', obj }\n }\n if (ns.solid('AppProviderClass').uri in types) {\n return { pred: 'originClass', obj }\n }\n debug.log(' Triage fails for ' + uri)\n return null\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"access-groups.cjs.js","names":[],"sources":["../../src/acl/access-groups.ts"],"sourcesContent":["/**\n * Contains the [[AccessGroups]]\n * and [[AccessGroupsOptions]] classes\n * @packageDocumentation\n */\n\nimport { NamedNode, sym, Store } from 'rdflib'\nimport { ACLbyCombination, readACL } from './acl'\nimport * as widgets from '../widgets'\nimport ns from '../lib/ns'\nimport { AccessController } from './access-controller'\nimport { AgentMapMap, ComboList, PartialAgentTriple } from './types'\nimport { AddAgentButtons } from './add-agent-buttons'\nimport * as debug from '../lib/debug'\nimport { style } from '../lib/style'\n\nconst ACL = ns.acl\n\nconst COLLOQUIAL = {\n 13: 'Owners',\n 9: 'Owners (write locked)',\n 5: 'Editors',\n 3: 'Posters',\n 2: 'Submitters',\n 1: 'Viewers'\n}\n\nconst RECOMMENDED = {\n 13: true,\n 5: true,\n 3: true,\n 2: true,\n 1: true\n}\n\nconst EXPLANATION = {\n 13: 'can read, write, and control sharing.',\n 9: 'can read and control sharing, currently write-locked.',\n 5: 'can read and change information',\n 3: 'can add new information, and read but not change existing information',\n 2: 'can add new information but not read any',\n 1: 'can read but not change information'\n}\n\n/**\n * Type for the options parameter of [[AccessGroups]]\n */\nexport interface AccessGroupsOptions {\n defaults?: boolean\n}\n\n/**\n * Renders the table of Owners, Editors, Posters, Submitters, Viewers\n * for https://github.com/solidos/userguide/blob/main/views/sharing/userguide.md\n */\nexport class AccessGroups {\n private readonly defaults: boolean\n public byCombo: ComboList\n public aclMap: AgentMapMap\n private readonly addAgentButton: AddAgentButtons\n private readonly rootElement: HTMLElement\n private _store: Store // @@ was LiveStore but does not need to be connected to web\n\n constructor (\n private doc: NamedNode,\n private aclDoc: NamedNode,\n public controller: AccessController,\n store: Store, // @@ was LiveStore\n private _options: AccessGroupsOptions = {}\n ) {\n this.defaults = this._options.defaults || false\n this._store = store\n this.aclMap = readACL(doc, aclDoc, store, this.defaults)\n this.byCombo = ACLbyCombination(this.aclMap)\n this.addAgentButton = new AddAgentButtons(this)\n this.rootElement = this.controller.dom.createElement('div')\n this.rootElement.setAttribute('style', style.accessGroupList)\n }\n\n public get store () {\n return this._store\n }\n\n public set store (store) {\n this._store = store\n this.aclMap = readACL(this.doc, this.aclDoc, store, this.defaults)\n this.byCombo = ACLbyCombination(this.aclMap)\n }\n\n public render (): HTMLElement {\n this.rootElement.innerHTML = ''\n this.renderGroups().forEach(group => this.rootElement.appendChild(group))\n if (this.controller.isEditable) {\n this.rootElement.appendChild(this.addAgentButton.render())\n }\n return this.rootElement\n }\n\n private renderGroups (): HTMLElement[] {\n const groupElements: HTMLElement[] = []\n for (let comboIndex = 15; comboIndex > 0; comboIndex--) {\n const combo = kToCombo(comboIndex)\n if ((this.controller.isEditable && RECOMMENDED[comboIndex]) || this.byCombo[combo]) {\n groupElements.push(this.renderGroup(comboIndex, combo))\n }\n }\n return groupElements\n }\n\n private renderGroup (comboIndex: number, combo: string): HTMLElement {\n const groupRow = this.controller.dom.createElement('div')\n groupRow.setAttribute('style', style.accessGroupListItem)\n widgets.makeDropTarget(groupRow, (uris) => this.handleDroppedUris(uris, combo)\n .then(() => this.controller.render())\n .catch(error => this.controller.renderStatus(error)))\n const groupColumns = this.renderGroupElements(comboIndex, combo)\n groupColumns.forEach(column => groupRow.appendChild(column))\n return groupRow\n }\n\n private renderGroupElements (comboIndex, combo): HTMLElement[] {\n const groupNameColumn = this.controller.dom.createElement('div')\n groupNameColumn.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupNameColumn.setAttribute('style', style.group1)\n break\n case 2:\n groupNameColumn.setAttribute('style', style.group2)\n break\n case 3:\n groupNameColumn.setAttribute('style', style.group3)\n break\n case 5:\n groupNameColumn.setAttribute('style', style.group5)\n break\n case 9:\n groupNameColumn.setAttribute('style', style.group9)\n break\n case 13:\n groupNameColumn.setAttribute('style', style.group13)\n break\n default:\n groupNameColumn.setAttribute('style', style.group)\n }\n }\n groupNameColumn.innerText = COLLOQUIAL[comboIndex] || ktToList(comboIndex)\n\n const groupAgentsColumn = this.controller.dom.createElement('div')\n groupAgentsColumn.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupAgentsColumn.setAttribute('style', style.group1)\n break\n case 2:\n groupAgentsColumn.setAttribute('style', style.group2)\n break\n case 3:\n groupAgentsColumn.setAttribute('style', style.group3)\n break\n case 5:\n groupAgentsColumn.setAttribute('style', style.group5)\n break\n case 9:\n groupAgentsColumn.setAttribute('style', style.group9)\n break\n case 13:\n groupAgentsColumn.setAttribute('style', style.group13)\n break\n default:\n groupAgentsColumn.setAttribute('style', style.group)\n }\n }\n const groupAgentsTable = groupAgentsColumn.appendChild(this.controller.dom.createElement('table'))\n const combos = this.byCombo[combo] || []\n combos\n .map(([pred, obj]) => this.renderAgent(groupAgentsTable, combo, pred, obj))\n .forEach(agentElement => groupAgentsTable.appendChild(agentElement))\n\n const groupDescriptionElement = this.controller.dom.createElement('div')\n groupDescriptionElement.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupDescriptionElement.setAttribute('style', style.group1)\n break\n case 2:\n groupDescriptionElement.setAttribute('style', style.group2)\n break\n case 3:\n groupDescriptionElement.setAttribute('style', style.group3)\n break\n case 5:\n groupDescriptionElement.setAttribute('style', style.group5)\n break\n case 9:\n groupDescriptionElement.setAttribute('style', style.group9)\n break\n case 13:\n groupDescriptionElement.setAttribute('style', style.group13)\n break\n default:\n groupDescriptionElement.setAttribute('style', style.group)\n }\n }\n groupDescriptionElement.innerText = EXPLANATION[comboIndex] || 'Unusual combination'\n\n return [groupNameColumn, groupAgentsColumn, groupDescriptionElement]\n }\n\n private renderAgent (groupAgentsTable, combo, pred, obj): HTMLElement {\n const personRow = widgets.personTR(this.controller.dom, ACL(pred), sym(obj), this.controller.isEditable\n ? {\n deleteFunction: () => this.deleteAgent(combo, pred, obj)\n .then(() => groupAgentsTable.removeChild(personRow))\n .catch(error => this.controller.renderStatus(error))\n }\n : {})\n return personRow\n }\n\n private async deleteAgent (combo, pred, obj): Promise<void> {\n const combos = this.byCombo[combo] || []\n const comboToRemove = combos.find(([comboPred, comboObj]) => comboPred === pred && comboObj === obj)\n if (comboToRemove) {\n combos.splice(combos.indexOf(comboToRemove), 1)\n }\n await this.controller.save()\n }\n\n public async addNewURI (uri: string): Promise<void> {\n await this.handleDroppedUri(uri, kToCombo(1))\n await this.controller.save()\n }\n\n private async handleDroppedUris (uris: string[], combo: string): Promise<void> {\n try {\n await Promise.all(uris.map(uri => this.handleDroppedUri(uri, combo)))\n await this.controller.save()\n } catch (error) {\n return Promise.reject(error)\n }\n }\n\n private async handleDroppedUri (uri: string, combo: string, secondAttempt: boolean = false): Promise<void> {\n const agent = findAgent(uri, this.store) // eg 'agent', 'origin', agentClass'\n const thing = sym(uri)\n if (!agent && !secondAttempt) {\n debug.log(` Not obvious: looking up dropped thing ${thing}`)\n try {\n await this._store?.fetcher?.load(thing.doc())\n } catch (error) {\n const message = `Ignore error looking up dropped thing: ${error}`\n debug.error(message)\n return Promise.reject(new Error(message))\n }\n return this.handleDroppedUri(uri, combo, true)\n } else if (!agent) {\n const detectedTypes = Object.keys(this.store.findTypeURIs(thing))\n const typeDetails = detectedTypes.length > 0\n ? `Detected RDF types: ${detectedTypes.join(', ')}`\n : 'No RDF type was detected for this URI.'\n const error =\n `Error: Failed to add access target: ${uri} is not a recognized ACL target type.` +\n ' Expected one of: vcard:WebID, vcard:Group, foaf:Person, foaf:Agent, solid:AppProvider, solid:AppProviderClass, or recognized ACL classes.' +\n ' Hint: try dropping a WebID profile URI, a vcard:Group URI, or a web app origin.' +\n typeDetails\n debug.error(error)\n return Promise.reject(new Error(error))\n }\n this.setACLCombo(combo, uri, agent, this.controller.subject)\n }\n\n private setACLCombo (combo: string, uri: string, res: PartialAgentTriple, subject: NamedNode): void {\n if (!(combo in this.byCombo)) {\n this.byCombo[combo] = []\n }\n this.removeAgentFromCombos(uri) // Combos are mutually distinct\n this.byCombo[combo].push([res.pred, res.obj.uri])\n debug.log(`ACL: setting access to ${subject} by ${res.pred}: ${res.obj}`)\n }\n\n private removeAgentFromCombos (uri: string): void {\n for (let k = 0; k < 16; k++) {\n const combos = this.byCombo[kToCombo(k)]\n if (combos) {\n for (let i = 0; i < combos.length; i++) {\n while (i < combos.length && combos[i][1] === uri) {\n combos.splice(i, 1)\n }\n }\n }\n }\n }\n}\n\nfunction kToCombo (k: number): string {\n const y = ['Read', 'Append', 'Write', 'Control']\n const combo: string[] = []\n for (let i = 0; i < 4; i++) {\n if (k & (1 << i)) {\n combo.push('http://www.w3.org/ns/auth/acl#' + y[i])\n }\n }\n combo.sort()\n return combo.join('\\n')\n}\n\nfunction ktToList (k: number): string {\n let list = ''\n const y = ['Read', 'Append', 'Write', 'Control']\n for (let i = 0; i < 4; i++) {\n if (k & (1 << i)) {\n list += y[i]\n }\n }\n return list\n}\n\nfunction findAgent (uri, kb): PartialAgentTriple | null {\n const obj = sym(uri)\n const types = kb.findTypeURIs(obj)\n for (const ty in types) {\n debug.log(' drop object type includes: ' + ty)\n }\n // An Origin URI is one like https://fred.github.io eith no trailing slash\n if (uri.startsWith('http') && uri.split('/').length === 3) {\n // there is no third slash\n return { pred: 'origin', obj } // The only way to know an origin alas\n }\n // @@ This is an almighty kludge needed because drag and drop adds extra slashes to origins\n if (\n uri.startsWith('http') &&\n uri.split('/').length === 4 &&\n uri.endsWith('/')\n ) {\n // there IS third slash\n debug.log('Assuming final slash on dragged origin URI was unintended!')\n return { pred: 'origin', obj: sym(uri.slice(0, -1)) } // Fix a URI where the drag and drop system has added a spurious slash\n }\n\n if (ns.vcard('WebID').uri in types) return { pred: 'agent', obj }\n\n if (ns.vcard('Group').uri in types) {\n return { pred: 'agentGroup', obj } // @@ note vcard membership not RDFs\n }\n if (\n obj.sameTerm(ns.foaf('Agent')) ||\n obj.sameTerm(ns.acl('AuthenticatedAgent')) || // AuthenticatedAgent\n obj.sameTerm(ns.rdf('Resource')) ||\n obj.sameTerm(ns.owl('Thing'))\n ) {\n return { pred: 'agentClass', obj }\n }\n if (\n ns.vcard('Individual').uri in types ||\n ns.foaf('Person').uri in types ||\n ns.foaf('Agent').uri in types\n ) {\n const pref = kb.any(obj, ns.foaf('preferredURI'))\n if (pref) return { pred: 'agent', obj: sym(pref) }\n return { pred: 'agent', obj }\n }\n if (ns.solid('AppProvider').uri in types) {\n return { pred: 'origin', obj }\n }\n if (ns.solid('AppProviderClass').uri in types) {\n return { pred: 'originClass', obj }\n }\n debug.log(' Triage fails for ' + uri)\n return null\n}\n"],"mappings":"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"}
@@ -168,7 +168,8 @@ var u = e.acl, d = {
168
168
  return t(n), Promise.reject(Error(n));
169
169
  }
170
170
  return this.handleDroppedUri(e, r, !0);
171
- } else if (!a) {
171
+ }
172
+ if (!a) {
172
173
  let n = Object.keys(this.store.findTypeURIs(o)), r = n.length > 0 ? `Detected RDF types: ${n.join(", ")}` : "No RDF type was detected for this URI.", i = `Error: Failed to add access target: ${e} is not a recognized ACL target type. Expected one of: vcard:WebID, vcard:Group, foaf:Person, foaf:Agent, solid:AppProvider, solid:AppProviderClass, or recognized ACL classes. Hint: try dropping a WebID profile URI, a vcard:Group URI, or a web app origin.` + r;
173
174
  return t(i), Promise.reject(Error(i));
174
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"access-groups.esm.js","names":[],"sources":["../../src/acl/access-groups.ts"],"sourcesContent":["/**\n * Contains the [[AccessGroups]]\n * and [[AccessGroupsOptions]] classes\n * @packageDocumentation\n */\n\nimport { NamedNode, sym, Store } from 'rdflib'\nimport { ACLbyCombination, readACL } from './acl'\nimport * as widgets from '../widgets'\nimport ns from '../lib/ns'\nimport { AccessController } from './access-controller'\nimport { AgentMapMap, ComboList, PartialAgentTriple } from './types'\nimport { AddAgentButtons } from './add-agent-buttons'\nimport * as debug from '../lib/debug'\nimport { style } from '../lib/style'\n\nconst ACL = ns.acl\n\nconst COLLOQUIAL = {\n 13: 'Owners',\n 9: 'Owners (write locked)',\n 5: 'Editors',\n 3: 'Posters',\n 2: 'Submitters',\n 1: 'Viewers'\n}\n\nconst RECOMMENDED = {\n 13: true,\n 5: true,\n 3: true,\n 2: true,\n 1: true\n}\n\nconst EXPLANATION = {\n 13: 'can read, write, and control sharing.',\n 9: 'can read and control sharing, currently write-locked.',\n 5: 'can read and change information',\n 3: 'can add new information, and read but not change existing information',\n 2: 'can add new information but not read any',\n 1: 'can read but not change information'\n}\n\n/**\n * Type for the options parameter of [[AccessGroups]]\n */\nexport interface AccessGroupsOptions {\n defaults?: boolean\n}\n\n/**\n * Renders the table of Owners, Editors, Posters, Submitters, Viewers\n * for https://github.com/solidos/userguide/blob/main/views/sharing/userguide.md\n */\nexport class AccessGroups {\n private readonly defaults: boolean\n public byCombo: ComboList\n public aclMap: AgentMapMap\n private readonly addAgentButton: AddAgentButtons\n private readonly rootElement: HTMLElement\n private _store: Store // @@ was LiveStore but does not need to be connected to web\n\n constructor (\n private doc: NamedNode,\n private aclDoc: NamedNode,\n public controller: AccessController,\n store: Store, // @@ was LiveStore\n private _options: AccessGroupsOptions = {}\n ) {\n this.defaults = this._options.defaults || false\n this._store = store\n this.aclMap = readACL(doc, aclDoc, store, this.defaults)\n this.byCombo = ACLbyCombination(this.aclMap)\n this.addAgentButton = new AddAgentButtons(this)\n this.rootElement = this.controller.dom.createElement('div')\n this.rootElement.setAttribute('style', style.accessGroupList)\n }\n\n public get store () {\n return this._store\n }\n\n public set store (store) {\n this._store = store\n this.aclMap = readACL(this.doc, this.aclDoc, store, this.defaults)\n this.byCombo = ACLbyCombination(this.aclMap)\n }\n\n public render (): HTMLElement {\n this.rootElement.innerHTML = ''\n this.renderGroups().forEach(group => this.rootElement.appendChild(group))\n if (this.controller.isEditable) {\n this.rootElement.appendChild(this.addAgentButton.render())\n }\n return this.rootElement\n }\n\n private renderGroups (): HTMLElement[] {\n const groupElements: HTMLElement[] = []\n for (let comboIndex = 15; comboIndex > 0; comboIndex--) {\n const combo = kToCombo(comboIndex)\n if ((this.controller.isEditable && RECOMMENDED[comboIndex]) || this.byCombo[combo]) {\n groupElements.push(this.renderGroup(comboIndex, combo))\n }\n }\n return groupElements\n }\n\n private renderGroup (comboIndex: number, combo: string): HTMLElement {\n const groupRow = this.controller.dom.createElement('div')\n groupRow.setAttribute('style', style.accessGroupListItem)\n widgets.makeDropTarget(groupRow, (uris) => this.handleDroppedUris(uris, combo)\n .then(() => this.controller.render())\n .catch(error => this.controller.renderStatus(error)))\n const groupColumns = this.renderGroupElements(comboIndex, combo)\n groupColumns.forEach(column => groupRow.appendChild(column))\n return groupRow\n }\n\n private renderGroupElements (comboIndex, combo): HTMLElement[] {\n const groupNameColumn = this.controller.dom.createElement('div')\n groupNameColumn.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupNameColumn.setAttribute('style', style.group1)\n break\n case 2:\n groupNameColumn.setAttribute('style', style.group2)\n break\n case 3:\n groupNameColumn.setAttribute('style', style.group3)\n break\n case 5:\n groupNameColumn.setAttribute('style', style.group5)\n break\n case 9:\n groupNameColumn.setAttribute('style', style.group9)\n break\n case 13:\n groupNameColumn.setAttribute('style', style.group13)\n break\n default:\n groupNameColumn.setAttribute('style', style.group)\n }\n }\n groupNameColumn.innerText = COLLOQUIAL[comboIndex] || ktToList(comboIndex)\n\n const groupAgentsColumn = this.controller.dom.createElement('div')\n groupAgentsColumn.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupAgentsColumn.setAttribute('style', style.group1)\n break\n case 2:\n groupAgentsColumn.setAttribute('style', style.group2)\n break\n case 3:\n groupAgentsColumn.setAttribute('style', style.group3)\n break\n case 5:\n groupAgentsColumn.setAttribute('style', style.group5)\n break\n case 9:\n groupAgentsColumn.setAttribute('style', style.group9)\n break\n case 13:\n groupAgentsColumn.setAttribute('style', style.group13)\n break\n default:\n groupAgentsColumn.setAttribute('style', style.group)\n }\n }\n const groupAgentsTable = groupAgentsColumn.appendChild(this.controller.dom.createElement('table'))\n const combos = this.byCombo[combo] || []\n combos\n .map(([pred, obj]) => this.renderAgent(groupAgentsTable, combo, pred, obj))\n .forEach(agentElement => groupAgentsTable.appendChild(agentElement))\n\n const groupDescriptionElement = this.controller.dom.createElement('div')\n groupDescriptionElement.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupDescriptionElement.setAttribute('style', style.group1)\n break\n case 2:\n groupDescriptionElement.setAttribute('style', style.group2)\n break\n case 3:\n groupDescriptionElement.setAttribute('style', style.group3)\n break\n case 5:\n groupDescriptionElement.setAttribute('style', style.group5)\n break\n case 9:\n groupDescriptionElement.setAttribute('style', style.group9)\n break\n case 13:\n groupDescriptionElement.setAttribute('style', style.group13)\n break\n default:\n groupDescriptionElement.setAttribute('style', style.group)\n }\n }\n groupDescriptionElement.innerText = EXPLANATION[comboIndex] || 'Unusual combination'\n\n return [groupNameColumn, groupAgentsColumn, groupDescriptionElement]\n }\n\n private renderAgent (groupAgentsTable, combo, pred, obj): HTMLElement {\n const personRow = widgets.personTR(this.controller.dom, ACL(pred), sym(obj), this.controller.isEditable\n ? {\n deleteFunction: () => this.deleteAgent(combo, pred, obj)\n .then(() => groupAgentsTable.removeChild(personRow))\n .catch(error => this.controller.renderStatus(error))\n }\n : {})\n return personRow\n }\n\n private async deleteAgent (combo, pred, obj): Promise<void> {\n const combos = this.byCombo[combo] || []\n const comboToRemove = combos.find(([comboPred, comboObj]) => comboPred === pred && comboObj === obj)\n if (comboToRemove) {\n combos.splice(combos.indexOf(comboToRemove), 1)\n }\n await this.controller.save()\n }\n\n public async addNewURI (uri: string): Promise<void> {\n await this.handleDroppedUri(uri, kToCombo(1))\n await this.controller.save()\n }\n\n private async handleDroppedUris (uris: string[], combo: string): Promise<void> {\n try {\n await Promise.all(uris.map(uri => this.handleDroppedUri(uri, combo)))\n await this.controller.save()\n } catch (error) {\n return Promise.reject(error)\n }\n }\n\n private async handleDroppedUri (uri: string, combo: string, secondAttempt: boolean = false): Promise<void> {\n const agent = findAgent(uri, this.store) // eg 'agent', 'origin', agentClass'\n const thing = sym(uri)\n if (!agent && !secondAttempt) {\n debug.log(` Not obvious: looking up dropped thing ${thing}`)\n try {\n await this._store?.fetcher?.load(thing.doc())\n } catch (error) {\n const message = `Ignore error looking up dropped thing: ${error}`\n debug.error(message)\n return Promise.reject(new Error(message))\n }\n return this.handleDroppedUri(uri, combo, true)\n } else if (!agent) {\n const detectedTypes = Object.keys(this.store.findTypeURIs(thing))\n const typeDetails = detectedTypes.length > 0\n ? `Detected RDF types: ${detectedTypes.join(', ')}`\n : 'No RDF type was detected for this URI.'\n const error =\n `Error: Failed to add access target: ${uri} is not a recognized ACL target type.` +\n ' Expected one of: vcard:WebID, vcard:Group, foaf:Person, foaf:Agent, solid:AppProvider, solid:AppProviderClass, or recognized ACL classes.' +\n ' Hint: try dropping a WebID profile URI, a vcard:Group URI, or a web app origin.' +\n typeDetails\n debug.error(error)\n return Promise.reject(new Error(error))\n }\n this.setACLCombo(combo, uri, agent, this.controller.subject)\n }\n\n private setACLCombo (combo: string, uri: string, res: PartialAgentTriple, subject: NamedNode): void {\n if (!(combo in this.byCombo)) {\n this.byCombo[combo] = []\n }\n this.removeAgentFromCombos(uri) // Combos are mutually distinct\n this.byCombo[combo].push([res.pred, res.obj.uri])\n debug.log(`ACL: setting access to ${subject} by ${res.pred}: ${res.obj}`)\n }\n\n private removeAgentFromCombos (uri: string): void {\n for (let k = 0; k < 16; k++) {\n const combos = this.byCombo[kToCombo(k)]\n if (combos) {\n for (let i = 0; i < combos.length; i++) {\n while (i < combos.length && combos[i][1] === uri) {\n combos.splice(i, 1)\n }\n }\n }\n }\n }\n}\n\nfunction kToCombo (k: number): string {\n const y = ['Read', 'Append', 'Write', 'Control']\n const combo: string[] = []\n for (let i = 0; i < 4; i++) {\n if (k & (1 << i)) {\n combo.push('http://www.w3.org/ns/auth/acl#' + y[i])\n }\n }\n combo.sort()\n return combo.join('\\n')\n}\n\nfunction ktToList (k: number): string {\n let list = ''\n const y = ['Read', 'Append', 'Write', 'Control']\n for (let i = 0; i < 4; i++) {\n if (k & (1 << i)) {\n list += y[i]\n }\n }\n return list\n}\n\nfunction findAgent (uri, kb): PartialAgentTriple | null {\n const obj = sym(uri)\n const types = kb.findTypeURIs(obj)\n for (const ty in types) {\n debug.log(' drop object type includes: ' + ty)\n }\n // An Origin URI is one like https://fred.github.io eith no trailing slash\n if (uri.startsWith('http') && uri.split('/').length === 3) {\n // there is no third slash\n return { pred: 'origin', obj } // The only way to know an origin alas\n }\n // @@ This is an almighty kludge needed because drag and drop adds extra slashes to origins\n if (\n uri.startsWith('http') &&\n uri.split('/').length === 4 &&\n uri.endsWith('/')\n ) {\n // there IS third slash\n debug.log('Assuming final slash on dragged origin URI was unintended!')\n return { pred: 'origin', obj: sym(uri.slice(0, -1)) } // Fix a URI where the drag and drop system has added a spurious slash\n }\n\n if (ns.vcard('WebID').uri in types) return { pred: 'agent', obj }\n\n if (ns.vcard('Group').uri in types) {\n return { pred: 'agentGroup', obj } // @@ note vcard membership not RDFs\n }\n if (\n obj.sameTerm(ns.foaf('Agent')) ||\n obj.sameTerm(ns.acl('AuthenticatedAgent')) || // AuthenticatedAgent\n obj.sameTerm(ns.rdf('Resource')) ||\n obj.sameTerm(ns.owl('Thing'))\n ) {\n return { pred: 'agentClass', obj }\n }\n if (\n ns.vcard('Individual').uri in types ||\n ns.foaf('Person').uri in types ||\n ns.foaf('Agent').uri in types\n ) {\n const pref = kb.any(obj, ns.foaf('preferredURI'))\n if (pref) return { pred: 'agent', obj: sym(pref) }\n return { pred: 'agent', obj }\n }\n if (ns.solid('AppProvider').uri in types) {\n return { pred: 'origin', obj }\n }\n if (ns.solid('AppProviderClass').uri in types) {\n return { pred: 'originClass', obj }\n }\n debug.log(' Triage fails for ' + uri)\n return null\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"access-groups.esm.js","names":[],"sources":["../../src/acl/access-groups.ts"],"sourcesContent":["/**\n * Contains the [[AccessGroups]]\n * and [[AccessGroupsOptions]] classes\n * @packageDocumentation\n */\n\nimport { NamedNode, sym, Store } from 'rdflib'\nimport { ACLbyCombination, readACL } from './acl'\nimport * as widgets from '../widgets'\nimport ns from '../lib/ns'\nimport { AccessController } from './access-controller'\nimport { AgentMapMap, ComboList, PartialAgentTriple } from './types'\nimport { AddAgentButtons } from './add-agent-buttons'\nimport * as debug from '../lib/debug'\nimport { style } from '../lib/style'\n\nconst ACL = ns.acl\n\nconst COLLOQUIAL = {\n 13: 'Owners',\n 9: 'Owners (write locked)',\n 5: 'Editors',\n 3: 'Posters',\n 2: 'Submitters',\n 1: 'Viewers'\n}\n\nconst RECOMMENDED = {\n 13: true,\n 5: true,\n 3: true,\n 2: true,\n 1: true\n}\n\nconst EXPLANATION = {\n 13: 'can read, write, and control sharing.',\n 9: 'can read and control sharing, currently write-locked.',\n 5: 'can read and change information',\n 3: 'can add new information, and read but not change existing information',\n 2: 'can add new information but not read any',\n 1: 'can read but not change information'\n}\n\n/**\n * Type for the options parameter of [[AccessGroups]]\n */\nexport interface AccessGroupsOptions {\n defaults?: boolean\n}\n\n/**\n * Renders the table of Owners, Editors, Posters, Submitters, Viewers\n * for https://github.com/solidos/userguide/blob/main/views/sharing/userguide.md\n */\nexport class AccessGroups {\n private readonly defaults: boolean\n public byCombo: ComboList\n public aclMap: AgentMapMap\n private readonly addAgentButton: AddAgentButtons\n private readonly rootElement: HTMLElement\n private _store: Store // @@ was LiveStore but does not need to be connected to web\n\n constructor (\n private doc: NamedNode,\n private aclDoc: NamedNode,\n public controller: AccessController,\n store: Store, // @@ was LiveStore\n private _options: AccessGroupsOptions = {}\n ) {\n this.defaults = this._options.defaults || false\n this._store = store\n this.aclMap = readACL(doc, aclDoc, store, this.defaults)\n this.byCombo = ACLbyCombination(this.aclMap)\n this.addAgentButton = new AddAgentButtons(this)\n this.rootElement = this.controller.dom.createElement('div')\n this.rootElement.setAttribute('style', style.accessGroupList)\n }\n\n public get store () {\n return this._store\n }\n\n public set store (store) {\n this._store = store\n this.aclMap = readACL(this.doc, this.aclDoc, store, this.defaults)\n this.byCombo = ACLbyCombination(this.aclMap)\n }\n\n public render (): HTMLElement {\n this.rootElement.innerHTML = ''\n this.renderGroups().forEach(group => this.rootElement.appendChild(group))\n if (this.controller.isEditable) {\n this.rootElement.appendChild(this.addAgentButton.render())\n }\n return this.rootElement\n }\n\n private renderGroups (): HTMLElement[] {\n const groupElements: HTMLElement[] = []\n for (let comboIndex = 15; comboIndex > 0; comboIndex--) {\n const combo = kToCombo(comboIndex)\n if ((this.controller.isEditable && RECOMMENDED[comboIndex]) || this.byCombo[combo]) {\n groupElements.push(this.renderGroup(comboIndex, combo))\n }\n }\n return groupElements\n }\n\n private renderGroup (comboIndex: number, combo: string): HTMLElement {\n const groupRow = this.controller.dom.createElement('div')\n groupRow.setAttribute('style', style.accessGroupListItem)\n widgets.makeDropTarget(groupRow, (uris) => this.handleDroppedUris(uris, combo)\n .then(() => this.controller.render())\n .catch(error => this.controller.renderStatus(error)))\n const groupColumns = this.renderGroupElements(comboIndex, combo)\n groupColumns.forEach(column => groupRow.appendChild(column))\n return groupRow\n }\n\n private renderGroupElements (comboIndex, combo): HTMLElement[] {\n const groupNameColumn = this.controller.dom.createElement('div')\n groupNameColumn.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupNameColumn.setAttribute('style', style.group1)\n break\n case 2:\n groupNameColumn.setAttribute('style', style.group2)\n break\n case 3:\n groupNameColumn.setAttribute('style', style.group3)\n break\n case 5:\n groupNameColumn.setAttribute('style', style.group5)\n break\n case 9:\n groupNameColumn.setAttribute('style', style.group9)\n break\n case 13:\n groupNameColumn.setAttribute('style', style.group13)\n break\n default:\n groupNameColumn.setAttribute('style', style.group)\n }\n }\n groupNameColumn.innerText = COLLOQUIAL[comboIndex] || ktToList(comboIndex)\n\n const groupAgentsColumn = this.controller.dom.createElement('div')\n groupAgentsColumn.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupAgentsColumn.setAttribute('style', style.group1)\n break\n case 2:\n groupAgentsColumn.setAttribute('style', style.group2)\n break\n case 3:\n groupAgentsColumn.setAttribute('style', style.group3)\n break\n case 5:\n groupAgentsColumn.setAttribute('style', style.group5)\n break\n case 9:\n groupAgentsColumn.setAttribute('style', style.group9)\n break\n case 13:\n groupAgentsColumn.setAttribute('style', style.group13)\n break\n default:\n groupAgentsColumn.setAttribute('style', style.group)\n }\n }\n const groupAgentsTable = groupAgentsColumn.appendChild(this.controller.dom.createElement('table'))\n const combos = this.byCombo[combo] || []\n combos\n .map(([pred, obj]) => this.renderAgent(groupAgentsTable, combo, pred, obj))\n .forEach(agentElement => groupAgentsTable.appendChild(agentElement))\n\n const groupDescriptionElement = this.controller.dom.createElement('div')\n groupDescriptionElement.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupDescriptionElement.setAttribute('style', style.group1)\n break\n case 2:\n groupDescriptionElement.setAttribute('style', style.group2)\n break\n case 3:\n groupDescriptionElement.setAttribute('style', style.group3)\n break\n case 5:\n groupDescriptionElement.setAttribute('style', style.group5)\n break\n case 9:\n groupDescriptionElement.setAttribute('style', style.group9)\n break\n case 13:\n groupDescriptionElement.setAttribute('style', style.group13)\n break\n default:\n groupDescriptionElement.setAttribute('style', style.group)\n }\n }\n groupDescriptionElement.innerText = EXPLANATION[comboIndex] || 'Unusual combination'\n\n return [groupNameColumn, groupAgentsColumn, groupDescriptionElement]\n }\n\n private renderAgent (groupAgentsTable, combo, pred, obj): HTMLElement {\n const personRow = widgets.personTR(this.controller.dom, ACL(pred), sym(obj), this.controller.isEditable\n ? {\n deleteFunction: () => this.deleteAgent(combo, pred, obj)\n .then(() => groupAgentsTable.removeChild(personRow))\n .catch(error => this.controller.renderStatus(error))\n }\n : {})\n return personRow\n }\n\n private async deleteAgent (combo, pred, obj): Promise<void> {\n const combos = this.byCombo[combo] || []\n const comboToRemove = combos.find(([comboPred, comboObj]) => comboPred === pred && comboObj === obj)\n if (comboToRemove) {\n combos.splice(combos.indexOf(comboToRemove), 1)\n }\n await this.controller.save()\n }\n\n public async addNewURI (uri: string): Promise<void> {\n await this.handleDroppedUri(uri, kToCombo(1))\n await this.controller.save()\n }\n\n private async handleDroppedUris (uris: string[], combo: string): Promise<void> {\n try {\n await Promise.all(uris.map(uri => this.handleDroppedUri(uri, combo)))\n await this.controller.save()\n } catch (error) {\n return Promise.reject(error)\n }\n }\n\n private async handleDroppedUri (uri: string, combo: string, secondAttempt: boolean = false): Promise<void> {\n const agent = findAgent(uri, this.store) // eg 'agent', 'origin', agentClass'\n const thing = sym(uri)\n if (!agent && !secondAttempt) {\n debug.log(` Not obvious: looking up dropped thing ${thing}`)\n try {\n await this._store?.fetcher?.load(thing.doc())\n } catch (error) {\n const message = `Ignore error looking up dropped thing: ${error}`\n debug.error(message)\n return Promise.reject(new Error(message))\n }\n return this.handleDroppedUri(uri, combo, true)\n } else if (!agent) {\n const detectedTypes = Object.keys(this.store.findTypeURIs(thing))\n const typeDetails = detectedTypes.length > 0\n ? `Detected RDF types: ${detectedTypes.join(', ')}`\n : 'No RDF type was detected for this URI.'\n const error =\n `Error: Failed to add access target: ${uri} is not a recognized ACL target type.` +\n ' Expected one of: vcard:WebID, vcard:Group, foaf:Person, foaf:Agent, solid:AppProvider, solid:AppProviderClass, or recognized ACL classes.' +\n ' Hint: try dropping a WebID profile URI, a vcard:Group URI, or a web app origin.' +\n typeDetails\n debug.error(error)\n return Promise.reject(new Error(error))\n }\n this.setACLCombo(combo, uri, agent, this.controller.subject)\n }\n\n private setACLCombo (combo: string, uri: string, res: PartialAgentTriple, subject: NamedNode): void {\n if (!(combo in this.byCombo)) {\n this.byCombo[combo] = []\n }\n this.removeAgentFromCombos(uri) // Combos are mutually distinct\n this.byCombo[combo].push([res.pred, res.obj.uri])\n debug.log(`ACL: setting access to ${subject} by ${res.pred}: ${res.obj}`)\n }\n\n private removeAgentFromCombos (uri: string): void {\n for (let k = 0; k < 16; k++) {\n const combos = this.byCombo[kToCombo(k)]\n if (combos) {\n for (let i = 0; i < combos.length; i++) {\n while (i < combos.length && combos[i][1] === uri) {\n combos.splice(i, 1)\n }\n }\n }\n }\n }\n}\n\nfunction kToCombo (k: number): string {\n const y = ['Read', 'Append', 'Write', 'Control']\n const combo: string[] = []\n for (let i = 0; i < 4; i++) {\n if (k & (1 << i)) {\n combo.push('http://www.w3.org/ns/auth/acl#' + y[i])\n }\n }\n combo.sort()\n return combo.join('\\n')\n}\n\nfunction ktToList (k: number): string {\n let list = ''\n const y = ['Read', 'Append', 'Write', 'Control']\n for (let i = 0; i < 4; i++) {\n if (k & (1 << i)) {\n list += y[i]\n }\n }\n return list\n}\n\nfunction findAgent (uri, kb): PartialAgentTriple | null {\n const obj = sym(uri)\n const types = kb.findTypeURIs(obj)\n for (const ty in types) {\n debug.log(' drop object type includes: ' + ty)\n }\n // An Origin URI is one like https://fred.github.io eith no trailing slash\n if (uri.startsWith('http') && uri.split('/').length === 3) {\n // there is no third slash\n return { pred: 'origin', obj } // The only way to know an origin alas\n }\n // @@ This is an almighty kludge needed because drag and drop adds extra slashes to origins\n if (\n uri.startsWith('http') &&\n uri.split('/').length === 4 &&\n uri.endsWith('/')\n ) {\n // there IS third slash\n debug.log('Assuming final slash on dragged origin URI was unintended!')\n return { pred: 'origin', obj: sym(uri.slice(0, -1)) } // Fix a URI where the drag and drop system has added a spurious slash\n }\n\n if (ns.vcard('WebID').uri in types) return { pred: 'agent', obj }\n\n if (ns.vcard('Group').uri in types) {\n return { pred: 'agentGroup', obj } // @@ note vcard membership not RDFs\n }\n if (\n obj.sameTerm(ns.foaf('Agent')) ||\n obj.sameTerm(ns.acl('AuthenticatedAgent')) || // AuthenticatedAgent\n obj.sameTerm(ns.rdf('Resource')) ||\n obj.sameTerm(ns.owl('Thing'))\n ) {\n return { pred: 'agentClass', obj }\n }\n if (\n ns.vcard('Individual').uri in types ||\n ns.foaf('Person').uri in types ||\n ns.foaf('Agent').uri in types\n ) {\n const pref = kb.any(obj, ns.foaf('preferredURI'))\n if (pref) return { pred: 'agent', obj: sym(pref) }\n return { pred: 'agent', obj }\n }\n if (ns.solid('AppProvider').uri in types) {\n return { pred: 'origin', obj }\n }\n if (ns.solid('AppProviderClass').uri in types) {\n return { pred: 'originClass', obj }\n }\n debug.log(' Triage fails for ' + uri)\n return null\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"acl.cjs.js","names":[],"sources":["../../src/acl/acl.ts"],"sourcesContent":["/**\n * Non-UI functions for access control.\n * See https://github.com/solidos/web-access-control-spec\n * for the spec that defines how ACL documents work.\n * @packageDocumentation\n */\n\nimport ns from '../lib/ns'\nimport { solidLogicSingleton, ACL_LINK } from 'solid-logic'\nimport * as utils from '../utils'\nimport { AgentMapMap, AgentMapUnion, ComboList } from './types'\nimport * as debug from '../lib/debug'\nimport { graph, Store, NamedNode, serialize, st, Statement, sym, LiveStore } from 'rdflib'\n\nconst kb = solidLogicSingleton.store\n\n/**\n * Take the \"default\" ACL and convert it into the equivalent ACL\n * which the resource would have had. Return it as a new separate store.\n * The \"defaultForNew\" predicate is also accepted, as a deprecated\n * synonym for \"default\".\n */\nexport function adoptACLDefault (\n doc: NamedNode,\n aclDoc: NamedNode,\n defaultResource: NamedNode,\n defaultACLDoc: NamedNode\n): Store {\n const ACL = ns.acl\n const isContainer = doc.uri.slice(-1) === '/' // Give default for all directories\n\n const defaults = kb\n .each(undefined, ACL('default'), defaultResource, defaultACLDoc)\n .concat(kb.each(undefined, ACL('defaultForNew'), defaultResource, defaultACLDoc))\n\n const proposed = defaults.reduce((accumulatedStatements, da) => accumulatedStatements\n .concat(kb.statementsMatching(da as NamedNode, ns.rdf('type'), ACL('Authorization'), defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('agent'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('agentClass'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('agentGroup'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('origin'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('originClass'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('mode'), undefined, defaultACLDoc))\n .concat(st(da as NamedNode, ACL('accessTo'), doc, defaultACLDoc))\n .concat(isContainer ? st(da as NamedNode, ACL('default'), doc, defaultACLDoc) : []), [] as Statement[])\n\n const kb2 = graph() // Potential - derived is kept apart\n proposed.forEach(st => kb2.add(move(st.subject), move(st.predicate), move(st.object), sym(aclDoc.uri)))\n return kb2 as LiveStore\n\n function move (symbol) {\n const y = defaultACLDoc.uri.length // The default ACL file\n return sym(\n symbol.uri.slice(0, y) === defaultACLDoc.uri\n ? aclDoc.uri + symbol.uri.slice(y)\n : symbol.uri\n )\n }\n}\n\n/**\n * Read and canonicalize the ACL for x in aclDoc\n *\n * Accumulate the access rights which each agent or class has\n */\nexport function readACL (\n doc: NamedNode,\n aclDoc: NamedNode,\n kb2: Store = kb,\n getDefaults: boolean = false\n): AgentMapMap {\n const auths: Array<NamedNode> = getDefaults\n ? getDefaultsFallback(kb2, ns)\n : kb2.each(undefined, ns.acl('accessTo'), doc)\n\n const ACL = ns.acl\n const ac = {\n agent: {},\n agentClass: {},\n agentGroup: {},\n origin: {},\n originClass: {}\n }\n Object.keys(ac).forEach(pred => {\n auths.forEach(function (a) {\n (kb2.each(a, ACL('mode')) as Array<NamedNode>).forEach(function (mode) {\n (kb2.each(a, ACL(pred)) as Array<NamedNode>).forEach(function (agent) {\n ac[pred][agent.uri] = ac[pred][agent.uri] || {}\n ac[pred][agent.uri][mode.uri] = a // could be \"true\" but leave pointer just in case\n })\n })\n })\n })\n return ac\n\n function getDefaultsFallback (kb, ns) {\n return kb\n .each(undefined, ns.acl('default'), doc)\n .concat(kb.each(undefined, ns.acl('defaultForNew'), doc))\n }\n}\n\n/**\n * Compare two ACLs\n */\nexport function sameACL (a: AgentMapMap | AgentMapUnion, b: AgentMapMap | AgentMapUnion): boolean {\n const contains = function (a, b) {\n for (const pred in {\n agent: true,\n agentClass: true,\n agentGroup: true,\n origin: true,\n originClass: true\n }) {\n if (a[pred]) {\n for (const agent in a[pred]) {\n for (const mode in a[pred][agent]) {\n if (!b[pred][agent] || !b[pred][agent][mode]) {\n return false\n }\n }\n }\n }\n }\n return true\n }\n return contains(a, b) && contains(b, a)\n}\n\n/**\n * Union N ACLs\n */\nexport function ACLunion (list: Array<AgentMapMap | AgentMapUnion>): AgentMapUnion {\n const b = list[0]\n let a, ag\n for (let k = 1; k < list.length; k++) {\n ;['agent', 'agentClass', 'agentGroup', 'origin', 'originClass'].forEach(\n function (pred) {\n a = list[k]\n if (a[pred]) {\n for (ag in a[pred]) {\n for (const mode in a[pred][ag]) {\n if (!b[pred][ag]) b[pred][ag] = []\n b[pred][ag][mode] = true\n }\n }\n }\n }\n )\n }\n return b as AgentMapUnion\n}\n\ntype loadUnionACLCallback = (ok: boolean, message?: string | NamedNode | AgentMapUnion | AgentMapMap) => void\n\n/**\n * Merge ACLs lists from things to form union\n */\nexport function loadUnionACL (subjectList: Array<NamedNode>, callbackFunction: loadUnionACLCallback): void {\n const aclList: Array<AgentMapMap> = []\n const doList = function (list) {\n if (list.length) {\n const doc = list.shift().doc()\n getACLorDefault(doc, function (\n ok,\n p2,\n targetDoc,\n targetACLDoc,\n defaultHolder,\n defaultACLDoc\n ) {\n const defa = !p2\n if (!ok || !defaultHolder || !defaultACLDoc) return callbackFunction(ok, targetACLDoc)\n const acl = defa\n ? readACL(defaultHolder, defaultACLDoc)\n : readACL(targetDoc as NamedNode, targetACLDoc as NamedNode)\n aclList.push(acl)\n doList(list.slice(1))\n })\n } else {\n // all gone\n callbackFunction(true, ACLunion(aclList))\n }\n }\n doList(subjectList)\n}\n\n/**\n * Represents these as an RDF graph by combination of modes\n *\n * Each agent can only be in one place in this model, one combination of modes.\n * Combos are like full control, read append, read only etc.\n */\nexport function ACLbyCombination (ac: AgentMapMap | AgentMapUnion): ComboList {\n const byCombo = {}\n ;['agent', 'agentClass', 'agentGroup', 'origin', 'originClass'].forEach(function (pred) {\n for (const agent in ac[pred]) {\n const combo: string[] = []\n for (const mode in ac[pred][agent]) {\n combo.push(mode)\n }\n combo.sort()\n const combo2 = combo.join('\\n')\n if (!byCombo[combo2]) byCombo[combo2] = []\n byCombo[combo2].push([pred, agent])\n }\n })\n return byCombo\n}\n\n/**\n * Write ACL graph to store from AC\n */\nexport function makeACLGraph (kb: Store, x: NamedNode, ac: AgentMapMap, aclDoc: NamedNode): void {\n const byCombo = ACLbyCombination(ac)\n return makeACLGraphbyCombo(kb, x, byCombo, aclDoc)\n}\n\n/**\n * Write ACL graph to store from combo\n */\nexport function makeACLGraphbyCombo (\n kb: Store,\n x: NamedNode,\n byCombo: ComboList,\n aclDoc: NamedNode,\n main?: boolean,\n defa?: boolean\n): void {\n const ACL = ns.acl\n for (const combo in byCombo) {\n const pairs = byCombo[combo]\n if (!pairs.length) continue // do not add to store when no agent\n const modeURIs = combo.split('\\n')\n let short = modeURIs\n .map(function (u) {\n return u.split('#')[1]\n })\n .join('')\n if (defa && !main) short += 'Default' // don't muddle authorizations\n const a = kb.sym(aclDoc.uri + '#' + short)\n kb.add(a, ns.rdf('type'), ACL('Authorization'), aclDoc)\n if (main) {\n kb.add(a, ACL('accessTo'), x, aclDoc)\n }\n if (defa) {\n kb.add(a, ACL('default'), x, aclDoc)\n }\n for (let i = 0; i < modeURIs.length; i++) {\n kb.add(a, ACL('mode'), kb.sym(modeURIs[i]), aclDoc)\n }\n for (let i = 0; i < pairs.length; i++) {\n const pred = pairs[i][0]\n const ag = pairs[i][1]\n kb.add(a, ACL(pred), kb.sym(ag), aclDoc)\n }\n }\n}\n\n/**\n * Debugging short strings for dumping ACL\n * and possibly in the UI\n */\nexport function ACLToString (ac: AgentMapMap): string {\n return comboToString(ACLbyCombination(ac))\n}\n\n/**\n * Convert a [[ComboList]] to a string\n */\nexport function comboToString (byCombo: ComboList): string {\n let str = ''\n for (const combo in byCombo) {\n const modeURIs = combo.split('\\n')\n const initials = modeURIs\n .map(function (u) {\n return u.split('#')[1][0]\n })\n .join('')\n str += initials + ':'\n const pairs = byCombo[combo]\n for (let i = 0; i < pairs.length; i++) {\n const pred = pairs[i][0]\n const ag = sym(pairs[i][1])\n str += pred === 'agent' ? '@' : ''\n str += ag.sameTerm(ns.foaf('Agent')) ? '*' : utils.label(ag)\n if (i < pairs.length - 1) str += ','\n }\n str += ';'\n }\n return '{' + str.slice(0, -1) + '}' // drop extra semicolon\n}\n\n/**\n * Write ACL graph as Turtle\n */\nexport function makeACLString (x: NamedNode, ac: AgentMapMap, aclDoc: NamedNode): string {\n const kb2 = graph()\n makeACLGraph(kb2, x, ac, aclDoc)\n return serialize(aclDoc, kb2, aclDoc.uri, 'text/turtle') || ''\n}\n\n/**\n * Write ACL graph to web\n */\nexport function putACLObject (\n kb: LiveStore,\n x: NamedNode,\n ac: AgentMapMap | AgentMapUnion,\n aclDoc: NamedNode,\n callbackFunction: (ok: boolean, message?: string) => void\n): void {\n const byCombo = ACLbyCombination(ac)\n return putACLbyCombo(kb, x, byCombo, aclDoc, callbackFunction)\n}\n\n/**\n * Write ACL graph to web from a [[ComboList]]\n */\nexport function putACLbyCombo (\n kb: LiveStore,\n x: NamedNode,\n byCombo: ComboList,\n aclDoc: NamedNode,\n callbackFunction: (ok: boolean, message?: string) => void\n): void {\n const kb2 = graph()\n makeACLGraphbyCombo(kb2, x, byCombo, aclDoc, true)\n\n // const str = makeACLString = function(x, ac, aclDoc)\n kb.updater?.put(\n aclDoc,\n kb2.statementsMatching(undefined, undefined, undefined, aclDoc),\n 'text/turtle',\n function (uri, ok, message) {\n if (!ok) {\n callbackFunction(ok, message)\n } else {\n kb.fetcher?.unload(aclDoc)\n makeACLGraphbyCombo(kb, x, byCombo, aclDoc, true)\n kb.fetcher!.requested[aclDoc.uri] = 'done' // missing: save headers\n callbackFunction(ok)\n }\n }\n )\n}\n\ntype fixIndividualCardACLCallback = (ok: boolean, message?: string | NamedNode | AgentMapUnion | AgentMapMap) => void\ntype fixIndividualACLCallback = (ok: boolean, message?: string | NamedNode | AgentMapUnion | AgentMapMap) => void\n\n/**\n * Fix the ACl for an individual card as a function of the groups it is in\n *\n * All group files must be loaded first\n */\nexport function fixIndividualCardACL (person: NamedNode, log: Function, callbackFunction: fixIndividualCardACLCallback): void {\n const groups = kb.each(undefined, ns.vcard('hasMember'), person) as NamedNode[]\n // const doc = person.doc()\n if (groups) {\n fixIndividualACL(person, groups, log, callbackFunction)\n } else {\n log('This card is in no groups')\n callbackFunction(true) // fine, no requirements to access. default should be ok\n }\n // @@ if no groups, then use default for People container or the book top container.?\n}\n\n/**\n * This function is used by [[fixIndividualCardACL]]\n */\nexport function fixIndividualACL (item: NamedNode, subjects: Array<NamedNode>, log: Function, callbackFunction: fixIndividualACLCallback): void {\n log = log || debug.log\n const doc = item.doc()\n getACLorDefault(doc, function (\n ok,\n exists,\n targetDoc,\n targetACLDoc,\n defaultHolder,\n defaultACLDoc\n ) {\n if (!ok || !defaultHolder || !defaultACLDoc) return callbackFunction(false, targetACLDoc) // ie message\n const ac = exists\n ? readACL(targetDoc as NamedNode, targetACLDoc as NamedNode)\n : readACL(defaultHolder, defaultACLDoc)\n loadUnionACL(subjects, function (ok, union) {\n if (!ok) return callbackFunction(false, union)\n if (sameACL(union as AgentMapMap | AgentMapUnion, ac)) {\n log('Nice - same ACL. no change ' + utils.label(item) + ' ' + doc)\n } else {\n log('Group ACLs differ for ' + utils.label(item) + ' ' + doc)\n\n // log(\"Group ACLs: \" + makeACLString(targetDoc, union, targetACLDoc))\n // log((exists ? \"Previous set\" : \"Default\") + \" ACLs: \" +\n // makeACLString(targetDoc, ac, targetACLDoc))\n\n putACLObject(\n kb as unknown as LiveStore,\n targetDoc as NamedNode,\n union as AgentMapMap | AgentMapUnion,\n targetACLDoc as NamedNode,\n callbackFunction\n )\n }\n })\n })\n}\n\n/**\n * Set an ACL\n */\nexport function setACL (\n docURI: NamedNode,\n aclText: string,\n callbackFunction: (ok: boolean, message: string) => void\n): void {\n const aclDoc = kb.any(\n docURI,\n ACL_LINK\n ) // @@ check that this get set by web.js\n if (!kb.fetcher) {\n throw new Error('Store has no fetcher')\n }\n if (aclDoc) {\n // Great we already know where it is\n kb.fetcher\n .webOperation('PUT', aclDoc.value, {\n data: aclText,\n contentType: 'text/turtle'\n })\n .then((res) => {\n callbackFunction(res.ok, res.error || '')\n }) // @@@ check params\n } else {\n kb.fetcher.nowOrWhenFetched(docURI, undefined, function (ok, body) {\n if (!ok) return callbackFunction(ok, 'Gettting headers for ACL: ' + body)\n const aclDoc = kb.any(\n docURI,\n ACL_LINK\n ) // @@ check that this get set by web.js\n if (!aclDoc) {\n // complainIfBad(false, \"No Link rel=ACL header for \" + docURI)\n callbackFunction(false, 'No Link rel=ACL header for ' + docURI)\n } else {\n if (!kb.fetcher) {\n throw new Error('Store has no fetcher')\n }\n kb.fetcher\n .webOperation('PUT', aclDoc.value, {\n data: aclText,\n contentType: 'text/turtle'\n })\n .then((res) => {\n callbackFunction(res.ok, res.error || '')\n })\n }\n })\n }\n}\n\n/**\n * Get ACL file or default if necessary\n *\n * @param callbackFunction Will be called in the following ways, in the following cases:\n * * `callbackFunction(true, true, doc, aclDoc)` if the ACL did exist\n * * `callbackFunction(true, false, doc, aclDoc, defaultHolder, defaultACLDoc)` if the ACL file did not exist but a default did\n * * `callbackFunction(false, false, status, message)` when there was an error getting the original\n * * `callbackFunction(false, true, status, message)` when there was an error getting the default\n */\nexport function getACLorDefault (\n doc: NamedNode,\n callbackFunction: (\n a: boolean,\n b: boolean,\n statusOrMessage: number | NamedNode,\n message: string | NamedNode,\n c?: NamedNode,\n d?: NamedNode\n ) => void\n): void {\n getACL(doc, function (ok, status, aclDoc, message): string | void {\n const ACL = ns.acl\n if (!ok) return callbackFunction(false, false, status as number, message as string)\n\n // Recursively search for the ACL file which gives default access\n const tryParent = function (uri) {\n if (uri.slice(-1) === '/') {\n uri = uri.slice(0, -1)\n }\n const right = uri.lastIndexOf('/')\n const left = uri.indexOf('/', uri.indexOf('//') + 2)\n if (left > right) {\n return callbackFunction(false, true, 404, 'Found no ACL resource')\n }\n uri = uri.slice(0, right + 1)\n const doc2 = sym(uri)\n getACL(doc2, function (ok, status, defaultACLDoc: any): NamedNode | void {\n if (!ok) {\n return callbackFunction(\n false,\n true,\n status as number,\n `( No ACL pointer ${uri} ${status})${defaultACLDoc}`\n ) as void\n } else if (status === 403) {\n return callbackFunction(\n false,\n true,\n status,\n `( default ACL file FORBIDDEN. Stop.${uri})`\n )\n } else if (status === 404) {\n return tryParent(uri)\n } else if (status !== 200) {\n return callbackFunction(\n false,\n true,\n status as number,\n `Error status '${status}' searching for default for ${doc2}`\n )\n }\n // 200\n // statusBlock.textContent += (\" ACCESS set at \" + uri + \". End search.\")\n const defaults = kb\n .each(undefined, ACL('default'), kb.sym(uri), defaultACLDoc)\n .concat(\n kb.each(undefined, ACL('defaultForNew'), kb.sym(uri), defaultACLDoc)\n )\n if (!defaults.length) {\n return tryParent(uri) // Keep searching\n }\n const defaultHolder = kb.sym(uri)\n return callbackFunction(\n true,\n false,\n doc,\n aclDoc as NamedNode,\n defaultHolder,\n defaultACLDoc as NamedNode\n )\n })\n } // tryParent\n\n if (!ok) {\n return callbackFunction(\n false,\n false,\n status as number,\n `Error accessing Access Control information for ${doc}) ${message}`\n )\n } else if (status === 404) {\n tryParent(doc.uri) // @@ construct default one - the server should do that\n } else if (status === 403) {\n return callbackFunction(\n false,\n false,\n status,\n `(Sharing not available to you)${message}`\n )\n } else if (status !== 200) {\n return callbackFunction(\n false,\n false,\n status as number,\n `Error ${status} accessing Access Control information for ${doc}: ${message}`\n )\n } else {\n // 200\n return callbackFunction(true, true, doc, aclDoc as NamedNode)\n }\n }) // Call to getACL\n}\n\n/**\n * Calls back `(ok, status, acldoc, message)` as follows\n *\n * * `(false, 900, errormessage)` if no link header\n * * `(true, 403, documentSymbol, fileaccesserror)` if not authorized\n * * `(true, 404, documentSymbol, fileaccesserror)` if does not exist\n * * `(true, 200, documentSymbol)` if file exists and read OK\n */\nexport function getACL (\n doc: NamedNode,\n callbackFunction: (\n ok: boolean,\n messageOrStatus: number | string,\n messageOrDoc?: NamedNode | string,\n message?: string\n ) => void\n): void {\n if (!kb.fetcher) {\n throw new Error('kb has no fetcher')\n }\n kb.fetcher.nowOrWhenFetched(doc, undefined, function (ok, body) {\n if (!ok) {\n return callbackFunction(ok, `Can't get headers to find ACL for ${doc}: ${body}`)\n }\n const aclDoc = kb.any(\n doc,\n ACL_LINK\n ) // @@ check that this get set by web.js\n if (!aclDoc) {\n callbackFunction(false, 900, `No Link rel=ACL header for ${doc}`)\n } else {\n if (!kb.fetcher) {\n throw new Error('kb has no fetcher')\n }\n if (kb.fetcher.nonexistent[aclDoc.value]) {\n return callbackFunction(\n true,\n 404,\n aclDoc as NamedNode,\n `ACL file ${aclDoc} does not exist.`\n )\n }\n kb.fetcher.nowOrWhenFetched(aclDoc as NamedNode, undefined, function (\n ok,\n message,\n response\n ) {\n if (!ok) {\n callbackFunction(\n true,\n response.status,\n aclDoc as NamedNode,\n `Can't read Access Control File ${aclDoc}: ${message}`\n )\n } else {\n callbackFunction(true, 200, aclDoc as NamedNode)\n }\n })\n }\n })\n}\n\n/**\n * Calls [[getACLorDefault]] and then (?)\n */\nexport async function getProspectiveHolder (targetDirectory: string): Promise<NamedNode | undefined> {\n return new Promise((resolve, reject) => getACLorDefault(sym(targetDirectory), (\n ok,\n isDirectACL,\n targetDoc,\n targetACLDoc,\n defaultHolder\n ) => {\n if (ok) {\n return resolve((isDirectACL ? targetDoc : defaultHolder) as NamedNode)\n }\n return reject(new Error(`Error loading ${targetDirectory}`))\n }))\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"acl.cjs.js","names":[],"sources":["../../src/acl/acl.ts"],"sourcesContent":["/**\n * Non-UI functions for access control.\n * See https://github.com/solidos/web-access-control-spec\n * for the spec that defines how ACL documents work.\n * @packageDocumentation\n */\n\nimport ns from '../lib/ns'\nimport { solidLogicSingleton, ACL_LINK } from 'solid-logic'\nimport * as utils from '../utils'\nimport { AgentMapMap, AgentMapUnion, ComboList } from './types'\nimport * as debug from '../lib/debug'\nimport { graph, Store, NamedNode, serialize, st, Statement, sym, LiveStore } from 'rdflib'\n\nconst kb = solidLogicSingleton.store\n\n/**\n * Take the \"default\" ACL and convert it into the equivalent ACL\n * which the resource would have had. Return it as a new separate store.\n * The \"defaultForNew\" predicate is also accepted, as a deprecated\n * synonym for \"default\".\n */\nexport function adoptACLDefault (\n doc: NamedNode,\n aclDoc: NamedNode,\n defaultResource: NamedNode,\n defaultACLDoc: NamedNode\n): Store {\n const ACL = ns.acl\n const isContainer = doc.uri.slice(-1) === '/' // Give default for all directories\n\n const defaults = kb\n .each(undefined, ACL('default'), defaultResource, defaultACLDoc)\n .concat(kb.each(undefined, ACL('defaultForNew'), defaultResource, defaultACLDoc))\n\n const proposed = defaults.reduce((accumulatedStatements, da) => accumulatedStatements\n .concat(kb.statementsMatching(da as NamedNode, ns.rdf('type'), ACL('Authorization'), defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('agent'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('agentClass'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('agentGroup'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('origin'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('originClass'), undefined, defaultACLDoc))\n .concat(kb.statementsMatching(da as NamedNode, ACL('mode'), undefined, defaultACLDoc))\n .concat(st(da as NamedNode, ACL('accessTo'), doc, defaultACLDoc))\n .concat(isContainer ? st(da as NamedNode, ACL('default'), doc, defaultACLDoc) : []), [] as Statement[])\n\n const kb2 = graph() // Potential - derived is kept apart\n proposed.forEach(st => kb2.add(move(st.subject), move(st.predicate), move(st.object), sym(aclDoc.uri)))\n return kb2 as LiveStore\n\n function move (symbol) {\n const y = defaultACLDoc.uri.length // The default ACL file\n return sym(\n symbol.uri.slice(0, y) === defaultACLDoc.uri\n ? aclDoc.uri + symbol.uri.slice(y)\n : symbol.uri\n )\n }\n}\n\n/**\n * Read and canonicalize the ACL for x in aclDoc\n *\n * Accumulate the access rights which each agent or class has\n */\nexport function readACL (\n doc: NamedNode,\n aclDoc: NamedNode,\n kb2: Store = kb,\n getDefaults: boolean = false\n): AgentMapMap {\n const auths: Array<NamedNode> = getDefaults\n ? getDefaultsFallback(kb2, ns)\n : kb2.each(undefined, ns.acl('accessTo'), doc)\n\n const ACL = ns.acl\n const ac = {\n agent: {},\n agentClass: {},\n agentGroup: {},\n origin: {},\n originClass: {}\n }\n Object.keys(ac).forEach(pred => {\n auths.forEach(function (a) {\n (kb2.each(a, ACL('mode')) as Array<NamedNode>).forEach(function (mode) {\n (kb2.each(a, ACL(pred)) as Array<NamedNode>).forEach(function (agent) {\n ac[pred][agent.uri] = ac[pred][agent.uri] || {}\n ac[pred][agent.uri][mode.uri] = a // could be \"true\" but leave pointer just in case\n })\n })\n })\n })\n return ac\n\n function getDefaultsFallback (kb, ns) {\n return kb\n .each(undefined, ns.acl('default'), doc)\n .concat(kb.each(undefined, ns.acl('defaultForNew'), doc))\n }\n}\n\n/**\n * Compare two ACLs\n */\nexport function sameACL (a: AgentMapMap | AgentMapUnion, b: AgentMapMap | AgentMapUnion): boolean {\n const contains = function (a, b) {\n for (const pred in {\n agent: true,\n agentClass: true,\n agentGroup: true,\n origin: true,\n originClass: true\n }) {\n if (a[pred]) {\n for (const agent in a[pred]) {\n for (const mode in a[pred][agent]) {\n if (!b[pred][agent] || !b[pred][agent][mode]) {\n return false\n }\n }\n }\n }\n }\n return true\n }\n return contains(a, b) && contains(b, a)\n}\n\n/**\n * Union N ACLs\n */\nexport function ACLunion (list: Array<AgentMapMap | AgentMapUnion>): AgentMapUnion {\n const b = list[0]\n let a, ag\n for (let k = 1; k < list.length; k++) {\n ;['agent', 'agentClass', 'agentGroup', 'origin', 'originClass'].forEach(\n function (pred) {\n a = list[k]\n if (a[pred]) {\n for (ag in a[pred]) {\n for (const mode in a[pred][ag]) {\n if (!b[pred][ag]) b[pred][ag] = []\n b[pred][ag][mode] = true\n }\n }\n }\n }\n )\n }\n return b as AgentMapUnion\n}\n\ntype loadUnionACLCallback = (ok: boolean, message?: string | NamedNode | AgentMapUnion | AgentMapMap) => void\n\n/**\n * Merge ACLs lists from things to form union\n */\nexport function loadUnionACL (subjectList: Array<NamedNode>, callbackFunction: loadUnionACLCallback): void {\n const aclList: Array<AgentMapMap> = []\n const doList = function (list) {\n if (list.length) {\n const doc = list.shift().doc()\n getACLorDefault(doc, function (\n ok,\n p2,\n targetDoc,\n targetACLDoc,\n defaultHolder,\n defaultACLDoc\n ) {\n const defa = !p2\n if (!ok || !defaultHolder || !defaultACLDoc) return callbackFunction(ok, targetACLDoc)\n const acl = defa\n ? readACL(defaultHolder, defaultACLDoc)\n : readACL(targetDoc as NamedNode, targetACLDoc as NamedNode)\n aclList.push(acl)\n doList(list.slice(1))\n })\n } else {\n // all gone\n callbackFunction(true, ACLunion(aclList))\n }\n }\n doList(subjectList)\n}\n\n/**\n * Represents these as an RDF graph by combination of modes\n *\n * Each agent can only be in one place in this model, one combination of modes.\n * Combos are like full control, read append, read only etc.\n */\nexport function ACLbyCombination (ac: AgentMapMap | AgentMapUnion): ComboList {\n const byCombo = {}\n ;['agent', 'agentClass', 'agentGroup', 'origin', 'originClass'].forEach(function (pred) {\n for (const agent in ac[pred]) {\n const combo: string[] = []\n for (const mode in ac[pred][agent]) {\n combo.push(mode)\n }\n combo.sort()\n const combo2 = combo.join('\\n')\n if (!byCombo[combo2]) byCombo[combo2] = []\n byCombo[combo2].push([pred, agent])\n }\n })\n return byCombo\n}\n\n/**\n * Write ACL graph to store from AC\n */\nexport function makeACLGraph (kb: Store, x: NamedNode, ac: AgentMapMap, aclDoc: NamedNode): void {\n const byCombo = ACLbyCombination(ac)\n return makeACLGraphbyCombo(kb, x, byCombo, aclDoc)\n}\n\n/**\n * Write ACL graph to store from combo\n */\nexport function makeACLGraphbyCombo (\n kb: Store,\n x: NamedNode,\n byCombo: ComboList,\n aclDoc: NamedNode,\n main?: boolean,\n defa?: boolean\n): void {\n const ACL = ns.acl\n for (const combo in byCombo) {\n const pairs = byCombo[combo]\n if (!pairs.length) continue // do not add to store when no agent\n const modeURIs = combo.split('\\n')\n let short = modeURIs\n .map(function (u) {\n return u.split('#')[1]\n })\n .join('')\n if (defa && !main) short += 'Default' // don't muddle authorizations\n const a = kb.sym(aclDoc.uri + '#' + short)\n kb.add(a, ns.rdf('type'), ACL('Authorization'), aclDoc)\n if (main) {\n kb.add(a, ACL('accessTo'), x, aclDoc)\n }\n if (defa) {\n kb.add(a, ACL('default'), x, aclDoc)\n }\n for (let i = 0; i < modeURIs.length; i++) {\n kb.add(a, ACL('mode'), kb.sym(modeURIs[i]), aclDoc)\n }\n for (let i = 0; i < pairs.length; i++) {\n const pred = pairs[i][0]\n const ag = pairs[i][1]\n kb.add(a, ACL(pred), kb.sym(ag), aclDoc)\n }\n }\n}\n\n/**\n * Debugging short strings for dumping ACL\n * and possibly in the UI\n */\nexport function ACLToString (ac: AgentMapMap): string {\n return comboToString(ACLbyCombination(ac))\n}\n\n/**\n * Convert a [[ComboList]] to a string\n */\nexport function comboToString (byCombo: ComboList): string {\n let str = ''\n for (const combo in byCombo) {\n const modeURIs = combo.split('\\n')\n const initials = modeURIs\n .map(function (u) {\n return u.split('#')[1][0]\n })\n .join('')\n str += initials + ':'\n const pairs = byCombo[combo]\n for (let i = 0; i < pairs.length; i++) {\n const pred = pairs[i][0]\n const ag = sym(pairs[i][1])\n str += pred === 'agent' ? '@' : ''\n str += ag.sameTerm(ns.foaf('Agent')) ? '*' : utils.label(ag)\n if (i < pairs.length - 1) str += ','\n }\n str += ';'\n }\n return '{' + str.slice(0, -1) + '}' // drop extra semicolon\n}\n\n/**\n * Write ACL graph as Turtle\n */\nexport function makeACLString (x: NamedNode, ac: AgentMapMap, aclDoc: NamedNode): string {\n const kb2 = graph()\n makeACLGraph(kb2, x, ac, aclDoc)\n return serialize(aclDoc, kb2, aclDoc.uri, 'text/turtle') || ''\n}\n\n/**\n * Write ACL graph to web\n */\nexport function putACLObject (\n kb: LiveStore,\n x: NamedNode,\n ac: AgentMapMap | AgentMapUnion,\n aclDoc: NamedNode,\n callbackFunction: (ok: boolean, message?: string) => void\n): void {\n const byCombo = ACLbyCombination(ac)\n return putACLbyCombo(kb, x, byCombo, aclDoc, callbackFunction)\n}\n\n/**\n * Write ACL graph to web from a [[ComboList]]\n */\nexport function putACLbyCombo (\n kb: LiveStore,\n x: NamedNode,\n byCombo: ComboList,\n aclDoc: NamedNode,\n callbackFunction: (ok: boolean, message?: string) => void\n): void {\n const kb2 = graph()\n makeACLGraphbyCombo(kb2, x, byCombo, aclDoc, true)\n\n // const str = makeACLString = function(x, ac, aclDoc)\n kb.updater?.put(\n aclDoc,\n kb2.statementsMatching(undefined, undefined, undefined, aclDoc),\n 'text/turtle',\n function (uri, ok, message) {\n if (!ok) {\n callbackFunction(ok, message)\n } else {\n kb.fetcher?.unload(aclDoc)\n makeACLGraphbyCombo(kb, x, byCombo, aclDoc, true)\n kb.fetcher!.requested[aclDoc.uri] = 'done' // missing: save headers\n callbackFunction(ok)\n }\n }\n )\n}\n\ntype fixIndividualCardACLCallback = (ok: boolean, message?: string | NamedNode | AgentMapUnion | AgentMapMap) => void\ntype fixIndividualACLCallback = (ok: boolean, message?: string | NamedNode | AgentMapUnion | AgentMapMap) => void\n\n/**\n * Fix the ACl for an individual card as a function of the groups it is in\n *\n * All group files must be loaded first\n */\nexport function fixIndividualCardACL (person: NamedNode, log: Function, callbackFunction: fixIndividualCardACLCallback): void {\n const groups = kb.each(undefined, ns.vcard('hasMember'), person) as NamedNode[]\n // const doc = person.doc()\n if (groups) {\n fixIndividualACL(person, groups, log, callbackFunction)\n } else {\n log('This card is in no groups')\n callbackFunction(true) // fine, no requirements to access. default should be ok\n }\n // @@ if no groups, then use default for People container or the book top container.?\n}\n\n/**\n * This function is used by [[fixIndividualCardACL]]\n */\nexport function fixIndividualACL (item: NamedNode, subjects: Array<NamedNode>, log: Function, callbackFunction: fixIndividualACLCallback): void {\n log = log || debug.log\n const doc = item.doc()\n getACLorDefault(doc, function (\n ok,\n exists,\n targetDoc,\n targetACLDoc,\n defaultHolder,\n defaultACLDoc\n ) {\n if (!ok || !defaultHolder || !defaultACLDoc) return callbackFunction(false, targetACLDoc) // ie message\n const ac = exists\n ? readACL(targetDoc as NamedNode, targetACLDoc as NamedNode)\n : readACL(defaultHolder, defaultACLDoc)\n loadUnionACL(subjects, function (ok, union) {\n if (!ok) return callbackFunction(false, union)\n if (sameACL(union as AgentMapMap | AgentMapUnion, ac)) {\n log('Nice - same ACL. no change ' + utils.label(item) + ' ' + doc)\n } else {\n log('Group ACLs differ for ' + utils.label(item) + ' ' + doc)\n\n // log(\"Group ACLs: \" + makeACLString(targetDoc, union, targetACLDoc))\n // log((exists ? \"Previous set\" : \"Default\") + \" ACLs: \" +\n // makeACLString(targetDoc, ac, targetACLDoc))\n\n putACLObject(\n kb as unknown as LiveStore,\n targetDoc as NamedNode,\n union as AgentMapMap | AgentMapUnion,\n targetACLDoc as NamedNode,\n callbackFunction\n )\n }\n })\n })\n}\n\n/**\n * Set an ACL\n */\nexport function setACL (\n docURI: NamedNode,\n aclText: string,\n callbackFunction: (ok: boolean, message: string) => void\n): void {\n const aclDoc = kb.any(\n docURI,\n ACL_LINK\n ) // @@ check that this get set by web.js\n if (!kb.fetcher) {\n throw new Error('Store has no fetcher')\n }\n if (aclDoc) {\n // Great we already know where it is\n kb.fetcher\n .webOperation('PUT', aclDoc.value, {\n data: aclText,\n contentType: 'text/turtle'\n })\n .then((res) => {\n callbackFunction(res.ok, res.error || '')\n }) // @@@ check params\n } else {\n kb.fetcher.nowOrWhenFetched(docURI, undefined, function (ok, body) {\n if (!ok) return callbackFunction(ok, 'Gettting headers for ACL: ' + body)\n const aclDoc = kb.any(\n docURI,\n ACL_LINK\n ) // @@ check that this get set by web.js\n if (!aclDoc) {\n // complainIfBad(false, \"No Link rel=ACL header for \" + docURI)\n callbackFunction(false, 'No Link rel=ACL header for ' + docURI)\n } else {\n if (!kb.fetcher) {\n throw new Error('Store has no fetcher')\n }\n kb.fetcher\n .webOperation('PUT', aclDoc.value, {\n data: aclText,\n contentType: 'text/turtle'\n })\n .then((res) => {\n callbackFunction(res.ok, res.error || '')\n })\n }\n })\n }\n}\n\n/**\n * Get ACL file or default if necessary\n *\n * @param callbackFunction Will be called in the following ways, in the following cases:\n * * `callbackFunction(true, true, doc, aclDoc)` if the ACL did exist\n * * `callbackFunction(true, false, doc, aclDoc, defaultHolder, defaultACLDoc)` if the ACL file did not exist but a default did\n * * `callbackFunction(false, false, status, message)` when there was an error getting the original\n * * `callbackFunction(false, true, status, message)` when there was an error getting the default\n */\nexport function getACLorDefault (\n doc: NamedNode,\n callbackFunction: (\n a: boolean,\n b: boolean,\n statusOrMessage: number | NamedNode,\n message: string | NamedNode,\n c?: NamedNode,\n d?: NamedNode\n ) => void\n): void {\n getACL(doc, function (ok, status, aclDoc, message): string | void {\n const ACL = ns.acl\n if (!ok) return callbackFunction(false, false, status as number, message as string)\n\n // Recursively search for the ACL file which gives default access\n const tryParent = function (uri) {\n if (uri.slice(-1) === '/') {\n uri = uri.slice(0, -1)\n }\n const right = uri.lastIndexOf('/')\n const left = uri.indexOf('/', uri.indexOf('//') + 2)\n if (left > right) {\n return callbackFunction(false, true, 404, 'Found no ACL resource')\n }\n uri = uri.slice(0, right + 1)\n const doc2 = sym(uri)\n getACL(doc2, function (ok, status, defaultACLDoc: any): NamedNode | void {\n if (!ok) {\n return callbackFunction(\n false,\n true,\n status as number,\n `( No ACL pointer ${uri} ${status})${defaultACLDoc}`\n ) as void\n } else if (status === 403) {\n return callbackFunction(\n false,\n true,\n status,\n `( default ACL file FORBIDDEN. Stop.${uri})`\n )\n } else if (status === 404) {\n return tryParent(uri)\n } else if (status !== 200) {\n return callbackFunction(\n false,\n true,\n status as number,\n `Error status '${status}' searching for default for ${doc2}`\n )\n }\n // 200\n // statusBlock.textContent += (\" ACCESS set at \" + uri + \". End search.\")\n const defaults = kb\n .each(undefined, ACL('default'), kb.sym(uri), defaultACLDoc)\n .concat(\n kb.each(undefined, ACL('defaultForNew'), kb.sym(uri), defaultACLDoc)\n )\n if (!defaults.length) {\n return tryParent(uri) // Keep searching\n }\n const defaultHolder = kb.sym(uri)\n return callbackFunction(\n true,\n false,\n doc,\n aclDoc as NamedNode,\n defaultHolder,\n defaultACLDoc as NamedNode\n )\n })\n } // tryParent\n\n if (!ok) {\n return callbackFunction(\n false,\n false,\n status as number,\n `Error accessing Access Control information for ${doc}) ${message}`\n )\n } else if (status === 404) {\n tryParent(doc.uri) // @@ construct default one - the server should do that\n } else if (status === 403) {\n return callbackFunction(\n false,\n false,\n status,\n `(Sharing not available to you)${message}`\n )\n } else if (status !== 200) {\n return callbackFunction(\n false,\n false,\n status as number,\n `Error ${status} accessing Access Control information for ${doc}: ${message}`\n )\n } else {\n // 200\n return callbackFunction(true, true, doc, aclDoc as NamedNode)\n }\n }) // Call to getACL\n}\n\n/**\n * Calls back `(ok, status, acldoc, message)` as follows\n *\n * * `(false, 900, errormessage)` if no link header\n * * `(true, 403, documentSymbol, fileaccesserror)` if not authorized\n * * `(true, 404, documentSymbol, fileaccesserror)` if does not exist\n * * `(true, 200, documentSymbol)` if file exists and read OK\n */\nexport function getACL (\n doc: NamedNode,\n callbackFunction: (\n ok: boolean,\n messageOrStatus: number | string,\n messageOrDoc?: NamedNode | string,\n message?: string\n ) => void\n): void {\n if (!kb.fetcher) {\n throw new Error('kb has no fetcher')\n }\n kb.fetcher.nowOrWhenFetched(doc, undefined, function (ok, body) {\n if (!ok) {\n return callbackFunction(ok, `Can't get headers to find ACL for ${doc}: ${body}`)\n }\n const aclDoc = kb.any(\n doc,\n ACL_LINK\n ) // @@ check that this get set by web.js\n if (!aclDoc) {\n callbackFunction(false, 900, `No Link rel=ACL header for ${doc}`)\n } else {\n if (!kb.fetcher) {\n throw new Error('kb has no fetcher')\n }\n if (kb.fetcher.nonexistent[aclDoc.value]) {\n return callbackFunction(\n true,\n 404,\n aclDoc as NamedNode,\n `ACL file ${aclDoc} does not exist.`\n )\n }\n kb.fetcher.nowOrWhenFetched(aclDoc as NamedNode, undefined, function (\n ok,\n message,\n response\n ) {\n if (!ok) {\n callbackFunction(\n true,\n response.status,\n aclDoc as NamedNode,\n `Can't read Access Control File ${aclDoc}: ${message}`\n )\n } else {\n callbackFunction(true, 200, aclDoc as NamedNode)\n }\n })\n }\n })\n}\n\n/**\n * Calls [[getACLorDefault]] and then (?)\n */\nexport async function getProspectiveHolder (targetDirectory: string): Promise<NamedNode | undefined> {\n return new Promise((resolve, reject) => getACLorDefault(sym(targetDirectory), (\n ok,\n isDirectACL,\n targetDoc,\n targetACLDoc,\n defaultHolder\n ) => {\n if (ok) {\n return resolve((isDirectACL ? targetDoc : defaultHolder) as NamedNode)\n }\n return reject(new Error(`Error loading ${targetDirectory}`))\n }))\n}\n"],"mappings":"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"}