Skip to content

Commit d2be68a

Browse files
Single-File Components and CSP lockdown
1 parent abde80f commit d2be68a

59 files changed

Lines changed: 2577 additions & 4743 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/Build-Test-And-Deploy.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ jobs:
2525
env:
2626
NUGET_AUTH_TOKEN: ${{ secrets.AZURE_DEVOPS_PAT }}
2727

28+
- name: Set up Node.js
29+
uses: actions/setup-node@v5
30+
with:
31+
node-version: 24
32+
cache: npm
33+
cache-dependency-path: EssentialCSharp.Web/package-lock.json
34+
2835
- name: Set up dependency caching for faster builds
2936
uses: actions/cache@v5
3037
id: nuget-cache

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,5 +284,7 @@ EssentialCSharp.Web/Markdown/
284284

285285
EssentialCSharp.Web/Guidelines/
286286

287+
EssentialCSharp.Web/wwwroot/dist/
288+
287289
# DevContainer environment files with sensitive data
288290
.devcontainer/.env

EssentialCSharp.Web/Areas/Identity/Pages/Account/ForgotPassword.cshtml

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,10 @@
3131
@section Scripts {
3232
<partial name="_ValidationScriptsPartial" />
3333
<script>
34-
(function () {
35-
let forgotPwWidgetId;
36-
let captchaSolved = false;
37-
const form = document.getElementById('forgot-password-form');
38-
39-
document.addEventListener('DOMContentLoaded', function () {
40-
forgotPwWidgetId = hcaptcha.render('forgot-password-captcha', {
41-
sitekey: '@Model.CaptchaSiteKey',
42-
size: 'invisible',
43-
callback: function () { captchaSolved = true; form.requestSubmit(); },
44-
'expired-callback': function () { captchaSolved = false; },
45-
'error-callback': function () { captchaSolved = false; }
46-
});
47-
form.addEventListener('submit', function (e) {
48-
if (!captchaSolved) {
49-
e.preventDefault();
50-
if (!window.jQuery || $(form).valid()) { hcaptcha.execute(forgotPwWidgetId); }
51-
}
52-
});
34+
window.EssentialCSharp.HCaptcha.initializeInvisibleForm({
35+
formId: 'forgot-password-form',
36+
containerId: 'forgot-password-captcha',
37+
siteKey: @Json.Serialize(Model.CaptchaSiteKey)
5338
});
54-
})();
5539
</script>
5640
}

EssentialCSharp.Web/Areas/Identity/Pages/Account/Login.cshtml

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -91,26 +91,10 @@
9191
@section Scripts {
9292
<partial name="_ValidationScriptsPartial" />
9393
<script>
94-
(function () {
95-
let loginWidgetId;
96-
let captchaSolved = false;
97-
const form = document.getElementById('account');
98-
99-
document.addEventListener('DOMContentLoaded', function () {
100-
loginWidgetId = hcaptcha.render('login-captcha', {
101-
sitekey: '@Model.CaptchaSiteKey',
102-
size: 'invisible',
103-
callback: function () { captchaSolved = true; form.requestSubmit(); },
104-
'expired-callback': function () { captchaSolved = false; },
105-
'error-callback': function () { captchaSolved = false; }
106-
});
107-
form.addEventListener('submit', function (e) {
108-
if (!captchaSolved) {
109-
e.preventDefault();
110-
if (!window.jQuery || $(form).valid()) { hcaptcha.execute(loginWidgetId); }
111-
}
112-
});
94+
window.EssentialCSharp.HCaptcha.initializeInvisibleForm({
95+
formId: 'account',
96+
containerId: 'login-captcha',
97+
siteKey: @Json.Serialize(Model.CaptchaSiteKey)
11398
});
114-
})();
11599
</script>
116100
}

EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,5 @@ ViewData["ActivePage"] = ManageNavPages.ChangePassword;
3737

3838
@section Scripts {
3939
<partial name="_ValidationScriptsPartial" />
40-
<script type="module" src="~/js/password-strength.js" asp-append-version="true"></script>
40+
<script type="module" src="~/dist/assets/password-strength.js" asp-append-version="true"></script>
4141
}

EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,5 @@ ViewData["ActivePage"] = ManageNavPages.ChangePassword;
3636

3737
@section Scripts {
3838
<partial name="_ValidationScriptsPartial" />
39-
<script type="module" src="~/js/password-strength.js" asp-append-version="true"></script>
39+
<script type="module" src="~/dist/assets/password-strength.js" asp-append-version="true"></script>
4040
}

EssentialCSharp.Web/Areas/Identity/Pages/Account/Register.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,5 +91,5 @@
9191

9292
@section Scripts {
9393
<partial name="_ValidationScriptsPartial" />
94-
<script type="module" src="~/js/password-strength.js" asp-append-version="true"></script>
94+
<script type="module" src="~/dist/assets/password-strength.js" asp-append-version="true"></script>
9595
}

EssentialCSharp.Web/Areas/Identity/Pages/Account/ResendEmailConfirmation.cshtml

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,10 @@
3131
@section Scripts {
3232
<partial name="_ValidationScriptsPartial" />
3333
<script>
34-
(function () {
35-
let resendEmailWidgetId;
36-
let captchaSolved = false;
37-
const form = document.getElementById('resend-email-form');
38-
39-
document.addEventListener('DOMContentLoaded', function () {
40-
resendEmailWidgetId = hcaptcha.render('resend-email-captcha', {
41-
sitekey: '@Model.CaptchaSiteKey',
42-
size: 'invisible',
43-
callback: function () { captchaSolved = true; form.requestSubmit(); },
44-
'expired-callback': function () { captchaSolved = false; },
45-
'error-callback': function () { captchaSolved = false; }
46-
});
47-
form.addEventListener('submit', function (e) {
48-
if (!captchaSolved) {
49-
e.preventDefault();
50-
if (!window.jQuery || $(form).valid()) { hcaptcha.execute(resendEmailWidgetId); }
51-
}
52-
});
34+
window.EssentialCSharp.HCaptcha.initializeInvisibleForm({
35+
formId: 'resend-email-form',
36+
containerId: 'resend-email-captcha',
37+
siteKey: @Json.Serialize(Model.CaptchaSiteKey)
5338
});
54-
})();
5539
</script>
5640
}

EssentialCSharp.Web/Areas/Identity/Pages/Account/ResetPassword.cshtml

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -43,28 +43,12 @@
4343

4444
@section Scripts {
4545
<partial name="_ValidationScriptsPartial" />
46-
<script type="module" src="~/js/password-strength.js" asp-append-version="true"></script>
46+
<script type="module" src="~/dist/assets/password-strength.js" asp-append-version="true"></script>
4747
<script>
48-
(function () {
49-
let resetPwWidgetId;
50-
let captchaSolved = false;
51-
const form = document.getElementById('reset-password-form');
52-
53-
document.addEventListener('DOMContentLoaded', function () {
54-
resetPwWidgetId = hcaptcha.render('reset-password-captcha', {
55-
sitekey: '@Model.CaptchaSiteKey',
56-
size: 'invisible',
57-
callback: function () { captchaSolved = true; form.requestSubmit(); },
58-
'expired-callback': function () { captchaSolved = false; },
59-
'error-callback': function () { captchaSolved = false; }
60-
});
61-
form.addEventListener('submit', function (e) {
62-
if (!captchaSolved) {
63-
e.preventDefault();
64-
if (!window.jQuery || $(form).valid()) { hcaptcha.execute(resetPwWidgetId); }
65-
}
66-
});
48+
window.EssentialCSharp.HCaptcha.initializeInvisibleForm({
49+
formId: 'reset-password-form',
50+
containerId: 'reset-password-captcha',
51+
siteKey: @Json.Serialize(Model.CaptchaSiteKey)
6752
});
68-
})();
6953
</script>
7054
}
Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1 @@
1-
<environment exclude="Development">
2-
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.min.js"
3-
asp-fallback-src="/lib/jquery-validation/jquery.validate.min.js"
4-
asp-fallback-test="window.jQuery && window.jQuery.validator"
5-
crossorigin="anonymous"
6-
integrity="sha384-rZfj/ogBloos6wzLGpPkkOr/gpkBNLZ6b6yLy4o+ok+t/SAKlL5mvXLr0OXNi1Hp">
7-
</script>
8-
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"
9-
asp-fallback-src="/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
10-
asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
11-
crossorigin="anonymous"
12-
integrity="sha384-R3vNCHsZ+A2Lo3d5A6XNP7fdQkeswQWTIPfiYwSpEP3YV079R+93YzTeZRah7f/F">
13-
</script>
14-
</environment>
1+
<partial name="~/Views/Shared/_ValidationScriptsPartial.cshtml" />

0 commit comments

Comments
 (0)