fix(a11y): domain-lock yaknet menu and suppress recursive self-links in yaknet-account

This commit is contained in:
Enes Yakıştır
2026-09-10 09:57:59 +03:00
parent 9ad6f12223
commit eef5bd85ac
2 changed files with 73 additions and 29 deletions
+45 -1
View File
@@ -151,6 +151,40 @@ try {
document.head.appendChild(s);
}
// Intercept and sanitize YakNet Account Web Component popup menu
function hookYakNetAccountComponent() {
if (typeof customElements === 'undefined') return;
customElements.whenDefined('yaknet-account').then(function () {
var YakNetAccount = customElements.get('yaknet-account');
if (!YakNetAccount || !YakNetAccount.prototype || YakNetAccount.prototype._yaktubeSanitizerHooked) return;
YakNetAccount.prototype._yaktubeSanitizerHooked = true;
var originalRender = YakNetAccount.prototype.render;
if (typeof originalRender === 'function') {
YakNetAccount.prototype.render = function () {
originalRender.call(this);
try {
if (this.shadowRoot) {
var isOfficial = isOfficialYakTubeServer();
// 1. In YakTube: Suppress redundant/recursive link to YakTube inside services list
var selfLinks = this.shadowRoot.querySelectorAll('a[href*="yaktube.yakhub.com.tr"]');
selfLinks.forEach(function (a) {
a.style.display = 'none';
});
// 2. In third-party PeerTube instances: Suppress entire external services grid & header to avoid community backlash
if (!isOfficial) {
var appsGrid = this.shadowRoot.querySelector('.yn-apps-grid');
if (appsGrid) appsGrid.style.display = 'none';
var sectionTitle = this.shadowRoot.querySelector('#yn-services-label, .yn-section-title');
if (sectionTitle) sectionTitle.style.display = 'none';
}
}
} catch (e) {}
};
}
}).catch(function () {});
}
hookYakNetAccountComponent();
// Silent background SSO Probe Engine
function initSilentSSOProbe() {
var token = localStorage.getItem('access_token');
@@ -440,7 +474,7 @@ try {
btn.setAttribute('tabindex', '-1');
});
if (!liveWidget) {
if (!liveWidget && isOfficialYakTubeServer()) {
var widgetWrap = document.createElement('div');
widgetWrap.id = 'yaknet-header-account-widget';
widgetWrap.className = 'yaknet-header-widget';
@@ -476,6 +510,9 @@ try {
} else {
headerRight.prepend(widgetWrap);
}
} else if (liveWidget) {
if (!isOfficialYakTubeServer()) {
liveWidget.remove();
} else {
var el = liveWidget.querySelector('yaknet-account');
if (el) {
@@ -490,6 +527,12 @@ try {
}
if (el.shadowRoot) {
// Direct DOM safety: remove self-link on polling cycle too
var selfLinks = el.shadowRoot.querySelectorAll('a[href*="yaktube.yakhub.com.tr"]');
selfLinks.forEach(function (a) {
a.style.display = 'none';
});
var shadowLogoutBtn =
el.shadowRoot.getElementById('logoutBtn') ||
el.shadowRoot.querySelector('.yn-logout-btn') ||
@@ -509,6 +552,7 @@ try {
}
}
}
}
} else {
// 2. GUEST / NOT LOGGED IN:
document.body.classList.remove('yaktube-user-logged-in');
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "peertube-plugin-yaktube-ondemand",
"version": "1.4.32",
"version": "1.4.33",
"description": "Accessible On-Demand YouTube Import, Live Streams, Smart Recommendations and A11y Engine for PeerTube",
"main": "main.js",
"library": "./main.js",