1<?php 2 3/** 4 * Created by IntelliJ IDEA. 5 * User: clay 6 * Date: 8/23/15 7 * Time: 9:49 PM 8 */ 9 10class ResponseCategory { 11 public $frequency; 12 public $confidence; 13 14 function __construct($frequency = 0, $confidence = 0.0) 15 { 16 $this->frequency = $frequency; 17 $this->confidence = $confidence; 18 } 19 20} 21 22class Response { 23 public $email; 24 public $username; 25 public $ip; 26 27 public function __construct($username = null, $email = null, $ip = null) 28 { 29 if ($username == null) { 30 $username = new ResponseCategory(); 31 } 32 if ($email == null) { 33 $email = new ResponseCategory(); 34 } 35 if ($ip == null) { 36 $ip = new ResponseCategory(); 37 } 38 39 $this->email = $email; 40 $this->username = $username; 41 $this->ip = $ip; 42 } 43 44 public function fromJson($string) 45 { 46 $response = json_decode($string, true); 47 48 if (isset($response['username'])) { 49 $this->username = $this->ResponseCategoryFromAssoc($response['username']); 50 } 51 52 if (isset($response['email'])) { 53 $this->email = $this->ResponseCategoryFromAssoc($response['email']); 54 } 55 56 if (isset($response['ip'])) { 57 $this->ip = $this->ResponseCategoryFromAssoc($response['ip']); 58 } 59 } 60 61 /** 62 * @param $assoc 63 */ 64 protected function ResponseCategoryFromAssoc($assoc) 65 { 66 $frequency = 0; 67 $confidence = 0.0; 68 69 if (isset($assoc['frequency'])) { 70 $frequency = $assoc['frequency']; 71 } 72 if (isset($assoc['confidence'])) { 73 $confidence = $assoc['confidence']; 74 } 75 return new ResponseCategory($frequency, $confidence); 76 } 77} 78 79 80class ResponseChecker 81{ 82 83 public $accepted; 84 public $confidence; 85 public $frequency; 86 public $trigger; 87 88 /// Maximum Confidence which a category may have and be considered a valid user 89 public $tolerance; 90 91 public function __construct($tolerance = 10.0) 92 { 93 $this->accepted = true; 94 $this->confidence = 0.0; 95 $this->trigger = ""; 96 97 $this->tolerance = $tolerance; 98 } 99 100 /** 101 * Check a StopForumSpam.com response, with side effects of populating the object's properties. 102 * 103 * @param $json Raw JSON input string 104 * @return bool 105 */ 106 public function userIsValid($json) 107 { 108 $response = new Response(); 109 $response->fromJson($json); 110 $result = true; 111 112 if (($result = $this->categoryIsValid($response->username)) === false) { 113 $this->trigger = "username"; 114 } else if (($result = $this->categoryIsValid($response->email)) === false) { 115 $this->trigger = "email"; 116 } else if (($result = $this->categoryIsValid($response->ip)) === false) { 117 $this->trigger = "ip"; 118 } 119 120 $this->accepted = $result; 121 122 return $result; 123 } 124 125 /** 126 * Check an individual category to see if it represents a valid user. To be a valid user the category must have 127 * occurs of 0 or confidence of less than the global tolerance. 128 * 129 * *Side Effects:* Populates $confidence if validity check fails. 130 * 131 * @param ResponseCategory $category 132 * @return bool 133 */ 134 private function categoryIsValid(ResponseCategory $category) 135 { 136 if ($category->frequency > 0 && $category->confidence > $this->tolerance) { 137 $this->confidence = $category->confidence; 138 $this->frequency = $category->frequency; 139 return false; 140 } 141 return true; 142 } 143 144 145}