@gitpod/gitpod-protocol 0.1.5-v0.6.0-beta4 → 0.1.5-vn-6525.75
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.
- package/data/gitpod-schema.json +68 -26
- package/lib/accounting-protocol.d.ts +155 -0
- package/lib/accounting-protocol.d.ts.map +1 -0
- package/lib/accounting-protocol.js +100 -0
- package/lib/accounting-protocol.js.map +1 -0
- package/lib/admin-protocol.d.ts +33 -4
- package/lib/admin-protocol.d.ts.map +1 -1
- package/lib/admin-protocol.js +15 -0
- package/lib/admin-protocol.js.map +1 -1
- package/lib/analytics.d.ts +44 -0
- package/lib/analytics.d.ts.map +1 -0
- package/lib/analytics.js +10 -0
- package/lib/analytics.js.map +1 -0
- package/lib/auth.d.ts +25 -0
- package/lib/auth.d.ts.map +1 -0
- package/lib/auth.js +16 -0
- package/lib/auth.js.map +1 -0
- package/lib/context-url.d.ts +31 -0
- package/lib/context-url.d.ts.map +1 -0
- package/lib/context-url.js +102 -0
- package/lib/context-url.js.map +1 -0
- package/lib/context-url.spec.d.ts +14 -0
- package/lib/context-url.spec.d.ts.map +1 -0
- package/lib/context-url.spec.js +109 -0
- package/lib/context-url.spec.js.map +1 -0
- package/lib/email-protocol.d.ts +1 -2
- package/lib/email-protocol.d.ts.map +1 -1
- package/lib/email-protocol.js +4 -4
- package/lib/email-protocol.js.map +1 -1
- package/lib/encryption/container-module.d.ts.map +1 -1
- package/lib/encryption/container-module.js +5 -4
- package/lib/encryption/container-module.js.map +1 -1
- package/lib/encryption/encryption-engine.d.ts.map +1 -1
- package/lib/encryption/encryption-engine.js +25 -26
- package/lib/encryption/encryption-engine.js.map +1 -1
- package/lib/encryption/encryption-engine.spec.d.ts.map +1 -1
- package/lib/encryption/encryption-engine.spec.js +29 -37
- package/lib/encryption/encryption-engine.spec.js.map +1 -1
- package/lib/encryption/encryption-service.d.ts.map +1 -1
- package/lib/encryption/encryption-service.js +30 -44
- package/lib/encryption/encryption-service.js.map +1 -1
- package/lib/encryption/key-provider.d.ts.map +1 -1
- package/lib/encryption/key-provider.js +31 -38
- package/lib/encryption/key-provider.js.map +1 -1
- package/lib/env.d.ts +2 -3
- package/lib/env.d.ts.map +1 -1
- package/lib/env.js +24 -25
- package/lib/env.js.map +1 -1
- package/lib/gitpod-file-parser.d.ts.map +1 -1
- package/lib/gitpod-file-parser.js +26 -42
- package/lib/gitpod-file-parser.js.map +1 -1
- package/lib/gitpod-file-parser.spec.js +145 -142
- package/lib/gitpod-file-parser.spec.js.map +1 -1
- package/lib/gitpod-service.d.ts +172 -33
- package/lib/gitpod-service.d.ts.map +1 -1
- package/lib/gitpod-service.js +187 -267
- package/lib/gitpod-service.js.map +1 -1
- package/lib/headless-workspace-log.d.ts +9 -11
- package/lib/headless-workspace-log.d.ts.map +1 -1
- package/lib/headless-workspace-log.js +6 -8
- package/lib/headless-workspace-log.js.map +1 -1
- package/lib/ide-frontend-service.d.ts +5 -1
- package/lib/ide-frontend-service.d.ts.map +1 -1
- package/lib/ide-protocol.d.ts +105 -0
- package/lib/ide-protocol.d.ts.map +1 -0
- package/lib/{util/without.js → ide-protocol.js} +2 -2
- package/lib/ide-protocol.js.map +1 -0
- package/lib/index.d.ts +16 -10
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +7 -1
- package/lib/index.js.map +1 -1
- package/lib/installation-admin-protocol.d.ts +27 -0
- package/lib/installation-admin-protocol.d.ts.map +1 -0
- package/lib/installation-admin-protocol.js +30 -0
- package/lib/installation-admin-protocol.js.map +1 -0
- package/lib/license-protocol.d.ts.map +1 -1
- package/lib/license-protocol.js.map +1 -1
- package/lib/messaging/browser/connection.d.ts +5 -3
- package/lib/messaging/browser/connection.d.ts.map +1 -1
- package/lib/messaging/browser/connection.js +184 -34
- package/lib/messaging/browser/connection.js.map +1 -1
- package/lib/messaging/browser/window-connection.d.ts +4 -4
- package/lib/messaging/browser/window-connection.d.ts.map +1 -1
- package/lib/messaging/browser/window-connection.js +42 -59
- package/lib/messaging/browser/window-connection.js.map +1 -1
- package/lib/messaging/client-call-metrics.d.ts +35 -0
- package/lib/messaging/client-call-metrics.d.ts.map +1 -0
- package/lib/messaging/client-call-metrics.js +83 -0
- package/lib/messaging/client-call-metrics.js.map +1 -0
- package/lib/messaging/error.d.ts +5 -1
- package/lib/messaging/error.d.ts.map +1 -1
- package/lib/messaging/error.js +10 -2
- package/lib/messaging/error.js.map +1 -1
- package/lib/messaging/handler.d.ts +10 -0
- package/lib/messaging/handler.d.ts.map +1 -1
- package/lib/messaging/handler.js +1 -1
- package/lib/messaging/node/connection.d.ts +1 -17
- package/lib/messaging/node/connection.d.ts.map +1 -1
- package/lib/messaging/node/connection.js +24 -60
- package/lib/messaging/node/connection.js.map +1 -1
- package/lib/messaging/proxy-factory.d.ts +3 -1
- package/lib/messaging/proxy-factory.d.ts.map +1 -1
- package/lib/messaging/proxy-factory.js +75 -162
- package/lib/messaging/proxy-factory.js.map +1 -1
- package/lib/oss-allowlist.d.ts +14 -0
- package/lib/oss-allowlist.d.ts.map +1 -0
- package/lib/oss-allowlist.js +8 -0
- package/lib/oss-allowlist.js.map +1 -0
- package/lib/payment-protocol.d.ts +18 -0
- package/lib/payment-protocol.d.ts.map +1 -0
- package/lib/payment-protocol.js +13 -0
- package/lib/payment-protocol.js.map +1 -0
- package/lib/permission.d.ts +10 -5
- package/lib/permission.d.ts.map +1 -1
- package/lib/permission.js +41 -35
- package/lib/permission.js.map +1 -1
- package/lib/plans.d.ts +210 -0
- package/lib/plans.d.ts.map +1 -0
- package/lib/plans.js +605 -0
- package/lib/plans.js.map +1 -0
- package/lib/protocol.d.ts +164 -88
- package/lib/protocol.d.ts.map +1 -1
- package/lib/protocol.js +184 -199
- package/lib/protocol.js.map +1 -1
- package/lib/snapshot-url.d.ts +14 -0
- package/lib/snapshot-url.d.ts.map +1 -0
- package/lib/snapshot-url.js +26 -0
- package/lib/snapshot-url.js.map +1 -0
- package/{src/util/without.ts → lib/snapshot-url.spec.d.ts} +2 -3
- package/lib/snapshot-url.spec.d.ts.map +1 -0
- package/lib/snapshot-url.spec.js +41 -0
- package/lib/snapshot-url.spec.js.map +1 -0
- package/lib/team-subscription-protocol.d.ts +75 -0
- package/lib/team-subscription-protocol.d.ts.map +1 -0
- package/lib/team-subscription-protocol.js +63 -0
- package/lib/team-subscription-protocol.js.map +1 -0
- package/lib/teams-projects-protocol.d.ts +113 -0
- package/lib/teams-projects-protocol.d.ts.map +1 -0
- package/lib/teams-projects-protocol.js +30 -0
- package/lib/teams-projects-protocol.js.map +1 -0
- package/lib/typings/globals.d.ts +2 -2
- package/lib/typings/globals.d.ts.map +1 -1
- package/lib/util/analytics.d.ts +8 -0
- package/lib/util/analytics.d.ts.map +1 -0
- package/lib/util/analytics.js +88 -0
- package/lib/util/analytics.js.map +1 -0
- package/lib/util/async-iterator.d.ts.map +1 -1
- package/lib/util/async-iterator.js +57 -135
- package/lib/util/async-iterator.js.map +1 -1
- package/lib/util/cancelable.js +17 -59
- package/lib/util/cancelable.js.map +1 -1
- package/lib/util/date-time.js +11 -11
- package/lib/util/date-time.js.map +1 -1
- package/lib/util/deferred.js +10 -12
- package/lib/util/deferred.js.map +1 -1
- package/lib/util/disposable.d.ts.map +1 -1
- package/lib/util/disposable.js +27 -40
- package/lib/util/disposable.js.map +1 -1
- package/lib/util/event.d.ts.map +1 -1
- package/lib/util/event.js +63 -77
- package/lib/util/event.js.map +1 -1
- package/lib/util/garbage-collected-cache.d.ts +1 -0
- package/lib/util/garbage-collected-cache.d.ts.map +1 -1
- package/lib/util/garbage-collected-cache.js +27 -47
- package/lib/util/garbage-collected-cache.js.map +1 -1
- package/lib/util/generate-workspace-id.d.ts +4 -0
- package/lib/util/generate-workspace-id.d.ts.map +1 -0
- package/lib/util/generate-workspace-id.js +487 -0
- package/lib/util/generate-workspace-id.js.map +1 -0
- package/{src/theia-plugins.ts → lib/util/generate-workspace-id.spec.d.ts} +2 -6
- package/lib/util/generate-workspace-id.spec.d.ts.map +1 -0
- package/lib/util/generate-workspace-id.spec.js +91 -0
- package/lib/util/generate-workspace-id.spec.js.map +1 -0
- package/lib/util/gitpod-cookie.d.ts +20 -0
- package/lib/util/gitpod-cookie.d.ts.map +1 -0
- package/lib/util/gitpod-cookie.js +41 -0
- package/lib/util/gitpod-cookie.js.map +1 -0
- package/lib/util/gitpod-host-url.d.ts +2 -2
- package/lib/util/gitpod-host-url.d.ts.map +1 -1
- package/lib/util/gitpod-host-url.js +109 -106
- package/lib/util/gitpod-host-url.js.map +1 -1
- package/lib/util/gitpod-host-url.spec.d.ts +8 -1
- package/lib/util/gitpod-host-url.spec.d.ts.map +1 -1
- package/lib/util/gitpod-host-url.spec.js +114 -22
- package/lib/util/gitpod-host-url.spec.js.map +1 -1
- package/lib/util/grpc.d.ts +15 -0
- package/lib/util/grpc.d.ts.map +1 -0
- package/lib/util/grpc.js +18 -0
- package/lib/util/grpc.js.map +1 -0
- package/lib/util/jaeger-client-types.d.ts +68 -0
- package/lib/util/jaeger-client-types.d.ts.map +1 -0
- package/lib/{theia-plugins.js → util/jaeger-client-types.js} +1 -1
- package/lib/util/jaeger-client-types.js.map +1 -0
- package/lib/util/logging.d.ts +49 -33
- package/lib/util/logging.d.ts.map +1 -1
- package/lib/util/logging.js +125 -129
- package/lib/util/logging.js.map +1 -1
- package/lib/util/make-link.js +5 -5
- package/lib/util/make-link.js.map +1 -1
- package/lib/util/parse-workspace-id.d.ts +13 -3
- package/lib/util/parse-workspace-id.d.ts.map +1 -1
- package/lib/util/parse-workspace-id.js +37 -8
- package/lib/util/parse-workspace-id.js.map +1 -1
- package/lib/util/parse-workspace-id.spec.d.ts +8 -0
- package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
- package/lib/util/parse-workspace-id.spec.js +127 -47
- package/lib/util/parse-workspace-id.spec.js.map +1 -1
- package/lib/util/queue.js +16 -55
- package/lib/util/queue.js.map +1 -1
- package/lib/util/queue.spec.js +147 -288
- package/lib/util/queue.spec.js.map +1 -1
- package/lib/util/repeat.d.ts +15 -0
- package/lib/util/repeat.d.ts.map +1 -0
- package/lib/util/repeat.js +55 -0
- package/lib/util/repeat.js.map +1 -0
- package/lib/util/semaphore.d.ts.map +1 -1
- package/lib/util/semaphore.js +15 -46
- package/lib/util/semaphore.js.map +1 -1
- package/lib/util/skip-if.d.ts.map +1 -1
- package/lib/util/skip-if.js +6 -6
- package/lib/util/skip-if.js.map +1 -1
- package/lib/util/timeutil.d.ts.map +1 -1
- package/lib/util/timeutil.js +28 -16
- package/lib/util/timeutil.js.map +1 -1
- package/lib/util/timeutil.spec.d.ts.map +1 -1
- package/lib/util/timeutil.spec.js +21 -24
- package/lib/util/timeutil.spec.js.map +1 -1
- package/lib/util/tracing.d.ts +52 -6
- package/lib/util/tracing.d.ts.map +1 -1
- package/lib/util/tracing.js +199 -64
- package/lib/util/tracing.js.map +1 -1
- package/lib/util/tracing.spec.d.ts +7 -0
- package/lib/util/tracing.spec.d.ts.map +1 -0
- package/lib/util/tracing.spec.js +121 -0
- package/lib/util/tracing.spec.js.map +1 -0
- package/lib/util/workspace-port-authentication.d.ts +7 -7
- package/lib/util/workspace-port-authentication.d.ts.map +1 -1
- package/lib/util/workspace-port-authentication.js +10 -12
- package/lib/util/workspace-port-authentication.js.map +1 -1
- package/lib/workspace-cluster.d.ts +76 -0
- package/lib/workspace-cluster.d.ts.map +1 -0
- package/lib/workspace-cluster.js +31 -0
- package/lib/workspace-cluster.js.map +1 -0
- package/lib/workspace-instance.d.ts +28 -4
- package/lib/workspace-instance.d.ts.map +1 -1
- package/lib/wsready.d.ts +1 -1
- package/lib/wsready.d.ts.map +1 -1
- package/lib/wsready.js +2 -2
- package/package.json +33 -17
- package/pkg-yarn.lock +18 -9
- package/provenance-bundle.jsonl +2 -0
- package/src/accounting-protocol.ts +231 -0
- package/src/admin-protocol.ts +71 -19
- package/src/analytics.ts +52 -0
- package/src/auth.ts +27 -0
- package/src/context-url.spec.ts +67 -0
- package/src/context-url.ts +109 -0
- package/src/email-protocol.ts +5 -7
- package/src/encryption/container-module.ts +2 -3
- package/src/encryption/encryption-engine.spec.ts +9 -8
- package/src/encryption/encryption-engine.ts +14 -14
- package/src/encryption/encryption-service.ts +4 -5
- package/src/encryption/key-provider.ts +16 -19
- package/src/env.ts +18 -18
- package/src/gitpod-file-parser.spec.ts +55 -61
- package/src/gitpod-file-parser.ts +16 -17
- package/src/gitpod-service.ts +327 -102
- package/src/headless-workspace-log.ts +12 -14
- package/src/ide-frontend-service.ts +6 -2
- package/src/ide-protocol.ts +119 -0
- package/src/index.ts +16 -10
- package/src/installation-admin-protocol.ts +42 -0
- package/src/license-protocol.ts +5 -6
- package/src/messaging/browser/connection.ts +197 -18
- package/src/messaging/browser/window-connection.ts +39 -29
- package/src/messaging/client-call-metrics.ts +96 -0
- package/src/messaging/error.ts +15 -5
- package/src/messaging/handler.ts +13 -1
- package/src/messaging/node/connection.ts +23 -70
- package/src/messaging/proxy-factory.ts +35 -34
- package/src/oss-allowlist.ts +15 -0
- package/src/payment-protocol.ts +20 -0
- package/src/permission.ts +42 -38
- package/src/plans.ts +679 -0
- package/src/protocol.ts +384 -279
- package/src/snapshot-url.spec.ts +27 -0
- package/src/snapshot-url.ts +27 -0
- package/src/team-subscription-protocol.ts +123 -0
- package/src/teams-projects-protocol.ts +147 -0
- package/src/typings/globals.ts +4 -4
- package/src/util/analytics.ts +109 -0
- package/src/util/async-iterator.ts +4 -5
- package/src/util/cancelable.ts +3 -3
- package/src/util/date-time.ts +8 -8
- package/src/util/deferred.ts +6 -6
- package/src/util/disposable.ts +3 -6
- package/src/util/event.ts +9 -11
- package/src/util/garbage-collected-cache.ts +11 -8
- package/src/util/generate-workspace-id.spec.ts +51 -0
- package/src/util/generate-workspace-id.ts +475 -0
- package/src/util/gitpod-cookie.ts +38 -0
- package/src/util/gitpod-host-url.spec.ts +63 -7
- package/src/util/gitpod-host-url.ts +55 -38
- package/src/util/grpc.ts +15 -0
- package/src/util/jaeger-client-types.ts +102 -0
- package/src/util/logging.ts +145 -71
- package/src/util/make-link.ts +6 -7
- package/src/util/parse-workspace-id.spec.ts +60 -10
- package/src/util/parse-workspace-id.ts +38 -8
- package/src/util/queue.spec.ts +28 -26
- package/src/util/repeat.ts +45 -0
- package/src/util/semaphore.ts +6 -8
- package/src/util/skip-if.ts +10 -7
- package/src/util/timeutil.spec.ts +14 -15
- package/src/util/timeutil.ts +19 -15
- package/src/util/tracing.spec.ts +88 -0
- package/src/util/tracing.ts +202 -31
- package/src/util/workspace-port-authentication.ts +10 -13
- package/src/workspace-cluster.ts +107 -0
- package/src/workspace-instance.ts +72 -30
- package/src/wsready.ts +3 -3
- package/data/builtin-theia-plugins.json +0 -372
- package/lib/messaging/connection-error-handler.d.ts +0 -27
- package/lib/messaging/connection-error-handler.d.ts.map +0 -1
- package/lib/messaging/connection-error-handler.js +0 -46
- package/lib/messaging/connection-error-handler.js.map +0 -1
- package/lib/theia-plugins.d.ts +0 -11
- package/lib/theia-plugins.d.ts.map +0 -1
- package/lib/theia-plugins.js.map +0 -1
- package/lib/util/repeater.d.ts +0 -22
- package/lib/util/repeater.d.ts.map +0 -1
- package/lib/util/repeater.js +0 -118
- package/lib/util/repeater.js.map +0 -1
- package/lib/util/safe-promise.d.ts +0 -11
- package/lib/util/safe-promise.d.ts.map +0 -1
- package/lib/util/safe-promise.js +0 -34
- package/lib/util/safe-promise.js.map +0 -1
- package/lib/util/without.d.ts +0 -7
- package/lib/util/without.d.ts.map +0 -1
- package/lib/util/without.js.map +0 -1
- package/src/messaging/connection-error-handler.ts +0 -62
- package/src/util/jaeger-client.d.ts +0 -105
- package/src/util/repeater.ts +0 -49
- package/src/util/safe-promise.ts +0 -26
package/src/admin-protocol.ts
CHANGED
|
@@ -5,59 +5,84 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { User, Workspace, NamedWorkspaceFeatureFlag } from "./protocol";
|
|
8
|
-
import {
|
|
8
|
+
import { FindPrebuildsParams } from "./gitpod-service";
|
|
9
|
+
import { Project, Team, PrebuildWithStatus, TeamMemberInfo, TeamMemberRole } from "./teams-projects-protocol";
|
|
9
10
|
import { WorkspaceInstance, WorkspaceInstancePhase } from "./workspace-instance";
|
|
10
11
|
import { RoleOrPermission } from "./permission";
|
|
12
|
+
import { AccountStatement } from "./accounting-protocol";
|
|
13
|
+
import { InstallationAdminSettings } from "./installation-admin-protocol";
|
|
11
14
|
|
|
12
15
|
export interface AdminServer {
|
|
13
16
|
adminGetUsers(req: AdminGetListRequest<User>): Promise<AdminGetListResult<User>>;
|
|
14
17
|
adminGetUser(id: string): Promise<User>;
|
|
15
18
|
adminBlockUser(req: AdminBlockUserRequest): Promise<User>;
|
|
19
|
+
adminDeleteUser(id: string): Promise<void>;
|
|
16
20
|
adminModifyRoleOrPermission(req: AdminModifyRoleOrPermissionRequest): Promise<User>;
|
|
17
21
|
adminModifyPermanentWorkspaceFeatureFlag(req: AdminModifyPermanentWorkspaceFeatureFlagRequest): Promise<User>;
|
|
18
22
|
|
|
23
|
+
adminGetTeamMembers(teamId: string): Promise<TeamMemberInfo[]>;
|
|
24
|
+
adminGetTeams(req: AdminGetListRequest<Team>): Promise<AdminGetListResult<Team>>;
|
|
25
|
+
adminGetTeamById(id: string): Promise<Team | undefined>;
|
|
26
|
+
adminSetTeamMemberRole(teamId: string, userId: string, role: TeamMemberRole): Promise<void>;
|
|
27
|
+
|
|
19
28
|
adminGetWorkspaces(req: AdminGetWorkspacesRequest): Promise<AdminGetListResult<WorkspaceAndInstance>>;
|
|
20
29
|
adminGetWorkspace(id: string): Promise<WorkspaceAndInstance>;
|
|
21
30
|
adminForceStopWorkspace(id: string): Promise<void>;
|
|
31
|
+
adminRestoreSoftDeletedWorkspace(id: string): Promise<void>;
|
|
32
|
+
|
|
33
|
+
adminGetProjectsBySearchTerm(req: AdminGetListRequest<Project>): Promise<AdminGetListResult<Project>>;
|
|
34
|
+
adminGetProjectById(id: string): Promise<Project | undefined>;
|
|
22
35
|
|
|
36
|
+
adminFindPrebuilds(params: FindPrebuildsParams): Promise<PrebuildWithStatus[]>;
|
|
23
37
|
adminSetLicense(key: string): Promise<void>;
|
|
38
|
+
|
|
39
|
+
adminGetAccountStatement(userId: string): Promise<AccountStatement>;
|
|
40
|
+
adminSetProfessionalOpenSource(userId: string, shouldGetProfOSS: boolean): Promise<void>;
|
|
41
|
+
adminIsStudent(userId: string): Promise<boolean>;
|
|
42
|
+
adminAddStudentEmailDomain(userId: string, domain: string): Promise<void>;
|
|
43
|
+
adminGrantExtraHours(userId: string, extraHours: number): Promise<void>;
|
|
44
|
+
|
|
45
|
+
adminGetSettings(): Promise<InstallationAdminSettings>;
|
|
46
|
+
adminUpdateSettings(settings: InstallationAdminSettings): Promise<void>;
|
|
24
47
|
}
|
|
25
48
|
|
|
26
49
|
export interface AdminGetListRequest<T> {
|
|
27
|
-
offset: number
|
|
28
|
-
limit: number
|
|
29
|
-
orderBy: keyof T
|
|
30
|
-
orderDir: "asc" | "desc"
|
|
50
|
+
offset: number;
|
|
51
|
+
limit: number;
|
|
52
|
+
orderBy: keyof T;
|
|
53
|
+
orderDir: "asc" | "desc";
|
|
31
54
|
searchTerm?: string;
|
|
32
55
|
}
|
|
33
56
|
|
|
34
57
|
export interface AdminGetListResult<T> {
|
|
35
|
-
total: number
|
|
36
|
-
rows: T[]
|
|
58
|
+
total: number;
|
|
59
|
+
rows: T[];
|
|
37
60
|
}
|
|
38
61
|
|
|
39
62
|
export interface AdminBlockUserRequest {
|
|
40
|
-
id: string
|
|
41
|
-
blocked: boolean
|
|
63
|
+
id: string;
|
|
64
|
+
blocked: boolean;
|
|
42
65
|
}
|
|
43
66
|
|
|
44
67
|
export interface AdminModifyRoleOrPermissionRequest {
|
|
45
68
|
id: string;
|
|
46
69
|
rpp: {
|
|
47
|
-
r: RoleOrPermission
|
|
48
|
-
add: boolean
|
|
49
|
-
}[]
|
|
70
|
+
r: RoleOrPermission;
|
|
71
|
+
add: boolean;
|
|
72
|
+
}[];
|
|
50
73
|
}
|
|
51
74
|
|
|
52
75
|
export interface AdminModifyPermanentWorkspaceFeatureFlagRequest {
|
|
53
76
|
id: string;
|
|
54
77
|
changes: {
|
|
55
|
-
featureFlag: NamedWorkspaceFeatureFlag
|
|
56
|
-
add: boolean
|
|
57
|
-
}[]
|
|
78
|
+
featureFlag: NamedWorkspaceFeatureFlag;
|
|
79
|
+
add: boolean;
|
|
80
|
+
}[];
|
|
58
81
|
}
|
|
59
82
|
|
|
60
|
-
export interface WorkspaceAndInstance
|
|
83
|
+
export interface WorkspaceAndInstance
|
|
84
|
+
extends Omit<Workspace, "id" | "creationTime">,
|
|
85
|
+
Omit<WorkspaceInstance, "id" | "creationTime"> {
|
|
61
86
|
workspaceId: string;
|
|
62
87
|
workspaceCreationTime: string;
|
|
63
88
|
instanceId: string;
|
|
@@ -65,6 +90,33 @@ export interface WorkspaceAndInstance extends Without<Workspace, "id"|"creationT
|
|
|
65
90
|
phase: WorkspaceInstancePhase;
|
|
66
91
|
}
|
|
67
92
|
|
|
68
|
-
export
|
|
69
|
-
|
|
70
|
-
|
|
93
|
+
export namespace WorkspaceAndInstance {
|
|
94
|
+
export function toWorkspace(wai: WorkspaceAndInstance): Workspace {
|
|
95
|
+
return {
|
|
96
|
+
id: wai.workspaceId,
|
|
97
|
+
creationTime: wai.workspaceCreationTime,
|
|
98
|
+
...wai,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function toInstance(wai: WorkspaceAndInstance): WorkspaceInstance | undefined {
|
|
103
|
+
if (!wai.instanceId) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
id: wai.instanceId,
|
|
108
|
+
creationTime: wai.instanceCreationTime,
|
|
109
|
+
...wai,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export type AdminGetWorkspacesRequest = AdminGetListRequest<WorkspaceAndInstance> & AdminGetWorkspacesQuery;
|
|
115
|
+
/** The fields are meant to be used either OR (not combined) */
|
|
116
|
+
export type AdminGetWorkspacesQuery = {
|
|
117
|
+
/** we use this field in case we have a UUIDv4 and don't know whether it's an (old) workspace or instance id */
|
|
118
|
+
instanceIdOrWorkspaceId?: string;
|
|
119
|
+
instanceId?: string;
|
|
120
|
+
workspaceId?: string;
|
|
121
|
+
ownerId?: string;
|
|
122
|
+
};
|
package/src/analytics.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2021 Gitpod GmbH. All rights reserved.
|
|
3
|
+
* Licensed under the GNU Affero General Public License (AGPL).
|
|
4
|
+
* See License-AGPL.txt in the project root for license information.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const IAnalyticsWriter = Symbol("IAnalyticsWriter");
|
|
8
|
+
|
|
9
|
+
type Identity =
|
|
10
|
+
| { userId: string | number; anonymousId?: string | number }
|
|
11
|
+
| { userId?: string | number; anonymousId: string | number };
|
|
12
|
+
|
|
13
|
+
interface Message {
|
|
14
|
+
messageId?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type IdentifyMessage = Message &
|
|
18
|
+
Identity & {
|
|
19
|
+
traits?: any;
|
|
20
|
+
timestamp?: Date;
|
|
21
|
+
context?: any;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export type TrackMessage = Message &
|
|
25
|
+
Identity & {
|
|
26
|
+
event: string;
|
|
27
|
+
properties?: any;
|
|
28
|
+
timestamp?: Date;
|
|
29
|
+
context?: any;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type PageMessage = Message &
|
|
33
|
+
Identity & {
|
|
34
|
+
properties?: any;
|
|
35
|
+
timestamp?: Date;
|
|
36
|
+
context?: any;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type RemoteTrackMessage = Omit<TrackMessage, "timestamp" | "userId">;
|
|
40
|
+
export type RemotePageMessage = Omit<PageMessage, "timestamp" | "userId"> & {
|
|
41
|
+
includePII?: boolean;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export type RemoteIdentifyMessage = Omit<IdentifyMessage, "timestamp" | "userId">;
|
|
45
|
+
|
|
46
|
+
export interface IAnalyticsWriter {
|
|
47
|
+
identify(msg: IdentifyMessage): void;
|
|
48
|
+
|
|
49
|
+
track(msg: TrackMessage): void;
|
|
50
|
+
|
|
51
|
+
page(msg: PageMessage): void;
|
|
52
|
+
}
|
package/src/auth.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2021 Gitpod GmbH. All rights reserved.
|
|
3
|
+
* Licensed under the GNU Affero General Public License (AGPL).
|
|
4
|
+
* See License-AGPL.txt in the project root for license information.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export interface SelectAccountPayload {
|
|
8
|
+
currentUser: {
|
|
9
|
+
name: string;
|
|
10
|
+
avatarUrl: string;
|
|
11
|
+
authHost: string;
|
|
12
|
+
authName: string;
|
|
13
|
+
authProviderType: string;
|
|
14
|
+
};
|
|
15
|
+
otherUser: {
|
|
16
|
+
name: string;
|
|
17
|
+
avatarUrl: string;
|
|
18
|
+
authHost: string;
|
|
19
|
+
authName: string;
|
|
20
|
+
authProviderType: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export namespace SelectAccountPayload {
|
|
24
|
+
export function is(data: any): data is SelectAccountPayload {
|
|
25
|
+
return typeof data === "object" && "currentUser" in data && "otherUser" in data;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2020 Gitpod GmbH. All rights reserved.
|
|
3
|
+
* Licensed under the GNU Affero General Public License (AGPL).
|
|
4
|
+
* See License-AGPL.txt in the project root for license information.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as chai from "chai";
|
|
8
|
+
import { suite, test } from "mocha-typescript";
|
|
9
|
+
import { Workspace } from ".";
|
|
10
|
+
import { ContextURL } from "./context-url";
|
|
11
|
+
const expect = chai.expect;
|
|
12
|
+
|
|
13
|
+
type WsContextUrl = Pick<Workspace, "context" | "contextURL">;
|
|
14
|
+
|
|
15
|
+
@suite
|
|
16
|
+
export class ContextUrlTest {
|
|
17
|
+
@test public parseContextUrl_withEnvVar() {
|
|
18
|
+
const actual = ContextURL.getNormalizedURL({
|
|
19
|
+
contextURL: "passedin=test%20value/https://github.com/gitpod-io/gitpod-test-repo",
|
|
20
|
+
context: {},
|
|
21
|
+
} as WsContextUrl);
|
|
22
|
+
expect(actual?.host).to.equal("github.com");
|
|
23
|
+
expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@test public parseContextUrl_withEnvVar_withoutSchema() {
|
|
27
|
+
const actual = ContextURL.getNormalizedURL({
|
|
28
|
+
contextURL: "passedin=test%20value/github.com/gitpod-io/gitpod-test-repo",
|
|
29
|
+
context: {},
|
|
30
|
+
} as WsContextUrl);
|
|
31
|
+
expect(actual?.host).to.equal("github.com");
|
|
32
|
+
expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@test public parseContextUrl_withEnvVar_sshUrl() {
|
|
36
|
+
const actual = ContextURL.getNormalizedURL({
|
|
37
|
+
contextURL: "passedin=test%20value/git@github.com:gitpod-io/gitpod-test-repo.git",
|
|
38
|
+
context: {},
|
|
39
|
+
} as WsContextUrl);
|
|
40
|
+
expect(actual?.host).to.equal("github.com");
|
|
41
|
+
expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo.git");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@test public parseContextUrl_withPrebuild() {
|
|
45
|
+
const actual = ContextURL.getNormalizedURL({
|
|
46
|
+
contextURL: "prebuild/https://github.com/gitpod-io/gitpod-test-repo",
|
|
47
|
+
context: {},
|
|
48
|
+
} as WsContextUrl);
|
|
49
|
+
expect(actual?.host).to.equal("github.com");
|
|
50
|
+
expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@test public parseContextUrl_withPrebuild_withoutSchema() {
|
|
54
|
+
const actual = ContextURL.getNormalizedURL({
|
|
55
|
+
contextURL: "prebuild/github.com/gitpod-io/gitpod-test-repo",
|
|
56
|
+
context: {},
|
|
57
|
+
} as WsContextUrl);
|
|
58
|
+
expect(actual?.host).to.equal("github.com");
|
|
59
|
+
expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@test public parseContextUrl_badUrl() {
|
|
63
|
+
const actual = ContextURL.getNormalizedURL({ contextURL: "[Object object]", context: {} } as WsContextUrl);
|
|
64
|
+
expect(actual).to.be.undefined;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
module.exports = new ContextUrlTest();
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2020 Gitpod GmbH. All rights reserved.
|
|
3
|
+
* Licensed under the GNU Affero General Public License (AGPL).
|
|
4
|
+
* See License-AGPL.txt in the project root for license information.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Workspace } from ".";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The whole point of these methods is to overcome inconsistencies in our data model.
|
|
11
|
+
* Ideally we remove it at some point once we fixed our model, as it:
|
|
12
|
+
* - duplicates logic
|
|
13
|
+
* - but additional burden on clients (using this, copying this to other languages!)
|
|
14
|
+
*
|
|
15
|
+
* TODO(gpl) See if we can get this into `server` code to remove the burden from clients
|
|
16
|
+
*/
|
|
17
|
+
export namespace ContextURL {
|
|
18
|
+
export const INCREMENTAL_PREBUILD_PREFIX = "incremental-prebuild";
|
|
19
|
+
export const PREBUILD_PREFIX = "prebuild";
|
|
20
|
+
export const IMAGEBUILD_PREFIX = "imagebuild";
|
|
21
|
+
export const SNAPSHOT_PREFIX = "snapshot";
|
|
22
|
+
export const REFERRER_PREFIX = "referrer:";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* This function will (try to) return the HTTP(S) URL of the context the user originally created this workspace on.
|
|
26
|
+
* Especially it will not contain any modifiers or be of different scheme than HTTP(S).
|
|
27
|
+
*
|
|
28
|
+
* Use this function if you need to provided a _working_ URL to the original context.
|
|
29
|
+
* @param ws
|
|
30
|
+
* @returns
|
|
31
|
+
*/
|
|
32
|
+
export function getNormalizedURL(ws: Pick<Workspace, "context" | "contextURL"> | undefined): URL | undefined {
|
|
33
|
+
const normalized = normalize(ws);
|
|
34
|
+
if (!normalized) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
return new URL(normalized);
|
|
40
|
+
} catch (err) {
|
|
41
|
+
console.error(`unable to parse URL from normalized contextURL: '${normalized}'`, err);
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function normalize(ws: Pick<Workspace, "context" | "contextURL"> | undefined): string | undefined {
|
|
47
|
+
if (!ws) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
if (ws.context.normalizedContextURL) {
|
|
51
|
+
return ws.context.normalizedContextURL;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// fallback: we do not yet set normalizedContextURL on all workspaces, yet, let alone older existing workspaces
|
|
55
|
+
let fallback: string | undefined = undefined;
|
|
56
|
+
try {
|
|
57
|
+
fallback = removePrefixes(ws.contextURL);
|
|
58
|
+
} catch (err) {
|
|
59
|
+
console.error(`unable to remove prefixes from contextURL: '${ws.contextURL}'`, err);
|
|
60
|
+
}
|
|
61
|
+
return fallback;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The field "contextUrl" might contain prefixes like:
|
|
66
|
+
* - envvar1=value1/...
|
|
67
|
+
* - prebuild/...
|
|
68
|
+
* This is the analogon to the (Prefix)ContextParser structure in "server".
|
|
69
|
+
*/
|
|
70
|
+
function removePrefixes(contextUrl: string | undefined): string | undefined {
|
|
71
|
+
if (contextUrl === undefined) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const segments = contextUrl.split("/");
|
|
76
|
+
if (segments.length === 1) {
|
|
77
|
+
return segments[0]; // this might be something, we just try
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const segmentsToURL = (offset: number): string => {
|
|
81
|
+
let rest = segments.slice(offset).join("/");
|
|
82
|
+
if (/^git@[^:\/]+:/.test(rest)) {
|
|
83
|
+
rest = rest.replace(/^git@([^:\/]+):/, "https://$1/");
|
|
84
|
+
}
|
|
85
|
+
if (!rest.startsWith("http")) {
|
|
86
|
+
rest = "https://" + rest;
|
|
87
|
+
}
|
|
88
|
+
return rest;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const firstSegment = segments[0];
|
|
92
|
+
if (
|
|
93
|
+
firstSegment === PREBUILD_PREFIX ||
|
|
94
|
+
firstSegment === INCREMENTAL_PREBUILD_PREFIX ||
|
|
95
|
+
firstSegment === IMAGEBUILD_PREFIX ||
|
|
96
|
+
firstSegment === SNAPSHOT_PREFIX ||
|
|
97
|
+
firstSegment.startsWith(REFERRER_PREFIX)
|
|
98
|
+
) {
|
|
99
|
+
return segmentsToURL(1);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// check for env vars
|
|
103
|
+
if (firstSegment.indexOf("=") !== -1) {
|
|
104
|
+
return segmentsToURL(1);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return segmentsToURL(0);
|
|
108
|
+
}
|
|
109
|
+
}
|
package/src/email-protocol.ts
CHANGED
|
@@ -4,11 +4,9 @@
|
|
|
4
4
|
* See License-AGPL.txt in the project root for license information.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
import uuidv4 = require("uuid/v4");
|
|
7
|
+
import { v4 as uuidv4 } from "uuid";
|
|
9
8
|
|
|
10
|
-
export type EMailState = "scheduledInternal"
|
|
11
|
-
| "scheduledSendgrid";
|
|
9
|
+
export type EMailState = "scheduledInternal" | "scheduledSendgrid";
|
|
12
10
|
|
|
13
11
|
export interface EMailStatus {
|
|
14
12
|
/** The time the email entry was inserted into the DB */
|
|
@@ -59,9 +57,9 @@ export type EMail = {
|
|
|
59
57
|
} & EMailStatus;
|
|
60
58
|
|
|
61
59
|
export namespace EMail {
|
|
62
|
-
export const create = (ts:
|
|
60
|
+
export const create = (ts: Omit<EMail, "uid">): EMail => {
|
|
63
61
|
const withId = ts as EMail;
|
|
64
62
|
withId.uid = uuidv4();
|
|
65
63
|
return withId;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
@@ -19,10 +19,9 @@ import { EncryptionService, EncryptionServiceImpl } from "./encryption-service";
|
|
|
19
19
|
* };
|
|
20
20
|
* }).inSingletonScope();
|
|
21
21
|
*/
|
|
22
|
-
export const encryptionModule: interfaces.ContainerModuleCallBack = bind => {
|
|
23
|
-
|
|
22
|
+
export const encryptionModule: interfaces.ContainerModuleCallBack = (bind) => {
|
|
24
23
|
bind(KeyProvider).to(KeyProviderImpl).inSingletonScope();
|
|
25
24
|
|
|
26
25
|
bind(EncryptionEngine).to(EncryptionEngineImpl).inSingletonScope();
|
|
27
26
|
bind(EncryptionService).to(EncryptionServiceImpl).inSingletonScope();
|
|
28
|
-
};
|
|
27
|
+
};
|
|
@@ -5,25 +5,26 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { suite, test } from "mocha-typescript";
|
|
8
|
-
import * as chai from
|
|
9
|
-
import * as path from
|
|
8
|
+
import * as chai from "chai";
|
|
9
|
+
import * as path from "path";
|
|
10
10
|
import * as fs from "fs";
|
|
11
11
|
|
|
12
12
|
import { EncryptionEngineImpl } from "./encryption-engine";
|
|
13
13
|
|
|
14
14
|
const expect = chai.expect;
|
|
15
15
|
|
|
16
|
-
@suite
|
|
16
|
+
@suite
|
|
17
|
+
class TestEncryptionEngineImpl {
|
|
17
18
|
// Created with openssl rand -rand /dev/urandom -out key -base64 32
|
|
18
|
-
protected get testkey
|
|
19
|
-
const keyFilePath = path.resolve(__dirname,
|
|
19
|
+
protected get testkey() {
|
|
20
|
+
const keyFilePath = path.resolve(__dirname, "../../test/fixtures/encryption/testkey");
|
|
20
21
|
const keyBuffer = fs.readFileSync(keyFilePath);
|
|
21
22
|
return keyBuffer.toString().trim();
|
|
22
|
-
}
|
|
23
|
+
}
|
|
23
24
|
|
|
24
25
|
@test basicSymmetry() {
|
|
25
26
|
const plaintext = "12345678901234567890";
|
|
26
|
-
const key = new Buffer(this.testkey,
|
|
27
|
+
const key = new Buffer(this.testkey, "base64");
|
|
27
28
|
|
|
28
29
|
const cut = new EncryptionEngineImpl();
|
|
29
30
|
const encryptedData = cut.encrypt(plaintext, key);
|
|
@@ -33,4 +34,4 @@ const expect = chai.expect;
|
|
|
33
34
|
expect(decryptedPlaintext).equals(plaintext);
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
|
-
export const t = new TestEncryptionEngineImpl();
|
|
37
|
+
export const t = new TestEncryptionEngineImpl();
|
|
@@ -4,20 +4,20 @@
|
|
|
4
4
|
* See License-AGPL.txt in the project root for license information.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import * as crypto from
|
|
8
|
-
import { injectable } from
|
|
7
|
+
import * as crypto from "crypto";
|
|
8
|
+
import { injectable } from "inversify";
|
|
9
9
|
|
|
10
10
|
export interface KeyParams {
|
|
11
|
-
iv: string
|
|
11
|
+
iv: string;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export interface EncryptedData {
|
|
15
15
|
/** utf8 encoded string */
|
|
16
|
-
data: string
|
|
17
|
-
keyParams: KeyParams
|
|
16
|
+
data: string;
|
|
17
|
+
keyParams: KeyParams;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
export const EncryptionEngine = Symbol(
|
|
20
|
+
export const EncryptionEngine = Symbol("EncryptionEngine");
|
|
21
21
|
export interface EncryptionEngine {
|
|
22
22
|
/**
|
|
23
23
|
* @param data utf8 encoded string
|
|
@@ -32,21 +32,21 @@ export interface EncryptionEngine {
|
|
|
32
32
|
* - no salt, as we pass in a real key (no salting needed to turn a password into a key)
|
|
33
33
|
* The implementation closely follows the exampes in https://nodejs.org/api/crypto.html.
|
|
34
34
|
*/
|
|
35
|
-
|
|
35
|
+
@injectable()
|
|
36
36
|
export class EncryptionEngineImpl {
|
|
37
|
-
readonly algorithm =
|
|
38
|
-
readonly enc =
|
|
37
|
+
readonly algorithm = "aes-256-cbc";
|
|
38
|
+
readonly enc = "base64";
|
|
39
39
|
|
|
40
40
|
encrypt(data: string, key: Buffer): EncryptedData {
|
|
41
41
|
const iv = crypto.randomBytes(16);
|
|
42
42
|
const cipher = crypto.createCipheriv(this.algorithm, key, iv);
|
|
43
|
-
const encrypted = cipher.update(new Buffer(data,
|
|
43
|
+
const encrypted = cipher.update(new Buffer(data, "utf8"));
|
|
44
44
|
const finalEncrypted = Buffer.concat([encrypted, cipher.final()]);
|
|
45
45
|
return {
|
|
46
46
|
data: finalEncrypted.toString(this.enc),
|
|
47
47
|
keyParams: {
|
|
48
|
-
iv: iv.toString(this.enc)
|
|
49
|
-
}
|
|
48
|
+
iv: iv.toString(this.enc),
|
|
49
|
+
},
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -54,6 +54,6 @@ export class EncryptionEngineImpl {
|
|
|
54
54
|
const decipher = crypto.createDecipheriv(this.algorithm, key, new Buffer(encryptedData.keyParams.iv, this.enc));
|
|
55
55
|
let decrypted = decipher.update(new Buffer(encryptedData.data, this.enc));
|
|
56
56
|
const finalDecrypted = Buffer.concat([decrypted, decipher.final()]);
|
|
57
|
-
return finalDecrypted.toString(
|
|
57
|
+
return finalDecrypted.toString("utf8");
|
|
58
58
|
}
|
|
59
|
-
}
|
|
59
|
+
}
|
|
@@ -9,12 +9,11 @@ import { injectable, inject } from "inversify";
|
|
|
9
9
|
import { EncryptedData, EncryptionEngine } from "./encryption-engine";
|
|
10
10
|
import { KeyProvider, KeyMetadata } from "./key-provider";
|
|
11
11
|
|
|
12
|
-
|
|
13
12
|
export interface Encrypted<_T> extends EncryptedData {
|
|
14
|
-
keyMetadata: KeyMetadata
|
|
13
|
+
keyMetadata: KeyMetadata;
|
|
15
14
|
}
|
|
16
15
|
|
|
17
|
-
export const EncryptionService = Symbol(
|
|
16
|
+
export const EncryptionService = Symbol("EncryptionService");
|
|
18
17
|
export interface EncryptionService {
|
|
19
18
|
encrypt<T>(data: T): Encrypted<T>;
|
|
20
19
|
decrypt<T>(encrypted: Encrypted<T>): T;
|
|
@@ -32,7 +31,7 @@ export class EncryptionServiceImpl implements EncryptionService {
|
|
|
32
31
|
const encryptedData = this.engine.encrypt(dataStr, key.material);
|
|
33
32
|
return {
|
|
34
33
|
...encryptedData,
|
|
35
|
-
keyMetadata: key.metadata
|
|
34
|
+
keyMetadata: key.metadata,
|
|
36
35
|
};
|
|
37
36
|
}
|
|
38
37
|
|
|
@@ -49,4 +48,4 @@ export class EncryptionServiceImpl implements EncryptionService {
|
|
|
49
48
|
protected deserialize<T>(data: string): T {
|
|
50
49
|
return JSON.parse(data) as T;
|
|
51
50
|
}
|
|
52
|
-
}
|
|
51
|
+
}
|
|
@@ -7,16 +7,16 @@
|
|
|
7
7
|
import { injectable, inject } from "inversify";
|
|
8
8
|
|
|
9
9
|
export interface KeyMetadata {
|
|
10
|
-
name: string
|
|
11
|
-
version: number
|
|
10
|
+
name: string;
|
|
11
|
+
version: number;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export interface Key {
|
|
15
|
-
metadata: KeyMetadata
|
|
16
|
-
material: Buffer
|
|
15
|
+
metadata: KeyMetadata;
|
|
16
|
+
material: Buffer;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
export const KeyProvider = Symbol(
|
|
19
|
+
export const KeyProvider = Symbol("KeyProvider");
|
|
20
20
|
export interface KeyProvider {
|
|
21
21
|
getPrimaryKey(): Key;
|
|
22
22
|
getKeyFor(metadata: KeyMetadata): Key;
|
|
@@ -24,24 +24,21 @@ export interface KeyProvider {
|
|
|
24
24
|
|
|
25
25
|
export type KeyConfig = KeyMetadata & {
|
|
26
26
|
/** base64 encoded */
|
|
27
|
-
material: string
|
|
28
|
-
primary?: boolean
|
|
29
|
-
}
|
|
27
|
+
material: string;
|
|
28
|
+
primary?: boolean;
|
|
29
|
+
};
|
|
30
30
|
|
|
31
|
-
export const KeyProviderConfig = Symbol(
|
|
31
|
+
export const KeyProviderConfig = Symbol("KeyProviderConfig");
|
|
32
32
|
export interface KeyProviderConfig {
|
|
33
|
-
keys: KeyConfig[]
|
|
33
|
+
keys: KeyConfig[];
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
@injectable()
|
|
37
37
|
export class KeyProviderImpl implements KeyProvider {
|
|
38
|
-
|
|
39
38
|
static loadKeyConfigFromJsonString(configStr: string): KeyConfig[] {
|
|
40
39
|
const keys = (JSON.parse(configStr) || []) as KeyConfig[];
|
|
41
|
-
if (!Array.isArray(keys)
|
|
42
|
-
|
|
43
|
-
|| 1 !== keys.reduce((p, k) => k.primary ? p + 1 : p, 0)) {
|
|
44
|
-
throw new Error('Invalid key config!');
|
|
40
|
+
if (!Array.isArray(keys) || keys.length < 0 || 1 !== keys.reduce((p, k) => (k.primary ? p + 1 : p), 0)) {
|
|
41
|
+
throw new Error("Invalid key config!");
|
|
45
42
|
}
|
|
46
43
|
return keys;
|
|
47
44
|
}
|
|
@@ -49,13 +46,13 @@ export class KeyProviderImpl implements KeyProvider {
|
|
|
49
46
|
constructor(@inject(KeyProviderConfig) protected readonly config: KeyProviderConfig) {}
|
|
50
47
|
|
|
51
48
|
protected get keys() {
|
|
52
|
-
return this.config.keys
|
|
49
|
+
return this.config.keys;
|
|
53
50
|
}
|
|
54
51
|
|
|
55
52
|
getPrimaryKey(): Key {
|
|
56
53
|
const primaryKey = this.keys.find((key) => !!key.primary);
|
|
57
54
|
if (!primaryKey) {
|
|
58
|
-
throw new Error(
|
|
55
|
+
throw new Error("No primary encryption key found!");
|
|
59
56
|
}
|
|
60
57
|
return this.configToKey(primaryKey);
|
|
61
58
|
}
|
|
@@ -72,9 +69,9 @@ export class KeyProviderImpl implements KeyProvider {
|
|
|
72
69
|
return {
|
|
73
70
|
metadata: {
|
|
74
71
|
name: config.name,
|
|
75
|
-
version: config.version
|
|
72
|
+
version: config.version,
|
|
76
73
|
},
|
|
77
|
-
material: new Buffer(config.material,
|
|
74
|
+
material: new Buffer(config.material, "base64"),
|
|
78
75
|
};
|
|
79
76
|
}
|
|
80
77
|
}
|