@naturalcycles/backend-lib 4.1.1 → 4.2.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.
@@ -19,7 +19,7 @@ exports.createAdminMiddleware = createAdminMiddleware;
19
19
  */
20
20
  function requireAdminPermissions(adminService, reqPermissions = [], cfg = {}) {
21
21
  const { loginHtmlPath = '/login.html', urlStartsWith, apiHost, autoLogin = true } = cfg;
22
- return async (req, res, next) => {
22
+ return async function requireAdminPermissionsFn(req, res, next) {
23
23
  if (urlStartsWith && !req.url.startsWith(urlStartsWith))
24
24
  return next();
25
25
  try {
@@ -1,8 +1,15 @@
1
- import { AdminMiddleware, RequireAdminCfg } from './admin.mw';
1
+ import { AdminMiddleware, RequireAdminCfg } from './adminMiddleware';
2
2
  import { BaseAdminService } from './base.admin.service';
3
3
  export interface SecureHeaderMiddlewareCfg extends RequireAdminCfg {
4
4
  adminService: BaseAdminService;
5
- secureHeader: string;
5
+ /**
6
+ * Defaults to `Authorization`
7
+ */
8
+ secureHeaderKey?: string;
9
+ /**
10
+ * If undefined - any value will be accepted, but the header still need to be present.
11
+ */
12
+ secureHeaderValue?: string;
6
13
  }
7
14
  /**
8
15
  * Secures the endpoint by requiring a secret header to be present.
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createSecureHeaderMiddleware = void 0;
4
4
  const js_lib_1 = require("@naturalcycles/js-lib");
5
- const admin_mw_1 = require("./admin.mw");
5
+ const adminMiddleware_1 = require("./adminMiddleware");
6
6
  /**
7
7
  * Secures the endpoint by requiring a secret header to be present.
8
8
  * Throws Error401Admin otherwise.
@@ -12,14 +12,17 @@ function createSecureHeaderMiddleware(cfg) {
12
12
  }
13
13
  exports.createSecureHeaderMiddleware = createSecureHeaderMiddleware;
14
14
  function requireSecureHeaderOrAdmin(cfg, reqPermissions) {
15
- const requireAdmin = (0, admin_mw_1.requireAdminPermissions)(cfg.adminService, reqPermissions, cfg);
15
+ const { secureHeaderKey = 'Authorization', secureHeaderValue } = cfg;
16
+ const requireAdmin = (0, adminMiddleware_1.requireAdminPermissions)(cfg.adminService, reqPermissions, cfg);
16
17
  return async (req, res, next) => {
17
- const providedHeader = req.get('Authorization');
18
+ const providedHeader = req.get(secureHeaderKey);
18
19
  // pass
19
- if (!cfg.adminService.cfg.authEnabled || providedHeader === cfg.secureHeader)
20
+ if (!cfg.adminService.cfg.authEnabled)
20
21
  return next();
21
22
  // Header provided - don't check for Admin
22
23
  if (providedHeader) {
24
+ if (!secureHeaderValue || providedHeader === secureHeaderValue)
25
+ return next();
23
26
  return next(new js_lib_1.HttpError('secureHeader or adminToken is required', {
24
27
  httpStatusCode: 401,
25
28
  adminAuthRequired: true,
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import onFinished = require('on-finished');
2
- import { AdminMiddleware, createAdminMiddleware, loginHtml, RequireAdminCfg } from './admin/admin.mw';
2
+ import { AdminMiddleware, createAdminMiddleware, loginHtml, RequireAdminCfg } from './admin/adminMiddleware';
3
3
  import { AdminInfo, AdminServiceCfg, BaseAdminService } from './admin/base.admin.service';
4
4
  import { FirebaseSharedService } from './admin/firebase.shared.service';
5
- import { createSecureHeaderMiddleware, SecureHeaderMiddlewareCfg } from './admin/secureHeader.mw';
5
+ import { createSecureHeaderMiddleware, SecureHeaderMiddlewareCfg } from './admin/secureHeaderMiddleware';
6
6
  import { BaseEnv } from './env/env.model';
7
7
  import { EnvSharedService, EnvSharedServiceCfg } from './env/env.shared.service';
8
8
  export * from './gae/appEngine.util';
package/dist/index.js CHANGED
@@ -4,15 +4,15 @@ exports.simpleRequestLoggerMiddleware = exports.clearBodyParserTimeout = exports
4
4
  const tslib_1 = require("tslib");
5
5
  const onFinished = require("on-finished");
6
6
  exports.onFinished = onFinished;
7
- const admin_mw_1 = require("./admin/admin.mw");
8
- Object.defineProperty(exports, "createAdminMiddleware", { enumerable: true, get: function () { return admin_mw_1.createAdminMiddleware; } });
9
- Object.defineProperty(exports, "loginHtml", { enumerable: true, get: function () { return admin_mw_1.loginHtml; } });
7
+ const adminMiddleware_1 = require("./admin/adminMiddleware");
8
+ Object.defineProperty(exports, "createAdminMiddleware", { enumerable: true, get: function () { return adminMiddleware_1.createAdminMiddleware; } });
9
+ Object.defineProperty(exports, "loginHtml", { enumerable: true, get: function () { return adminMiddleware_1.loginHtml; } });
10
10
  const base_admin_service_1 = require("./admin/base.admin.service");
11
11
  Object.defineProperty(exports, "BaseAdminService", { enumerable: true, get: function () { return base_admin_service_1.BaseAdminService; } });
12
12
  const firebase_shared_service_1 = require("./admin/firebase.shared.service");
13
13
  Object.defineProperty(exports, "FirebaseSharedService", { enumerable: true, get: function () { return firebase_shared_service_1.FirebaseSharedService; } });
14
- const secureHeader_mw_1 = require("./admin/secureHeader.mw");
15
- Object.defineProperty(exports, "createSecureHeaderMiddleware", { enumerable: true, get: function () { return secureHeader_mw_1.createSecureHeaderMiddleware; } });
14
+ const secureHeaderMiddleware_1 = require("./admin/secureHeaderMiddleware");
15
+ Object.defineProperty(exports, "createSecureHeaderMiddleware", { enumerable: true, get: function () { return secureHeaderMiddleware_1.createSecureHeaderMiddleware; } });
16
16
  const env_shared_service_1 = require("./env/env.shared.service");
17
17
  Object.defineProperty(exports, "EnvSharedService", { enumerable: true, get: function () { return env_shared_service_1.EnvSharedService; } });
18
18
  (0, tslib_1.__exportStar)(require("./gae/appEngine.util"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naturalcycles/backend-lib",
3
- "version": "4.1.1",
3
+ "version": "4.2.2",
4
4
  "scripts": {
5
5
  "prepare": "husky install && patch-package",
6
6
  "serve": "APP_ENV=dev nodemon",
@@ -26,7 +26,7 @@
26
26
  "@types/on-finished": "^2.3.1",
27
27
  "cookie-parser": "^1.4.3",
28
28
  "cors": "^2.8.5",
29
- "dotenv": "^10.0.0",
29
+ "dotenv": "^11.0.0",
30
30
  "ejs": "^3.0.1",
31
31
  "express": "^4.16.4",
32
32
  "express-promise-router": "^4.0.0",
@@ -84,7 +84,7 @@
84
84
  "url": "https://github.com/NaturalCycles/backend-lib"
85
85
  },
86
86
  "engines": {
87
- "node": ">=16.13.0"
87
+ "node": ">=14.15.0"
88
88
  },
89
89
  "type": "commonjs",
90
90
  "description": "Standard library for making Express.js / AppEngine based backend services",
@@ -55,7 +55,7 @@ export function requireAdminPermissions(
55
55
  ): BackendRequestHandler {
56
56
  const { loginHtmlPath = '/login.html', urlStartsWith, apiHost, autoLogin = true } = cfg
57
57
 
58
- return async (req, res, next) => {
58
+ return async function requireAdminPermissionsFn(req, res, next) {
59
59
  if (urlStartsWith && !req.url.startsWith(urlStartsWith)) return next()
60
60
 
61
61
  try {
@@ -1,11 +1,20 @@
1
1
  import { Admin401ErrorData, HttpError } from '@naturalcycles/js-lib'
2
2
  import { BackendRequestHandler } from '../server/server.model'
3
- import { AdminMiddleware, RequireAdminCfg, requireAdminPermissions } from './admin.mw'
3
+ import { AdminMiddleware, RequireAdminCfg, requireAdminPermissions } from './adminMiddleware'
4
4
  import { BaseAdminService } from './base.admin.service'
5
5
 
6
6
  export interface SecureHeaderMiddlewareCfg extends RequireAdminCfg {
7
7
  adminService: BaseAdminService
8
- secureHeader: string
8
+
9
+ /**
10
+ * Defaults to `Authorization`
11
+ */
12
+ secureHeaderKey?: string
13
+
14
+ /**
15
+ * If undefined - any value will be accepted, but the header still need to be present.
16
+ */
17
+ secureHeaderValue?: string
9
18
  }
10
19
 
11
20
  /**
@@ -20,16 +29,20 @@ function requireSecureHeaderOrAdmin(
20
29
  cfg: SecureHeaderMiddlewareCfg,
21
30
  reqPermissions?: string[],
22
31
  ): BackendRequestHandler {
32
+ const { secureHeaderKey = 'Authorization', secureHeaderValue } = cfg
33
+
23
34
  const requireAdmin = requireAdminPermissions(cfg.adminService, reqPermissions, cfg)
24
35
 
25
36
  return async (req, res, next) => {
26
- const providedHeader = req.get('Authorization')
37
+ const providedHeader = req.get(secureHeaderKey)
27
38
 
28
39
  // pass
29
- if (!cfg.adminService.cfg.authEnabled || providedHeader === cfg.secureHeader) return next()
40
+ if (!cfg.adminService.cfg.authEnabled) return next()
30
41
 
31
42
  // Header provided - don't check for Admin
32
43
  if (providedHeader) {
44
+ if (!secureHeaderValue || providedHeader === secureHeaderValue) return next()
45
+
33
46
  return next(
34
47
  new HttpError<Admin401ErrorData>('secureHeader or adminToken is required', {
35
48
  httpStatusCode: 401,
package/src/index.ts CHANGED
@@ -4,10 +4,13 @@ import {
4
4
  createAdminMiddleware,
5
5
  loginHtml,
6
6
  RequireAdminCfg,
7
- } from './admin/admin.mw'
7
+ } from './admin/adminMiddleware'
8
8
  import { AdminInfo, AdminServiceCfg, BaseAdminService } from './admin/base.admin.service'
9
9
  import { FirebaseSharedService } from './admin/firebase.shared.service'
10
- import { createSecureHeaderMiddleware, SecureHeaderMiddlewareCfg } from './admin/secureHeader.mw'
10
+ import {
11
+ createSecureHeaderMiddleware,
12
+ SecureHeaderMiddlewareCfg,
13
+ } from './admin/secureHeaderMiddleware'
11
14
  import { BaseEnv } from './env/env.model'
12
15
  import { EnvSharedService, EnvSharedServiceCfg } from './env/env.shared.service'
13
16
  export * from './gae/appEngine.util'