diff --git a/Dockerfile b/Dockerfile index ff083ed8f6..ee45ee244c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,14 +41,24 @@ COPY . /app RUN --mount=type=secret,id=GITHUB_PERSONAL_TOKEN export GITHUB_PERSONAL_TOKEN=$(cat /run/secrets/GITHUB_PERSONAL_TOKEN) && git config --global url."https://$GITHUB_PERSONAL_TOKEN@github.com/".insteadOf ssh://git@github.com -RUN (\ - npm ci; \ +RUN npm ci + +RUN \ + --mount=type=secret,id=GOOGLE_RECAPTCHA_SITE_KEY \ + --mount=type=secret,id=GOOGLE_ANALYTICS_ID \ + --mount=type=secret,id=GOOGLE_TAGS_CONTAINER_ID \ + --mount=type=secret,id=GOOGLE_TAGS_PARAMS \ + sh -c ' \ if test $AIDA_URL; then \ curl -o /app/node_modules/asktravis/dist/aida.js $AIDA_URL; \ curl -o /app/node_modules/asktravis/dist/aida.js.map $AIDA_URL.map || true; \ fi; \ - ember build --environment=production; \ -) + export GOOGLE_RECAPTCHA_SITE_KEY=$(cat /run/secrets/GOOGLE_RECAPTCHA_SITE_KEY) && \ + export GOOGLE_ANALYTICS_ID=$(cat /run/secrets/GOOGLE_ANALYTICS_ID) && \ + export GOOGLE_TAGS_CONTAINER_ID=$(cat /run/secrets/GOOGLE_TAGS_CONTAINER_ID) && \ + export GOOGLE_TAGS_PARAMS=$(cat /run/secrets/GOOGLE_TAGS_PARAMS) && \ + ember build --environment=production' + RUN cp -a public/* dist/ diff --git a/app/components/billing/first-plan.js b/app/components/billing/first-plan.js index 6d147c26d2..bb4fb81a9d 100644 --- a/app/components/billing/first-plan.js +++ b/app/components/billing/first-plan.js @@ -326,7 +326,23 @@ export default Component.extend({ }, togglePlanDetails() { this.set('planDetailsVisible', !this.planDetailsVisible); - } + }, + validateBillingEmails(billingEmailField) { + if (!billingEmailField) { + return true; + } + + const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/; + const emails = billingEmailField.split(',').map(email => email.trim()); + const invalidEmails = emails.filter(email => !emailRegex.test(email)); + + if (invalidEmails.length > 0) { + const invalidEmailsList = invalidEmails.join(', '); + return `The following email addresses are not valid: ${invalidEmailsList}`; + } + + return true; + }, } }); diff --git a/app/components/billing/payment-details-tab.js b/app/components/billing/payment-details-tab.js index 63222b470a..4a3770d9e1 100644 --- a/app/components/billing/payment-details-tab.js +++ b/app/components/billing/payment-details-tab.js @@ -161,6 +161,23 @@ export default Component.extend({ onCaptchaResolved(reCaptchaResponse) { this.updatePaymentDetails.perform(reCaptchaResponse); }, + validateBillingEmails(billingEmailField) { + if (!billingEmailField) { + return true; + } + + const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/; + const emails = billingEmailField.split(',').map(email => email.trim()); + + const invalidEmails = emails.filter(email => !emailRegex.test(email)); + + if (invalidEmails.length > 0) { + const invalidEmailsList = invalidEmails.join(', '); + return `The following email addresses are not valid: ${invalidEmailsList}`; + } + + return true; + }, submit() { if (!this.enableSubmit || this.disableForm) return; window.grecaptcha.execute(); diff --git a/app/templates/account-activation.hbs b/app/templates/account-activation.hbs index 7ee21ef775..772d17f2b8 100644 --- a/app/templates/account-activation.hbs +++ b/app/templates/account-activation.hbs @@ -14,8 +14,7 @@ + > - < diff --git a/app/templates/components/billing/first-plan.hbs b/app/templates/components/billing/first-plan.hbs index 88c2c144dd..13c20f1f0e 100644 --- a/app/templates/components/billing/first-plan.hbs +++ b/app/templates/components/billing/first-plan.hbs @@ -43,7 +43,7 @@
diff --git a/app/templates/components/billing/payment-details-tab.hbs b/app/templates/components/billing/payment-details-tab.hbs index cb0172990e..93ea7ca6a7 100644 --- a/app/templates/components/billing/payment-details-tab.hbs +++ b/app/templates/components/billing/payment-details-tab.hbs @@ -59,6 +59,7 @@ @disabled={{this.disableForm}} @showValidationStatusIcons={{false}} @onChange={{action (mut this.billingInfo.billingEmail)}} + @validator={{action "validateBillingEmails"}} as |Field| > diff --git a/tests/integration/components/billing/payment-test.js b/tests/integration/components/billing/payment-test.js index bec7c58d6d..daa665a4b6 100644 --- a/tests/integration/components/billing/payment-test.js +++ b/tests/integration/components/billing/payment-test.js @@ -30,7 +30,7 @@ module('Integration | Component | billing-payment', function (hooks) { firstName: '', lastName: '', companyName: '', - billingEmail: '', + billingEmail: 'some@email.com', street: '', billingSuite: '', billingCity: '',