Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .github/workflows/check-webroot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,18 @@ jobs:
VUE_APP_API_STATE_ROOT: https://api.test.jcc.iaapi.io
VUE_APP_API_LICENSE_ROOT: https://api.test.jcc.iaapi.io
VUE_APP_API_SEARCH_ROOT: https://search.test.jcc.iaapi.io
VUE_APP_API_USER_ROOT: https://api.test.jcc.iaapi.io
VUE_APP_API_STATE_ROOT_COSMO: https://api.test.cosmetology.jcc.iaapi.io
VUE_APP_API_LICENSE_ROOT_COSMO: https://api.test.cosmetology.jcc.iaapi.io
VUE_APP_API_SEARCH_ROOT_COSMO: https://search.test.cosmetology.jcc.iaapi.io
VUE_APP_API_USER_ROOT_COSMO: https://api.test.cosmetology.jcc.iaapi.io
VUE_APP_COGNITO_REGION: us-east-1
VUE_APP_COGNITO_AUTH_DOMAIN_STAFF: https://ia-cc-staff-test.auth.us-east-1.amazoncognito.com
VUE_APP_COGNITO_CLIENT_ID_STAFF: ${{ secrets.DEV_WEBROOT_COGNITO_CLIENT_ID_STAFF }}
VUE_APP_COGNITO_AUTH_DOMAIN_LICENSEE: https://ia-cc-provider-test.auth.us-east-1.amazoncognito.com
VUE_APP_COGNITO_CLIENT_ID_LICENSEE: ${{ secrets.DEV_WEBROOT_COGNITO_CLIENT_ID_LICENSEE }}
VUE_APP_COGNITO_AUTH_DOMAIN_STAFF_COSMO: https://staff-auth.test.cosmetology.jcc.iaapi.io
VUE_APP_COGNITO_CLIENT_ID_STAFF_COSMO: ${{ secrets.DEV_WEBROOT_COGNITO_CLIENT_ID_STAFF_COSMO }}
VUE_APP_RECAPTCHA_KEY: 6Le-3bgqAAAAAILDVUKkRnAF9SSzb8o9uv5lY7Ih

steps:
Expand Down Expand Up @@ -90,11 +97,18 @@ jobs:
VUE_APP_API_STATE_ROOT: ${{ env.VUE_APP_API_STATE_ROOT }}
VUE_APP_API_LICENSE_ROOT: ${{ env.VUE_APP_API_LICENSE_ROOT }}
VUE_APP_API_SEARCH_ROOT: ${{ env.VUE_APP_API_SEARCH_ROOT }}
VUE_APP_API_USER_ROOT: ${{ env.VUE_APP_API_USER_ROOT }}
VUE_APP_API_STATE_ROOT_COSMO: ${{ env.VUE_APP_API_STATE_ROOT_COSMO }}
VUE_APP_API_LICENSE_ROOT_COSMO: ${{ env.VUE_APP_API_LICENSE_ROOT_COSMO }}
VUE_APP_API_SEARCH_ROOT_COSMO: ${{ env.VUE_APP_API_SEARCH_ROOT_COSMO }}
VUE_APP_API_USER_ROOT_COSMO: ${{ env.VUE_APP_API_USER_ROOT_COSMO }}
VUE_APP_COGNITO_REGION: ${{ env.VUE_APP_COGNITO_REGION }}
VUE_APP_COGNITO_AUTH_DOMAIN_STAFF: ${{ env.VUE_APP_COGNITO_AUTH_DOMAIN_STAFF }}
VUE_APP_COGNITO_CLIENT_ID_STAFF: ${{ env.VUE_APP_COGNITO_CLIENT_ID_STAFF }}
VUE_APP_COGNITO_AUTH_DOMAIN_LICENSEE: ${{ env.VUE_APP_COGNITO_AUTH_DOMAIN_LICENSEE }}
VUE_APP_COGNITO_CLIENT_ID_LICENSEE: ${{ env.VUE_APP_COGNITO_CLIENT_ID_LICENSEE }}
VUE_APP_COGNITO_AUTH_DOMAIN_STAFF_COSMO: ${{ env.VUE_APP_COGNITO_AUTH_DOMAIN_STAFF_COSMO }}
VUE_APP_COGNITO_CLIENT_ID_STAFF_COSMO: ${{ env.VUE_APP_COGNITO_CLIENT_ID_STAFF_COSMO }}
VUE_APP_RECAPTCHA_KEY: ${{ env.VUE_APP_RECAPTCHA_KEY }}
VUE_APP_MOCK_API: true
run: yarn build
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,23 @@
*
* These values are injected into the lambda function at build time. See the
* `generate_csp_lambda_code` function in
* backend/compact-connect/stacks/frontend_deployment_stack/distribution.py
* backend/compact-connect-ui-app/stacks/frontend_deployment_stack/distribution.py
* @type {object}
*/
const environmentValues = {
webFrontend: `##WEB_FRONTEND##`,
// JCC
dataApi: `##DATA_API##`,
searchApi: `##SEARCH_API##`,
s3UploadUrlState: `##S3_UPLOAD_URL_STATE##`,
s3UploadUrlProvider: `##S3_UPLOAD_URL_PROVIDER##`,
cognitoStaff: `##COGNITO_STAFF##`,
cognitoProvider: `##COGNITO_PROVIDER##`,
// COSMETOLOGY
dataApiCosmo: `##DATA_API_COSMO##`,
searchApiCosmo: `##SEARCH_API_COSMO##`,
s3UploadUrlStateCosmo: `##S3_UPLOAD_URL_STATE_COSMO##`,
cognitoStaffCosmo: `##COGNITO_STAFF_COSMO##`,
};

// ============================================================================
Expand Down Expand Up @@ -62,12 +68,18 @@ const getFullyQualified = (domain) => {
const getEnvironmentUrls = () => {
const environmentUrls = {};

// JCC
environmentUrls.dataApi = getFullyQualified(environmentValues.dataApi);
environmentUrls.searchApi = getFullyQualified(environmentValues.searchApi);
environmentUrls.s3UploadUrlState = getFullyQualified(environmentValues.s3UploadUrlState);
environmentUrls.s3UploadUrlProvider = getFullyQualified(environmentValues.s3UploadUrlProvider);
environmentUrls.cognitoStaff = getFullyQualified(environmentValues.cognitoStaff);
environmentUrls.cognitoProvider = getFullyQualified(environmentValues.cognitoProvider);
// COSMETOLOGY
environmentUrls.dataApiCosmo = getFullyQualified(environmentValues.dataApiCosmo);
environmentUrls.searchApiCosmo = getFullyQualified(environmentValues.searchApiCosmo);
environmentUrls.s3UploadUrlStateCosmo = getFullyQualified(environmentValues.s3UploadUrlStateCosmo);
environmentUrls.cognitoStaffCosmo = getFullyQualified(environmentValues.cognitoStaffCosmo);

return environmentUrls;
};
Expand Down Expand Up @@ -214,11 +226,13 @@ const setCspHeader = (headers = {}) => {
'self',
'data:',
domains.dataApi,
domains.dataApiCosmo,
'https://www.gstatic.com/recaptcha/',
]),
buildSrcString('media-src', [
'self',
domains.dataApi,
domains.dataApiCosmo,
]),
buildSrcString('frame-src', [
'self',
Expand All @@ -238,12 +252,18 @@ const setCspHeader = (headers = {}) => {
]),
buildSrcString('connect-src', [
'self',
// JCC
domains.dataApi,
domains.searchApi,
domains.s3UploadUrlState,
domains.s3UploadUrlProvider,
domains.cognitoStaff,
domains.cognitoProvider,
// COSMETOLOGY
domains.dataApiCosmo,
domains.searchApiCosmo,
domains.s3UploadUrlStateCosmo,
domains.cognitoStaffCosmo,
cognitoIdpUrl,
Comment thread
jsandoval81 marked this conversation as resolved.
Outdated
'https://www.google.com/recaptcha/',
// Begin Statsig domains
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,18 @@ const {
// ================================================================================================
const environmentValues = {
webFrontend: 'app.compactconnect.org',
// JCC
dataApi: 'api.compactconnect.org',
searchApi: 'search.compactconnect.org',
s3UploadUrlState: 'prod-persistentstack-bulkuploadsbucketda4bdcd0-zq5o0q8uqq5i.s3.amazonaws.com',
s3UploadUrlProvider: 'prod-persistentstack-providerusersbucket5c7b202b-ffpgh4fyozwk.s3.amazonaws.com',
cognitoStaff: 'staff-auth.compactconnect.org',
cognitoProvider: 'licensee-auth.compactconnect.org',
// COSMETOLOGY
dataApiCosmo: 'api.cosmetology.compactconnect.org',
searchApiCosmo: 'search.cosmetology.compactconnect.org',
s3UploadUrlStateCosmo: 'prod-persistentstack-bulkuploadsbucketda4bdcd0-zq5o0q8uqq5j.s3.amazonaws.com',
cognitoStaffCosmo: 'staff-auth.cosmetology.compactconnect.org',
};

/**
Expand All @@ -46,12 +52,18 @@ const prepareLambdaForTest = () => {
// Replace placeholders with test values
const replacements = {
'##WEB_FRONTEND##': environmentValues.webFrontend,
// JCC
'##DATA_API##': environmentValues.dataApi,
'##SEARCH_API##': environmentValues.searchApi,
'##S3_UPLOAD_URL_STATE##': environmentValues.s3UploadUrlState,
'##S3_UPLOAD_URL_PROVIDER##': environmentValues.s3UploadUrlProvider,
'##COGNITO_STAFF##': environmentValues.cognitoStaff,
'##COGNITO_PROVIDER##': environmentValues.cognitoProvider,
// COSMETOLOGY
'##DATA_API_COSMO##': environmentValues.dataApiCosmo,
'##SEARCH_API_COSMO##': environmentValues.searchApiCosmo,
'##S3_UPLOAD_URL_STATE_COSMO##': environmentValues.s3UploadUrlStateCosmo,
'##COGNITO_STAFF_COSMO##': environmentValues.cognitoStaffCosmo,
};

// Apply all replacements to the Lambda code
Expand All @@ -70,13 +82,19 @@ const prepareLambdaForTest = () => {
};

const buildCspHeaders = (environment) => {
const cognitoIdpUrl = 'https://cognito-idp.us-east-1.amazonaws.com';
// JCC
const dataApiUrl = (environment?.dataApi) ? `https://${environment.dataApi}` : '';
const searchApiUrl = (environment?.searchApi) ? `https://${environment.searchApi}` : '';
const s3UploadUrlState = (environment?.s3UploadUrlState) ? `https://${environment.s3UploadUrlState}` : '';
const s3UploadUrlProvider = (environment?.s3UploadUrlProvider) ? `https://${environment.s3UploadUrlProvider}` : '';
const cognitoStaffUrl = (environment?.cognitoStaff) ? `https://${environment.cognitoStaff}` : '';
const cognitoProviderUrl = (environment?.cognitoProvider) ? `https://${environment.cognitoProvider}` : '';
const cognitoIdpUrl = 'https://cognito-idp.us-east-1.amazonaws.com';
// COSMETOLOGY
const dataApiUrlCosmo = (environment?.dataApiCosmo) ? `https://${environment.dataApiCosmo}` : '';
const searchApiUrlCosmo = (environment?.searchApiCosmo) ? `https://${environment.searchApiCosmo}` : '';
const s3UploadUrlStateCosmo = (environment?.s3UploadUrlStateCosmo) ? `https://${environment.s3UploadUrlStateCosmo}` : '';
const cognitoStaffUrlCosmo = (environment?.cognitoStaffCosmo) ? `https://${environment.cognitoStaffCosmo}` : '';
// src configs are maintained here as arrays for ease of maintenance;
// defining them as static strings could lead to long lines of code.
const cspDefaultSrc = [
Expand Down Expand Up @@ -128,11 +146,13 @@ const buildCspHeaders = (environment) => {
'\'self\'',
'data:',
dataApiUrl,
dataApiUrlCosmo,
'https://www.gstatic.com/recaptcha/',
].join(' ');
const cspMediaSrc = [
'\'self\'',
dataApiUrl,
dataApiUrlCosmo,
].join(' ');
const cspFrameSrc = [
'\'self\'',
Expand All @@ -152,12 +172,18 @@ const buildCspHeaders = (environment) => {
].join(' ');
const cspConnectSrc = [
'\'self\'',
// JCC
dataApiUrl,
searchApiUrl,
s3UploadUrlState,
s3UploadUrlProvider,
cognitoStaffUrl,
cognitoProviderUrl,
// COSMETOLOGY
dataApiUrlCosmo,
searchApiUrlCosmo,
s3UploadUrlStateCosmo,
cognitoStaffUrlCosmo,
cognitoIdpUrl,
Comment thread
jsandoval81 marked this conversation as resolved.
Outdated
'https://www.google.com/recaptcha/',
// Begin Statsig domains
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from common_constructs.access_logs_bucket import AccessLogsBucket
from common_constructs.bucket import Bucket
from common_constructs.frontend_app_config_utility import (
AppId,
PersistentStackFrontendAppConfigValues,
ProviderUsersStackFrontendAppConfigValues,
)
Expand Down Expand Up @@ -39,6 +40,11 @@ def __init__(
persistent_stack_frontend_app_config_values = (
PersistentStackFrontendAppConfigValues.load_persistent_stack_values_from_ssm_parameter(self)
)
persistent_stack_frontend_app_config_values_cosmetology = (
PersistentStackFrontendAppConfigValues.load_persistent_stack_values_from_ssm_parameter(
self, app_id=AppId.COSMETOLOGY
)
)
provider_users_stack_frontend_app_config_values = (
ProviderUsersStackFrontendAppConfigValues.load_provider_users_stack_values_from_ssm_parameter(self)
)
Expand All @@ -51,6 +57,12 @@ def __init__(
'Persistent Stack App Configuration not found in SSM. '
'Make sure Persistent Stack resources have been deployed.'
)
if persistent_stack_frontend_app_config_values_cosmetology is None:
raise ValueError(
'Persistent Stack App Configuration (cosmetology) not found in SSM. '
'Make sure Cosmetology Persistent Stack resources have been deployed and the parameter '
'has been copied to this account.'
Comment thread
jsandoval81 marked this conversation as resolved.
)
if provider_users_stack_frontend_app_config_values is None:
raise ValueError(
'Provider Users Stack App Configuration not found in SSM. '
Expand Down Expand Up @@ -100,6 +112,7 @@ def __init__(
ui_bucket=self.ui_bucket,
environment_context=environment_context,
persistent_stack_app_config_values=persistent_stack_frontend_app_config_values,
persistent_stack_app_config_values_cosmetology=persistent_stack_frontend_app_config_values_cosmetology,
provider_users_stack_app_config_values=provider_users_stack_frontend_app_config_values,
)

Expand All @@ -110,5 +123,6 @@ def __init__(
security_profile=security_profile,
access_logs_bucket=self.frontend_access_logs_bucket,
persistent_stack_frontend_app_config_values=persistent_stack_frontend_app_config_values,
persistent_stack_frontend_app_config_values_cosmetology=persistent_stack_frontend_app_config_values_cosmetology,
provider_users_stack_frontend_app_config_values=provider_users_stack_frontend_app_config_values,
)
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def __init__(
ui_bucket: IBucket,
environment_context: dict,
persistent_stack_app_config_values: PersistentStackFrontendAppConfigValues,
persistent_stack_app_config_values_cosmetology: PersistentStackFrontendAppConfigValues,
provider_users_stack_app_config_values: ProviderUsersStackFrontendAppConfigValues,
):
stack = Stack.of(scope)
Expand Down Expand Up @@ -64,11 +65,17 @@ def __init__(
'VUE_APP_API_LICENSE_ROOT': f'{HTTPS_PREFIX}{persistent_stack_app_config_values.api_domain_name}',
'VUE_APP_API_SEARCH_ROOT': f'{HTTPS_PREFIX}{persistent_stack_app_config_values.search_api_domain_name}',
'VUE_APP_API_USER_ROOT': f'{HTTPS_PREFIX}{persistent_stack_app_config_values.api_domain_name}',
'VUE_APP_API_STATE_ROOT_COSMO': f'{HTTPS_PREFIX}{persistent_stack_app_config_values_cosmetology.api_domain_name}',
'VUE_APP_API_LICENSE_ROOT_COSMO': f'{HTTPS_PREFIX}{persistent_stack_app_config_values_cosmetology.api_domain_name}',
'VUE_APP_API_SEARCH_ROOT_COSMO': f'{HTTPS_PREFIX}{persistent_stack_app_config_values_cosmetology.search_api_domain_name}',
'VUE_APP_API_USER_ROOT_COSMO': f'{HTTPS_PREFIX}{persistent_stack_app_config_values_cosmetology.api_domain_name}',
'VUE_APP_COGNITO_REGION': 'us-east-1',
'VUE_APP_COGNITO_AUTH_DOMAIN_STAFF': f'{HTTPS_PREFIX}{persistent_stack_app_config_values.staff_cognito_domain}',
'VUE_APP_COGNITO_CLIENT_ID_STAFF': persistent_stack_app_config_values.staff_cognito_client_id,
'VUE_APP_COGNITO_AUTH_DOMAIN_LICENSEE': f'{HTTPS_PREFIX}{provider_users_stack_app_config_values.provider_cognito_domain}',
'VUE_APP_COGNITO_CLIENT_ID_LICENSEE': provider_users_stack_app_config_values.provider_cognito_client_id,
'VUE_APP_COGNITO_AUTH_DOMAIN_STAFF_COSMO': f'{HTTPS_PREFIX}{persistent_stack_app_config_values_cosmetology.staff_cognito_domain}',
'VUE_APP_COGNITO_CLIENT_ID_STAFF_COSMO': persistent_stack_app_config_values_cosmetology.staff_cognito_client_id,
'VUE_APP_RECAPTCHA_KEY': recaptcha_public_key,
'VUE_APP_STATSIG_KEY': statsig_client_key,
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# ruff: noqa: E501 line-too-long
# For the sake of readability, we don't want to break up environment values into separate lines

import os

from aws_cdk.aws_certificatemanager import Certificate, CertificateValidation
Expand Down Expand Up @@ -34,6 +37,7 @@

def generate_csp_lambda_code(
persistent_stack_values: PersistentStackFrontendAppConfigValues,
persistent_stack_values_cosmetology: PersistentStackFrontendAppConfigValues,
provider_users_stack_values: ProviderUsersStackFrontendAppConfigValues,
) -> str:
"""
Expand All @@ -45,6 +49,7 @@ def generate_csp_lambda_code(
This function reads the template file and replaces placeholders with actual values.

:param persistent_stack_values: The values from the persistent stack
:param persistent_stack_values_cosmetology: The values from the cosmetology persistent stack
:param provider_users_stack_values: The values from the provider users stack
:return: The generated Lambda function code
"""
Expand All @@ -56,12 +61,18 @@ def generate_csp_lambda_code(
# Replace placeholders with actual values
replacements = {
'##WEB_FRONTEND##': persistent_stack_values.ui_domain_name,
# JCC
'##DATA_API##': persistent_stack_values.api_domain_name,
'##SEARCH_API##': persistent_stack_values.search_api_domain_name,
'##S3_UPLOAD_URL_STATE##': f'{persistent_stack_values.bulk_uploads_bucket_name}{S3_URL_SUFFIX}',
'##S3_UPLOAD_URL_PROVIDER##': f'{persistent_stack_values.provider_users_bucket_name}{S3_URL_SUFFIX}',
'##COGNITO_STAFF##': persistent_stack_values.staff_cognito_domain,
'##COGNITO_PROVIDER##': provider_users_stack_values.provider_cognito_domain,
# COSMETOLOGY
'##DATA_API_COSMO##': persistent_stack_values_cosmetology.api_domain_name,
'##SEARCH_API_COSMO##': persistent_stack_values_cosmetology.search_api_domain_name,
'##S3_UPLOAD_URL_STATE_COSMO##': f'{persistent_stack_values_cosmetology.bulk_uploads_bucket_name}{S3_URL_SUFFIX}',
'##COGNITO_STAFF_COSMO##': persistent_stack_values_cosmetology.staff_cognito_domain,
}

for placeholder, value in replacements.items():
Expand All @@ -80,6 +91,7 @@ def __init__(
security_profile: SecurityProfile = SecurityProfile.RECOMMENDED,
access_logs_bucket: AccessLogsBucket,
persistent_stack_frontend_app_config_values: PersistentStackFrontendAppConfigValues,
persistent_stack_frontend_app_config_values_cosmetology: PersistentStackFrontendAppConfigValues,
provider_users_stack_frontend_app_config_values: ProviderUsersStackFrontendAppConfigValues,
):
stack: AppStack = AppStack.of(scope)
Expand Down Expand Up @@ -118,7 +130,9 @@ def __init__(

# Generate the CSP Lambda code with injected values
csp_function_code = generate_csp_lambda_code(
persistent_stack_frontend_app_config_values, provider_users_stack_frontend_app_config_values
persistent_stack_frontend_app_config_values,
persistent_stack_frontend_app_config_values_cosmetology,
provider_users_stack_frontend_app_config_values
)

self.csp_function = Function(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
{
"EventType": "viewer-response",
"LambdaFunctionARN": {
"Ref": "CSPFunctionCurrentVersionB61A6611b3705bb7a3e3440bc14c943a82111069"
"Ref": "CSPFunctionCurrentVersionB61A6611ae71df5f4a2e71905706631237e7d8d0"
}
}
],
Expand Down
Loading
Loading