cdk-factory 0.7.24__tar.gz → 0.7.26__tar.gz

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.

Potentially problematic release.


This version of cdk-factory might be problematic. Click here for more details.

Files changed (130) hide show
  1. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/PKG-INFO +1 -1
  2. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/pyproject.toml +1 -1
  3. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/apigateway_route_config.py +10 -0
  4. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/utilities/api_gateway_integration_utility.py +134 -0
  5. cdk_factory-0.7.26/src/cdk_factory/version.py +1 -0
  6. cdk_factory-0.7.24/src/cdk_factory/version.py +0 -1
  7. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/.gitignore +0 -0
  8. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/LICENSE +0 -0
  9. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/README.md +0 -0
  10. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/archive/README.md +0 -0
  11. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/archive/migrate_to_enhanced_ssm.py +0 -0
  12. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/mypy.ini +0 -0
  13. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/publish_to_pypi.py +0 -0
  14. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/publish_to_pypi.sh +0 -0
  15. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/pysetup.py +0 -0
  16. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/pysetup.sh +0 -0
  17. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/requirements.dev.txt +0 -0
  18. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/requirements.tests.txt +0 -0
  19. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/requirements.txt +0 -0
  20. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/run-checks.sh +0 -0
  21. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/run-tests.sh +0 -0
  22. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/__init__.py +0 -0
  23. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/app.py +0 -0
  24. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/builds/README.md +0 -0
  25. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/cdk.json +0 -0
  26. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/commands/command_loader.py +0 -0
  27. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/base_config.py +0 -0
  28. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/cdk_config.py +0 -0
  29. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/deployment.py +0 -0
  30. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/deployment_wave.py +0 -0
  31. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/devops.py +0 -0
  32. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/enhanced_base_config.py +0 -0
  33. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/enhanced_ssm_config.py +0 -0
  34. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/management.py +0 -0
  35. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/pipeline.py +0 -0
  36. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/pipeline_stage.py +0 -0
  37. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/_resources.py +0 -0
  38. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/api_gateway.py +0 -0
  39. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/auto_scaling.py +0 -0
  40. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/cloudfront.py +0 -0
  41. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/cloudwatch_widget.py +0 -0
  42. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/code_artifact.py +0 -0
  43. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/code_artifact_login.py +0 -0
  44. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/code_repository.py +0 -0
  45. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/cognito.py +0 -0
  46. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/docker.py +0 -0
  47. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/dynamodb.py +0 -0
  48. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/ecr.py +0 -0
  49. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/exisiting.py +0 -0
  50. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/lambda_function.py +0 -0
  51. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/lambda_layers.py +0 -0
  52. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/lambda_triggers.py +0 -0
  53. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/load_balancer.py +0 -0
  54. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/rds.py +0 -0
  55. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/resource_mapping.py +0 -0
  56. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/resource_naming.py +0 -0
  57. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/resource_types.py +0 -0
  58. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/route53.py +0 -0
  59. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/route53_hosted_zone.py +0 -0
  60. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/s3.py +0 -0
  61. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/security_group.py +0 -0
  62. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/security_group_full_stack.py +0 -0
  63. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/sqs.py +0 -0
  64. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/resources/vpc.py +0 -0
  65. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/stack.py +0 -0
  66. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/configurations/workload.py +0 -0
  67. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/constructs/cloudfront/cloudfront_distribution_construct.py +0 -0
  68. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/constructs/ecr/ecr_construct.py +0 -0
  69. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/constructs/lambdas/lambda_function_construct.py +0 -0
  70. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/constructs/lambdas/lambda_function_docker_construct.py +0 -0
  71. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/constructs/lambdas/lambda_function_role_construct.py +0 -0
  72. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/constructs/lambdas/policies/policy_docs.py +0 -0
  73. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/constructs/lambdas/policies/policy_statements.py +0 -0
  74. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/constructs/s3_buckets/s3_bucket_construct.py +0 -0
  75. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_destination_construct.py +0 -0
  76. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_source_construct.py +0 -0
  77. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/constructs/sqs/policies/sqs_policies.py +0 -0
  78. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/interfaces/enhanced_ssm_parameter_mixin.py +0 -0
  79. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/interfaces/istack.py +0 -0
  80. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/interfaces/live_ssm_resolver.py +0 -0
  81. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/interfaces/ssm_parameter_mixin.py +0 -0
  82. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/lambdas/health_handler.py +0 -0
  83. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/pipeline/pipeline_factory.py +0 -0
  84. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/pipeline/security/policies.py +0 -0
  85. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/pipeline/security/roles.py +0 -0
  86. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/pipeline/stage.py +0 -0
  87. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack/istack.py +0 -0
  88. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack/stack_factory.py +0 -0
  89. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack/stack_module_loader.py +0 -0
  90. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack/stack_module_registry.py +0 -0
  91. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack/stack_modules.py +0 -0
  92. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/__init__.py +0 -0
  93. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/api_gateway/api_gateway_stack.py +0 -0
  94. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/auto_scaling/__init__.py +0 -0
  95. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/auto_scaling/auto_scaling_stack.py +0 -0
  96. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/aws_lambdas/lambda_stack.py +0 -0
  97. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/buckets/README.md +0 -0
  98. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/buckets/bucket_stack.py +0 -0
  99. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/code_artifact/code_artifact_stack.py +0 -0
  100. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/cognito/cognito_stack.py +0 -0
  101. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/dynamodb/dynamodb_stack.py +0 -0
  102. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/ecr/README.md +0 -0
  103. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/ecr/ecr_stack.py +0 -0
  104. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/load_balancer/__init__.py +0 -0
  105. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/load_balancer/load_balancer_stack.py +0 -0
  106. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/rds/__init__.py +0 -0
  107. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/rds/rds_stack.py +0 -0
  108. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/route53/__init__.py +0 -0
  109. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/route53/route53_stack.py +0 -0
  110. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/security_group/__init__.py +0 -0
  111. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/security_group/security_group_full_stack.py +0 -0
  112. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/security_group/security_group_stack.py +0 -0
  113. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/simple_queue_service/sqs_stack.py +0 -0
  114. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/stack_base.py +0 -0
  115. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/vpc/__init__.py +0 -0
  116. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/vpc/vpc_stack.py +0 -0
  117. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stack_library/websites/static_website_stack.py +0 -0
  118. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/stages/websites/static_website_stage.py +0 -0
  119. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/utilities/commandline_args.py +0 -0
  120. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/utilities/configuration_loader.py +0 -0
  121. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/utilities/docker_utilities.py +0 -0
  122. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/utilities/environment_services.py +0 -0
  123. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/utilities/file_operations.py +0 -0
  124. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/utilities/git_utilities.py +0 -0
  125. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/utilities/json_loading_utility.py +0 -0
  126. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/utilities/lambda_function_utilities.py +0 -0
  127. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/utilities/os_execute.py +0 -0
  128. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/utils/api_gateway_utilities.py +0 -0
  129. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/cdk_factory/workload/workload_factory.py +0 -0
  130. {cdk_factory-0.7.24 → cdk_factory-0.7.26}/src/handlers/test/handler.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cdk_factory
3
- Version: 0.7.24
3
+ Version: 0.7.26
4
4
  Summary: CDK Factory. A QuickStarter and best practices setup for CDK projects
5
5
  Author-email: Eric Wilson <eric.wilson@geekcafe.com>
6
6
  License: MIT License
@@ -33,7 +33,7 @@ markers = [
33
33
  [project]
34
34
 
35
35
  name = "cdk_factory"
36
- version = "0.7.24"
36
+ version = "0.7.26"
37
37
  authors = [
38
38
  { name="Eric Wilson", email="eric.wilson@geekcafe.com" }
39
39
  ]
@@ -68,3 +68,13 @@ class ApiGatewayConfigRouteConfig:
68
68
  def user_pool_id(self) -> str | None:
69
69
  """User pool ID for existing authorizers"""
70
70
  return self._config.get("user_pool_id")
71
+
72
+ @property
73
+ def allow_public_override(self) -> bool:
74
+ """Whether to allow public access when Cognito is available"""
75
+ return self._config.get("allow_public_override", False)
76
+
77
+ @property
78
+ def dictionary(self) -> Dict[str, Any]:
79
+ """Access to the underlying configuration dictionary"""
80
+ return self._config
@@ -54,6 +54,17 @@ class ApiGatewayIntegrationUtility:
54
54
  if not api_config:
55
55
  raise ValueError("API Gateway config is missing in Lambda function config")
56
56
 
57
+ # Validate authorization configuration for security
58
+ has_cognito_authorizer = (
59
+ self.authorizer is not None or
60
+ self._get_existing_authorizer_id_with_ssm_fallback(api_config, stack_config) is not None
61
+ )
62
+
63
+ # Apply enhanced authorization validation and fallback logic
64
+ api_config = self._validate_and_adjust_authorization_configuration(
65
+ api_config, has_cognito_authorizer
66
+ )
67
+
57
68
  # Get or create authorizer if needed (only for COGNITO_USER_POOLS authorization)
58
69
  if api_config.authorization_type != "NONE" and not self.authorizer:
59
70
  self.authorizer = self.get_or_create_authorizer(
@@ -1294,3 +1305,126 @@ class ApiGatewayIntegrationUtility:
1294
1305
  api_gateways[api_key]['integrations'].append(integration)
1295
1306
 
1296
1307
  return api_gateways
1308
+
1309
+ def _validate_and_adjust_authorization_configuration(
1310
+ self, api_config: ApiGatewayConfigRouteConfig, has_cognito_authorizer: bool
1311
+ ) -> ApiGatewayConfigRouteConfig:
1312
+ """
1313
+ Validate and adjust authorization configuration for security and clarity.
1314
+
1315
+ This method implements 'secure by default' with explicit overrides:
1316
+ - If Cognito is available and route wants NONE auth, requires explicit override
1317
+ - If Cognito is not available and route wants COGNITO auth, raises error
1318
+ - Provides verbose warnings for monitoring and security awareness
1319
+ - Returns a potentially modified api_config with adjusted authorization_type
1320
+
1321
+ Args:
1322
+ api_config (ApiGatewayConfigRouteConfig): Route configuration
1323
+ has_cognito_authorizer (bool): Whether a Cognito authorizer is configured
1324
+
1325
+ Returns:
1326
+ ApiGatewayConfigRouteConfig: Potentially modified configuration
1327
+
1328
+ Raises:
1329
+ ValueError: When there are security conflicts without explicit overrides
1330
+ """
1331
+ import logging
1332
+ from copy import deepcopy
1333
+
1334
+ # Create a copy to avoid modifying the original
1335
+ modified_config = deepcopy(api_config)
1336
+
1337
+ auth_type = getattr(api_config, 'authorization_type', 'COGNITO')
1338
+
1339
+ # Check for explicit override flag
1340
+ explicit_override = getattr(api_config, 'allow_public_override', False)
1341
+
1342
+ route_path = getattr(api_config, 'routes', 'unknown')
1343
+ method = getattr(api_config, 'method', 'unknown')
1344
+
1345
+ logger = logging.getLogger(__name__)
1346
+
1347
+ # Case 1: Cognito available + NONE requested + No explicit override = ERROR
1348
+ if has_cognito_authorizer and auth_type == "NONE" and not explicit_override:
1349
+ error_msg = (
1350
+ f"🚨 SECURITY CONFLICT DETECTED for route {route_path} ({method}):\n"
1351
+ f" ❌ Cognito authorizer is configured (manual or auto-import)\n"
1352
+ f" ❌ authorization_type is set to 'NONE' (public access)\n"
1353
+ f" ❌ This creates a security risk - public endpoint with auth available\n\n"
1354
+ f"💡 SOLUTIONS:\n"
1355
+ f" 1. Remove Cognito configuration if you want public access\n"
1356
+ f" 2. Add 'allow_public_override': true to explicitly allow public access\n"
1357
+ f" 3. Remove 'authorization_type': 'NONE' to use secure Cognito auth\n\n"
1358
+ f"🔒 This prevents accidental public endpoints when authentication is available."
1359
+ )
1360
+ raise ValueError(error_msg)
1361
+
1362
+ # Case 2: No Cognito + COGNITO explicitly requested = ERROR
1363
+ # Only error if COGNITO was explicitly requested, not if it's the default
1364
+ original_auth_type = None
1365
+ if hasattr(api_config, 'dictionary') and api_config.dictionary:
1366
+ original_auth_type = api_config.dictionary.get('authorization_type')
1367
+
1368
+ if not has_cognito_authorizer and original_auth_type == "COGNITO":
1369
+ error_msg = (
1370
+ f"🚨 CONFIGURATION ERROR for route {route_path} ({method}):\n"
1371
+ f" ❌ authorization_type is explicitly set to 'COGNITO' but no Cognito authorizer configured\n"
1372
+ f" ❌ Cannot secure endpoint without authentication provider\n\n"
1373
+ f"💡 SOLUTIONS:\n"
1374
+ f" 1. Add Cognito configuration to enable authentication\n"
1375
+ f" 2. Set authorization_type to 'NONE' for public access\n"
1376
+ f" 3. Configure SSM auto-import for user_pool_arn\n"
1377
+ f" 4. Remove explicit authorization_type to use default behavior"
1378
+ )
1379
+ raise ValueError(error_msg)
1380
+
1381
+ # Case 3: Cognito available + NONE requested + Explicit override = WARN
1382
+ if has_cognito_authorizer and auth_type == "NONE" and explicit_override:
1383
+ warning_msg = (
1384
+ f"⚠️ PUBLIC ENDPOINT CONFIGURED: {route_path} ({method})\n"
1385
+ f" 🔓 This endpoint is intentionally public (allow_public_override: true)\n"
1386
+ f" 🔐 Cognito authentication is available but overridden\n"
1387
+ f" 📊 Consider monitoring this endpoint for unexpected usage patterns\n"
1388
+ f" 🔍 Review periodically: Should this endpoint be secured?"
1389
+ )
1390
+
1391
+ # Print to console during deployment for visibility
1392
+ print(warning_msg)
1393
+
1394
+ # Structured logging for monitoring and metrics
1395
+ logger.warning(
1396
+ "Public endpoint configured with Cognito available",
1397
+ extra={
1398
+ "route": route_path,
1399
+ "method": method,
1400
+ "security_override": True,
1401
+ "cognito_available": True,
1402
+ "authorization_type": "NONE",
1403
+ "metric_name": "public_endpoint_with_cognito",
1404
+ "security_decision": "intentional_public",
1405
+ "recommendation": "review_periodically"
1406
+ }
1407
+ )
1408
+
1409
+ # Case 4: No Cognito + default COGNITO = Fall back to NONE
1410
+ if not has_cognito_authorizer and auth_type == "COGNITO" and original_auth_type is None:
1411
+ modified_config.authorization_type = "NONE"
1412
+ logger.info(
1413
+ f"No Cognito authorizer available for route {route_path} ({method}), "
1414
+ f"defaulting to public access (NONE authorization)"
1415
+ )
1416
+
1417
+ # Case 5: No Cognito + NONE = INFO (expected for public-only APIs)
1418
+ if not has_cognito_authorizer and auth_type == "NONE":
1419
+ logger.info(
1420
+ f"Public endpoint configured (no Cognito available): {route_path} ({method})",
1421
+ extra={
1422
+ "route": route_path,
1423
+ "method": method,
1424
+ "authorization_type": "NONE",
1425
+ "cognito_available": False,
1426
+ "security_decision": "public_only_api"
1427
+ }
1428
+ )
1429
+
1430
+ return modified_config
@@ -0,0 +1 @@
1
+ __version__ = "0.7.26"
@@ -1 +0,0 @@
1
- __version__ = "0.7.24"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes