@opensumi/ide-core-browser 2.21.7-rc-1670246007.0 → 2.21.7

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 (314) hide show
  1. package/lib/components/actions/index.d.ts.map +1 -1
  2. package/lib/components/actions/index.js +22 -2
  3. package/lib/components/actions/index.js.map +1 -1
  4. package/lib/components/tree/tree.module.less +0 -1
  5. package/lib/contextkey/testing.d.ts +0 -1
  6. package/lib/contextkey/testing.d.ts.map +1 -1
  7. package/lib/contextkey/testing.js +1 -2
  8. package/lib/contextkey/testing.js.map +1 -1
  9. package/lib/preferences/preference-configurations.js +1 -1
  10. package/lib/preferences/preference-configurations.js.map +1 -1
  11. package/lib/react-providers/config-provider.d.ts +0 -4
  12. package/lib/react-providers/config-provider.d.ts.map +1 -1
  13. package/lib/react-providers/config-provider.js.map +1 -1
  14. package/lib/services/storage-service.d.ts.map +1 -1
  15. package/lib/services/storage-service.js +1 -7
  16. package/lib/services/storage-service.js.map +1 -1
  17. package/lib/utils/label.d.ts.map +1 -1
  18. package/lib/utils/label.js +9 -16
  19. package/lib/utils/label.js.map +1 -1
  20. package/package.json +6 -7
  21. package/src/application/application-state-service.ts +0 -54
  22. package/src/application/application.service.ts +0 -51
  23. package/src/application/index.ts +0 -2
  24. package/src/authentication/authentication.contribution.ts +0 -35
  25. package/src/authentication/authentication.service.ts +0 -517
  26. package/src/bootstrap/app.ts +0 -745
  27. package/src/bootstrap/app.view.tsx +0 -88
  28. package/src/bootstrap/connection.ts +0 -116
  29. package/src/bootstrap/index.ts +0 -3
  30. package/src/bootstrap/inner-providers.ts +0 -297
  31. package/src/bootstrap/lifecycle.service.ts +0 -19
  32. package/src/browser-module.ts +0 -24
  33. package/src/common/common.command.ts +0 -977
  34. package/src/common/common.contribution.ts +0 -343
  35. package/src/common/common.define.ts +0 -55
  36. package/src/common/common.module.ts +0 -33
  37. package/src/common/common.storage.ts +0 -22
  38. package/src/common/container-id.ts +0 -12
  39. package/src/common/index.ts +0 -4
  40. package/src/components/actions/index.tsx +0 -486
  41. package/src/components/actions/placements.ts +0 -47
  42. package/src/components/actions/styles.module.less +0 -144
  43. package/src/components/badge/index.tsx +0 -1
  44. package/src/components/index.ts +0 -26
  45. package/src/components/layout/box-panel.tsx +0 -88
  46. package/src/components/layout/default-layout.tsx +0 -61
  47. package/src/components/layout/index.ts +0 -4
  48. package/src/components/layout/layout.ts +0 -80
  49. package/src/components/layout/split-panel.service.ts +0 -56
  50. package/src/components/layout/split-panel.tsx +0 -296
  51. package/src/components/layout/styles.module.less +0 -21
  52. package/src/components/loading/index.ts +0 -1
  53. package/src/components/loading/loading.less +0 -14
  54. package/src/components/loading/loading.view.tsx +0 -7
  55. package/src/components/loading/media/loading-dark.svg +0 -52
  56. package/src/components/loading/media/loading-hc.svg +0 -52
  57. package/src/components/loading/media/loading.svg +0 -52
  58. package/src/components/popover/styles.module.less +0 -81
  59. package/src/components/portal/index.tsx +0 -13
  60. package/src/components/progressbar/index.tsx +0 -16
  61. package/src/components/progressbar/styles.module.less +0 -31
  62. package/src/components/recycle-tree/index.ts +0 -1
  63. package/src/components/recycle-tree/recycle-tree.view.tsx +0 -368
  64. package/src/components/resize/resize.module.less +0 -78
  65. package/src/components/resize/resize.tsx +0 -663
  66. package/src/components/scroll/index.tsx +0 -386
  67. package/src/components/scroll/scroll.module.less +0 -108
  68. package/src/components/scrollbar/index.ts +0 -1
  69. package/src/components/scrollbar/scrollbar.less +0 -36
  70. package/src/components/scrollbar/scrollbar.view.ts +0 -8
  71. package/src/components/select/index.tsx +0 -12
  72. package/src/components/select/styles.less +0 -6
  73. package/src/components/tree/index.ts +0 -3
  74. package/src/components/tree/tree-node.view.tsx +0 -546
  75. package/src/components/tree/tree.module.less +0 -297
  76. package/src/components/tree/tree.view.tsx +0 -486
  77. package/src/context-key.ts +0 -48
  78. package/src/contextkey/dialog.ts +0 -3
  79. package/src/contextkey/explorer.ts +0 -26
  80. package/src/contextkey/index.ts +0 -6
  81. package/src/contextkey/outline.ts +0 -4
  82. package/src/contextkey/resource.ts +0 -61
  83. package/src/contextkey/terminal.ts +0 -7
  84. package/src/contextkey/testing.ts +0 -9
  85. package/src/contextkey/workspace.ts +0 -7
  86. package/src/core-preferences.ts +0 -318
  87. package/src/dom/index.ts +0 -176
  88. package/src/encoding-registry.ts +0 -83
  89. package/src/extensions/extensions-point.service.ts +0 -78
  90. package/src/extensions/index.ts +0 -3
  91. package/src/extensions/schema/browserViews.ts +0 -96
  92. package/src/extensions/schema/menu.ts +0 -245
  93. package/src/extensions/schema/opensumiExtensionPackageSchema.ts +0 -12
  94. package/src/extensions/schema/toolbar.ts +0 -338
  95. package/src/extensions/schema/vscodeExtensionPackageSchema.ts +0 -330
  96. package/src/fs/index.ts +0 -12
  97. package/src/hash-calculate/hash-calculate.contribution.ts +0 -19
  98. package/src/index.ts +0 -42
  99. package/src/keybinding/index.ts +0 -1
  100. package/src/keybinding/keybinding.ts +0 -908
  101. package/src/keyboard/index.ts +0 -3
  102. package/src/keyboard/keyboard-layout-provider.ts +0 -412
  103. package/src/keyboard/keyboard-layout-service.ts +0 -449
  104. package/src/keyboard/keys.ts +0 -748
  105. package/src/keyboard/layouts/_.contribution.ts +0 -24
  106. package/src/keyboard/layouts/cz.win.ts +0 -168
  107. package/src/keyboard/layouts/de-swiss.win.ts +0 -168
  108. package/src/keyboard/layouts/de.darwin.ts +0 -131
  109. package/src/keyboard/layouts/de.linux.ts +0 -186
  110. package/src/keyboard/layouts/de.win.ts +0 -168
  111. package/src/keyboard/layouts/dk.win.ts +0 -168
  112. package/src/keyboard/layouts/dvorak.darwin.ts +0 -131
  113. package/src/keyboard/layouts/en-belgian.win.ts +0 -168
  114. package/src/keyboard/layouts/en-ext.darwin.ts +0 -131
  115. package/src/keyboard/layouts/en-in.win.ts +0 -168
  116. package/src/keyboard/layouts/en-intl.darwin.ts +0 -131
  117. package/src/keyboard/layouts/en-intl.win.ts +0 -168
  118. package/src/keyboard/layouts/en-uk.darwin.ts +0 -131
  119. package/src/keyboard/layouts/en-uk.win.ts +0 -168
  120. package/src/keyboard/layouts/en.darwin.ts +0 -139
  121. package/src/keyboard/layouts/en.linux.ts +0 -186
  122. package/src/keyboard/layouts/en.win.ts +0 -173
  123. package/src/keyboard/layouts/es-latin.win.ts +0 -168
  124. package/src/keyboard/layouts/es.darwin.ts +0 -131
  125. package/src/keyboard/layouts/es.linux.ts +0 -186
  126. package/src/keyboard/layouts/es.win.ts +0 -168
  127. package/src/keyboard/layouts/fr.darwin.ts +0 -131
  128. package/src/keyboard/layouts/fr.linux.ts +0 -186
  129. package/src/keyboard/layouts/fr.win.ts +0 -168
  130. package/src/keyboard/layouts/hu.win.ts +0 -168
  131. package/src/keyboard/layouts/it.darwin.ts +0 -131
  132. package/src/keyboard/layouts/it.win.ts +0 -168
  133. package/src/keyboard/layouts/jp-roman.darwin.ts +0 -131
  134. package/src/keyboard/layouts/jp.darwin.ts +0 -131
  135. package/src/keyboard/layouts/ko.darwin.ts +0 -131
  136. package/src/keyboard/layouts/layout.contribution.darwin.ts +0 -23
  137. package/src/keyboard/layouts/layout.contribution.linux.ts +0 -12
  138. package/src/keyboard/layouts/layout.contribution.ts +0 -9
  139. package/src/keyboard/layouts/layout.contribution.win.ts +0 -29
  140. package/src/keyboard/layouts/no.win.ts +0 -168
  141. package/src/keyboard/layouts/pl.darwin.ts +0 -131
  142. package/src/keyboard/layouts/pl.win.ts +0 -168
  143. package/src/keyboard/layouts/pt-br.win.ts +0 -169
  144. package/src/keyboard/layouts/pt.darwin.ts +0 -131
  145. package/src/keyboard/layouts/pt.win.ts +0 -168
  146. package/src/keyboard/layouts/ru.darwin.ts +0 -131
  147. package/src/keyboard/layouts/ru.linux.ts +0 -186
  148. package/src/keyboard/layouts/ru.win.ts +0 -168
  149. package/src/keyboard/layouts/sv.darwin.ts +0 -131
  150. package/src/keyboard/layouts/sv.win.ts +0 -168
  151. package/src/keyboard/layouts/thai.win.ts +0 -168
  152. package/src/keyboard/layouts/tr.win.ts +0 -168
  153. package/src/keyboard/layouts/zh-hans.darwin.ts +0 -131
  154. package/src/layout/accordion/tab-bar-toolbar.tsx +0 -59
  155. package/src/layout/accordion/view-context-key.registry.ts +0 -34
  156. package/src/layout/constants.ts +0 -7
  157. package/src/layout/index.ts +0 -5
  158. package/src/layout/layout-hooks.ts +0 -68
  159. package/src/layout/layout-state.ts +0 -107
  160. package/src/layout/layout.interface.ts +0 -101
  161. package/src/layout/layout.ts +0 -80
  162. package/src/layout/view-id.ts +0 -18
  163. package/src/logger/browser-logger.ts +0 -51
  164. package/src/logger/index.ts +0 -1
  165. package/src/markdown/index.tsx +0 -62
  166. package/src/menu/next/base.ts +0 -513
  167. package/src/menu/next/ctxmenu-service.ts +0 -188
  168. package/src/menu/next/index.ts +0 -10
  169. package/src/menu/next/menu-id.ts +0 -86
  170. package/src/menu/next/menu-service.ts +0 -252
  171. package/src/menu/next/menu-util.ts +0 -77
  172. package/src/menu/next/menu.contrib.interface.ts +0 -78
  173. package/src/menu/next/menu.interface.ts +0 -253
  174. package/src/menu/next/menubar-service.ts +0 -211
  175. package/src/menu/next/renderer/ctxmenu/base.ts +0 -18
  176. package/src/menu/next/renderer/ctxmenu/browser.ts +0 -45
  177. package/src/menu/next/renderer/ctxmenu/electron.ts +0 -207
  178. package/src/menu/next/toolbar-action.service.ts +0 -132
  179. package/src/monaco/index.ts +0 -128
  180. package/src/opener/command-opener.ts +0 -42
  181. package/src/opener/default-opener.ts +0 -31
  182. package/src/opener/http-opener.ts +0 -25
  183. package/src/opener/index.ts +0 -19
  184. package/src/opener/opener.contribution.ts +0 -57
  185. package/src/opener/opener.service.ts +0 -66
  186. package/src/preferences/early-preferences.ts +0 -117
  187. package/src/preferences/index.ts +0 -9
  188. package/src/preferences/preference-configurations.ts +0 -77
  189. package/src/preferences/preference-contribution.ts +0 -401
  190. package/src/preferences/preference-provider.ts +0 -414
  191. package/src/preferences/preference-proxy.ts +0 -292
  192. package/src/preferences/preference-scope.ts +0 -3
  193. package/src/preferences/preference-service.ts +0 -571
  194. package/src/preferences/settings.ts +0 -53
  195. package/src/preferences/types.ts +0 -111
  196. package/src/progress/index.ts +0 -58
  197. package/src/progress/progress-bar.tsx +0 -22
  198. package/src/progress/progress-indicator.ts +0 -90
  199. package/src/progress/progress.module.less +0 -46
  200. package/src/progress/progress.service.tsx +0 -429
  201. package/src/quick-open/index.ts +0 -655
  202. package/src/quick-open/recent-files.ts +0 -68
  203. package/src/raw-context-key.ts +0 -116
  204. package/src/react-hooks/event.tsx +0 -80
  205. package/src/react-hooks/hot-key.tsx +0 -58
  206. package/src/react-hooks/index.ts +0 -3
  207. package/src/react-hooks/injectable-hooks.tsx +0 -35
  208. package/src/react-hooks/portal-hooks.tsx +0 -38
  209. package/src/react-providers/config-provider.tsx +0 -263
  210. package/src/react-providers/index.tsx +0 -2
  211. package/src/react-providers/slot.module.less +0 -19
  212. package/src/react-providers/slot.tsx +0 -242
  213. package/src/services/clipboard.service.ts +0 -97
  214. package/src/services/credentials-service.ts +0 -91
  215. package/src/services/crypto-service.ts +0 -23
  216. package/src/services/external-uri.service.ts +0 -68
  217. package/src/services/index.ts +0 -7
  218. package/src/services/label-service.ts +0 -386
  219. package/src/services/status-bar-service.ts +0 -108
  220. package/src/services/storage-service.ts +0 -197
  221. package/src/style/codicons/README.md +0 -22
  222. package/src/style/codicons/codicon-animations.css +0 -15
  223. package/src/style/codicons/generator.js +0 -15
  224. package/src/style/entry.less +0 -25
  225. package/src/style/icon/fileicons/file-default.svg +0 -1
  226. package/src/style/icon/fileicons/folder-default.svg +0 -1
  227. package/src/style/icon/fileicons.less +0 -20
  228. package/src/style/icon/icon.ts +0 -543
  229. package/src/style/icon/ide-iconfont.ts +0 -13
  230. package/src/style/icon/index.less +0 -54
  231. package/src/style/icon/seti.woff +0 -0
  232. package/src/style/icon/symbol-icons/boolean-dark.svg +0 -3
  233. package/src/style/icon/symbol-icons/boolean-light.svg +0 -3
  234. package/src/style/icon/symbol-icons/class-dark.svg +0 -3
  235. package/src/style/icon/symbol-icons/class-light.svg +0 -3
  236. package/src/style/icon/symbol-icons/constant-dark.svg +0 -4
  237. package/src/style/icon/symbol-icons/constant-light.svg +0 -4
  238. package/src/style/icon/symbol-icons/enumerator-dark.svg +0 -3
  239. package/src/style/icon/symbol-icons/enumerator-item-dark.svg +0 -3
  240. package/src/style/icon/symbol-icons/enumerator-item-light.svg +0 -3
  241. package/src/style/icon/symbol-icons/enumerator-light.svg +0 -3
  242. package/src/style/icon/symbol-icons/event-dark.svg +0 -3
  243. package/src/style/icon/symbol-icons/event-light.svg +0 -3
  244. package/src/style/icon/symbol-icons/field-dark.svg +0 -3
  245. package/src/style/icon/symbol-icons/field-light.svg +0 -3
  246. package/src/style/icon/symbol-icons/file-dark.svg +0 -3
  247. package/src/style/icon/symbol-icons/file-light.svg +0 -3
  248. package/src/style/icon/symbol-icons/indexer-dark.svg +0 -3
  249. package/src/style/icon/symbol-icons/indexer-light.svg +0 -3
  250. package/src/style/icon/symbol-icons/interface-dark.svg +0 -3
  251. package/src/style/icon/symbol-icons/interface-light.svg +0 -3
  252. package/src/style/icon/symbol-icons/keyword-dark.svg +0 -3
  253. package/src/style/icon/symbol-icons/keyword-light.svg +0 -3
  254. package/src/style/icon/symbol-icons/method-dark.svg +0 -3
  255. package/src/style/icon/symbol-icons/method-light.svg +0 -3
  256. package/src/style/icon/symbol-icons/namespace-dark.svg +0 -3
  257. package/src/style/icon/symbol-icons/namespace-light.svg +0 -3
  258. package/src/style/icon/symbol-icons/numeric-dark.svg +0 -3
  259. package/src/style/icon/symbol-icons/numeric-light.svg +0 -3
  260. package/src/style/icon/symbol-icons/operator-dark.svg +0 -3
  261. package/src/style/icon/symbol-icons/operator-light.svg +0 -3
  262. package/src/style/icon/symbol-icons/property-dark.svg +0 -3
  263. package/src/style/icon/symbol-icons/property-light.svg +0 -3
  264. package/src/style/icon/symbol-icons/snippet-dark.svg +0 -3
  265. package/src/style/icon/symbol-icons/snippet-light.svg +0 -3
  266. package/src/style/icon/symbol-icons/string-dark.svg +0 -3
  267. package/src/style/icon/symbol-icons/string-light.svg +0 -3
  268. package/src/style/icon/symbol-icons/structure-dark.svg +0 -3
  269. package/src/style/icon/symbol-icons/structure-light.svg +0 -3
  270. package/src/style/icon/symbol-icons/symbol-icons.css +0 -284
  271. package/src/style/icon/symbol-icons/template-dark.svg +0 -3
  272. package/src/style/icon/symbol-icons/template-light.svg +0 -3
  273. package/src/style/icon/symbol-icons/variable-dark.svg +0 -3
  274. package/src/style/icon/symbol-icons/variable-light.svg +0 -3
  275. package/src/style/icon.less +0 -8
  276. package/src/style/index.less +0 -14
  277. package/src/style/monaco-override.less +0 -116
  278. package/src/style/normalize.less +0 -92
  279. package/src/style/octicons/octicons-cdn.css +0 -720
  280. package/src/style/octicons/octicons.css +0 -714
  281. package/src/style/octicons/octicons.html +0 -1882
  282. package/src/style/octicons/octicons.svg +0 -582
  283. package/src/style/octicons/octicons.ttf +0 -0
  284. package/src/style/override.less +0 -97
  285. package/src/style/toolbar.less +0 -199
  286. package/src/style/utilities.less +0 -8
  287. package/src/style/variable.less +0 -8
  288. package/src/terminal/index.ts +0 -7
  289. package/src/toolbar/components/auto-complete.tsx +0 -0
  290. package/src/toolbar/components/button.tsx +0 -440
  291. package/src/toolbar/components/index.ts +0 -2
  292. package/src/toolbar/components/select.tsx +0 -189
  293. package/src/toolbar/index.ts +0 -3
  294. package/src/toolbar/toolbar.popover.registry.ts +0 -32
  295. package/src/toolbar/toolbar.registry.ts +0 -352
  296. package/src/toolbar/toolbar.tsx +0 -710
  297. package/src/toolbar/types.ts +0 -383
  298. package/src/tree/index.ts +0 -3
  299. package/src/tree/tree-expansion.ts +0 -25
  300. package/src/tree/tree-selection.ts +0 -89
  301. package/src/tree/tree.ts +0 -294
  302. package/src/utils/create-overlay.tsx +0 -53
  303. package/src/utils/electron.ts +0 -92
  304. package/src/utils/env.ts +0 -26
  305. package/src/utils/icon.ts +0 -13
  306. package/src/utils/index.ts +0 -7
  307. package/src/utils/json.ts +0 -251
  308. package/src/utils/label.tsx +0 -36
  309. package/src/utils/parse.ts +0 -72
  310. package/src/utils/react-hooks.ts +0 -118
  311. package/src/variable/index.ts +0 -1
  312. package/src/variable/variable.ts +0 -84
  313. package/src/window/index.ts +0 -34
  314. package/src/window/window.service.ts +0 -100
@@ -1,517 +0,0 @@
1
- import { Autowired, Injectable } from '@opensumi/di';
2
- import {
3
- AllowedExtension,
4
- IAuthenticationService,
5
- IAuthenticationProvider,
6
- AuthenticationSessionsChangeEvent,
7
- AuthenticationSession,
8
- IAccountUsage,
9
- StorageProvider,
10
- IStorage,
11
- URI,
12
- STORAGE_SCHEMA,
13
- ILogger,
14
- IEventBus,
15
- ExtensionActivateEvent,
16
- Event,
17
- Emitter,
18
- AuthenticationProviderInformation,
19
- Disposable,
20
- SessionRequestInfo,
21
- formatLocalize,
22
- CommandRegistry,
23
- IDisposable,
24
- noAccountsId,
25
- DisposableCollection,
26
- } from '@opensumi/ide-core-common';
27
-
28
- import { IMenuRegistry, MenuId } from '../menu/next';
29
-
30
- @Injectable()
31
- export class AuthenticationService extends Disposable implements IAuthenticationService {
32
- @Autowired(ILogger)
33
- protected readonly logger: ILogger;
34
-
35
- @Autowired(StorageProvider)
36
- protected readonly getStorage: StorageProvider;
37
-
38
- @Autowired(IEventBus)
39
- protected readonly eventBus: IEventBus;
40
-
41
- @Autowired(IMenuRegistry)
42
- protected readonly menus: IMenuRegistry;
43
-
44
- @Autowired(CommandRegistry)
45
- protected readonly commands: CommandRegistry;
46
-
47
- private _onDidRegisterAuthenticationProvider: Emitter<AuthenticationProviderInformation> = this.registerDispose(
48
- new Emitter<AuthenticationProviderInformation>(),
49
- );
50
- public readonly onDidRegisterAuthenticationProvider: Event<AuthenticationProviderInformation> =
51
- this._onDidRegisterAuthenticationProvider.event;
52
-
53
- private _onDidUnregisterAuthenticationProvider: Emitter<AuthenticationProviderInformation> = this.registerDispose(
54
- new Emitter<AuthenticationProviderInformation>(),
55
- );
56
- readonly onDidUnregisterAuthenticationProvider: Event<AuthenticationProviderInformation> =
57
- this._onDidUnregisterAuthenticationProvider.event;
58
-
59
- private _onDidChangeSessions: Emitter<{
60
- providerId: string;
61
- label: string;
62
- event: AuthenticationSessionsChangeEvent;
63
- }> = this.registerDispose(
64
- new Emitter<{ providerId: string; label: string; event: AuthenticationSessionsChangeEvent }>(),
65
- );
66
- readonly onDidChangeSessions: Event<{ providerId: string; label: string; event: AuthenticationSessionsChangeEvent }> =
67
- this._onDidChangeSessions.event;
68
-
69
- private _storage: IStorage;
70
-
71
- private _authenticationProviders: Map<string, IAuthenticationProvider> = new Map<string, IAuthenticationProvider>();
72
-
73
- private _signInRequestItems = new Map<string, SessionRequestInfo>();
74
-
75
- private _noAccountsMenuItem: IDisposable | undefined;
76
-
77
- async initialize() {
78
- this._storage = await this.getStorage(new URI('authentication').withScheme(STORAGE_SCHEMA.GLOBAL));
79
- const disposableMap = new Map<string, DisposableCollection>();
80
- this.onDidChangeSessions(async (e) => {
81
- if (e.event.added.length > 0) {
82
- const sessions = await this.getSessions(e.providerId);
83
- sessions.forEach((session) => {
84
- if (sessions.find((s) => disposableMap.get(s.id))) {
85
- return;
86
- }
87
- const disposables = new DisposableCollection();
88
- const signOutCommandId = `account-sign-out-${e.providerId}-${session.id}`;
89
- const signOutCommand = this.commands.registerCommand(
90
- {
91
- id: signOutCommandId,
92
- label: formatLocalize('authentication.signOut', e.label),
93
- },
94
- {
95
- execute: async () => {
96
- await this.signOutOfAccount(e.providerId, session.account.label);
97
- },
98
- },
99
- );
100
- const manageTrustedCommandId = `manage-trusted-${e.providerId}-${session.id}`;
101
- const manageTrustedCommand = this.commands.registerCommand(
102
- {
103
- id: manageTrustedCommandId,
104
- label: '%authentication.manageTrustedExtensions%',
105
- },
106
- {
107
- execute: async () => {
108
- await this.manageTrustedExtensionsForAccount(e.providerId, session.account.label);
109
- },
110
- },
111
- );
112
-
113
- const accountMenuId = `${e.providerId}${session.account.label}`;
114
- const accountMenu = this.menus.registerMenuItem(MenuId.AccountsContext, {
115
- submenu: accountMenuId,
116
- label: `${session.account.label} (${e.label})`,
117
- });
118
- const menuAction = this.menus.registerMenuItems(accountMenuId, [
119
- {
120
- command: manageTrustedCommandId,
121
- },
122
- {
123
- command: signOutCommandId,
124
- },
125
- ]);
126
- disposables.push(accountMenu);
127
- disposables.push(menuAction);
128
- disposables.push(signOutCommand);
129
- disposables.push(manageTrustedCommand);
130
- disposableMap.set(session.id, disposables);
131
- });
132
- }
133
- if (e.event.removed.length > 0) {
134
- e.event.removed.forEach((removed) => {
135
- const toDispose = disposableMap.get(removed.id);
136
- if (toDispose) {
137
- toDispose.dispose();
138
- disposableMap.delete(removed.id);
139
- }
140
- });
141
- }
142
- });
143
- }
144
-
145
- get storage() {
146
- return this._storage;
147
- }
148
-
149
- registerAuthenticationProvider(id: string, provider: IAuthenticationProvider) {
150
- this._authenticationProviders.set(id, provider);
151
- this._onDidRegisterAuthenticationProvider.fire({ id, label: provider.label });
152
-
153
- this.updateAccountsMenuItem();
154
- }
155
-
156
- async sessionsUpdate(providerId: string, event: AuthenticationSessionsChangeEvent) {
157
- const provider = this._authenticationProviders.get(providerId);
158
- if (provider) {
159
- this._onDidChangeSessions.fire({ providerId, label: provider.label, event });
160
- await provider.updateSessionItems(event);
161
- this.updateAccountsMenuItem();
162
-
163
- if (event.added) {
164
- await this.updateNewSessionRequests(provider);
165
- }
166
- }
167
- }
168
-
169
- private async updateNewSessionRequests(provider: IAuthenticationProvider): Promise<void> {
170
- const existingRequestsForProvider = this._signInRequestItems.get(provider.id);
171
- if (!existingRequestsForProvider) {
172
- return;
173
- }
174
-
175
- const sessions = await provider.getSessions();
176
- Object.keys(existingRequestsForProvider).forEach((requestedScopes) => {
177
- if (sessions.some((session) => session.scopes.slice().sort().join('') === requestedScopes)) {
178
- const sessionRequest = existingRequestsForProvider[requestedScopes];
179
- if (sessionRequest) {
180
- sessionRequest.disposables.forEach((item) => item.dispose());
181
- }
182
-
183
- delete existingRequestsForProvider[requestedScopes];
184
- if (Object.keys(existingRequestsForProvider).length === 0) {
185
- this._signInRequestItems.delete(provider.id);
186
- } else {
187
- this._signInRequestItems.set(provider.id, existingRequestsForProvider);
188
- }
189
- }
190
- });
191
- }
192
-
193
- private getTrustedKey(providerId: string, accountName: string) {
194
- return `trusted-${providerId}-${accountName}`;
195
- }
196
-
197
- async getAllowedExtensions(providerId: string, accountName: string) {
198
- const storageKey = this.getTrustedKey(providerId, accountName);
199
- let trustedExtensions: AllowedExtension[] = [];
200
- try {
201
- const trustedExtensionSrc = await this.storage.get<string>(storageKey);
202
- if (trustedExtensionSrc) {
203
- trustedExtensions = JSON.parse(trustedExtensionSrc);
204
- }
205
- } catch (err) {
206
- this.logger.warn('read allow extensions error: ' + err);
207
- }
208
-
209
- return trustedExtensions;
210
- }
211
-
212
- async setAllowedExtensions(providerId: string, accountName: string, allowList: AllowedExtension[]) {
213
- const storageKey = this.getTrustedKey(providerId, accountName);
214
- await this.storage.set(storageKey, JSON.stringify(allowList));
215
- }
216
-
217
- async removeAllowedExtensions(providerId: string, accountName: string) {
218
- const storageKey = this.getTrustedKey(providerId, accountName);
219
- await this.storage.delete(storageKey);
220
- }
221
-
222
- async updatedAllowedExtension(
223
- providerId: string,
224
- accountName: string,
225
- extensionId: string,
226
- extensionName: string,
227
- isAllowed: boolean,
228
- ) {
229
- const allowList = await this.getAllowedExtensions(providerId, accountName);
230
- const index = allowList.findIndex((extension) => extension.id === extensionId);
231
- if (index === -1) {
232
- allowList.push({ id: extensionId, name: extensionName, allowed: isAllowed });
233
- } else {
234
- allowList[index].allowed = isAllowed;
235
- }
236
- await this.setAllowedExtensions(providerId, accountName, allowList);
237
- }
238
-
239
- async isAccessAllowed(providerId: string, accountName: string, extensionId: string) {
240
- const allowList = await this.getAllowedExtensions(providerId, accountName);
241
- const extensionData = allowList.find((extension) => extension.id === extensionId);
242
- if (extensionData) {
243
- // This property didn't exist on this data previously, inclusion in the list at all indicates allowance
244
- return extensionData.allowed !== undefined ? extensionData.allowed : true;
245
- }
246
- // TODO: Need to allow access to whitelist extension
247
- return false;
248
- }
249
-
250
- private async tryActivateProvider(providerId: string): Promise<IAuthenticationProvider> {
251
- await this.eventBus.fireAndAwait(new ExtensionActivateEvent({ topic: 'onView', data: providerId }));
252
- let provider = this._authenticationProviders.get(providerId);
253
- if (provider) {
254
- return provider;
255
- }
256
-
257
- // When activate has completed, the extension has made the call to `registerAuthenticationProvider`.
258
- // However, activate cannot block on this, so the renderer may not have gotten the event yet.
259
- const didRegister: Promise<IAuthenticationProvider> = new Promise((resolve, _) => {
260
- this.onDidRegisterAuthenticationProvider((e) => {
261
- if (e.id === providerId) {
262
- provider = this._authenticationProviders.get(providerId);
263
- if (provider) {
264
- resolve(provider);
265
- } else {
266
- throw new Error(`No authentication provider '${providerId}' is currently registered.`);
267
- }
268
- }
269
- });
270
- });
271
-
272
- const didTimeout: Promise<IAuthenticationProvider> = new Promise((_, reject) => {
273
- setTimeout(() => {
274
- reject(new Error(`didRegister ${providerId} timeout`));
275
- }, 5000);
276
- });
277
-
278
- return Promise.race([didRegister, didTimeout]);
279
- }
280
-
281
- async getSessions(providerId: string): Promise<ReadonlyArray<AuthenticationSession>> {
282
- try {
283
- const authProvider =
284
- this._authenticationProviders.get(providerId) || (await this.tryActivateProvider(providerId));
285
- return await authProvider.getSessions();
286
- } catch (_) {
287
- throw new Error(`No authentication provider '${providerId}' is currently registered.`);
288
- }
289
- }
290
-
291
- isAuthenticationProviderRegistered(id: string): boolean {
292
- return this._authenticationProviders.has(id);
293
- }
294
- getProviderIds(): string[] {
295
- const providerIds: string[] = [];
296
- this._authenticationProviders.forEach((provider) => {
297
- providerIds.push(provider.id);
298
- });
299
- return providerIds;
300
- }
301
- unregisterAuthenticationProvider(id: string): void {
302
- const provider = this._authenticationProviders.get(id);
303
- if (provider) {
304
- provider.dispose();
305
- this._authenticationProviders.delete(id);
306
- this._onDidUnregisterAuthenticationProvider.fire({ id, label: provider.label });
307
- this.updateAccountsMenuItem();
308
- }
309
- }
310
-
311
- private updateAccountsMenuItem(): void {
312
- let hasSession = false;
313
- this._authenticationProviders.forEach((provider) => {
314
- hasSession = hasSession || provider.hasSessions();
315
- });
316
-
317
- if (hasSession && this._noAccountsMenuItem) {
318
- this._noAccountsMenuItem.dispose();
319
- this._noAccountsMenuItem = undefined;
320
- }
321
-
322
- if (!hasSession && !this._noAccountsMenuItem) {
323
- this._noAccountsMenuItem = this.menus.registerMenuItem(MenuId.AccountsContext, {
324
- group: '0_accounts',
325
- command: noAccountsId,
326
- });
327
- }
328
- }
329
-
330
- async requestNewSession(providerId: string, scopes: string[], extensionId: string, extensionName: string) {
331
- let provider = this._authenticationProviders.get(providerId);
332
- if (!provider) {
333
- // Activate has already been called for the authentication provider, but it cannot block on registering itself
334
- // since this is sync and returns a disposable. So, wait for registration event to fire that indicates the
335
- // provider is now in the map.
336
- await new Promise<void>((resolve, _) => {
337
- this.onDidRegisterAuthenticationProvider((e) => {
338
- if (e.id === providerId) {
339
- provider = this._authenticationProviders.get(providerId);
340
- resolve();
341
- }
342
- });
343
- });
344
- }
345
-
346
- if (provider) {
347
- const providerRequests = this._signInRequestItems.get(providerId);
348
- const scopesList = scopes.sort().join('');
349
- const extensionHasExistingRequest =
350
- providerRequests &&
351
- providerRequests[scopesList] &&
352
- providerRequests[scopesList].requestingExtensionIds.includes(extensionId);
353
-
354
- if (extensionHasExistingRequest) {
355
- return;
356
- }
357
-
358
- const signInCommand = this.commands.registerCommand(
359
- {
360
- id: `${extensionId}signIn`,
361
- label: formatLocalize('authentication.signInRequests', extensionName),
362
- },
363
- {
364
- execute: async () => {
365
- const session = await this.login(providerId, scopes);
366
- const accountName = session.account.label;
367
- // Add extension to allow list since user explicitly signed in on behalf of it
368
- const allowList = await this.getAllowedExtensions(providerId, accountName);
369
- if (!allowList.find((allowed) => allowed.id === extensionId)) {
370
- allowList.push({ id: extensionId, name: extensionName });
371
- await this.setAllowedExtensions(providerId, accountName, allowList);
372
- }
373
-
374
- // And also set it as the preferred account for the extension
375
- await this.setExtensionSessionId(extensionName, providerId, session.id);
376
- },
377
- },
378
- );
379
-
380
- const menuItem = this.menus.registerMenuItem(MenuId.AccountsContext, {
381
- group: '2_signInRequests',
382
- command: `${extensionId}signIn`,
383
- });
384
-
385
- if (providerRequests) {
386
- const existingRequest = providerRequests[scopesList] || { disposables: [], requestingExtensionIds: [] };
387
-
388
- providerRequests[scopesList] = {
389
- disposables: [...existingRequest.disposables, menuItem, signInCommand],
390
- requestingExtensionIds: [...existingRequest.requestingExtensionIds, extensionId],
391
- };
392
- this._signInRequestItems.set(providerId, providerRequests);
393
- } else {
394
- this._signInRequestItems.set(providerId, {
395
- [scopesList]: {
396
- disposables: [menuItem, signInCommand],
397
- requestingExtensionIds: [extensionId],
398
- },
399
- });
400
- }
401
- }
402
- }
403
- getLabel(providerId: string): string {
404
- const authProvider = this._authenticationProviders.get(providerId);
405
- if (authProvider) {
406
- return authProvider.label;
407
- } else {
408
- throw new Error(`No authentication provider '${providerId}' has been declared.`);
409
- }
410
- }
411
- supportsMultipleAccounts(providerId: string): boolean {
412
- const authProvider = this._authenticationProviders.get(providerId);
413
- if (authProvider) {
414
- return authProvider.supportsMultipleAccounts;
415
- } else {
416
- throw new Error(`No authentication provider '${providerId}' is currently registered.`);
417
- }
418
- }
419
- async login(providerId: string, scopes: string[]): Promise<AuthenticationSession> {
420
- try {
421
- const authProvider =
422
- this._authenticationProviders.get(providerId) || (await this.tryActivateProvider(providerId));
423
- return await authProvider.login(scopes);
424
- } catch (err) {
425
- throw new Error(
426
- `No authentication provider '${providerId}' is currently registered, error messge: ${err.message}`,
427
- );
428
- }
429
- }
430
- logout(providerId: string, sessionId: string): Promise<void> {
431
- const authProvider = this._authenticationProviders.get(providerId);
432
- if (authProvider) {
433
- return authProvider.logout(sessionId);
434
- } else {
435
- throw new Error(`No authentication provider '${providerId}' is currently registered.`);
436
- }
437
- }
438
- manageTrustedExtensionsForAccount(providerId: string, accountName: string): Promise<void> {
439
- const authProvider = this._authenticationProviders.get(providerId);
440
- if (authProvider) {
441
- return authProvider.manageTrustedExtensions(accountName);
442
- } else {
443
- throw new Error(`No authentication provider '${providerId}' is currently registered.`);
444
- }
445
- }
446
- signOutOfAccount(providerId: string, accountName: string): Promise<void> {
447
- const authProvider = this._authenticationProviders.get(providerId);
448
- if (authProvider) {
449
- return authProvider.signOut(accountName);
450
- } else {
451
- throw new Error(`No authentication provider '${providerId}' is currently registered.`);
452
- }
453
- }
454
-
455
- private getUsagesKey(providerId: string, accountName: string) {
456
- return `usages-${providerId}-${accountName}`;
457
- }
458
-
459
- async getAccountUsages(providerId: string, accountName: string) {
460
- const accountKey = this.getUsagesKey(providerId, accountName);
461
- const storedUsages = await this.storage.get<string>(accountKey);
462
- let usages: IAccountUsage[] = [];
463
- if (storedUsages) {
464
- try {
465
- usages = JSON.parse(storedUsages);
466
- } catch (err) {
467
- this.logger.warn('parse account usages error: ' + err);
468
- }
469
- }
470
-
471
- return usages;
472
- }
473
-
474
- async addAccountUsage(providerId: string, accountName: string, extensionId: string, extensionName: string) {
475
- const accountKey = this.getUsagesKey(providerId, accountName);
476
- const usages = await this.getAccountUsages(providerId, accountName);
477
-
478
- const existingUsageIndex = usages.findIndex((usage) => usage.extensionId === extensionId);
479
- if (existingUsageIndex > -1) {
480
- usages.splice(existingUsageIndex, 1, {
481
- extensionId,
482
- extensionName,
483
- lastUsed: Date.now(),
484
- });
485
- } else {
486
- usages.push({
487
- extensionId,
488
- extensionName,
489
- lastUsed: Date.now(),
490
- });
491
- }
492
-
493
- await this.storage.set(accountKey, JSON.stringify(usages));
494
- }
495
-
496
- async removeAccountUsage(providerId: string, accountName: string) {
497
- const accountKey = this.getUsagesKey(providerId, accountName);
498
- await this.storage.delete(accountKey);
499
- }
500
-
501
- private getExtensionSessionIdKey(providerId: string, accountName: string) {
502
- return `session-${providerId}-${accountName}`;
503
- }
504
-
505
- async getExtensionSessionId(extensionName: string, providerId: string): Promise<string | undefined> {
506
- const accountKey = this.getExtensionSessionIdKey(extensionName, providerId);
507
- return await this.storage.get(accountKey);
508
- }
509
- async setExtensionSessionId(extensionName: string, providerId: string, sessionId: string): Promise<void> {
510
- const accountKey = this.getExtensionSessionIdKey(extensionName, providerId);
511
- await this.storage.set(accountKey, sessionId);
512
- }
513
- async removeExtensionSessionId(extensionName: string, providerId: string): Promise<void> {
514
- const accountKey = this.getExtensionSessionIdKey(extensionName, providerId);
515
- await this.storage.delete(accountKey);
516
- }
517
- }