@futo-org/backups-orchestrator-api 0.38.0 → 0.40.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 (82) hide show
  1. package/dist/backends/backend.d.ts +2 -1
  2. package/dist/backends/backend.js.map +1 -1
  3. package/dist/backends/local.backend.d.ts +2 -1
  4. package/dist/backends/local.backend.js +9 -0
  5. package/dist/backends/local.backend.js.map +1 -1
  6. package/dist/backends/s3.backend.d.ts +2 -1
  7. package/dist/backends/s3.backend.js +3 -0
  8. package/dist/backends/s3.backend.js.map +1 -1
  9. package/dist/backends/yucca.backend.d.ts +4 -2
  10. package/dist/backends/yucca.backend.js +17 -3
  11. package/dist/backends/yucca.backend.js.map +1 -1
  12. package/dist/const.d.ts +1 -0
  13. package/dist/const.js +2 -1
  14. package/dist/const.js.map +1 -1
  15. package/dist/controllers/auth.controller.d.ts +10 -3
  16. package/dist/controllers/auth.controller.js +61 -7
  17. package/dist/controllers/auth.controller.js.map +1 -1
  18. package/dist/controllers/onboarding.controller.d.ts +2 -1
  19. package/dist/controllers/onboarding.controller.js +6 -3
  20. package/dist/controllers/onboarding.controller.js.map +1 -1
  21. package/dist/dto/auth.dto.d.ts +17 -3
  22. package/dist/dto/auth.dto.js +20 -23
  23. package/dist/dto/auth.dto.js.map +1 -1
  24. package/dist/dto/backend.dto.d.ts +35 -12
  25. package/dist/dto/backend.dto.js +20 -57
  26. package/dist/dto/backend.dto.js.map +1 -1
  27. package/dist/dto/filesystem.dto.d.ts +20 -9
  28. package/dist/dto/filesystem.dto.js +21 -46
  29. package/dist/dto/filesystem.dto.js.map +1 -1
  30. package/dist/dto/integrations.dto.d.ts +83 -34
  31. package/dist/dto/integrations.dto.js +64 -173
  32. package/dist/dto/integrations.dto.js.map +1 -1
  33. package/dist/dto/onboarding.dto.d.ts +23 -13
  34. package/dist/dto/onboarding.dto.js +23 -65
  35. package/dist/dto/onboarding.dto.js.map +1 -1
  36. package/dist/dto/repository.dto.d.ts +550 -128
  37. package/dist/dto/repository.dto.js +181 -430
  38. package/dist/dto/repository.dto.js.map +1 -1
  39. package/dist/dto/runningTasks.dto.d.ts +31 -10
  40. package/dist/dto/runningTasks.dto.js +25 -49
  41. package/dist/dto/runningTasks.dto.js.map +1 -1
  42. package/dist/dto/schedule.dto.d.ts +61 -23
  43. package/dist/dto/schedule.dto.js +47 -130
  44. package/dist/dto/schedule.dto.js.map +1 -1
  45. package/dist/dto/ticket.dto.d.ts +14 -0
  46. package/dist/dto/ticket.dto.js +22 -0
  47. package/dist/dto/ticket.dto.js.map +1 -0
  48. package/dist/enum.d.ts +21 -1
  49. package/dist/enum.js +25 -1
  50. package/dist/enum.js.map +1 -1
  51. package/dist/events/events.gateway.d.ts +3 -3
  52. package/dist/events/events.gateway.js +13 -2
  53. package/dist/events/events.gateway.js.map +1 -1
  54. package/dist/middleware/session.guard.d.ts +14 -0
  55. package/dist/middleware/session.guard.js +49 -0
  56. package/dist/middleware/session.guard.js.map +1 -0
  57. package/dist/moduleConfig.d.ts +1 -0
  58. package/dist/orchestrationApi.module.d.ts +2 -1
  59. package/dist/orchestrationApi.module.js +8 -0
  60. package/dist/orchestrationApi.module.js.map +1 -1
  61. package/dist/proxy/resticProxy.d.ts +11 -0
  62. package/dist/proxy/resticProxy.js +93 -0
  63. package/dist/proxy/resticProxy.js.map +1 -0
  64. package/dist/proxy/resticProxyPool.d.ts +9 -0
  65. package/dist/proxy/resticProxyPool.js +44 -0
  66. package/dist/proxy/resticProxyPool.js.map +1 -0
  67. package/dist/repositories/config.repository.d.ts +2 -0
  68. package/dist/repositories/config.repository.js +10 -0
  69. package/dist/repositories/config.repository.js.map +1 -1
  70. package/dist/repositories/runHistory.repository.d.ts +4 -4
  71. package/dist/schema/tables/backend.table.d.ts +1 -0
  72. package/dist/schema/tables/backend.table.js.map +1 -1
  73. package/dist/services/auth.service.d.ts +11 -6
  74. package/dist/services/auth.service.js +130 -51
  75. package/dist/services/auth.service.js.map +1 -1
  76. package/dist/services/onboarding.service.d.ts +4 -2
  77. package/dist/services/onboarding.service.js +14 -3
  78. package/dist/services/onboarding.service.js.map +1 -1
  79. package/dist/services/session.service.d.ts +26 -0
  80. package/dist/services/session.service.js +88 -0
  81. package/dist/services/session.service.js.map +1 -0
  82. package/package.json +4 -3
package/dist/enum.js CHANGED
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ResticTagPrefix = exports.TelemetryLevel = exports.BootstrapStatus = exports.InternalEvent = exports.TaskType = exports.TaskStatus = exports.BackendType = exports.ConfigurationKey = exports.ImmichCookie = exports.CookieName = void 0;
3
+ exports.ResticTagPrefix = exports.TelemetryLevel = exports.BootstrapStatus = exports.DeviceFlowFailureReason = exports.DeviceFlowEventType = exports.InternalEvent = exports.TaskType = exports.TaskStatus = exports.BackendType = exports.MetadataKey = exports.ConfigurationKey = exports.TicketAction = exports.ImmichCookie = exports.CookieName = void 0;
4
4
  var CookieName;
5
5
  (function (CookieName) {
6
6
  CookieName["NextUrl"] = "sdk-next";
7
7
  CookieName["OidcState"] = "sdk-oidc-state";
8
8
  CookieName["OidcCodeVerifier"] = "sdk-oidc-code-verifier";
9
+ CookieName["SessionToken"] = "sdk-session";
9
10
  CookieName["YuccaAccessToken"] = "yucca-access-token";
10
11
  CookieName["YuccaOidcState"] = "yucca-oidc-state";
11
12
  CookieName["YuccaOidcCodeVerifier"] = "yucca-oidc-code-verifier";
@@ -14,6 +15,11 @@ var ImmichCookie;
14
15
  (function (ImmichCookie) {
15
16
  ImmichCookie["MaintenanceToken"] = "immich_maintenance_token";
16
17
  })(ImmichCookie || (exports.ImmichCookie = ImmichCookie = {}));
18
+ var TicketAction;
19
+ (function (TicketAction) {
20
+ TicketAction["DeleteRepository"] = "repository.delete";
21
+ TicketAction["DisableWorm"] = "repository.disable-worm";
22
+ })(TicketAction || (exports.TicketAction = TicketAction = {}));
17
23
  var ConfigurationKey;
18
24
  (function (ConfigurationKey) {
19
25
  ConfigurationKey["EncryptionKey"] = "encryption-key";
@@ -21,7 +27,12 @@ var ConfigurationKey;
21
27
  ConfigurationKey["Telemetry"] = "telemetry";
22
28
  ConfigurationKey["SkippedOnboardingExtraConfig"] = "skipped-onboarding-extra-config";
23
29
  ConfigurationKey["ResticOptionRestConnections"] = "restic-o-rest-connections";
30
+ ConfigurationKey["SessionSecret"] = "session-secret";
24
31
  })(ConfigurationKey || (exports.ConfigurationKey = ConfigurationKey = {}));
32
+ var MetadataKey;
33
+ (function (MetadataKey) {
34
+ MetadataKey["PublicRoute"] = "public-route";
35
+ })(MetadataKey || (exports.MetadataKey = MetadataKey = {}));
25
36
  var BackendType;
26
37
  (function (BackendType) {
27
38
  BackendType["Yucca"] = "yucca";
@@ -46,6 +57,19 @@ var InternalEvent;
46
57
  (function (InternalEvent) {
47
58
  InternalEvent["ModuleConfigUpdated"] = "yucca.moduleConfig.updated";
48
59
  })(InternalEvent || (exports.InternalEvent = InternalEvent = {}));
60
+ var DeviceFlowEventType;
61
+ (function (DeviceFlowEventType) {
62
+ DeviceFlowEventType["Start"] = "START";
63
+ DeviceFlowEventType["Success"] = "SUCCESS";
64
+ DeviceFlowEventType["Failure"] = "FAILURE";
65
+ })(DeviceFlowEventType || (exports.DeviceFlowEventType = DeviceFlowEventType = {}));
66
+ var DeviceFlowFailureReason;
67
+ (function (DeviceFlowFailureReason) {
68
+ DeviceFlowFailureReason["NotConnected"] = "NOT_CONNECTED";
69
+ DeviceFlowFailureReason["DeviceFlowFailed"] = "DEVICE_FLOW_FAILED";
70
+ DeviceFlowFailureReason["WrongAccount"] = "WRONG_ACCOUNT";
71
+ DeviceFlowFailureReason["Unknown"] = "UNKNOWN";
72
+ })(DeviceFlowFailureReason || (exports.DeviceFlowFailureReason = DeviceFlowFailureReason = {}));
49
73
  var BootstrapStatus;
50
74
  (function (BootstrapStatus) {
51
75
  BootstrapStatus["NotReady"] = "not-ready";
package/dist/enum.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"enum.js","sourceRoot":"","sources":["../src/enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,UAOX;AAPD,WAAY,UAAU;IACpB,kCAAoB,CAAA;IACpB,0CAA4B,CAAA;IAC5B,yDAA2C,CAAA;IAC3C,qDAAuC,CAAA;IACvC,iDAAmC,CAAA;IACnC,gEAAkD,CAAA;AACpD,CAAC,EAPW,UAAU,0BAAV,UAAU,QAOrB;AAED,IAAY,YAEX;AAFD,WAAY,YAAY;IACtB,6DAA6C,CAAA;AAC/C,CAAC,EAFW,YAAY,4BAAZ,YAAY,QAEvB;AAED,IAAY,gBAMX;AAND,WAAY,gBAAgB;IAC1B,oDAAgC,CAAA;IAChC,kDAA8B,CAAA;IAC9B,2CAAuB,CAAA;IACvB,oFAAgE,CAAA;IAChE,6EAAyD,CAAA;AAC3D,CAAC,EANW,gBAAgB,gCAAhB,gBAAgB,QAM3B;AAED,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,8BAAe,CAAA;IACf,8BAAe,CAAA;IACf,wBAAS,CAAA;AACX,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB;AAED,IAAY,UAKX;AALD,WAAY,UAAU;IACpB,uCAAyB,CAAA;IACzB,mCAAqB,CAAA;IACrB,2BAAa,CAAA;IACb,+BAAiB,CAAA;AACnB,CAAC,EALW,UAAU,0BAAV,UAAU,QAKrB;AAED,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,iCAAqB,CAAA;IACrB,+BAAmB,CAAA;IACnB,6BAAiB,CAAA;IACjB,6BAAiB,CAAA;AACnB,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB;AAED,IAAY,aAEX;AAFD,WAAY,aAAa;IACvB,mEAAkD,CAAA;AACpD,CAAC,EAFW,aAAa,6BAAb,aAAa,QAExB;AAED,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,yCAAsB,CAAA;IACtB,kCAAe,CAAA;IACf,kCAAe,CAAA;AACjB,CAAC,EAJW,eAAe,+BAAf,eAAe,QAI1B;AAED,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,+BAAa,CAAA;AACf,CAAC,EAHW,cAAc,8BAAd,cAAc,QAGzB;AAED,IAAY,eAEX;AAFD,WAAY,eAAe;IACzB,yEAAsD,CAAA;AACxD,CAAC,EAFW,eAAe,+BAAf,eAAe,QAE1B"}
1
+ {"version":3,"file":"enum.js","sourceRoot":"","sources":["../src/enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,UAQX;AARD,WAAY,UAAU;IACpB,kCAAoB,CAAA;IACpB,0CAA4B,CAAA;IAC5B,yDAA2C,CAAA;IAC3C,0CAA4B,CAAA;IAC5B,qDAAuC,CAAA;IACvC,iDAAmC,CAAA;IACnC,gEAAkD,CAAA;AACpD,CAAC,EARW,UAAU,0BAAV,UAAU,QAQrB;AAED,IAAY,YAEX;AAFD,WAAY,YAAY;IACtB,6DAA6C,CAAA;AAC/C,CAAC,EAFW,YAAY,4BAAZ,YAAY,QAEvB;AAED,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,sDAAsC,CAAA;IACtC,uDAAuC,CAAA;AACzC,CAAC,EAHW,YAAY,4BAAZ,YAAY,QAGvB;AAED,IAAY,gBAOX;AAPD,WAAY,gBAAgB;IAC1B,oDAAgC,CAAA;IAChC,kDAA8B,CAAA;IAC9B,2CAAuB,CAAA;IACvB,oFAAgE,CAAA;IAChE,6EAAyD,CAAA;IACzD,oDAAgC,CAAA;AAClC,CAAC,EAPW,gBAAgB,gCAAhB,gBAAgB,QAO3B;AAED,IAAY,WAEX;AAFD,WAAY,WAAW;IACrB,2CAA4B,CAAA;AAC9B,CAAC,EAFW,WAAW,2BAAX,WAAW,QAEtB;AAED,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,8BAAe,CAAA;IACf,8BAAe,CAAA;IACf,wBAAS,CAAA;AACX,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB;AAED,IAAY,UAKX;AALD,WAAY,UAAU;IACpB,uCAAyB,CAAA;IACzB,mCAAqB,CAAA;IACrB,2BAAa,CAAA;IACb,+BAAiB,CAAA;AACnB,CAAC,EALW,UAAU,0BAAV,UAAU,QAKrB;AAED,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,iCAAqB,CAAA;IACrB,+BAAmB,CAAA;IACnB,6BAAiB,CAAA;IACjB,6BAAiB,CAAA;AACnB,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB;AAED,IAAY,aAEX;AAFD,WAAY,aAAa;IACvB,mEAAkD,CAAA;AACpD,CAAC,EAFW,aAAa,6BAAb,aAAa,QAExB;AAED,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC7B,sCAAe,CAAA;IACf,0CAAmB,CAAA;IACnB,0CAAmB,CAAA;AACrB,CAAC,EAJW,mBAAmB,mCAAnB,mBAAmB,QAI9B;AAED,IAAY,uBAKX;AALD,WAAY,uBAAuB;IACjC,yDAA8B,CAAA;IAC9B,kEAAuC,CAAA;IACvC,yDAA8B,CAAA;IAC9B,8CAAmB,CAAA;AACrB,CAAC,EALW,uBAAuB,uCAAvB,uBAAuB,QAKlC;AAED,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,yCAAsB,CAAA;IACtB,kCAAe,CAAA;IACf,kCAAe,CAAA;AACjB,CAAC,EAJW,eAAe,+BAAf,eAAe,QAI1B;AAED,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,+BAAa,CAAA;AACf,CAAC,EAHW,cAAc,8BAAd,cAAc,QAGzB;AAED,IAAY,eAEX;AAFD,WAAY,eAAe;IACzB,yEAAsD,CAAA;AACxD,CAAC,EAFW,eAAe,+BAAf,eAAe,QAE1B"}
@@ -6,6 +6,7 @@ import { LocalRepositoryDto, RunDto } from '../dto/repository.dto';
6
6
  import { RunningTaskDto } from '../dto/runningTasks.dto';
7
7
  import { ScheduleDto } from '../dto/schedule.dto';
8
8
  import { ModuleConfigRepository } from '../repositories/moduleConfig.repository';
9
+ import { SessionService } from '../services/session.service';
9
10
  export type GatewayEvent = {
10
11
  type: 'BackendCreate';
11
12
  backend: BackendDto;
@@ -50,12 +51,11 @@ export type GatewayEvent = {
50
51
  runId: string;
51
52
  repositoryId: string;
52
53
  run: Partial<RunDto>;
53
- } | {
54
- type: 'DeviceFlowFailure';
55
54
  };
56
55
  export declare class EventsGateway implements OnGatewayConnection {
57
56
  private readonly moduleConfig;
58
- constructor(moduleConfig: ModuleConfigRepository);
57
+ private readonly session;
58
+ constructor(moduleConfig: ModuleConfigRepository, session: SessionService);
59
59
  server?: Server;
60
60
  publish(event: GatewayEvent): void;
61
61
  emit(event: GatewayEvent): void;
@@ -13,10 +13,13 @@ exports.EventsGateway = void 0;
13
13
  const websockets_1 = require("@nestjs/websockets");
14
14
  const socket_io_1 = require("socket.io");
15
15
  const moduleConfig_repository_1 = require("../repositories/moduleConfig.repository");
16
+ const session_service_1 = require("../services/session.service");
16
17
  let EventsGateway = class EventsGateway {
17
18
  moduleConfig;
18
- constructor(moduleConfig) {
19
+ session;
20
+ constructor(moduleConfig, session) {
19
21
  this.moduleConfig = moduleConfig;
22
+ this.session = session;
20
23
  }
21
24
  server;
22
25
  publish(event) {
@@ -43,6 +46,13 @@ let EventsGateway = class EventsGateway {
43
46
  if (requireWsAuth) {
44
47
  throw new Error('Auth function not set');
45
48
  }
49
+ const configuration = await this.session.cloudConfiguration();
50
+ if (this.session.isRequired(configuration)) {
51
+ const session = await this.session.fromCookieHeader(client.handshake.headers.cookie, configuration);
52
+ if (!session) {
53
+ throw new Error('No session cookie.');
54
+ }
55
+ }
46
56
  return {
47
57
  user: {
48
58
  isAdmin: true,
@@ -63,6 +73,7 @@ exports.EventsGateway = EventsGateway = __decorate([
63
73
  path: '/api/yucca/socket.io',
64
74
  transports: ['websocket'],
65
75
  }),
66
- __metadata("design:paramtypes", [moduleConfig_repository_1.ModuleConfigRepository])
76
+ __metadata("design:paramtypes", [moduleConfig_repository_1.ModuleConfigRepository,
77
+ session_service_1.SessionService])
67
78
  ], EventsGateway);
68
79
  //# sourceMappingURL=events.gateway.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.gateway.js","sourceRoot":"","sources":["../../src/events/events.gateway.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAA4F;AAC5F,yCAA2C;AAM3C,qFAAiF;AAqE1E,IAAM,aAAa,GAAnB,MAAM,aAAa;IACK;IAA7B,YAA6B,YAAoC;QAApC,iBAAY,GAAZ,YAAY,CAAwB;IAAG,CAAC;IAGrE,MAAM,CAAU;IAEhB,OAAO,CAAC,KAAmB;QACzB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,KAAmB;QACtB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAc;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAc;QACvC,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;QAEhE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAED,OAAO;gBACL,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI;iBACd;aACF,CAAC;QACJ,CAAC;QAED,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;CACF,CAAA;AA3CY,sCAAa;AAIxB;IADC,IAAA,4BAAe,GAAE;8BACT,kBAAM;6CAAC;wBAJL,aAAa;IALzB,IAAA,6BAAgB,EAAC;QAChB,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,CAAC,WAAW,CAAC;KAC1B,CAAC;qCAE2C,gDAAsB;GADtD,aAAa,CA2CzB"}
1
+ {"version":3,"file":"events.gateway.js","sourceRoot":"","sources":["../../src/events/events.gateway.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAA4F;AAC5F,yCAA2C;AAM3C,qFAAiF;AACjF,iEAA6D;AAkEtD,IAAM,aAAa,GAAnB,MAAM,aAAa;IAEL;IACA;IAFnB,YACmB,YAAoC,EACpC,OAAuB;QADvB,iBAAY,GAAZ,YAAY,CAAwB;QACpC,YAAO,GAAP,OAAO,CAAgB;IACvC,CAAC;IAGJ,MAAM,CAAU;IAEhB,OAAO,CAAC,KAAmB;QACzB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,KAAmB;QACtB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAc;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAc;QACvC,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;QAEhE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAE9D,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC3C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;gBAEpG,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;YAED,OAAO;gBACL,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI;iBACd;aACF,CAAC;QACJ,CAAC;QAED,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;CACF,CAAA;AAxDY,sCAAa;AAOxB;IADC,IAAA,4BAAe,GAAE;8BACT,kBAAM;6CAAC;wBAPL,aAAa;IALzB,IAAA,6BAAgB,EAAC;QAChB,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,CAAC,WAAW,CAAC;KAC1B,CAAC;qCAGiC,gDAAsB;QAC3B,gCAAc;GAH/B,aAAa,CAwDzB"}
@@ -0,0 +1,14 @@
1
+ import { CanActivate, ExecutionContext } from '@nestjs/common';
2
+ import { Reflector } from '@nestjs/core';
3
+ import { Request } from 'express';
4
+ import { Session, SessionService } from '../services/session.service';
5
+ export declare const PublicRoute: () => MethodDecorator;
6
+ export interface SessionRequest extends Request {
7
+ session?: Session;
8
+ }
9
+ export declare class SessionGuard implements CanActivate {
10
+ private readonly reflector;
11
+ private readonly session;
12
+ constructor(reflector: Reflector, session: SessionService);
13
+ canActivate(context: ExecutionContext): Promise<boolean>;
14
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SessionGuard = exports.PublicRoute = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@nestjs/core");
15
+ const enum_1 = require("../enum");
16
+ const session_service_1 = require("../services/session.service");
17
+ const PublicRoute = () => (0, common_1.SetMetadata)(enum_1.MetadataKey.PublicRoute, true);
18
+ exports.PublicRoute = PublicRoute;
19
+ let SessionGuard = class SessionGuard {
20
+ reflector;
21
+ session;
22
+ constructor(reflector, session) {
23
+ this.reflector = reflector;
24
+ this.session = session;
25
+ }
26
+ async canActivate(context) {
27
+ const request = context.switchToHttp().getRequest();
28
+ const configuration = await this.session.cloudConfiguration();
29
+ request.session = await this.session.fromCookieHeader(request.headers.cookie, configuration);
30
+ const isPublic = this.reflector.getAllAndOverride(enum_1.MetadataKey.PublicRoute, [
31
+ context.getHandler(),
32
+ context.getClass(),
33
+ ]);
34
+ if (isPublic || !this.session.isRequired(configuration)) {
35
+ return true;
36
+ }
37
+ if (!request.session) {
38
+ throw new common_1.UnauthorizedException('Log in to FUTO Backups to manage this instance');
39
+ }
40
+ return true;
41
+ }
42
+ };
43
+ exports.SessionGuard = SessionGuard;
44
+ exports.SessionGuard = SessionGuard = __decorate([
45
+ (0, common_1.Injectable)(),
46
+ __metadata("design:paramtypes", [core_1.Reflector,
47
+ session_service_1.SessionService])
48
+ ], SessionGuard);
49
+ //# sourceMappingURL=session.guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.guard.js","sourceRoot":"","sources":["../../src/middleware/session.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA+G;AAC/G,uCAAyC;AAEzC,kCAAsC;AACtC,iEAAsE;AAE/D,MAAM,WAAW,GAAG,GAAoB,EAAE,CAAC,IAAA,oBAAW,EAAC,kBAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAAhF,QAAA,WAAW,eAAqE;AAOtF,IAAM,YAAY,GAAlB,MAAM,YAAY;IAEJ;IACA;IAFnB,YACmB,SAAoB,EACpB,OAAuB;QADvB,cAAS,GAAT,SAAS,CAAW;QACpB,YAAO,GAAP,OAAO,CAAgB;IACvC,CAAC;IAEJ,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAkB,CAAC;QACpE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC9D,OAAO,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAE7F,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAsB,kBAAW,CAAC,WAAW,EAAE;YAC9F,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CAAC,CAAC;QAEH,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,8BAAqB,CAAC,gDAAgD,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA1BY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;qCAGmB,gBAAS;QACX,gCAAc;GAH/B,YAAY,CA0BxB"}
@@ -28,6 +28,7 @@ export type ModuleConfig = {
28
28
  wellKnownUrl?: string;
29
29
  externalBaseUrl?: string;
30
30
  requireWsAuth?: boolean;
31
+ requireSession?: boolean;
31
32
  requireLock?: boolean;
32
33
  developmentMode?: boolean;
33
34
  authenticate?: AuthenticateFn;
@@ -36,11 +36,12 @@ import { RepositoryService } from './services/repository.service';
36
36
  import { RunHistoryService } from './services/runHistory.service';
37
37
  import { RunningTasksService } from './services/runningTasks.service';
38
38
  import { ScheduleService } from './services/schedule.service';
39
+ import { SessionService } from './services/session.service';
39
40
  import { TelemetryService } from './services/telemetry.service';
40
41
  import { YuccaService } from './services/yucca.service';
41
42
  export declare const controllers: (typeof AuthController | typeof BackendController | typeof DevelopmentController | typeof FilesystemController | typeof IntegrationsController | typeof OnboardingController | typeof RepositoryController | typeof RunHistoryController | typeof RunningTasksController | typeof ScheduleController)[];
42
43
  export declare const repositories: (typeof ModuleConfigRepository | typeof LoggingRepository | typeof BackendRepository | typeof ConfigRepository | typeof RepositoryRepository | typeof BootstrapRepository | typeof StorageRepository | typeof DatabaseRepository | typeof RunHistoryRepository | typeof RepositoryIntegrationImmichRepository | typeof RunningTasksRepository | typeof ScheduleRepository | typeof RepositoryLocalMetricsRepository | typeof RepositoryPathRepository | typeof ResticRepository)[];
43
- export declare const services: (typeof TelemetryService | typeof AuthService | typeof BackendService | typeof RepositoryService | typeof BootstrapService | typeof ScheduleService | typeof DevelopmentService | typeof FilesystemService | typeof IntegrationsService | typeof OnboardingService | typeof RunningTasksService | typeof RunHistoryService | typeof YuccaService)[];
44
+ export declare const services: (typeof SessionService | typeof TelemetryService | typeof AuthService | typeof BackendService | typeof RepositoryService | typeof BootstrapService | typeof ScheduleService | typeof DevelopmentService | typeof FilesystemService | typeof IntegrationsService | typeof OnboardingService | typeof RunningTasksService | typeof RunHistoryService | typeof YuccaService)[];
44
45
  export interface OrchestrationApiModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
45
46
  inject?: FactoryProvider['inject'];
46
47
  useFactory: (...args: any[]) => Promise<Partial<ModuleConfig>> | Partial<ModuleConfig>;
@@ -14,6 +14,7 @@ exports.OrchestrationApiModule = exports.services = exports.repositories = expor
14
14
  const common_1 = require("@nestjs/common");
15
15
  const core_1 = require("@nestjs/core");
16
16
  const event_emitter_1 = require("@nestjs/event-emitter");
17
+ const jwt_1 = require("@nestjs/jwt");
17
18
  const schedule_1 = require("@nestjs/schedule");
18
19
  const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
19
20
  const kysely_1 = require("kysely");
@@ -33,7 +34,9 @@ const runningTasks_controller_1 = require("./controllers/runningTasks.controller
33
34
  const schedule_controller_1 = require("./controllers/schedule.controller");
34
35
  const events_gateway_1 = require("./events/events.gateway");
35
36
  const telemetry_error_interceptor_1 = require("./interceptors/telemetry-error.interceptor");
37
+ const session_guard_1 = require("./middleware/session.guard");
36
38
  const moduleConfig_1 = require("./moduleConfig");
39
+ const resticProxyPool_1 = require("./proxy/resticProxyPool");
37
40
  const backend_repository_1 = require("./repositories/backend.repository");
38
41
  const bootstrap_repository_1 = require("./repositories/bootstrap.repository");
39
42
  const config_repository_1 = require("./repositories/config.repository");
@@ -60,6 +63,7 @@ const repository_service_1 = require("./services/repository.service");
60
63
  const runHistory_service_1 = require("./services/runHistory.service");
61
64
  const runningTasks_service_1 = require("./services/runningTasks.service");
62
65
  const schedule_service_1 = require("./services/schedule.service");
66
+ const session_service_1 = require("./services/session.service");
63
67
  const telemetry_service_1 = require("./services/telemetry.service");
64
68
  const yucca_service_1 = require("./services/yucca.service");
65
69
  const wellKnown_1 = require("./wellKnown");
@@ -104,6 +108,7 @@ exports.services = [
104
108
  runHistory_service_1.RunHistoryService,
105
109
  runningTasks_service_1.RunningTasksService,
106
110
  schedule_service_1.ScheduleService,
111
+ session_service_1.SessionService,
107
112
  telemetry_service_1.TelemetryService,
108
113
  yucca_service_1.YuccaService,
109
114
  ];
@@ -154,12 +159,15 @@ let OrchestrationApiModule = OrchestrationApiModule_1 = class OrchestrationApiMo
154
159
  },
155
160
  }),
156
161
  event_emitter_1.EventEmitterModule.forRoot(),
162
+ jwt_1.JwtModule.register({}),
157
163
  schedule_1.ScheduleModule.forRoot(),
158
164
  ],
159
165
  controllers: exports.controllers,
160
166
  providers: [
161
167
  { provide: core_1.APP_INTERCEPTOR, useClass: telemetry_error_interceptor_1.TelemetryErrorInterceptor },
168
+ { provide: core_1.APP_GUARD, useClass: session_guard_1.SessionGuard },
162
169
  events_gateway_1.EventsGateway,
170
+ resticProxyPool_1.ResticProxyPool,
163
171
  ...exports.repositories,
164
172
  ...exports.services,
165
173
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrationApi.module.js","sourceRoot":"","sources":["../src/orchestrationApi.module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrationApi.module.js","sourceRoot":"","sources":["../src/orchestrationApi.module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { ChildProcess } from 'node:child_process';
2
+ export declare class ResticProxy {
3
+ readonly address: string;
4
+ readonly port: number;
5
+ readonly process: ChildProcess;
6
+ private constructor();
7
+ static isAvailable(): Promise<boolean>;
8
+ static create(apiUrl: string): Promise<ResticProxy>;
9
+ createUrl(repositoryId: string, accessToken: string): string;
10
+ stop(): Promise<void>;
11
+ }
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResticProxy = void 0;
4
+ const node_child_process_1 = require("node:child_process");
5
+ const node_events_1 = require("node:events");
6
+ const promises_1 = require("node:fs/promises");
7
+ const node_path_1 = require("node:path");
8
+ const node_readline_1 = require("node:readline");
9
+ const RESTIC_PROXY_BIN = 'restic-proxy';
10
+ const RESTIC_PROXY_READY_FD = 3;
11
+ const RESTIC_PROXY_READY_TIMEOUT_MS = 10_000;
12
+ class ResticProxy {
13
+ address;
14
+ port;
15
+ process;
16
+ constructor(address, port, process) {
17
+ this.address = address;
18
+ this.port = port;
19
+ this.process = process;
20
+ }
21
+ static async isAvailable() {
22
+ for (const directory of (process.env.PATH ?? '').split(node_path_1.delimiter)) {
23
+ try {
24
+ await (0, promises_1.access)((0, node_path_1.join)(directory, RESTIC_PROXY_BIN), promises_1.constants.X_OK);
25
+ return true;
26
+ }
27
+ catch {
28
+ continue;
29
+ }
30
+ }
31
+ return false;
32
+ }
33
+ static async create(apiUrl) {
34
+ const child = (0, node_child_process_1.spawn)(RESTIC_PROXY_BIN, {
35
+ env: {
36
+ ...process.env,
37
+ RESTIC_PROXY_API_URL: apiUrl,
38
+ RESTIC_PROXY_PORT: '0',
39
+ RESTIC_PROXY_READY_FD: String(RESTIC_PROXY_READY_FD),
40
+ },
41
+ stdio: ['ignore', 'inherit', 'inherit', 'pipe'],
42
+ });
43
+ try {
44
+ const { address, port } = await readReady(child);
45
+ return new ResticProxy(address, port, child);
46
+ }
47
+ catch (error) {
48
+ child.kill();
49
+ throw error;
50
+ }
51
+ }
52
+ createUrl(repositoryId, accessToken) {
53
+ return `rest:http://${repositoryId}:${accessToken}@${this.address}`;
54
+ }
55
+ async stop() {
56
+ if (this.process.exitCode !== null || this.process.signalCode !== null) {
57
+ return;
58
+ }
59
+ this.process.kill();
60
+ await (0, node_events_1.once)(this.process, 'exit');
61
+ }
62
+ }
63
+ exports.ResticProxy = ResticProxy;
64
+ async function readReady(child) {
65
+ const pipe = child.stdio[RESTIC_PROXY_READY_FD];
66
+ const lines = (0, node_readline_1.createInterface)({ input: pipe });
67
+ const settled = new AbortController();
68
+ const signal = AbortSignal.any([settled.signal, AbortSignal.timeout(RESTIC_PROXY_READY_TIMEOUT_MS)]);
69
+ try {
70
+ const [line] = await Promise.race([
71
+ (0, node_events_1.once)(lines, 'line', { signal }),
72
+ rejectOnClose(lines, signal),
73
+ rejectOnSpawnError(child, signal),
74
+ ]);
75
+ return JSON.parse(line);
76
+ }
77
+ catch (error) {
78
+ throw new Error(`${RESTIC_PROXY_BIN} did not report an address`, { cause: error });
79
+ }
80
+ finally {
81
+ settled.abort();
82
+ lines.close();
83
+ }
84
+ }
85
+ async function rejectOnClose(lines, signal) {
86
+ await (0, node_events_1.once)(lines, 'close', { signal });
87
+ throw new Error(`${RESTIC_PROXY_BIN} exited before reporting an address`);
88
+ }
89
+ async function rejectOnSpawnError(child, signal) {
90
+ const [error] = await (0, node_events_1.once)(child, 'error', { signal });
91
+ throw error;
92
+ }
93
+ //# sourceMappingURL=resticProxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resticProxy.js","sourceRoot":"","sources":["../../src/proxy/resticProxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { OnApplicationShutdown } from '@nestjs/common';
2
+ import { ResticProxy } from './resticProxy';
3
+ export declare class ResticProxyPool implements OnApplicationShutdown {
4
+ static pool: Map<string, Promise<ResticProxy>>;
5
+ static available: Promise<boolean> | undefined;
6
+ isAvailable(): Promise<boolean>;
7
+ getProxy(apiUrl: string): Promise<ResticProxy>;
8
+ onApplicationShutdown(): Promise<void>;
9
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var ResticProxyPool_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.ResticProxyPool = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const resticProxy_1 = require("./resticProxy");
13
+ let ResticProxyPool = class ResticProxyPool {
14
+ static { ResticProxyPool_1 = this; }
15
+ static pool = new Map();
16
+ static available;
17
+ isAvailable() {
18
+ ResticProxyPool_1.available ??= resticProxy_1.ResticProxy.isAvailable();
19
+ return ResticProxyPool_1.available;
20
+ }
21
+ getProxy(apiUrl) {
22
+ const existing = ResticProxyPool_1.pool.get(apiUrl);
23
+ if (existing) {
24
+ return existing;
25
+ }
26
+ const pending = resticProxy_1.ResticProxy.create(apiUrl).then((proxy) => {
27
+ proxy.process.once('exit', () => ResticProxyPool_1.pool.delete(apiUrl));
28
+ return proxy;
29
+ });
30
+ pending.catch(() => ResticProxyPool_1.pool.delete(apiUrl));
31
+ ResticProxyPool_1.pool.set(apiUrl, pending);
32
+ return pending;
33
+ }
34
+ async onApplicationShutdown() {
35
+ const outcomes = await Promise.allSettled(ResticProxyPool_1.pool.values());
36
+ const running = outcomes.filter((outcome) => outcome.status === 'fulfilled').map((outcome) => outcome.value);
37
+ await Promise.all(running.map((proxy) => proxy.stop()));
38
+ }
39
+ };
40
+ exports.ResticProxyPool = ResticProxyPool;
41
+ exports.ResticProxyPool = ResticProxyPool = ResticProxyPool_1 = __decorate([
42
+ (0, common_1.Injectable)()
43
+ ], ResticProxyPool);
44
+ //# sourceMappingURL=resticProxyPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resticProxyPool.js","sourceRoot":"","sources":["../../src/proxy/resticProxyPool.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAmE;AACnE,+CAA4C;AAGrC,IAAM,eAAe,GAArB,MAAM,eAAe;;IAC1B,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,EAAgC,CAAC;IACtD,MAAM,CAAC,SAAS,CAA+B;IAE/C,WAAW;QACT,iBAAe,CAAC,SAAS,KAAK,yBAAW,CAAC,WAAW,EAAE,CAAC;QACxD,OAAO,iBAAe,CAAC,SAAS,CAAC;IACnC,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,MAAM,QAAQ,GAAG,iBAAe,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,yBAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YACxD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,iBAAe,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACtE,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,iBAAe,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAEzD,iBAAe,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,iBAAe,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7G,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;;AA9BU,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;GACA,eAAe,CA+B3B"}
@@ -22,6 +22,8 @@ export declare class ConfigRepository {
22
22
  enableTelemetry(): Promise<void>;
23
23
  hasSkippedExtraConfig(): Promise<boolean>;
24
24
  skipExtraConfig(): Promise<void>;
25
+ hasSessionSecret(): Promise<boolean>;
26
+ getSessionSecret(): Promise<Buffer>;
25
27
  getResticOptions(placement: ResticPlacement): Promise<{
26
28
  connections: number;
27
29
  packSizeMib: number | undefined;
@@ -30,6 +30,10 @@ let ConfigRepository = class ConfigRepository {
30
30
  if (!hasKey) {
31
31
  await this.set(enum_1.ConfigurationKey.EncryptionKey, (0, node_crypto_1.randomBytes)(32).toString('hex'));
32
32
  }
33
+ const hasSecret = await this.hasSessionSecret();
34
+ if (!hasSecret) {
35
+ await this.set(enum_1.ConfigurationKey.SessionSecret, (0, node_crypto_1.randomBytes)(32).toString('hex'));
36
+ }
33
37
  }
34
38
  async set(key, value) {
35
39
  await this.db
@@ -99,6 +103,12 @@ let ConfigRepository = class ConfigRepository {
99
103
  async skipExtraConfig() {
100
104
  return this.set(enum_1.ConfigurationKey.SkippedOnboardingExtraConfig, '1');
101
105
  }
106
+ async hasSessionSecret() {
107
+ return this.has(enum_1.ConfigurationKey.SessionSecret);
108
+ }
109
+ async getSessionSecret() {
110
+ return Buffer.from(await this.get(enum_1.ConfigurationKey.SessionSecret), 'hex');
111
+ }
102
112
  async getResticOptions(placement) {
103
113
  const siteCode = placement.siteCode ?? undefined;
104
114
  const clusterCode = placement.storageClusterCode ?? undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"config.repository.js","sourceRoot":"","sources":["../../src/repositories/config.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,mCAAgC;AAChC,iDAA6C;AAC7C,6CAA0C;AAC1C,qCAA+C;AAC/C,kCAA2C;AAE3C,4CAA8C;AAKvC,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IACuB;IAAlD,YAAkD,EAAc;QAAd,OAAE,GAAF,EAAE,CAAY;IAAG,CAAC;IAEpE,KAAK,CAAC,SAAS;QACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,aAAa,EAAE,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,GAAqB,EAAE,KAAa;QACpD,MAAM,IAAI,CAAC,EAAE;aACV,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC;YACN,GAAG;YACH,KAAK;SACN,CAAC;aACD,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;aAC7C,uBAAuB,EAAE,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,GAAqB;QACrC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC5B,UAAU,CAAC,QAAQ,CAAC;aACpB,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC;aAC7B,MAAM,CAAC,cAAc,CAAC;aACtB,uBAAuB,EAAE,CAAC;QAE7B,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,GAAqB;QAC7C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,UAAU,CAAC,QAAQ,CAAC;aACpB,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC;aAC7B,MAAM,CAAC,cAAc,CAAC;aACtB,gBAAgB,EAAE,CAAC;QAEtB,OAAO,GAAG,EAAE,KAAK,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,GAAqB;QACrC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;QAEvG,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,aAAa,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAA4B;QACpD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,aAAa,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAEpD,MAAM,GAAG,GAAG,IAAI,UAAU,CACxB,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAC5B;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAa,CAAC;SAClE,EACD,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,CAAC,EAC9E,GAAG,CACJ,CACF,CAAC;QAEF,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,GAAW;QACnC,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,4BAA4B,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAgB,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,SAA0B;QAE1B,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC;QACjD,MAAM,WAAW,GAAG,SAAS,CAAC,kBAAkB,IAAI,SAAS,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAA,8BAAoB,GAAE,CAAC;QAErC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,uBAAgB,CAAC,2BAA2B,CAAC,CAAC;QACtF,MAAM,WAAW,GAAG,QAAQ;YAC1B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,CAAC,CAAC,CAAC,CAAC,MAAM,0BAAc,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;QAEnF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAAc,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;IAClG,CAAC;CACF,CAAA;AAtHY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;IAEE,WAAA,IAAA,4BAAY,EAAC,cAAc,CAAC,CAAA;qCAAa,eAAM;GADjD,gBAAgB,CAsH5B"}
1
+ {"version":3,"file":"config.repository.js","sourceRoot":"","sources":["../../src/repositories/config.repository.ts"],"names":[],"mappings":"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"}
@@ -32,22 +32,22 @@ export declare class RunHistoryRepository {
32
32
  private ephemeralLogs;
33
33
  createLogAsync(repositoryId: string, type: RunType, fn: (log: WriteStream, logId: string) => Promise<void>): Promise<void>;
34
34
  get(id: string): Promise<{
35
- type: RunType;
36
35
  id: string;
36
+ type: RunType;
37
+ status: TaskStatus;
37
38
  repositoryId: string;
38
39
  start: string;
39
40
  end: string | undefined;
40
41
  logFilePath: string;
41
- status: TaskStatus;
42
42
  } | undefined>;
43
43
  getAll(repositoryId: string): Promise<{
44
- type: RunType;
45
44
  id: string;
45
+ type: RunType;
46
+ status: TaskStatus;
46
47
  repositoryId: string;
47
48
  start: string;
48
49
  end: string | undefined;
49
50
  logFilePath: string;
50
- status: TaskStatus;
51
51
  }[]>;
52
52
  getObservable(id: string): import("rxjs").Observable<MessageEvent<any>>;
53
53
  markIncompleteAsFailed(): Promise<void>;
@@ -4,6 +4,7 @@ export type BackendConfiguration = {
4
4
  type: BackendType.Yucca;
5
5
  url?: string;
6
6
  accessToken: string;
7
+ userId?: string;
7
8
  } | {
8
9
  type: BackendType.Local;
9
10
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"backend.table.js","sourceRoot":"","sources":["../../../src/schema/tables/backend.table.ts"],"names":[],"mappings":";;;AAuCA,MAAa,YAAY;IACvB,EAAE,CAAqB;IACvB,aAAa,CAAU;CACxB;AAHD,oCAGC"}
1
+ {"version":3,"file":"backend.table.js","sourceRoot":"","sources":["../../../src/schema/tables/backend.table.ts"],"names":[],"mappings":";;;AAwCA,MAAa,YAAY;IACvB,EAAE,CAAqB;IACvB,aAAa,CAAU;CACxB;AAHD,oCAGC"}
@@ -1,8 +1,11 @@
1
+ import { TicketCreateRequestDto } from '@futo-org/backups-api-client';
2
+ import { TicketCreateResponseDto } from '../dto/ticket.dto';
1
3
  import { EventsGateway } from '../events/events.gateway';
2
4
  import { BackendRepository } from '../repositories/backend.repository';
3
5
  import { ConfigRepository } from '../repositories/config.repository';
4
6
  import { ModuleConfigRepository } from '../repositories/moduleConfig.repository';
5
7
  import { RepositoryRepository } from '../repositories/repository.repository';
8
+ import { SessionService } from './session.service';
6
9
  import { TelemetryService } from './telemetry.service';
7
10
  export declare class AuthService {
8
11
  readonly config: ConfigRepository;
@@ -11,13 +14,15 @@ export declare class AuthService {
11
14
  readonly events: EventsGateway;
12
15
  readonly telemetry: TelemetryService;
13
16
  readonly repository: RepositoryRepository;
14
- constructor(config: ConfigRepository, backend: BackendRepository, moduleConfig: ModuleConfigRepository, events: EventsGateway, telemetry: TelemetryService, repository: RepositoryRepository);
17
+ readonly session: SessionService;
18
+ constructor(config: ConfigRepository, backend: BackendRepository, moduleConfig: ModuleConfigRepository, events: EventsGateway, telemetry: TelemetryService, repository: RepositoryRepository, session: SessionService);
15
19
  private connectionType;
16
20
  private connectionName;
17
21
  private adoptOwnRepositories;
18
- private waitForDeviceFlow;
19
- oidcDeviceFlow(): Promise<{
20
- userCode: string;
21
- verificationUri: string;
22
- }>;
22
+ private fetchBackendUserId;
23
+ private connectBackend;
24
+ private relayDeviceFlow;
25
+ private runDeviceFlow;
26
+ deviceFlow(identity: boolean): import("rxjs").Observable<MessageEvent<any>>;
27
+ createTicket(dto: TicketCreateRequestDto): Promise<TicketCreateResponseDto>;
23
28
  }