Skip to content

Commit 7bb2a88

Browse files
Update
1 parent 8d872d4 commit 7bb2a88

3 files changed

Lines changed: 49 additions & 4 deletions

File tree

EssentialCSharp.Web/Middleware/SecurityHeadersBuilder.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.Globalization;
1+
using System.Globalization;
22
using EssentialCSharp.Web.Middleware.Constants;
33

44
namespace EssentialCSharp.Web.Middleware;
@@ -35,8 +35,12 @@ public SecurityHeadersBuilder AddDefaultSecurePolicy()
3535
AddCustomHeader("X-Permitted-Cross-Domain-Policies", "master-only");
3636
// <add name="Referrer-Policy" value="no-referrer" />
3737
AddCustomHeader("Referrer-Policy", "no-referrer");
38-
// <add name="Permissions-Policy" value="accelerometer=(),ambient-light-sensor=(),autoplay=(),battery=(),camera=(),display-capture=(),document-domain=(),encrypted-media=(),fullscreen=(),gamepad=(),geolocation=(),gyroscope=(),layout-animations=(self),legacy-image-formats=(self),magnetometer=(),microphone=(),midi=(),oversized-images=(self),payment=(),picture-in-picture=(),publickey-credentials-get=(),speaker-selection=(),sync-xhr=(self),unoptimized-images=(self),unsized-media=(self),usb=(),screen-wake-lock=(),web-share=(),xr-spatial-tracking=()" />
39-
AddCustomHeader("Permissions-Policy", "accelerometer=(),ambient-light-sensor=(),autoplay=(),battery=(),camera=(),display-capture=(),document-domain=(),encrypted-media=(),fullscreen=(),gamepad=(),geolocation=(),gyroscope=(),layout-animations=(self),legacy-image-formats=(self),magnetometer=(),microphone=(),midi=(),oversized-images=(self),payment=(),picture-in-picture=(),publickey-credentials-get=(),speaker-selection=(),sync-xhr=(self),unoptimized-images=(self),unsized-media=(self),usb=(),screen-wake-lock=(),web-share=(),xr-spatial-tracking=()");
38+
const string permissionsPolicy =
39+
"accelerometer=(), autoplay=(), camera=(), display-capture=(), encrypted-media=(), fullscreen=(), " +
40+
"gamepad=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), " +
41+
"picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), sync-xhr=(), usb=(), " +
42+
"web-share=(), xr-spatial-tracking=()";
43+
AddCustomHeader("Permissions-Policy", permissionsPolicy);
4044

4145
// Headers to Remove: https://owasp.org/www-project-secure-headers/ci/headers_remove.json
4246
RemoveServerHeader();

EssentialCSharp.Web/Views/Shared/_Layout.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
</script>
8484
<script src="~/js/hcaptcha-form.js" asp-append-version="true"></script>
8585
<!-- hCaptcha Script -->
86-
<script src="https://js.hcaptcha.com/1/api.js?onload=ecsOnHcaptchaLoad" async defer></script>
86+
<script src="https://js.hcaptcha.com/1/api.js?render=explicit&onload=ecsOnHcaptchaLoad" async defer></script>
8787
@await RenderSectionAsync("HeadAppend", required: false)
8888
</head>
8989
<body>

EssentialCSharp.Web/wwwroot/js/hcaptcha-form.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,41 @@ window.EssentialCSharp = window.EssentialCSharp || {};
4444
return window.jQuery(form).valid();
4545
}
4646

47+
function resolveGlobalCallback(callbackName) {
48+
if (!callbackName) {
49+
return null;
50+
}
51+
52+
const callback = window[callbackName];
53+
return typeof callback === 'function' ? callback : null;
54+
}
55+
56+
function renderDeclarativeWidgets() {
57+
document.querySelectorAll('.h-captcha[data-sitekey]').forEach(function (element) {
58+
if (element.dataset.ecsRendered === 'true') {
59+
return;
60+
}
61+
62+
const siteKey = element.dataset.sitekey;
63+
if (!siteKey) {
64+
return;
65+
}
66+
67+
const options = {
68+
sitekey: siteKey,
69+
size: element.dataset.size || 'normal'
70+
};
71+
72+
const callback = resolveGlobalCallback(element.dataset.callback);
73+
if (callback) {
74+
options.callback = callback;
75+
}
76+
77+
window.hcaptcha.render(element, options);
78+
element.dataset.ecsRendered = 'true';
79+
});
80+
}
81+
4782
namespace.whenHcaptchaReady = function (callback) {
4883
if (isHcaptchaReady()) {
4984
callback();
@@ -122,6 +157,12 @@ window.EssentialCSharp = window.EssentialCSharp || {};
122157
});
123158
});
124159
};
160+
161+
onDomReady(function () {
162+
namespace.whenHcaptchaReady(function () {
163+
renderDeclarativeWidgets();
164+
});
165+
});
125166
})(window.EssentialCSharp.HCaptcha = window.EssentialCSharp.HCaptcha || {});
126167

127168
window.ecsOnHcaptchaLoad = function () {

0 commit comments

Comments
 (0)