@girder/core 5.0.0-beta.1 → 5.0.0-beta.2

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 (239) hide show
  1. package/dist-lib/Girder_Favicon.png +0 -0
  2. package/dist-lib/Girder_Mark.png +0 -0
  3. package/dist-lib/girder-core.js +48560 -0
  4. package/dist-lib/girder-core.js.map +1 -0
  5. package/dist-lib/girder-core.umd.cjs +630 -0
  6. package/dist-lib/girder-core.umd.cjs.map +1 -0
  7. package/dist-lib/index.d.ts +1 -0
  8. package/dist-lib/src/auth.js +112 -0
  9. package/dist-lib/src/collections/ApiKeyCollection.js +9 -0
  10. package/dist-lib/src/collections/AssetstoreCollection.js +9 -0
  11. package/dist-lib/src/collections/Collection.js +295 -0
  12. package/dist-lib/src/collections/CollectionCollection.js +9 -0
  13. package/dist-lib/src/collections/FileCollection.js +11 -0
  14. package/dist-lib/src/collections/FolderCollection.js +11 -0
  15. package/dist-lib/src/collections/GroupCollection.js +9 -0
  16. package/dist-lib/src/collections/ItemCollection.js +11 -0
  17. package/dist-lib/src/collections/UserCollection.js +24 -0
  18. package/dist-lib/src/collections/index.js +21 -0
  19. package/dist-lib/src/constants.js +32 -0
  20. package/dist-lib/src/dialog.js +128 -0
  21. package/dist-lib/src/events.js +6 -0
  22. package/dist-lib/src/index.d.ts +23 -0
  23. package/dist-lib/src/index.ts +80 -0
  24. package/dist-lib/src/main.ts +45 -0
  25. package/dist-lib/src/misc.js +260 -0
  26. package/dist-lib/src/models/AccessControlledModel.js +76 -0
  27. package/dist-lib/src/models/ApiKeyModel.js +31 -0
  28. package/dist-lib/src/models/AssetstoreModel.js +43 -0
  29. package/dist-lib/src/models/CollectionCreationPolicyModel.js +20 -0
  30. package/dist-lib/src/models/CollectionModel.js +12 -0
  31. package/dist-lib/src/models/FileModel.js +310 -0
  32. package/dist-lib/src/models/FolderModel.js +33 -0
  33. package/dist-lib/src/models/GroupModel.js +197 -0
  34. package/dist-lib/src/models/ItemModel.js +72 -0
  35. package/dist-lib/src/models/MetadataMixin.js +88 -0
  36. package/dist-lib/src/models/Model.js +187 -0
  37. package/dist-lib/src/models/UserModel.js +189 -0
  38. package/dist-lib/src/models/index.js +25 -0
  39. package/dist-lib/src/pluginUtils.js +11 -0
  40. package/dist-lib/src/rest.js +221 -0
  41. package/dist-lib/src/router.js +58 -0
  42. package/dist-lib/src/routes.js +229 -0
  43. package/dist-lib/src/stylesheets/apidocs/apidocs.styl +50 -0
  44. package/dist-lib/src/stylesheets/body/adminConsole.styl +21 -0
  45. package/dist-lib/src/stylesheets/body/assetstores.styl +46 -0
  46. package/dist-lib/src/stylesheets/body/collectionList.styl +39 -0
  47. package/dist-lib/src/stylesheets/body/collectionPage.styl +6 -0
  48. package/dist-lib/src/stylesheets/body/frontPage.styl +48 -0
  49. package/dist-lib/src/stylesheets/body/groupList.styl +43 -0
  50. package/dist-lib/src/stylesheets/body/groupPage.styl +116 -0
  51. package/dist-lib/src/stylesheets/body/itemPage.styl +81 -0
  52. package/dist-lib/src/stylesheets/body/plugins.styl +61 -0
  53. package/dist-lib/src/stylesheets/body/searchResultsList.styl +51 -0
  54. package/dist-lib/src/stylesheets/body/systemConfig.styl +56 -0
  55. package/dist-lib/src/stylesheets/body/userAccount.styl +57 -0
  56. package/dist-lib/src/stylesheets/body/userList.styl +79 -0
  57. package/dist-lib/src/stylesheets/body/userPage.styl +6 -0
  58. package/dist-lib/src/stylesheets/layout/footer.styl +19 -0
  59. package/dist-lib/src/stylesheets/layout/global.styl +154 -0
  60. package/dist-lib/src/stylesheets/layout/globalNav.styl +89 -0
  61. package/dist-lib/src/stylesheets/layout/header.styl +29 -0
  62. package/dist-lib/src/stylesheets/layout/headerUser.styl +33 -0
  63. package/dist-lib/src/stylesheets/layout/layout.styl +75 -0
  64. package/dist-lib/src/stylesheets/layout/layoutVars.styl +9 -0
  65. package/dist-lib/src/stylesheets/layout/loading.styl +37 -0
  66. package/dist-lib/src/stylesheets/layout/progressArea.styl +17 -0
  67. package/dist-lib/src/stylesheets/widgets/accessWidget.styl +106 -0
  68. package/dist-lib/src/stylesheets/widgets/browserWidget.styl +9 -0
  69. package/dist-lib/src/stylesheets/widgets/hierarchyWidget.styl +188 -0
  70. package/dist-lib/src/stylesheets/widgets/markdownWidget.styl +92 -0
  71. package/dist-lib/src/stylesheets/widgets/metadataWidget.styl +92 -0
  72. package/dist-lib/src/stylesheets/widgets/searchFieldWidget.styl +70 -0
  73. package/dist-lib/src/stylesheets/widgets/taskProgress.styl +41 -0
  74. package/dist-lib/src/stylesheets/widgets/timelineWidget.styl +41 -0
  75. package/dist-lib/src/stylesheets/widgets/uploadWidget.styl +43 -0
  76. package/dist-lib/src/stylesheets/widgets/userOtpManagementWidget.styl +159 -0
  77. package/dist-lib/src/templates/body/adminConsole.pug +13 -0
  78. package/dist-lib/src/templates/body/assetstores.pug +83 -0
  79. package/dist-lib/src/templates/body/collectionList.pug +40 -0
  80. package/dist-lib/src/templates/body/collectionPage.pug +36 -0
  81. package/dist-lib/src/templates/body/filesystemImport.pug +41 -0
  82. package/dist-lib/src/templates/body/frontPage.pug +84 -0
  83. package/dist-lib/src/templates/body/groupList.pug +30 -0
  84. package/dist-lib/src/templates/body/groupPage.pug +116 -0
  85. package/dist-lib/src/templates/body/itemPage.pug +61 -0
  86. package/dist-lib/src/templates/body/plugins.pug +20 -0
  87. package/dist-lib/src/templates/body/s3Import.pug +35 -0
  88. package/dist-lib/src/templates/body/searchResults.pug +15 -0
  89. package/dist-lib/src/templates/body/searchResultsType.pug +13 -0
  90. package/dist-lib/src/templates/body/systemConfiguration.pug +199 -0
  91. package/dist-lib/src/templates/body/userAccount.pug +83 -0
  92. package/dist-lib/src/templates/body/userList.pug +43 -0
  93. package/dist-lib/src/templates/body/userPage.pug +40 -0
  94. package/dist-lib/src/templates/layout/alert.pug +5 -0
  95. package/dist-lib/src/templates/layout/layout.pug +12 -0
  96. package/dist-lib/src/templates/layout/layoutFooter.pug +11 -0
  97. package/dist-lib/src/templates/layout/layoutGlobalNav.pug +7 -0
  98. package/dist-lib/src/templates/layout/layoutHeader.pug +8 -0
  99. package/dist-lib/src/templates/layout/layoutHeaderUser.pug +26 -0
  100. package/dist-lib/src/templates/layout/layoutProgressArea.pug +1 -0
  101. package/dist-lib/src/templates/layout/loginDialog.pug +30 -0
  102. package/dist-lib/src/templates/layout/registerDialog.pug +35 -0
  103. package/dist-lib/src/templates/layout/resetPasswordDialog.pug +25 -0
  104. package/dist-lib/src/templates/widgets/accessEditor.pug +23 -0
  105. package/dist-lib/src/templates/widgets/accessEditorMixins.pug +57 -0
  106. package/dist-lib/src/templates/widgets/accessEditorNonModal.pug +11 -0
  107. package/dist-lib/src/templates/widgets/accessEntry.pug +32 -0
  108. package/dist-lib/src/templates/widgets/apiKeyList.pug +50 -0
  109. package/dist-lib/src/templates/widgets/browserWidget.pug +32 -0
  110. package/dist-lib/src/templates/widgets/checkedActionsMenu.pug +46 -0
  111. package/dist-lib/src/templates/widgets/collectionInfoDialog.pug +37 -0
  112. package/dist-lib/src/templates/widgets/confirmDialog.pug +14 -0
  113. package/dist-lib/src/templates/widgets/dateTimeRangeWidget.pug +20 -0
  114. package/dist-lib/src/templates/widgets/dateTimeWidget.pug +8 -0
  115. package/dist-lib/src/templates/widgets/editApiKeyWidget.pug +43 -0
  116. package/dist-lib/src/templates/widgets/editAssetstoreWidget.pug +66 -0
  117. package/dist-lib/src/templates/widgets/editCollectionWidget.pug +27 -0
  118. package/dist-lib/src/templates/widgets/editFileWidget.pug +21 -0
  119. package/dist-lib/src/templates/widgets/editFolderWidget.pug +27 -0
  120. package/dist-lib/src/templates/widgets/editGroupWidget.pug +54 -0
  121. package/dist-lib/src/templates/widgets/editItemWidget.pug +27 -0
  122. package/dist-lib/src/templates/widgets/fileInfoDialog.pug +33 -0
  123. package/dist-lib/src/templates/widgets/fileList.pug +33 -0
  124. package/dist-lib/src/templates/widgets/folderInfoDialog.pug +42 -0
  125. package/dist-lib/src/templates/widgets/folderList.pug +21 -0
  126. package/dist-lib/src/templates/widgets/groupAdminList.pug +33 -0
  127. package/dist-lib/src/templates/widgets/groupInviteDialog.pug +76 -0
  128. package/dist-lib/src/templates/widgets/groupInviteList.pug +14 -0
  129. package/dist-lib/src/templates/widgets/groupMemberList.pug +39 -0
  130. package/dist-lib/src/templates/widgets/groupModList.pug +23 -0
  131. package/dist-lib/src/templates/widgets/hierarchyBreadcrumb.pug +37 -0
  132. package/dist-lib/src/templates/widgets/hierarchyPaginated.pug +19 -0
  133. package/dist-lib/src/templates/widgets/hierarchyWidget.pug +96 -0
  134. package/dist-lib/src/templates/widgets/itemBreadcrumb.pug +16 -0
  135. package/dist-lib/src/templates/widgets/itemList.pug +27 -0
  136. package/dist-lib/src/templates/widgets/jsonMetadatumEditWidget.pug +13 -0
  137. package/dist-lib/src/templates/widgets/jsonMetadatumView.pug +6 -0
  138. package/dist-lib/src/templates/widgets/loadingAnimation.pug +4 -0
  139. package/dist-lib/src/templates/widgets/markdownWidget.pug +34 -0
  140. package/dist-lib/src/templates/widgets/metadataWidget.pug +16 -0
  141. package/dist-lib/src/templates/widgets/metadatumEditWidget.pug +15 -0
  142. package/dist-lib/src/templates/widgets/metadatumView.pug +5 -0
  143. package/dist-lib/src/templates/widgets/newAssetstore.pug +83 -0
  144. package/dist-lib/src/templates/widgets/paginateWidget.pug +7 -0
  145. package/dist-lib/src/templates/widgets/pluginConfigBreadcrumb.pug +13 -0
  146. package/dist-lib/src/templates/widgets/rootSelectorWidget.pug +13 -0
  147. package/dist-lib/src/templates/widgets/searchField.pug +10 -0
  148. package/dist-lib/src/templates/widgets/searchHelp.pug +12 -0
  149. package/dist-lib/src/templates/widgets/searchModeSelect.pug +9 -0
  150. package/dist-lib/src/templates/widgets/searchResults.pug +14 -0
  151. package/dist-lib/src/templates/widgets/sortCollectionWidget.pug +14 -0
  152. package/dist-lib/src/templates/widgets/taskProgress.pug +16 -0
  153. package/dist-lib/src/templates/widgets/timeline.pug +15 -0
  154. package/dist-lib/src/templates/widgets/uploadWidget.pug +15 -0
  155. package/dist-lib/src/templates/widgets/uploadWidgetMixins.pug +31 -0
  156. package/dist-lib/src/templates/widgets/uploadWidgetNonModal.pug +10 -0
  157. package/dist-lib/src/templates/widgets/userOtpBegin.pug +4 -0
  158. package/dist-lib/src/templates/widgets/userOtpDisable.pug +6 -0
  159. package/dist-lib/src/templates/widgets/userOtpEnable.pug +44 -0
  160. package/dist-lib/src/utilities/EventStream.js +177 -0
  161. package/dist-lib/src/utilities/PluginUtils.js +36 -0
  162. package/dist-lib/src/utilities/S3UploadHandler.js +303 -0
  163. package/dist-lib/src/utilities/index.js +9 -0
  164. package/dist-lib/src/utilities/jquery/girderEnable.js +19 -0
  165. package/dist-lib/src/utilities/jquery/girderModal.js +48 -0
  166. package/dist-lib/src/version.js +6 -0
  167. package/dist-lib/src/views/App.js +359 -0
  168. package/dist-lib/src/views/View.js +79 -0
  169. package/dist-lib/src/views/body/AdminView.js +29 -0
  170. package/dist-lib/src/views/body/AssetstoresView.js +234 -0
  171. package/dist-lib/src/views/body/CollectionView.js +188 -0
  172. package/dist-lib/src/views/body/CollectionsView.js +120 -0
  173. package/dist-lib/src/views/body/FilesystemImportView.js +83 -0
  174. package/dist-lib/src/views/body/FolderView.js +54 -0
  175. package/dist-lib/src/views/body/FrontPageView.js +47 -0
  176. package/dist-lib/src/views/body/GroupView.js +336 -0
  177. package/dist-lib/src/views/body/GroupsView.js +106 -0
  178. package/dist-lib/src/views/body/ItemView.js +177 -0
  179. package/dist-lib/src/views/body/PluginsView.js +73 -0
  180. package/dist-lib/src/views/body/S3ImportView.js +80 -0
  181. package/dist-lib/src/views/body/SearchResultsView.js +162 -0
  182. package/dist-lib/src/views/body/SystemConfigurationView.js +182 -0
  183. package/dist-lib/src/views/body/UserAccountView.js +179 -0
  184. package/dist-lib/src/views/body/UserView.js +165 -0
  185. package/dist-lib/src/views/body/UsersView.js +124 -0
  186. package/dist-lib/src/views/body/index.js +37 -0
  187. package/dist-lib/src/views/index.js +13 -0
  188. package/dist-lib/src/views/layout/FooterView.js +29 -0
  189. package/dist-lib/src/views/layout/GlobalNavView.js +103 -0
  190. package/dist-lib/src/views/layout/HeaderUserView.js +45 -0
  191. package/dist-lib/src/views/layout/HeaderView.js +83 -0
  192. package/dist-lib/src/views/layout/LoginView.js +100 -0
  193. package/dist-lib/src/views/layout/ProgressListView.js +70 -0
  194. package/dist-lib/src/views/layout/RegisterView.js +101 -0
  195. package/dist-lib/src/views/layout/ResetPasswordView.js +70 -0
  196. package/dist-lib/src/views/layout/index.js +19 -0
  197. package/dist-lib/src/views/widgets/AccessWidget.js +427 -0
  198. package/dist-lib/src/views/widgets/ApiKeyListWidget.js +140 -0
  199. package/dist-lib/src/views/widgets/BrowserWidget.js +317 -0
  200. package/dist-lib/src/views/widgets/CheckedMenuWidget.js +68 -0
  201. package/dist-lib/src/views/widgets/CollectionInfoWidget.js +40 -0
  202. package/dist-lib/src/views/widgets/DateTimeRangeWidget.js +180 -0
  203. package/dist-lib/src/views/widgets/DateTimeWidget.js +110 -0
  204. package/dist-lib/src/views/widgets/EditApiKeyWidget.js +122 -0
  205. package/dist-lib/src/views/widgets/EditAssetstoreWidget.js +133 -0
  206. package/dist-lib/src/views/widgets/EditCollectionWidget.js +93 -0
  207. package/dist-lib/src/views/widgets/EditFileWidget.js +56 -0
  208. package/dist-lib/src/views/widgets/EditFolderWidget.js +116 -0
  209. package/dist-lib/src/views/widgets/EditGroupWidget.js +125 -0
  210. package/dist-lib/src/views/widgets/EditItemWidget.js +110 -0
  211. package/dist-lib/src/views/widgets/FileInfoWidget.js +26 -0
  212. package/dist-lib/src/views/widgets/FileListWidget.js +151 -0
  213. package/dist-lib/src/views/widgets/FolderInfoWidget.js +39 -0
  214. package/dist-lib/src/views/widgets/FolderListWidget.js +106 -0
  215. package/dist-lib/src/views/widgets/GroupAdminsWidget.js +88 -0
  216. package/dist-lib/src/views/widgets/GroupInvitesWidget.js +56 -0
  217. package/dist-lib/src/views/widgets/GroupMembersWidget.js +185 -0
  218. package/dist-lib/src/views/widgets/GroupModsWidget.js +77 -0
  219. package/dist-lib/src/views/widgets/HierarchyWidget.js +1097 -0
  220. package/dist-lib/src/views/widgets/ItemBreadcrumbWidget.js +38 -0
  221. package/dist-lib/src/views/widgets/ItemListWidget.js +345 -0
  222. package/dist-lib/src/views/widgets/LoadingAnimation.js +17 -0
  223. package/dist-lib/src/views/widgets/MarkdownWidget.js +217 -0
  224. package/dist-lib/src/views/widgets/MetadataWidget.js +508 -0
  225. package/dist-lib/src/views/widgets/NewAssetstoreWidget.js +71 -0
  226. package/dist-lib/src/views/widgets/PaginateWidget.js +37 -0
  227. package/dist-lib/src/views/widgets/PluginConfigBreadcrumbWidget.js +33 -0
  228. package/dist-lib/src/views/widgets/RootSelectorWidget.js +192 -0
  229. package/dist-lib/src/views/widgets/SearchFieldWidget.js +365 -0
  230. package/dist-lib/src/views/widgets/SearchPaginateWidget.js +149 -0
  231. package/dist-lib/src/views/widgets/SortCollectionWidget.js +53 -0
  232. package/dist-lib/src/views/widgets/TaskProgressWidget.js +91 -0
  233. package/dist-lib/src/views/widgets/TimelineWidget.js +155 -0
  234. package/dist-lib/src/views/widgets/UploadWidget.js +340 -0
  235. package/dist-lib/src/views/widgets/UserOtpManagementWidget.js +105 -0
  236. package/dist-lib/src/views/widgets/index.js +75 -0
  237. package/dist-lib/src/vite-env.d.ts +5 -0
  238. package/dist-lib/style.css +16 -0
  239. package/package.json +1 -1
@@ -0,0 +1,14 @@
1
+ each result in results
2
+ li.g-search-result
3
+ a.g-search-result-element(data-resource-id=result.id, data-resource-type=result.type, data-resource-icon=result.icon, tabindex="-1")
4
+ i(class=`icon-${result.icon}`)
5
+ | #{result.text}
6
+ if results.length === 0
7
+ li.g-no-search-results.disabled
8
+ a(tabindex="-1")
9
+ i.icon-block
10
+ | No results found
11
+ else
12
+ li.g-search-result
13
+ a.g-search-result-page-link(data-resource-type="resultPage")
14
+ | ...
@@ -0,0 +1,14 @@
1
+ .btn-group
2
+ a.g-sort-order-button.g-up.btn.btn-sm(title="Sort order")
3
+ i.icon-sort-name-up
4
+ a.g-sort-order-button.g-down.btn.btn-sm(title="Sort order")
5
+ i.icon-sort-name-down
6
+ button.g-collection-sort-actions.btn.btn-sm.btn-default.dropdown-toggle(
7
+ data-toggle="dropdown", title="Sort by Field")
8
+ | Sort by
9
+ i.icon-down-dir
10
+ ul.g-collection-sort-menu.dropdown-menu(role="menu")
11
+ each fieldName, field in fields
12
+ li(role="presentation")
13
+ a.g-collection-sort-link(role="menuitem", g-sort=field)
14
+ = fieldName
@@ -0,0 +1,16 @@
1
+ .g-task-progress-top
2
+ .g-task-progress-bar.progress(class=progressClass)
3
+ .progress-bar(class=barClass, style=`width: ${width};`)
4
+ .progress-status
5
+ .progress-percent
6
+ = percentText
7
+ .progress-left
8
+ = timeLeftText
9
+ .g-task-progress-title(title=progress.data.title)
10
+ if progress.data.resource && progress.data.resource._id && progress.data.resourceName
11
+ a(title=progress.data.title, href='#' + progress.data.resourceName + '/' + progress.data.resource._id)
12
+ = progress.data.title
13
+ else
14
+ = progress.data.title
15
+ .g-task-progress-bottom
16
+ .g-task-progress-message= progress.data.message
@@ -0,0 +1,15 @@
1
+ .g-timeline-widget-wrapper
2
+ .g-timeline-container
3
+ each segment in segments
4
+ .g-timeline-segment(
5
+ title=segment.tooltip, class=segment.class,
6
+ style=`left: ${segment.left}; width: ${segment.width}; ${segment.color}`)
7
+ each point in points
8
+ .g-timeline-point(
9
+ title=point.tooltip, class=point.class, style=`left: calc(${point.left} - 10px); ${point.color}`)
10
+ if startLabel !== undefined || endLabel !== undefined
11
+ .g-timeline-labels-container
12
+ if startLabel !== undefined
13
+ .g-timeline-start-label= startLabel
14
+ if endLabel !== undefined
15
+ .g-timeline-end-label= endLabel
@@ -0,0 +1,15 @@
1
+ include uploadWidgetMixins
2
+
3
+ .modal-dialog
4
+ .modal-content
5
+ form#g-upload-form.modal-form(role="form")
6
+ .modal-header
7
+ button.close(data-dismiss="modal", aria-hidden="true", type="button") ×
8
+ h4.modal-title= title
9
+ +g-upload-widget-subtitle
10
+ .modal-body
11
+ +g-upload-widget-browse-or-drop
12
+ +g-upload-widget-progress
13
+ .modal-footer
14
+ a.btn.btn-small.btn-default(data-dismiss="modal") Close
15
+ +g-upload-widget-start-button
@@ -0,0 +1,31 @@
1
+ mixin g-upload-widget-subtitle
2
+ if parent && parentType
3
+ .g-dialog-subtitle
4
+ if (parentType === 'folder')
5
+ i.icon-folder-open
6
+ else if (parentType === 'item')
7
+ i.icon-doc-text-inv
8
+ else if (parentType === 'file')
9
+ i.icon-doc-inv
10
+ = parent.name()
11
+
12
+ mixin g-upload-widget-browse-or-drop
13
+ .g-drop-zone
14
+ i.icon-docs
15
+ | #{browseText}
16
+ .form-group.hide
17
+ input#g-files(type="file", multiple=(multiFile ? 'multiple' : null))
18
+
19
+ mixin g-upload-widget-progress
20
+ .g-current-progress-message
21
+ .g-progress-current.progress.progress-striped.hide
22
+ .progress-bar.progress-bar-info(role="progressbar")
23
+ .g-overall-progress-message= noneSelectedText
24
+ .g-progress-overall.progress.progress-striped.hide
25
+ .progress-bar.progress-bar-info(role="progressbar")
26
+ .g-upload-error-message.g-validation-failed-message
27
+
28
+ mixin g-upload-widget-start-button
29
+ button.g-start-upload.btn.btn-small.btn-primary.disabled(type="submit", disabled)
30
+ i.icon-upload
31
+ | Start Upload
@@ -0,0 +1,10 @@
1
+ include uploadWidgetMixins
2
+
3
+ form#g-upload-form
4
+ if title
5
+ h4= title
6
+ +g-upload-widget-subtitle
7
+ +g-upload-widget-browse-or-drop
8
+ +g-upload-widget-progress
9
+ .g-nonmodal-upload-buttons-container
10
+ +g-upload-widget-start-button
@@ -0,0 +1,4 @@
1
+ h2 Enable Two-factor authentication
2
+
3
+ button#g-user-otp-initialize-enable.btn.btn-primary(type="submit")
4
+ | Begin
@@ -0,0 +1,6 @@
1
+ h2.g-user-otp-heading-enable Two-factor authentication is currently enabled
2
+
3
+ h3.g-user-otp-heading-disable Disable Two-factor authentication
4
+
5
+ button#g-user-otp-disable.btn.btn-primary(type="submit")
6
+ | Disable
@@ -0,0 +1,44 @@
1
+ h2 Enable Two-factor authentication
2
+
3
+ ol.g-account-otp-steps
4
+ li.g-account-otp-step
5
+ h3 Install an authenticator app on your mobile device.
6
+ div.
7
+ There are many compatible apps, including, but not limited to
8
+ #[a(href='https://support.google.com/accounts/answer/1066447?hl=en', target='_blank', rel='noopener') Google Authenticator],
9
+ #[a(href='https://guide.duo.com/third-party-accounts', target='_blank', rel='noopener') Duo Mobile], and
10
+ #[a(href='https://freeotp.github.io/', target='_blank', rel='noopener') FreeOTP].
11
+ li.g-account-otp-step
12
+ h3 Enter your key into the authenticator app
13
+ .g-account-otp-scan-qr
14
+ h4 Scan with your mobile device's camera:
15
+ canvas#g-user-otp-qr
16
+ .g-account-otp-enter-manual
17
+ h4 Advanced Users:
18
+ span You may enter your information manually, instead:
19
+ table
20
+ tr
21
+ th Service
22
+ td
23
+ code= totpInfo.issuer
24
+ tr
25
+ th Account
26
+ td
27
+ code= totpInfo.account
28
+ tr
29
+ th Key
30
+ td
31
+ // Split into 4-character chunks for human readability
32
+ code= totpInfo.key.match(/.{1,4}/g).join('-')
33
+ tr
34
+ th Type
35
+ td
36
+ span #[code Time-based] / #[code TOTP]
37
+ li.g-account-otp-step
38
+ h3 Enter the authentication code from your app
39
+ input#g-user-otp-token(type='text', minlength=6, maxlength=6, placeholder='Your 6-digit code')
40
+ div
41
+ span#g-account-otp-error.g-validation-failed-message
42
+ .g-user-otp-footer
43
+ a#g-user-otp-cancel-enable.btn.btn-default Cancel
44
+ button#g-user-otp-finalize-enable.btn.btn-primary.btn-success(type="submit") Enable Two-Factor
@@ -0,0 +1,177 @@
1
+ import $ from 'jquery';
2
+ import _ from 'underscore';
3
+ import Backbone from 'backbone';
4
+
5
+ import { getApiRoot, restRequest } from '@girder/core/rest';
6
+
7
+ /**
8
+ * The EventStream type wraps window.EventSource to listen to the unified
9
+ * per-user event channel endpoint using the SSE protocol. When events are
10
+ * received on the SSE channel, this triggers a Backbone event of the form
11
+ * 'g:event.<type>' where <type> is the value of the event type field.
12
+ * Listeners can bind to specific event types on the channel.
13
+ */
14
+ function EventStream(settings) {
15
+ const defaults = {
16
+ timeout: null,
17
+ streamPath: '/notification/stream'
18
+ };
19
+
20
+ // User-provided settings from initialization
21
+ this.settings = _.extend(defaults, settings);
22
+ // Possible states are 'closed', 'stopped', 'started'
23
+ this._state = 'closed';
24
+ // Whether this is started (if so, holds the EventSource instance)
25
+ this._eventSource = null;
26
+
27
+ // Create context bindings only once, so they can be referenced when unbinding events
28
+ this._onVisibilityStateChange = _.bind(this._onVisibilityStateChange, this);
29
+ this._onMessage = _.bind(this._onMessage, this);
30
+ this._onError = _.bind(this._onError, this);
31
+
32
+ return _.extend(this, Backbone.Events);
33
+ }
34
+
35
+ EventStream.prototype._onVisibilityStateChange = function () {
36
+ if (document.visibilityState === 'visible' && this._state === 'stopped') {
37
+ this._start();
38
+ } else if (document.visibilityState === 'hidden' && this._state === 'started') {
39
+ this._stop();
40
+ }
41
+ };
42
+
43
+ EventStream.prototype._onMessage = function (e) {
44
+ let obj;
45
+ try {
46
+ obj = window.JSON.parse(e.data);
47
+ } catch (err) {
48
+ console.error('Invalid JSON from SSE stream: ' + e.data + ',' + err);
49
+ this.trigger('g:error', e);
50
+ return;
51
+ }
52
+ EventStream.setLastTimestamp(obj._girderTime);
53
+ this.trigger('g:event.' + obj.type, obj);
54
+ };
55
+
56
+ EventStream.prototype._onError = function () {
57
+ // The EventSource.onerror API does not provide the HTTP status code of the error, so send an Ajax HEAD request to
58
+ // capture the status code.
59
+ restRequest({
60
+ url: this.settings.streamPath,
61
+ method: 'HEAD',
62
+ error: null
63
+ })
64
+ .fail((jqXHR) => {
65
+ if (jqXHR.status === 503) {
66
+ // Notification stream is disabled, so close this EventStream
67
+ this.trigger('g:eventStream.disable', jqXHR);
68
+ this.close();
69
+ }
70
+ });
71
+ // In all other cases (HEAD doesn't fail, or fails with a non-503 code), assume this is a temporary outage and allow
72
+ // the EventStream to continue attempting to auto-connect
73
+ };
74
+
75
+ EventStream.prototype.open = function () {
76
+ if (!window.EventSource) {
77
+ console.error('EventSource is not supported on this platform.');
78
+ this.trigger('g:eventStream.disable');
79
+ return;
80
+ }
81
+ if (this._state !== 'closed') {
82
+ console.warn('EventStream should be closed.');
83
+ return;
84
+ }
85
+
86
+ this._state = 'stopped';
87
+ this._start();
88
+
89
+ document.addEventListener('visibilitychange', this._onVisibilityStateChange);
90
+ };
91
+
92
+ EventStream.prototype._start = function () {
93
+ if (this._state !== 'stopped') {
94
+ console.warn('EventStream should be stopped');
95
+ return;
96
+ }
97
+
98
+ const params = {};
99
+
100
+ if (this.settings.timeout) {
101
+ params.timeout = this.settings.timeout;
102
+ }
103
+
104
+ // Set the "since" argument to filter out notifications that have already been sent to this client.
105
+ const timestamp = EventStream.getLastTimestamp();
106
+ if (_.isNumber(timestamp)) {
107
+ params.since = timestamp;
108
+ }
109
+
110
+ const url = getApiRoot() + this.settings.streamPath + '?' + $.param(params);
111
+
112
+ this._eventSource = new window.EventSource(url);
113
+ this._eventSource.onmessage = this._onMessage;
114
+ this._eventSource.onerror = this._onError;
115
+
116
+ this._state = 'started';
117
+ this.trigger('g:eventStream.start');
118
+ };
119
+
120
+ EventStream.prototype._stop = function () {
121
+ if (this._state !== 'started') {
122
+ console.warn('EventStream should be started');
123
+ return;
124
+ }
125
+
126
+ this._eventSource.close();
127
+ this._eventSource = null;
128
+
129
+ this._state = 'stopped';
130
+ this.trigger('g:eventStream.stop');
131
+ };
132
+
133
+ EventStream.prototype.close = function () {
134
+ if (this._state === 'closed') {
135
+ console.warn('EventStream should not be closed');
136
+ return;
137
+ }
138
+
139
+ document.removeEventListener('visibilitychange', this._onVisibilityStateChange);
140
+
141
+ if (this._state === 'started') {
142
+ this._stop();
143
+ }
144
+
145
+ this._state = 'closed';
146
+ this.trigger('g:eventStream.close');
147
+ };
148
+
149
+ // Static methods
150
+ EventStream._lastTimestamp = null;
151
+ EventStream.setLastTimestamp = function (timestamp) {
152
+ try {
153
+ window.localStorage.setItem('sseTimestamp', timestamp);
154
+ } catch (e) {
155
+ // Ignore any errors raised by localStorage
156
+ }
157
+ EventStream._lastTimestamp = timestamp;
158
+ };
159
+ EventStream.getLastTimestamp = function () {
160
+ let timestamp;
161
+ try {
162
+ timestamp = parseInt(window.localStorage.getItem('sseTimestamp'), 10);
163
+ } catch (e) {
164
+ // Ignore any errors raised by localStorage
165
+ }
166
+ if (!_.isNaN(timestamp)) {
167
+ // An int was parsed
168
+ return timestamp;
169
+ } else {
170
+ // Value could not be gotten from localStorage, so return from fallback (which is also the default of null)f
171
+ return EventStream._lastTimestamp;
172
+ }
173
+ };
174
+
175
+ const eventStream = new EventStream();
176
+
177
+ export default eventStream;
@@ -0,0 +1,36 @@
1
+ import _ from 'underscore';
2
+
3
+ /**
4
+ * Wrap the prototype method of a given object.
5
+ *
6
+ * @param obj The object whose prototype to extend, e.g. MyView
7
+ * @param funcName The name of the function to wrap, e.g. "render"
8
+ * @param wrapper The wrapper function, which should be a function taking the
9
+ * underlying wrapped function as its first argument. The wrapped function
10
+ * should be called with .call(this[, arguments]) inside of the wrapper in
11
+ * order to preserve "this" semantics.
12
+ */
13
+ function wrap(obj, funcName, wrapper) {
14
+ obj.prototype[funcName] = _.wrap(obj.prototype[funcName], wrapper);
15
+ }
16
+
17
+ var _pluginConfigRoutes = {};
18
+
19
+ /**
20
+ * Expose a plugin configuration page via the admin plugins page.
21
+ * @param pluginName The canonical plugin name, i.e. its directory name
22
+ * @param route The route to trigger that will render the plugin config.
23
+ */
24
+ function exposePluginConfig(pluginName, route) {
25
+ _pluginConfigRoutes[pluginName] = route;
26
+ }
27
+
28
+ function getPluginConfigRoute(pluginName) {
29
+ return _pluginConfigRoutes[pluginName];
30
+ }
31
+
32
+ export {
33
+ exposePluginConfig,
34
+ getPluginConfigRoute,
35
+ wrap
36
+ };