package util.browserPrediction; import java.util.ArrayList; import beans.PredictionBean; import datastructures.Fingerprint; import eu.bitwalker.useragentutils.UserAgent; import fingerprintVector.BrowserOsGuessFingerprintNumericRepresentation; import weka.classifiers.Classifier; import weka.core.Attribute; import weka.core.DenseInstance; import weka.core.Instance; import weka.core.Instances; import weka.core.SerializationHelper; /** * Class for classifying browsers without using user-agent strings. * Needs to be initialised before being run. */ public class Predictor { private static Attribute browserClassAttribute; private static Attribute osClassAttribute; private static ArrayList<Attribute> browserAttributes; private static ArrayList<Attribute> osAttributes; private static Classifier browserClassifier; private static Classifier osClassifier; private static final ArrayList<String> browserGroupsWeCareAbout; static{ browserGroupsWeCareAbout = new ArrayList<String>(); browserGroupsWeCareAbout.add("CHROME"); browserGroupsWeCareAbout.add("EDGE"); browserGroupsWeCareAbout.add("FIREFOX"); browserGroupsWeCareAbout.add("IE"); browserGroupsWeCareAbout.add("OPERA"); browserGroupsWeCareAbout.add("SAFARI"); } private static final ArrayList<String> osGroupsWeCareAbout; static{ osGroupsWeCareAbout = new ArrayList<String>(); osGroupsWeCareAbout.add("WINDOWS"); osGroupsWeCareAbout.add("IOS"); osGroupsWeCareAbout.add("LINUX"); osGroupsWeCareAbout.add("MAC_OS_X"); osGroupsWeCareAbout.add("ANDROID"); } public static void initialise(String browserModelFilePath, String osModelFilePath, String fontsPath) throws Exception{ browserAttributes = new ArrayList<Attribute>(); osAttributes = new ArrayList<Attribute>(); browserClassAttribute = new Attribute("className", browserGroupsWeCareAbout); osClassAttribute = new Attribute("className", osGroupsWeCareAbout); browserAttributes.add(browserClassAttribute); osAttributes.add(osClassAttribute); for(int i = 1; i <= 5300; ++i){ browserAttributes.add(new Attribute(Integer.toString(i))); osAttributes.add(new Attribute(Integer.toString(i))); } browserClassifier = (Classifier) SerializationHelper.read(browserModelFilePath); osClassifier = (Classifier) SerializationHelper.read(osModelFilePath); BrowserOsGuessFingerprintNumericRepresentation.initialise(fontsPath); } public static String browserClassify(double classifyMeArray[]) throws Exception{ Instance classifyMe = new DenseInstance(1.0, classifyMeArray); Instances classifyMeDataSet = new Instances("testingDataset", browserAttributes, 0); classifyMeDataSet.setClass(browserClassAttribute); classifyMe.setDataset(classifyMeDataSet); classifyMe.setClassMissing(); double prediction = browserClassifier.classifyInstance(classifyMe); return browserClassAttribute.value((int)Math.ceil(prediction)); } public static String osClassify(double classifyMeArray[]) throws Exception{ Instance classifyMe = new DenseInstance(1.0, classifyMeArray); Instances classifyMeDataSet = new Instances("testingDataset", osAttributes, 0); classifyMeDataSet.setClass(osClassAttribute); classifyMe.setDataset(classifyMeDataSet); classifyMe.setClassMissing(); double prediction = osClassifier.classifyInstance(classifyMe); return osClassAttribute.value((int)Math.ceil(prediction)); } public static PredictionBean getPredictionBean(Fingerprint fp) throws Exception{ PredictionBean predictionBean = new PredictionBean(); UserAgent ua = new UserAgent(fp.getUser_agent()); BrowserOsGuessFingerprintNumericRepresentation fnr = new BrowserOsGuessFingerprintNumericRepresentation( fp.getAllHeaders(), fp.getFontsJS_CSS(), fp.getSuperCookieLocalStorage(), fp.getSuperCookieSessionStorage(), fp.getSuperCookieUserData(), fp.getHstsEnabled(), fp.getIndexedDBEnabled(), fp.getMathTan(), fp.isUsingTor(), fp.getTbbVersion(), fp.getTouchPoints(), fp.getTouchEvent(), fp.getTouchStart()); double fingerprintArray[]; { double fingerprintArrayRaw[] = fnr.getFingerprintArray(); fingerprintArray = new double[fingerprintArrayRaw.length + 1]; fingerprintArray[0] = 0; for(int i = 0; i < fingerprintArrayRaw.length; ++i){ fingerprintArray[i + 1] = fingerprintArrayRaw[i]; } } predictionBean.setUseragentSpecifiedBrowser(ua.getBrowser().getGroup().toString()); predictionBean.setBrowserPrediction(browserClassify(fingerprintArray)); predictionBean.setUseragentSpecifiedOs(ua.getOperatingSystem().getGroup().toString()); predictionBean.setOsPrediction(osClassify(fingerprintArray)); return predictionBean; } }