@dereekb/firebase-server 13.11.4 → 13.11.6

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.
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/mailgun",
3
- "version": "13.11.4",
3
+ "version": "13.11.6",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.11.4",
6
- "@dereekb/firebase": "13.11.4",
7
- "@dereekb/firebase-server": "13.11.4",
8
- "@dereekb/date": "13.11.4",
9
- "@dereekb/nestjs": "13.11.4",
10
- "@dereekb/model": "13.11.4",
11
- "@dereekb/rxjs": "13.11.4",
12
- "@dereekb/util": "13.11.4"
5
+ "@dereekb/analytics": "13.11.6",
6
+ "@dereekb/firebase": "13.11.6",
7
+ "@dereekb/firebase-server": "13.11.6",
8
+ "@dereekb/date": "13.11.6",
9
+ "@dereekb/nestjs": "13.11.6",
10
+ "@dereekb/model": "13.11.6",
11
+ "@dereekb/rxjs": "13.11.6",
12
+ "@dereekb/util": "13.11.6"
13
13
  },
14
14
  "exports": {
15
15
  "./package.json": "./package.json",
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/model",
3
- "version": "13.11.4",
3
+ "version": "13.11.6",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.11.4",
6
- "@dereekb/date": "13.11.4",
7
- "@dereekb/firebase": "13.11.4",
8
- "@dereekb/firebase-server": "13.11.4",
9
- "@dereekb/model": "13.11.4",
10
- "@dereekb/nestjs": "13.11.4",
11
- "@dereekb/rxjs": "13.11.4",
12
- "@dereekb/util": "13.11.4",
5
+ "@dereekb/analytics": "13.11.6",
6
+ "@dereekb/date": "13.11.6",
7
+ "@dereekb/firebase": "13.11.6",
8
+ "@dereekb/firebase-server": "13.11.6",
9
+ "@dereekb/model": "13.11.6",
10
+ "@dereekb/nestjs": "13.11.6",
11
+ "@dereekb/rxjs": "13.11.6",
12
+ "@dereekb/util": "13.11.6",
13
13
  "@nestjs/common": "^11.1.19",
14
14
  "@nestjs/config": "^4.0.4",
15
15
  "archiver": "^7.0.1",
package/oidc/index.cjs.js CHANGED
@@ -2583,7 +2583,7 @@ function _define_property$a(obj, key, value) {
2583
2583
  }
2584
2584
  return obj;
2585
2585
  }
2586
- function _instanceof$1(left, right) {
2586
+ function _instanceof$2(left, right) {
2587
2587
  "@swc/helpers - instanceof";
2588
2588
  if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
2589
2589
  return !!right[Symbol.hasInstance](left);
@@ -2992,7 +2992,7 @@ var GRANTABLE_MODELS = new Set(GRANTABLE_MODEL_NAMES);
2992
2992
  * @returns the decrypted adapter payload, or undefined if the entry has expired
2993
2993
  */ key: "_toPayload",
2994
2994
  value: function _toPayload(data) {
2995
- var expiresDate = data.expiresAt ? _instanceof$1(data.expiresAt, Date) ? data.expiresAt : data.expiresAt.toDate() : undefined;
2995
+ var expiresDate = data.expiresAt ? _instanceof$2(data.expiresAt, Date) ? data.expiresAt : data.expiresAt.toDate() : undefined;
2996
2996
  var isExpired = expiresDate != null && expiresDate < new Date();
2997
2997
  return isExpired ? undefined : encryptionService.decryptAdapterPayload(data.payload);
2998
2998
  }
@@ -4160,7 +4160,7 @@ function _define_property$6(obj, key, value) {
4160
4160
  }
4161
4161
  return obj;
4162
4162
  }
4163
- function _instanceof(left, right) {
4163
+ function _instanceof$1(left, right) {
4164
4164
  "@swc/helpers - instanceof";
4165
4165
  if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
4166
4166
  return !!right[Symbol.hasInstance](left);
@@ -4324,7 +4324,7 @@ function _ts_generator$4(thisArg, body) {
4324
4324
  ];
4325
4325
  case 3:
4326
4326
  err = _state.sent();
4327
- if (_instanceof(err, common.UnauthorizedException)) {
4327
+ if (_instanceof$1(err, common.UnauthorizedException)) {
4328
4328
  throw err;
4329
4329
  }
4330
4330
  this.logger.error('Bearer token verification failed', err);
@@ -4927,6 +4927,14 @@ function _define_property$3(obj, key, value) {
4927
4927
  }
4928
4928
  return obj;
4929
4929
  }
4930
+ function _instanceof(left, right) {
4931
+ "@swc/helpers - instanceof";
4932
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
4933
+ return !!right[Symbol.hasInstance](left);
4934
+ } else {
4935
+ return left instanceof right;
4936
+ }
4937
+ }
4930
4938
  function _iterable_to_array_limit(arr, i) {
4931
4939
  var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
4932
4940
  if (_i == null) return;
@@ -5064,6 +5072,14 @@ function _ts_generator$2(thisArg, body) {
5064
5072
  };
5065
5073
  }
5066
5074
  }
5075
+ /**
5076
+ * OIDC scopes that the server always grants on consent when they were
5077
+ * requested, regardless of whether the frontend included them in
5078
+ * `grantedOIDCScopes`. `openid` is required for any OIDC flow, so the
5079
+ * UI shows it as non-deselectable and the server enforces it here.
5080
+ */ var ALWAYS_GRANTED_OIDC_SCOPES = [
5081
+ 'openid'
5082
+ ];
5067
5083
  // MARK: Interaction Controller
5068
5084
  /**
5069
5085
  * Controller for OIDC interaction endpoints (login/consent).
@@ -5218,7 +5234,7 @@ function _ts_generator$2(thisArg, body) {
5218
5234
  * @throws {HttpException} 400 when the consent interaction cannot be completed.
5219
5235
  */ function postConsent(uid, body, res) {
5220
5236
  return _async_to_generator$2(function() {
5221
- var _ref, _ref1, redirectTo, interaction, prompt, params, session, clientId, requestedRawTtl, clientPayload, clientMaxSessionTtl, expiresInSeconds, grant, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _step_value, indicator, scopes, grantId, redirectTo1;
5237
+ var _ref, _ref1, _prompt_details_missingOIDCScope, _prompt_details_missingOIDCClaims, _prompt_details_missingResourceScopes, redirectTo, interaction, prompt, params, session, clientId, requestedRawTtl, clientPayload, clientMaxSessionTtl, expiresInSeconds, grant, missingOIDCScope, _resolveEffectiveSubset, granted, rejected, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, value, missingOIDCClaims, _resolveEffectiveSubset1, granted1, rejected1, missingResourceScopes, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, _step_value, indicator, scopes, _body_grantedResourceScopes, requestedSubset, _resolveEffectiveSubset2, granted2, rejected2, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, value1, grantId, redirectTo1, err;
5222
5238
  return _ts_generator$2(this, function(_state) {
5223
5239
  switch(_state.label){
5224
5240
  case 0:
@@ -5288,18 +5304,17 @@ function _ts_generator$2(thisArg, body) {
5288
5304
  ];
5289
5305
  case 7:
5290
5306
  grant = _state.sent();
5291
- if (prompt.details.missingOIDCScope) {
5292
- grant.addOIDCScope(prompt.details.missingOIDCScope.join(' '));
5293
- }
5294
- if (prompt.details.missingOIDCClaims) {
5295
- grant.addOIDCClaims(prompt.details.missingOIDCClaims);
5296
- }
5297
- if (prompt.details.missingResourceScopes) {
5307
+ missingOIDCScope = (_prompt_details_missingOIDCScope = prompt.details.missingOIDCScope) !== null && _prompt_details_missingOIDCScope !== void 0 ? _prompt_details_missingOIDCScope : [];
5308
+ if (missingOIDCScope.length > 0) {
5309
+ _resolveEffectiveSubset = resolveEffectiveSubset(missingOIDCScope, body.grantedOIDCScopes, ALWAYS_GRANTED_OIDC_SCOPES), granted = _resolveEffectiveSubset.granted, rejected = _resolveEffectiveSubset.rejected;
5310
+ if (granted.length > 0) {
5311
+ grant.addOIDCScope(granted.join(' '));
5312
+ }
5298
5313
  _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
5299
5314
  try {
5300
- for(_iterator = Object.entries(prompt.details.missingResourceScopes)[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
5301
- _step_value = _sliced_to_array(_step.value, 2), indicator = _step_value[0], scopes = _step_value[1];
5302
- grant.addResourceScope(indicator, scopes.join(' '));
5315
+ for(_iterator = rejected[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
5316
+ value = _step.value;
5317
+ grant.rejectOIDCScope(value);
5303
5318
  }
5304
5319
  } catch (err) {
5305
5320
  _didIteratorError = true;
@@ -5316,6 +5331,62 @@ function _ts_generator$2(thisArg, body) {
5316
5331
  }
5317
5332
  }
5318
5333
  }
5334
+ missingOIDCClaims = (_prompt_details_missingOIDCClaims = prompt.details.missingOIDCClaims) !== null && _prompt_details_missingOIDCClaims !== void 0 ? _prompt_details_missingOIDCClaims : [];
5335
+ if (missingOIDCClaims.length > 0) {
5336
+ _resolveEffectiveSubset1 = resolveEffectiveSubset(missingOIDCClaims, body.grantedOIDCClaims), granted1 = _resolveEffectiveSubset1.granted, rejected1 = _resolveEffectiveSubset1.rejected;
5337
+ if (granted1.length > 0) {
5338
+ grant.addOIDCClaims(granted1);
5339
+ }
5340
+ if (rejected1.length > 0) {
5341
+ grant.rejectOIDCClaims(rejected1);
5342
+ }
5343
+ }
5344
+ missingResourceScopes = (_prompt_details_missingResourceScopes = prompt.details.missingResourceScopes) !== null && _prompt_details_missingResourceScopes !== void 0 ? _prompt_details_missingResourceScopes : {};
5345
+ _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
5346
+ try {
5347
+ for(_iterator1 = Object.entries(missingResourceScopes)[Symbol.iterator](); !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
5348
+ _step_value = _sliced_to_array(_step1.value, 2), indicator = _step_value[0], scopes = _step_value[1];
5349
+ ;
5350
+ requestedSubset = (_body_grantedResourceScopes = body.grantedResourceScopes) === null || _body_grantedResourceScopes === void 0 ? void 0 : _body_grantedResourceScopes[indicator];
5351
+ _resolveEffectiveSubset2 = resolveEffectiveSubset(scopes, requestedSubset), granted2 = _resolveEffectiveSubset2.granted, rejected2 = _resolveEffectiveSubset2.rejected;
5352
+ if (granted2.length > 0) {
5353
+ grant.addResourceScope(indicator, granted2.join(' '));
5354
+ }
5355
+ _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
5356
+ try {
5357
+ for(_iterator2 = rejected2[Symbol.iterator](); !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){
5358
+ value1 = _step2.value;
5359
+ grant.rejectResourceScope(indicator, value1);
5360
+ }
5361
+ } catch (err) {
5362
+ _didIteratorError2 = true;
5363
+ _iteratorError2 = err;
5364
+ } finally{
5365
+ try {
5366
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
5367
+ _iterator2.return();
5368
+ }
5369
+ } finally{
5370
+ if (_didIteratorError2) {
5371
+ throw _iteratorError2;
5372
+ }
5373
+ }
5374
+ }
5375
+ }
5376
+ } catch (err) {
5377
+ _didIteratorError1 = true;
5378
+ _iteratorError1 = err;
5379
+ } finally{
5380
+ try {
5381
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
5382
+ _iterator1.return();
5383
+ }
5384
+ } finally{
5385
+ if (_didIteratorError1) {
5386
+ throw _iteratorError1;
5387
+ }
5388
+ }
5389
+ }
5319
5390
  return [
5320
5391
  4,
5321
5392
  grant.save()
@@ -5342,7 +5413,10 @@ function _ts_generator$2(thisArg, body) {
5342
5413
  11
5343
5414
  ];
5344
5415
  case 10:
5345
- _state.sent();
5416
+ err = _state.sent();
5417
+ if (_instanceof(err, common.HttpException)) {
5418
+ throw err;
5419
+ }
5346
5420
  throw new common.HttpException('Consent interaction failed', common.HttpStatus.BAD_REQUEST);
5347
5421
  case 11:
5348
5422
  return [
@@ -5426,6 +5500,105 @@ exports.OidcInteractionController = __decorate([
5426
5500
  __param(2, common.Inject(OidcAccountService)),
5427
5501
  __param(3, common.Inject(exports.OidcService))
5428
5502
  ], exports.OidcInteractionController);
5503
+ /**
5504
+ * Resolves the effective set to grant — and the complementary set to
5505
+ * reject — from a missing set, an optional caller-provided subset, and
5506
+ * an optional list of always-granted entries.
5507
+ *
5508
+ * Throws `400 BAD_REQUEST` if the requested subset contains entries that
5509
+ * are not in the missing set (no privilege escalation).
5510
+ *
5511
+ * - When `requestedSubset` is undefined → grants everything in `missing` (back-compat); rejects nothing.
5512
+ * - When `requestedSubset` is provided → grants exactly that subset; rejects every other missing entry so
5513
+ * oidc-provider does not re-prompt for them.
5514
+ * - Always-granted entries are union'd into `granted` (clamped to `missing`).
5515
+ *
5516
+ * @param missing - Entries the OIDC prompt indicated were missing for this consent.
5517
+ * @param requestedSubset - Optional subset the caller wants to grant; must be a subset of `missing`.
5518
+ * @param alwaysGranted - Entries that must be granted whenever they appear in `missing`, regardless of `requestedSubset`.
5519
+ * @returns `granted` to add to the grant and `rejected` to record on the grant.
5520
+ */ function resolveEffectiveSubset(missing, requestedSubset) {
5521
+ var alwaysGranted = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [];
5522
+ var missingSet = new Set(missing);
5523
+ var baseSelection;
5524
+ if (requestedSubset === undefined) {
5525
+ baseSelection = missing;
5526
+ } else {
5527
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
5528
+ try {
5529
+ for(var _iterator = requestedSubset[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
5530
+ var value = _step.value;
5531
+ if (!missingSet.has(value)) {
5532
+ throw new common.HttpException('Granted value "'.concat(value, '" is not in the requested set.'), common.HttpStatus.BAD_REQUEST);
5533
+ }
5534
+ }
5535
+ } catch (err) {
5536
+ _didIteratorError = true;
5537
+ _iteratorError = err;
5538
+ } finally{
5539
+ try {
5540
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
5541
+ _iterator.return();
5542
+ }
5543
+ } finally{
5544
+ if (_didIteratorError) {
5545
+ throw _iteratorError;
5546
+ }
5547
+ }
5548
+ }
5549
+ baseSelection = requestedSubset;
5550
+ }
5551
+ var grantedSet = new Set(baseSelection);
5552
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
5553
+ try {
5554
+ for(var _iterator1 = alwaysGranted[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
5555
+ var value1 = _step1.value;
5556
+ if (missingSet.has(value1)) {
5557
+ grantedSet.add(value1);
5558
+ }
5559
+ }
5560
+ } catch (err) {
5561
+ _didIteratorError1 = true;
5562
+ _iteratorError1 = err;
5563
+ } finally{
5564
+ try {
5565
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
5566
+ _iterator1.return();
5567
+ }
5568
+ } finally{
5569
+ if (_didIteratorError1) {
5570
+ throw _iteratorError1;
5571
+ }
5572
+ }
5573
+ }
5574
+ var rejected = [];
5575
+ var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
5576
+ try {
5577
+ for(var _iterator2 = missing[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){
5578
+ var value2 = _step2.value;
5579
+ if (!grantedSet.has(value2)) {
5580
+ rejected.push(value2);
5581
+ }
5582
+ }
5583
+ } catch (err) {
5584
+ _didIteratorError2 = true;
5585
+ _iteratorError2 = err;
5586
+ } finally{
5587
+ try {
5588
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
5589
+ _iterator2.return();
5590
+ }
5591
+ } finally{
5592
+ if (_didIteratorError2) {
5593
+ throw _iteratorError2;
5594
+ }
5595
+ }
5596
+ }
5597
+ return {
5598
+ granted: Array.from(grantedSet),
5599
+ rejected: rejected
5600
+ };
5601
+ }
5429
5602
 
5430
5603
  function asyncGeneratorStep$1(gen, resolve, reject, _next, _throw, key, arg) {
5431
5604
  try {
package/oidc/index.esm.js CHANGED
@@ -2581,7 +2581,7 @@ function _define_property$a(obj, key, value) {
2581
2581
  }
2582
2582
  return obj;
2583
2583
  }
2584
- function _instanceof$1(left, right) {
2584
+ function _instanceof$2(left, right) {
2585
2585
  "@swc/helpers - instanceof";
2586
2586
  if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
2587
2587
  return !!right[Symbol.hasInstance](left);
@@ -2990,7 +2990,7 @@ var GRANTABLE_MODELS = new Set(GRANTABLE_MODEL_NAMES);
2990
2990
  * @returns the decrypted adapter payload, or undefined if the entry has expired
2991
2991
  */ key: "_toPayload",
2992
2992
  value: function _toPayload(data) {
2993
- var expiresDate = data.expiresAt ? _instanceof$1(data.expiresAt, Date) ? data.expiresAt : data.expiresAt.toDate() : undefined;
2993
+ var expiresDate = data.expiresAt ? _instanceof$2(data.expiresAt, Date) ? data.expiresAt : data.expiresAt.toDate() : undefined;
2994
2994
  var isExpired = expiresDate != null && expiresDate < new Date();
2995
2995
  return isExpired ? undefined : encryptionService.decryptAdapterPayload(data.payload);
2996
2996
  }
@@ -4158,7 +4158,7 @@ function _define_property$6(obj, key, value) {
4158
4158
  }
4159
4159
  return obj;
4160
4160
  }
4161
- function _instanceof(left, right) {
4161
+ function _instanceof$1(left, right) {
4162
4162
  "@swc/helpers - instanceof";
4163
4163
  if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
4164
4164
  return !!right[Symbol.hasInstance](left);
@@ -4322,7 +4322,7 @@ function _ts_generator$4(thisArg, body) {
4322
4322
  ];
4323
4323
  case 3:
4324
4324
  err = _state.sent();
4325
- if (_instanceof(err, UnauthorizedException)) {
4325
+ if (_instanceof$1(err, UnauthorizedException)) {
4326
4326
  throw err;
4327
4327
  }
4328
4328
  this.logger.error('Bearer token verification failed', err);
@@ -4925,6 +4925,14 @@ function _define_property$3(obj, key, value) {
4925
4925
  }
4926
4926
  return obj;
4927
4927
  }
4928
+ function _instanceof(left, right) {
4929
+ "@swc/helpers - instanceof";
4930
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
4931
+ return !!right[Symbol.hasInstance](left);
4932
+ } else {
4933
+ return left instanceof right;
4934
+ }
4935
+ }
4928
4936
  function _iterable_to_array_limit(arr, i) {
4929
4937
  var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
4930
4938
  if (_i == null) return;
@@ -5062,6 +5070,14 @@ function _ts_generator$2(thisArg, body) {
5062
5070
  };
5063
5071
  }
5064
5072
  }
5073
+ /**
5074
+ * OIDC scopes that the server always grants on consent when they were
5075
+ * requested, regardless of whether the frontend included them in
5076
+ * `grantedOIDCScopes`. `openid` is required for any OIDC flow, so the
5077
+ * UI shows it as non-deselectable and the server enforces it here.
5078
+ */ var ALWAYS_GRANTED_OIDC_SCOPES = [
5079
+ 'openid'
5080
+ ];
5065
5081
  // MARK: Interaction Controller
5066
5082
  /**
5067
5083
  * Controller for OIDC interaction endpoints (login/consent).
@@ -5216,7 +5232,7 @@ function _ts_generator$2(thisArg, body) {
5216
5232
  * @throws {HttpException} 400 when the consent interaction cannot be completed.
5217
5233
  */ function postConsent(uid, body, res) {
5218
5234
  return _async_to_generator$2(function() {
5219
- var _ref, _ref1, redirectTo, interaction, prompt, params, session, clientId, requestedRawTtl, clientPayload, clientMaxSessionTtl, expiresInSeconds, grant, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _step_value, indicator, scopes, grantId, redirectTo1;
5235
+ var _ref, _ref1, _prompt_details_missingOIDCScope, _prompt_details_missingOIDCClaims, _prompt_details_missingResourceScopes, redirectTo, interaction, prompt, params, session, clientId, requestedRawTtl, clientPayload, clientMaxSessionTtl, expiresInSeconds, grant, missingOIDCScope, _resolveEffectiveSubset, granted, rejected, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, value, missingOIDCClaims, _resolveEffectiveSubset1, granted1, rejected1, missingResourceScopes, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, _step_value, indicator, scopes, _body_grantedResourceScopes, requestedSubset, _resolveEffectiveSubset2, granted2, rejected2, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, value1, grantId, redirectTo1, err;
5220
5236
  return _ts_generator$2(this, function(_state) {
5221
5237
  switch(_state.label){
5222
5238
  case 0:
@@ -5286,18 +5302,17 @@ function _ts_generator$2(thisArg, body) {
5286
5302
  ];
5287
5303
  case 7:
5288
5304
  grant = _state.sent();
5289
- if (prompt.details.missingOIDCScope) {
5290
- grant.addOIDCScope(prompt.details.missingOIDCScope.join(' '));
5291
- }
5292
- if (prompt.details.missingOIDCClaims) {
5293
- grant.addOIDCClaims(prompt.details.missingOIDCClaims);
5294
- }
5295
- if (prompt.details.missingResourceScopes) {
5305
+ missingOIDCScope = (_prompt_details_missingOIDCScope = prompt.details.missingOIDCScope) !== null && _prompt_details_missingOIDCScope !== void 0 ? _prompt_details_missingOIDCScope : [];
5306
+ if (missingOIDCScope.length > 0) {
5307
+ _resolveEffectiveSubset = resolveEffectiveSubset(missingOIDCScope, body.grantedOIDCScopes, ALWAYS_GRANTED_OIDC_SCOPES), granted = _resolveEffectiveSubset.granted, rejected = _resolveEffectiveSubset.rejected;
5308
+ if (granted.length > 0) {
5309
+ grant.addOIDCScope(granted.join(' '));
5310
+ }
5296
5311
  _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
5297
5312
  try {
5298
- for(_iterator = Object.entries(prompt.details.missingResourceScopes)[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
5299
- _step_value = _sliced_to_array(_step.value, 2), indicator = _step_value[0], scopes = _step_value[1];
5300
- grant.addResourceScope(indicator, scopes.join(' '));
5313
+ for(_iterator = rejected[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
5314
+ value = _step.value;
5315
+ grant.rejectOIDCScope(value);
5301
5316
  }
5302
5317
  } catch (err) {
5303
5318
  _didIteratorError = true;
@@ -5314,6 +5329,62 @@ function _ts_generator$2(thisArg, body) {
5314
5329
  }
5315
5330
  }
5316
5331
  }
5332
+ missingOIDCClaims = (_prompt_details_missingOIDCClaims = prompt.details.missingOIDCClaims) !== null && _prompt_details_missingOIDCClaims !== void 0 ? _prompt_details_missingOIDCClaims : [];
5333
+ if (missingOIDCClaims.length > 0) {
5334
+ _resolveEffectiveSubset1 = resolveEffectiveSubset(missingOIDCClaims, body.grantedOIDCClaims), granted1 = _resolveEffectiveSubset1.granted, rejected1 = _resolveEffectiveSubset1.rejected;
5335
+ if (granted1.length > 0) {
5336
+ grant.addOIDCClaims(granted1);
5337
+ }
5338
+ if (rejected1.length > 0) {
5339
+ grant.rejectOIDCClaims(rejected1);
5340
+ }
5341
+ }
5342
+ missingResourceScopes = (_prompt_details_missingResourceScopes = prompt.details.missingResourceScopes) !== null && _prompt_details_missingResourceScopes !== void 0 ? _prompt_details_missingResourceScopes : {};
5343
+ _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
5344
+ try {
5345
+ for(_iterator1 = Object.entries(missingResourceScopes)[Symbol.iterator](); !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
5346
+ _step_value = _sliced_to_array(_step1.value, 2), indicator = _step_value[0], scopes = _step_value[1];
5347
+ ;
5348
+ requestedSubset = (_body_grantedResourceScopes = body.grantedResourceScopes) === null || _body_grantedResourceScopes === void 0 ? void 0 : _body_grantedResourceScopes[indicator];
5349
+ _resolveEffectiveSubset2 = resolveEffectiveSubset(scopes, requestedSubset), granted2 = _resolveEffectiveSubset2.granted, rejected2 = _resolveEffectiveSubset2.rejected;
5350
+ if (granted2.length > 0) {
5351
+ grant.addResourceScope(indicator, granted2.join(' '));
5352
+ }
5353
+ _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
5354
+ try {
5355
+ for(_iterator2 = rejected2[Symbol.iterator](); !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){
5356
+ value1 = _step2.value;
5357
+ grant.rejectResourceScope(indicator, value1);
5358
+ }
5359
+ } catch (err) {
5360
+ _didIteratorError2 = true;
5361
+ _iteratorError2 = err;
5362
+ } finally{
5363
+ try {
5364
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
5365
+ _iterator2.return();
5366
+ }
5367
+ } finally{
5368
+ if (_didIteratorError2) {
5369
+ throw _iteratorError2;
5370
+ }
5371
+ }
5372
+ }
5373
+ }
5374
+ } catch (err) {
5375
+ _didIteratorError1 = true;
5376
+ _iteratorError1 = err;
5377
+ } finally{
5378
+ try {
5379
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
5380
+ _iterator1.return();
5381
+ }
5382
+ } finally{
5383
+ if (_didIteratorError1) {
5384
+ throw _iteratorError1;
5385
+ }
5386
+ }
5387
+ }
5317
5388
  return [
5318
5389
  4,
5319
5390
  grant.save()
@@ -5340,7 +5411,10 @@ function _ts_generator$2(thisArg, body) {
5340
5411
  11
5341
5412
  ];
5342
5413
  case 10:
5343
- _state.sent();
5414
+ err = _state.sent();
5415
+ if (_instanceof(err, HttpException)) {
5416
+ throw err;
5417
+ }
5344
5418
  throw new HttpException('Consent interaction failed', HttpStatus.BAD_REQUEST);
5345
5419
  case 11:
5346
5420
  return [
@@ -5424,6 +5498,105 @@ OidcInteractionController = __decorate([
5424
5498
  __param(2, Inject(OidcAccountService)),
5425
5499
  __param(3, Inject(OidcService))
5426
5500
  ], OidcInteractionController);
5501
+ /**
5502
+ * Resolves the effective set to grant — and the complementary set to
5503
+ * reject — from a missing set, an optional caller-provided subset, and
5504
+ * an optional list of always-granted entries.
5505
+ *
5506
+ * Throws `400 BAD_REQUEST` if the requested subset contains entries that
5507
+ * are not in the missing set (no privilege escalation).
5508
+ *
5509
+ * - When `requestedSubset` is undefined → grants everything in `missing` (back-compat); rejects nothing.
5510
+ * - When `requestedSubset` is provided → grants exactly that subset; rejects every other missing entry so
5511
+ * oidc-provider does not re-prompt for them.
5512
+ * - Always-granted entries are union'd into `granted` (clamped to `missing`).
5513
+ *
5514
+ * @param missing - Entries the OIDC prompt indicated were missing for this consent.
5515
+ * @param requestedSubset - Optional subset the caller wants to grant; must be a subset of `missing`.
5516
+ * @param alwaysGranted - Entries that must be granted whenever they appear in `missing`, regardless of `requestedSubset`.
5517
+ * @returns `granted` to add to the grant and `rejected` to record on the grant.
5518
+ */ function resolveEffectiveSubset(missing, requestedSubset) {
5519
+ var alwaysGranted = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [];
5520
+ var missingSet = new Set(missing);
5521
+ var baseSelection;
5522
+ if (requestedSubset === undefined) {
5523
+ baseSelection = missing;
5524
+ } else {
5525
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
5526
+ try {
5527
+ for(var _iterator = requestedSubset[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
5528
+ var value = _step.value;
5529
+ if (!missingSet.has(value)) {
5530
+ throw new HttpException('Granted value "'.concat(value, '" is not in the requested set.'), HttpStatus.BAD_REQUEST);
5531
+ }
5532
+ }
5533
+ } catch (err) {
5534
+ _didIteratorError = true;
5535
+ _iteratorError = err;
5536
+ } finally{
5537
+ try {
5538
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
5539
+ _iterator.return();
5540
+ }
5541
+ } finally{
5542
+ if (_didIteratorError) {
5543
+ throw _iteratorError;
5544
+ }
5545
+ }
5546
+ }
5547
+ baseSelection = requestedSubset;
5548
+ }
5549
+ var grantedSet = new Set(baseSelection);
5550
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
5551
+ try {
5552
+ for(var _iterator1 = alwaysGranted[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
5553
+ var value1 = _step1.value;
5554
+ if (missingSet.has(value1)) {
5555
+ grantedSet.add(value1);
5556
+ }
5557
+ }
5558
+ } catch (err) {
5559
+ _didIteratorError1 = true;
5560
+ _iteratorError1 = err;
5561
+ } finally{
5562
+ try {
5563
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
5564
+ _iterator1.return();
5565
+ }
5566
+ } finally{
5567
+ if (_didIteratorError1) {
5568
+ throw _iteratorError1;
5569
+ }
5570
+ }
5571
+ }
5572
+ var rejected = [];
5573
+ var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
5574
+ try {
5575
+ for(var _iterator2 = missing[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){
5576
+ var value2 = _step2.value;
5577
+ if (!grantedSet.has(value2)) {
5578
+ rejected.push(value2);
5579
+ }
5580
+ }
5581
+ } catch (err) {
5582
+ _didIteratorError2 = true;
5583
+ _iteratorError2 = err;
5584
+ } finally{
5585
+ try {
5586
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
5587
+ _iterator2.return();
5588
+ }
5589
+ } finally{
5590
+ if (_didIteratorError2) {
5591
+ throw _iteratorError2;
5592
+ }
5593
+ }
5594
+ }
5595
+ return {
5596
+ granted: Array.from(grantedSet),
5597
+ rejected: rejected
5598
+ };
5599
+ }
5427
5600
 
5428
5601
  function asyncGeneratorStep$1(gen, resolve, reject, _next, _throw, key, arg) {
5429
5602
  try {
package/oidc/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/oidc",
3
- "version": "13.11.4",
3
+ "version": "13.11.6",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.11.4",
6
- "@dereekb/date": "13.11.4",
7
- "@dereekb/firebase": "13.11.4",
8
- "@dereekb/firebase-server": "13.11.4",
9
- "@dereekb/model": "13.11.4",
10
- "@dereekb/nestjs": "13.11.4",
11
- "@dereekb/rxjs": "13.11.4",
12
- "@dereekb/util": "13.11.4",
13
- "@dereekb/zoho": "13.11.4",
5
+ "@dereekb/analytics": "13.11.6",
6
+ "@dereekb/date": "13.11.6",
7
+ "@dereekb/firebase": "13.11.6",
8
+ "@dereekb/firebase-server": "13.11.6",
9
+ "@dereekb/model": "13.11.6",
10
+ "@dereekb/nestjs": "13.11.6",
11
+ "@dereekb/rxjs": "13.11.6",
12
+ "@dereekb/util": "13.11.6",
13
+ "@dereekb/zoho": "13.11.6",
14
14
  "@nestjs/common": "^11.1.19",
15
15
  "@nestjs/config": "^4.0.4",
16
16
  "express": "^5.2.1",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server",
3
- "version": "13.11.4",
3
+ "version": "13.11.6",
4
4
  "sideEffects": false,
5
5
  "exports": {
6
6
  "./test": {
@@ -44,15 +44,15 @@
44
44
  "main": "./index.cjs.js",
45
45
  "types": "./src/index.d.ts",
46
46
  "peerDependencies": {
47
- "@dereekb/analytics": "13.11.4",
48
- "@dereekb/date": "13.11.4",
49
- "@dereekb/dbx-core": "13.11.4",
50
- "@dereekb/firebase": "13.11.4",
51
- "@dereekb/model": "13.11.4",
52
- "@dereekb/nestjs": "13.11.4",
53
- "@dereekb/rxjs": "13.11.4",
54
- "@dereekb/util": "13.11.4",
55
- "@dereekb/zoho": "13.11.4",
47
+ "@dereekb/analytics": "13.11.6",
48
+ "@dereekb/date": "13.11.6",
49
+ "@dereekb/dbx-core": "13.11.6",
50
+ "@dereekb/firebase": "13.11.6",
51
+ "@dereekb/model": "13.11.6",
52
+ "@dereekb/nestjs": "13.11.6",
53
+ "@dereekb/rxjs": "13.11.6",
54
+ "@dereekb/util": "13.11.6",
55
+ "@dereekb/zoho": "13.11.6",
56
56
  "@google-cloud/firestore": "^7.11.6",
57
57
  "@google-cloud/storage": "^7.19.0",
58
58
  "@nestjs/common": "^11.1.19",
package/test/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/test",
3
- "version": "13.11.4",
3
+ "version": "13.11.6",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.11.4",
6
- "@dereekb/date": "13.11.4",
7
- "@dereekb/firebase": "13.11.4",
8
- "@dereekb/firebase-server": "13.11.4",
9
- "@dereekb/firebase-server/oidc": "13.11.4",
10
- "@dereekb/model": "13.11.4",
11
- "@dereekb/nestjs": "13.11.4",
12
- "@dereekb/rxjs": "13.11.4",
13
- "@dereekb/util": "13.11.4",
5
+ "@dereekb/analytics": "13.11.6",
6
+ "@dereekb/date": "13.11.6",
7
+ "@dereekb/firebase": "13.11.6",
8
+ "@dereekb/firebase-server": "13.11.6",
9
+ "@dereekb/firebase-server/oidc": "13.11.6",
10
+ "@dereekb/model": "13.11.6",
11
+ "@dereekb/nestjs": "13.11.6",
12
+ "@dereekb/rxjs": "13.11.6",
13
+ "@dereekb/util": "13.11.6",
14
14
  "@google-cloud/firestore": "^7.11.6",
15
15
  "@google-cloud/storage": "^7.19.0",
16
16
  "@nestjs/common": "^11.1.19",
@@ -23,7 +23,7 @@
23
23
  "supertest": "^7.2.2"
24
24
  },
25
25
  "devDependencies": {
26
- "@dereekb/nestjs": "13.11.4"
26
+ "@dereekb/nestjs": "13.11.6"
27
27
  },
28
28
  "exports": {
29
29
  "./package.json": "./package.json",
package/zoho/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/zoho",
3
- "version": "13.11.4",
3
+ "version": "13.11.6",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.11.4",
6
- "@dereekb/date": "13.11.4",
7
- "@dereekb/model": "13.11.4",
8
- "@dereekb/nestjs": "13.11.4",
9
- "@dereekb/rxjs": "13.11.4",
10
- "@dereekb/firebase": "13.11.4",
11
- "@dereekb/util": "13.11.4",
12
- "@dereekb/zoho": "13.11.4"
5
+ "@dereekb/analytics": "13.11.6",
6
+ "@dereekb/date": "13.11.6",
7
+ "@dereekb/model": "13.11.6",
8
+ "@dereekb/nestjs": "13.11.6",
9
+ "@dereekb/rxjs": "13.11.6",
10
+ "@dereekb/firebase": "13.11.6",
11
+ "@dereekb/util": "13.11.6",
12
+ "@dereekb/zoho": "13.11.6"
13
13
  },
14
14
  "exports": {
15
15
  "./package.json": "./package.json",