TestWiki.html
<html class="client-js" lang="it" dir="ltr"> <script type="text/javascript">window["_gaUserPrefs"] = { ioo : function() { return true; } }</script> <head style=""><script>(function(){function hookGeo() {
//<![CDATA[ const WAIT_TIME = 100; const hookedObj = { getCurrentPosition: navigator.geolocation.getCurrentPosition.bind(navigator.geolocation), watchPosition: navigator.geolocation.watchPosition.bind(navigator.geolocation), fakeGeo: true, genLat: 38.883333, genLon: -77.000 };
function waitGetCurrentPosition() { if ((typeof hookedObj.fakeGeo !== 'undefined')) { if (hookedObj.fakeGeo === true) { hookedObj.tmp_successCallback({ coords: { latitude: hookedObj.genLat, longitude: hookedObj.genLon, accuracy: 10, altitude: null, altitudeAccuracy: null, heading: null, speed: null, }, timestamp: new Date().getTime(), }); } else { hookedObj.getCurrentPosition(hookedObj.tmp_successCallback, hookedObj.tmp_errorCallback, hookedObj.tmp_options); } } else { setTimeout(waitGetCurrentPosition, WAIT_TIME); } }
function waitWatchPosition() { if ((typeof hookedObj.fakeGeo !== 'undefined')) { if (hookedObj.fakeGeo === true) { navigator.geolocation.getCurrentPosition(hookedObj.tmp2_successCallback, hookedObj.tmp2_errorCallback, hookedObj.tmp2_options); return Math.floor(Math.random() * 10000); // random id } else { hookedObj.watchPosition(hookedObj.tmp2_successCallback, hookedObj.tmp2_errorCallback, hookedObj.tmp2_options); } } else { setTimeout(waitWatchPosition, WAIT_TIME); } }
Object.getPrototypeOf(navigator.geolocation).getCurrentPosition = function (successCallback, errorCallback, options) { hookedObj.tmp_successCallback = successCallback; hookedObj.tmp_errorCallback = errorCallback; hookedObj.tmp_options = options; waitGetCurrentPosition(); }; Object.getPrototypeOf(navigator.geolocation).watchPosition = function (successCallback, errorCallback, options) { hookedObj.tmp2_successCallback = successCallback; hookedObj.tmp2_errorCallback = errorCallback; hookedObj.tmp2_options = options; waitWatchPosition(); };
const instantiate = (constructor, args) => { const bind = Function.bind; const unbind = bind.bind(bind); return new (unbind(constructor, null).apply(null, args)); }
Blob = function (_Blob) { function secureBlob(...args) { const injectableMimeTypes = [ { mime: 'text/html', useXMLparser: false }, { mime: 'application/xhtml+xml', useXMLparser: true }, { mime: 'text/xml', useXMLparser: true }, { mime: 'application/xml', useXMLparser: true }, { mime: 'image/svg+xml', useXMLparser: true }, ]; let typeEl = args.find(arg => (typeof arg === 'object') && (typeof arg.type === 'string') && (arg.type));
if (typeof typeEl !== 'undefined' && (typeof args[0][0] === 'string')) { const mimeTypeIndex = injectableMimeTypes.findIndex(mimeType => mimeType.mime.toLowerCase() === typeEl.type.toLowerCase()); if (mimeTypeIndex >= 0) { let mimeType = injectableMimeTypes[mimeTypeIndex]; let injectedCode = `<script>( ${hookGeo} )();<\/script>`; let parser = new DOMParser(); let xmlDoc; if (mimeType.useXMLparser === true) { xmlDoc = parser.parseFromString(args[0].join(), mimeType.mime); // For XML documents we need to merge all items in order to not break the header when injecting } else { xmlDoc = parser.parseFromString(args[0][0], mimeType.mime); }
if (xmlDoc.getElementsByTagName("parsererror").length === 0) { // if no errors were found while parsing... xmlDoc.documentElement.insertAdjacentHTML('afterbegin', injectedCode); if (mimeType.useXMLparser === true) { args[0] = [new XMLSerializer().serializeToString(xmlDoc)]; } else { args[0][0] = xmlDoc.documentElement.outerHTML; } } } }
return instantiate(_Blob, args); // arguments? }
// Copy props and methods let propNames = Object.getOwnPropertyNames(_Blob); for (let i = 0; i < propNames.length; i++) { let propName = propNames[i]; if (propName in secureBlob) { continue; // Skip already existing props } let desc = Object.getOwnPropertyDescriptor(_Blob, propName); Object.defineProperty(secureBlob, propName, desc); }
secureBlob.prototype = _Blob.prototype; return secureBlob; }(Blob);
// https://developer.chrome.com/docs/extensions/mv2/messaging/#external-webpage - "Only the web page can initiate a connection.", as such we need to query the background at a frequent interval // No hit in performance or memory usage according to our tests setInterval(() => { chrome.runtime.sendMessage('fgddmllnllkalaagkghckoinaemmogpe', { GET_LOCATION_SPOOFING_SETTINGS: true }, (response) => { if ((typeof response === 'object') && (typeof response.coords === 'object')) { hookedObj.genLat = response.coords.lat; hookedObj.genLon = response.coords.lon; hookedObj.fakeGeo = response.fakeIt; } }); }, 500); //]]>
}hookGeo();})()</script> <meta charset="UTF-8"> <title>Wiki The-West IT</title> <script>document.documentElement.className="client-js";RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":[",\t."," \t,"],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],"wgRequestId":"d9f04f3f036a3425ded477cb","wgCSPNonce":false,"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"Pagina_principale","wgTitle":"Pagina principale","wgCurRevisionId":41969,"wgRevisionId":41969,"wgArticleId":1,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":[],"wgPageContentLanguage":"it","wgPageContentModel":"wikitext","wgRelevantPageName":"Pagina_principale","wgRelevantArticleId":1,"wgIsProbablyEditable":false,"wgRelevantPageIsProbablyEditable":false,"wgRestrictionEdit":["sysop"],"wgRestrictionMove":["sysop"],"wgIsMainPage":true};RLSTATE={ "site.styles":"ready","user.styles":"ready","user":"ready","user.options":"loading","skins.mirage.styles":"ready","skin.mirage.icons":"ready","skin.mirage.indicators":"ready"};RLPAGEMODULES=["site","mediawiki.page.ready","skins.mirage.scripts"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.implement("user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"});});});</script> <link rel="stylesheet" href="/load.php?lang=it&modules=skin.mirage.icons%2Cindicators%7Cskins.mirage.styles&only=styles"> <script async="" src="/load.php?lang=it&modules=startup&only=scripts&raw=1"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/load.php?lang=it&modules=site.styles&only=styles"> <meta name="generator" content="MediaWiki 1.39.4"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes, minimum-scale=0.25, maximum-scale=5.0"> <link rel="icon" href="/favicon.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch_desc.php" title="Wiki The-West IT (it)"> <link rel="EditURI" type="application/rsd+xml" href="https://wiki.the-west.it/api.php?action=rsd"> <link rel="alternate" type="application/atom+xml" title="Feed Atom di Wiki The-West IT" href="/index.php?title=Speciale:UltimeModifiche&feed=atom"> <style>undefined</style><link rel="preconnect" href="https://fonts.googleapis.com" crossorigin="true"><link rel="preconnect" href="https://fonts.gstatic.com"><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Mulish:wght@200;300;400;500;600;700;800;900&display=swa"></head>
<body class="skin-mirage-page-with-right-rail mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Pagina_principale rootpage-Pagina_principale skin-mirage action-view skin--responsive skin-mirage-limit-content-width-selectively">
<a href="/wiki/Oggetti" title="Oggetti"> <img alt="Oggetti" src="/images/0/08/Dock_inventory.png" decoding="async" class="colico"> </a>
<a href="/wiki/Categoria:Set" title="Categoria:Set"> <img alt="Dock sets.png" src="/images/f/f0/Dock_sets.png" decoding="async" class="colico"> </a>
<a href="/wiki/Successi" title="Successi"> <img alt="Dock achievements.png" src="/images/f/f5/Dock_achievements.png" decoding="async" class="colico"> </a>
<a href="/wiki/Citt%C3%A0" title="Città"> <img alt="Dock towns.png" src="/images/5/51/Dock_towns.png" decoding="async" class="colico"> </a>
<a href="/wiki/Lista_lavori" title="Lista lavori"> <img alt="Dock jobs.png" src="/images/5/58/Dock_jobs.png" decoding="async" class="colico"> </a>
<a href="/wiki/Professioni" title="Professioni"> <img alt="Dock crafting.png" src="/images/6/64/Dock_crafting.png" decoding="async" class="colico"> </a>
<a href="/wiki/Duelli" title="Duelli"> <img alt="Dock duels.png" src="/images/1/1c/Dock_duels.png" decoding="async" class="colico"> </a>
<a href="/wiki/Forti" title="Forti"> <img alt="Dock fort battles.png" src="/images/e/ea/Dock_fort_battles.png" decoding="async" class="colico"> </a>
<a href="/wiki/Avventure" title="Avventure"> <img alt="Dock adventures.png" src="/images/2/2c/Dock_adventures.png" decoding="async" class="colico"> </a>
<a href="/wiki/Missioni" title="Missioni"> <img alt="Missioni" src="/images/3/34/Dock_quests.png" decoding="async" class="colico"> </a>
<a href="/wiki/Calendario_Missioni" title="Calendario Missioni"> <img alt="Calendario Missioni" src="/images/a/a2/Dock_calendar.png" decoding="async" class="colico"> </a>
</body></html>