dbgate-api-premium 5.5.7-alpha.45

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 (125) hide show
  1. package/.env +19 -0
  2. package/.yarnrc +2 -0
  3. package/README.md +1 -0
  4. package/env/dblogin/.env +14 -0
  5. package/env/portal/.env +70 -0
  6. package/env/singledb/.env +17 -0
  7. package/env/storage/.env +43 -0
  8. package/package.json +89 -0
  9. package/src/auth/authCommon.js +16 -0
  10. package/src/auth/authProvider.js +343 -0
  11. package/src/auth/storageAuthProvider.js +393 -0
  12. package/src/controllers/apps.js +280 -0
  13. package/src/controllers/archive.js +217 -0
  14. package/src/controllers/auth.js +136 -0
  15. package/src/controllers/config.js +271 -0
  16. package/src/controllers/connections.js +486 -0
  17. package/src/controllers/databaseConnections.js +561 -0
  18. package/src/controllers/files.js +222 -0
  19. package/src/controllers/jsldata.js +296 -0
  20. package/src/controllers/metadata.js +47 -0
  21. package/src/controllers/plugins.js +216 -0
  22. package/src/controllers/queryHistory.js +54 -0
  23. package/src/controllers/runners.js +234 -0
  24. package/src/controllers/scheduler.js +46 -0
  25. package/src/controllers/serverConnections.js +271 -0
  26. package/src/controllers/sessions.js +243 -0
  27. package/src/controllers/storage.js +380 -0
  28. package/src/controllers/storageDb.js +215 -0
  29. package/src/controllers/uploads.js +133 -0
  30. package/src/currentVersion.js +5 -0
  31. package/src/gistSecret.js +2 -0
  32. package/src/index.js +139 -0
  33. package/src/main.js +202 -0
  34. package/src/packagedPluginsContent.js +1 -0
  35. package/src/proc/connectProcess.js +38 -0
  36. package/src/proc/databaseConnectionProcess.js +431 -0
  37. package/src/proc/index.js +15 -0
  38. package/src/proc/jslDatastoreProcess.js +60 -0
  39. package/src/proc/serverConnectionProcess.js +188 -0
  40. package/src/proc/sessionProcess.js +390 -0
  41. package/src/proc/sshForwardProcess.js +75 -0
  42. package/src/shell/archiveReader.js +11 -0
  43. package/src/shell/archiveWriter.js +22 -0
  44. package/src/shell/autoIndexForeignKeysTransform.js +19 -0
  45. package/src/shell/collectorWriter.js +33 -0
  46. package/src/shell/consoleObjectWriter.js +16 -0
  47. package/src/shell/copyStream.js +48 -0
  48. package/src/shell/dataDuplicator.js +63 -0
  49. package/src/shell/dataTypeMapperTransform.js +21 -0
  50. package/src/shell/dbModelToJson.js +16 -0
  51. package/src/shell/deployDb.js +56 -0
  52. package/src/shell/download.js +15 -0
  53. package/src/shell/dropAllDbObjects.js +42 -0
  54. package/src/shell/dumpDatabase.js +49 -0
  55. package/src/shell/executeQuery.js +39 -0
  56. package/src/shell/fakeObjectReader.js +35 -0
  57. package/src/shell/finalizer.js +12 -0
  58. package/src/shell/generateDeploySql.js +95 -0
  59. package/src/shell/generateModelSql.js +30 -0
  60. package/src/shell/importDatabase.js +85 -0
  61. package/src/shell/index.js +80 -0
  62. package/src/shell/initializeApiEnvironment.js +9 -0
  63. package/src/shell/jslDataReader.js +9 -0
  64. package/src/shell/jsonLinesReader.js +52 -0
  65. package/src/shell/jsonLinesWriter.js +36 -0
  66. package/src/shell/jsonReader.js +84 -0
  67. package/src/shell/jsonToDbModel.js +9 -0
  68. package/src/shell/jsonWriter.js +97 -0
  69. package/src/shell/loadDatabase.js +27 -0
  70. package/src/shell/loadFile.js +10 -0
  71. package/src/shell/modifyJsonLinesReader.js +148 -0
  72. package/src/shell/queryReader.js +30 -0
  73. package/src/shell/registerPlugins.js +9 -0
  74. package/src/shell/requirePlugin.js +43 -0
  75. package/src/shell/runScript.js +19 -0
  76. package/src/shell/sqlDataWriter.js +52 -0
  77. package/src/shell/sqlTextReplacementTransform.js +32 -0
  78. package/src/shell/tableReader.js +39 -0
  79. package/src/shell/tableWriter.js +18 -0
  80. package/src/storageModel.js +819 -0
  81. package/src/utility/ColumnMapTransformStream.js +21 -0
  82. package/src/utility/DatastoreProxy.js +106 -0
  83. package/src/utility/EnsureStreamHeaderStream.js +31 -0
  84. package/src/utility/JsonLinesDatabase.js +148 -0
  85. package/src/utility/JsonLinesDatastore.js +232 -0
  86. package/src/utility/LineReader.js +88 -0
  87. package/src/utility/SSHConnection.js +251 -0
  88. package/src/utility/authProxy.js +133 -0
  89. package/src/utility/checkLicense.js +186 -0
  90. package/src/utility/childProcessChecker.js +21 -0
  91. package/src/utility/cleanDirectory.js +24 -0
  92. package/src/utility/cloudUpgrade.js +61 -0
  93. package/src/utility/connectUtility.js +111 -0
  94. package/src/utility/crypting.js +105 -0
  95. package/src/utility/diff2htmlPage.js +8 -0
  96. package/src/utility/directories.js +179 -0
  97. package/src/utility/downloadPackage.js +51 -0
  98. package/src/utility/downloader.js +25 -0
  99. package/src/utility/exceptions.js +9 -0
  100. package/src/utility/exportDbModel.js +31 -0
  101. package/src/utility/exportDbModelSql.js +80 -0
  102. package/src/utility/getChartExport.js +55 -0
  103. package/src/utility/getDiagramExport.js +25 -0
  104. package/src/utility/getExpressPath.js +10 -0
  105. package/src/utility/getJslFileName.js +16 -0
  106. package/src/utility/getMapExport.js +77 -0
  107. package/src/utility/hardwareFingerprint.js +89 -0
  108. package/src/utility/hasPermission.js +101 -0
  109. package/src/utility/importDbModel.js +9 -0
  110. package/src/utility/loadFilesRecursive.js +20 -0
  111. package/src/utility/loadModelFolder.js +29 -0
  112. package/src/utility/loadModelTransform.js +36 -0
  113. package/src/utility/pipeForkLogs.js +19 -0
  114. package/src/utility/platformInfo.js +62 -0
  115. package/src/utility/processArgs.js +39 -0
  116. package/src/utility/processComm.js +18 -0
  117. package/src/utility/requireEngineDriver.js +26 -0
  118. package/src/utility/requirePluginFunction.js +16 -0
  119. package/src/utility/socket.js +68 -0
  120. package/src/utility/sshTunnel.js +106 -0
  121. package/src/utility/sshTunnelProxy.js +36 -0
  122. package/src/utility/timingSafeCheckToken.js +9 -0
  123. package/src/utility/useController.js +99 -0
  124. package/tsconfig.json +13 -0
  125. package/webpack.config.js +55 -0
package/.env ADDED
@@ -0,0 +1,19 @@
1
+ DEVMODE=1
2
+ SHELL_SCRIPTING=1
3
+
4
+ CLOUD_UPGRADE_FILE=c:\test\upg\upgrade.zip
5
+
6
+ # PERMISSIONS=~widgets/app,~widgets/plugins
7
+ # DISABLE_SHELL=1
8
+ # HIDE_APP_EDITOR=1
9
+
10
+
11
+ # DEVWEB=1
12
+ # LOGINS=admin,test
13
+
14
+ # LOGIN_PASSWORD_admin=admin
15
+ # LOGIN_PERMISSIONS_admin=*
16
+
17
+ # LOGIN_PASSWORD_test=test
18
+ # LOGIN_PERMISSIONS_test=~*, widgets/database
19
+ # WORKSPACE_DIR=/home/jena/dbgate-data-2
package/.yarnrc ADDED
@@ -0,0 +1,2 @@
1
+ version-tag-prefix packages-api-v
2
+ version-git-message "packages-api v%s"
package/README.md ADDED
@@ -0,0 +1 @@
1
+ This package is used internally by DbGate Premium
@@ -0,0 +1,14 @@
1
+ DEVMODE=1
2
+
3
+ CONNECTIONS=mysql
4
+ SINGLE_CONNECTION=mysql
5
+ # SINGLE_DATABASE=Chinook
6
+
7
+ LABEL_mysql=MySql localhost
8
+ SERVER_mysql=localhost
9
+ # USER_mysql=root
10
+ PORT_mysql=3306
11
+ # PASSWORD_mysql=Pwd2020Db
12
+ ENGINE_mysql=mysql@dbgate-plugin-mysql
13
+ # PASSWORD_MODE_mysql=askPassword
14
+ PASSWORD_MODE_mysql=askUser
@@ -0,0 +1,70 @@
1
+ DEVMODE=1
2
+
3
+ CONNECTIONS=mysql,postgres,postgres1,mongo,mongo2,mysqlssh,sqlite,relational
4
+
5
+ LABEL_mysql=MySql localhost
6
+ SERVER_mysql=localhost
7
+ USER_mysql=root
8
+ PASSWORD_mysql=test
9
+ PORT_mysql=3307
10
+ ENGINE_mysql=mysql@dbgate-plugin-mysql
11
+
12
+ LABEL_postgres=Postgres localhost
13
+ SERVER_postgres=localhost
14
+ USER_postgres=postgres
15
+ PASSWORD_postgres=Pwd2020Db
16
+ PORT_postgres=5432
17
+ ENGINE_postgres=postgres@dbgate-plugin-postgres
18
+
19
+ LABEL_postgres1=Postgres localhost test DB
20
+ SERVER_postgres1=localhost
21
+ USER_postgres1=postgres
22
+ PASSWORD_postgres1=Pwd2020Db
23
+ PORT_postgres1=5432
24
+ ENGINE_postgres1=postgres@dbgate-plugin-postgres
25
+ DATABASE_postgres1=test
26
+
27
+ LABEL_mongo=Mongo URL
28
+ URL_mongo=mongodb://localhost:27017
29
+ ENGINE_mongo=mongo@dbgate-plugin-mongo
30
+
31
+ LABEL_mongo2=Mongo Server
32
+ SERVER_mongo2=localhost
33
+ ENGINE_mongo2=mongo@dbgate-plugin-mongo
34
+
35
+ LABEL_mysqlssh=MySql SSH
36
+ SERVER_mysqlssh=localhost
37
+ USER_mysqlssh=root
38
+ PASSWORD_mysqlssh=xxx
39
+ PORT_mysqlssh=3316
40
+ ENGINE_mysqlssh=mysql@dbgate-plugin-mysql
41
+ USE_SSH_mysqlssh=1
42
+ SSH_HOST_mysqlssh=demo.dbgate.org
43
+ SSH_PORT_mysqlssh=22
44
+ SSH_MODE_mysqlssh=userPassword
45
+ SSH_LOGIN_mysqlssh=root
46
+ SSH_PASSWORD_mysqlssh=xxx
47
+
48
+ LABEL_sqlite=sqlite
49
+ FILE_sqlite=/home/jena/.dbgate/files/sqlite/feeds.sqlite
50
+ ENGINE_sqlite=sqlite@dbgate-plugin-sqlite
51
+
52
+ LABEL_relational=Relational dataset repo
53
+ SERVER_relational=relational.fit.cvut.cz
54
+ USER_relational=guest
55
+ PASSWORD_relational=relational
56
+ ENGINE_relational=mariadb@dbgate-plugin-mysql
57
+ READONLY_relational=1
58
+
59
+ # SETTINGS_dataGrid.showHintColumns=1
60
+
61
+ # docker run -p 3000:3000 -e CONNECTIONS=mongo -e URL_mongo=mongodb://localhost:27017 -e ENGINE_mongo=mongo@dbgate-plugin-mongo -e LABEL_mongo=mongo dbgate/dbgate:beta
62
+
63
+ # LOGINS=x,y
64
+ # LOGIN_PASSWORD_x=x
65
+ # LOGIN_PASSWORD_y=LOGIN_PASSWORD_y
66
+ # LOGIN_PERMISSIONS_x=~*
67
+ # LOGIN_PERMISSIONS_y=~*
68
+
69
+ # PERMISSIONS=~*,connections/relational
70
+ # PERMISSIONS=~*
@@ -0,0 +1,17 @@
1
+ DEVMODE=1
2
+
3
+ CONNECTIONS=mysql
4
+
5
+ LABEL_mysql=MySql localhost
6
+ SERVER_mysql=localhost
7
+ USER_mysql=root
8
+ PASSWORD_mysql=Pwd2020Db
9
+ PORT_mysql=3306
10
+ ENGINE_mysql=mysql@dbgate-plugin-mysql
11
+ DBCONFIG_mysql=[{"name":"Chinook","connectionColor":"cyan"}]
12
+
13
+
14
+ SINGLE_CONNECTION=mysql
15
+ SINGLE_DATABASE=Chinook
16
+
17
+ PERMISSIONS=files/charts/read
@@ -0,0 +1,43 @@
1
+ DEVMODE=1
2
+ DEVWEB=1
3
+
4
+ # STORAGE_SERVER=sql2022stage.sprinx.cz
5
+ # STORAGE_USER=dbgate-admin
6
+ # STORAGE_PASSWORD=UvT>2rnxJ_O=
7
+ # STORAGE_DATABASE=dbgate-premium
8
+ # STORAGE_ENGINE=mssql@dbgate-plugin-mssql
9
+
10
+ STORAGE_SERVER=localhost
11
+ STORAGE_USER=root
12
+ STORAGE_PASSWORD=Pwd2020Db
13
+ STORAGE_PORT=3306
14
+ STORAGE_DATABASE=dbgate
15
+ STORAGE_ENGINE=mysql@dbgate-plugin-mysql
16
+
17
+ # STORAGE_SERVER=localhost
18
+ # STORAGE_USER=postgres
19
+ # STORAGE_PASSWORD=Pwd2020Db
20
+ # STORAGE_PORT=5432
21
+ # STORAGE_DATABASE=dbgate
22
+ # STORAGE_ENGINE=postgres@dbgate-plugin-postgres
23
+
24
+ # STORAGE_SERVER=172.20.0.146
25
+ # STORAGE_USER=Metrostav
26
+ # STORAGE_PASSWORD=MtsEvr_2018
27
+ # STORAGE_PORT=1433
28
+ # STORAGE_DATABASE=DbGateConfig
29
+ # STORAGE_ENGINE=mssql@dbgate-plugin-mssql
30
+
31
+ # STORAGE_SERVER=localhost
32
+ # STORAGE_USER=system
33
+ # STORAGE_SERVICE_NAME=xe
34
+ # STORAGE_PASSWORD=Pwd2020Db
35
+ # STORAGE_PORT=1521
36
+ # STORAGE_DATABASE="C##DBGATE"
37
+ # STORAGE_ENGINE=oracle@dbgate-plugin-oracle
38
+
39
+
40
+ # ADMIN_PASSWORD=test
41
+ # DBGATE_LICENSE=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSmFuIFByb2NoYXprYSIsImxpY2Vuc2VUeXBlIjoicHJlbWl1bSIsInZhbGlkVG8iOiIyMDI0LTA5LTMwIiwiaWF0IjoxNzIyNDM0NTUyLCJleHAiOjE3MzAyMTA1NTJ9.gqyK5DdKMYfrN1uPlD3wZA8P-4CUGiT_zkTdezE2ln6IPGVrHfapG7pZgPFMWYM-Nsj9_Q525tJvgazs4a3KcPoXdt_EtA78Kse5ILkkysFVwczvK4qYhymJdCo3_C7si3Pgc3bqXj2GSekIIJLaZ06lfZW9Wt6BTh8q-5SCuQu6_0FItikG1McszmwlgEanJctFp0PvnkSNRblbAFXrGUoWXMXAplthyD2ZGblqEbZBfvZYjSloZpC2KAN9wUib3wNvaKmMANIXLMQpBDh0plzbLyqsRGU-6pyZLxOI5AJ8nZtxJccLn1qUJ0fE_KDF3RjIxLZtj8ybeC8Rf3hQ0g
42
+
43
+ # BASIC_AUTH=true
package/package.json ADDED
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "dbgate-api-premium",
3
+ "main": "src/index.js",
4
+ "version": "5.5.7-alpha.45",
5
+ "homepage": "https://dbgate.org/",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/dbgate/dbgate.git"
9
+ },
10
+ "author": "Jan Prochazka",
11
+ "license": "Commercial",
12
+ "keywords": [
13
+ "sql",
14
+ "json",
15
+ "import",
16
+ "export",
17
+ "dbgate"
18
+ ],
19
+ "dependencies": {
20
+ "@aws-sdk/rds-signer": "^3.665.0",
21
+ "activedirectory2": "^2.1.0",
22
+ "async-lock": "^1.2.6",
23
+ "axios": "^0.21.1",
24
+ "body-parser": "^1.19.0",
25
+ "bufferutil": "^4.0.1",
26
+ "byline": "^5.0.0",
27
+ "compare-versions": "^3.6.0",
28
+ "cors": "^2.8.5",
29
+ "cross-env": "^6.0.3",
30
+ "dbgate-datalib": "^5.5.7-alpha.45",
31
+ "dbgate-query-splitter": "^4.11.2",
32
+ "dbgate-sqltree": "^5.5.7-alpha.45",
33
+ "dbgate-tools": "^5.5.7-alpha.45",
34
+ "debug": "^4.3.4",
35
+ "diff": "^5.0.0",
36
+ "diff2html": "^3.4.13",
37
+ "eslint": "^6.8.0",
38
+ "express": "^4.17.1",
39
+ "express-basic-auth": "^1.2.0",
40
+ "express-fileupload": "^1.2.0",
41
+ "external-sorting": "^1.3.1",
42
+ "fs-extra": "^9.1.0",
43
+ "fs-reverse": "^0.0.3",
44
+ "get-port": "^5.1.1",
45
+ "http": "^0.0.0",
46
+ "is-electron": "^2.2.1",
47
+ "js-yaml": "^4.1.0",
48
+ "json-stable-stringify": "^1.0.1",
49
+ "jsonwebtoken": "^8.5.1",
50
+ "line-reader": "^0.4.0",
51
+ "lodash": "^4.17.21",
52
+ "moment": "^2.24.0",
53
+ "ncp": "^2.0.0",
54
+ "node-cron": "^2.0.3",
55
+ "on-finished": "^2.4.1",
56
+ "pinomin": "^1.0.4",
57
+ "portfinder": "^1.0.28",
58
+ "rimraf": "^3.0.0",
59
+ "semver": "^7.6.3",
60
+ "simple-encryptor": "^4.0.0",
61
+ "ssh2": "^1.11.0",
62
+ "stream-json": "^1.8.0",
63
+ "tar": "^6.0.5"
64
+ },
65
+ "scripts": {
66
+ "start": "env-cmd -f .env node src/index.js --listen-api",
67
+ "start:portal": "env-cmd -f env/portal/.env node src/index.js --listen-api",
68
+ "start:singledb": "env-cmd -f env/singledb/.env node src/index.js --listen-api",
69
+ "start:auth": "env-cmd -f env/auth/.env node src/index.js --listen-api",
70
+ "start:dblogin": "env-cmd -f env/dblogin/.env node src/index.js --listen-api",
71
+ "start:filedb": "env-cmd node src/index.js /home/jena/test/chinook/Chinook.db --listen-api",
72
+ "start:storage": "env-cmd -f env/storage/.env node src/index.js --listen-api",
73
+ "start:storage:built": "env-cmd -f env/storage/.env cross-env DEVMODE= BUILTWEBMODE=1 node dist/bundle.js --listen-api",
74
+ "start:singleconn": "env-cmd node src/index.js --server localhost --user root --port 3307 --engine mysql@dbgate-plugin-mysql --password test --listen-api",
75
+ "ts": "tsc",
76
+ "build": "webpack"
77
+ },
78
+ "devDependencies": {
79
+ "@types/fs-extra": "^9.0.11",
80
+ "@types/lodash": "^4.14.149",
81
+ "dbgate-types": "^5.5.7-alpha.45",
82
+ "env-cmd": "^10.1.0",
83
+ "node-loader": "^1.0.2",
84
+ "nodemon": "^2.0.2",
85
+ "typescript": "^4.4.3",
86
+ "webpack": "^5.91.0",
87
+ "webpack-cli": "^5.1.4"
88
+ }
89
+ }
@@ -0,0 +1,16 @@
1
+ const crypto = require('crypto');
2
+
3
+ const tokenSecret = crypto.randomUUID();
4
+
5
+ function getTokenLifetime() {
6
+ return process.env.TOKEN_LIFETIME || '1d';
7
+ }
8
+
9
+ function getTokenSecret() {
10
+ return tokenSecret;
11
+ }
12
+
13
+ module.exports = {
14
+ getTokenLifetime,
15
+ getTokenSecret,
16
+ };
@@ -0,0 +1,343 @@
1
+ const { getTokenSecret, getTokenLifetime } = require('./authCommon');
2
+ const _ = require('lodash');
3
+ const axios = require('axios');
4
+ const { getLogger, getPredefinedPermissions } = require('dbgate-tools');
5
+
6
+ const AD = require('activedirectory2').promiseWrapper;
7
+ const jwt = require('jsonwebtoken');
8
+
9
+ const logger = getLogger('authProvider');
10
+
11
+ class AuthProviderBase {
12
+ amoid = 'none';
13
+
14
+ async login(login, password, options = undefined) {
15
+ return {
16
+ accessToken: jwt.sign(
17
+ {
18
+ amoid: this.amoid,
19
+ },
20
+ getTokenSecret(),
21
+ { expiresIn: getTokenLifetime() }
22
+ ),
23
+ };
24
+ }
25
+
26
+ oauthToken(params) {
27
+ return {};
28
+ }
29
+
30
+ getCurrentLogin(req) {
31
+ const login = req?.user?.login ?? req?.auth?.user ?? null;
32
+ return login;
33
+ }
34
+
35
+ isUserLoggedIn(req) {
36
+ return !!req?.user || !!req?.auth;
37
+ }
38
+
39
+ getCurrentPermissions(req) {
40
+ const login = this.getCurrentLogin(req);
41
+ const permissions = process.env[`LOGIN_PERMISSIONS_${login}`];
42
+ return permissions || process.env.PERMISSIONS;
43
+ }
44
+
45
+ getLoginPageConnections() {
46
+ return null;
47
+ }
48
+
49
+ getSingleConnectionId(req) {
50
+ return null;
51
+ }
52
+
53
+ toJson() {
54
+ return {
55
+ amoid: this.amoid,
56
+ workflowType: 'anonymous',
57
+ name: 'Anonymous',
58
+ };
59
+ }
60
+
61
+ async redirect({ state }) {
62
+ return {
63
+ status: 'error',
64
+ };
65
+ }
66
+
67
+ async getLogoutUrl() {
68
+ return null;
69
+ }
70
+ }
71
+
72
+ class OAuthProvider extends AuthProviderBase {
73
+ amoid = 'oauth';
74
+
75
+ async oauthToken(params) {
76
+ const { redirectUri, code } = params;
77
+
78
+ const scopeParam = process.env.OAUTH_SCOPE ? `&scope=${process.env.OAUTH_SCOPE}` : '';
79
+ const resp = await axios.default.post(
80
+ `${process.env.OAUTH_TOKEN}`,
81
+ `grant_type=authorization_code&code=${encodeURIComponent(code)}&redirect_uri=${encodeURIComponent(
82
+ redirectUri
83
+ )}&client_id=${process.env.OAUTH_CLIENT_ID}&client_secret=${process.env.OAUTH_CLIENT_SECRET}${scopeParam}`
84
+ );
85
+
86
+ const { access_token, refresh_token, id_token } = resp.data;
87
+
88
+ let payload = jwt.decode(access_token);
89
+
90
+ // Fallback to id_token in case the access_token is not a JWT
91
+ // https://www.oauth.com/oauth2-servers/access-tokens/
92
+ // https://github.com/dbgate/dbgate/issues/727
93
+ if (!payload && id_token) {
94
+ payload = jwt.decode(id_token);
95
+ }
96
+
97
+ logger.info({ payload }, 'User payload returned from OAUTH');
98
+
99
+ const login =
100
+ process.env.OAUTH_LOGIN_FIELD && payload && payload[process.env.OAUTH_LOGIN_FIELD]
101
+ ? payload[process.env.OAUTH_LOGIN_FIELD]
102
+ : 'oauth';
103
+
104
+ if (
105
+ process.env.OAUTH_ALLOWED_LOGINS &&
106
+ !process.env.OAUTH_ALLOWED_LOGINS.split(',').find(x => x.toLowerCase().trim() == login.toLowerCase().trim())
107
+ ) {
108
+ return { error: `Username ${login} not allowed to log in` };
109
+ }
110
+
111
+ const groups =
112
+ process.env.OAUTH_GROUP_FIELD && payload && payload[process.env.OAUTH_GROUP_FIELD]
113
+ ? payload[process.env.OAUTH_GROUP_FIELD]
114
+ : [];
115
+
116
+ const allowedGroups = process.env.OAUTH_ALLOWED_GROUPS
117
+ ? process.env.OAUTH_ALLOWED_GROUPS.split(',').map(group => group.toLowerCase().trim())
118
+ : [];
119
+
120
+ if (process.env.OAUTH_ALLOWED_GROUPS && !groups.some(group => allowedGroups.includes(group.toLowerCase().trim()))) {
121
+ return { error: `Username ${login} does not belong to an allowed group` };
122
+ }
123
+
124
+ if (access_token) {
125
+ return {
126
+ accessToken: jwt.sign({ login }, getTokenSecret(), { expiresIn: getTokenLifetime() }),
127
+ };
128
+ }
129
+
130
+ return { error: 'Token not found' };
131
+ }
132
+
133
+ async getLogoutUrl() {
134
+ return process.env.OAUTH_LOGOUT;
135
+ }
136
+
137
+ toJson() {
138
+ return {
139
+ ...super.toJson(),
140
+ workflowType: 'redirect',
141
+ name: 'OAuth 2.0',
142
+ };
143
+ }
144
+
145
+ redirect({ state, redirectUri }) {
146
+ const scopeParam = process.env.OAUTH_SCOPE ? `&scope=${process.env.OAUTH_SCOPE}` : '';
147
+ return {
148
+ status: 'ok',
149
+ uri: `${process.env.OAUTH_AUTH}?client_id=${
150
+ process.env.OAUTH_CLIENT_ID
151
+ }&response_type=code&redirect_uri=${encodeURIComponent(redirectUri)}&state=${encodeURIComponent(
152
+ state
153
+ )}${scopeParam}`,
154
+ };
155
+ }
156
+ }
157
+
158
+ class ADProvider extends AuthProviderBase {
159
+ amoid = 'ad';
160
+
161
+ async login(login, password, options = undefined) {
162
+ const adConfig = {
163
+ url: process.env.AD_URL,
164
+ baseDN: process.env.AD_BASEDN,
165
+ username: process.env.AD_USERNAME,
166
+ password: process.env.AD_PASSWORD,
167
+ };
168
+ const ad = new AD(adConfig);
169
+ try {
170
+ const res = await ad.authenticate(login, password);
171
+ if (!res) {
172
+ return { error: 'Login failed' };
173
+ }
174
+ if (
175
+ process.env.AD_ALLOWED_LOGINS &&
176
+ !process.env.AD_ALLOWED_LOGINS.split(',').find(x => x.toLowerCase().trim() == login.toLowerCase().trim())
177
+ ) {
178
+ return { error: `Username ${login} not allowed to log in` };
179
+ }
180
+ return {
181
+ accessToken: jwt.sign(
182
+ {
183
+ amoid: this.amoid,
184
+ login,
185
+ },
186
+ getTokenSecret(),
187
+ { expiresIn: getTokenLifetime() }
188
+ ),
189
+ };
190
+ } catch (e) {
191
+ return { error: 'Login failed' };
192
+ }
193
+ }
194
+
195
+ toJson() {
196
+ return {
197
+ ...super.toJson(),
198
+ workflowType: 'credentials',
199
+ name: 'Active Directory',
200
+ };
201
+ }
202
+ }
203
+
204
+ class LoginsProvider extends AuthProviderBase {
205
+ amoid = 'logins';
206
+
207
+ async login(login, password, options = undefined) {
208
+ if (login && password && process.env['LOGIN'] == login && process.env['PASSWORD'] == password) {
209
+ return {
210
+ accessToken: jwt.sign(
211
+ {
212
+ amoid: this.amoid,
213
+ login,
214
+ },
215
+ getTokenSecret(),
216
+ { expiresIn: getTokenLifetime() }
217
+ ),
218
+ };
219
+ }
220
+
221
+ if (password == process.env[`LOGIN_PASSWORD_${login}`]) {
222
+ return {
223
+ accessToken: jwt.sign(
224
+ {
225
+ amoid: this.amoid,
226
+ login,
227
+ },
228
+ getTokenSecret(),
229
+ { expiresIn: getTokenLifetime() }
230
+ ),
231
+ };
232
+ }
233
+
234
+ return { error: 'Invalid credentials' };
235
+ }
236
+
237
+ toJson() {
238
+ return {
239
+ ...super.toJson(),
240
+ workflowType: 'credentials',
241
+ name: 'Login & Password',
242
+ };
243
+ }
244
+ }
245
+
246
+ class DenyAllProvider extends AuthProviderBase {
247
+ amoid = 'deny';
248
+
249
+ async login(login, password, options = undefined) {
250
+ return { error: 'Login not allowed' };
251
+ }
252
+
253
+ toJson() {
254
+ return {
255
+ ...super.toJson(),
256
+ workflowType: 'credentials',
257
+ name: 'Deny all',
258
+ };
259
+ }
260
+ }
261
+
262
+ function hasEnvLogins() {
263
+ if (process.env.LOGIN && process.env.PASSWORD) {
264
+ return true;
265
+ }
266
+ for (const key in process.env) {
267
+ if (key.startsWith('LOGIN_PASSWORD_')) {
268
+ return true;
269
+ }
270
+ }
271
+ return false;
272
+ }
273
+
274
+ function detectEnvAuthProvider() {
275
+ if (process.env.AUTH_PROVIDER) {
276
+ return process.env.AUTH_PROVIDER;
277
+ }
278
+
279
+ if (process.env.STORAGE_DATABASE) {
280
+ return 'denyall';
281
+ }
282
+ if (process.env.OAUTH_AUTH) {
283
+ return 'oauth';
284
+ }
285
+ if (process.env.AD_URL) {
286
+ return 'ad';
287
+ }
288
+ if (hasEnvLogins()) {
289
+ return 'logins';
290
+ }
291
+ return 'none';
292
+ }
293
+
294
+ function createEnvAuthProvider() {
295
+ const authProvider = detectEnvAuthProvider();
296
+ switch (authProvider) {
297
+ case 'oauth':
298
+ return new OAuthProvider();
299
+ case 'ad':
300
+ return new ADProvider();
301
+ case 'logins':
302
+ return new LoginsProvider();
303
+ case 'denyall':
304
+ return new DenyAllProvider();
305
+ default:
306
+ return new AuthProviderBase();
307
+ }
308
+ }
309
+
310
+ let defaultAuthProvider = createEnvAuthProvider();
311
+ let authProviders = [defaultAuthProvider];
312
+
313
+ function getAuthProviders() {
314
+ return authProviders;
315
+ }
316
+
317
+ function getAuthProviderById(amoid) {
318
+ return authProviders.find(x => x.amoid == amoid);
319
+ }
320
+
321
+ function getDefaultAuthProvider() {
322
+ return defaultAuthProvider;
323
+ }
324
+
325
+ function getAuthProviderFromReq(req) {
326
+ const authProviderId = req?.auth?.amoid || req?.user?.amoid;
327
+ return getAuthProviderById(authProviderId) ?? getDefaultAuthProvider();
328
+ }
329
+
330
+ function setAuthProviders(value, defaultProvider = null) {
331
+ authProviders = value;
332
+ defaultAuthProvider = defaultProvider || value[0];
333
+ }
334
+
335
+ module.exports = {
336
+ AuthProviderBase,
337
+ detectEnvAuthProvider,
338
+ getAuthProviders,
339
+ getDefaultAuthProvider,
340
+ setAuthProviders,
341
+ getAuthProviderById,
342
+ getAuthProviderFromReq,
343
+ };