This commit is contained in:
randogoth 2023-05-21 16:38:57 +03:00
parent aecbbf2129
commit b2ad274280

View file

@ -21,7 +21,7 @@ if ( hasharray.length > 0 ) {
// fingerprint user
const cyrb53 = function (str, seed = 0) {
function cyrb53(str, seed = 0){
let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;
for (let i = 0, ch; i < str.length; i++) {
ch = str.charCodeAt(i);
@ -33,87 +33,36 @@ const cyrb53 = function (str, seed = 0) {
return 4294967296 * (2097151 & h2) + (h1 >>> 0);
};
const generateTheAudioFingerPrint = function () {
var context = null;
var currentTime = null;
var oscillator = null;
var compressor = null;
var fingerprint = null;
var callback = null;
function run(debug = false) {
try {
setup();
oscillator.connect(compressor);
compressor.connect(context.destination);
oscillator.start(0);
context.startRendering();
context.oncomplete = onComplete;
}
catch (e) {
if (debug) {
throw e;
}
}
function audioFingerprint() {
const AudioContext = window.OfflineAudioContext || window.webkitOfflineAudioContex;
const context = new AudioContext(1, 5000, 44100);
const oscillator = context.createOscillator();
oscillator.type = "triangle";
oscillator.frequency.value = 1000;
const compressor = context.createDynamicsCompressor()
compressor.threshold.value = -50;
compressor.knee.value = 40;
compressor.ratio.value = 12;
compressor.reduction.value = 20;
compressor.attack.value = 0;
compressor.release.value = 0.2;
oscillator.connect(compressor);
compressor.connect(context.destination);
oscillator.start()
context.oncomplete = event => {
const samples = event.renderedBuffer.getChannelData(0)};
context.startRendering();
let hash = 0;
for (let i = 0; i < samples.length; ++i) {
hash += Math.abs(samples[i]);
}
function setup() {
setContext();
currentTime = context.currentTime;
setOscillator();
setCompressor();
}
function setContext() {
var audioContext = window.OfflineAudioContext || window.webkitOfflineAudioContext;
context = new audioContext(1, 44100, 44100);
}
function setOscillator() {
oscillator = context.createOscillator();
oscillator.type = "triangle";
oscillator.frequency.setValueAtTime(10000, currentTime);
}
function setCompressor() {
compressor = context.createDynamicsCompressor();
setCompressorValueIfDefined('threshold', -50);
setCompressorValueIfDefined('knee', 40);
setCompressorValueIfDefined('ratio', 12);
setCompressorValueIfDefined('reduction', -20);
setCompressorValueIfDefined('attack', 0);
setCompressorValueIfDefined('release', .25);
}
function setCompressorValueIfDefined(item, value) {
if (compressor[item] !== undefined && typeof compressor[item].setValueAtTime === 'function') {
compressor[item].setValueAtTime(value, context.currentTime);
}
}
function onComplete(event) {
generateFingerprints(event);
compressor.disconnect();
}
function generateFingerprints(event) {
var output = null;
for (var i = 4500; 5e3 > i; i++) {
var channelData = event.renderedBuffer.getChannelData(0)[i];
output += Math.abs(channelData);
}
fingerprint = output.toString();
if (typeof callback === 'function') {
return callback(fingerprint);
}
}
return {
run: run
};
};
return hash;
}
const getCanvasFingerprint = () => {
// If canvas is not supported simply return a static string
if (!(0, exports.isCanvasSupported)())
return "broprint.js";
// draw a canvas of given text and return its data uri
// different browser generates different dataUri based on their hardware configs
function canvasFingerprint() {
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
// https://www.browserleaks.com/canvas#how-does-it-work
var txt = 'BroPrint.65@345876';
var txt = 'Numinous Field Communication';
ctx.textBaseline = "top";
ctx.font = "14px 'Arial'";
ctx.textBaseline = "alphabetic";
@ -123,29 +72,20 @@ const getCanvasFingerprint = () => {
ctx.fillText(txt, 2, 15);
ctx.fillStyle = "rgba(102, 204, 0, 0.7)";
ctx.fillText(txt, 4, 17);
return canvas.toDataURL();
src = canvas.toDataURL();
for (i = 0; i < src.length; i++) {
char = src.charCodeAt(i);
hash = ((hash<<5)-hash)+char;
hash = hash & hash;
}
return hash;
};
function getCurrentBrowserFingerPrint() {
const getTheAudioPrints = new Promise((resolve, reject) => {
generateTheAudioFingerPrint.run(function (fingerprint) {
resolve(fingerprint);
});
});
const DevicePrints = new Promise((resolve, reject) => {
getTheAudioPrints.then((audioChannelResult) => {
let fingerprint = window.btoa(audioChannelResult) + (0, getCanvasFingerprint)();
resolve((0, cyrb53)(fingerprint, 0));
}).catch(() => {
try {
resolve((0, cyrb53)((0, getCanvasFingerprint)()).toString());
}
catch (error) {
reject("Failed to generate the finger print of this browser");
}
});
});
return DevicePrints;
function getFingerprint() {
const audioFp = audioFingerprint();
const canvasFp = canvasFingerprint();
const hash = cyrb53(audioFp + canvasFp);
return hash;
};
console.log(getCurrentBrowserFingerPrint());
console.log(getFingerprint());