@volcanicminds/typeorm 2.1.1 → 2.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.
@@ -17,6 +17,10 @@ export declare abstract class User extends BaseEntity {
17
17
  abstract createdAt: Date;
18
18
  abstract updatedAt: Date;
19
19
  abstract deletedAt: Date;
20
+ abstract mfaEnabled: boolean;
21
+ abstract mfaSecret: string;
22
+ abstract mfaType: string;
23
+ abstract mfaRecoveryCodes: string[];
20
24
  abstract setId(id: any): any;
21
25
  abstract getId(): any;
22
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../lib/entities/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,8BAAsB,IAAK,SAAQ,UAAU;IAE3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAA;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;IACxB,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG;IACtB,QAAQ,CAAC,KAAK,IAAI,GAAG;CACtB"}
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../lib/entities/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,8BAAsB,IAAK,SAAQ,UAAU;IAE3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAA;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;IACxB,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;IAGxB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAEnC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG;IACtB,QAAQ,CAAC,KAAK,IAAI,GAAG;CACtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"user.js","sourceRoot":"","sources":["../../../lib/entities/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,MAAM,OAAgB,IAAK,SAAQ,UAAU;CAqB5C"}
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../../lib/entities/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,MAAM,OAAgB,IAAK,SAAQ,UAAU;CA4B5C"}
@@ -0,0 +1,3 @@
1
+ export declare function encrypt(text: string): string;
2
+ export declare function decrypt(text: string): string;
3
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../lib/util/crypto.ts"],"names":[],"mappings":"AAUA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO5C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU5C"}
@@ -0,0 +1,30 @@
1
+ import * as crypto from 'crypto';
2
+ const ALGORITHM = 'aes-256-cbc';
3
+ const SECRET_KEY = process.env.MFA_DB_SECRET || process.env.JWT_SECRET || 'default_secret_must_be_changed_32b';
4
+ const IV_LENGTH = 16;
5
+ function getKey() {
6
+ return crypto.createHash('sha256').update(String(SECRET_KEY)).digest('base64').substr(0, 32);
7
+ }
8
+ export function encrypt(text) {
9
+ if (!text)
10
+ return text;
11
+ const iv = crypto.randomBytes(IV_LENGTH);
12
+ const cipher = crypto.createCipheriv(ALGORITHM, Buffer.from(getKey()), iv);
13
+ let encrypted = cipher.update(text);
14
+ encrypted = Buffer.concat([encrypted, cipher.final()]);
15
+ return iv.toString('hex') + ':' + encrypted.toString('hex');
16
+ }
17
+ export function decrypt(text) {
18
+ if (!text)
19
+ return text;
20
+ const textParts = text.split(':');
21
+ if (textParts.length < 2)
22
+ return text;
23
+ const iv = Buffer.from(textParts.shift(), 'hex');
24
+ const encryptedText = Buffer.from(textParts.join(':'), 'hex');
25
+ const decipher = crypto.createDecipheriv(ALGORITHM, Buffer.from(getKey()), iv);
26
+ let decrypted = decipher.update(encryptedText);
27
+ decrypted = Buffer.concat([decrypted, decipher.final()]);
28
+ return decrypted.toString();
29
+ }
30
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../lib/util/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAEhC,MAAM,SAAS,GAAG,aAAa,CAAA;AAC/B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,oCAAoC,CAAA;AAC9G,MAAM,SAAS,GAAG,EAAE,CAAA;AAEpB,SAAS,MAAM;IACb,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAC9F,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAC1E,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACnC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACtD,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACjC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IACrC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAG,EAAE,KAAK,CAAC,CAAA;IACjD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;IAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAC9E,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IAC9C,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACxD,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAA;AAC7B,CAAC"}
@@ -19,6 +19,13 @@ export abstract class User extends BaseEntity {
19
19
  abstract createdAt: Date
20
20
  abstract updatedAt: Date
21
21
  abstract deletedAt: Date
22
+
23
+ // MFA Fields
24
+ abstract mfaEnabled: boolean
25
+ abstract mfaSecret: string
26
+ abstract mfaType: string
27
+ abstract mfaRecoveryCodes: string[]
28
+
22
29
  abstract setId(id: any)
23
30
  abstract getId(): any
24
31
  }
@@ -0,0 +1,30 @@
1
+ import * as crypto from 'crypto'
2
+
3
+ const ALGORITHM = 'aes-256-cbc'
4
+ const SECRET_KEY = process.env.MFA_DB_SECRET || process.env.JWT_SECRET || 'default_secret_must_be_changed_32b'
5
+ const IV_LENGTH = 16
6
+
7
+ function getKey() {
8
+ return crypto.createHash('sha256').update(String(SECRET_KEY)).digest('base64').substr(0, 32)
9
+ }
10
+
11
+ export function encrypt(text: string): string {
12
+ if (!text) return text
13
+ const iv = crypto.randomBytes(IV_LENGTH)
14
+ const cipher = crypto.createCipheriv(ALGORITHM, Buffer.from(getKey()), iv)
15
+ let encrypted = cipher.update(text)
16
+ encrypted = Buffer.concat([encrypted, cipher.final()])
17
+ return iv.toString('hex') + ':' + encrypted.toString('hex')
18
+ }
19
+
20
+ export function decrypt(text: string): string {
21
+ if (!text) return text
22
+ const textParts = text.split(':')
23
+ if (textParts.length < 2) return text // Return as is if not encrypted properly
24
+ const iv = Buffer.from(textParts.shift()!, 'hex')
25
+ const encryptedText = Buffer.from(textParts.join(':'), 'hex')
26
+ const decipher = crypto.createDecipheriv(ALGORITHM, Buffer.from(getKey()), iv)
27
+ let decrypted = decipher.update(encryptedText)
28
+ decrypted = Buffer.concat([decrypted, decipher.final()])
29
+ return decrypted.toString()
30
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volcanicminds/typeorm",
3
- "version": "2.1.1",
3
+ "version": "2.2.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "TypeORM for the volcanic (minds) backend",