aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsD <stoned@derpymail.org>2020-01-02 19:01:16 +0100
committersD <stoned@derpymail.org>2020-01-02 19:01:16 +0100
commitc52232539c1ef689e9ab5e04ff74a90bc3966eb3 (patch)
treec800c4afabf7e1f7d761ff5ee46c3513c44a0c66
parentddec46497e13ca577e3b8e238d00174b2617635c (diff)
change fingerprint lib to valves
the library wants to be the first thing to load after the page is idle, so i had to move all the onload things in the handle after the library ran
-rw-r--r--package-lock.json5
-rw-r--r--package.json1
-rw-r--r--webAO/client.html2
-rw-r--r--webAO/client.js72
-rw-r--r--webAO/fingerprint.js1215
-rw-r--r--webAO/index.html2
-rw-r--r--webAO/master.js65
7 files changed, 83 insertions, 1279 deletions
diff --git a/package-lock.json b/package-lock.json
index e967bda..9105ccd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2503,6 +2503,11 @@
"resolve-dir": "^1.0.1"
}
},
+ "fingerprintjs2": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fingerprintjs2/-/fingerprintjs2-2.1.0.tgz",
+ "integrity": "sha512-H1k/ESTD2rJ3liupyqWBPjZC+LKfCGixQzz/NDN4dkgbmG1bVFyMOh7luKSkVDoyfhgvRm62pviNMPI+eJTZcQ=="
+ },
"flat-cache": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
diff --git a/package.json b/package.json
index 179a1fa..ed4f390 100644
--- a/package.json
+++ b/package.json
@@ -31,6 +31,7 @@
},
"dependencies": {
"core-js": "^3.1.4",
+ "fingerprintjs2": "^2.1.0",
"regenerator-runtime": "^0.13.2"
}
}
diff --git a/webAO/client.html b/webAO/client.html
index 71e2e86..21660dd 100644
--- a/webAO/client.html
+++ b/webAO/client.html
@@ -301,7 +301,7 @@
<!-- About section -->
<span class="menu_content" id="content_4">
<meta name="frame-title" lang="en" content="About">
- <img id="about-logo" src="images/logo-new.png" onload="loadSettings()" alt="Attorney Online logo">
+ <img id="about-logo" src="images/logo-new.png" alt="Attorney Online logo">
<h1 style="line-height: .3em;">webAO</h1>
<h3>version 2.4</h3>
<p>Client created by
diff --git a/webAO/client.js b/webAO/client.js
index ee6bad7..f5fe9f9 100644
--- a/webAO/client.js
+++ b/webAO/client.js
@@ -4,14 +4,18 @@
* credits to aleks for original idea and source
*/
+import Fingerprint2 from 'fingerprintjs2';
+
// Load some defaults for the background and evidence dropdowns
import background_arr from "./backgrounds.js";
import evidence_arr from "./evidence.js";
-import Fingerprint from "./fingerprint.js";
-
import { EventEmitter } from "events";
+const version = 2.4;
+
+let client;
+let viewport;
// Get the arguments from the URL bar
const queryDict = {};
@@ -34,9 +38,6 @@ const UPDATE_INTERVAL = 60;
* which caused problems on low-memory devices in the past.
*/
let oldLoading = false;
-if (/webOS|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|PlayStation|Opera Mini/i.test(navigator.userAgent)) {
- oldLoading = true;
-}
// presettings
let selectedEffect = 0;
@@ -45,24 +46,38 @@ let selectedShout = 0;
let extrafeatures = [];
-const fp = new Fingerprint({
- canvas: true,
- ie_activex: true,
- screen_resolution: true
-});
-
-/** An emulated, semi-unique HDID that is generally safe for HDID bans. */
-const cookieid = getCookie("fingerprint");
let hdid;
+const options = {fonts: {extendedJsFonts: true, userDefinedFonts: ["Ace Attorney", "8bitoperator", "DINEngschrift"]}, excludes: {userAgent: true}};
+if (window.requestIdleCallback) {
+ requestIdleCallback(function () {
+ Fingerprint2.get(options, function (components) {
+ hdid = Fingerprint2.x64hash128(components.join(''), 31);
+ client = new Client(serverIP);
+ viewport = new Viewport();
+ if (/webOS|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|PlayStation|Opera Mini/i.test(navigator.userAgent)) {
+ oldLoading = true;
+ }
+ client.loadResources();
+ });
+ });
+} else {
+ setTimeout(function () {
+ Fingerprint2.get(options, function (components) {
+ hdid = Fingerprint2.x64hash128(components.join(''), 31);
+ client = new Client(serverIP);
+ viewport = new Viewport();
+
+ if (/webOS|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|PlayStation|Opera Mini/i.test(navigator.userAgent)) {
+ oldLoading = true;
+ }
+ client.loadResources();
+ });
+ }, 500);
+}
- hdid = fp.get();
- setCookie("fingerprint",hdid);
-
-console.log(`Your emulated HDID is ${hdid}`);
-
let lastICMessageTime = new Date(0);
class Client extends EventEmitter {
@@ -321,8 +336,10 @@ class Client extends EventEmitter {
* to the server.
*/
joinServer() {
+ console.log(`Your emulated HDID is ${hdid}`);
+
this.sendServer(`HI#${hdid}#%`);
- this.sendServer("ID#webAO#2.3#%");
+ this.sendServer(`ID#webAO#webAO#%`);
this.checkUpdater = setInterval(() => this.sendCheck(), 5000);
}
@@ -1959,14 +1976,6 @@ async function changeBackground(position) {
}
/**
- * Triggered when the settings tab is fully loaded.
- */
-export function loadSettings() {
- client.loadResources();
-}
-window.loadSettings = loadSettings;
-
-/**
* Triggered when the reconnect button is pushed.
*/
export function ReconnectButton() {
@@ -2494,11 +2503,4 @@ function decodeChat(estring) {
} else {
return estring;
}
-}
-
-//
-// Client code
-//
-
-let client = new Client(serverIP);
-let viewport = new Viewport(); \ No newline at end of file
+} \ No newline at end of file
diff --git a/webAO/fingerprint.js b/webAO/fingerprint.js
deleted file mode 100644
index e1974be..0000000
--- a/webAO/fingerprint.js
+++ /dev/null
@@ -1,1215 +0,0 @@
-/*
-***************************************************
-** http://davealger.info
-***************************************************
-
-This is a javascript only way to fingerprint a user with better than 90% accuracy in as few bytes as possible and no cookie storage!
-
-Special thanks to Valentin Vasilyev for the original fingerprintjs slightly modified and to Open Source Device Fingerprinting by Dark Wave Tech for the various identity functions
-
-***************************************************
-*/
-export default class Fingerprint {
- constructor(options) {
- var nativeForEach, nativeMap;
- nativeForEach = Array.prototype.forEach;
- nativeMap = Array.prototype.map;
- this.each = function (obj, iterator, context) {
- if (obj === null) {
- return;
- }
- if (nativeForEach && obj.forEach === nativeForEach) {
- obj.forEach(iterator, context);
- } else if (obj.length === +obj.length) {
- for (var i = 0, l = obj.length; i < l; i++) {
- if (iterator.call(context, obj[i], i, obj) === {})
- return;
- }
- } else {
- for (var key in obj) {
- if (obj.hasOwnProperty(key)) {
- if (iterator.call(context, obj[key], key, obj) === {})
- return;
- }
- }
- }
- };
- this.map = function (obj, iterator, context) {
- var results = [];
- if (obj == null)
- return results;
- if (nativeMap && obj.map === nativeMap)
- return obj.map(iterator, context);
- this.each(obj, function (value, index, list) {
- results[results.length] = iterator.call(context, value, index, list);
- });
- return results;
- };
- if (typeof options == "object") {
- this.hasher = options.hasher;
- this.screen_resolution = options.screen_resolution;
- this.screen_orientation = options.screen_orientation;
- this.canvas = options.canvas;
- this.ie_activex = options.ie_activex;
- } else if (typeof options == "function") {
- this.hasher = options;
- }
- }
-}
-Fingerprint.prototype = {
- get: function () {
- var keys = [];
- keys.push(navigator.userAgent);
- keys.push(navigator.language);
- keys.push(screen.colorDepth);
- if (this.screen_resolution) {
- var resolution = this.getScreenResolution();
- if (typeof resolution !== "undefined") {
- keys.push(this.getScreenResolution().join("x"));
- }
- }
- keys.push(new Date().getTimezoneOffset());
- keys.push(this.hasSessionStorage());
- keys.push(this.hasLocalStorage());
- keys.push(!!window.indexedDB);
- if (document.body) {
- keys.push(typeof (document.body.addBehavior));
- } else {
- keys.push(typeof undefined);
- }
- keys.push(typeof (window.openDatabase));
- keys.push(navigator.cpuClass);
- keys.push(navigator.platform);
- keys.push(navigator.doNotTrack);
- keys.push(this.getPluginsString());
- if (this.canvas && this.isCanvasSupported()) {
- keys.push(this.getCanvasFingerprint());
- }
- if (this.hasher) {
- return this.hasher(keys.join("###"), 31);
- } else {
- return this.murmurhash3_32_gc(keys.join("###"), 31);
- }
- },
- murmurhash3_32_gc: function (key, seed) {
- var remainder, bytes, h1, h1b, c1, c2, k1, i;
- remainder = key.length & 3;
- bytes = key.length - remainder;
- h1 = seed;
- c1 = 0xcc9e2d51;
- c2 = 0x1b873593;
- i = 0;
- while (i < bytes) {
- k1 = ((key.charCodeAt(i) & 0xff)) | ((key.charCodeAt(++i) & 0xff) << 8) | ((key.charCodeAt(++i) & 0xff) << 16) | ((key.charCodeAt(++i) & 0xff) << 24);
- ++i;
- k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;
- k1 = (k1 << 15) | (k1 >>> 17);
- k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;
- h1 ^= k1;
- h1 = (h1 << 13) | (h1 >>> 19);
- h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;
- h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));
- }
- k1 = 0;
- switch (remainder) {
- case 3:
- k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;
- case 2:
- k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;
- case 1:
- k1 ^= (key.charCodeAt(i) & 0xff);
- k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;
- k1 = (k1 << 15) | (k1 >>> 17);
- k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;
- h1 ^= k1;
- }
- h1 ^= key.length;
- h1 ^= h1 >>> 16;
- h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;
- h1 ^= h1 >>> 13;
- h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;
- h1 ^= h1 >>> 16;
- return h1 >>> 0;
- },
- hasLocalStorage: function () {
- try {
- return !!window.localStorage;
- } catch (e) {
- return true;
- }
- },
- hasSessionStorage: function () {
- try {
- return !!window.sessionStorage;
- } catch (e) {
- return true;
- }
- },
- isCanvasSupported: function () {
- var elem = document.createElement("canvas");
- return !!(elem.getContext && elem.getContext("2d"));
- },
- isIE: function () {
- if (navigator.appName === "Microsoft Internet Explorer") {
- return true;
- } else if (navigator.appName === "Netscape" && /Trident/.test(navigator.userAgent)) {
- return true;
- }
- return false;
- },
- getPluginsString: function () {
- if (this.isIE() && this.ie_activex) {
- return this.getIEPluginsString();
- } else {
- return this.getRegularPluginsString();
- }
- },
- getRegularPluginsString: function () {
- return this.map(navigator.plugins, function (p) {
- var mimeTypes = this.map(p, function (mt) {
- return [mt.type, mt.suffixes].join("~");
- }).join(",");
- return [p.name, p.description, mimeTypes].join("::");
- }, this).join(";");
- },
- getIEPluginsString: function () {
- if (window.ActiveXObject) {
- var names = ["ShockwaveFlash.ShockwaveFlash", "AcroPDF.PDF", "PDF.PdfCtrl", "QuickTime.QuickTime", "rmocx.RealPlayer G2 Control", "rmocx.RealPlayer G2 Control.1", "RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)", "RealVideo.RealVideo(tm) ActiveX Control (32-bit)", "RealPlayer", "SWCtl.SWCtl", "WMPlayer.OCX", "AgControl.AgControl", "Skype.Detection"];
- return this.map(names, function (name) {
- try {
- new ActiveXObject(name);
- return name;
- } catch (e) {
- return null;
- }
- }).join(";");
- } else {
- return "";
- }
- },
- getScreenResolution: function () {
- var resolution;
- if (this.screen_orientation) {
- resolution = (screen.height > screen.width) ? [screen.height, screen.width] : [screen.width, screen.height];
- } else {
- resolution = [screen.height, screen.width];
- }
- return resolution;
- },
- getCanvasFingerprint: function () {
- var canvas = document.createElement("canvas");
- var ctx = canvas.getContext("2d");
- var txt = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+-={}|[]\:\"<>?;,.";
- ctx.textBaseline = "top";
- ctx.font = "14px 'Arial'";
- ctx.textBaseline = "alphabetic";
- ctx.fillStyle = "#f60";
- ctx.fillRect(125, 1, 62, 20);
- ctx.fillStyle = "#069";
- ctx.fillText(txt, 2, 15);
- ctx.fillStyle = "rgba(102, 204, 0, 0.7)";
- ctx.fillText(txt, 4, 17);
- return canvas.toDataURL();
- }
-};
-
-/**************************************************/
-
-/**
-http://www.darkwavetech.com/fingerprint/fingerprint_code.html
-**/
-function fingerprint_flash() {
- "use strict";
- var strOnError, objPlayerVersion, strVersion, strOut;
-
- strOnError = "N/A";
- objPlayerVersion = null;
- strVersion = null;
- strOut = null;
-
- try {
- objPlayerVersion = swfobject.getFlashPlayerVersion();
- strVersion = objPlayerVersion.major + "." + objPlayerVersion.minor + "." + objPlayerVersion.release;
- if (strVersion === "0.0.0") {
- strVersion = "N/A";
- }
- strOut = strVersion;
- return strOut;
- } catch (err) {
- return strOnError;
- }
-}
-
-function fingerprint_browser() {
- "use strict";
- var strOnError, strUserAgent, numVersion, strBrowser, strOut;
-
- strOnError = "Error";
- strUserAgent = null;
- numVersion = null;
- strBrowser = null;
- strOut = null;
-
- try {
- strUserAgent = navigator.userAgent.toLowerCase();
- if (/msie (\d+\.\d+);/.test(strUserAgent)) { //test for MSIE x.x;
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- if (strUserAgent.indexOf("trident/6") > -1) {
- numVersion = 10;
- }
- if (strUserAgent.indexOf("trident/5") > -1) {
- numVersion = 9;
- }
- if (strUserAgent.indexOf("trident/4") > -1) {
- numVersion = 8;
- }
- strBrowser = "Internet Explorer " + numVersion;
- } else if (strUserAgent.indexOf("trident/7") > -1) { //IE 11+ gets rid of the legacy 'MSIE' in the user-agent string;
- numVersion = 11;
- strBrowser = "Internet Explorer " + numVersion;
- } else if (/firefox[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Firefox/x.x or Firefox x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Firefox " + numVersion;
- } else if (/opera[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Opera/x.x or Opera x.x (ignoring remaining decimal places);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Opera " + numVersion;
- } else if (/chrome[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Chrome/x.x or Chrome x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Chrome " + numVersion;
- } else if (/version[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Version/x.x or Version x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Safari " + numVersion;
- } else if (/rv[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for rv/x.x or rv x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Mozilla " + numVersion;
- } else if (/mozilla[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Mozilla/x.x or Mozilla x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Mozilla " + numVersion;
- } else if (/binget[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for BinGet/x.x or BinGet x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Library (BinGet) " + numVersion;
- } else if (/curl[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Curl/x.x or Curl x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Library (cURL) " + numVersion;
- } else if (/java[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Java/x.x or Java x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Library (Java) " + numVersion;
- } else if (/libwww-perl[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for libwww-perl/x.x or libwww-perl x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Library (libwww-perl) " + numVersion;
- } else if (/microsoft url control -[\s](\d+\.\d+)/.test(strUserAgent)) { //test for Microsoft URL Control - x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Library (Microsoft URL Control) " + numVersion;
- } else if (/peach[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for Peach/x.x or Peach x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Library (Peach) " + numVersion;
- } else if (/php[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for PHP/x.x or PHP x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Library (PHP) " + numVersion;
- } else if (/pxyscand[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for pxyscand/x.x or pxyscand x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Library (pxyscand) " + numVersion;
- } else if (/pycurl[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for pycurl/x.x or pycurl x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Library (PycURL) " + numVersion;
- } else if (/python-urllib[\/\s](\d+\.\d+)/.test(strUserAgent)) { //test for python-urllib/x.x or python-urllib x.x (ignoring remaining digits);
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Library (Python URLlib) " + numVersion;
- } else if (/appengine-google/.test(strUserAgent)) { //test for AppEngine-Google;
- numVersion = Number(RegExp.$1); // capture x.x portion and store as a number
- strBrowser = "Cloud (Google AppEngine) " + numVersion;
- } else {
- strBrowser = "Unknown";
- }
- strOut = strBrowser;
- return strOut;
- } catch (err) {
- return strOnError;
- }
-}
-
-function fingerprint_canvas() {
- "use strict";
- var strOnError, canvas, strCText, strText, strOut;
-
- strOnError = "Error";
- canvas = null;
- strCText = null;
- strText = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~1!2@3#4$5%6^7&8*9(0)-_=+[{]}|;:',<.>/?";
- strOut = null;
-
- try {
- canvas = document.createElement("canvas");
- strCText = canvas.getContext("2d");
- strCText.textBaseline = "top";
- strCText.font = "14px 'Arial'";
- strCText.textBaseline = "alphabetic";
- strCText.fillStyle = "#f60";
- strCText.fillRect(125, 1, 62, 20);
- strCText.fillStyle = "#069";
- strCText.fillText(strText, 2, 15);
- strCText.fillStyle = "rgba(102, 204, 0, 0.7)";
- strCText.fillText(strText, 4, 17);
- strOut = canvas.toDataURL();
- return strOut;
- } catch (err) {
- return strOnError;
- }
-}
-
-function fingerprint_connection() {
- "use strict";
- var strOnError, strConnection, strOut;
-
- strOnError = "N/A";
- strConnection = null;
- strOut = null;
-
- try {
- // only on android
- strConnection = navigator.connection.type;
- strOut = strConnection;
- } catch (err) {
- // return N/A if navigator.connection object does not apply to this device
- return strOnError;
- }
- return strOut;
-}
-
-function fingerprint_cookie() {
- "use strict";
- var strOnError, bolCookieEnabled, bolOut;
-
- strOnError = "Error";
- bolCookieEnabled = null;
- bolOut = null;
-
- try {
- bolCookieEnabled = (navigator.cookieEnabled) ? true : false;
-
- //if not IE4+ nor NS6+
- if (typeof navigator.cookieEnabled === "undefined" && !bolCookieEnabled) {
- document.cookie = "testcookie";
- bolCookieEnabled = (document.cookie.indexOf("testcookie") !== -1) ? true : false;
- }
- bolOut = bolCookieEnabled;
- return bolOut;
- } catch (err) {
- return strOnError;
- }
-}
-
-function fingerprint_display() {
- "use strict";
- var strSep, strPair, strOnError, strScreen, strDisplay, strOut;
-
- strSep = "|";
- strPair = "=";
- strOnError = "Error";
- strScreen = null;
- strDisplay = null;
- strOut = null;
-
- try {
- strScreen = window.screen;
- if (strScreen) {
- strDisplay = strScreen.colorDepth + strSep + strScreen.width + strSep + strScreen.height + strSep + strScreen.availWidth + strSep + strScreen.availHeight;
- }
- strOut = strDisplay;
- return strOut;
- } catch (err) {
- return strOnError;
- }
-}
-
-function fingerprint_fontsmoothing() {
- "use strict";
- var strOnError, strFontSmoothing, canvasNode, ctx, i, j, imageData, alpha, strOut;
-
- strOnError = "Unknown";
- strFontSmoothing = null;
- canvasNode = null;
- ctx = null;
- imageData = null;
- alpha = null;
- strOut = null;
-
- if (typeof (screen.fontSmoothingEnabled) !== "undefined") {
- strFontSmoothing = screen.fontSmoothingEnabled;
- } else {
- try {
- fontsmoothing = "false";
- canvasNode = document.createElement("canvas");
- canvasNode.width = "35";
- canvasNode.height = "35";
- canvasNode.style.display = "none";
- document.body.appendChild(canvasNode);
- ctx = canvasNode.getContext("2d");
- ctx.textBaseline = "top";
- ctx.font = "32px Arial";
- ctx.fillStyle = "black";
- ctx.strokeStyle = "black";
- ctx.fillText("O", 0, 0);
- for (j = 8; j <= 32; j = j + 1) {
- for (i = 1; i <= 32; i = i + 1) {
- imageData = ctx.getImageData(i, j, 1, 1).data;
- alpha = imageData[3];
- if (alpha !== 255 && alpha !== 0) {
- strFontSmoothing = "true"; // font-smoothing must be on.
- }
- }
- }
- strOut = strFontSmoothing;
- } catch (err) {
- return strOnError;
- }
- }
- strOut = strFontSmoothing;
- return strOut;
-}
-
-function fingerprint_fonts() {
- "use strict";
- var strOnError, style, fonts, count, template, fragment, divs, i, font, div, body, result, e;
-
- strOnError = "Error";
- style = null;
- fonts = null;
- font = null;
- count = 0;
- template = null;
- divs = null;
- e = null;
- div = null;
- body = null;
- i = 0;
-
- try {
- style = "position: absolute; visibility: hidden; display: block !important";
- fonts = ["8bitoperator", "Abadi MT Condensed Light", "Ace Attorney", "Adobe Fangsong Std", "Adobe Hebrew", "Adobe Ming Std", "Agency FB", "Aharoni", "Andalus", "Angsana New",
- "AngsanaUPC", "Aparajita", "Arab", "Arabic Transparent", "Arabic Typesetting", "Arial Baltic", "Arial Black", "Arial CE", "Arial CYR", "Arial Greek", "Arial TUR", "Arial",
- "Arimo", "Batang", "BatangChe", "Bauhaus 93", "Bell MT", "Berlin Sans FB", "Bitstream Vera Serif", "Bodoni MT", "Bookman Old Style", "Braggadocio", "Broadway", "Browallia New",
- "BrowalliaUPC", "Calibri Light", "Calibri", "Californian FB", "Cambria Math", "Cambria", "Candara", "Castellar", "Casual", "Centaur", "Century", "Century Gothic", "Chalkduster",
- "Colonna MT", "Comic Sans MS", "Consolas", "Constantia", "Copperplate Gothic Light", "Corbel", "Cordia New", "CordiaUPC", "Courier New Baltic", "Courier New CE", "Courier New CYR",
- "Courier New Greek", "Courier New TUR", "Courier New", "DejaVu Sans", "DFKai-SB", "DINEngschrift", "DaunPenh", "David", "DejaVu LGC Sans Mono", "Desdemona", "DilleniaUPC",
- "DokChampa", "Dotum", "DotumChe", "Droid Sans", "Droid Serif", "Droid Naskh Shift", "Dubai", "Ebrima", "Engravers MT", "Eras Bold ITC", "Estrangelo Edessa", "EucrosiaUPC", "Euphemia", "Eurostile", "FangSong", "Forte", "FrankRuehl",
- "Franklin Gothic Heavy", "Franklin Gothic Medium", "FreesiaUPC", "French Script MT", "Gabriola", "Gautami", "Georgia", "Gigi", "Gill Sans", "Gisha", "Goudy Old Style", "Gulim", "GulimChe",
- "GungSeo", "Gungsuh", "GungsuhChe", "Haettenschweiler", "Harrington", "Hei S", "HeiT", "Heisei Kaku Gothic", "Hiragino Sans GB", "Impact", "Informal Roman", "IrisUPC",
- "Iskoola Pota", "JasmineUPC", "Johnston", "KacstOne", "KaiTi", "Kalinga", "Kartika", "Khmer UI", "Kino MT", "KodchiangUPC", "Kokila", "Kozuka Gothic Pr6N", "Krungthep", "Lao UI", "Latha", "Leelawadee",
- "Levenim MT", "LilyUPC", "Lohit Gujarati", "Loma", "Lucida Bright", "Lucida Console", "Lucida Fax", "Lucida Sans Unicode", "MS Gothic", "MS Mincho", "MS PGothic", "MS PMincho",
- "MS Reference Sans Serif", "MS UI Gothic", "MV Boli", "Magneto", "Malgun Gothic", "Mangal", "Marlett", "Matura MT Script Capitals", "Meiryo UI", "Meiryo", "Menlo",
- "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le", "Microsoft Uighur", "Microsoft YaHei",
- "Microsoft Yi Baiti", "MingLiU", "MingLiU-ExtB", "MingLiU_HKSCS", "MingLiU_HKSCS-ExtB", "Miriam Fixed", "Miriam", "Mongolian Baiti", "MoolBoran", "More Perfect DOS VGA",
- "MS Outlook", "NSimSun", "Narkisim", "News Gothic MT", "Niagara Solid", "Noto Emoji", "Noto Sans", "Nyala", "OCR A", "Ocean Sans Std", "OpenSymbol", "PMingLiU", "PMingLiU-ExtB", "Palace Script MT",
- "Palatino Linotype", "Papyrus", "Perpetua", "Plantagenet Cherokee", "Playbill", "Prelude Bold", "Prelude Condensed Bold", "Prelude Condensed Medium", "Prelude Medium",
- "PreludeCompressedWGL Black", "PreludeCompressedWGL Bold", "PreludeCompressedWGL Light", "PreludeCompressedWGL Medium", "PreludeCondensedWGL Black", "PreludeCondensedWGL Bold",
- "PreludeCondensedWGL Light", "PreludeCondensedWGL Medium", "PreludeWGL Black", "PreludeWGL Bold", "PreludeWGL Light", "PreludeWGL Medium", "Raavi", "Rachana", "Roboto", "Rockwell", "Rod",
- "Sand", "Sakkal Majalla", "Sawasdee", "Script MT Bold", "Segoe Print", "Segoe Script", "Segoe UI Emoji", "Segoe UI Historic", "Segoe UI Light", "Segoe UI Semibold", "Segoe UI Symbol",
- "Segoe UI", "Shonar Bangla", "Showcard Gothic", "Shruti", "SimHei", "SimSun", "SimSun-ExtB", "Simplified Arabic Fixed", "Simplified Arabic", "Snap ITC", "Sylfaen", "Symbol",
- "Tahoma", "TeamViewer13", "Times New Roman Baltic", "Times New Roman CE", "Times New Roman CYR", "Times New Roman Greek", "Times New Roman TUR", "Times New Roman", "TlwgMono",
- "Traditional Arabic", "Trebuchet MS", "Tunga", "Tw Cen MT Condensed Extra Bold", "Ubuntu", "Umpush", "Univers", "Utopia", "Utsaah", "Vani", "Verdana", "Vijaya", "Vladimir Script",
- "Vrinda", "Webdings", "Wide Latin", "Wingdings", "Yu Gothic", "Zrnic Rg"];
-
- count = fonts.length;
- template = "<b style=\"display:inline !important; width:auto !important; font:normal 10px/1 'X',sans-serif !important\">ww</b>" + "<b style=\"display:inline !important; width:auto !important; font:normal 10px/1 'X',monospace !important\">ww</b>";
- fragment = document.createDocumentFragment();
- divs = [];
- for (i = 0; i < count; i = i + 1) {
- font = fonts[i];
- div = document.createElement("div");
- font = font.replace(/['"<>]/g, "");
- div.innerHTML = template.replace(/X/g, font);
- div.style.cssText = style;
- fragment.appendChild(div);
- divs.push(div);
- }
- body = document.body;
- body.insertBefore(fragment, body.firstChild);
- result = [];
- for (i = 0; i < count; i = i + 1) {
- e = divs[i].getElementsByTagName("b");
- if (e[0].offsetWidth === e[1].offsetWidth) {
- result.push(fonts[i]);
- }
- }
- // do not combine these two loops, remove child will cause reflow
- // and induce severe performance hit
- for (i = 0; i < count; i = i + 1) {
- body.removeChild(divs[i]);
- }
- return result.join("|");
- } catch (err) {
- return strOnError;
- }
-}
-
-function fingerprint_formfields() {
- "use strict";
- var i, j, numOfForms, numOfInputs, strFormsInPage, strFormsInputsData, strInputsInForm, strTmp, strOut;
-
- i = 0;
- j = 0;
- numOfForms = 0;
- numOfInputs = 0;
- strFormsInPage = "";
- strFormsInputsData = [];
- strInputsInForm = "";
- strTmp = "";
- strOut = "";
-
- strFormsInPage = document.getElementsByTagName("form");
- numOfForms = strFormsInPage.length;
- strFormsInputsData.push("url=" + window.location.href);
- for (i = 0; i < numOfForms; i = i + 1) {
- strFormsInputsData.push("FORM=" + strFormsInPage[i].name);
- strInputsInForm = strFormsInPage[i].getElementsByTagName("input");
- numOfInputs = strInputsInForm.length;
- for (j = 0; j < numOfInputs; j = j + 1) {
- if (strInputsInForm[j].type !== "hidden") {
- strFormsInputsData.push("Input=" + strInputsInForm[j].name);
- }
- }
- }
- strTmp = strFormsInputsData.join("|");
- strOut = strTmp;
- return strOut;
-}
-
-function fingerprint_java() {
- "use strict";
- var strOnError, strJavaEnabled, strOut;
-
- strOnError = "Error";
- strJavaEnabled = null;
- strOut = null;
-
- try {
- if (navigator.javaEnabled()) {
- strJavaEnabled = "true";
- } else {
- strJavaEnabled = "false";
- }
- strOut = strJavaEnabled;
- return strOut;
- } catch (err) {
- return strOnError;
- }
-}
-
-function fingerprint_language() {
- "use strict";
- var strSep, strPair, strOnError, strLang, strTypeLng, strTypeBrLng, strTypeSysLng, strTypeUsrLng, strOut;
-
- strSep = "|";
- strPair = "=";
- strOnError = "Error";
- strLang = null;
- strTypeLng = null;
- strTypeBrLng = null;
- strTypeSysLng = null;
- strTypeUsrLng = null;
- strOut = null;
-
- try {
- strTypeLng = typeof (navigator.language);
- strTypeBrLng = typeof (navigator.browserLanguage);
- strTypeSysLng = typeof (navigator.systemLanguage);
- strTypeUsrLng = typeof (navigator.userLanguage);
-
- if (strTypeLng !== "undefined") {
- strLang = "lang" + strPair + navigator.language + strSep;
- } else if (strTypeBrLng !== "undefined") {
- strLang = "lang" + strPair + navigator.browserLanguage + strSep;
- } else {
- strLang = "lang" + strPair + strSep;
- }
- if (strTypeSysLng !== "undefined") {
- strLang += "syslang" + strPair + navigator.systemLanguage + strSep;
- } else {
- strLang += "syslang" + strPair + strSep;
- }
- if (strTypeUsrLng !== "undefined") {
- strLang += "userlang" + strPair + navigator.userLanguage;
- } else {
- strLang += "userlang" + strPair;
- }
- strOut = strLang;
- return strOut;
- } catch (err) {
- return strOnError;
- }
-}
-
-function fingerprint_silverlight() {
- "use strict";
- var strOnError, objControl, objPlugin, strSilverlightVersion, strOut;
-
- strOnError = "Error";
- objControl = null;
- objPlugin = null;
- strSilverlightVersion = null;
- strOut = null;
-
- try {
- try {
- objControl = new ActiveXObject("AgControl.AgControl");
- if (objControl.IsVersionSupported("5.0")) {
- strSilverlightVersion = "5.x";
- } else if (objControl.IsVersionSupported("4.0")) {
- strSilverlightVersion = "4.x";
- } else if (objControl.IsVersionSupported("3.0")) {
- strSilverlightVersion = "3.x";
- } else if (objControl.IsVersionSupported("2.0")) {
- strSilverlightVersion = "2.x";
- } else {
- strSilverlightVersion = "1.x";
- }
- objControl = null;
- } catch (e) {
- objPlugin = navigator.plugins["Silverlight Plug-In"];
- if (objPlugin) {
- if (objPlugin.description === "1.0.30226.2") {
- strSilverlightVersion = "2.x";
- } else {
- strSilverlightVersion = parseInt(objPlugin.description[0], 10);
- }
- } else {
- strSilverlightVersion = "N/A";
- }
- }
- strOut = strSilverlightVersion;
- return strOut;
- } catch (err) {
- return strOnError;
- }
-}
-
-function fingerprint_os() {
- "use strict";
- var strSep, strOnError, strUserAgent, strPlatform, strOS, strOSBits, strOut;
-
- strSep = "|";
- strOnError = "Error";
- strUserAgent = null;
- strPlatform = null;
- strOS = null;
- strOSBits = null;
- strOut = null;
-
- try {
- /* navigator.userAgent is supported by all major browsers */
- strUserAgent = navigator.userAgent.toLowerCase();
- /* navigator.platform is supported by all major browsers */
- strPlatform = navigator.platform.toLowerCase();
- if (strUserAgent.indexOf("windows nt 6.3") !== -1) {
- strOS = "Windows 8.1";
- } else if (strUserAgent.indexOf("windows nt 6.2") !== -1) {
- strOS = "Windows 8";
- } else if (strUserAgent.indexOf("windows nt 6.1") !== -1) {
- strOS = "Windows 7";
- } else if (strUserAgent.indexOf("windows nt 10.0") !== -1) {
- strOS = "Windows 10";
- } else if (strUserAgent.indexOf("windows nt 6.0") !== -1) {
- strOS = "Windows Vista/Windows Server 2008";
- } else if (strUserAgent.indexOf("windows nt 5.2") !== -1) {
- strOS = "Windows XP x64/Windows Server 2003";
- } else if (strUserAgent.indexOf("windows nt 5.1") !== -1) {
- strOS = "Windows XP";
- } else if (strUserAgent.indexOf("windows nt 5.01") !== -1) {
- strOS = "Windows 2000, Service Pack 1 (SP1)";
- } else if (strUserAgent.indexOf("windows xp") !== -1) {
- strOS = "Windows XP";
- } else if (strUserAgent.indexOf("windows 2000") !== -1) {
- strOS = "Windows 2000";
- } else if (strUserAgent.indexOf("windows nt 5.0") !== -1) {
- strOS = "Windows 2000";
- } else if (strUserAgent.indexOf("iemobile") !== -1) {
- strOS = "Windows Mobile";
- } else if (strUserAgent.indexOf("wm5 pie") !== -1) {
- strOS = "Windows Mobile";
- } else if (strUserAgent.indexOf("windows") !== -1) {
- strOS = "Windows (Unknown Version)";
- } else if (strUserAgent.indexOf("openbsd") !== -1) {
- strOS = "Open BSD";
- } else if (strUserAgent.indexOf("sunos") !== -1) {
- strOS = "Sun OS";
- } else if (strUserAgent.indexOf("ubuntu") !== -1) {
- strOS = "Ubuntu";
- } else if (strUserAgent.indexOf("ipad") !== -1) {
- strOS = "iOS (iPad)";
- } else if (strUserAgent.indexOf("ipod") !== -1) {
- strOS = "iOS (iTouch)";
- } else if (strUserAgent.indexOf("iphone") !== -1) {
- strOS = "iOS (iPhone)";
- } else if (strUserAgent.indexOf("mac os x beta") !== -1) {
- strOS = "Mac OSX Beta (Kodiak)";
- } else if (strUserAgent.indexOf("mac os x 10.0") !== -1) {
- strOS = "Mac OSX Cheetah";
- } else if (strUserAgent.indexOf("mac os x 10.1") !== -1) {
- strOS = "Mac OSX Puma";
- } else if (strUserAgent.indexOf("mac os x 10.2") !== -1) {
- strOS = "Mac OSX Jaguar";
- } else if (strUserAgent.indexOf("mac os x 10.3") !== -1) {
- strOS = "Mac OSX Panther";
- } else if (strUserAgent.indexOf("mac os x 10.4") !== -1) {
- strOS = "Mac OSX Tiger";
- } else if (strUserAgent.indexOf("mac os x 10.5") !== -1) {
- strOS = "Mac OSX Leopard";
- } else if (strUserAgent.indexOf("mac os x 10.6") !== -1) {
- strOS = "Mac OSX Snow Leopard";
- } else if (strUserAgent.indexOf("mac os x 10.7") !== -1) {
- strOS = "Mac OSX Lion";
- } else if (strUserAgent.indexOf("mac os x") !== -1) {
- strOS = "Mac OSX (Version Unknown)";
- } else if (strUserAgent.indexOf("macintosh") !== -1) {
- strOS = "Mac OS Classic";
- } else if (strUserAgent.indexOf("googletv") !== -1) {
- strOS = "Android (GoogleTV)";
- } else if (strUserAgent.indexOf("android") !== -1) {
- strOS = "Android";
- } else if (strUserAgent.indexOf("x11") !== -1) {
- strOS = "UNIX";
- } else if (strUserAgent.indexOf("nix") !== -1) {
- strOS = "UNIX";
- } else if (strUserAgent.indexOf("linux") !== -1) {
- strOS = "Linux";
- } else if (strUserAgent.indexOf("qnx") !== -1) {
- strOS = "QNX";
- } else if (strUserAgent.indexOf("os/2") !== -1) {
- strOS = "IBM OS/2";
- } else if (strUserAgent.indexOf("beos") !== -1) {
- strOS = "BeOS";
- } else if (strUserAgent.indexOf("playbook") !== -1) {
- strOS = "Blackberry (Playbook)";
- } else if (strUserAgent.indexOf("wnd.rim") !== -1) {
- strOS = "Blackberry (IE/FF Emulator)";
- } else if (strUserAgent.indexOf("blackberry") !== -1) {
- strOS = "Blackberry";
- } else if (strUserAgent.indexOf("palm") !== -1) {
- strOS = "Palm OS";
- } else if (strUserAgent.indexOf("webos") !== -1) {
- strOS = "WebOS";
- } else if (strUserAgent.indexOf("hpwos") !== -1) {
- strOS = "WebOS (HP)";
- } else if (strUserAgent.indexOf("kindle") !== -1) {
- strOS = "Kindle";
- } else if (strUserAgent.indexOf("wii") !== -1) {
- strOS = "Nintendo (Wii)";
- } else if (strUserAgent.indexOf("nintendo ds") !== -1) {
- strOS = "Nintendo (DS)";
- } else if (strUserAgent.indexOf("playstation 3") !== -1) {
- strOS = "Sony (Playstation Console)";
- } else if (strUserAgent.indexOf("playstation portable") !== -1) {
- strOS = "Sony (Playstation Portable)";
- } else if (strUserAgent.indexOf("webtv") !== -1) {
- strOS = "MSN TV (WebTV)";
- } else if (strUserAgent.indexOf("inferno") !== -1) {
- strOS = "Inferno";
- } else {
- strOS = "Unknown";
- }
- if (strPlatform.indexOf("x64") !== -1) {
- strOSBits = "64 bits";
- } else if (strPlatform.indexOf("wow64") !== -1) {
- strOSBits = "64 bits";
- } else if (strPlatform.indexOf("win64") !== -1) {
- strOSBits = "64 bits";
- } else if (strPlatform.indexOf("win32") !== -1) {
- strOSBits = "32 bits";
- } else if (strPlatform.indexOf("x64") !== -1) {
- strOSBits = "64 bits";
- } else if (strPlatform.indexOf("x32") !== -1) {
- strOSBits = "32 bits";
- } else if (strPlatform.indexOf("x86") !== -1) {
- strOSBits = "32 bits*";
- } else if (strPlatform.indexOf("ppc") !== -1) {
- strOSBits = "64 bits";
- } else if (strPlatform.indexOf("alpha") !== -1) {
- strOSBits = "64 bits";
- } else if (strPlatform.indexOf("68k") !== -1) {
- strOSBits = "64 bits";
- } else if (strPlatform.indexOf("iphone") !== -1) {
- strOSBits = "32 bits";
- } else if (strPlatform.indexOf("android") !== -1) {
- strOSBits = "32 bits";
- } else {
- strOSBits = "Unknown";
- }
- strOut = strOS + strSep + strOSBits;
- return strOut;
- } catch (err) {
- return strOnError;
- }
-}
-
-function fingerprint_useragent() {
- "use strict";
- var strSep, strTmp, strUserAgent, strOut;
-
- strSep = "|";
- strTmp = null;
- strUserAgent = null;
- strOut = null;
-
- /* navigator.userAgent is supported by all major browsers */
- strUserAgent = navigator.userAgent.toLowerCase();
- /* navigator.platform is supported by all major browsers */
- strTmp = strUserAgent + strSep + navigator.platform;
- /* navigator.cpuClass only supported in IE */
- if (navigator.cpuClass) {
- strTmp += strSep + navigator.cpuClass;
- }
- /* navigator.browserLanguage only supported in IE, Safari and Chrome */
- if (navigator.browserLanguage) {
- strTmp += strSep + navigator.browserLanguage;
- } else {
- strTmp += strSep + navigator.language;
- }
- strOut = strTmp;
- return strOut;
-}
-
-function fingerprint_timezone() {
- "use strict";
- var strOnError, dtDate, numOffset, numGMTHours, numOut;
-
- strOnError = "Error";
- dtDate = null;
- numOffset = null;
- numGMTHours = null;
- numOut = null;
-
- try {
- dtDate = new Date();
- numOffset = dtDate.getTimezoneOffset();
- numGMTHours = (numOffset / 60) * (-1);
- numOut = numGMTHours;
- return numOut;
- } catch (err) {
- return strOnError;
- }
-}
-
-function fingerprint_touch() {
- "use strict";
- var bolTouchEnabled, bolOut;
-
- bolTouchEnabled = false;
- bolOut = null;
-
- try {
- if (document.createEvent("TouchEvent")) {
- bolTouchEnabled = true;
- }
- bolOut = bolTouchEnabled;
- return bolOut;
- } catch (ignore) {
- bolOut = bolTouchEnabled
- return bolOut;
- }
-}
-
-function fingerprint_truebrowser() {
- "use strict";
- var strBrowser, strUserAgent, strOut;
-
- strBrowser = "Unknown";
- strUserAgent = null;
- strOut = null;
-
- strUserAgent = navigator.userAgent.toLowerCase();
-
- /* Checks for different browsers, cannot use Try/Catch block */
- if (document.all && document.getElementById && navigator.savePreferences && (strUserAgent.indexOf("Netfront") < 0) && navigator.appName !== "Blazer") {
- strBrowser = "Escape 5";
- } else if (navigator.vendor === "KDE") {
- strBrowser = "Konqueror";
- } else if (document.childNodes && !document.all && !navigator.taintEnabled && !navigator.accentColorName) {
- strBrowser = "Safari";
- } else if (document.childNodes && !document.all && !navigator.taintEnabled && navigator.accentColorName) {
- strBrowser = "OmniWeb 4.5+";
- } else if (navigator.__ice_version) {
- strBrowser = "ICEBrowser";
- } else if (window.ScriptEngine && ScriptEngine().indexOf("InScript") + 1 && document.createElement) {
- strBrowser = "iCab 3+";
- } else if (window.ScriptEngine && ScriptEngine().indexOf("InScript") + 1) {
- strBrowser = "iCab 2-";
- } else if (strUserAgent.indexOf("hotjava") + 1 && (navigator.accentColorName) === "undefined") {
- strBrowser = "HotJava";
- } else if (document.layers && !document.classes) {
- strBrowser = "Omniweb 4.2-";
- } else if (document.layers && !navigator.mimeTypes["*"]) {
- strBrowser = "Escape 4";
- } else if (document.layers) {
- strBrowser = "Netscape 4";
- } else if (window.opera && document.getElementsByClassName) {
- strBrowser = "Opera 9.5+";
- } else if (window.opera && window.getComputedStyle) {
- strBrowser = "Opera 8";
- } else if (window.opera && document.childNodes) {
- strBrowser = "Opera 7";
- } else if (window.opera) {
- strBrowser = "Opera " + window.opera.version();
- } else if (navigator.appName.indexOf("WebTV") + 1) {
- strBrowser = "WebTV";
- } else if (strUserAgent.indexOf("netgem") + 1) {
- strBrowser = "Netgem NetBox";
- } else if (strUserAgent.indexOf("opentv") + 1) {
- strBrowser = "OpenTV";
- } else if (strUserAgent.indexOf("ipanel") + 1) {
- strBrowser = "iPanel MicroBrowser";
- } else if (document.getElementById && !document.childNodes) {
- strBrowser = "Clue browser";
- } else if (navigator.product && navigator.product.indexOf("Hv") === 0) {
- strBrowser = "Tkhtml Hv3+";
- } else if (typeof InstallTrigger !== "undefined") {
- strBrowser = "Firefox";
- } else if (window.atob) {
- strBrowser = "Internet Explorer 10+";
- } else if (XDomainRequest && window.performance) {
- strBrowser = "Internet Explorer 9";
- } else if (XDomainRequest) {
- strBrowser = "Internet Explorer 8";
- } else if (document.documentElement && document.documentElement.style.maxHeight !== "undefined") {
- strBrowser = "Internet Explorer 7"; //xxxxx
- } else if (document.compatMode && document.all) {
- strBrowser = "Internet Explorer 6"; //xxxxx
- } else if (window.createPopup) {
- strBrowser = "Internet Explorer 5.5";
- } else if (window.attachEvent) {
- strBrowser = "Internet Explorer 5";
- } else if (document.all && navigator.appName !== "Microsoft Pocket Internet Explorer") {
- strBrowser = "Internet Explorer 4";
- } else if ((strUserAgent.indexOf("msie") + 1) && window.ActiveXObject) {
- strBrowser = "Pocket Internet Explorer";
- } else if (document.getElementById && ((strUserAgent.indexOf("netfront") + 1) || navigator.appName === "Blazer" || navigator.product === "Gecko" || (navigator.appName.indexOf("PSP") + 1) || (navigator.appName.indexOf("PLAYSTATION 3") + 1))) {
- strBrowser = "NetFront 3+";
- } else if (navigator.product === "Gecko" && !navigator.savePreferences) {
- strBrowser = "Gecko engine (Mozilla, Netscape 6+ etc.)";
- } else if (window.chrome) {
- strBrowser = "Chrome";
- }
- strOut = strBrowser;
- return strOut;
-}
-
-var glbOnError = "N/A"
-var glbSep = "|";
-
-function activeXDetect(componentClassID) {
- "use strict";
- var strComponentVersion, strOut;
-
- strComponentVersion = "";
- strOut = "";
-
- try {
- strComponentVersion = document.body.getComponentVersion("{" + componentClassID + "}", "ComponentID");
- if (strComponentVersion !== null) {
- strOut = strComponentVersion;
- } else {
- strOut = false;
- }
- return strOut;
- } catch (err) {
- return glbOnError;
- }
-}
-
-function stripIllegalChars(strValue) {
- "use strict";
- var iCounter, strOriginal, strOut;
-
- iCounter = 0;
- strOriginal = "";
- strOut = "";
-
- try {
- strOriginal = strValue.toLowerCase();
- for (iCounter = 0; iCounter < strOriginal.length; iCounter = iCounter + 1) {
- if (strOriginal.charAt(iCounter) !== "\n" && strOriginal.charAt(iCounter) !== "/" && strOriginal.charAt(iCounter) !== "\\") {
- strOut = strOut + strOriginal.charAt(iCounter);
- } else if (strOriginal.charAt(iCounter) === "\n") {
- strOut = strOut + "n";
- }
- }
- return strOut;
- } catch (err) {
- return glbOnError;
- }
-}
-
-function hashtable_containsKey(key) {
- "use strict";
- var bolExists, iCounter;
-
- bolExists = false;
- iCounter = 0;
-
- for (iCounter = 0; iCounter < this.hashtable.length; iCounter = iCounter + 1) {
- if (iCounter === key && this.hashtable[iCounter] !== null) {
- bolExists = true;
- break;
- }
- }
- return bolExists;
-}
-
-function hashtable_get(key) {
- "use strict";
- return this.hashtable[key];
-}
-
-function hashtable_keys() {
- "use strict";
- var keys, iCounter;
-
- keys = [];
- iCounter = 0;
-
- for (iCounter in this.hashtable) {
- if (this.hashtable[iCounter] !== null) {
- keys.push(iCounter);
- }
- }
- return keys;
-}
-
-function hashtable_put(key, value) {
- "use strict";
- if (key === null || value === null) {
- throw "NullPointerException {" + key + "},{" + value + "}";
- }
- this.hashtable[key] = value;
-}
-
-function hashtable_size() {
- "use strict";
- var iSize, iCounter, iOut;
-
- iSize = 0;
- iCounter = 0;
- iOut = 0;
-
- for (iCounter in this.hashtable) {
- if (this.hashtable[iCounter] !== null) {
- iSize = iSize + 1;
- }
- }
- iOut = iSize;
- return iOut;
-}
-
-function Hashtable() {
- "use strict";
- this.containsKey = hashtable_containsKey;
- this.get = hashtable_get;
- this.keys = hashtable_keys;
- this.put = hashtable_put;
- this.size = hashtable_size;
- this.hashtable = [];
-}
-
-/* Detect Plugins */
-function fingerprint_plugins() {
- "use strict";
- var htIEComponents, strKey, strName, strVersion, strTemp, bolFirst, iCount, strMimeType, strOut;
-
- try {
- /* Create hashtable of IE components */
- htIEComponents = new Hashtable();
- htIEComponents.put("7790769C-0471-11D2-AF11-00C04FA35D02", "AddressBook"); // Address Book
- htIEComponents.put("47F67D00-9E55-11D1-BAEF-00C04FC2D130", "AolArtFormat"); // AOL ART Image Format Support
- htIEComponents.put("76C19B38-F0C8-11CF-87CC-0020AFEECF20", "ArabicDS"); // Arabic Text Display Support
- htIEComponents.put("76C19B34-F0C8-11CF-87CC-0020AFEECF20", "ChineseSDS"); // Chinese (Simplified) Text Display Support
- htIEComponents.put("76C19B33-F0C8-11CF-87CC-0020AFEECF20", "ChineseTDS"); // Chinese (traditional) Text Display Support
- htIEComponents.put("238F6F83-B8B4-11CF-8771-00A024541EE3", "CitrixICA"); // Citrix ICA Client
- htIEComponents.put("283807B5-2C60-11D0-A31D-00AA00B92C03", "DirectAnim"); // DirectAnimation
- htIEComponents.put("44BBA848-CC51-11CF-AAFA-00AA00B6015C", "DirectShow"); // DirectShow
- htIEComponents.put("9381D8F2-0288-11D0-9501-00AA00B911A5", "DynHTML"); // Dynamic HTML Data Binding
- htIEComponents.put("4F216970-C90C-11D1-B5C7-0000F8051515", "DynHTML4Java"); // Dynamic HTML Data Binding for Java
- htIEComponents.put("D27CDB6E-AE6D-11CF-96B8-444553540000", "Flash"); // Macromedia Flash
- htIEComponents.put("76C19B36-F0C8-11CF-87CC-0020AFEECF20", "HebrewDS"); // Hebrew Text Display Support
- htIEComponents.put("630B1DA0-B465-11D1-9948-00C04F98BBC9", "IEBrwEnh"); // Internet Explorer Browsing Enhancements
- htIEComponents.put("08B0E5C0-4FCB-11CF-AAA5-00401C608555", "IEClass4Java"); // Internet Explorer Classes for Java
- htIEComponents.put("45EA75A0-A269-11D1-B5BF-0000F8051515", "IEHelp"); // Internet Explorer Help
- htIEComponents.put("DE5AED00-A4BF-11D1-9948-00C04F98BBC9", "IEHelpEng"); // Internet Explorer Help Engine
- htIEComponents.put("89820200-ECBD-11CF-8B85-00AA005B4383", "IE5WebBrw"); // Internet Explorer 5/6 Web Browser
- htIEComponents.put("5A8D6EE0-3E18-11D0-821E-444553540000", "InetConnectionWiz"); // Internet Connection Wizard
- htIEComponents.put("76C19B30-F0C8-11CF-87CC-0020AFEECF20", "JapaneseDS"); // Japanese Text Display Support
- htIEComponents.put("76C19B31-F0C8-11CF-87CC-0020AFEECF20", "KoreanDS"); // Korean Text Display Support
- htIEComponents.put("76C19B50-F0C8-11CF-87CC-0020AFEECF20", "LanguageAS"); // Language Auto-Selection
- htIEComponents.put("08B0E5C0-4FCB-11CF-AAA5-00401C608500", "MsftVM"); // Microsoft virtual machine
- htIEComponents.put("5945C046-LE7D-LLDL-BC44-00C04FD912BE", "MSNMessengerSrv"); // MSN Messenger Service
- htIEComponents.put("44BBA842-CC51-11CF-AAFA-00AA00B6015B", "NetMeetingNT"); // NetMeeting NT
- htIEComponents.put("3AF36230-A269-11D1-B5BF-0000F8051515", "OfflineBrwPack"); // Offline Browsing Pack
- htIEComponents.put("44BBA840-CC51-11CF-AAFA-00AA00B6015C", "OutlookExpress"); // Outlook Express
- htIEComponents.put("76C19B32-F0C8-11CF-87CC-0020AFEECF20", "PanEuropeanDS"); // Pan-European Text Display Support
- htIEComponents.put("4063BE15-3B08-470D-A0D5-B37161CFFD69", "QuickTime"); // Apple Quick Time
- htIEComponents.put("DE4AF3B0-F4D4-11D3-B41A-0050DA2E6C21", "QuickTimeCheck"); // Apple Quick Time Check
- htIEComponents.put("3049C3E9-B461-4BC5-8870-4C09146192CA", "RealPlayer"); // RealPlayer Download and Record Plugin for IE
- htIEComponents.put("2A202491-F00D-11CF-87CC-0020AFEECF20", "ShockwaveDir"); // Macromedia Shockwave Director
- htIEComponents.put("3E01D8E0-A72B-4C9F-99BD-8A6E7B97A48D", "Skype"); // Skype
- htIEComponents.put("CC2A9BA0-3BDD-11D0-821E-444553540000", "TaskScheduler"); // Task Scheduler
- htIEComponents.put("76C19B35-F0C8-11CF-87CC-0020AFEECF20", "ThaiDS"); // Thai Text Display Support
- htIEComponents.put("3BF42070-B3B1-11D1-B5C5-0000F8051515", "Uniscribe"); // Uniscribe
- htIEComponents.put("4F645220-306D-11D2-995D-00C04F98BBC9", "VBScripting"); // Visual Basic Scripting Support v5.6
- htIEComponents.put("76C19B37-F0C8-11CF-87CC-0020AFEECF20", "VietnameseDS"); // Vietnamese Text Display Support
- htIEComponents.put("10072CEC-8CC1-11D1-986E-00A0C955B42F", "VML"); // Vector Graphics Rendering (VML)
- htIEComponents.put("90E2BA2E-DD1B-4CDE-9134-7A8B86D33CA7", "WebEx"); // WebEx Productivity Tools
- htIEComponents.put("73FA19D0-2D75-11D2-995D-00C04F98BBC9", "WebFolders"); // Web Folders
- htIEComponents.put("89820200-ECBD-11CF-8B85-00AA005B4340", "WinDesktopUpdateNT"); // Windows Desktop Update NT
- htIEComponents.put("9030D464-4C02-4ABF-8ECC-5164760863C6", "WinLive"); // Windows Live ID Sign-in Helper
- htIEComponents.put("6BF52A52-394A-11D3-B153-00C04F79FAA6", "WinMediaPlayer"); // Windows Media Player (Versions 7, 8 or 9)
- htIEComponents.put("22D6F312-B0F6-11D0-94AB-0080C74C7E95", "WinMediaPlayerTrad"); // Windows Media Player (Traditional Versions)
-
- strTemp = "";
- bolFirst = true;
-
- /* strOpera gives full path of the file, extract the filenames, ignoring description and length */
- if (navigator.plugins.length > 0) {
- for (iCount = 0; iCount < navigator.plugins.length; iCount = iCount + 1) {
- if (bolFirst === true) {
- strTemp += navigator.plugins[iCount].name;
- bolFirst = false;
- } else {
- strTemp += glbSep + navigator.plugins[iCount].name;
- }
- }
- } else if (navigator.mimeTypes.length > 0) {
- strMimeType = navigator.mimeTypes;
- for (iCount = 0; iCount < strMimeType.length; iCount = iCount + 1) {
- if (bolFirst === true) {
- strTemp += strMimeType[iCount].description;
- bolFirst = false;
- } else {
- strTemp += glbSep + strMimeType[iCount].description;
- }
- }
- } else {
- document.body.addBehavior("#default#clientCaps");
- strKey = htIEComponents.keys();
- for (iCount = 0; iCount < htIEComponents.size(); iCount = iCount + 1) {
- strVersion = activeXDetect(strKey[iCount]);
- strName = htIEComponents.get(strKey[iCount]);
- if (strVersion) {
- if (bolFirst === true) {
- strTemp = strName + glbPair + strVersion;
- bolFirst = false;
- } else {
- strTemp += glbSep + strName + glbPair + strVersion;
- }
- }
- }
- strTemp = strTemp.replace(/,/g, ".");
- }
- strTemp = stripIllegalChars(strTemp);
- if (strTemp === "") {
- strTemp = "None";
- }
- strOut = strTemp;
- return strOut;
- } catch (err) {
- return glbOnError;
- }
-} \ No newline at end of file
diff --git a/webAO/index.html b/webAO/index.html
index 7b19fd8..92b0684 100644
--- a/webAO/index.html
+++ b/webAO/index.html
@@ -23,7 +23,7 @@
</script>
</head>
-<body onload="onLoad()">
+<body>
<nav class="navbar fixed-top navbar-expand-lg navbar-dark bg-dark fixed-top">
<div class="container">
<div class="collapse navbar-collapse" id="navbarResponsive">
diff --git a/webAO/master.js b/webAO/master.js
index 5d51d24..0e2e037 100644
--- a/webAO/master.js
+++ b/webAO/master.js
@@ -1,35 +1,44 @@
-import Fingerprint from "./fingerprint.js";
-
const MASTERSERVER_IP = "master.aceattorneyonline.com:27014";
+const version = 2.4;
-const fp = new Fingerprint({
- canvas: true,
- ie_activex: true,
- screen_resolution: true
-});
-
-/** An emulated, semi-unique HDID that is generally safe for HDID bans. */
-const cookieid = getCookie("fingerprint");
-let hdid;
-
-
+import Fingerprint2 from 'fingerprintjs2';
- hdid = fp.get();
- setCookie("fingerprint",hdid);
+let masterserver;
-console.log(`Your emulated HDID is ${hdid}`);
+let hdid;
+const options = {fonts: {extendedJsFonts: true, userDefinedFonts: ["Ace Attorney", "8bitoperator", "DINEngschrift"]}, excludes: {userAgent: true}};
let oldLoading = false;
-export function onLoad(){
- if (/webOS|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|PlayStation|Opera Mini/i.test(navigator.userAgent)) {
- oldLoading = true;
- }
-}
-window.onLoad = onLoad;
-const masterserver = new WebSocket("ws://" + MASTERSERVER_IP);
-masterserver.onopen = (evt) => onOpen(evt);
-masterserver.onmessage = (evt) => onMessage(evt);
+if (window.requestIdleCallback) {
+ requestIdleCallback(function () {
+ Fingerprint2.get(options, function (components) {
+ hdid = Fingerprint2.x64hash128(components.join(''), 31);
+
+ masterserver = new WebSocket("ws://" + MASTERSERVER_IP);
+ masterserver.onopen = (evt) => onOpen(evt);
+ masterserver.onmessage = (evt) => onMessage(evt);
+
+ if (/webOS|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|PlayStation|Opera Mini/i.test(navigator.userAgent)) {
+ oldLoading = true;
+ }
+ });
+ });
+} else {
+ setTimeout(function () {
+ Fingerprint2.get(options, function (components) {
+ hdid = Fingerprint2.x64hash128(components.join(''), 31);
+
+ masterserver = new WebSocket("ws://" + MASTERSERVER_IP);
+ masterserver.onopen = (evt) => onOpen(evt);
+ masterserver.onmessage = (evt) => onMessage(evt);
+
+ if (/webOS|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|PlayStation|Opera Mini/i.test(navigator.userAgent)) {
+ oldLoading = true;
+ }
+ });
+ }, 500);
+}
const server_description = [];
server_description[-1] = "This is your computer on port 50001";
@@ -79,7 +88,9 @@ export function setServ(ID) {
window.setServ = setServ;
function onOpen(_e) {
- masterserver.send("ID#webAO#webAO#%");
+ console.log(`Your emulated HDID is ${hdid}`);
+ masterserver.send(`ID#webAO#webAO#%`);
+
if (oldLoading === true) {
masterserver.send("askforservers#%");
}
@@ -97,7 +108,7 @@ function checkOnline(serverID, coIP) {
function onCOOpen(_e) {
document.getElementById(`server${serverID}`).className = "available";
oserv.send(`HI#${hdid}#%`);
- oserv.send("ID#webAO#webAO#%");
+ oserv.send(`ID#webAO#webAO#%`);
}
function onCOMessage(e) {