@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.
- package/dist/lib/entities/user.d.ts +4 -0
- package/dist/lib/entities/user.d.ts.map +1 -1
- package/dist/lib/entities/user.js.map +1 -1
- package/dist/lib/util/crypto.d.ts +3 -0
- package/dist/lib/util/crypto.d.ts.map +1 -0
- package/dist/lib/util/crypto.js +30 -0
- package/dist/lib/util/crypto.js.map +1 -0
- package/lib/entities/user.ts +7 -0
- package/lib/util/crypto.ts +30 -0
- package/package.json +1 -1
|
@@ -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;
|
|
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 @@
|
|
|
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"}
|
package/lib/entities/user.ts
CHANGED
|
@@ -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
|
+
}
|