diff --git a/Pipfile.lock b/Pipfile.lock index 318ed48..fc85bbb 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -28,20 +28,20 @@ }, "boto3": { "hashes": [ - "sha256:0f4089e230d55f981d67376e48cefd41c3d58c7f694480f13288e6ff7b1fefbc", - "sha256:65f0d98a3786ec729ba9b5f70448895b2d1d1f27949aa7af5cb4f39da341bbc4" + "sha256:a5d005667b480c844ed3f814a59f199ce249d0f5669532a17d06200c0a93119c", + "sha256:bfcc665227bb4432a235cb4adb47719438d6472e5ccbf7f09512046c3f749670" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==1.42.4" + "version": "==1.42.14" }, "botocore": { "hashes": [ - "sha256:c3b091fd33809f187824b6434e518b889514ded5164cb379358367c18e8b0d7d", - "sha256:d4816023492b987a804f693c2d76fb751fdc8755d49933106d69e2489c4c0f98" + "sha256:cf5bebb580803c6cfd9886902ca24834b42ecaa808da14fb8cd35ad523c9f621", + "sha256:efe89adfafa00101390ec2c371d453b3359d5f9690261bc3bd70131e0d453e8e" ], "markers": "python_version >= '3.9'", - "version": "==1.42.4" + "version": "==1.42.14" }, "jinja2": { "hashes": [ @@ -198,11 +198,11 @@ }, "urllib3": { "hashes": [ - "sha256:c90f7a39f716c572c4e3e58509581ebd83f9b59cced005b7db7ad2d22b0db99f", - "sha256:cb9bcef5a4b345d5da5d145dc3e30834f58e8018828cbc724d30b4cb7d4d49f1" + "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797", + "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd" ], "markers": "python_version >= '3.9'", - "version": "==2.6.0" + "version": "==2.6.2" } }, "develop": {} diff --git a/environments/sample/main.tf b/environments/sample/main.tf index 1adb2f3..96beae9 100644 --- a/environments/sample/main.tf +++ b/environments/sample/main.tf @@ -14,6 +14,11 @@ module "aws_iam" { arn = module.aws_dynamodb.link_table.arn } + ddb_link_nonce_table = { + name = module.aws_dynamodb.link_nonce_table.name + arn = module.aws_dynamodb.link_nonce_table.arn + } + lambda_redirect_request = { name = module.aws_lambda.lambda_redirect_request.function_name arn = module.aws_lambda.lambda_redirect_request.arn @@ -40,6 +45,11 @@ module "aws_lambda" { arn = module.aws_dynamodb.link_table.arn } + ddb_link_nonce_table = { + name = module.aws_dynamodb.link_nonce_table.name + arn = module.aws_dynamodb.link_nonce_table.arn + } + role_redirect_request = { name = module.aws_iam.role_lambda_redirect_request.name arn = module.aws_iam.role_lambda_redirect_request.arn @@ -50,9 +60,10 @@ module "aws_lambda" { arn = module.aws_iam.role_lambda_admin_portal.arn } - link_prefix = "" # TODO: Change value as needed (e.g. https://example.com/dev/.... -> "dev") - allowed_domain = local.config["allowed_domain"] - reserved_concurrent_executions = local.config["aws"]["lambda"]["reserved_concurrent_executions"] + link_prefix = "" # TODO: Change value as needed (e.g. https://example.com/dev/.... -> "dev") + allowed_domain = local.config["allowed_domain"] + protected_link_request_nonce_lifetime = 300 # TODO: Change value as needed + reserved_concurrent_executions = local.config["aws"]["lambda"]["reserved_concurrent_executions"] } module "aws_s3" { diff --git a/lambda/admin_portal/app.py b/lambda/admin_portal/app.py index 6d5da58..ae03de9 100644 --- a/lambda/admin_portal/app.py +++ b/lambda/admin_portal/app.py @@ -6,11 +6,12 @@ from portal_page.link_create import PortalLinkCreatePage from portal_page.link_list import PortalListPage from portal_page.link_update import PortalLinkUpdatePage -from util.logger_util import setup_logger +from util.logger_util import setup_logger, setup_dev_logger from util.parse_util import parse_domain, parse_request_path from util.response_util import error_response logger = setup_logger("admin_portal") +setup_dev_logger() @event_source(data_class=APIGatewayProxyEvent) diff --git a/lambda/admin_portal/portal_page/link_create.py b/lambda/admin_portal/portal_page/link_create.py index 495dfd7..2dd2841 100644 --- a/lambda/admin_portal/portal_page/link_create.py +++ b/lambda/admin_portal/portal_page/link_create.py @@ -37,6 +37,7 @@ def _parse_request_data(cls, domain: str, _body: str) -> Optional[DelibirdLink]: tag=set(body["tag"]) if "tag" in body else None, expiration_date=as_jst(datetime.fromisoformat(str(body["expiration_date"]))) if "expiration_date" in body else None, expired_origin=str(body["expired_origin"]) if "expired_origin" in body else None, + _passphrase=str(body["passphrase"]) if "passphrase" in body else None, query_omit=bool(body["query_omit"]), query_whitelist=set(body["query_whitelist"]) if "query_whitelist" in body else None, max_uses=int(body["max_uses"]) if "max_uses" in body else None, @@ -84,6 +85,7 @@ def perform(cls, domain: str, event: APIGatewayProxyEvent): tag=link_data.tag, expiration_date=link_data.expiration_date, expired_origin=link_data.expired_origin, + passphrase=link_data._passphrase, # allow read private field query_omit=link_data.query_omit, query_whitelist=link_data.query_whitelist, max_uses=link_data.max_uses diff --git a/lambda/admin_portal/portal_page/link_update.py b/lambda/admin_portal/portal_page/link_update.py index 03a3cb9..8556c72 100644 --- a/lambda/admin_portal/portal_page/link_update.py +++ b/lambda/admin_portal/portal_page/link_update.py @@ -36,6 +36,7 @@ def _parse_request_data(cls, domain: str, _body: str) -> Optional[DelibirdLink]: tag=set(body["tag"]) if "tag" in body else None, expiration_date=as_jst(datetime.fromisoformat(str(body["expiration_date"]))) if "expiration_date" in body else None, expired_origin=str(body["expired_origin"]) if "expired_origin" in body else None, + _passphrase=str(body["passphrase"]) if "passphrase" in body else None, query_omit=bool(body["query_omit"]), query_whitelist=set(body["query_whitelist"]) if "query_whitelist" in body else None, max_uses=int(body["max_uses"]) if "max_uses" in body else None, @@ -77,6 +78,7 @@ def perform(cls, domain: str, event: APIGatewayProxyEvent): DelibirdLinkTableModel.tag.set(link_data.tag), DelibirdLinkTableModel.expiration_date.set(link_data.expiration_date), DelibirdLinkTableModel.expired_origin.set(link_data.expired_origin), + DelibirdLinkTableModel.passphrase.set(link_data._passphrase), # allow read private field DelibirdLinkTableModel.query_omit.set(link_data.query_omit), DelibirdLinkTableModel.query_whitelist.set(link_data.query_whitelist), DelibirdLinkTableModel.max_uses.set(link_data.max_uses), diff --git a/lambda/admin_portal/static/links.html b/lambda/admin_portal/static/links.html index 23af538..6d008d0 100644 --- a/lambda/admin_portal/static/links.html +++ b/lambda/admin_portal/static/links.html @@ -7,7 +7,7 @@ - + @@ -110,6 +110,11 @@
Link Details
data-bs-html="true" title="{{ link.tag|join(', ') }}"> {% endif %} + {% if link.is_protected() %} + + {% endif %} @@ -201,6 +206,7 @@
Link Details
data-max-uses="{{ link.max_uses or '' }}" data-expiration="{{ link.expiration_date.strftime('%Y-%m-%dT%H:%M') if link.expiration_date else '' }}" data-expired-origin="{{ link.expired_origin or '' }}" + data-passphrase="{{ link._passphrase or '' }}" data-query-omit="{{ 'true' if link.query_omit else 'false' }}" data-query-whitelist="{{ link.query_whitelist|join(',') if link.query_whitelist else '' }}" data-memo="{{ link.memo or '' }}" @@ -241,8 +247,8 @@