Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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,14 +252,20 @@ const setCspHeader = (headers = {}) => {
]),
buildSrcString('connect-src', [
'self',
cognitoIdpUrl,
'https://www.google.com/recaptcha/',
// JCC
domains.dataApi,
domains.searchApi,
domains.s3UploadUrlState,
domains.s3UploadUrlProvider,
domains.cognitoStaff,
domains.cognitoProvider,
cognitoIdpUrl,
'https://www.google.com/recaptcha/',
// COSMETOLOGY
domains.dataApiCosmo,
domains.searchApiCosmo,
domains.s3UploadUrlStateCosmo,
domains.cognitoStaffCosmo,
// Begin Statsig domains
'https://api.statsig.com/',
'https://featuregates.org/',
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,14 +172,20 @@ const buildCspHeaders = (environment) => {
].join(' ');
const cspConnectSrc = [
'\'self\'',
cognitoIdpUrl,
'https://www.google.com/recaptcha/',
// JCC
dataApiUrl,
searchApiUrl,
s3UploadUrlState,
s3UploadUrlProvider,
cognitoStaffUrl,
cognitoProviderUrl,
cognitoIdpUrl,
'https://www.google.com/recaptcha/',
// COSMETOLOGY
dataApiUrlCosmo,
searchApiUrlCosmo,
s3UploadUrlStateCosmo,
cognitoStaffUrlCosmo,
// Begin Statsig domains
'https://api.statsig.com/',
'https://featuregates.org/',
Expand Down
3 changes: 3 additions & 0 deletions backend/compact-connect-ui-app/lambdas/nodejs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,8 @@
"@aws-sdk/client-s3": "^3.682.0",
"@aws-sdk/util-dynamodb": "^3.682.0",
"zod": "^3.23.8"
},
"resolutions": {
"fast-xml-parser": "5.3.6"
}
}
18 changes: 9 additions & 9 deletions backend/compact-connect-ui-app/lambdas/nodejs/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2143,12 +2143,12 @@ fast-levenshtein@^2.0.6:
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==

fast-xml-parser@4.4.1:
version "4.4.1"
resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f"
integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==
fast-xml-parser@4.4.1, fast-xml-parser@5.3.6:
version "5.3.6"
resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz#85a69117ca156b1b3c52e426495b6de266cb6a4b"
integrity sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==
dependencies:
strnum "^1.0.5"
strnum "^2.1.2"

fecha@^4.2.0:
version "4.2.3"
Expand Down Expand Up @@ -2917,10 +2917,10 @@ strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==

strnum@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db"
integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==
strnum@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.2.tgz#a5e00ba66ab25f9cafa3726b567ce7a49170937a"
integrity sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==

supports-color@^7, supports-color@^7.1.0:
version "7.2.0"
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
Loading
Loading