From b2ad2742803bf1d790f0b7090836b230473bbc00 Mon Sep 17 00:00:00 2001 From: randogoth Date: Sun, 21 May 2023 16:38:57 +0300 Subject: [PATCH] diy --- web/nfc-theme/static/geo.js | 140 +++++++++++------------------------- 1 file changed, 40 insertions(+), 100 deletions(-) diff --git a/web/nfc-theme/static/geo.js b/web/nfc-theme/static/geo.js index 61668c6..d85bc83 100644 --- a/web/nfc-theme/static/geo.js +++ b/web/nfc-theme/static/geo.js @@ -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()); \ No newline at end of file +console.log(getFingerprint()); \ No newline at end of file