@lockerpm/desktop-service 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +98 -0
  2. package/lib/cjs/abstractions/api.service.js +2 -0
  3. package/lib/cjs/abstractions/crypto.service.js +147 -0
  4. package/lib/cjs/abstractions/errors.js +99 -0
  5. package/lib/cjs/abstractions/event.service.js +2 -0
  6. package/lib/cjs/abstractions/index.js +2 -0
  7. package/lib/cjs/abstractions/socket.service.js +11 -0
  8. package/lib/cjs/abstractions/storage.service.js +2 -0
  9. package/lib/cjs/index.js +243 -0
  10. package/lib/cjs/misc/config.js +15 -0
  11. package/lib/cjs/misc/utils.js +37 -0
  12. package/lib/cjs/proto/google/api/annotations.js +2 -0
  13. package/lib/cjs/proto/google/api/http.js +477 -0
  14. package/lib/cjs/proto/google/protobuf/descriptor.js +4873 -0
  15. package/lib/cjs/proto/locker-service-grpc.js +1915 -0
  16. package/lib/cjs/services/api.service.js +182 -0
  17. package/lib/cjs/services/cache.service.js +50 -0
  18. package/lib/cjs/services/core-crypto.service.js +193 -0
  19. package/lib/cjs/services/crypto.service.js +101 -0
  20. package/lib/cjs/services/event.service.js +31 -0
  21. package/lib/cjs/services/fido.service.js +136 -0
  22. package/lib/cjs/services/grpc.service.js +130 -0
  23. package/lib/cjs/services/log.service.js +30 -0
  24. package/lib/cjs/services/pairing.service.js +122 -0
  25. package/lib/cjs/services/socket.service.js +280 -0
  26. package/lib/cjs/services/user.service.js +134 -0
  27. package/lib/cjs/types/abstractions/api.service.d.ts +40 -0
  28. package/lib/cjs/types/abstractions/api.service.d.ts.map +1 -0
  29. package/lib/cjs/types/abstractions/crypto.service.d.ts +46 -0
  30. package/lib/cjs/types/abstractions/crypto.service.d.ts.map +1 -0
  31. package/lib/cjs/types/abstractions/errors.d.ts +73 -0
  32. package/lib/cjs/types/abstractions/errors.d.ts.map +1 -0
  33. package/lib/cjs/types/abstractions/event.service.d.ts +23 -0
  34. package/lib/cjs/types/abstractions/event.service.d.ts.map +1 -0
  35. package/lib/cjs/types/abstractions/index.d.ts +56 -0
  36. package/lib/cjs/types/abstractions/index.d.ts.map +1 -0
  37. package/lib/cjs/types/abstractions/socket.service.d.ts +52 -0
  38. package/lib/cjs/types/abstractions/socket.service.d.ts.map +1 -0
  39. package/lib/cjs/types/abstractions/storage.service.d.ts +6 -0
  40. package/lib/cjs/types/abstractions/storage.service.d.ts.map +1 -0
  41. package/lib/cjs/types/index.d.ts +164 -0
  42. package/lib/cjs/types/index.d.ts.map +1 -0
  43. package/lib/cjs/types/misc/config.d.ts +6 -0
  44. package/lib/cjs/types/misc/config.d.ts.map +1 -0
  45. package/lib/cjs/types/misc/utils.d.ts +21 -0
  46. package/lib/cjs/types/misc/utils.d.ts.map +1 -0
  47. package/lib/cjs/types/proto/google/api/annotations.d.ts +2 -0
  48. package/lib/cjs/types/proto/google/api/annotations.d.ts.map +1 -0
  49. package/lib/cjs/types/proto/google/api/http.d.ts +195 -0
  50. package/lib/cjs/types/proto/google/api/http.d.ts.map +1 -0
  51. package/lib/cjs/types/proto/google/protobuf/descriptor.d.ts +3409 -0
  52. package/lib/cjs/types/proto/google/protobuf/descriptor.d.ts.map +1 -0
  53. package/lib/cjs/types/proto/locker-service-grpc.d.ts +622 -0
  54. package/lib/cjs/types/proto/locker-service-grpc.d.ts.map +1 -0
  55. package/lib/cjs/types/services/api.service.d.ts +37 -0
  56. package/lib/cjs/types/services/api.service.d.ts.map +1 -0
  57. package/lib/cjs/types/services/cache.service.d.ts +10 -0
  58. package/lib/cjs/types/services/cache.service.d.ts.map +1 -0
  59. package/lib/cjs/types/services/core-crypto.service.d.ts +17 -0
  60. package/lib/cjs/types/services/core-crypto.service.d.ts.map +1 -0
  61. package/lib/cjs/types/services/crypto.service.d.ts +23 -0
  62. package/lib/cjs/types/services/crypto.service.d.ts.map +1 -0
  63. package/lib/cjs/types/services/event.service.d.ts +14 -0
  64. package/lib/cjs/types/services/event.service.d.ts.map +1 -0
  65. package/lib/cjs/types/services/fido.service.d.ts +40 -0
  66. package/lib/cjs/types/services/fido.service.d.ts.map +1 -0
  67. package/lib/cjs/types/services/grpc.service.d.ts +34 -0
  68. package/lib/cjs/types/services/grpc.service.d.ts.map +1 -0
  69. package/lib/cjs/types/services/log.service.d.ts +13 -0
  70. package/lib/cjs/types/services/log.service.d.ts.map +1 -0
  71. package/lib/cjs/types/services/pairing.service.d.ts +37 -0
  72. package/lib/cjs/types/services/pairing.service.d.ts.map +1 -0
  73. package/lib/cjs/types/services/socket.service.d.ts +39 -0
  74. package/lib/cjs/types/services/socket.service.d.ts.map +1 -0
  75. package/lib/cjs/types/services/user.service.d.ts +32 -0
  76. package/lib/cjs/types/services/user.service.d.ts.map +1 -0
  77. package/lib/cjs/types/usecases/fido.d.ts +54 -0
  78. package/lib/cjs/types/usecases/fido.d.ts.map +1 -0
  79. package/lib/cjs/usecases/fido.js +227 -0
  80. package/lib/esm/abstractions/api.service.js +2 -0
  81. package/lib/esm/abstractions/crypto.service.js +165 -0
  82. package/lib/esm/abstractions/errors.js +100 -0
  83. package/lib/esm/abstractions/event.service.js +2 -0
  84. package/lib/esm/abstractions/index.js +2 -0
  85. package/lib/esm/abstractions/socket.service.js +11 -0
  86. package/lib/esm/abstractions/storage.service.js +2 -0
  87. package/lib/esm/index.mjs +227 -0
  88. package/lib/esm/misc/config.js +15 -0
  89. package/lib/esm/misc/utils.js +37 -0
  90. package/lib/esm/proto/google/api/annotations.js +2 -0
  91. package/lib/esm/proto/google/api/http.js +468 -0
  92. package/lib/esm/proto/google/protobuf/descriptor.js +4830 -0
  93. package/lib/esm/proto/locker-service-grpc.js +1892 -0
  94. package/lib/esm/services/api.service.js +177 -0
  95. package/lib/esm/services/cache.service.js +52 -0
  96. package/lib/esm/services/core-crypto.service.js +164 -0
  97. package/lib/esm/services/crypto.service.js +83 -0
  98. package/lib/esm/services/event.service.js +33 -0
  99. package/lib/esm/services/fido.service.js +139 -0
  100. package/lib/esm/services/grpc.service.js +119 -0
  101. package/lib/esm/services/log.service.js +31 -0
  102. package/lib/esm/services/pairing.service.js +107 -0
  103. package/lib/esm/services/socket.service.js +265 -0
  104. package/lib/esm/services/user.service.js +116 -0
  105. package/lib/esm/types/abstractions/api.service.d.ts +40 -0
  106. package/lib/esm/types/abstractions/api.service.d.ts.map +1 -0
  107. package/lib/esm/types/abstractions/crypto.service.d.ts +46 -0
  108. package/lib/esm/types/abstractions/crypto.service.d.ts.map +1 -0
  109. package/lib/esm/types/abstractions/errors.d.ts +73 -0
  110. package/lib/esm/types/abstractions/errors.d.ts.map +1 -0
  111. package/lib/esm/types/abstractions/event.service.d.ts +23 -0
  112. package/lib/esm/types/abstractions/event.service.d.ts.map +1 -0
  113. package/lib/esm/types/abstractions/index.d.ts +56 -0
  114. package/lib/esm/types/abstractions/index.d.ts.map +1 -0
  115. package/lib/esm/types/abstractions/socket.service.d.ts +52 -0
  116. package/lib/esm/types/abstractions/socket.service.d.ts.map +1 -0
  117. package/lib/esm/types/abstractions/storage.service.d.ts +6 -0
  118. package/lib/esm/types/abstractions/storage.service.d.ts.map +1 -0
  119. package/lib/esm/types/index.d.ts +164 -0
  120. package/lib/esm/types/index.d.ts.map +1 -0
  121. package/lib/esm/types/misc/config.d.ts +6 -0
  122. package/lib/esm/types/misc/config.d.ts.map +1 -0
  123. package/lib/esm/types/misc/utils.d.ts +21 -0
  124. package/lib/esm/types/misc/utils.d.ts.map +1 -0
  125. package/lib/esm/types/proto/google/api/annotations.d.ts +2 -0
  126. package/lib/esm/types/proto/google/api/annotations.d.ts.map +1 -0
  127. package/lib/esm/types/proto/google/api/http.d.ts +195 -0
  128. package/lib/esm/types/proto/google/api/http.d.ts.map +1 -0
  129. package/lib/esm/types/proto/google/protobuf/descriptor.d.ts +3409 -0
  130. package/lib/esm/types/proto/google/protobuf/descriptor.d.ts.map +1 -0
  131. package/lib/esm/types/proto/locker-service-grpc.d.ts +622 -0
  132. package/lib/esm/types/proto/locker-service-grpc.d.ts.map +1 -0
  133. package/lib/esm/types/services/api.service.d.ts +37 -0
  134. package/lib/esm/types/services/api.service.d.ts.map +1 -0
  135. package/lib/esm/types/services/cache.service.d.ts +10 -0
  136. package/lib/esm/types/services/cache.service.d.ts.map +1 -0
  137. package/lib/esm/types/services/core-crypto.service.d.ts +17 -0
  138. package/lib/esm/types/services/core-crypto.service.d.ts.map +1 -0
  139. package/lib/esm/types/services/crypto.service.d.ts +23 -0
  140. package/lib/esm/types/services/crypto.service.d.ts.map +1 -0
  141. package/lib/esm/types/services/event.service.d.ts +14 -0
  142. package/lib/esm/types/services/event.service.d.ts.map +1 -0
  143. package/lib/esm/types/services/fido.service.d.ts +40 -0
  144. package/lib/esm/types/services/fido.service.d.ts.map +1 -0
  145. package/lib/esm/types/services/grpc.service.d.ts +34 -0
  146. package/lib/esm/types/services/grpc.service.d.ts.map +1 -0
  147. package/lib/esm/types/services/log.service.d.ts +13 -0
  148. package/lib/esm/types/services/log.service.d.ts.map +1 -0
  149. package/lib/esm/types/services/pairing.service.d.ts +37 -0
  150. package/lib/esm/types/services/pairing.service.d.ts.map +1 -0
  151. package/lib/esm/types/services/socket.service.d.ts +39 -0
  152. package/lib/esm/types/services/socket.service.d.ts.map +1 -0
  153. package/lib/esm/types/services/user.service.d.ts +32 -0
  154. package/lib/esm/types/services/user.service.d.ts.map +1 -0
  155. package/lib/esm/types/usecases/fido.d.ts +54 -0
  156. package/lib/esm/types/usecases/fido.d.ts.map +1 -0
  157. package/lib/esm/usecases/fido.js +201 -0
  158. package/package.json +55 -0
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FidoService = void 0;
4
+ const locker_service_grpc_1 = require("../proto/locker-service-grpc");
5
+ const errors_1 = require("../abstractions/errors");
6
+ var FidoMessage;
7
+ (function (FidoMessage) {
8
+ FidoMessage["DEVICE_LIST"] = "deviceListRequest";
9
+ FidoMessage["DEVICE_SELECT"] = "deviceInitializationRequest";
10
+ FidoMessage["LIST_CREDENTIALS"] = "listCredentialRequest";
11
+ FidoMessage["MAKE_CREDENTIAL"] = "createCredentialRequest";
12
+ FidoMessage["DELETE_CREDENTIAL"] = "deleteCredentialRequest";
13
+ FidoMessage["GET_HMAC"] = "hmacRequest";
14
+ })(FidoMessage || (FidoMessage = {}));
15
+ class FidoService {
16
+ constructor(logger, eventEmitter, grpcService) {
17
+ this.logger = logger;
18
+ this.eventEmitter = eventEmitter;
19
+ this.grpc = grpcService;
20
+ }
21
+ getDeviceList() {
22
+ const req = new locker_service_grpc_1.locker_service_grpc.FidoRequest();
23
+ req.message = FidoMessage.DEVICE_LIST;
24
+ return new Promise((resolve, reject) => {
25
+ this.grpc.client.FidoChannel(req, (err, res) => {
26
+ this.logger.debug(res);
27
+ if (err) {
28
+ reject(errors_1.ServiceError.fromError(err));
29
+ return;
30
+ }
31
+ if (!(res === null || res === void 0 ? void 0 : res.device_list)) {
32
+ resolve([]);
33
+ return;
34
+ }
35
+ resolve(res.device_list.map((d) => ({
36
+ name: d.name,
37
+ path: d.path,
38
+ })));
39
+ });
40
+ });
41
+ }
42
+ setSelectedDevice(path) {
43
+ const req = new locker_service_grpc_1.locker_service_grpc.FidoRequest();
44
+ req.message = FidoMessage.DEVICE_SELECT;
45
+ req.device_path = path;
46
+ return new Promise((resolve, reject) => {
47
+ this.grpc.client.FidoChannel(req, (err, res) => {
48
+ this.logger.debug(res);
49
+ if (err) {
50
+ reject(errors_1.ServiceError.fromError(err));
51
+ return;
52
+ }
53
+ resolve(!!(res === null || res === void 0 ? void 0 : res.success));
54
+ });
55
+ });
56
+ }
57
+ listCredentials(params) {
58
+ const req = new locker_service_grpc_1.locker_service_grpc.FidoRequest();
59
+ req.message = FidoMessage.LIST_CREDENTIALS;
60
+ req.pin = params.pin;
61
+ return new Promise((resolve, reject) => {
62
+ this.grpc.client.FidoChannel(req, (err, res) => {
63
+ this.logger.debug(res);
64
+ if (err) {
65
+ reject(errors_1.ServiceError.fromError(err));
66
+ return;
67
+ }
68
+ resolve((res === null || res === void 0 ? void 0 : res.credential_list.map((c) => ({
69
+ name: c.user_name,
70
+ displayName: c.user_display_name,
71
+ credentialId: c.credential_id,
72
+ }))) || []);
73
+ });
74
+ });
75
+ }
76
+ makeCredential(params) {
77
+ const req = new locker_service_grpc_1.locker_service_grpc.FidoRequest();
78
+ req.message = FidoMessage.MAKE_CREDENTIAL;
79
+ req.email = params.email;
80
+ req.name = params.name;
81
+ req.pin = params.pin || '';
82
+ this.eventEmitter.emit(params.pin ? 'fidoRequestTouch' : 'fidoRequestFingerprint', undefined);
83
+ return new Promise((resolve, reject) => {
84
+ this.grpc.client.FidoChannel(req, (err, res) => {
85
+ this.logger.debug(res);
86
+ if (err) {
87
+ reject(errors_1.ServiceError.fromError(err));
88
+ return;
89
+ }
90
+ resolve({
91
+ credentialId: res === null || res === void 0 ? void 0 : res.credential_id,
92
+ });
93
+ });
94
+ });
95
+ }
96
+ deleteCredential(params) {
97
+ const req = new locker_service_grpc_1.locker_service_grpc.FidoRequest();
98
+ req.message = FidoMessage.DELETE_CREDENTIAL;
99
+ req.credential_id = params.credentialId;
100
+ req.pin = params.pin;
101
+ return new Promise((resolve, reject) => {
102
+ this.grpc.client.FidoChannel(req, (err, res) => {
103
+ this.logger.debug(res);
104
+ if (err) {
105
+ reject(errors_1.ServiceError.fromError(err));
106
+ return;
107
+ }
108
+ resolve(true);
109
+ });
110
+ });
111
+ }
112
+ getHmacSecret(params) {
113
+ const req = new locker_service_grpc_1.locker_service_grpc.FidoRequest();
114
+ req.message = FidoMessage.GET_HMAC;
115
+ req.credential_id = params.credentialId;
116
+ req.salt = params.salt;
117
+ req.pin = params.pin || '';
118
+ // UP is disabled when get hmac -> no need to request touch
119
+ if (!params.pin) {
120
+ this.eventEmitter.emit('fidoRequestFingerprint', undefined);
121
+ }
122
+ return new Promise((resolve, reject) => {
123
+ this.grpc.client.FidoChannel(req, (err, res) => {
124
+ this.logger.debug(res);
125
+ if (err) {
126
+ reject(errors_1.ServiceError.fromError(err));
127
+ return;
128
+ }
129
+ resolve({
130
+ secret: (res === null || res === void 0 ? void 0 : res.assertion_hmac) || '',
131
+ });
132
+ });
133
+ });
134
+ }
135
+ }
136
+ exports.FidoService = FidoService;
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.GRPCService = void 0;
16
+ const grpc_js_1 = require("@grpc/grpc-js");
17
+ const locker_service_grpc_1 = require("../proto/locker-service-grpc");
18
+ const find_process_1 = __importDefault(require("find-process"));
19
+ const utils_1 = require("../misc/utils");
20
+ const axios_1 = __importDefault(require("axios"));
21
+ const config_1 = require("../misc/config");
22
+ class GRPCService {
23
+ constructor(services, options) {
24
+ this.currentPort = 0;
25
+ this.serviceChecksums = [];
26
+ this.serviceAlias = '';
27
+ const { logger, cryptoService, apiService } = services;
28
+ const { ssl, unsafe, serviceAlias } = options;
29
+ this.logger = logger;
30
+ this.crypto = cryptoService;
31
+ this.api = apiService;
32
+ this.unsafe = !!unsafe;
33
+ if (serviceAlias) {
34
+ this.serviceAlias = serviceAlias;
35
+ }
36
+ const cred = ssl ? grpc_js_1.credentials.createSsl(ssl.rootCert) : grpc_js_1.credentials.createInsecure();
37
+ this.credentials = cred;
38
+ this.client = new locker_service_grpc_1.locker_service_grpc.LockerServiceClient(`localhost:${this.currentPort}`, cred);
39
+ this.initConnection();
40
+ }
41
+ get isReady() {
42
+ return this.currentPort !== 0;
43
+ }
44
+ initConnection() {
45
+ return __awaiter(this, void 0, void 0, function* () {
46
+ this.currentPort = 0;
47
+ if (!this.unsafe) {
48
+ yield this.loadServiceChecksums();
49
+ }
50
+ for (const httpPort of config_1.HTTP_PORTS) {
51
+ this.logger.debug(`Ping background service on port ${httpPort}`);
52
+ const { success, res } = yield this.pingService(httpPort);
53
+ if (success && res) {
54
+ const port = res.tcpPort;
55
+ const client = yield this.testConnection(port);
56
+ if (client) {
57
+ const isValidated = this.unsafe ? true : yield this.validateConnection(port);
58
+ if (isValidated) {
59
+ this.client = client;
60
+ this.currentPort = port;
61
+ this.logger.debug(`GRPC server connected on port ${port}`);
62
+ return;
63
+ }
64
+ }
65
+ }
66
+ }
67
+ this.logger.error('Cannot connect to GRPC server');
68
+ });
69
+ }
70
+ // ---------------------- PRIVATE METHODS ----------------------
71
+ pingService(port) {
72
+ return __awaiter(this, void 0, void 0, function* () {
73
+ try {
74
+ const url = `http://localhost:${port}/ping-locker-service`;
75
+ const res = yield axios_1.default.get(url, {
76
+ timeout: config_1.GRPC_PING_TIMEOUT,
77
+ });
78
+ const data = res.data;
79
+ return {
80
+ success: data.message === 'pong' && data.alias === this.serviceAlias,
81
+ res: data,
82
+ };
83
+ }
84
+ catch (e) {
85
+ return {
86
+ success: false,
87
+ };
88
+ }
89
+ });
90
+ }
91
+ testConnection(port) {
92
+ return new Promise((resolve) => {
93
+ const client = new locker_service_grpc_1.locker_service_grpc.LockerServiceClient(`localhost:${port}`, this.credentials);
94
+ client.waitForReady(Date.now() + config_1.GRPC_CONNECTION_TIMEOUT, (error) => {
95
+ if (error) {
96
+ resolve(null);
97
+ }
98
+ else {
99
+ resolve(client);
100
+ }
101
+ });
102
+ });
103
+ }
104
+ validateConnection(port) {
105
+ return __awaiter(this, void 0, void 0, function* () {
106
+ try {
107
+ const list = yield (0, find_process_1.default)('port', port, true);
108
+ const service = list.find((s) => s.name === 'locker-service');
109
+ if (!service) {
110
+ return false;
111
+ }
112
+ // TODO: somehow, service.bin does not exist in type but exists in returned value when testing on MacOS
113
+ // @ts-ignore
114
+ const checksum = yield this.crypto.getFileChecksum(service.bin);
115
+ return this.serviceChecksums.includes(checksum);
116
+ }
117
+ catch (error) {
118
+ return false;
119
+ }
120
+ });
121
+ }
122
+ loadServiceChecksums() {
123
+ return __awaiter(this, void 0, void 0, function* () {
124
+ const _os = utils_1.Utils.getCurrentOS();
125
+ const res = yield this.api.getReleases(_os);
126
+ this.serviceChecksums = res.map((version) => version.checksum.service);
127
+ });
128
+ }
129
+ }
130
+ exports.GRPCService = GRPCService;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LogService = exports.LogLevel = void 0;
4
+ var LogLevel;
5
+ (function (LogLevel) {
6
+ LogLevel[LogLevel["NONE"] = 0] = "NONE";
7
+ LogLevel[LogLevel["ERROR"] = 1] = "ERROR";
8
+ LogLevel[LogLevel["DEBUG"] = 2] = "DEBUG";
9
+ })(LogLevel || (exports.LogLevel = LogLevel = {}));
10
+ class LogService {
11
+ constructor(logLevel) {
12
+ this.logLevel = logLevel || LogLevel.ERROR;
13
+ }
14
+ setLogLevel(level) {
15
+ this.logLevel = level;
16
+ }
17
+ debug(e) {
18
+ if (this.logLevel >= LogLevel.DEBUG) {
19
+ console.log(new Date());
20
+ console.log(e);
21
+ }
22
+ }
23
+ error(e) {
24
+ if (this.logLevel >= LogLevel.ERROR) {
25
+ console.log(new Date());
26
+ console.error(e);
27
+ }
28
+ }
29
+ }
30
+ exports.LogService = LogService;
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PairingService = void 0;
13
+ const errors_1 = require("../abstractions/errors");
14
+ const socket_service_1 = require("../abstractions/socket.service");
15
+ const locker_service_grpc_1 = require("../proto/locker-service-grpc");
16
+ const STORAGE_KEY = 'service_paired_clients';
17
+ class PairingService {
18
+ constructor(services) {
19
+ this.clients = {};
20
+ this.isReady = false;
21
+ const { cryptoService, eventService, storageService, grpcService, logger } = services;
22
+ this.crypto = cryptoService;
23
+ this.events = eventService;
24
+ this.storage = storageService;
25
+ this.grpc = grpcService;
26
+ this.logger = logger;
27
+ this.loadFromStore().then(() => (this.isReady = true));
28
+ }
29
+ getClient(clientId) {
30
+ return this.clients[clientId];
31
+ }
32
+ isClientConfirmed(clientId) {
33
+ var _a;
34
+ return (_a = this.clients[clientId]) === null || _a === void 0 ? void 0 : _a.confirmed;
35
+ }
36
+ getResponseForPairingRequest(clientId, publicKey, clientType) {
37
+ return __awaiter(this, void 0, void 0, function* () {
38
+ const keyPair = yield this.crypto.createECDHKeyPair();
39
+ const sharedKey = yield this.crypto.createEncKey(publicKey, keyPair.privateKey);
40
+ this.clients[clientId] = {
41
+ encKey: sharedKey.encKey,
42
+ confirmed: false,
43
+ };
44
+ yield this.saveToStore();
45
+ this.events.emit('pairingConfirmation', {
46
+ clientId,
47
+ approveCode: sharedKey.approveCode,
48
+ clientType,
49
+ });
50
+ return (0, socket_service_1.buildOutgoingSocketMessage)('pairingResponse', {
51
+ key: keyPair.publicKey,
52
+ });
53
+ });
54
+ }
55
+ confirmPairingClient(clientId, keepInKeyring) {
56
+ return __awaiter(this, void 0, void 0, function* () {
57
+ if (!this.clients[clientId]) {
58
+ this.logger.debug(`Pairing client with id ${clientId} not found`);
59
+ return;
60
+ }
61
+ this.clients[clientId].confirmed = true;
62
+ yield Promise.all([this.saveToStore(), this.registerClientOnService(clientId, keepInKeyring)]);
63
+ });
64
+ }
65
+ encryptDataForClient(clientId, data) {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ const client = this.clients[clientId];
68
+ if (!(client === null || client === void 0 ? void 0 : client.confirmed)) {
69
+ throw new errors_1.ServiceError('3001');
70
+ }
71
+ const res = yield this.crypto.aesEncrypt(data, client.encKey);
72
+ return res;
73
+ });
74
+ }
75
+ decryptDataFromClient(clientId, data) {
76
+ return __awaiter(this, void 0, void 0, function* () {
77
+ const client = this.clients[clientId];
78
+ if (!(client === null || client === void 0 ? void 0 : client.confirmed)) {
79
+ throw new errors_1.ServiceError('3001');
80
+ }
81
+ const res = yield this.crypto.aesDecrypt(data, client.encKey);
82
+ return res;
83
+ });
84
+ }
85
+ registerClientOnService(clientId, keepInKeyring = false) {
86
+ const client = this.clients[clientId];
87
+ const req = new locker_service_grpc_1.locker_service_grpc.WebCredRequest();
88
+ req.message = 'forwardingWebCred';
89
+ req.client_id = clientId;
90
+ req.enc_key = client.encKey;
91
+ req.save_to_keyring = keepInKeyring;
92
+ return new Promise((resolve, reject) => {
93
+ this.grpc.client.WebCredChannel(req, (err, res) => {
94
+ this.logger.debug(res);
95
+ if (err) {
96
+ reject(errors_1.ServiceError.fromError(err));
97
+ return;
98
+ }
99
+ resolve();
100
+ });
101
+ });
102
+ }
103
+ loadFromStore() {
104
+ return __awaiter(this, void 0, void 0, function* () {
105
+ const data = yield this.storage.getSecure(STORAGE_KEY);
106
+ if (data) {
107
+ // Remove unconfirmed client
108
+ const res = {};
109
+ Object.keys(data).forEach((k) => {
110
+ if (data[k].confirmed) {
111
+ res[k] = data[k];
112
+ }
113
+ });
114
+ this.clients = res;
115
+ }
116
+ });
117
+ }
118
+ saveToStore() {
119
+ return this.storage.setSecure(STORAGE_KEY, this.clients);
120
+ }
121
+ }
122
+ exports.PairingService = PairingService;