dbdock 1.1.26 → 1.2.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.
- package/LICENSE +1 -1
- package/README.md +87 -728
- package/dist/alerts/alert-templates.d.ts +1 -1
- package/dist/alerts/alert-templates.js +6 -2
- package/dist/alerts/alert-templates.js.map +1 -1
- package/dist/alerts/alert.service.js +24 -11
- package/dist/alerts/alert.service.js.map +1 -1
- package/dist/alerts/alert.types.d.ts +1 -1
- package/dist/backup/backup.service.js.map +1 -1
- package/dist/cli/commands/analyze.js.map +1 -1
- package/dist/cli/commands/backup.js +10 -4
- package/dist/cli/commands/backup.js.map +1 -1
- package/dist/cli/commands/cleanup.js +12 -6
- package/dist/cli/commands/cleanup.js.map +1 -1
- package/dist/cli/commands/copydb.js +78 -37
- package/dist/cli/commands/copydb.js.map +1 -1
- package/dist/cli/commands/cross-migrate.js +9 -10
- package/dist/cli/commands/cross-migrate.js.map +1 -1
- package/dist/cli/commands/delete.js +46 -37
- package/dist/cli/commands/delete.js.map +1 -1
- package/dist/cli/commands/driver-copy.js +87 -48
- package/dist/cli/commands/driver-copy.js.map +1 -1
- package/dist/cli/commands/init.js +35 -13
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/migrate-config.js +11 -6
- package/dist/cli/commands/migrate-config.js.map +1 -1
- package/dist/cli/commands/restore.js +14 -148
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/schedule.js +1 -1
- package/dist/cli/commands/schedule.js.map +1 -1
- package/dist/cli/commands/start.js +19 -14
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.js +5 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/test.js +3 -38
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/config.d.ts +7 -0
- package/dist/cli/utils/config.js.map +1 -1
- package/dist/cli/utils/progress.js.map +1 -1
- package/dist/cli/utils/retention.js +6 -1
- package/dist/cli/utils/retention.js.map +1 -1
- package/dist/config/config.schema.d.ts +8 -0
- package/dist/config/config.schema.js +42 -0
- package/dist/config/config.schema.js.map +1 -1
- package/dist/config/config.service.js +99 -63
- package/dist/config/config.service.js.map +1 -1
- package/dist/config/env-url.helper.js +5 -2
- package/dist/config/env-url.helper.js.map +1 -1
- package/dist/config/permissions.checker.js +5 -7
- package/dist/config/permissions.checker.js.map +1 -1
- package/dist/config/pgpass.helper.js.map +1 -1
- package/dist/config/secrets.validator.js +3 -1
- package/dist/config/secrets.validator.js.map +1 -1
- package/dist/crypto/crypto.service.js +1 -1
- package/dist/crypto/crypto.service.js.map +1 -1
- package/dist/dbdock.js.map +1 -1
- package/dist/engines/engine.types.d.ts +32 -0
- package/dist/engines/engine.types.js +3 -0
- package/dist/engines/engine.types.js.map +1 -0
- package/dist/engines/index.d.ts +4 -0
- package/dist/engines/index.js +30 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/mssql.engine.d.ts +2 -0
- package/dist/engines/mssql.engine.js +198 -0
- package/dist/engines/mssql.engine.js.map +1 -0
- package/dist/engines/mysql.engine.d.ts +2 -0
- package/dist/engines/mysql.engine.js +184 -0
- package/dist/engines/mysql.engine.js.map +1 -0
- package/dist/engines/postgres.engine.d.ts +2 -0
- package/dist/engines/postgres.engine.js +257 -0
- package/dist/engines/postgres.engine.js.map +1 -0
- package/dist/engines/redis-worker.d.ts +1 -0
- package/dist/engines/redis-worker.js +80 -0
- package/dist/engines/redis-worker.js.map +1 -0
- package/dist/engines/redis.engine.d.ts +2 -0
- package/dist/engines/redis.engine.js +124 -0
- package/dist/engines/redis.engine.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/migration/analyzers/mongodb.analyzer.js +15 -7
- package/dist/migration/analyzers/mongodb.analyzer.js.map +1 -1
- package/dist/migration/analyzers/postgres.analyzer.js +1 -1
- package/dist/migration/analyzers/postgres.analyzer.js.map +1 -1
- package/dist/migration/config.manager.js.map +1 -1
- package/dist/migration/engines/migration.engine.js +1 -1
- package/dist/migration/engines/migration.engine.js.map +1 -1
- package/dist/migration/engines/mongo-to-postgres.engine.js +34 -16
- package/dist/migration/engines/mongo-to-postgres.engine.js.map +1 -1
- package/dist/migration/engines/postgres-to-mongo.engine.js +8 -10
- package/dist/migration/engines/postgres-to-mongo.engine.js.map +1 -1
- package/dist/migration/mappers/mongo-to-postgres.mapper.js +3 -6
- package/dist/migration/mappers/mongo-to-postgres.mapper.js.map +1 -1
- package/dist/migration/mappers/postgres-to-mongo.mapper.js +5 -3
- package/dist/migration/mappers/postgres-to-mongo.mapper.js.map +1 -1
- package/dist/migration/reference.detector.js.map +1 -1
- package/dist/migration/row.types.d.ts +12 -0
- package/dist/migration/row.types.js +3 -0
- package/dist/migration/row.types.js.map +1 -0
- package/dist/migration/type.mapper.d.ts +3 -3
- package/dist/migration/type.mapper.js +29 -14
- package/dist/migration/type.mapper.js.map +1 -1
- package/dist/migration/types.d.ts +1 -1
- package/dist/scheduler/schedule-manager.js +4 -1
- package/dist/scheduler/schedule-manager.js.map +1 -1
- package/dist/scheduler/scheduler.service.js +11 -6
- package/dist/scheduler/scheduler.service.js.map +1 -1
- package/dist/standalone/backup-standalone.js +17 -118
- package/dist/standalone/backup-standalone.js.map +1 -1
- package/dist/standalone/restore-standalone.d.ts +10 -0
- package/dist/standalone/restore-standalone.js +167 -0
- package/dist/standalone/restore-standalone.js.map +1 -0
- package/dist/storage/adapters/cloudinary.adapter.js +12 -7
- package/dist/storage/adapters/cloudinary.adapter.js.map +1 -1
- package/dist/storage/adapters/local.adapter.js +15 -12
- package/dist/storage/adapters/local.adapter.js.map +1 -1
- package/dist/storage/adapters/s3.adapter.d.ts +2 -1
- package/dist/storage/adapters/s3.adapter.js +23 -2
- package/dist/storage/adapters/s3.adapter.js.map +1 -1
- package/dist/storage/deletion-guard.d.ts +37 -0
- package/dist/storage/deletion-guard.js +102 -0
- package/dist/storage/deletion-guard.js.map +1 -0
- package/dist/storage/safe-storage.adapter.d.ts +35 -0
- package/dist/storage/safe-storage.adapter.js +161 -0
- package/dist/storage/safe-storage.adapter.js.map +1 -0
- package/dist/storage/storage.interface.d.ts +6 -0
- package/dist/storage/storage.service.d.ts +3 -0
- package/dist/storage/storage.service.js +18 -3
- package/dist/storage/storage.service.js.map +1 -1
- package/dist/utils/logger.js +32 -8
- package/dist/utils/logger.js.map +1 -1
- package/dist/wal/retention.service.js +23 -8
- package/dist/wal/retention.service.js.map +1 -1
- package/dist/wal/wal-archiver.service.js +7 -4
- package/dist/wal/wal-archiver.service.js.map +1 -1
- package/package.json +6 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.adapter.js","sourceRoot":"","sources":["../../../src/storage/adapters/local.adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAoD;AAWpD,uCAAyB;AACzB,2CAA6B;AAC7B,+BAAiC;AAEjC,MAAM,KAAK,GAAG,IAAA,gBAAS,EAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AAClC,MAAM,MAAM,GAAG,IAAA,gBAAS,EAAC,EAAE,CAAC,MAAM,CAAC,CAAC;AACpC,MAAM,IAAI,GAAG,IAAA,gBAAS,EAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AAChC,MAAM,OAAO,GAAG,IAAA,gBAAS,EAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAG/B,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IACb,MAAM,GAAG,IAAI,eAAM,CAAC,qBAAmB,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,CAAS;IAElC,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,oBAAoB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"local.adapter.js","sourceRoot":"","sources":["../../../src/storage/adapters/local.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IStorageAdapter, UploadOptions, DownloadOptions, ListOptions, StorageObject, DeleteOptions, PresignedUrlOptions } from '../storage.interface';
|
|
1
|
+
import { IStorageAdapter, UploadOptions, DownloadOptions, ListOptions, StorageObject, DeleteOptions, CopyOptions, PresignedUrlOptions } from '../storage.interface';
|
|
2
2
|
import { Readable } from 'stream';
|
|
3
3
|
export interface S3Config {
|
|
4
4
|
endpoint?: string;
|
|
@@ -20,6 +20,7 @@ export declare class S3StorageAdapter implements IStorageAdapter {
|
|
|
20
20
|
downloadStream(options: DownloadOptions): Promise<Readable>;
|
|
21
21
|
listObjects(options?: ListOptions): Promise<StorageObject[]>;
|
|
22
22
|
deleteObject(options: DeleteOptions): Promise<void>;
|
|
23
|
+
copyObject(options: CopyOptions): Promise<void>;
|
|
23
24
|
generatePresignedUrl(options: PresignedUrlOptions): Promise<string>;
|
|
24
25
|
objectExists(key: string): Promise<boolean>;
|
|
25
26
|
private getFriendlyError;
|
|
@@ -128,6 +128,24 @@ let S3StorageAdapter = S3StorageAdapter_1 = class S3StorageAdapter {
|
|
|
128
128
|
throw cleanError;
|
|
129
129
|
}
|
|
130
130
|
}
|
|
131
|
+
async copyObject(options) {
|
|
132
|
+
try {
|
|
133
|
+
const command = new client_s3_1.CopyObjectCommand({
|
|
134
|
+
Bucket: this.bucket,
|
|
135
|
+
CopySource: encodeURI(`${this.bucket}/${options.sourceKey}`),
|
|
136
|
+
Key: options.destinationKey,
|
|
137
|
+
});
|
|
138
|
+
await this.client.send(command);
|
|
139
|
+
this.logger.log(`Copied ${options.sourceKey} to ${options.destinationKey}`);
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
const friendlyMessage = this.getFriendlyError(error);
|
|
143
|
+
this.logger.error(`Failed to copy ${options.sourceKey}: ${friendlyMessage}`);
|
|
144
|
+
const cleanError = new Error(friendlyMessage);
|
|
145
|
+
cleanError.name = 'StorageConfigurationError';
|
|
146
|
+
throw cleanError;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
131
149
|
async generatePresignedUrl(options) {
|
|
132
150
|
try {
|
|
133
151
|
const command = new client_s3_1.GetObjectCommand({
|
|
@@ -157,7 +175,8 @@ let S3StorageAdapter = S3StorageAdapter_1 = class S3StorageAdapter {
|
|
|
157
175
|
return true;
|
|
158
176
|
}
|
|
159
177
|
catch (error) {
|
|
160
|
-
|
|
178
|
+
const e = error;
|
|
179
|
+
if (e.name === 'NotFound') {
|
|
161
180
|
return false;
|
|
162
181
|
}
|
|
163
182
|
throw error;
|
|
@@ -167,7 +186,9 @@ let S3StorageAdapter = S3StorageAdapter_1 = class S3StorageAdapter {
|
|
|
167
186
|
const err = error;
|
|
168
187
|
const code = err?.code;
|
|
169
188
|
const message = err?.message || '';
|
|
170
|
-
if (code === 'EPROTO' ||
|
|
189
|
+
if (code === 'EPROTO' ||
|
|
190
|
+
message.includes('SSL') ||
|
|
191
|
+
message.includes('TLS')) {
|
|
171
192
|
return 'Invalid storage configuration: SSL/TLS handshake failed. Please verify your endpoint URL, access key ID, and secret access key are correct.';
|
|
172
193
|
}
|
|
173
194
|
if (code === 'ENOTFOUND' || message.includes('getaddrinfo')) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.adapter.js","sourceRoot":"","sources":["../../../src/storage/adapters/s3.adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,
|
|
1
|
+
{"version":3,"file":"s3.adapter.js","sourceRoot":"","sources":["../../../src/storage/adapters/s3.adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,kDAO4B;AAC5B,sDAA8C;AAC9C,wEAA6D;AAuBtD,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IACV,MAAM,GAAG,IAAI,eAAM,CAAC,kBAAgB,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,CAAW;IACjB,MAAM,CAAS;IAEhC,YAAY,MAAgB;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAE5B,IAAI,CAAC,MAAM,GAAG,IAAI,oBAAQ,CAAC;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,WAAW;YACpC,WAAW,EAAE;gBACX,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,eAAe,EAAE,MAAM,CAAC,eAAe;aACxC;YACD,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,KAAK;SAC/C,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sCAAsC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,MAAgB,EAChB,OAAsB;QAEtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,oBAAM,CAAC;gBACxB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE;oBACN,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,IAAI,EAAE,MAAM;oBACZ,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC3B;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC3C,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACtC,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBACtE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,GAAG,KAAK,OAAO,GAAG,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAEnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;YAEjD,OAAO;gBACL,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,OAAO,CAAC,GAAG,KAAK,eAAe,EAAE,CAAC,CAAC;YACzE,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YAC9C,UAAU,CAAC,IAAI,GAAG,2BAA2B,CAAC;YAC9C,MAAM,UAAU,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAwB;QAC3C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,4BAAgB,CAAC;gBACnC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEjD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5D,CAAC;YAED,OAAO,QAAQ,CAAC,IAAgB,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,sBAAsB,OAAO,CAAC,GAAG,KAAK,eAAe,EAAE,CACxD,CAAC;YACF,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YAC9C,UAAU,CAAC,IAAI,GAAG,2BAA2B,CAAC;YAC9C,MAAM,UAAU,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAqB;QACrC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,gCAAoB,CAAC;gBACvC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,OAAO,EAAE,MAAM;gBACvB,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI;gBACjC,UAAU,EAAE,OAAO,EAAE,UAAU;aAChC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEjD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACvB,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACrC,GAAG,EAAE,GAAG,CAAC,GAAI;gBACb,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;gBACnB,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI,IAAI,EAAE;aAC7C,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,eAAe,EAAE,CAAC,CAAC;YAChE,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YAC9C,UAAU,CAAC,IAAI,GAAG,2BAA2B,CAAC;YAC9C,MAAM,UAAU,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAsB;QACvC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,+BAAmB,CAAC;gBACtC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEhC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,OAAO,CAAC,GAAG,KAAK,eAAe,EAAE,CAAC,CAAC;YACzE,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YAC9C,UAAU,CAAC,IAAI,GAAG,2BAA2B,CAAC;YAC9C,MAAM,UAAU,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAoB;QACnC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,6BAAiB,CAAC;gBACpC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,UAAU,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC5D,GAAG,EAAE,OAAO,CAAC,cAAc;aAC5B,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEhC,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,UAAU,OAAO,CAAC,SAAS,OAAO,OAAO,CAAC,cAAc,EAAE,CAC3D,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,kBAAkB,OAAO,CAAC,SAAS,KAAK,eAAe,EAAE,CAC1D,CAAC;YACF,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YAC9C,UAAU,CAAC,IAAI,GAAG,2BAA2B,CAAC;YAC9C,MAAM,UAAU,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,OAA4B;QACrD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,4BAAgB,CAAC;gBACnC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,MAAM,IAAA,mCAAY,EAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;gBACnD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;aACrC,CAAC,CAAC;YAEH,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,wCAAwC,OAAO,CAAC,GAAG,KAAK,eAAe,EAAE,CAC1E,CAAC;YACF,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YAC9C,UAAU,CAAC,IAAI,GAAG,2BAA2B,CAAC;YAC9C,MAAM,UAAU,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,6BAAiB,CAAC;gBACpC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,GAAG;aACT,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,KAA0B,CAAC;YACrC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC1B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,KAAc;QACrC,MAAM,GAAG,GAAG,KAA4C,CAAC;QACzD,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC;QACvB,MAAM,OAAO,GAAW,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC;QAE3C,IACE,IAAI,KAAK,QAAQ;YACjB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EACvB,CAAC;YACD,OAAO,6IAA6I,CAAC;QACvJ,CAAC;QAED,IAAI,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAC5D,OAAO,iHAAiH,CAAC;QAC3H,CAAC;QAED,IAAI,IAAI,KAAK,uBAAuB,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACtE,OAAO,2HAA2H,CAAC;QACrI,CAAC;QAED,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;YAClC,OAAO,sGAAsG,CAAC;QAChH,CAAC;QAED,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YAC5B,OAAO,0CAA0C,IAAI,CAAC,MAAM,8DAA8D,CAAC;QAC7H,CAAC;QAED,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACpD,OAAO,8HAA8H,CAAC;QACxI,CAAC;QAED,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YACpD,OAAO,6GAA6G,CAAC;QACvH,CAAC;QAED,OAAO,OAAO,IAAI,gCAAgC,CAAC;IACrD,CAAC;CACF,CAAA;AA9OY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;;GACA,gBAAgB,CA8O5B"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare const DEFAULT_TRASH_PREFIX = ".trash/";
|
|
2
|
+
export declare const DEFAULT_ALLOWED_DELETE_PREFIXES: string[];
|
|
3
|
+
export declare const DEFAULT_MAX_DELETES_PER_WINDOW = 1000;
|
|
4
|
+
export declare const DEFAULT_DELETION_WINDOW_MS = 60000;
|
|
5
|
+
export declare const DEFAULT_TRASH_RETENTION_DAYS = 14;
|
|
6
|
+
export declare const MAX_STORAGE_KEY_LENGTH = 1024;
|
|
7
|
+
export interface DeletionGuardPolicy {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
recycleBin: boolean;
|
|
10
|
+
trashPrefix: string;
|
|
11
|
+
allowedPrefixes: string[];
|
|
12
|
+
maxDeletesPerWindow: number;
|
|
13
|
+
windowMs: number;
|
|
14
|
+
trashRetentionDays: number;
|
|
15
|
+
}
|
|
16
|
+
export interface DeletionGuardPolicyOverrides {
|
|
17
|
+
enabled?: boolean;
|
|
18
|
+
recycleBin?: boolean;
|
|
19
|
+
trashRetentionDays?: number;
|
|
20
|
+
maxDeletesPerWindow?: number;
|
|
21
|
+
allowedPrefixes?: string[];
|
|
22
|
+
}
|
|
23
|
+
export declare class DeletionGuardError extends Error {
|
|
24
|
+
readonly key: string;
|
|
25
|
+
constructor(message: string, key: string);
|
|
26
|
+
}
|
|
27
|
+
export declare function resolveDeletionGuardPolicy(overrides?: DeletionGuardPolicyOverrides): DeletionGuardPolicy;
|
|
28
|
+
export declare function validateKeyStructure(key: string): void;
|
|
29
|
+
export declare function isWithinAllowedPrefix(key: string, allowedPrefixes: string[]): boolean;
|
|
30
|
+
export declare function assertDeletableKey(key: string, allowedPrefixes: string[]): void;
|
|
31
|
+
export declare class DeletionRateLimiter {
|
|
32
|
+
private readonly max;
|
|
33
|
+
private readonly windowMs;
|
|
34
|
+
private readonly events;
|
|
35
|
+
constructor(max: number, windowMs: number);
|
|
36
|
+
record(now: number): void;
|
|
37
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeletionRateLimiter = exports.DeletionGuardError = exports.MAX_STORAGE_KEY_LENGTH = exports.DEFAULT_TRASH_RETENTION_DAYS = exports.DEFAULT_DELETION_WINDOW_MS = exports.DEFAULT_MAX_DELETES_PER_WINDOW = exports.DEFAULT_ALLOWED_DELETE_PREFIXES = exports.DEFAULT_TRASH_PREFIX = void 0;
|
|
4
|
+
exports.resolveDeletionGuardPolicy = resolveDeletionGuardPolicy;
|
|
5
|
+
exports.validateKeyStructure = validateKeyStructure;
|
|
6
|
+
exports.isWithinAllowedPrefix = isWithinAllowedPrefix;
|
|
7
|
+
exports.assertDeletableKey = assertDeletableKey;
|
|
8
|
+
exports.DEFAULT_TRASH_PREFIX = '.trash/';
|
|
9
|
+
exports.DEFAULT_ALLOWED_DELETE_PREFIXES = [
|
|
10
|
+
'backups/',
|
|
11
|
+
'wal/',
|
|
12
|
+
'dbdock_backups/',
|
|
13
|
+
'backup-',
|
|
14
|
+
];
|
|
15
|
+
exports.DEFAULT_MAX_DELETES_PER_WINDOW = 1000;
|
|
16
|
+
exports.DEFAULT_DELETION_WINDOW_MS = 60_000;
|
|
17
|
+
exports.DEFAULT_TRASH_RETENTION_DAYS = 14;
|
|
18
|
+
exports.MAX_STORAGE_KEY_LENGTH = 1024;
|
|
19
|
+
function hasControlCharacter(value) {
|
|
20
|
+
for (let i = 0; i < value.length; i++) {
|
|
21
|
+
const code = value.charCodeAt(i);
|
|
22
|
+
if (code <= 0x1f || code === 0x7f)
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
class DeletionGuardError extends Error {
|
|
28
|
+
key;
|
|
29
|
+
constructor(message, key) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.name = 'DeletionGuardError';
|
|
32
|
+
this.key = key;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.DeletionGuardError = DeletionGuardError;
|
|
36
|
+
function resolveDeletionGuardPolicy(overrides) {
|
|
37
|
+
return {
|
|
38
|
+
enabled: overrides?.enabled ?? true,
|
|
39
|
+
recycleBin: overrides?.recycleBin ?? true,
|
|
40
|
+
trashPrefix: exports.DEFAULT_TRASH_PREFIX,
|
|
41
|
+
allowedPrefixes: overrides?.allowedPrefixes && overrides.allowedPrefixes.length > 0
|
|
42
|
+
? overrides.allowedPrefixes
|
|
43
|
+
: exports.DEFAULT_ALLOWED_DELETE_PREFIXES,
|
|
44
|
+
maxDeletesPerWindow: overrides?.maxDeletesPerWindow ?? exports.DEFAULT_MAX_DELETES_PER_WINDOW,
|
|
45
|
+
windowMs: exports.DEFAULT_DELETION_WINDOW_MS,
|
|
46
|
+
trashRetentionDays: overrides?.trashRetentionDays ?? exports.DEFAULT_TRASH_RETENTION_DAYS,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function validateKeyStructure(key) {
|
|
50
|
+
if (typeof key !== 'string' || key.length === 0) {
|
|
51
|
+
throw new DeletionGuardError('Refusing to delete an empty storage key', key);
|
|
52
|
+
}
|
|
53
|
+
if (key !== key.trim()) {
|
|
54
|
+
throw new DeletionGuardError('Refusing to delete a key with surrounding whitespace', key);
|
|
55
|
+
}
|
|
56
|
+
if (key.length > exports.MAX_STORAGE_KEY_LENGTH) {
|
|
57
|
+
throw new DeletionGuardError('Refusing to delete an oversized key', key);
|
|
58
|
+
}
|
|
59
|
+
if (key.startsWith('/')) {
|
|
60
|
+
throw new DeletionGuardError('Refusing to delete a key with a leading slash', key);
|
|
61
|
+
}
|
|
62
|
+
if (key.endsWith('/')) {
|
|
63
|
+
throw new DeletionGuardError('Refusing to delete a folder-style key', key);
|
|
64
|
+
}
|
|
65
|
+
if (key.includes('..')) {
|
|
66
|
+
throw new DeletionGuardError('Refusing to delete a key containing a path traversal segment', key);
|
|
67
|
+
}
|
|
68
|
+
if (key.includes('*') || hasControlCharacter(key)) {
|
|
69
|
+
throw new DeletionGuardError('Refusing to delete a key with wildcard or control characters', key);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function isWithinAllowedPrefix(key, allowedPrefixes) {
|
|
73
|
+
return allowedPrefixes.some((prefix) => prefix.length > 0 &&
|
|
74
|
+
(key.startsWith(prefix) || key.includes(`/${prefix}`)));
|
|
75
|
+
}
|
|
76
|
+
function assertDeletableKey(key, allowedPrefixes) {
|
|
77
|
+
validateKeyStructure(key);
|
|
78
|
+
if (!isWithinAllowedPrefix(key, allowedPrefixes)) {
|
|
79
|
+
throw new DeletionGuardError(`Refusing to delete a key outside protected prefixes [${allowedPrefixes.join(', ')}]`, key);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
class DeletionRateLimiter {
|
|
83
|
+
max;
|
|
84
|
+
windowMs;
|
|
85
|
+
events = [];
|
|
86
|
+
constructor(max, windowMs) {
|
|
87
|
+
this.max = max;
|
|
88
|
+
this.windowMs = windowMs;
|
|
89
|
+
}
|
|
90
|
+
record(now) {
|
|
91
|
+
const cutoff = now - this.windowMs;
|
|
92
|
+
while (this.events.length > 0 && this.events[0] < cutoff) {
|
|
93
|
+
this.events.shift();
|
|
94
|
+
}
|
|
95
|
+
if (this.events.length >= this.max) {
|
|
96
|
+
throw new DeletionGuardError(`Deletion circuit breaker tripped: more than ${this.max} deletions within ${this.windowMs}ms`, '');
|
|
97
|
+
}
|
|
98
|
+
this.events.push(now);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.DeletionRateLimiter = DeletionRateLimiter;
|
|
102
|
+
//# sourceMappingURL=deletion-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deletion-guard.js","sourceRoot":"","sources":["../../src/storage/deletion-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Readable } from 'stream';
|
|
2
|
+
import { IStorageAdapter, UploadOptions, DownloadOptions, ListOptions, StorageObject, DeleteOptions, CopyOptions, PresignedUrlOptions } from './storage.interface';
|
|
3
|
+
import { DeletionGuardPolicy } from './deletion-guard';
|
|
4
|
+
export interface StorageDeletionEvent {
|
|
5
|
+
key: string;
|
|
6
|
+
softDeleted: boolean;
|
|
7
|
+
trashKey: string | null;
|
|
8
|
+
reason: string | null;
|
|
9
|
+
}
|
|
10
|
+
export type StorageDeletionListener = (event: StorageDeletionEvent) => void | Promise<void>;
|
|
11
|
+
export declare class SafeStorageAdapter implements IStorageAdapter {
|
|
12
|
+
private readonly inner;
|
|
13
|
+
private readonly policy;
|
|
14
|
+
private readonly listener?;
|
|
15
|
+
private readonly logger;
|
|
16
|
+
private readonly rateLimiter;
|
|
17
|
+
constructor(inner: IStorageAdapter, policy: DeletionGuardPolicy, listener?: StorageDeletionListener | undefined);
|
|
18
|
+
uploadStream(stream: Readable, options: UploadOptions): Promise<{
|
|
19
|
+
key: string;
|
|
20
|
+
etag?: string;
|
|
21
|
+
}>;
|
|
22
|
+
downloadStream(options: DownloadOptions): Promise<Readable>;
|
|
23
|
+
listObjects(options?: ListOptions): Promise<StorageObject[]>;
|
|
24
|
+
generatePresignedUrl(options: PresignedUrlOptions): Promise<string>;
|
|
25
|
+
objectExists(key: string): Promise<boolean>;
|
|
26
|
+
copyObject(options: CopyOptions): Promise<void>;
|
|
27
|
+
deleteObject(options: DeleteOptions): Promise<void>;
|
|
28
|
+
restoreFromTrash(trashKey: string): Promise<string>;
|
|
29
|
+
purgeTrash(olderThanDays?: number): Promise<number>;
|
|
30
|
+
private moveToTrash;
|
|
31
|
+
private hardDelete;
|
|
32
|
+
private bestEffortHardDelete;
|
|
33
|
+
private readTrashMeta;
|
|
34
|
+
private emit;
|
|
35
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SafeStorageAdapter = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const stream_1 = require("stream");
|
|
6
|
+
const deletion_guard_1 = require("./deletion-guard");
|
|
7
|
+
const TRASH_META_SUFFIX = '.trashmeta.json';
|
|
8
|
+
const MS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
9
|
+
class SafeStorageAdapter {
|
|
10
|
+
inner;
|
|
11
|
+
policy;
|
|
12
|
+
listener;
|
|
13
|
+
logger = new common_1.Logger(SafeStorageAdapter.name);
|
|
14
|
+
rateLimiter;
|
|
15
|
+
constructor(inner, policy, listener) {
|
|
16
|
+
this.inner = inner;
|
|
17
|
+
this.policy = policy;
|
|
18
|
+
this.listener = listener;
|
|
19
|
+
this.rateLimiter = new deletion_guard_1.DeletionRateLimiter(policy.maxDeletesPerWindow, policy.windowMs);
|
|
20
|
+
}
|
|
21
|
+
uploadStream(stream, options) {
|
|
22
|
+
return this.inner.uploadStream(stream, options);
|
|
23
|
+
}
|
|
24
|
+
downloadStream(options) {
|
|
25
|
+
return this.inner.downloadStream(options);
|
|
26
|
+
}
|
|
27
|
+
listObjects(options) {
|
|
28
|
+
return this.inner.listObjects(options);
|
|
29
|
+
}
|
|
30
|
+
generatePresignedUrl(options) {
|
|
31
|
+
return this.inner.generatePresignedUrl(options);
|
|
32
|
+
}
|
|
33
|
+
objectExists(key) {
|
|
34
|
+
return this.inner.objectExists(key);
|
|
35
|
+
}
|
|
36
|
+
async copyObject(options) {
|
|
37
|
+
if (this.inner.copyObject) {
|
|
38
|
+
await this.inner.copyObject(options);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const stream = await this.inner.downloadStream({
|
|
42
|
+
key: options.sourceKey,
|
|
43
|
+
});
|
|
44
|
+
await this.inner.uploadStream(stream, { key: options.destinationKey });
|
|
45
|
+
}
|
|
46
|
+
async deleteObject(options) {
|
|
47
|
+
const key = options.key;
|
|
48
|
+
const reason = options.reason ?? null;
|
|
49
|
+
if (!this.policy.enabled) {
|
|
50
|
+
(0, deletion_guard_1.validateKeyStructure)(key);
|
|
51
|
+
await this.inner.deleteObject({ key });
|
|
52
|
+
await this.emit({ key, softDeleted: false, trashKey: null, reason });
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
(0, deletion_guard_1.assertDeletableKey)(key, this.policy.allowedPrefixes);
|
|
56
|
+
this.rateLimiter.record(Date.now());
|
|
57
|
+
if (this.policy.recycleBin && !key.startsWith(this.policy.trashPrefix)) {
|
|
58
|
+
const trashKey = await this.moveToTrash(key, reason);
|
|
59
|
+
await this.emit({ key, softDeleted: true, trashKey, reason });
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
await this.inner.deleteObject({ key });
|
|
63
|
+
await this.emit({ key, softDeleted: false, trashKey: null, reason });
|
|
64
|
+
}
|
|
65
|
+
async restoreFromTrash(trashKey) {
|
|
66
|
+
const metaKey = `${trashKey}${TRASH_META_SUFFIX}`;
|
|
67
|
+
const meta = await this.readTrashMeta(metaKey);
|
|
68
|
+
const originalKey = meta?.originalKey ?? null;
|
|
69
|
+
if (!originalKey) {
|
|
70
|
+
throw new deletion_guard_1.DeletionGuardError('Cannot restore: missing trash metadata', trashKey);
|
|
71
|
+
}
|
|
72
|
+
await this.copyObject({ sourceKey: trashKey, destinationKey: originalKey });
|
|
73
|
+
await this.hardDelete(trashKey);
|
|
74
|
+
await this.bestEffortHardDelete(metaKey);
|
|
75
|
+
this.logger.warn(`[storage-audit] restored ${trashKey} -> ${originalKey}`);
|
|
76
|
+
return originalKey;
|
|
77
|
+
}
|
|
78
|
+
async purgeTrash(olderThanDays) {
|
|
79
|
+
const maxAgeDays = olderThanDays ?? this.policy.trashRetentionDays;
|
|
80
|
+
const cutoff = Date.now() - maxAgeDays * MS_PER_DAY;
|
|
81
|
+
const objects = await this.inner.listObjects({
|
|
82
|
+
prefix: this.policy.trashPrefix,
|
|
83
|
+
});
|
|
84
|
+
let purged = 0;
|
|
85
|
+
for (const obj of objects) {
|
|
86
|
+
if (obj.key.endsWith(TRASH_META_SUFFIX))
|
|
87
|
+
continue;
|
|
88
|
+
if (obj.lastModified.getTime() >= cutoff)
|
|
89
|
+
continue;
|
|
90
|
+
await this.hardDelete(obj.key);
|
|
91
|
+
await this.bestEffortHardDelete(`${obj.key}${TRASH_META_SUFFIX}`);
|
|
92
|
+
purged++;
|
|
93
|
+
}
|
|
94
|
+
if (purged > 0) {
|
|
95
|
+
this.logger.warn(`[storage-audit] purged ${purged} trashed object(s) older than ${maxAgeDays} day(s)`);
|
|
96
|
+
}
|
|
97
|
+
return purged;
|
|
98
|
+
}
|
|
99
|
+
async moveToTrash(key, reason) {
|
|
100
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
101
|
+
const trashKey = `${this.policy.trashPrefix}${stamp}/${key}`;
|
|
102
|
+
await this.copyObject({ sourceKey: key, destinationKey: trashKey });
|
|
103
|
+
const meta = {
|
|
104
|
+
originalKey: key,
|
|
105
|
+
deletedAt: new Date().toISOString(),
|
|
106
|
+
reason,
|
|
107
|
+
};
|
|
108
|
+
await this.inner.uploadStream(stream_1.Readable.from([JSON.stringify(meta, null, 2)]), {
|
|
109
|
+
key: `${trashKey}${TRASH_META_SUFFIX}`,
|
|
110
|
+
contentType: 'application/json',
|
|
111
|
+
});
|
|
112
|
+
await this.inner.deleteObject({ key });
|
|
113
|
+
this.logger.warn(`[storage-audit] soft-deleted ${key} -> ${trashKey}${reason ? ` (${reason})` : ''}`);
|
|
114
|
+
return trashKey;
|
|
115
|
+
}
|
|
116
|
+
async hardDelete(key) {
|
|
117
|
+
(0, deletion_guard_1.validateKeyStructure)(key);
|
|
118
|
+
const allowed = (0, deletion_guard_1.isWithinAllowedPrefix)(key, this.policy.allowedPrefixes) ||
|
|
119
|
+
key.startsWith(this.policy.trashPrefix);
|
|
120
|
+
if (!allowed) {
|
|
121
|
+
throw new deletion_guard_1.DeletionGuardError('Refusing to hard-delete a key outside protected prefixes', key);
|
|
122
|
+
}
|
|
123
|
+
await this.inner.deleteObject({ key });
|
|
124
|
+
}
|
|
125
|
+
async bestEffortHardDelete(key) {
|
|
126
|
+
try {
|
|
127
|
+
await this.hardDelete(key);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
this.logger.warn(`[storage-audit] could not remove sidecar ${key}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async readTrashMeta(metaKey) {
|
|
134
|
+
try {
|
|
135
|
+
const stream = (await this.inner.downloadStream({
|
|
136
|
+
key: metaKey,
|
|
137
|
+
}));
|
|
138
|
+
const chunks = [];
|
|
139
|
+
for await (const chunk of stream) {
|
|
140
|
+
chunks.push(Buffer.from(chunk));
|
|
141
|
+
}
|
|
142
|
+
return JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async emit(event) {
|
|
149
|
+
if (!this.listener)
|
|
150
|
+
return;
|
|
151
|
+
try {
|
|
152
|
+
await this.listener(event);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
156
|
+
this.logger.warn(`[storage-audit] deletion listener failed: ${message}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.SafeStorageAdapter = SafeStorageAdapter;
|
|
161
|
+
//# sourceMappingURL=safe-storage.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-storage.adapter.js","sourceRoot":"","sources":["../../src/storage/safe-storage.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,11 @@ export interface StorageObject {
|
|
|
20
20
|
}
|
|
21
21
|
export interface DeleteOptions {
|
|
22
22
|
key: string;
|
|
23
|
+
reason?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface CopyOptions {
|
|
26
|
+
sourceKey: string;
|
|
27
|
+
destinationKey: string;
|
|
23
28
|
}
|
|
24
29
|
export interface PresignedUrlOptions {
|
|
25
30
|
key: string;
|
|
@@ -35,4 +40,5 @@ export interface IStorageAdapter {
|
|
|
35
40
|
deleteObject(options: DeleteOptions): Promise<void>;
|
|
36
41
|
generatePresignedUrl(options: PresignedUrlOptions): Promise<string>;
|
|
37
42
|
objectExists(key: string): Promise<boolean>;
|
|
43
|
+
copyObject?(options: CopyOptions): Promise<void>;
|
|
38
44
|
}
|
|
@@ -4,7 +4,10 @@ export declare class StorageService {
|
|
|
4
4
|
private configService;
|
|
5
5
|
private readonly logger;
|
|
6
6
|
private adapter;
|
|
7
|
+
private safeAdapter;
|
|
7
8
|
constructor(configService: DBDockConfigService);
|
|
8
9
|
private initializeAdapter;
|
|
9
10
|
getAdapter(): IStorageAdapter;
|
|
11
|
+
restoreFromTrash(trashKey: string): Promise<string>;
|
|
12
|
+
purgeTrash(olderThanDays?: number): Promise<number>;
|
|
10
13
|
}
|
|
@@ -18,10 +18,13 @@ const s3_adapter_1 = require("./adapters/s3.adapter");
|
|
|
18
18
|
const r2_adapter_1 = require("./adapters/r2.adapter");
|
|
19
19
|
const cloudinary_adapter_1 = require("./adapters/cloudinary.adapter");
|
|
20
20
|
const config_schema_1 = require("../config/config.schema");
|
|
21
|
+
const safe_storage_adapter_1 = require("./safe-storage.adapter");
|
|
22
|
+
const deletion_guard_1 = require("./deletion-guard");
|
|
21
23
|
let StorageService = StorageService_1 = class StorageService {
|
|
22
24
|
configService;
|
|
23
25
|
logger = new common_1.Logger(StorageService_1.name);
|
|
24
26
|
adapter;
|
|
27
|
+
safeAdapter;
|
|
25
28
|
constructor(configService) {
|
|
26
29
|
this.configService = configService;
|
|
27
30
|
this.initializeAdapter();
|
|
@@ -45,7 +48,7 @@ let StorageService = StorageService_1 = class StorageService {
|
|
|
45
48
|
});
|
|
46
49
|
this.logger.log('Initialized S3 storage adapter');
|
|
47
50
|
break;
|
|
48
|
-
case config_schema_1.StorageProvider.R2:
|
|
51
|
+
case config_schema_1.StorageProvider.R2: {
|
|
49
52
|
if (!storageConfig.accessKeyId || !storageConfig.secretAccessKey) {
|
|
50
53
|
throw new Error('R2 credentials are required');
|
|
51
54
|
}
|
|
@@ -75,8 +78,10 @@ let StorageService = StorageService_1 = class StorageService {
|
|
|
75
78
|
});
|
|
76
79
|
this.logger.log('Initialized R2 storage adapter');
|
|
77
80
|
break;
|
|
81
|
+
}
|
|
78
82
|
case config_schema_1.StorageProvider.CLOUDINARY:
|
|
79
|
-
if (!storageConfig.cloudinaryApiKey ||
|
|
83
|
+
if (!storageConfig.cloudinaryApiKey ||
|
|
84
|
+
!storageConfig.cloudinaryApiSecret) {
|
|
80
85
|
throw new Error('Cloudinary credentials are required (cloudinaryApiKey, cloudinaryApiSecret)');
|
|
81
86
|
}
|
|
82
87
|
if (!storageConfig.cloudinaryCloudName) {
|
|
@@ -91,12 +96,22 @@ let StorageService = StorageService_1 = class StorageService {
|
|
|
91
96
|
this.logger.log('Initialized Cloudinary storage adapter');
|
|
92
97
|
break;
|
|
93
98
|
default:
|
|
94
|
-
throw new Error(`Unknown storage provider: ${storageConfig.provider}`);
|
|
99
|
+
throw new Error(`Unknown storage provider: ${String(storageConfig.provider)}`);
|
|
95
100
|
}
|
|
101
|
+
const policy = (0, deletion_guard_1.resolveDeletionGuardPolicy)(storageConfig.deletionSafety);
|
|
102
|
+
this.safeAdapter = new safe_storage_adapter_1.SafeStorageAdapter(this.adapter, policy);
|
|
103
|
+
this.adapter = this.safeAdapter;
|
|
104
|
+
this.logger.log(`Deletion guard active (recycleBin=${policy.recycleBin}, trashRetentionDays=${policy.trashRetentionDays})`);
|
|
96
105
|
}
|
|
97
106
|
getAdapter() {
|
|
98
107
|
return this.adapter;
|
|
99
108
|
}
|
|
109
|
+
async restoreFromTrash(trashKey) {
|
|
110
|
+
return this.safeAdapter.restoreFromTrash(trashKey);
|
|
111
|
+
}
|
|
112
|
+
async purgeTrash(olderThanDays) {
|
|
113
|
+
return this.safeAdapter.purgeTrash(olderThanDays);
|
|
114
|
+
}
|
|
100
115
|
};
|
|
101
116
|
exports.StorageService = StorageService;
|
|
102
117
|
exports.StorageService = StorageService = StorageService_1 = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../../src/storage/storage.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,6DAA+D;AAE/D,4DAA+D;AAC/D,sDAAyD;AACzD,sDAAyD;AACzD,sEAAyE;AACzE,2DAA0D;
|
|
1
|
+
{"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../../src/storage/storage.service.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -4,15 +4,39 @@ exports.DBDockLogger = void 0;
|
|
|
4
4
|
exports.maskCredentials = maskCredentials;
|
|
5
5
|
const common_1 = require("@nestjs/common");
|
|
6
6
|
const SENSITIVE_PATTERNS = [
|
|
7
|
-
{
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
{
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
{
|
|
8
|
+
pattern: /password['":\s]*['"]?([^'"}\s,]+)/gi,
|
|
9
|
+
replacement: 'password: ********',
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
pattern: /secret['":\s]*['"]?([^'"}\s,]+)/gi,
|
|
13
|
+
replacement: 'secret: ********',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
pattern: /accesskey['":\s]*['"]?([^'"}\s,]+)/gi,
|
|
17
|
+
replacement: 'accessKey: ********',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
pattern: /secretkey['":\s]*['"]?([^'"}\s,]+)/gi,
|
|
21
|
+
replacement: 'secretKey: ********',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
pattern: /apikey['":\s]*['"]?([^'"}\s,]+)/gi,
|
|
25
|
+
replacement: 'apiKey: ********',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
pattern: /apisecret['":\s]*['"]?([^'"}\s,]+)/gi,
|
|
29
|
+
replacement: 'apiSecret: ********',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
pattern: /webhook['":\s]*['"]?(https?:\/\/[^'"}\s,]+)/gi,
|
|
33
|
+
replacement: 'webhook: ********',
|
|
34
|
+
},
|
|
14
35
|
{ pattern: /PGPASSWORD=([^\s]+)/gi, replacement: 'PGPASSWORD=********' },
|
|
15
|
-
{
|
|
36
|
+
{
|
|
37
|
+
pattern: /Bearer\s+([A-Za-z0-9\-._~+/]+=*)/gi,
|
|
38
|
+
replacement: 'Bearer ********',
|
|
39
|
+
},
|
|
16
40
|
{ pattern: /Basic\s+([A-Za-z0-9+/]+=*)/gi, replacement: 'Basic ********' },
|
|
17
41
|
];
|
|
18
42
|
function maskCredentials(message) {
|