railpage/railpagecore

View on GitHub
lib/Users/SockpuppetManager.php

Summary

Maintainability
B
4 hrs
Test Coverage
<?php

/**
 * Look up sockpuppets 
 * @since Version 3.10.0
 * @package Railpage
 * @author Michael Greenhill
 */

namespace Railpage\Users;

use Exception;
use DateTime;
use InvalidArgumentException;
use Railpage\Debug;
use Railpage\AppCore;
use Railpage\Url;
use Tga\SimHash\SimHash;
use Tga\SimHash\Extractor\SimpleTextExtractor;
use Tga\SimHash\Comparator\GaussianComparator;

require_once(RP_SITE_ROOT . "/vendor/tga/simhash-php/lib/Tga/SimHash/SimHash.php");
require_once(RP_SITE_ROOT . "/vendor/tga/simhash-php/lib/Tga/SimHash/Fingerprint.php");
require_once(RP_SITE_ROOT . "/vendor/tga/simhash-php/lib/Tga/SimHash/Comparator/ComparatorInterface.php");
require_once(RP_SITE_ROOT . "/vendor/tga/simhash-php/lib/Tga/SimHash/Comparator/GaussianComparator.php");
require_once(RP_SITE_ROOT . "/vendor/tga/simhash-php/lib/Tga/SimHash/Extractor/ExtractorInterface.php");
require_once(RP_SITE_ROOT . "/vendor/tga/simhash-php/lib/Tga/SimHash/Extractor/SimpleTextExtractor.php");
require_once(RP_SITE_ROOT . "/vendor/tga/simhash-php/lib/Tga/SimHash/Extractor/HtmlExtractor.php");
require_once(RP_SITE_ROOT . "/vendor/tga/simhash-php/lib/Tga/SimHash/Tokenizer/TokenizerInterface.php");
require_once(RP_SITE_ROOT . "/vendor/tga/simhash-php/lib/Tga/SimHash/Tokenizer/String128Tokenizer.php");
require_once(RP_SITE_ROOT . "/vendor/tga/simhash-php/lib/Tga/SimHash/Tokenizer/String32Tokenizer.php");
require_once(RP_SITE_ROOT . "/vendor/tga/simhash-php/lib/Tga/SimHash/Tokenizer/String64Tokenizer.php");
require_once(RP_SITE_ROOT . "/vendor/tga/simhash-php/lib/Tga/SimHash/Vectorizer/VectorizerInterface.php");
require_once(RP_SITE_ROOT . "/vendor/tga/simhash-php/lib/Tga/SimHash/Vectorizer/DefaultVectorizer.php");

class SockpuppetManager extends AppCore {
    
    /**
     * The user we're basing the comparisons on
     * @since Version 3.10.0
     * @var \Railpage\Users\User $ReferenceUser
     */
    
    private $ReferenceUser;
    
    /**
     * An array of users we want to compare against
     * @since Version 3.10.0
     * @var array $suspects
     */
    
    private $suspects = array(); 
    
    /**
     * Set the reference user
     * @since Version 3.10.0
     * @param \Railpage\Users\User $userObject
     * @return \Railpage\Users\SockpuppetManager
     */
    
    public function setReferenceUser(User $userObject) {
        
        $this->ReferenceUser = $userObject;
        
        return $this;
        
    }
    
    /**
     * Add a suspect to our lookup array
     * @since Version 3.10.0
     * @param \Railpage\Users\User $userObject
     * @return \Railpage\Users\SockpuppetManager
     */
    
    public function addSuspect(User $userObject) {
        
        $this->suspects[$userObject->id] = $userObject; 
        
        return $this;
        
    }
    
    /**
     * GoCompare!
     * @since Version 3.10.0
     * @return \Railpage\Users\SockpuppetManager
     */
    
    public function compare() {
        
        /**
         * Load our reference data first
         */
        
        $ref = array(
            "ips" => json_encode($this->ReferenceUser->getIPs(new DateTime("6 months ago")))
        );
        
        /**
         * Start our SimHash stuff
         */
        
        $SimHash = new SimHash;
        $Extractor = new SimpleTextExtractor; 
        $Comparator = new GaussianComparator(3); 
        
        foreach ($ref as $key => $lookup) {
            $this->hashes[$key]['reference'] = $SimHash->hash($Extractor->extract($lookup), SimHash::SIMHASH_64);
        }
        
        foreach ($this->suspects as $Suspect) {
            
            $suspectData = array(
                "ips" => json_encode($Suspect->getIPs(new DateTime("6 months ago")))
            );
        
            foreach ($suspectData as $key => $lookup) {
                $this->hashes[$key]['suspect'] = $SimHash->hash($Extractor->extract($lookup), SimHash::SIMHASH_64);
            }
            
            foreach ($this->hashes as $key => $users) {
                $this->results[$Suspect->id][$key] = $Comparator->compare($users['reference'], $users['suspect']);
            }
            
        }
        
    }
    
    /**
     * Get the results of this scan
     * @since Version 3.10.0
     * @return array
     */
    
    public function getResults() {
        
        printArray($this->results);
        
    }
    
}