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 @@