Skip to content

Commit 5972148

Browse files
migrate to /api/connect/newsletter/subscribe
and adding captcha validation to newsletter subscription
1 parent 3968c77 commit 5972148

File tree

13 files changed

+60
-49
lines changed

13 files changed

+60
-49
lines changed

assets/js/androidkey.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
"use strict";
22

3-
// requires newsletter.js
4-
53
class AndroidLicense {
64

75
constructor(form, checkoutData) {
@@ -20,9 +18,6 @@ class AndroidLicense {
2018
eventCallback: data => {
2119
if (data.name == "checkout.completed") {
2220
this.onCheckoutSucceeded();
23-
if (this._checkoutData.acceptNewsletter) {
24-
subscribeToNewsletter(data.customer.email, 6);
25-
}
2621
} else if (data.name == "checkout.closed") {
2722
this._checkoutData.inProgress = false;
2823
}

assets/js/desktopkey.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
"use strict";
22

3-
// requires newsletter.js
4-
53
class DesktopLicense {
64

75
constructor(form, checkoutData) {
@@ -20,9 +18,6 @@ class DesktopLicense {
2018
eventCallback: data => {
2119
if (data.name == "checkout.completed") {
2220
this.onCheckoutSucceeded();
23-
if (this._checkoutData.acceptNewsletter) {
24-
subscribeToNewsletter(data.customer.email, 6);
25-
}
2621
} else if (data.name == "checkout.closed") {
2722
this._checkoutData.inProgress = false;
2823
}

assets/js/hubcontact.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class HubContact {
2929
}).done(_ => {
3030
this.onRequestSucceeded();
3131
if (this._submitData.acceptNewsletter) {
32-
subscribeToNewsletter(this._submitData.email, 7);
32+
subscribeToNewsletter(this._submitData.email, 7); // FIXME move to backend
3333
}
3434
}).fail(xhr => {
3535
this.onRequestFailed(xhr.responseJSON?.message || 'Request failed.');

assets/js/hubmanaged.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class HubManaged {
111111
}).done(_ => {
112112
this.onRequestSucceeded();
113113
if (this._submitData.acceptNewsletter) {
114-
subscribeToNewsletter(this._submitData.email, 7);
114+
subscribeToNewsletter(this._submitData.email, 7); // FIXME move to backend
115115
}
116116
}).fail(xhr => {
117117
this.onRequestFailed(xhr.responseJSON?.message || 'Requesting Hub Managed failed.');

assets/js/newsletter.js

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use strict";
22

3-
const SUBSCRIBE_NEWSLETTER_URL = LEGACY_API_URL + '/listmonk/subscribe.php';
3+
const SUBSCRIBE_NEWSLETTER_URL = API_BASE_URL + '/connect/newsletter/subscribe';
44

55
class Newsletter {
66

@@ -20,7 +20,7 @@ class Newsletter {
2020
this._data.errorMessage = '';
2121
this._data.success = false;
2222
subscribeToNewsletter(
23-
this._data.email, this._data.listId
23+
this._data.email, this._data.listId, this._data.captcha
2424
).done(() => {
2525
this.onSubscribeSucceeded();
2626
}).fail(xhr => {
@@ -41,24 +41,16 @@ class Newsletter {
4141
}
4242
}
4343

44-
function subscribeToNewsletter(email, listId) {
44+
function subscribeToNewsletter(email, listId, captcha) {
4545
return $.ajax({
4646
url: SUBSCRIBE_NEWSLETTER_URL,
47-
type: 'GET',
48-
xhrFields: {
49-
withCredentials: true
50-
}
51-
}).then(() => {
52-
return $.ajax({
53-
url: SUBSCRIBE_NEWSLETTER_URL,
54-
type: 'POST',
55-
data: {
56-
email: email,
57-
listid: listId
58-
},
59-
xhrFields: {
60-
withCredentials: true
61-
}
62-
});
63-
});
47+
type: 'POST',
48+
data: JSON.stringify({
49+
email: email,
50+
listIds: [listId],
51+
captcha: captcha
52+
}),
53+
contentType: "application/json; charset=utf-8",
54+
dataType: "json"
55+
});
6456
}

assets/js/supportercert.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class SupporterCertificate {
2525
type: 'POST',
2626
data: JSON.stringify(this._submitData),
2727
contentType: "application/json; charset=utf-8",
28-
dataType: "json"
28+
dataType: "json"
2929
}).done(_ => {
3030
this.onRequestSucceeded();
3131
}).fail(xhr => {

layouts/android/single.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,14 @@ <h3 id="keyrecovery" class="font-headline text-xl md:text-2xl leading-relaxed mb
6363
<script type="text/javascript" src="{{ $newsletterJs.RelPermalink }}" defer></script>
6464
{{ $androidKeyJs := resources.Get "js/androidkey.js" }}
6565
<script type="text/javascript" src="{{ $androidKeyJs.RelPermalink }}" defer></script>
66+
{{ $altchaJs := resources.Get "js/altcha/altcha.js" }}
67+
<script type="module" src="{{ $altchaJs.RelPermalink }}" defer></script>
6668
{{ else }}
6769
{{ $newsletterJs := resources.Get "js/newsletter.js" | minify | fingerprint }}
6870
<script type="text/javascript" src="{{ $newsletterJs.RelPermalink }}" integrity="{{ $newsletterJs.Data.Integrity }}" defer></script>
6971
{{ $androidKeyJs := resources.Get "js/androidkey.js" | minify | fingerprint }}
7072
<script type="text/javascript" src="{{ $androidKeyJs.RelPermalink }}" integrity="{{ $androidKeyJs.Data.Integrity }}" defer></script>
73+
{{ $altchaJs := resources.Get "js/altcha/altcha.js" }}
74+
<script type="module" src="{{ $altchaJs.RelPermalink }}" integrity="{{ $altchaJs.Data.Integrity }}" defer></script>
7175
{{ end }}
7276
{{ end }}

layouts/for-individuals/single.html

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,16 +180,19 @@ <h2 id="contact" class="font-h2 mb-4">{{ i18n "for_individuals_join_community_ti
180180
</a>
181181
</section>
182182

183-
<section x-data="{data: {email: '', listId: 6, acceptTerms: false, errorMessage: '', success: false, inProgress: false}}" class="container text-center pt-12 pb-24">
183+
<section x-data="{data: {email: '', listId: 'cryptomator', captcha: null, acceptTerms: false, errorMessage: '', success: false, inProgress: false}, captchaState: null}" class="container text-center pt-12 pb-24">
184184
<h2 id="newsletter" class="font-h2 mb-4">{{ i18n "home_newsletter_title" . }}</h2>
185185

186-
<form x-show="!data.success" x-ref="form" class="max-w-xl mx-auto mb-4">
186+
<form x-show="!data.success" x-ref="form" class="max-w-xl mx-auto mb-4" @submit.prevent="new Newsletter($refs.form, data).subscribe(); $refs.captcha.reset()">
187187
<p class="font-p mb-4">{{ i18n "home_newsletter_instruction" . | safeHTML }}</p>
188188
<div class="flex justify-center items-center rounded-sm bg-gray-300 mb-4">
189189
<input x-model="data.email" x-ref="email" @blur="$refs.email.classList.add('show-invalid')" type="email" class="grow rounded-l border-gray-300 focus:ring-0 focus:border-secondary" placeholder="{{ i18n "home_newsletter_email_placeholder" }}" required/>
190-
<button :disabled="data.inProgress || !data.acceptTerms" @click.prevent="new Newsletter($refs.form, data).subscribe()" type="submit" class="shrink-0 flex items-center gap-1 btn btn-primary rounded-l-none px-4" data-umami-event="for-individuals-newsletter-form">
190+
<button :disabled="data.inProgress || !data.acceptTerms || captchaState == 'verifying'" type="submit" class="shrink-0 flex items-center gap-1 btn btn-primary rounded-l-none px-4" data-umami-event="for-individuals-newsletter-form">
191191
<i :class="{'fa-envelope': !data.inProgress, 'fa-spinner fa-spin': data.inProgress}" class="fa-solid" aria-hidden="true"></i> {{ i18n "home_newsletter_subscribe" }}
192192
</button>
193+
194+
{{ $captchaUrl := printf "%s/connect/newsletter/challenge" .Site.Params.apiBaseUrl }}
195+
{{ partial "captcha.html" (dict "challengeUrl" $captchaUrl "captchaPayload" "data.captcha" "captchaState" "captchaState") }}
193196
</div>
194197
<p class="font-p">{{ partial "checkbox.html" (dict "context" . "alpineVariable" "data.acceptTerms" "label" (i18n "accept_newsletter_privacy" | safeHTML)) }}</p>
195198
<p :class="{'hidden': !data.errorMessage}" class="text-sm text-red-600 mt-2" x-text="data.errorMessage"></p>
@@ -209,8 +212,12 @@ <h2 id="newsletter" class="font-h2 mb-4">{{ i18n "home_newsletter_title" . }}</h
209212
{{ if hugo.IsDevelopment }}
210213
{{ $newsletterJs := resources.Get "js/newsletter.js" }}
211214
<script type="text/javascript" src="{{ $newsletterJs.RelPermalink }}" defer></script>
215+
{{ $altchaJs := resources.Get "js/altcha/altcha.js" }}
216+
<script type="module" src="{{ $altchaJs.RelPermalink }}" defer></script>
212217
{{ else }}
213218
{{ $newsletterJs := resources.Get "js/newsletter.js" | minify | fingerprint }}
214219
<script type="text/javascript" src="{{ $newsletterJs.RelPermalink }}" integrity="{{ $newsletterJs.Data.Integrity }}" defer></script>
220+
{{ $altchaJs := resources.Get "js/altcha/altcha.js" }}
221+
<script type="module" src="{{ $altchaJs.RelPermalink }}" integrity="{{ $altchaJs.Data.Integrity }}" defer></script>
215222
{{ end }}
216223
{{ end }}

layouts/for-teams/single.html

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,16 +182,19 @@ <h2 id="contact" class="font-h2 mb-4">{{ i18n "hub_contact_us_title" . }}</h2>
182182
</a>
183183
</section>
184184

185-
<section x-data="{data: {email: '', listId: 7, acceptTerms: false, errorMessage: '', success: false, inProgress: false}}" class="container text-center pt-12 pb-24">
185+
<section x-data="{data: {email: '', listId: 'cryptomatorhub', captcha: null, acceptTerms: false, errorMessage: '', success: false, inProgress: false}, captchaState: null}" class="container text-center pt-12 pb-24">
186186
<h2 id="newsletter" class="font-h2 mb-4">{{ i18n "hub_newsletter_title" . }}</h2>
187187

188-
<form x-show="!data.success" x-ref="form" class="max-w-xl mx-auto mb-4">
188+
<form x-show="!data.success" x-ref="form" class="max-w-xl mx-auto mb-4" @submit.prevent="new Newsletter($refs.form, data).subscribe(); $refs.captcha.reset()">
189189
<p class="font-p mb-4">{{ i18n "hub_newsletter_instruction" . | safeHTML }}</p>
190190
<div class="flex justify-center items-center rounded-sm bg-gray-300 mb-4">
191191
<input x-model="data.email" x-ref="email" @blur="$refs.email.classList.add('show-invalid')" type="email" class="grow input-box rounded-r-none focus:border-secondary" placeholder="{{ i18n "hub_newsletter_email_placeholder" }}" required/>
192-
<button :disabled="data.inProgress || !data.acceptTerms" @click.prevent="new Newsletter($refs.form, data).subscribe()" type="submit" class="shrink-0 flex items-center gap-1 btn btn-primary rounded-l-none px-4" data-umami-event="hub-newsletter-form">
192+
<button :disabled="data.inProgress || !data.acceptTerms || captchaState == 'verifying'" type="submit" class="shrink-0 flex items-center gap-1 btn btn-primary rounded-l-none px-4" data-umami-event="hub-newsletter-form">
193193
<i :class="{'fa-envelope': !data.inProgress, 'fa-spinner fa-spin': data.inProgress}" class="fa-solid" aria-hidden="true"></i> {{ i18n "hub_newsletter_subscribe" }}
194194
</button>
195+
196+
{{ $captchaUrl := printf "%s/connect/newsletter/challenge" .Site.Params.apiBaseUrl }}
197+
{{ partial "captcha.html" (dict "challengeUrl" $captchaUrl "captchaPayload" "data.captcha" "captchaState" "captchaState") }}
195198
</div>
196199
<p class="font-p">{{ partial "checkbox.html" (dict "context" . "alpineVariable" "data.acceptTerms" "label" (i18n "accept_hub_newsletter_privacy" | safeHTML)) }}</p>
197200
<p :class="{'hidden': !data.errorMessage}" class="text-sm text-red-600 mt-2" x-text="data.errorMessage"></p>
@@ -211,8 +214,12 @@ <h2 id="newsletter" class="font-h2 mb-4">{{ i18n "hub_newsletter_title" . }}</h2
211214
{{ if hugo.IsDevelopment }}
212215
{{ $newsletterJs := resources.Get "js/newsletter.js" }}
213216
<script type="text/javascript" src="{{ $newsletterJs.RelPermalink }}" defer></script>
217+
{{ $altchaJs := resources.Get "js/altcha/altcha.js" }}
218+
<script type="module" src="{{ $altchaJs.RelPermalink }}" defer></script>
214219
{{ else }}
215220
{{ $newsletterJs := resources.Get "js/newsletter.js" | minify | fingerprint }}
216221
<script type="text/javascript" src="{{ $newsletterJs.RelPermalink }}" integrity="{{ $newsletterJs.Data.Integrity }}" defer></script>
222+
{{ $altchaJs := resources.Get "js/altcha/altcha.js" }}
223+
<script type="module" src="{{ $altchaJs.RelPermalink }}" integrity="{{ $altchaJs.Data.Integrity }}" defer></script>
217224
{{ end }}
218225
{{ end }}

layouts/index.html

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,16 +147,19 @@ <h4 class="font-medium lg:text-lg leading-relaxed">
147147
</div>
148148
</section>
149149

150-
<section x-data="{data: {email: '', listId: 6, acceptTerms: false, errorMessage: '', success: false, inProgress: false}}" class="container text-center pt-12 pb-24">
150+
<section x-data="{data: {email: '', listId: 'cryptomator', captcha: null, acceptTerms: false, errorMessage: '', success: false, inProgress: false}, captchaState: null}" class="container text-center pt-12 pb-24">
151151
<h2 id="newsletter" class="font-h2 mb-4">{{ i18n "home_newsletter_title" . }}</h2>
152152

153-
<form x-show="!data.success" x-ref="form" class="max-w-xl mx-auto mb-4">
153+
<form x-show="!data.success" x-ref="form" class="max-w-xl mx-auto mb-4" @submit.prevent="new Newsletter($refs.form, data).subscribe(); $refs.captcha.reset()">
154154
<p class="font-p mb-4">{{ i18n "home_newsletter_instruction" . | safeHTML }}</p>
155155
<div class="flex justify-center items-center rounded-sm bg-gray-300 mb-4">
156156
<input x-model="data.email" x-ref="email" @blur="$refs.email.classList.add('show-invalid')" type="email" class="grow rounded-l border-gray-300 focus:ring-0 focus:border-secondary" placeholder="{{ i18n "home_newsletter_email_placeholder" }}" required/>
157-
<button :disabled="data.inProgress || !data.acceptTerms" @click.prevent="new Newsletter($refs.form, data).subscribe()" type="submit" class="shrink-0 flex items-center gap-1 btn btn-primary rounded-l-none px-4" data-umami-event="home-newsletter-form">
157+
<button :disabled="data.inProgress || !data.acceptTerms || captchaState == 'verifying'" type="submit" class="shrink-0 flex items-center gap-1 btn btn-primary rounded-l-none px-4" data-umami-event="home-newsletter-form">
158158
<i :class="{'fa-envelope': !data.inProgress, 'fa-spinner fa-spin': data.inProgress}" class="fa-solid" aria-hidden="true"></i> {{ i18n "home_newsletter_subscribe" }}
159159
</button>
160+
161+
{{ $captchaUrl := printf "%s/connect/newsletter/challenge" .Site.Params.apiBaseUrl }}
162+
{{ partial "captcha.html" (dict "challengeUrl" $captchaUrl "captchaPayload" "data.captcha" "captchaState" "captchaState") }}
160163
</div>
161164
<p class="font-p">{{ partial "checkbox.html" (dict "context" . "alpineVariable" "data.acceptTerms" "label" (i18n "accept_newsletter_privacy" | safeHTML)) }}</p>
162165
<p :class="{'hidden': !data.errorMessage}" class="text-sm text-red-600 mt-2" x-text="data.errorMessage"></p>
@@ -262,10 +265,14 @@ <h2 class="font-h2 mb-1">{{ i18n "home_cebit_title" . }}</h2>
262265
<script type="text/javascript" src="{{ $indexJs.RelPermalink }}" defer></script>
263266
{{ $newsletterJs := resources.Get "js/newsletter.js" }}
264267
<script type="text/javascript" src="{{ $newsletterJs.RelPermalink }}" defer></script>
268+
{{ $altchaJs := resources.Get "js/altcha/altcha.js" }}
269+
<script type="module" src="{{ $altchaJs.RelPermalink }}" defer></script>
265270
{{ else }}
266271
{{ $indexJs := resources.Get "js/index.js" | minify | fingerprint }}
267272
<script type="text/javascript" src="{{ $indexJs.RelPermalink }}" integrity="{{ $indexJs.Data.Integrity }}" defer></script>
268273
{{ $newsletterJs := resources.Get "js/newsletter.js" | minify | fingerprint }}
269274
<script type="text/javascript" src="{{ $newsletterJs.RelPermalink }}" integrity="{{ $newsletterJs.Data.Integrity }}" defer></script>
275+
{{ $altchaJs := resources.Get "js/altcha/altcha.js" }}
276+
<script type="module" src="{{ $altchaJs.RelPermalink }}" integrity="{{ $altchaJs.Data.Integrity }}" defer></script>
270277
{{ end }}
271278
{{ end }}

0 commit comments

Comments
 (0)