underpost 3.0.3 → 3.1.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.
Files changed (82) hide show
  1. package/{.env.production → .env.example} +20 -2
  2. package/.github/workflows/ghpkg.ci.yml +1 -1
  3. package/.github/workflows/gitlab.ci.yml +1 -1
  4. package/.github/workflows/npmpkg.ci.yml +22 -7
  5. package/.github/workflows/publish.ci.yml +5 -5
  6. package/.github/workflows/pwa-microservices-template-page.cd.yml +3 -3
  7. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  8. package/.github/workflows/release.cd.yml +3 -2
  9. package/.vscode/extensions.json +9 -8
  10. package/.vscode/settings.json +3 -2
  11. package/CHANGELOG.md +146 -1
  12. package/CLI-HELP.md +71 -52
  13. package/README.md +2 -2
  14. package/bin/build.js +4 -1
  15. package/bin/deploy.js +150 -208
  16. package/bin/file.js +2 -1
  17. package/bin/vs.js +3 -3
  18. package/conf.js +30 -13
  19. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  20. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
  21. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  22. package/manifests/deployment/dd-test-development/deployment.yaml +52 -52
  23. package/manifests/deployment/dd-test-development/proxy.yaml +4 -4
  24. package/manifests/pv-pvc-dd.yaml +1 -1
  25. package/package.json +48 -43
  26. package/scripts/k3s-node-setup.sh +1 -1
  27. package/src/api/document/document.service.js +1 -1
  28. package/src/api/file/file.controller.js +3 -1
  29. package/src/api/file/file.service.js +28 -5
  30. package/src/api/user/user.router.js +10 -5
  31. package/src/api/user/user.service.js +7 -7
  32. package/src/cli/baremetal.js +6 -10
  33. package/src/cli/cloud-init.js +0 -3
  34. package/src/cli/db.js +54 -71
  35. package/src/cli/deploy.js +64 -12
  36. package/src/cli/env.js +4 -4
  37. package/src/cli/fs.js +0 -2
  38. package/src/cli/image.js +0 -3
  39. package/src/cli/index.js +27 -13
  40. package/src/cli/monitor.js +5 -6
  41. package/src/cli/repository.js +322 -35
  42. package/src/cli/run.js +118 -69
  43. package/src/cli/secrets.js +0 -3
  44. package/src/cli/ssh.js +1 -1
  45. package/src/client/components/core/AgGrid.js +20 -5
  46. package/src/client/components/core/Content.js +22 -3
  47. package/src/client/components/core/Docs.js +21 -4
  48. package/src/client/components/core/FileExplorer.js +71 -4
  49. package/src/client/components/core/Input.js +1 -1
  50. package/src/client/components/core/Modal.js +20 -6
  51. package/src/client/public/default/sitemap +3 -3
  52. package/src/client/public/test/sitemap +3 -3
  53. package/src/client.build.js +0 -3
  54. package/src/client.dev.js +0 -3
  55. package/src/db/DataBaseProvider.js +17 -2
  56. package/src/db/mariadb/MariaDB.js +14 -9
  57. package/src/db/mongo/MongooseDB.js +17 -1
  58. package/src/index.js +1 -1
  59. package/src/proxy.js +0 -3
  60. package/src/runtime/express/Express.js +7 -1
  61. package/src/runtime/lampp/Lampp.js +6 -13
  62. package/src/server/auth.js +6 -9
  63. package/src/server/backup.js +2 -3
  64. package/src/server/client-build-docs.js +178 -3
  65. package/src/server/client-build-live.js +9 -18
  66. package/src/server/client-build.js +175 -38
  67. package/src/server/client-dev-server.js +14 -13
  68. package/src/server/conf.js +357 -149
  69. package/src/server/cron.js +2 -1
  70. package/src/server/dns.js +28 -12
  71. package/src/server/downloader.js +0 -2
  72. package/src/server/logger.js +27 -9
  73. package/src/server/peer.js +0 -2
  74. package/src/server/process.js +1 -50
  75. package/src/server/proxy.js +4 -8
  76. package/src/server/runtime.js +5 -8
  77. package/src/server/ssr.js +0 -3
  78. package/src/server/start.js +5 -5
  79. package/src/server/tls.js +0 -2
  80. package/src/server.js +0 -4
  81. package/.env.development +0 -43
  82. package/.env.test +0 -43
@@ -18,13 +18,13 @@ spec:
18
18
  spec:
19
19
  containers:
20
20
  - name: dd-test-development-blue
21
- image: localhost/rockylinux9-underpost:v3.0.3
21
+ image: localhost/rockylinux9-underpost:v3.1.0
22
22
 
23
23
  command:
24
24
  - /bin/sh
25
25
  - -c
26
26
  - >
27
- npm install -g npm@11.2.0 && npm install -g underpost && underpost secret underpost --create-from-file /etc/config/.env.development && underpost start --build --run --underpost-quickly-install dd-test development
27
+ npm install -g npm@11.2.0 && npm install -g underpost && underpost secret underpost --create-from-file /etc/config/.env.development && underpost start --build --run dd-test development
28
28
 
29
29
 
30
30
  volumeMounts:
@@ -47,41 +47,41 @@ spec:
47
47
  selector:
48
48
  app: dd-test-development-blue
49
49
  ports:
50
- - name: 'tcp-4030'
50
+ - name: 'tcp-4038'
51
51
  protocol: TCP
52
- port: 4030
53
- targetPort: 4030
54
- - name: 'udp-4030'
52
+ port: 4038
53
+ targetPort: 4038
54
+ - name: 'udp-4038'
55
55
  protocol: UDP
56
- port: 4030
57
- targetPort: 4030
56
+ port: 4038
57
+ targetPort: 4038
58
58
 
59
- - name: 'tcp-4031'
59
+ - name: 'tcp-4039'
60
60
  protocol: TCP
61
- port: 4031
62
- targetPort: 4031
63
- - name: 'udp-4031'
61
+ port: 4039
62
+ targetPort: 4039
63
+ - name: 'udp-4039'
64
64
  protocol: UDP
65
- port: 4031
66
- targetPort: 4031
65
+ port: 4039
66
+ targetPort: 4039
67
67
 
68
- - name: 'tcp-4032'
68
+ - name: 'tcp-4040'
69
69
  protocol: TCP
70
- port: 4032
71
- targetPort: 4032
72
- - name: 'udp-4032'
70
+ port: 4040
71
+ targetPort: 4040
72
+ - name: 'udp-4040'
73
73
  protocol: UDP
74
- port: 4032
75
- targetPort: 4032
74
+ port: 4040
75
+ targetPort: 4040
76
76
 
77
- - name: 'tcp-4033'
77
+ - name: 'tcp-4041'
78
78
  protocol: TCP
79
- port: 4033
80
- targetPort: 4033
81
- - name: 'udp-4033'
79
+ port: 4041
80
+ targetPort: 4041
81
+ - name: 'udp-4041'
82
82
  protocol: UDP
83
- port: 4033
84
- targetPort: 4033
83
+ port: 4041
84
+ targetPort: 4041
85
85
  type: LoadBalancer
86
86
  ---
87
87
  apiVersion: apps/v1
@@ -103,13 +103,13 @@ spec:
103
103
  spec:
104
104
  containers:
105
105
  - name: dd-test-development-green
106
- image: localhost/rockylinux9-underpost:v3.0.3
106
+ image: localhost/rockylinux9-underpost:v3.1.0
107
107
 
108
108
  command:
109
109
  - /bin/sh
110
110
  - -c
111
111
  - >
112
- npm install -g npm@11.2.0 && npm install -g underpost && underpost secret underpost --create-from-file /etc/config/.env.development && underpost start --build --run --underpost-quickly-install dd-test development
112
+ npm install -g npm@11.2.0 && npm install -g underpost && underpost secret underpost --create-from-file /etc/config/.env.development && underpost start --build --run dd-test development
113
113
 
114
114
 
115
115
  volumeMounts:
@@ -132,39 +132,39 @@ spec:
132
132
  selector:
133
133
  app: dd-test-development-green
134
134
  ports:
135
- - name: 'tcp-4030'
135
+ - name: 'tcp-4038'
136
136
  protocol: TCP
137
- port: 4030
138
- targetPort: 4030
139
- - name: 'udp-4030'
137
+ port: 4038
138
+ targetPort: 4038
139
+ - name: 'udp-4038'
140
140
  protocol: UDP
141
- port: 4030
142
- targetPort: 4030
141
+ port: 4038
142
+ targetPort: 4038
143
143
 
144
- - name: 'tcp-4031'
144
+ - name: 'tcp-4039'
145
145
  protocol: TCP
146
- port: 4031
147
- targetPort: 4031
148
- - name: 'udp-4031'
146
+ port: 4039
147
+ targetPort: 4039
148
+ - name: 'udp-4039'
149
149
  protocol: UDP
150
- port: 4031
151
- targetPort: 4031
150
+ port: 4039
151
+ targetPort: 4039
152
152
 
153
- - name: 'tcp-4032'
153
+ - name: 'tcp-4040'
154
154
  protocol: TCP
155
- port: 4032
156
- targetPort: 4032
157
- - name: 'udp-4032'
155
+ port: 4040
156
+ targetPort: 4040
157
+ - name: 'udp-4040'
158
158
  protocol: UDP
159
- port: 4032
160
- targetPort: 4032
159
+ port: 4040
160
+ targetPort: 4040
161
161
 
162
- - name: 'tcp-4033'
162
+ - name: 'tcp-4041'
163
163
  protocol: TCP
164
- port: 4033
165
- targetPort: 4033
166
- - name: 'udp-4033'
164
+ port: 4041
165
+ targetPort: 4041
166
+ - name: 'udp-4041'
167
167
  protocol: UDP
168
- port: 4033
169
- targetPort: 4033
168
+ port: 4041
169
+ targetPort: 4041
170
170
  type: LoadBalancer
@@ -15,7 +15,7 @@ spec:
15
15
  enableWebsockets: true
16
16
  services:
17
17
  - name: dd-test-development-blue-service
18
- port: 4030
18
+ port: 4038
19
19
  weight: 100
20
20
 
21
21
  - conditions:
@@ -24,7 +24,7 @@ spec:
24
24
  enableWebsockets: true
25
25
  services:
26
26
  - name: dd-test-development-blue-service
27
- port: 4031
27
+ port: 4039
28
28
  weight: 100
29
29
 
30
30
  ---
@@ -43,7 +43,7 @@ spec:
43
43
  enableWebsockets: true
44
44
  services:
45
45
  - name: dd-test-development-blue-service
46
- port: 4032
46
+ port: 4040
47
47
  weight: 100
48
48
 
49
49
  - conditions:
@@ -52,6 +52,6 @@ spec:
52
52
  enableWebsockets: true
53
53
  services:
54
54
  - name: dd-test-development-blue-service
55
- port: 4033
55
+ port: 4041
56
56
  weight: 100
57
57
 
@@ -31,4 +31,4 @@ spec:
31
31
  storageClassName: manual
32
32
  resources:
33
33
  requests:
34
- storage: 1Gi
34
+ storage: 5Gi
package/package.json CHANGED
@@ -2,25 +2,30 @@
2
2
  "type": "module",
3
3
  "main": "src/index.js",
4
4
  "name": "underpost",
5
- "version": "3.0.3",
5
+ "version": "3.1.0",
6
6
  "description": "pwa api rest template",
7
7
  "scripts": {
8
- "start": "env-cmd -f .env.production node --max-old-space-size=8192 src/server",
9
- "build": "node bin/deploy build-full-client",
10
- "test": "env-cmd -f .env.test c8 mocha",
11
- "dev": "env-cmd -f .env.development nodemon src/server",
12
- "dev-img": "env-cmd -f .env.development node src/server",
13
- "prod-img": "env-cmd -f .env.production node src/server",
14
- "dev-api": "env-cmd -f .env.development nodemon --watch src --ignore src/client src/api",
15
- "dev-client": "env-cmd -f .env.development node src/client.dev",
16
- "dev-proxy": "env-cmd -f .env.development node src/proxy proxy",
8
+ "start": "node --max-old-space-size=8192 src/server",
9
+ "build": "node bin client",
10
+ "test": "NODE_ENV=test c8 mocha",
11
+ "dev": "NODE_ENV=development nodemon src/server",
12
+ "dev:container": "NODE_ENV=development node src/server",
13
+ "prod:container": "NODE_ENV=production node src/server",
14
+ "dev:api": "NODE_ENV=development nodemon --watch src --ignore src/client src/api",
15
+ "dev:client": "NODE_ENV=development node src/client.dev",
16
+ "dev:proxy": "NODE_ENV=development node src/proxy proxy",
17
17
  "docs": "jsdoc -c jsdoc.json",
18
- "install-global": "npm install -g jsdoc && npm install -g prettier && npm install -g env-cmd",
19
- "install-test": "npm install -g mocha && npm install -g c8 && npm install -g coveralls",
20
- "install": "npm run install-global && npm run install-test",
18
+ "install:global": "npm install -g jsdoc && npm install -g prettier",
19
+ "install:test": "npm install -g mocha && npm install -g c8 && npm install -g coveralls",
20
+ "install": "npm run install:global && npm run install:test",
21
21
  "prettier": "prettier --write .",
22
22
  "fix": "npm audit fix --force && npm audit",
23
- "baremetal": "node bin baremetal --dev --commission --ls --create-machine"
23
+ "baremetal": "node bin baremetal --dev --commission --ls --create-machine",
24
+ "security:secrets": "gitleaks detect --source . --config .gitleaks.toml --report-path ./gitleaks-report.json --report-format json --redact=0",
25
+ "security:secrets:ci": "gitleaks detect --source . --config .gitleaks.toml --redact=1",
26
+ "security:deps": "npm audit",
27
+ "security": "npm run security:secrets:ci && npm run security:deps",
28
+ "clean": "node bin env clean && node bin run clean"
24
29
  },
25
30
  "bin": {
26
31
  "underpost": "bin/index.js"
@@ -46,63 +51,63 @@
46
51
  },
47
52
  "homepage": "https://github.com/underpostnet/pwa-microservices-template#readme",
48
53
  "dependencies": {
49
- "@fortawesome/fontawesome-free": "^6.4.2",
50
- "@fullcalendar/rrule": "^6.1.15",
51
- "@neodrag/vanilla": "^2.0.3",
54
+ "@fortawesome/fontawesome-free": "^7.2.0",
55
+ "@fullcalendar/rrule": "^6.1.20",
56
+ "@neodrag/vanilla": "^2.3.1",
52
57
  "adm-zip": "^0.5.10",
53
- "ag-grid-community": "^31.3.4",
54
- "axios": "^1.5.1",
55
- "chai": "^5.1.0",
58
+ "ag-grid-community": "^35.1.0",
59
+ "axios": "^1.13.6",
60
+ "chai": "^6.2.2",
56
61
  "clean-jsdoc-theme": "^4.3.0",
57
- "clipboardy": "^4.0.0",
62
+ "clipboardy": "^5.3.1",
58
63
  "cloudinary": "^2.5.1",
59
64
  "colors": "^1.4.0",
60
- "commander": "^12.1.0",
65
+ "commander": "^14.0.3",
61
66
  "compression": "^1.7.4",
62
67
  "cookie-parser": "^1.4.7",
63
- "cors": "^2.8.5",
68
+ "cors": "^2.8.6",
64
69
  "d3": "^7.9.0",
65
- "dotenv": "^16.3.1",
70
+ "dotenv": "^17.3.1",
66
71
  "easymde": "^2.18.0",
67
- "env-cmd": "^10.1.0",
68
- "express": "^4.18.2",
72
+ "escape-string-regexp": "^5.0.0",
73
+ "express": "^5.2.1",
69
74
  "express-fileupload": "^1.4.3",
70
- "express-rate-limit": "^8.1.0",
71
- "express-slow-down": "^3.0.0",
75
+ "express-rate-limit": "^8.3.1",
76
+ "express-slow-down": "^3.1.0",
72
77
  "fast-json-stable-stringify": "^2.1.0",
73
78
  "favicons": "^7.2.0",
74
- "fs-extra": "^11.1.1",
79
+ "fs-extra": "^11.3.4",
75
80
  "fullcalendar": "^6.1.15",
76
81
  "helmet": "^8.1.0",
77
82
  "html-minifier-terser": "^7.2.0",
78
- "http-proxy-middleware": "^2.0.6",
83
+ "http-proxy-middleware": "^3.0.5",
79
84
  "ignore-walk": "^8.0.0",
80
- "iovalkey": "^0.2.1",
81
- "json-colorizer": "^2.2.2",
82
- "jsonwebtoken": "^9.0.2",
85
+ "iovalkey": "^0.3.3",
86
+ "json-colorizer": "^3.0.1",
87
+ "jsonwebtoken": "^9.0.3",
83
88
  "mariadb": "^3.2.2",
84
- "marked": "^12.0.2",
89
+ "marked": "^17.0.4",
85
90
  "mocha": "^11.3.0",
86
- "mongoose": "^8.9.5",
91
+ "mongoose": "^9.3.0",
87
92
  "morgan": "^1.10.0",
88
- "nodemailer": "^7.0.9",
93
+ "nodemailer": "^8.0.2",
89
94
  "nodemon": "^3.0.1",
90
95
  "peer": "^1.0.2",
91
- "peerjs": "^1.5.2",
96
+ "peerjs": "^1.5.5",
92
97
  "prom-client": "^15.1.2",
93
- "read": "^2.1.0",
98
+ "read": "^5.0.1",
94
99
  "rrule": "^2.8.1",
95
100
  "shelljs": "^0.10.0",
96
- "sitemap": "^7.1.1",
97
- "socket.io": "^4.8.0",
101
+ "sitemap": "^9.0.1",
102
+ "socket.io": "^4.8.3",
98
103
  "sortablejs": "^1.15.0",
99
104
  "split-file": "^2.3.0",
100
- "swagger-autogen": "^2.9.2",
105
+ "swagger-autogen": "^2.23.7",
101
106
  "swagger-ui-express": "^5.0.0",
102
107
  "uglify-js": "^3.17.4",
103
108
  "validator": "^13.11.0",
104
- "vanilla-jsoneditor": "^2.3.2",
105
- "winston": "^3.11.0"
109
+ "vanilla-jsoneditor": "^3.11.0",
110
+ "winston": "^3.19.0"
106
111
  },
107
112
  "publishConfig": {
108
113
  "provenance": true,
@@ -52,7 +52,7 @@ cd /home/dd/engine
52
52
 
53
53
  echo "Applying host configuration..."
54
54
 
55
- underpost install
55
+ npm install
56
56
 
57
57
  node bin run secret
58
58
 
@@ -497,7 +497,7 @@ const DocumentService = {
497
497
  req.body.isPublic = isPublic;
498
498
  req.body.tags = tags;
499
499
 
500
- return await Document.findByIdAndUpdate(req.params.id, req.body, { new: true });
500
+ return await Document.findByIdAndUpdate(req.params.id, req.body, { returnDocument: 'after' });
501
501
  }
502
502
  }
503
503
  },
@@ -19,7 +19,9 @@ const FileController = {
19
19
  },
20
20
  get: async (req, res, options) => {
21
21
  try {
22
- res.setHeader('Access-Control-Allow-Origin', '*');
22
+ if (req && req.headers && req.headers.origin) {
23
+ res.set('Access-Control-Allow-Origin', req.headers.origin);
24
+ } else res.setHeader('Access-Control-Allow-Origin', '*');
23
25
  res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');
24
26
  const result = await FileService.get(req, res, options);
25
27
  if (result instanceof Buffer) {
@@ -387,12 +387,35 @@ const FileService = {
387
387
  if (doc.isPublic) return true;
388
388
 
389
389
  // Otherwise, user must be authenticated and own the document
390
+ // Try bearer token first
390
391
  const token = getBearerToken(req);
391
- if (!token) false;
392
- const payload = jwtVerify(token, options);
393
- const user = await User.findOne({ _id: payload._id }).lean();
394
- if (!user) return false;
395
- return String(doc.userId) === String(user._id);
392
+ if (token) {
393
+ try {
394
+ const payload = jwtVerify(token, options);
395
+ const user = await User.findOne({ _id: payload._id }).lean();
396
+ if (user && String(doc.userId) === String(user._id)) return true;
397
+ } catch (bearerErr) {
398
+ logger.warn('Bearer token verification failed, trying cookie session fallback:', bearerErr.message);
399
+ }
400
+ }
401
+
402
+ // Fallback: check cookie-based session (refreshToken cookie)
403
+ const refreshToken = req.cookies?.refreshToken;
404
+ if (refreshToken) {
405
+ try {
406
+ const user = await User.findOne({ 'activeSessions.tokenHash': refreshToken }).lean();
407
+ if (user) {
408
+ const session = user.activeSessions.find((s) => s.tokenHash === refreshToken);
409
+ if (session && (!session.expiresAt || session.expiresAt >= new Date())) {
410
+ return String(doc.userId) === String(user._id);
411
+ }
412
+ }
413
+ } catch (cookieErr) {
414
+ logger.warn('Cookie session verification failed:', cookieErr.message);
415
+ }
416
+ }
417
+
418
+ return false;
396
419
  } catch (err) {
397
420
  console.log(err);
398
421
  logger.error('Authorization check failed:', err);
@@ -30,12 +30,15 @@ const UserRouter = (options) => {
30
30
  emailConfirmed: true,
31
31
  publicKey: [],
32
32
  });
33
- logger.warn('Default admin user created. Please change the default password immediately!', result._doc);
33
+ logger.warn('Default admin user created. Please change the default password immediately!', {
34
+ username: result._doc.username,
35
+ email: result._doc.email,
36
+ role: result._doc.role,
37
+ });
34
38
  }
35
39
  }
36
40
  } catch (error) {
37
- logger.error('Error checking/creating admin user');
38
- console.log(error);
41
+ logger.error('Error checking/creating admin user', { error: error.message });
39
42
  }
40
43
 
41
44
  // Cache mailer images
@@ -46,10 +49,12 @@ const UserRouter = (options) => {
46
49
  check: fs.readFileSync(`./src/client/public/default/assets/mailer/api-user-check.png`),
47
50
  avatar: fs.readFileSync(`./src/client/public/default/assets/mailer/api-user-default-avatar.png`),
48
51
  },
49
- header: (res) => {
52
+ header: (res, req) => {
50
53
  res.set('Cross-Origin-Resource-Policy', 'cross-origin');
51
- res.set('Access-Control-Allow-Origin', '*');
52
54
  res.set('Access-Control-Allow-Headers', '*');
55
+ if (req && req.headers && req.headers.origin) {
56
+ res.set('Access-Control-Allow-Origin', req.headers.origin);
57
+ } else res.setHeader('Access-Control-Allow-Origin', '*');
53
58
  res.set('Content-Type', 'image/png');
54
59
  },
55
60
  };
@@ -265,7 +265,7 @@ const UserService = {
265
265
  }
266
266
 
267
267
  if (req.path.startsWith('/assets')) {
268
- options.png.header(res);
268
+ options.png.header(res, req);
269
269
  return options.png.buffer[req.params.id];
270
270
  }
271
271
 
@@ -281,7 +281,7 @@ const UserService = {
281
281
  payload = verifyJWT(req.params.id, options);
282
282
  } catch (error) {
283
283
  logger.error(error, { 'req.params.id': req.params.id });
284
- options.png.header(res);
284
+ options.png.header(res, req);
285
285
  return options.png.buffer['invalid-token'];
286
286
  }
287
287
  const user = await User.findOne({
@@ -294,10 +294,10 @@ const UserService = {
294
294
  { recoverTimeOut: new Date(+new Date() + 1000 * 60 * 15) },
295
295
  { runValidators: true },
296
296
  );
297
- options.png.header(res);
297
+ options.png.header(res, req);
298
298
  return options.png.buffer['recover'];
299
299
  } else {
300
- options.png.header(res);
300
+ options.png.header(res, req);
301
301
  return options.png.buffer['invalid-token'];
302
302
  }
303
303
  }
@@ -308,7 +308,7 @@ const UserService = {
308
308
  payload = verifyJWT(req.params.id, options);
309
309
  } catch (error) {
310
310
  logger.error(error, { 'req.params.id': req.params.id });
311
- options.png.header(res);
311
+ options.png.header(res, req);
312
312
  return options.png.buffer['invalid-token'];
313
313
  }
314
314
  const user = await User.findOne({
@@ -324,10 +324,10 @@ const UserService = {
324
324
  status: 'email-confirmed',
325
325
  id: userWsId,
326
326
  });
327
- options.png.header(res);
327
+ options.png.header(res, req);
328
328
  return options.png.buffer['check'];
329
329
  } else {
330
- options.png.header(res);
330
+ options.png.header(res, req);
331
331
  return options.png.buffer['invalid-token'];
332
332
  }
333
333
  }
@@ -135,9 +135,6 @@ class UnderpostBaremetal {
135
135
  ) {
136
136
  let { ipAddress, hostname, ipFileServer, ipConfig, netmask, dnsServer } = options;
137
137
 
138
- // Load environment variables from .env file, overriding existing ones if present.
139
- dotenv.config({ path: `${getUnderpostRootPath()}/.env`, override: true });
140
-
141
138
  // Determine the root path for npm and underpost.
142
139
  const npmRoot = getNpmRootPath();
143
140
  const underpostRoot = options?.dev === true ? '.' : `${npmRoot}/underpost`;
@@ -1147,9 +1144,8 @@ rm -rf ${artifacts.join(' ')}`);
1147
1144
  machine: machine ? machine.system_id : null,
1148
1145
  });
1149
1146
 
1150
- const { discovery, machine: discoveredMachine } = await Underpost.baremetal.commissionMonitor(
1151
- commissionMonitorPayload,
1152
- );
1147
+ const { discovery, machine: discoveredMachine } =
1148
+ await Underpost.baremetal.commissionMonitor(commissionMonitorPayload);
1153
1149
  if (discoveredMachine) machine = discoveredMachine;
1154
1150
  }
1155
1151
  },
@@ -2494,10 +2490,10 @@ fi
2494
2490
  const discoverHostname = discovery.hostname
2495
2491
  ? discovery.hostname
2496
2492
  : discovery.mac_organization
2497
- ? discovery.mac_organization
2498
- : discovery.domain
2499
- ? discovery.domain
2500
- : `generic-host-${s4()}${s4()}`;
2493
+ ? discovery.mac_organization
2494
+ : discovery.domain
2495
+ ? discovery.domain
2496
+ : `generic-host-${s4()}${s4()}`;
2501
2497
 
2502
2498
  console.log(discoverHostname.bgBlue.bold.white);
2503
2499
  console.log('ip target:'.green + ipAddress, 'ip discovered:'.green + discovery.ip);
@@ -5,15 +5,12 @@
5
5
  * @namespace UnderpostCloudInit
6
6
  */
7
7
 
8
- import dotenv from 'dotenv';
9
8
  import { shellExec } from '../server/process.js';
10
9
  import fs from 'fs-extra';
11
10
  import { loggerFactory } from '../server/logger.js';
12
11
  import { getNpmRootPath } from '../server/conf.js';
13
12
  import Underpost from '../index.js';
14
13
 
15
- dotenv.config();
16
-
17
14
  const logger = loggerFactory(import.meta);
18
15
 
19
16
  /**