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 d35da90..2a0b5a4 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 '' }}" @@ -320,6 +326,19 @@