@tomei/sso 0.66.0 → 0.66.1-test.2
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/.commitlintrc.json +22 -22
- package/.gitlab-ci.yml +237 -16
- package/.husky/commit-msg +15 -15
- package/.husky/pre-commit +7 -7
- package/.prettierrc +4 -4
- package/Jenkinsfile +57 -57
- package/README.md +23 -23
- package/__tests__/unit/components/api-key/api-key.spec.ts +201 -0
- package/__tests__/unit/components/group/group.spec.ts +85 -79
- package/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.ts +88 -88
- package/__tests__/unit/components/group-privilege/group-privilege.spec.ts +68 -68
- package/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.ts +74 -66
- package/__tests__/unit/components/group-system-access/group-system-access.spec.ts +83 -83
- package/__tests__/unit/components/login-user/l.spec.ts +746 -746
- package/__tests__/unit/components/login-user/login.spec.ts +2358 -1164
- package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +31 -31
- package/__tests__/unit/components/system/system.spec.ts +255 -254
- package/__tests__/unit/components/system-privilege/system-privilege.spec.ts +83 -83
- package/__tests__/unit/components/user-group/user-group.spec.ts +86 -86
- package/__tests__/unit/components/user-object-privilege/user-object-privilege.spec.ts +78 -78
- package/__tests__/unit/components/user-password-history/user-password-history.spec.ts +165 -0
- package/__tests__/unit/components/user-privilege/user-privilege.spec.ts +72 -72
- package/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.ts +233 -0
- package/__tests__/unit/components/user-system-access/user-system-access.spec.ts +89 -89
- package/__tests__/unit/redis-client/redis.service.spec.ts +23 -23
- package/__tests__/unit/session/session.service.spec.ts +47 -47
- package/__tests__/unit/system-privilege/system-privilage.spec.ts +91 -91
- package/coverage/cobertura-coverage.xml +6837 -0
- package/coverage/test-report.xml +161 -0
- package/create-sso-user.sql +39 -39
- package/dist/__tests__/unit/components/{group-privilege/group-privilege.test.d.ts → api-key/api-key.spec.d.ts} +1 -1
- package/dist/__tests__/unit/components/api-key/api-key.spec.js +158 -0
- package/dist/__tests__/unit/components/api-key/api-key.spec.js.map +1 -0
- package/dist/__tests__/unit/components/group/group.spec.js +4 -0
- package/dist/__tests__/unit/components/group/group.spec.js.map +1 -1
- package/dist/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.js +9 -1
- package/dist/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.js.map +1 -1
- package/dist/__tests__/unit/components/login-user/login.spec.js +703 -0
- package/dist/__tests__/unit/components/login-user/login.spec.js.map +1 -1
- package/dist/__tests__/unit/components/system/system.spec.js +1 -0
- package/dist/__tests__/unit/components/system/system.spec.js.map +1 -1
- package/dist/__tests__/unit/components/user-password-history/user-password-history.spec.d.ts +1 -0
- package/dist/__tests__/unit/components/user-password-history/user-password-history.spec.js +138 -0
- package/dist/__tests__/unit/components/user-password-history/user-password-history.spec.js.map +1 -0
- package/dist/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.d.ts +1 -0
- package/dist/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.js +182 -0
- package/dist/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.js.map +1 -0
- package/dist/src/components/login-user/login-user.js +64 -63
- package/dist/src/components/login-user/login-user.js.map +1 -1
- package/dist/src/components/login-user/user.d.ts +5 -0
- package/dist/src/components/login-user/user.js +39 -0
- package/dist/src/components/login-user/user.js.map +1 -1
- package/dist/src/components/user-password-history/user-password-history.d.ts +1 -0
- package/dist/src/components/user-password-history/user-password-history.js +41 -2
- package/dist/src/components/user-password-history/user-password-history.js.map +1 -1
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.js +0 -1
- package/dist/src/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/eslint.config.mjs +58 -58
- package/jest.config.js +16 -14
- package/migrations/20240314080602-create-user-table.js +124 -124
- package/migrations/20240314080603-create-user-group-table.js +85 -85
- package/migrations/20240314080604-create-user-user-group-table.js +55 -55
- package/migrations/20240314080605-create-login-history-table.js +53 -53
- package/migrations/20240527064925-create-system-table.js +78 -78
- package/migrations/20240527064926-create-system-privilege-table.js +71 -71
- package/migrations/20240527065342-create-group-table.js +93 -93
- package/migrations/20240527065633-create-group-reporting-user-table.js +76 -76
- package/migrations/20240528011551-create-group-system-access-table.js +72 -72
- package/migrations/20240528023018-user-system-access-table.js +75 -75
- package/migrations/20240528032229-user-privilege-table.js +76 -76
- package/migrations/20240528063003-create-group-privilege-table.js +76 -76
- package/migrations/20240528063051-create-group-object-privilege-table.js +84 -84
- package/migrations/20240528063107-create-user-object-privilege-table.js +84 -84
- package/migrations/20240528063108-create-api-key-table.js +85 -85
- package/migrations/20241104104802-create-building-table.js +95 -95
- package/migrations/20250108091132-add-area-manager-user-id-to-building-table.js +14 -14
- package/migrations/20250108091133-add-passcode-to-user-table.js +36 -36
- package/migrations/20250210115636-create-user-reporting-hierarchy.js +76 -76
- package/migrations/20250326043818-crate-user-password-history.js +42 -42
- package/migrations/20250610070720-added-MFBypassYN-to-sso-user.js +30 -30
- package/migrations/20250805085707-add-bulk-approval-code-to-sso-user.js +29 -0
- package/package.json +87 -90
- package/sampledotenv +7 -7
- package/src/components/login-user/login-user.ts +89 -90
- package/src/components/login-user/user.ts +68 -0
- package/src/components/user-password-history/user-password-history.ts +57 -6
- package/src/index.ts +0 -1
- package/tsconfig.build.json +5 -5
- package/tsconfig.json +23 -23
- package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js +0 -71
- package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js.map +0 -1
- package/dist/__tests__/unit/components/login-user/login-user.spec.d.ts +0 -0
- package/dist/__tests__/unit/components/login-user/login-user.spec.js +0 -6
- package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +0 -1
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/** @type {import('sequelize-cli').Migration} */
|
|
4
|
-
module.exports = {
|
|
5
|
-
async up(queryInterface, Sequelize) {
|
|
6
|
-
await queryInterface.createTable('sso_UserPasswordHistory', {
|
|
7
|
-
HistoryId: {
|
|
8
|
-
type: Sequelize.STRING(30),
|
|
9
|
-
primaryKey: true,
|
|
10
|
-
allowNull: false,
|
|
11
|
-
onUpdate: 'CASCADE',
|
|
12
|
-
onDelete: 'CASCADE',
|
|
13
|
-
},
|
|
14
|
-
UserId: {
|
|
15
|
-
type: Sequelize.INTEGER,
|
|
16
|
-
allowNull: false,
|
|
17
|
-
references: {
|
|
18
|
-
model: 'sso_User',
|
|
19
|
-
key: 'UserId',
|
|
20
|
-
},
|
|
21
|
-
onUpdate: 'CASCADE',
|
|
22
|
-
onDelete: 'CASCADE',
|
|
23
|
-
},
|
|
24
|
-
PasswordHash: {
|
|
25
|
-
type: Sequelize.STRING(225),
|
|
26
|
-
allowNull: false,
|
|
27
|
-
},
|
|
28
|
-
CreatedAt: {
|
|
29
|
-
type: Sequelize.DATE,
|
|
30
|
-
allowNull: false,
|
|
31
|
-
},
|
|
32
|
-
UpdatedAt: {
|
|
33
|
-
type: Sequelize.DATE,
|
|
34
|
-
allowNull: false,
|
|
35
|
-
},
|
|
36
|
-
});
|
|
37
|
-
},
|
|
38
|
-
|
|
39
|
-
async down(queryInterface, Sequelize) {
|
|
40
|
-
await queryInterface.dropTable('sso_UserPasswordHistory');
|
|
41
|
-
},
|
|
42
|
-
};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/** @type {import('sequelize-cli').Migration} */
|
|
4
|
+
module.exports = {
|
|
5
|
+
async up(queryInterface, Sequelize) {
|
|
6
|
+
await queryInterface.createTable('sso_UserPasswordHistory', {
|
|
7
|
+
HistoryId: {
|
|
8
|
+
type: Sequelize.STRING(30),
|
|
9
|
+
primaryKey: true,
|
|
10
|
+
allowNull: false,
|
|
11
|
+
onUpdate: 'CASCADE',
|
|
12
|
+
onDelete: 'CASCADE',
|
|
13
|
+
},
|
|
14
|
+
UserId: {
|
|
15
|
+
type: Sequelize.INTEGER,
|
|
16
|
+
allowNull: false,
|
|
17
|
+
references: {
|
|
18
|
+
model: 'sso_User',
|
|
19
|
+
key: 'UserId',
|
|
20
|
+
},
|
|
21
|
+
onUpdate: 'CASCADE',
|
|
22
|
+
onDelete: 'CASCADE',
|
|
23
|
+
},
|
|
24
|
+
PasswordHash: {
|
|
25
|
+
type: Sequelize.STRING(225),
|
|
26
|
+
allowNull: false,
|
|
27
|
+
},
|
|
28
|
+
CreatedAt: {
|
|
29
|
+
type: Sequelize.DATE,
|
|
30
|
+
allowNull: false,
|
|
31
|
+
},
|
|
32
|
+
UpdatedAt: {
|
|
33
|
+
type: Sequelize.DATE,
|
|
34
|
+
allowNull: false,
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
async down(queryInterface, Sequelize) {
|
|
40
|
+
await queryInterface.dropTable('sso_UserPasswordHistory');
|
|
41
|
+
},
|
|
42
|
+
};
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
module.exports = {
|
|
4
|
-
up: async (queryInterface, Sequelize) => {
|
|
5
|
-
const transaction = await queryInterface.sequelize.transaction();
|
|
6
|
-
try {
|
|
7
|
-
await queryInterface.addColumn('sso_User', 'MFABypassYN', {
|
|
8
|
-
type: Sequelize.CHAR(1),
|
|
9
|
-
allowNull: false,
|
|
10
|
-
defaultValue: 'N',
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
await transaction.commit();
|
|
14
|
-
} catch (error) {
|
|
15
|
-
await transaction.rollback();
|
|
16
|
-
throw error;
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
|
|
20
|
-
down: async (queryInterface, Sequelize) => {
|
|
21
|
-
const transaction = await queryInterface.sequelize.transaction();
|
|
22
|
-
try {
|
|
23
|
-
await queryInterface.removeColumn('sso_User', 'MFABypassYN');
|
|
24
|
-
await transaction.commit();
|
|
25
|
-
} catch (error) {
|
|
26
|
-
await transaction.rollback();
|
|
27
|
-
throw error;
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
up: async (queryInterface, Sequelize) => {
|
|
5
|
+
const transaction = await queryInterface.sequelize.transaction();
|
|
6
|
+
try {
|
|
7
|
+
await queryInterface.addColumn('sso_User', 'MFABypassYN', {
|
|
8
|
+
type: Sequelize.CHAR(1),
|
|
9
|
+
allowNull: false,
|
|
10
|
+
defaultValue: 'N',
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
await transaction.commit();
|
|
14
|
+
} catch (error) {
|
|
15
|
+
await transaction.rollback();
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
down: async (queryInterface, Sequelize) => {
|
|
21
|
+
const transaction = await queryInterface.sequelize.transaction();
|
|
22
|
+
try {
|
|
23
|
+
await queryInterface.removeColumn('sso_User', 'MFABypassYN');
|
|
24
|
+
await transaction.commit();
|
|
25
|
+
} catch (error) {
|
|
26
|
+
await transaction.rollback();
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
up: async (queryInterface, Sequelize) => {
|
|
5
|
+
const transaction = await queryInterface.sequelize.transaction();
|
|
6
|
+
try {
|
|
7
|
+
await queryInterface.addColumn('sso_User', 'BulkApprovalCode', {
|
|
8
|
+
type: Sequelize.STRING(100),
|
|
9
|
+
allowNull: true,
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
await transaction.commit();
|
|
13
|
+
} catch (error) {
|
|
14
|
+
await transaction.rollback();
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
down: async (queryInterface, Sequelize) => {
|
|
20
|
+
const transaction = await queryInterface.sequelize.transaction();
|
|
21
|
+
try {
|
|
22
|
+
await queryInterface.removeColumn('sso_User', 'BulkApprovalCode');
|
|
23
|
+
await transaction.commit();
|
|
24
|
+
} catch (error) {
|
|
25
|
+
await transaction.rollback();
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
};
|
package/package.json
CHANGED
|
@@ -1,90 +1,87 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@tomei/sso",
|
|
3
|
-
"version": "0.66.
|
|
4
|
-
"description": "Tomei SSO Package",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"start:dev": "tsc -w",
|
|
8
|
-
"build": "tsc",
|
|
9
|
-
"prepare": "husky",
|
|
10
|
-
"format": "prettier --write \"src/**/*.ts\"",
|
|
11
|
-
"lint": "npx eslint . --fix",
|
|
12
|
-
"test": "jest --forceExit --detectOpenHandles --coverage"
|
|
13
|
-
},
|
|
14
|
-
"repository": {
|
|
15
|
-
"type": "git",
|
|
16
|
-
"url": "git+ssh://git@gitlab.com/tomei-package/sso.git"
|
|
17
|
-
},
|
|
18
|
-
"keywords": [
|
|
19
|
-
"tomei",
|
|
20
|
-
"sso"
|
|
21
|
-
],
|
|
22
|
-
"author": "Tomei",
|
|
23
|
-
"license": "ISC",
|
|
24
|
-
"bugs": {
|
|
25
|
-
"url": "https://gitlab.com/tomei-package/sso/issues"
|
|
26
|
-
},
|
|
27
|
-
"homepage": "https://gitlab.com/tomei-package/sso#readme",
|
|
28
|
-
"devDependencies": {
|
|
29
|
-
"@commitlint/cli": "^19.8.1",
|
|
30
|
-
"@commitlint/config-conventional": "^19.8.1",
|
|
31
|
-
"@eslint/js": "^9.35.0",
|
|
32
|
-
"@tsconfig/node18": "^18.2.4",
|
|
33
|
-
"@types/bcrypt": "^6.0.0",
|
|
34
|
-
"@types/jest": "^30.0.0",
|
|
35
|
-
"@types/node": "^24.5.2",
|
|
36
|
-
"@types/validator": "^13.15.3",
|
|
37
|
-
"@typescript-eslint/eslint-plugin": "^8.44.0",
|
|
38
|
-
"@typescript-eslint/parser": "^8.44.0",
|
|
39
|
-
"cls-hooked": "^4.2.2",
|
|
40
|
-
"dotenv": "^17.2.2",
|
|
41
|
-
"eslint": "^9.35.0",
|
|
42
|
-
"eslint-config-prettier": "^10.1.8",
|
|
43
|
-
"eslint-plugin-import": "^2.32.0",
|
|
44
|
-
"eslint-plugin-prettier": "^5.5.4",
|
|
45
|
-
"globals": "^16.4.0",
|
|
46
|
-
"husky": "^9.1.7",
|
|
47
|
-
"jest": "^30.1.3",
|
|
48
|
-
"jest-mock-extended": "^4.0.0",
|
|
49
|
-
"jest-sonar-reporter": "^2.0.0",
|
|
50
|
-
"lint-staged": "^16.1.6",
|
|
51
|
-
"prettier": "^3.6.2",
|
|
52
|
-
"redis-mock": "^0.56.3",
|
|
53
|
-
"ts-jest": "^29.4.3",
|
|
54
|
-
"ts-node": "^10.9.2",
|
|
55
|
-
"tsc-watch": "^7.1.1",
|
|
56
|
-
"tsconfig-paths": "^4.2.0",
|
|
57
|
-
"typescript": "^5.9.2"
|
|
58
|
-
},
|
|
59
|
-
"publishConfig": {
|
|
60
|
-
"access": "public"
|
|
61
|
-
},
|
|
62
|
-
"peerDependencies": {
|
|
63
|
-
"@tomei/activity-history": "^0.4.4",
|
|
64
|
-
"@tomei/config": "^0.3.22",
|
|
65
|
-
"@tomei/general": "^0.21.10",
|
|
66
|
-
"@tomei/mailer": "^0.6.2",
|
|
67
|
-
"argon2": "^0.44.0",
|
|
68
|
-
"redis": "^5.8.2",
|
|
69
|
-
"reflect-metadata": "^0.2.2",
|
|
70
|
-
"sequelize": "^6.37.7",
|
|
71
|
-
"sequelize-cli": "^6.6.3",
|
|
72
|
-
"sequelize-typescript": "^2.1.6",
|
|
73
|
-
"speakeasy": "^2.0.0",
|
|
74
|
-
"uuid": "^11.1.0"
|
|
75
|
-
},
|
|
76
|
-
"lint-staged": {
|
|
77
|
-
"*/**/*.{js,ts,tsx}": [
|
|
78
|
-
"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
79
|
-
"eslint \"{src,apps,libs,test}/**/*.ts\" --fix"
|
|
80
|
-
]
|
|
81
|
-
},
|
|
82
|
-
"jestSonar": {
|
|
83
|
-
"reportPath": "coverage",
|
|
84
|
-
"reportFile": "test-report.xml",
|
|
85
|
-
"indent": 2
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
"axios": "^1.13.2"
|
|
89
|
-
}
|
|
90
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@tomei/sso",
|
|
3
|
+
"version": "0.66.1-test.2",
|
|
4
|
+
"description": "Tomei SSO Package",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"start:dev": "tsc -w",
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"prepare": "husky install || true",
|
|
10
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
11
|
+
"lint": "npx eslint . --fix",
|
|
12
|
+
"test": "jest --forceExit --detectOpenHandles --coverage"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+ssh://git@gitlab.com/tomei-package/sso.git"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"tomei",
|
|
20
|
+
"sso"
|
|
21
|
+
],
|
|
22
|
+
"author": "Tomei",
|
|
23
|
+
"license": "ISC",
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://gitlab.com/tomei-package/sso/issues"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://gitlab.com/tomei-package/sso#readme",
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@commitlint/cli": "^19.8.1",
|
|
30
|
+
"@commitlint/config-conventional": "^19.8.1",
|
|
31
|
+
"@eslint/js": "^9.35.0",
|
|
32
|
+
"@tsconfig/node18": "^18.2.4",
|
|
33
|
+
"@types/bcrypt": "^6.0.0",
|
|
34
|
+
"@types/jest": "^30.0.0",
|
|
35
|
+
"@types/node": "^24.5.2",
|
|
36
|
+
"@types/validator": "^13.15.3",
|
|
37
|
+
"@typescript-eslint/eslint-plugin": "^8.44.0",
|
|
38
|
+
"@typescript-eslint/parser": "^8.44.0",
|
|
39
|
+
"cls-hooked": "^4.2.2",
|
|
40
|
+
"dotenv": "^17.2.2",
|
|
41
|
+
"eslint": "^9.35.0",
|
|
42
|
+
"eslint-config-prettier": "^10.1.8",
|
|
43
|
+
"eslint-plugin-import": "^2.32.0",
|
|
44
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
45
|
+
"globals": "^16.4.0",
|
|
46
|
+
"husky": "^9.1.7",
|
|
47
|
+
"jest": "^30.1.3",
|
|
48
|
+
"jest-mock-extended": "^4.0.0",
|
|
49
|
+
"jest-sonar-reporter": "^2.0.0",
|
|
50
|
+
"lint-staged": "^16.1.6",
|
|
51
|
+
"prettier": "^3.6.2",
|
|
52
|
+
"redis-mock": "^0.56.3",
|
|
53
|
+
"ts-jest": "^29.4.3",
|
|
54
|
+
"ts-node": "^10.9.2",
|
|
55
|
+
"tsc-watch": "^7.1.1",
|
|
56
|
+
"tsconfig-paths": "^4.2.0",
|
|
57
|
+
"typescript": "^5.9.2"
|
|
58
|
+
},
|
|
59
|
+
"publishConfig": {
|
|
60
|
+
"access": "public"
|
|
61
|
+
},
|
|
62
|
+
"peerDependencies": {
|
|
63
|
+
"@tomei/activity-history": "^0.4.4",
|
|
64
|
+
"@tomei/config": "^0.3.22",
|
|
65
|
+
"@tomei/general": "^0.21.10",
|
|
66
|
+
"@tomei/mailer": "^0.6.2",
|
|
67
|
+
"argon2": "^0.44.0",
|
|
68
|
+
"redis": "^5.8.2",
|
|
69
|
+
"reflect-metadata": "^0.2.2",
|
|
70
|
+
"sequelize": "^6.37.7",
|
|
71
|
+
"sequelize-cli": "^6.6.3",
|
|
72
|
+
"sequelize-typescript": "^2.1.6",
|
|
73
|
+
"speakeasy": "^2.0.0",
|
|
74
|
+
"uuid": "^11.1.0"
|
|
75
|
+
},
|
|
76
|
+
"lint-staged": {
|
|
77
|
+
"*/**/*.{js,ts,tsx}": [
|
|
78
|
+
"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
79
|
+
"eslint \"{src,apps,libs,test}/**/*.ts\" --fix"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
"jestSonar": {
|
|
83
|
+
"reportPath": "coverage",
|
|
84
|
+
"reportFile": "test-report.xml",
|
|
85
|
+
"indent": 2
|
|
86
|
+
}
|
|
87
|
+
}
|
package/sampledotenv
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
DATABASE_URL=
|
|
2
|
-
SHADOW_DATABASE_URL=
|
|
3
|
-
REDIS_URL=
|
|
4
|
-
REDIS_PASSWORD=
|
|
5
|
-
SMTP_HOST=
|
|
6
|
-
SMTP_PORT=
|
|
7
|
-
EMAIL_SENDER=
|
|
1
|
+
DATABASE_URL=
|
|
2
|
+
SHADOW_DATABASE_URL=
|
|
3
|
+
REDIS_URL=
|
|
4
|
+
REDIS_PASSWORD=
|
|
5
|
+
SMTP_HOST=
|
|
6
|
+
SMTP_PORT=
|
|
7
|
+
EMAIL_SENDER=
|
|
8
8
|
EMAIL_PASSWORD=
|
|
@@ -12,8 +12,7 @@ import { createHash, randomBytes, randomUUID } from 'crypto';
|
|
|
12
12
|
import { UserGroupRepository } from '../user-group/user-group.repository';
|
|
13
13
|
import GroupSystemAccessModel from '../../models/group-system-access.entity';
|
|
14
14
|
import SystemModel from '../../models/system.entity';
|
|
15
|
-
import { ApplicationConfig
|
|
16
|
-
import axios from 'axios';
|
|
15
|
+
import { ApplicationConfig } from '@tomei/config';
|
|
17
16
|
|
|
18
17
|
export class LoginUser extends User implements ILoginUser {
|
|
19
18
|
session = {
|
|
@@ -27,24 +26,20 @@ export class LoginUser extends User implements ILoginUser {
|
|
|
27
26
|
): Promise<LoginUser> {
|
|
28
27
|
User._RedisService = await RedisService.init();
|
|
29
28
|
if (userId) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const { data } = await axios.post(
|
|
38
|
-
`${loginApiEndpoint.baseUrl}${loginApiEndpoint.getProfile}`,
|
|
39
|
-
payload,
|
|
40
|
-
{
|
|
41
|
-
headers: {
|
|
42
|
-
'Content-Type': 'application/json',
|
|
43
|
-
'x-api-key': loginApiEndpoint.apiKey,
|
|
44
|
-
},
|
|
29
|
+
if (dbTransaction) {
|
|
30
|
+
User._Repository = new UserRepository();
|
|
31
|
+
}
|
|
32
|
+
const user = await User._Repository.findOne({
|
|
33
|
+
where: {
|
|
34
|
+
UserId: userId,
|
|
45
35
|
},
|
|
46
|
-
|
|
47
|
-
|
|
36
|
+
include: [
|
|
37
|
+
{
|
|
38
|
+
model: Staff,
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
transaction: dbTransaction,
|
|
42
|
+
});
|
|
48
43
|
|
|
49
44
|
if (!user) {
|
|
50
45
|
throw new Error('Invalid credentials.');
|
|
@@ -59,21 +54,21 @@ export class LoginUser extends User implements ILoginUser {
|
|
|
59
54
|
IDType: user?.IdType || null,
|
|
60
55
|
ContactNo: user?.ContactNo || null,
|
|
61
56
|
Email: user.Email,
|
|
62
|
-
Password:
|
|
57
|
+
Password: user.Password,
|
|
63
58
|
Status: user.Status,
|
|
64
|
-
DefaultPasswordChangedYN:
|
|
65
|
-
FirstLoginAt:
|
|
66
|
-
LastLoginAt:
|
|
67
|
-
MFAEnabled:
|
|
68
|
-
MFAConfig:
|
|
69
|
-
MFABypassYN:
|
|
70
|
-
RecoveryEmail:
|
|
71
|
-
FailedLoginAttemptCount:
|
|
72
|
-
LastFailedLoginAt:
|
|
73
|
-
LastPasswordChangedAt:
|
|
74
|
-
NeedToChangePasswordYN:
|
|
75
|
-
PasscodeHash:
|
|
76
|
-
PasscodeUpdatedAt:
|
|
59
|
+
DefaultPasswordChangedYN: user.DefaultPasswordChangedYN,
|
|
60
|
+
FirstLoginAt: user.FirstLoginAt,
|
|
61
|
+
LastLoginAt: user.LastLoginAt,
|
|
62
|
+
MFAEnabled: user.MFAEnabled,
|
|
63
|
+
MFAConfig: user.MFAConfig,
|
|
64
|
+
MFABypassYN: user.MFABypassYN,
|
|
65
|
+
RecoveryEmail: user.RecoveryEmail,
|
|
66
|
+
FailedLoginAttemptCount: user.FailedLoginAttemptCount,
|
|
67
|
+
LastFailedLoginAt: user.LastFailedLoginAt,
|
|
68
|
+
LastPasswordChangedAt: user.LastPasswordChangedAt,
|
|
69
|
+
NeedToChangePasswordYN: user.NeedToChangePasswordYN,
|
|
70
|
+
PasscodeHash: user.PasscodeHash,
|
|
71
|
+
PasscodeUpdatedAt: user.PasscodeUpdatedAt,
|
|
77
72
|
CreatedById: user.CreatedById,
|
|
78
73
|
CreatedAt: user.CreatedAt,
|
|
79
74
|
UpdatedById: user.UpdatedById,
|
|
@@ -104,28 +99,21 @@ export class LoginUser extends User implements ILoginUser {
|
|
|
104
99
|
throw new Error('Session name is not set');
|
|
105
100
|
}
|
|
106
101
|
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
102
|
+
const userSession = await this._SessionService.retrieveUserSession(
|
|
103
|
+
this.ObjectId,
|
|
104
|
+
sessionName,
|
|
110
105
|
);
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
PrivilegeName: privilegeName,
|
|
115
|
-
UserId: this.ObjectId,
|
|
116
|
-
};
|
|
117
|
-
const { data } = await axios.post(
|
|
118
|
-
`${loginApiEndpoint.baseUrl}${loginApiEndpoint.checkPrivileges}`,
|
|
119
|
-
payload,
|
|
120
|
-
{
|
|
121
|
-
headers: {
|
|
122
|
-
'Content-Type': 'application/json',
|
|
123
|
-
'x-api-key': loginApiEndpoint.apiKey,
|
|
124
|
-
},
|
|
125
|
-
},
|
|
106
|
+
|
|
107
|
+
const systemLogin = userSession.systemLogins.find(
|
|
108
|
+
(system) => system.code === systemCode,
|
|
126
109
|
);
|
|
127
|
-
const hasPrivilege = data.hasPrivilege;
|
|
128
110
|
|
|
111
|
+
if (!systemLogin) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const privileges = systemLogin.privileges;
|
|
116
|
+
const hasPrivilege = privileges.includes(privilegeName);
|
|
129
117
|
return hasPrivilege;
|
|
130
118
|
} catch (error) {
|
|
131
119
|
throw error;
|
|
@@ -143,27 +131,28 @@ export class LoginUser extends User implements ILoginUser {
|
|
|
143
131
|
if (!sessionName) {
|
|
144
132
|
throw new Error('Session name is not set');
|
|
145
133
|
}
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
|
|
134
|
+
const userSession = await this._SessionService.retrieveUserSession(
|
|
135
|
+
userId,
|
|
136
|
+
sessionName,
|
|
149
137
|
);
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
`${loginApiEndpoint.baseUrl}${loginApiEndpoint.checkSession}`,
|
|
158
|
-
payload,
|
|
159
|
-
{
|
|
160
|
-
headers: {
|
|
161
|
-
'Content-Type': 'application/json',
|
|
162
|
-
'x-api-key': loginApiEndpoint.apiKey,
|
|
163
|
-
},
|
|
164
|
-
},
|
|
138
|
+
|
|
139
|
+
if (userSession.systemLogins.length === 0) {
|
|
140
|
+
throw new Error('Session expired.');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const systemLogin = userSession.systemLogins.find(
|
|
144
|
+
(sl) => sl.code === systemCode,
|
|
165
145
|
);
|
|
166
|
-
|
|
146
|
+
|
|
147
|
+
if (!systemLogin) {
|
|
148
|
+
throw new Error('Session expired.');
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (systemLogin.sessionId !== sessionId) {
|
|
152
|
+
throw new Error('Session expired.');
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
await this._SessionService.refreshDuration(userId, sessionName);
|
|
167
156
|
|
|
168
157
|
return systemLogin;
|
|
169
158
|
} catch (error) {
|
|
@@ -339,26 +328,36 @@ export class LoginUser extends User implements ILoginUser {
|
|
|
339
328
|
throw new Error('Session name is not set in the configuration');
|
|
340
329
|
}
|
|
341
330
|
|
|
342
|
-
const
|
|
343
|
-
|
|
344
|
-
|
|
331
|
+
const userSession = await this._SessionService.retrieveUserSession(
|
|
332
|
+
this.ObjectId,
|
|
333
|
+
sessionName,
|
|
345
334
|
);
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
335
|
+
const systemLogin = userSession.systemLogins.find(
|
|
336
|
+
(system) => system.code === systemCode,
|
|
337
|
+
);
|
|
338
|
+
|
|
339
|
+
if (systemLogin) {
|
|
340
|
+
const privileges = await this.getPrivileges(systemCode, dbTransaction);
|
|
341
|
+
systemLogin.sessionId = sessionId;
|
|
342
|
+
systemLogin.privileges = privileges;
|
|
343
|
+
userSession.systemLogins.map((system) =>
|
|
344
|
+
system.code === systemCode ? systemLogin : system,
|
|
345
|
+
);
|
|
346
|
+
} else {
|
|
347
|
+
// if not, add new system login into the userSession
|
|
348
|
+
const newLogin = {
|
|
349
|
+
id: systemCode,
|
|
350
|
+
code: systemCode,
|
|
351
|
+
sessionId: sessionId,
|
|
352
|
+
privileges: await this.getPrivileges(systemCode, dbTransaction),
|
|
353
|
+
};
|
|
354
|
+
userSession.systemLogins.push(newLogin);
|
|
355
|
+
}
|
|
356
|
+
// then update userSession inside the redis storage with 1 day duration of time-to-live
|
|
357
|
+
this._SessionService.setUserSession(
|
|
358
|
+
this.ObjectId,
|
|
359
|
+
userSession,
|
|
360
|
+
sessionName,
|
|
362
361
|
);
|
|
363
362
|
}
|
|
364
363
|
}
|