| @@ -39,6 +39,10 @@ discard block | ||
| 39 | 39 | // $key: The cache key. | 
| 40 | 40 | // Returns: | 
| 41 | 41 | // The object which was previously stored, or false if a cache miss occurred. | 
| 42 | + | |
| 43 | + /** | |
| 44 | + * @param string $key | |
| 45 | + */ | |
| 42 | 46 |  	public function get($key) { | 
| 43 | 47 | //return false; | 
| 44 | 48 | if (($this->cleanInterval == 1) || | 
| @@ -59,6 +63,10 @@ discard block | ||
| 59 | 63 | // Parameters: | 
| 60 | 64 | // $key: The cache key. | 
| 61 | 65 | // $value: The object to store. | 
| 66 | + | |
| 67 | + /** | |
| 68 | + * @param string $key | |
| 69 | + */ | |
| 62 | 70 |  	public function set($key, $value) { | 
| 63 | 71 | if (($this->cleanInterval == 1) || | 
| 64 | 72 |  			(rand(1, $this->cleanInterval) == $this->cleanInterval)) { | 
| @@ -30,7 +30,7 @@ discard block | ||
| 30 | 30 | if ($cleanInterval < 1) $cleanInterval = 1; | 
| 31 | 31 | $this->cleanInterval = (int)$cleanInterval; | 
| 32 | 32 | |
| 33 | - if ($directoryDepth<1) $directoryDepth=1; else if ($directoryDepth>10) $directoryDepth=10; | |
| 33 | + if ($directoryDepth < 1) $directoryDepth = 1; else if ($directoryDepth > 10) $directoryDepth = 10; | |
| 34 | 34 | $this->directoryDepth = (int)$directoryDepth; | 
| 35 | 35 | } | 
| 36 | 36 | |
| @@ -41,8 +41,8 @@ discard block | ||
| 41 | 41 | // The object which was previously stored, or false if a cache miss occurred. | 
| 42 | 42 |  	public function get($key) { | 
| 43 | 43 | //return false; | 
| 44 | - if (($this->cleanInterval == 1) || | |
| 45 | -			(rand(1, $this->cleanInterval) == $this->cleanInterval)) { | |
| 44 | + if (($this->cleanInterval==1) || | |
| 45 | +			(rand(1, $this->cleanInterval)==$this->cleanInterval)) { | |
| 46 | 46 | $this->clean(); | 
| 47 | 47 | } | 
| 48 | 48 | $val = false; | 
| @@ -60,12 +60,12 @@ discard block | ||
| 60 | 60 | // $key: The cache key. | 
| 61 | 61 | // $value: The object to store. | 
| 62 | 62 |  	public function set($key, $value) { | 
| 63 | - if (($this->cleanInterval == 1) || | |
| 64 | -			(rand(1, $this->cleanInterval) == $this->cleanInterval)) { | |
| 63 | + if (($this->cleanInterval==1) || | |
| 64 | +			(rand(1, $this->cleanInterval)==$this->cleanInterval)) { | |
| 65 | 65 | $this->clean(); | 
| 66 | 66 | } | 
| 67 | 67 | $fn = $this->getCacheFilename($key, true); | 
| 68 | - $fileData = file_put_contents($fn,serialize($value)); | |
| 68 | + $fileData = file_put_contents($fn, serialize($value)); | |
| 69 | 69 | } | 
| 70 | 70 | |
| 71 | 71 | // Delete an object from the cache. | 
| @@ -97,11 +97,11 @@ discard block | ||
| 97 | 97 |  		foreach (@glob($path.'/*', GLOB_NOSORT) as $fn) { | 
| 98 | 98 |  			if (@is_dir($fn)) { | 
| 99 | 99 | $this->cleanPath($fn); | 
| 100 | -			} else if (@filemtime($fn) <= $exptime) { | |
| 100 | +			}else if (@filemtime($fn) <= $exptime) { | |
| 101 | 101 | @unlink($fn); | 
| 102 | 102 | } | 
| 103 | 103 | } | 
| 104 | -		if ($path != $this->path) { | |
| 104 | +		if ($path!=$this->path) { | |
| 105 | 105 | @rmdir($path); | 
| 106 | 106 | } | 
| 107 | 107 | } | 
| @@ -118,7 +118,7 @@ discard block | ||
| 118 | 118 | } | 
| 119 | 119 | |
| 120 | 120 |  	public function fixPermissions($user) { | 
| 121 | -		$cmd = escapeshellcmd('chown -R '.$user.':'.$user. ' ' . $this->path); | |
| 121 | +		$cmd = escapeshellcmd('chown -R '.$user.':'.$user.' '.$this->path); | |
| 122 | 122 | exec($cmd); | 
| 123 | 123 | } | 
| 124 | 124 | |
| @@ -24,13 +24,21 @@ discard block | ||
| 24 | 24 | |
| 25 | 25 | $this->path = '/tmp/_FileCache_/'.(string)$path; | 
| 26 | 26 | |
| 27 | - if ($expirationTimeInSeconds < 1) $expirationTimeInSeconds = 1; | |
| 27 | +		if ($expirationTimeInSeconds < 1) { | |
| 28 | + $expirationTimeInSeconds = 1; | |
| 29 | + } | |
| 28 | 30 | $this->expirationTimeInSeconds = (int)$expirationTimeInSeconds; | 
| 29 | 31 | |
| 30 | - if ($cleanInterval < 1) $cleanInterval = 1; | |
| 32 | +		if ($cleanInterval < 1) { | |
| 33 | + $cleanInterval = 1; | |
| 34 | + } | |
| 31 | 35 | $this->cleanInterval = (int)$cleanInterval; | 
| 32 | 36 | |
| 33 | - if ($directoryDepth<1) $directoryDepth=1; else if ($directoryDepth>10) $directoryDepth=10; | |
| 37 | +		if ($directoryDepth<1) { | |
| 38 | + $directoryDepth=1; | |
| 39 | +		} else if ($directoryDepth>10) { | |
| 40 | + $directoryDepth=10; | |
| 41 | + } | |
| 34 | 42 | $this->directoryDepth = (int)$directoryDepth; | 
| 35 | 43 | } | 
| 36 | 44 | |
| @@ -80,7 +88,9 @@ discard block | ||
| 80 | 88 | $refPath = rtrim($this->path, "/\\"); | 
| 81 | 89 | $dir = rtrim(dirname($fn), "/\\"); | 
| 82 | 90 |  			for ($i = 0; $i < $this->directoryDepth; $i++) { | 
| 83 | - if (!@rmdir($dir)) break; | |
| 91 | +				if (!@rmdir($dir)) { | |
| 92 | + break; | |
| 93 | + } | |
| 84 | 94 | $dir = rtrim(dirname($dir), "/\\"); | 
| 85 | 95 | } | 
| 86 | 96 | } | 
| @@ -112,7 +122,9 @@ discard block | ||
| 112 | 122 |  		for ($i = 0, $idx = 0; $i < $this->directoryDepth; $i++, $idx += 2) { | 
| 113 | 123 | $path .= '/'.substr($hash, $idx, 2); | 
| 114 | 124 | } | 
| 115 | - if ($autoCreateDirectory) @mkdir($path, 0777, true); | |
| 125 | +		if ($autoCreateDirectory) { | |
| 126 | + @mkdir($path, 0777, true); | |
| 127 | + } | |
| 116 | 128 | $path .= '/'.$hash; | 
| 117 | 129 | return $path; | 
| 118 | 130 | } | 
| @@ -929,7 +929,7 @@ | ||
| 929 | 929 | * Send raw data to the server. | 
| 930 | 930 | * @param string $data The data to send | 
| 931 | 931 | * @access public | 
| 932 | - * @return integer|boolean The number of bytes sent to the server or false on error | |
| 932 | + * @return integer The number of bytes sent to the server or false on error | |
| 933 | 933 | */ | 
| 934 | 934 | public function client_send($data) | 
| 935 | 935 |      {
 | 
| @@ -227,7 +227,7 @@ discard block | ||
| 227 | 227 | default: | 
| 228 | 228 | //Normalize line breaks | 
| 229 | 229 |                  $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
 | 
| 230 | -                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
 | |
| 230 | +                echo gmdate('Y-m-d H:i:s')."\t".str_replace(
 | |
| 231 | 231 | "\n", | 
| 232 | 232 | "\n \t ", | 
| 233 | 233 | trim($str) | 
| @@ -274,14 +274,14 @@ discard block | ||
| 274 | 274 | $socket_context = stream_context_create($options); | 
| 275 | 275 | //Suppress errors; connection failures are handled at a higher level | 
| 276 | 276 | $this->smtp_conn = @stream_socket_client( | 
| 277 | - $host . ":" . $port, | |
| 277 | + $host.":".$port, | |
| 278 | 278 | $errno, | 
| 279 | 279 | $errstr, | 
| 280 | 280 | $timeout, | 
| 281 | 281 | STREAM_CLIENT_CONNECT, | 
| 282 | 282 | $socket_context | 
| 283 | 283 | ); | 
| 284 | -        } else {
 | |
| 284 | +        }else {
 | |
| 285 | 285 | //Fall back to fsockopen which should work in more places, but is missing some features | 
| 286 | 286 | $this->edebug( | 
| 287 | 287 | "Connection: stream_socket_client not available, falling back to fsockopen", | 
| @@ -303,7 +303,7 @@ discard block | ||
| 303 | 303 | $errstr | 
| 304 | 304 | ); | 
| 305 | 305 | $this->edebug( | 
| 306 | - 'SMTP ERROR: ' . $this->error['error'] | |
| 306 | + 'SMTP ERROR: '.$this->error['error'] | |
| 307 | 307 | . ": $errstr ($errno)", | 
| 308 | 308 | self::DEBUG_CLIENT | 
| 309 | 309 | ); | 
| @@ -312,17 +312,17 @@ discard block | ||
| 312 | 312 |          $this->edebug('Connection: opened', self::DEBUG_CONNECTION);
 | 
| 313 | 313 | // SMTP server can take longer to respond, give longer timeout for first read | 
| 314 | 314 | // Windows does not have support for this timeout function | 
| 315 | -        if (substr(PHP_OS, 0, 3) != 'WIN') {
 | |
| 315 | +        if (substr(PHP_OS, 0, 3)!='WIN') {
 | |
| 316 | 316 |              $max = ini_get('max_execution_time');
 | 
| 317 | 317 | // Don't bother if unlimited | 
| 318 | -            if ($max != 0 && $timeout > $max) {
 | |
| 318 | +            if ($max!=0 && $timeout > $max) {
 | |
| 319 | 319 | @set_time_limit($timeout); | 
| 320 | 320 | } | 
| 321 | 321 | stream_set_timeout($this->smtp_conn, $timeout, 0); | 
| 322 | 322 | } | 
| 323 | 323 | // Get any announcement | 
| 324 | 324 | $announce = $this->get_lines(); | 
| 325 | -        $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);
 | |
| 325 | +        $this->edebug('SERVER -> CLIENT: '.$announce, self::DEBUG_SERVER);
 | |
| 326 | 326 | return true; | 
| 327 | 327 | } | 
| 328 | 328 | |
| @@ -381,9 +381,9 @@ discard block | ||
| 381 | 381 | return false; | 
| 382 | 382 | } | 
| 383 | 383 | |
| 384 | -            self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);
 | |
| 384 | +            self::edebug('Auth method requested: '.($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);
 | |
| 385 | 385 | self::edebug( | 
| 386 | -                'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),
 | |
| 386 | +                'Auth methods available on the server: '.implode(',', $this->server_caps['AUTH']),
 | |
| 387 | 387 | self::DEBUG_LOWLEVEL | 
| 388 | 388 | ); | 
| 389 | 389 | |
| @@ -417,7 +417,7 @@ discard block | ||
| 417 | 417 | // Send encoded username and password | 
| 418 | 418 | if (!$this->sendCommand( | 
| 419 | 419 | 'User & Password', | 
| 420 | -                    base64_encode("\0" . $username . "\0" . $password),
 | |
| 420 | +                    base64_encode("\0".$username."\0".$password),
 | |
| 421 | 421 | 235 | 
| 422 | 422 | ) | 
| 423 | 423 |                  ) {
 | 
| @@ -463,7 +463,7 @@ discard block | ||
| 463 | 463 | |
| 464 | 464 | if (!$this->sendCommand( | 
| 465 | 465 | 'AUTH NTLM', | 
| 466 | - 'AUTH NTLM ' . base64_encode($msg1), | |
| 466 | + 'AUTH NTLM '.base64_encode($msg1), | |
| 467 | 467 | 334 | 
| 468 | 468 | ) | 
| 469 | 469 |                  ) {
 | 
| @@ -495,7 +495,7 @@ discard block | ||
| 495 | 495 | $challenge = base64_decode(substr($this->last_reply, 4)); | 
| 496 | 496 | |
| 497 | 497 | // Build the response | 
| 498 | - $response = $username . ' ' . $this->hmac($challenge, $password); | |
| 498 | + $response = $username.' '.$this->hmac($challenge, $password); | |
| 499 | 499 | |
| 500 | 500 | // send encoded credentials | 
| 501 | 501 |                  return $this->sendCommand('Username', base64_encode($response), 235);
 | 
| @@ -539,7 +539,7 @@ discard block | ||
| 539 | 539 | $k_ipad = $key ^ $ipad; | 
| 540 | 540 | $k_opad = $key ^ $opad; | 
| 541 | 541 | |
| 542 | -        return md5($k_opad . pack('H*', md5($k_ipad . $data)));
 | |
| 542 | +        return md5($k_opad.pack('H*', md5($k_ipad.$data)));
 | |
| 543 | 543 | } | 
| 544 | 544 | |
| 545 | 545 | /** | 
| @@ -622,13 +622,13 @@ discard block | ||
| 622 | 622 | |
| 623 | 623 | $field = substr($lines[0], 0, strpos($lines[0], ':')); | 
| 624 | 624 | $in_headers = false; | 
| 625 | -        if (!empty($field) && strpos($field, ' ') === false) {
 | |
| 625 | +        if (!empty($field) && strpos($field, ' ')===false) {
 | |
| 626 | 626 | $in_headers = true; | 
| 627 | 627 | } | 
| 628 | 628 | |
| 629 | 629 |          foreach ($lines as $line) {
 | 
| 630 | 630 | $lines_out = array(); | 
| 631 | -            if ($in_headers and $line == '') {
 | |
| 631 | +            if ($in_headers and $line=='') {
 | |
| 632 | 632 | $in_headers = false; | 
| 633 | 633 | } | 
| 634 | 634 | //Break this line up into several smaller lines if it's too long | 
| @@ -640,18 +640,18 @@ discard block | ||
| 640 | 640 | //Deliberately matches both false and 0 | 
| 641 | 641 |                  if (!$pos) {
 | 
| 642 | 642 | //No nice break found, add a hard break | 
| 643 | - $pos = self::MAX_LINE_LENGTH - 1; | |
| 643 | + $pos = self::MAX_LINE_LENGTH-1; | |
| 644 | 644 | $lines_out[] = substr($line, 0, $pos); | 
| 645 | 645 | $line = substr($line, $pos); | 
| 646 | -                } else {
 | |
| 646 | +                }else {
 | |
| 647 | 647 | //Break at the found point | 
| 648 | 648 | $lines_out[] = substr($line, 0, $pos); | 
| 649 | 649 | //Move along by the amount we dealt with | 
| 650 | - $line = substr($line, $pos + 1); | |
| 650 | + $line = substr($line, $pos+1); | |
| 651 | 651 | } | 
| 652 | 652 | //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1 | 
| 653 | 653 |                  if ($in_headers) {
 | 
| 654 | - $line = "\t" . $line; | |
| 654 | + $line = "\t".$line; | |
| 655 | 655 | } | 
| 656 | 656 | } | 
| 657 | 657 | $lines_out[] = $line; | 
| @@ -659,17 +659,17 @@ discard block | ||
| 659 | 659 | //Send the lines to the server | 
| 660 | 660 |              foreach ($lines_out as $line_out) {
 | 
| 661 | 661 | //RFC2821 section 4.5.2 | 
| 662 | -                if (!empty($line_out) and $line_out[0] == '.') {
 | |
| 663 | - $line_out = '.' . $line_out; | |
| 662 | +                if (!empty($line_out) and $line_out[0]=='.') {
 | |
| 663 | + $line_out = '.'.$line_out; | |
| 664 | 664 | } | 
| 665 | - $this->client_send($line_out . self::CRLF); | |
| 665 | + $this->client_send($line_out.self::CRLF); | |
| 666 | 666 | } | 
| 667 | 667 | } | 
| 668 | 668 | |
| 669 | 669 | //Message data has been sent, complete the command | 
| 670 | 670 | //Increase timelimit for end of DATA command | 
| 671 | 671 | $savetimelimit = $this->Timelimit; | 
| 672 | - $this->Timelimit = $this->Timelimit * 2; | |
| 672 | + $this->Timelimit = $this->Timelimit*2; | |
| 673 | 673 |          $result = $this->sendCommand('DATA END', '.', 250);
 | 
| 674 | 674 | //Restore timelimit | 
| 675 | 675 | $this->Timelimit = $savetimelimit; | 
| @@ -703,11 +703,11 @@ discard block | ||
| 703 | 703 | */ | 
| 704 | 704 | protected function sendHello($hello, $host) | 
| 705 | 705 |      {
 | 
| 706 | - $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250); | |
| 706 | + $noerror = $this->sendCommand($hello, $hello.' '.$host, 250); | |
| 707 | 707 | $this->helo_rply = $this->last_reply; | 
| 708 | 708 |          if ($noerror) {
 | 
| 709 | 709 | $this->parseHelloFields($hello); | 
| 710 | -        } else {
 | |
| 710 | +        }else {
 | |
| 711 | 711 | $this->server_caps = null; | 
| 712 | 712 | } | 
| 713 | 713 | return $noerror; | 
| @@ -733,9 +733,9 @@ discard block | ||
| 733 | 733 |                  if (!$n) {
 | 
| 734 | 734 | $name = $type; | 
| 735 | 735 | $fields = $fields[0]; | 
| 736 | -                } else {
 | |
| 736 | +                }else {
 | |
| 737 | 737 | $name = array_shift($fields); | 
| 738 | -                    if ($name == 'SIZE') {
 | |
| 738 | +                    if ($name=='SIZE') {
 | |
| 739 | 739 | $fields = ($fields) ? $fields[0] : 0; | 
| 740 | 740 | } | 
| 741 | 741 | } | 
| @@ -760,7 +760,7 @@ discard block | ||
| 760 | 760 | $useVerp = ($this->do_verp ? ' XVERP' : ''); | 
| 761 | 761 | return $this->sendCommand( | 
| 762 | 762 | 'MAIL FROM', | 
| 763 | - 'MAIL FROM:<' . $from . '>' . $useVerp, | |
| 763 | + 'MAIL FROM:<'.$from.'>'.$useVerp, | |
| 764 | 764 | 250 | 
| 765 | 765 | ); | 
| 766 | 766 | } | 
| @@ -797,7 +797,7 @@ discard block | ||
| 797 | 797 |      {
 | 
| 798 | 798 | return $this->sendCommand( | 
| 799 | 799 | 'RCPT TO', | 
| 800 | - 'RCPT TO:<' . $toaddr . '>', | |
| 800 | + 'RCPT TO:<'.$toaddr.'>', | |
| 801 | 801 | array(250, 251) | 
| 802 | 802 | ); | 
| 803 | 803 | } | 
| @@ -828,7 +828,7 @@ discard block | ||
| 828 | 828 |              $this->setError("Called $command without being connected");
 | 
| 829 | 829 | return false; | 
| 830 | 830 | } | 
| 831 | - $this->client_send($commandstring . self::CRLF); | |
| 831 | + $this->client_send($commandstring.self::CRLF); | |
| 832 | 832 | |
| 833 | 833 | $this->last_reply = $this->get_lines(); | 
| 834 | 834 | // Fetch SMTP code and possible error code explanation | 
| @@ -842,14 +842,14 @@ discard block | ||
| 842 | 842 | '', | 
| 843 | 843 | $this->last_reply | 
| 844 | 844 | ); | 
| 845 | -        } else {
 | |
| 845 | +        }else {
 | |
| 846 | 846 | // Fall back to simple parsing if regex fails | 
| 847 | 847 | $code = substr($this->last_reply, 0, 3); | 
| 848 | 848 | $code_ex = null; | 
| 849 | 849 | $detail = substr($this->last_reply, 4); | 
| 850 | 850 | } | 
| 851 | 851 | |
| 852 | -        $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);
 | |
| 852 | +        $this->edebug('SERVER -> CLIENT: '.$this->last_reply, self::DEBUG_SERVER);
 | |
| 853 | 853 | |
| 854 | 854 |          if (!in_array($code, (array)$expect)) {
 | 
| 855 | 855 | $this->setError( | 
| @@ -859,7 +859,7 @@ discard block | ||
| 859 | 859 | $code_ex | 
| 860 | 860 | ); | 
| 861 | 861 | $this->edebug( | 
| 862 | - 'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply, | |
| 862 | + 'SMTP ERROR: '.$this->error['error'].': '.$this->last_reply, | |
| 863 | 863 | self::DEBUG_CLIENT | 
| 864 | 864 | ); | 
| 865 | 865 | return false; | 
| @@ -921,7 +921,7 @@ discard block | ||
| 921 | 921 | public function turn() | 
| 922 | 922 |      {
 | 
| 923 | 923 |          $this->setError('The SMTP TURN command is not implemented');
 | 
| 924 | -        $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);
 | |
| 924 | +        $this->edebug('SMTP NOTICE: '.$this->error['error'], self::DEBUG_CLIENT);
 | |
| 925 | 925 | return false; | 
| 926 | 926 | } | 
| 927 | 927 | |
| @@ -985,10 +985,10 @@ discard block | ||
| 985 | 985 | |
| 986 | 986 | // the tight logic knot ;) | 
| 987 | 987 |          if (!array_key_exists($name, $this->server_caps)) {
 | 
| 988 | -            if ($name == 'HELO') {
 | |
| 988 | +            if ($name=='HELO') {
 | |
| 989 | 989 | return $this->server_caps['EHLO']; | 
| 990 | 990 | } | 
| 991 | -            if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) {
 | |
| 991 | +            if ($name=='EHLO' || array_key_exists('EHLO', $this->server_caps)) {
 | |
| 992 | 992 | return false; | 
| 993 | 993 | } | 
| 994 | 994 |              $this->setError('HELO handshake was used. Client knows nothing about server extensions');
 | 
| @@ -1027,7 +1027,7 @@ discard block | ||
| 1027 | 1027 | $endtime = 0; | 
| 1028 | 1028 | stream_set_timeout($this->smtp_conn, $this->Timeout); | 
| 1029 | 1029 |          if ($this->Timelimit > 0) {
 | 
| 1030 | - $endtime = time() + $this->Timelimit; | |
| 1030 | + $endtime = time()+$this->Timelimit; | |
| 1031 | 1031 | } | 
| 1032 | 1032 |          while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
 | 
| 1033 | 1033 | $str = @fgets($this->smtp_conn, 515); | 
| @@ -1036,14 +1036,14 @@ discard block | ||
| 1036 | 1036 | $data .= $str; | 
| 1037 | 1037 |              $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL);
 | 
| 1038 | 1038 | // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen | 
| 1039 | -            if ((isset($str[3]) and $str[3] == ' ')) {
 | |
| 1039 | +            if ((isset($str[3]) and $str[3]==' ')) {
 | |
| 1040 | 1040 | break; | 
| 1041 | 1041 | } | 
| 1042 | 1042 | // Timed-out? Log and break | 
| 1043 | 1043 | $info = stream_get_meta_data($this->smtp_conn); | 
| 1044 | 1044 |              if ($info['timed_out']) {
 | 
| 1045 | 1045 | $this->edebug( | 
| 1046 | -                    'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)',
 | |
| 1046 | +                    'SMTP -> get_lines(): timed-out ('.$this->Timeout.' sec)',
 | |
| 1047 | 1047 | self::DEBUG_LOWLEVEL | 
| 1048 | 1048 | ); | 
| 1049 | 1049 | break; | 
| @@ -1052,7 +1052,7 @@ discard block | ||
| 1052 | 1052 |              if ($endtime and time() > $endtime) {
 | 
| 1053 | 1053 | $this->edebug( | 
| 1054 | 1054 |                      'SMTP -> get_lines(): timelimit reached ('.
 | 
| 1055 | - $this->Timelimit . ' sec)', | |
| 1055 | + $this->Timelimit.' sec)', | |
| 1056 | 1056 | self::DEBUG_LOWLEVEL | 
| 1057 | 1057 | ); | 
| 1058 | 1058 | break; | 
| @@ -26,418 +26,418 @@ discard block | ||
| 26 | 26 | */ | 
| 27 | 27 | class SMTP | 
| 28 | 28 |  {
 | 
| 29 | - /** | |
| 30 | - * The PHPMailer SMTP version number. | |
| 31 | - * @type string | |
| 32 | - */ | |
| 33 | - const VERSION = '5.2.10'; | |
| 34 | - | |
| 35 | - /** | |
| 36 | - * SMTP line break constant. | |
| 37 | - * @type string | |
| 38 | - */ | |
| 39 | - const CRLF = "\r\n"; | |
| 40 | - | |
| 41 | - /** | |
| 42 | - * The SMTP port to use if one is not specified. | |
| 43 | - * @type integer | |
| 44 | - */ | |
| 45 | - const DEFAULT_SMTP_PORT = 25; | |
| 46 | - | |
| 47 | - /** | |
| 48 | - * The maximum line length allowed by RFC 2822 section 2.1.1 | |
| 49 | - * @type integer | |
| 50 | - */ | |
| 51 | - const MAX_LINE_LENGTH = 998; | |
| 52 | - | |
| 53 | - /** | |
| 54 | - * Debug level for no output | |
| 55 | - */ | |
| 56 | - const DEBUG_OFF = 0; | |
| 57 | - | |
| 58 | - /** | |
| 59 | - * Debug level to show client -> server messages | |
| 60 | - */ | |
| 61 | - const DEBUG_CLIENT = 1; | |
| 62 | - | |
| 63 | - /** | |
| 64 | - * Debug level to show client -> server and server -> client messages | |
| 65 | - */ | |
| 66 | - const DEBUG_SERVER = 2; | |
| 67 | - | |
| 68 | - /** | |
| 69 | - * Debug level to show connection status, client -> server and server -> client messages | |
| 70 | - */ | |
| 71 | - const DEBUG_CONNECTION = 3; | |
| 72 | - | |
| 73 | - /** | |
| 74 | - * Debug level to show all messages | |
| 75 | - */ | |
| 76 | - const DEBUG_LOWLEVEL = 4; | |
| 77 | - | |
| 78 | - /** | |
| 79 | - * The PHPMailer SMTP Version number. | |
| 80 | - * @type string | |
| 81 | - * @deprecated Use the `VERSION` constant instead | |
| 82 | - * @see SMTP::VERSION | |
| 83 | - */ | |
| 84 | - public $Version = '5.2.10'; | |
| 85 | - | |
| 86 | - /** | |
| 87 | - * SMTP server port number. | |
| 88 | - * @type integer | |
| 89 | - * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead | |
| 90 | - * @see SMTP::DEFAULT_SMTP_PORT | |
| 91 | - */ | |
| 92 | - public $SMTP_PORT = 25; | |
| 93 | - | |
| 94 | - /** | |
| 95 | - * SMTP reply line ending. | |
| 96 | - * @type string | |
| 97 | - * @deprecated Use the `CRLF` constant instead | |
| 98 | - * @see SMTP::CRLF | |
| 99 | - */ | |
| 100 | - public $CRLF = "\r\n"; | |
| 101 | - | |
| 102 | - /** | |
| 103 | - * Debug output level. | |
| 104 | - * Options: | |
| 105 | - * * self::DEBUG_OFF (`0`) No debug output, default | |
| 106 | - * * self::DEBUG_CLIENT (`1`) Client commands | |
| 107 | - * * self::DEBUG_SERVER (`2`) Client commands and server responses | |
| 108 | - * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status | |
| 109 | - * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages | |
| 110 | - * @type integer | |
| 111 | - */ | |
| 112 | - public $do_debug = self::DEBUG_OFF; | |
| 113 | - | |
| 114 | - /** | |
| 115 | - * How to handle debug output. | |
| 116 | - * Options: | |
| 117 | - * * `echo` Output plain-text as-is, appropriate for CLI | |
| 118 | - * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output | |
| 119 | - * * `error_log` Output to error log as configured in php.ini | |
| 120 | - * | |
| 121 | - * Alternatively, you can provide a callable expecting two params: a message string and the debug level: | |
| 122 | - * <code> | |
| 123 | -     * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
 | |
| 124 | - * </code> | |
| 125 | - * @type string|callable | |
| 126 | - */ | |
| 127 | - public $Debugoutput = 'echo'; | |
| 128 | - | |
| 129 | - /** | |
| 130 | - * Whether to use VERP. | |
| 131 | - * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path | |
| 132 | - * @link http://www.postfix.org/VERP_README.html Info on VERP | |
| 133 | - * @type boolean | |
| 134 | - */ | |
| 135 | - public $do_verp = false; | |
| 136 | - | |
| 137 | - /** | |
| 138 | - * The timeout value for connection, in seconds. | |
| 139 | - * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 | |
| 140 | - * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure. | |
| 141 | - * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2 | |
| 142 | - * @type integer | |
| 143 | - */ | |
| 144 | - public $Timeout = 300; | |
| 145 | - | |
| 146 | - /** | |
| 147 | - * How long to wait for commands to complete, in seconds. | |
| 148 | - * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 | |
| 149 | - * @type integer | |
| 150 | - */ | |
| 151 | - public $Timelimit = 300; | |
| 152 | - | |
| 153 | - /** | |
| 154 | - * The socket for the server connection. | |
| 155 | - * @type resource | |
| 156 | - */ | |
| 157 | - protected $smtp_conn; | |
| 158 | - | |
| 159 | - /** | |
| 160 | - * Error information, if any, for the last SMTP command. | |
| 161 | - * @type array | |
| 162 | - */ | |
| 163 | - protected $error = array( | |
| 164 | - 'error' => '', | |
| 165 | - 'detail' => '', | |
| 166 | - 'smtp_code' => '', | |
| 167 | - 'smtp_code_ex' => '' | |
| 168 | - ); | |
| 169 | - | |
| 170 | - /** | |
| 171 | - * The reply the server sent to us for HELO. | |
| 172 | - * If null, no HELO string has yet been received. | |
| 173 | - * @type string|null | |
| 174 | - */ | |
| 175 | - protected $helo_rply = null; | |
| 176 | - | |
| 177 | - /** | |
| 178 | - * The set of SMTP extensions sent in reply to EHLO command. | |
| 179 | - * Indexes of the array are extension names. | |
| 180 | - * Value at index 'HELO' or 'EHLO' (according to command that was sent) | |
| 181 | - * represents the server name. In case of HELO it is the only element of the array. | |
| 182 | - * Other values can be boolean TRUE or an array containing extension options. | |
| 183 | - * If null, no HELO/EHLO string has yet been received. | |
| 184 | - * @type array|null | |
| 185 | - */ | |
| 186 | - protected $server_caps = null; | |
| 187 | - | |
| 188 | - /** | |
| 189 | - * The most recent reply received from the server. | |
| 190 | - * @type string | |
| 191 | - */ | |
| 192 | - protected $last_reply = ''; | |
| 193 | - | |
| 194 | - /** | |
| 195 | - * Output debugging info via a user-selected method. | |
| 196 | - * @see SMTP::$Debugoutput | |
| 197 | - * @see SMTP::$do_debug | |
| 198 | - * @param string $str Debug string to output | |
| 199 | - * @param integer $level The debug level of this message; see DEBUG_* constants | |
| 200 | - * @return void | |
| 201 | - */ | |
| 202 | - protected function edebug($str, $level = 0) | |
| 203 | -    {
 | |
| 204 | -        if ($level > $this->do_debug) {
 | |
| 205 | - return; | |
| 206 | - } | |
| 207 | - //Avoid clash with built-in function names | |
| 208 | -        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
 | |
| 209 | - call_user_func($this->Debugoutput, $str, $this->do_debug); | |
| 210 | - return; | |
| 211 | - } | |
| 212 | -        switch ($this->Debugoutput) {
 | |
| 213 | - case 'error_log': | |
| 214 | - //Don't output, just log | |
| 215 | - error_log($str); | |
| 216 | - break; | |
| 217 | - case 'html': | |
| 218 | - //Cleans up output a bit for a better looking, HTML-safe output | |
| 219 | - echo htmlentities( | |
| 220 | -                    preg_replace('/[\r\n]+/', '', $str),
 | |
| 221 | - ENT_QUOTES, | |
| 222 | - 'UTF-8' | |
| 223 | - ) | |
| 224 | - . "<br>\n"; | |
| 225 | - break; | |
| 226 | - case 'echo': | |
| 227 | - default: | |
| 228 | - //Normalize line breaks | |
| 229 | -                $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
 | |
| 230 | -                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
 | |
| 231 | - "\n", | |
| 232 | - "\n \t ", | |
| 233 | - trim($str) | |
| 234 | - )."\n"; | |
| 235 | - } | |
| 236 | - } | |
| 237 | - | |
| 238 | - /** | |
| 239 | - * Connect to an SMTP server. | |
| 240 | - * @param string $host SMTP server IP or host name | |
| 241 | - * @param integer $port The port number to connect to | |
| 242 | - * @param integer $timeout How long to wait for the connection to open | |
| 243 | - * @param array $options An array of options for stream_context_create() | |
| 244 | - * @access public | |
| 245 | - * @return boolean | |
| 246 | - */ | |
| 247 | - public function connect($host, $port = null, $timeout = 30, $options = array()) | |
| 248 | -    {
 | |
| 249 | - static $streamok; | |
| 250 | - //This is enabled by default since 5.0.0 but some providers disable it | |
| 251 | - //Check this once and cache the result | |
| 252 | -        if (is_null($streamok)) {
 | |
| 253 | -            $streamok = function_exists('stream_socket_client');
 | |
| 254 | - } | |
| 255 | - // Clear errors to avoid confusion | |
| 256 | -        $this->setError('');
 | |
| 257 | - // Make sure we are __not__ connected | |
| 258 | -        if ($this->connected()) {
 | |
| 259 | - // Already connected, generate error | |
| 260 | -            $this->setError('Already connected to a server');
 | |
| 261 | - return false; | |
| 262 | - } | |
| 263 | -        if (empty($port)) {
 | |
| 264 | - $port = self::DEFAULT_SMTP_PORT; | |
| 265 | - } | |
| 266 | - // Connect to the SMTP server | |
| 267 | - $this->edebug( | |
| 268 | - "Connection: opening to $host:$port, timeout=$timeout, options=".var_export($options, true), | |
| 269 | - self::DEBUG_CONNECTION | |
| 270 | - ); | |
| 271 | - $errno = 0; | |
| 272 | - $errstr = ''; | |
| 273 | -        if ($streamok) {
 | |
| 274 | - $socket_context = stream_context_create($options); | |
| 275 | - //Suppress errors; connection failures are handled at a higher level | |
| 276 | - $this->smtp_conn = @stream_socket_client( | |
| 277 | - $host . ":" . $port, | |
| 278 | - $errno, | |
| 279 | - $errstr, | |
| 280 | - $timeout, | |
| 281 | - STREAM_CLIENT_CONNECT, | |
| 282 | - $socket_context | |
| 283 | - ); | |
| 284 | -        } else {
 | |
| 285 | - //Fall back to fsockopen which should work in more places, but is missing some features | |
| 286 | - $this->edebug( | |
| 287 | - "Connection: stream_socket_client not available, falling back to fsockopen", | |
| 288 | - self::DEBUG_CONNECTION | |
| 289 | - ); | |
| 290 | - $this->smtp_conn = fsockopen( | |
| 291 | - $host, | |
| 292 | - $port, | |
| 293 | - $errno, | |
| 294 | - $errstr, | |
| 295 | - $timeout | |
| 296 | - ); | |
| 297 | - } | |
| 298 | - // Verify we connected properly | |
| 299 | -        if (!is_resource($this->smtp_conn)) {
 | |
| 300 | - $this->setError( | |
| 301 | - 'Failed to connect to server', | |
| 302 | - $errno, | |
| 303 | - $errstr | |
| 304 | - ); | |
| 305 | - $this->edebug( | |
| 306 | - 'SMTP ERROR: ' . $this->error['error'] | |
| 307 | - . ": $errstr ($errno)", | |
| 308 | - self::DEBUG_CLIENT | |
| 309 | - ); | |
| 310 | - return false; | |
| 311 | - } | |
| 312 | -        $this->edebug('Connection: opened', self::DEBUG_CONNECTION);
 | |
| 313 | - // SMTP server can take longer to respond, give longer timeout for first read | |
| 314 | - // Windows does not have support for this timeout function | |
| 315 | -        if (substr(PHP_OS, 0, 3) != 'WIN') {
 | |
| 316 | -            $max = ini_get('max_execution_time');
 | |
| 317 | - // Don't bother if unlimited | |
| 318 | -            if ($max != 0 && $timeout > $max) {
 | |
| 319 | - @set_time_limit($timeout); | |
| 320 | - } | |
| 321 | - stream_set_timeout($this->smtp_conn, $timeout, 0); | |
| 322 | - } | |
| 323 | - // Get any announcement | |
| 324 | - $announce = $this->get_lines(); | |
| 325 | -        $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);
 | |
| 326 | - return true; | |
| 327 | - } | |
| 328 | - | |
| 329 | - /** | |
| 330 | - * Initiate a TLS (encrypted) session. | |
| 331 | - * @access public | |
| 332 | - * @return boolean | |
| 333 | - */ | |
| 334 | - public function startTLS() | |
| 335 | -    {
 | |
| 336 | -        if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {
 | |
| 337 | - return false; | |
| 338 | - } | |
| 339 | - // Begin encrypted connection | |
| 340 | - if (!stream_socket_enable_crypto( | |
| 341 | - $this->smtp_conn, | |
| 342 | - true, | |
| 343 | - STREAM_CRYPTO_METHOD_TLS_CLIENT | |
| 344 | -        )) {
 | |
| 345 | - return false; | |
| 346 | - } | |
| 347 | - return true; | |
| 348 | - } | |
| 349 | - | |
| 350 | - /** | |
| 351 | - * Perform SMTP authentication. | |
| 352 | - * Must be run after hello(). | |
| 353 | - * @see hello() | |
| 354 | - * @param string $username The user name | |
| 355 | - * @param string $password The password | |
| 356 | - * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5) | |
| 357 | - * @param string $realm The auth realm for NTLM | |
| 358 | - * @param string $workstation The auth workstation for NTLM | |
| 359 | - * @access public | |
| 360 | - * @return boolean True if successfully authenticated. | |
| 361 | - */ | |
| 362 | - public function authenticate( | |
| 363 | - $username, | |
| 364 | - $password, | |
| 365 | - $authtype = null, | |
| 366 | - $realm = '', | |
| 367 | - $workstation = '' | |
| 368 | -    ) {
 | |
| 369 | -        if (!$this->server_caps) {
 | |
| 370 | -            $this->setError('Authentication is not allowed before HELO/EHLO');
 | |
| 371 | - return false; | |
| 372 | - } | |
| 373 | - | |
| 374 | -        if (array_key_exists('EHLO', $this->server_caps)) {
 | |
| 375 | - // SMTP extensions are available. Let's try to find a proper authentication method | |
| 376 | - | |
| 377 | -            if (!array_key_exists('AUTH', $this->server_caps)) {
 | |
| 378 | -                $this->setError('Authentication is not allowed at this stage');
 | |
| 379 | - // 'at this stage' means that auth may be allowed after the stage changes | |
| 380 | - // e.g. after STARTTLS | |
| 381 | - return false; | |
| 382 | - } | |
| 383 | - | |
| 384 | -            self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);
 | |
| 385 | - self::edebug( | |
| 386 | -                'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),
 | |
| 387 | - self::DEBUG_LOWLEVEL | |
| 388 | - ); | |
| 389 | - | |
| 390 | -            if (empty($authtype)) {
 | |
| 391 | -                foreach (array('LOGIN', 'CRAM-MD5', 'NTLM', 'PLAIN') as $method) {
 | |
| 392 | -                    if (in_array($method, $this->server_caps['AUTH'])) {
 | |
| 393 | - $authtype = $method; | |
| 394 | - break; | |
| 395 | - } | |
| 396 | - } | |
| 397 | -                if (empty($authtype)) {
 | |
| 398 | -                    $this->setError('No supported authentication methods found');
 | |
| 399 | - return false; | |
| 400 | - } | |
| 401 | -                self::edebug('Auth method selected: '.$authtype, self::DEBUG_LOWLEVEL);
 | |
| 402 | - } | |
| 403 | - | |
| 404 | -            if (!in_array($authtype, $this->server_caps['AUTH'])) {
 | |
| 405 | -                $this->setError("The requested authentication method \"$authtype\" is not supported by the server");
 | |
| 406 | - return false; | |
| 407 | - } | |
| 408 | -        } elseif (empty($authtype)) {
 | |
| 409 | - $authtype = 'LOGIN'; | |
| 410 | - } | |
| 411 | -        switch ($authtype) {
 | |
| 412 | - case 'PLAIN': | |
| 413 | - // Start authentication | |
| 414 | -                if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {
 | |
| 415 | - return false; | |
| 416 | - } | |
| 417 | - // Send encoded username and password | |
| 418 | - if (!$this->sendCommand( | |
| 419 | - 'User & Password', | |
| 420 | -                    base64_encode("\0" . $username . "\0" . $password),
 | |
| 421 | - 235 | |
| 422 | - ) | |
| 423 | -                ) {
 | |
| 424 | - return false; | |
| 425 | - } | |
| 426 | - break; | |
| 427 | - case 'LOGIN': | |
| 428 | - // Start authentication | |
| 429 | -                if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {
 | |
| 430 | - return false; | |
| 431 | - } | |
| 432 | -                if (!$this->sendCommand("Username", base64_encode($username), 334)) {
 | |
| 433 | - return false; | |
| 434 | - } | |
| 435 | -                if (!$this->sendCommand("Password", base64_encode($password), 235)) {
 | |
| 436 | - return false; | |
| 437 | - } | |
| 438 | - break; | |
| 439 | - case 'NTLM': | |
| 440 | - /* | |
| 29 | + /** | |
| 30 | + * The PHPMailer SMTP version number. | |
| 31 | + * @type string | |
| 32 | + */ | |
| 33 | + const VERSION = '5.2.10'; | |
| 34 | + | |
| 35 | + /** | |
| 36 | + * SMTP line break constant. | |
| 37 | + * @type string | |
| 38 | + */ | |
| 39 | + const CRLF = "\r\n"; | |
| 40 | + | |
| 41 | + /** | |
| 42 | + * The SMTP port to use if one is not specified. | |
| 43 | + * @type integer | |
| 44 | + */ | |
| 45 | + const DEFAULT_SMTP_PORT = 25; | |
| 46 | + | |
| 47 | + /** | |
| 48 | + * The maximum line length allowed by RFC 2822 section 2.1.1 | |
| 49 | + * @type integer | |
| 50 | + */ | |
| 51 | + const MAX_LINE_LENGTH = 998; | |
| 52 | + | |
| 53 | + /** | |
| 54 | + * Debug level for no output | |
| 55 | + */ | |
| 56 | + const DEBUG_OFF = 0; | |
| 57 | + | |
| 58 | + /** | |
| 59 | + * Debug level to show client -> server messages | |
| 60 | + */ | |
| 61 | + const DEBUG_CLIENT = 1; | |
| 62 | + | |
| 63 | + /** | |
| 64 | + * Debug level to show client -> server and server -> client messages | |
| 65 | + */ | |
| 66 | + const DEBUG_SERVER = 2; | |
| 67 | + | |
| 68 | + /** | |
| 69 | + * Debug level to show connection status, client -> server and server -> client messages | |
| 70 | + */ | |
| 71 | + const DEBUG_CONNECTION = 3; | |
| 72 | + | |
| 73 | + /** | |
| 74 | + * Debug level to show all messages | |
| 75 | + */ | |
| 76 | + const DEBUG_LOWLEVEL = 4; | |
| 77 | + | |
| 78 | + /** | |
| 79 | + * The PHPMailer SMTP Version number. | |
| 80 | + * @type string | |
| 81 | + * @deprecated Use the `VERSION` constant instead | |
| 82 | + * @see SMTP::VERSION | |
| 83 | + */ | |
| 84 | + public $Version = '5.2.10'; | |
| 85 | + | |
| 86 | + /** | |
| 87 | + * SMTP server port number. | |
| 88 | + * @type integer | |
| 89 | + * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead | |
| 90 | + * @see SMTP::DEFAULT_SMTP_PORT | |
| 91 | + */ | |
| 92 | + public $SMTP_PORT = 25; | |
| 93 | + | |
| 94 | + /** | |
| 95 | + * SMTP reply line ending. | |
| 96 | + * @type string | |
| 97 | + * @deprecated Use the `CRLF` constant instead | |
| 98 | + * @see SMTP::CRLF | |
| 99 | + */ | |
| 100 | + public $CRLF = "\r\n"; | |
| 101 | + | |
| 102 | + /** | |
| 103 | + * Debug output level. | |
| 104 | + * Options: | |
| 105 | + * * self::DEBUG_OFF (`0`) No debug output, default | |
| 106 | + * * self::DEBUG_CLIENT (`1`) Client commands | |
| 107 | + * * self::DEBUG_SERVER (`2`) Client commands and server responses | |
| 108 | + * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status | |
| 109 | + * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages | |
| 110 | + * @type integer | |
| 111 | + */ | |
| 112 | + public $do_debug = self::DEBUG_OFF; | |
| 113 | + | |
| 114 | + /** | |
| 115 | + * How to handle debug output. | |
| 116 | + * Options: | |
| 117 | + * * `echo` Output plain-text as-is, appropriate for CLI | |
| 118 | + * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output | |
| 119 | + * * `error_log` Output to error log as configured in php.ini | |
| 120 | + * | |
| 121 | + * Alternatively, you can provide a callable expecting two params: a message string and the debug level: | |
| 122 | + * <code> | |
| 123 | +	 * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
 | |
| 124 | + * </code> | |
| 125 | + * @type string|callable | |
| 126 | + */ | |
| 127 | + public $Debugoutput = 'echo'; | |
| 128 | + | |
| 129 | + /** | |
| 130 | + * Whether to use VERP. | |
| 131 | + * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path | |
| 132 | + * @link http://www.postfix.org/VERP_README.html Info on VERP | |
| 133 | + * @type boolean | |
| 134 | + */ | |
| 135 | + public $do_verp = false; | |
| 136 | + | |
| 137 | + /** | |
| 138 | + * The timeout value for connection, in seconds. | |
| 139 | + * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 | |
| 140 | + * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure. | |
| 141 | + * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2 | |
| 142 | + * @type integer | |
| 143 | + */ | |
| 144 | + public $Timeout = 300; | |
| 145 | + | |
| 146 | + /** | |
| 147 | + * How long to wait for commands to complete, in seconds. | |
| 148 | + * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 | |
| 149 | + * @type integer | |
| 150 | + */ | |
| 151 | + public $Timelimit = 300; | |
| 152 | + | |
| 153 | + /** | |
| 154 | + * The socket for the server connection. | |
| 155 | + * @type resource | |
| 156 | + */ | |
| 157 | + protected $smtp_conn; | |
| 158 | + | |
| 159 | + /** | |
| 160 | + * Error information, if any, for the last SMTP command. | |
| 161 | + * @type array | |
| 162 | + */ | |
| 163 | + protected $error = array( | |
| 164 | + 'error' => '', | |
| 165 | + 'detail' => '', | |
| 166 | + 'smtp_code' => '', | |
| 167 | + 'smtp_code_ex' => '' | |
| 168 | + ); | |
| 169 | + | |
| 170 | + /** | |
| 171 | + * The reply the server sent to us for HELO. | |
| 172 | + * If null, no HELO string has yet been received. | |
| 173 | + * @type string|null | |
| 174 | + */ | |
| 175 | + protected $helo_rply = null; | |
| 176 | + | |
| 177 | + /** | |
| 178 | + * The set of SMTP extensions sent in reply to EHLO command. | |
| 179 | + * Indexes of the array are extension names. | |
| 180 | + * Value at index 'HELO' or 'EHLO' (according to command that was sent) | |
| 181 | + * represents the server name. In case of HELO it is the only element of the array. | |
| 182 | + * Other values can be boolean TRUE or an array containing extension options. | |
| 183 | + * If null, no HELO/EHLO string has yet been received. | |
| 184 | + * @type array|null | |
| 185 | + */ | |
| 186 | + protected $server_caps = null; | |
| 187 | + | |
| 188 | + /** | |
| 189 | + * The most recent reply received from the server. | |
| 190 | + * @type string | |
| 191 | + */ | |
| 192 | + protected $last_reply = ''; | |
| 193 | + | |
| 194 | + /** | |
| 195 | + * Output debugging info via a user-selected method. | |
| 196 | + * @see SMTP::$Debugoutput | |
| 197 | + * @see SMTP::$do_debug | |
| 198 | + * @param string $str Debug string to output | |
| 199 | + * @param integer $level The debug level of this message; see DEBUG_* constants | |
| 200 | + * @return void | |
| 201 | + */ | |
| 202 | + protected function edebug($str, $level = 0) | |
| 203 | +	{
 | |
| 204 | +		if ($level > $this->do_debug) {
 | |
| 205 | + return; | |
| 206 | + } | |
| 207 | + //Avoid clash with built-in function names | |
| 208 | +		if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
 | |
| 209 | + call_user_func($this->Debugoutput, $str, $this->do_debug); | |
| 210 | + return; | |
| 211 | + } | |
| 212 | +		switch ($this->Debugoutput) {
 | |
| 213 | + case 'error_log': | |
| 214 | + //Don't output, just log | |
| 215 | + error_log($str); | |
| 216 | + break; | |
| 217 | + case 'html': | |
| 218 | + //Cleans up output a bit for a better looking, HTML-safe output | |
| 219 | + echo htmlentities( | |
| 220 | +					preg_replace('/[\r\n]+/', '', $str),
 | |
| 221 | + ENT_QUOTES, | |
| 222 | + 'UTF-8' | |
| 223 | + ) | |
| 224 | + . "<br>\n"; | |
| 225 | + break; | |
| 226 | + case 'echo': | |
| 227 | + default: | |
| 228 | + //Normalize line breaks | |
| 229 | +				$str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
 | |
| 230 | +				echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
 | |
| 231 | + "\n", | |
| 232 | + "\n \t ", | |
| 233 | + trim($str) | |
| 234 | + )."\n"; | |
| 235 | + } | |
| 236 | + } | |
| 237 | + | |
| 238 | + /** | |
| 239 | + * Connect to an SMTP server. | |
| 240 | + * @param string $host SMTP server IP or host name | |
| 241 | + * @param integer $port The port number to connect to | |
| 242 | + * @param integer $timeout How long to wait for the connection to open | |
| 243 | + * @param array $options An array of options for stream_context_create() | |
| 244 | + * @access public | |
| 245 | + * @return boolean | |
| 246 | + */ | |
| 247 | + public function connect($host, $port = null, $timeout = 30, $options = array()) | |
| 248 | +	{
 | |
| 249 | + static $streamok; | |
| 250 | + //This is enabled by default since 5.0.0 but some providers disable it | |
| 251 | + //Check this once and cache the result | |
| 252 | +		if (is_null($streamok)) {
 | |
| 253 | +			$streamok = function_exists('stream_socket_client');
 | |
| 254 | + } | |
| 255 | + // Clear errors to avoid confusion | |
| 256 | +		$this->setError('');
 | |
| 257 | + // Make sure we are __not__ connected | |
| 258 | +		if ($this->connected()) {
 | |
| 259 | + // Already connected, generate error | |
| 260 | +			$this->setError('Already connected to a server');
 | |
| 261 | + return false; | |
| 262 | + } | |
| 263 | +		if (empty($port)) {
 | |
| 264 | + $port = self::DEFAULT_SMTP_PORT; | |
| 265 | + } | |
| 266 | + // Connect to the SMTP server | |
| 267 | + $this->edebug( | |
| 268 | + "Connection: opening to $host:$port, timeout=$timeout, options=".var_export($options, true), | |
| 269 | + self::DEBUG_CONNECTION | |
| 270 | + ); | |
| 271 | + $errno = 0; | |
| 272 | + $errstr = ''; | |
| 273 | +		if ($streamok) {
 | |
| 274 | + $socket_context = stream_context_create($options); | |
| 275 | + //Suppress errors; connection failures are handled at a higher level | |
| 276 | + $this->smtp_conn = @stream_socket_client( | |
| 277 | + $host . ":" . $port, | |
| 278 | + $errno, | |
| 279 | + $errstr, | |
| 280 | + $timeout, | |
| 281 | + STREAM_CLIENT_CONNECT, | |
| 282 | + $socket_context | |
| 283 | + ); | |
| 284 | +		} else {
 | |
| 285 | + //Fall back to fsockopen which should work in more places, but is missing some features | |
| 286 | + $this->edebug( | |
| 287 | + "Connection: stream_socket_client not available, falling back to fsockopen", | |
| 288 | + self::DEBUG_CONNECTION | |
| 289 | + ); | |
| 290 | + $this->smtp_conn = fsockopen( | |
| 291 | + $host, | |
| 292 | + $port, | |
| 293 | + $errno, | |
| 294 | + $errstr, | |
| 295 | + $timeout | |
| 296 | + ); | |
| 297 | + } | |
| 298 | + // Verify we connected properly | |
| 299 | +		if (!is_resource($this->smtp_conn)) {
 | |
| 300 | + $this->setError( | |
| 301 | + 'Failed to connect to server', | |
| 302 | + $errno, | |
| 303 | + $errstr | |
| 304 | + ); | |
| 305 | + $this->edebug( | |
| 306 | + 'SMTP ERROR: ' . $this->error['error'] | |
| 307 | + . ": $errstr ($errno)", | |
| 308 | + self::DEBUG_CLIENT | |
| 309 | + ); | |
| 310 | + return false; | |
| 311 | + } | |
| 312 | +		$this->edebug('Connection: opened', self::DEBUG_CONNECTION);
 | |
| 313 | + // SMTP server can take longer to respond, give longer timeout for first read | |
| 314 | + // Windows does not have support for this timeout function | |
| 315 | +		if (substr(PHP_OS, 0, 3) != 'WIN') {
 | |
| 316 | +			$max = ini_get('max_execution_time');
 | |
| 317 | + // Don't bother if unlimited | |
| 318 | +			if ($max != 0 && $timeout > $max) {
 | |
| 319 | + @set_time_limit($timeout); | |
| 320 | + } | |
| 321 | + stream_set_timeout($this->smtp_conn, $timeout, 0); | |
| 322 | + } | |
| 323 | + // Get any announcement | |
| 324 | + $announce = $this->get_lines(); | |
| 325 | +		$this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);
 | |
| 326 | + return true; | |
| 327 | + } | |
| 328 | + | |
| 329 | + /** | |
| 330 | + * Initiate a TLS (encrypted) session. | |
| 331 | + * @access public | |
| 332 | + * @return boolean | |
| 333 | + */ | |
| 334 | + public function startTLS() | |
| 335 | +	{
 | |
| 336 | +		if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {
 | |
| 337 | + return false; | |
| 338 | + } | |
| 339 | + // Begin encrypted connection | |
| 340 | + if (!stream_socket_enable_crypto( | |
| 341 | + $this->smtp_conn, | |
| 342 | + true, | |
| 343 | + STREAM_CRYPTO_METHOD_TLS_CLIENT | |
| 344 | +		)) {
 | |
| 345 | + return false; | |
| 346 | + } | |
| 347 | + return true; | |
| 348 | + } | |
| 349 | + | |
| 350 | + /** | |
| 351 | + * Perform SMTP authentication. | |
| 352 | + * Must be run after hello(). | |
| 353 | + * @see hello() | |
| 354 | + * @param string $username The user name | |
| 355 | + * @param string $password The password | |
| 356 | + * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5) | |
| 357 | + * @param string $realm The auth realm for NTLM | |
| 358 | + * @param string $workstation The auth workstation for NTLM | |
| 359 | + * @access public | |
| 360 | + * @return boolean True if successfully authenticated. | |
| 361 | + */ | |
| 362 | + public function authenticate( | |
| 363 | + $username, | |
| 364 | + $password, | |
| 365 | + $authtype = null, | |
| 366 | + $realm = '', | |
| 367 | + $workstation = '' | |
| 368 | +	) {
 | |
| 369 | +		if (!$this->server_caps) {
 | |
| 370 | +			$this->setError('Authentication is not allowed before HELO/EHLO');
 | |
| 371 | + return false; | |
| 372 | + } | |
| 373 | + | |
| 374 | +		if (array_key_exists('EHLO', $this->server_caps)) {
 | |
| 375 | + // SMTP extensions are available. Let's try to find a proper authentication method | |
| 376 | + | |
| 377 | +			if (!array_key_exists('AUTH', $this->server_caps)) {
 | |
| 378 | +				$this->setError('Authentication is not allowed at this stage');
 | |
| 379 | + // 'at this stage' means that auth may be allowed after the stage changes | |
| 380 | + // e.g. after STARTTLS | |
| 381 | + return false; | |
| 382 | + } | |
| 383 | + | |
| 384 | +			self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);
 | |
| 385 | + self::edebug( | |
| 386 | +				'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),
 | |
| 387 | + self::DEBUG_LOWLEVEL | |
| 388 | + ); | |
| 389 | + | |
| 390 | +			if (empty($authtype)) {
 | |
| 391 | +				foreach (array('LOGIN', 'CRAM-MD5', 'NTLM', 'PLAIN') as $method) {
 | |
| 392 | +					if (in_array($method, $this->server_caps['AUTH'])) {
 | |
| 393 | + $authtype = $method; | |
| 394 | + break; | |
| 395 | + } | |
| 396 | + } | |
| 397 | +				if (empty($authtype)) {
 | |
| 398 | +					$this->setError('No supported authentication methods found');
 | |
| 399 | + return false; | |
| 400 | + } | |
| 401 | +				self::edebug('Auth method selected: '.$authtype, self::DEBUG_LOWLEVEL);
 | |
| 402 | + } | |
| 403 | + | |
| 404 | +			if (!in_array($authtype, $this->server_caps['AUTH'])) {
 | |
| 405 | +				$this->setError("The requested authentication method \"$authtype\" is not supported by the server");
 | |
| 406 | + return false; | |
| 407 | + } | |
| 408 | +		} elseif (empty($authtype)) {
 | |
| 409 | + $authtype = 'LOGIN'; | |
| 410 | + } | |
| 411 | +		switch ($authtype) {
 | |
| 412 | + case 'PLAIN': | |
| 413 | + // Start authentication | |
| 414 | +				if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {
 | |
| 415 | + return false; | |
| 416 | + } | |
| 417 | + // Send encoded username and password | |
| 418 | + if (!$this->sendCommand( | |
| 419 | + 'User & Password', | |
| 420 | +					base64_encode("\0" . $username . "\0" . $password),
 | |
| 421 | + 235 | |
| 422 | + ) | |
| 423 | +				) {
 | |
| 424 | + return false; | |
| 425 | + } | |
| 426 | + break; | |
| 427 | + case 'LOGIN': | |
| 428 | + // Start authentication | |
| 429 | +				if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {
 | |
| 430 | + return false; | |
| 431 | + } | |
| 432 | +				if (!$this->sendCommand("Username", base64_encode($username), 334)) {
 | |
| 433 | + return false; | |
| 434 | + } | |
| 435 | +				if (!$this->sendCommand("Password", base64_encode($password), 235)) {
 | |
| 436 | + return false; | |
| 437 | + } | |
| 438 | + break; | |
| 439 | + case 'NTLM': | |
| 440 | + /* | |
| 441 | 441 | * ntlm_sasl_client.php | 
| 442 | 442 | * Bundled with Permission | 
| 443 | 443 | * | 
| @@ -445,166 +445,166 @@ discard block | ||
| 445 | 445 | * http://technet.microsoft.com/en-us/library/aa995718%28EXCHG.65%29.aspx | 
| 446 | 446 | * PROTOCOL Docs http://curl.haxx.se/rfc/ntlm.html#ntlmSmtpAuthentication | 
| 447 | 447 | */ | 
| 448 | - require_once 'extras/ntlm_sasl_client.php'; | |
| 449 | - $temp = new stdClass; | |
| 450 | - $ntlm_client = new ntlm_sasl_client_class; | |
| 451 | - //Check that functions are available | |
| 452 | -                if (!$ntlm_client->Initialize($temp)) {
 | |
| 453 | - $this->setError($temp->error); | |
| 454 | - $this->edebug( | |
| 455 | - 'You need to enable some modules in your php.ini file: ' | |
| 456 | - . $this->error['error'], | |
| 457 | - self::DEBUG_CLIENT | |
| 458 | - ); | |
| 459 | - return false; | |
| 460 | - } | |
| 461 | - //msg1 | |
| 462 | - $msg1 = $ntlm_client->TypeMsg1($realm, $workstation); //msg1 | |
| 463 | - | |
| 464 | - if (!$this->sendCommand( | |
| 465 | - 'AUTH NTLM', | |
| 466 | - 'AUTH NTLM ' . base64_encode($msg1), | |
| 467 | - 334 | |
| 468 | - ) | |
| 469 | -                ) {
 | |
| 470 | - return false; | |
| 471 | - } | |
| 472 | - //Though 0 based, there is a white space after the 3 digit number | |
| 473 | - //msg2 | |
| 474 | - $challenge = substr($this->last_reply, 3); | |
| 475 | - $challenge = base64_decode($challenge); | |
| 476 | - $ntlm_res = $ntlm_client->NTLMResponse( | |
| 477 | - substr($challenge, 24, 8), | |
| 478 | - $password | |
| 479 | - ); | |
| 480 | - //msg3 | |
| 481 | - $msg3 = $ntlm_client->TypeMsg3( | |
| 482 | - $ntlm_res, | |
| 483 | - $username, | |
| 484 | - $realm, | |
| 485 | - $workstation | |
| 486 | - ); | |
| 487 | - // send encoded username | |
| 488 | -                return $this->sendCommand('Username', base64_encode($msg3), 235);
 | |
| 489 | - case 'CRAM-MD5': | |
| 490 | - // Start authentication | |
| 491 | -                if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {
 | |
| 492 | - return false; | |
| 493 | - } | |
| 494 | - // Get the challenge | |
| 495 | - $challenge = base64_decode(substr($this->last_reply, 4)); | |
| 496 | - | |
| 497 | - // Build the response | |
| 498 | - $response = $username . ' ' . $this->hmac($challenge, $password); | |
| 499 | - | |
| 500 | - // send encoded credentials | |
| 501 | -                return $this->sendCommand('Username', base64_encode($response), 235);
 | |
| 502 | - default: | |
| 503 | -                $this->setError("Authentication method \"$authtype\" is not supported");
 | |
| 504 | - return false; | |
| 505 | - } | |
| 506 | - return true; | |
| 507 | - } | |
| 508 | - | |
| 509 | - /** | |
| 510 | - * Calculate an MD5 HMAC hash. | |
| 511 | -     * Works like hash_hmac('md5', $data, $key)
 | |
| 512 | - * in case that function is not available | |
| 513 | - * @param string $data The data to hash | |
| 514 | - * @param string $key The key to hash with | |
| 515 | - * @access protected | |
| 516 | - * @return string | |
| 517 | - */ | |
| 518 | - protected function hmac($data, $key) | |
| 519 | -    {
 | |
| 520 | -        if (function_exists('hash_hmac')) {
 | |
| 521 | -            return hash_hmac('md5', $data, $key);
 | |
| 522 | - } | |
| 523 | - | |
| 524 | - // The following borrowed from | |
| 525 | - // http://php.net/manual/en/function.mhash.php#27225 | |
| 526 | - | |
| 527 | - // RFC 2104 HMAC implementation for php. | |
| 528 | - // Creates an md5 HMAC. | |
| 529 | - // Eliminates the need to install mhash to compute a HMAC | |
| 530 | - // by Lance Rushing | |
| 531 | - | |
| 532 | - $bytelen = 64; // byte length for md5 | |
| 533 | -        if (strlen($key) > $bytelen) {
 | |
| 534 | -            $key = pack('H*', md5($key));
 | |
| 535 | - } | |
| 536 | - $key = str_pad($key, $bytelen, chr(0x00)); | |
| 537 | -        $ipad = str_pad('', $bytelen, chr(0x36));
 | |
| 538 | -        $opad = str_pad('', $bytelen, chr(0x5c));
 | |
| 539 | - $k_ipad = $key ^ $ipad; | |
| 540 | - $k_opad = $key ^ $opad; | |
| 541 | - | |
| 542 | -        return md5($k_opad . pack('H*', md5($k_ipad . $data)));
 | |
| 543 | - } | |
| 544 | - | |
| 545 | - /** | |
| 546 | - * Check connection state. | |
| 547 | - * @access public | |
| 548 | - * @return boolean True if connected. | |
| 549 | - */ | |
| 550 | - public function connected() | |
| 551 | -    {
 | |
| 552 | -        if (is_resource($this->smtp_conn)) {
 | |
| 553 | - $sock_status = stream_get_meta_data($this->smtp_conn); | |
| 554 | -            if ($sock_status['eof']) {
 | |
| 555 | - // The socket is valid but we are not connected | |
| 556 | - $this->edebug( | |
| 557 | - 'SMTP NOTICE: EOF caught while checking if connected', | |
| 558 | - self::DEBUG_CLIENT | |
| 559 | - ); | |
| 560 | - $this->close(); | |
| 561 | - return false; | |
| 562 | - } | |
| 563 | - return true; // everything looks good | |
| 564 | - } | |
| 565 | - return false; | |
| 566 | - } | |
| 567 | - | |
| 568 | - /** | |
| 569 | - * Close the socket and clean up the state of the class. | |
| 570 | - * Don't use this function without first trying to use QUIT. | |
| 571 | - * @see quit() | |
| 572 | - * @access public | |
| 573 | - * @return void | |
| 574 | - */ | |
| 575 | - public function close() | |
| 576 | -    {
 | |
| 577 | -        $this->setError('');
 | |
| 578 | - $this->server_caps = null; | |
| 579 | - $this->helo_rply = null; | |
| 580 | -        if (is_resource($this->smtp_conn)) {
 | |
| 581 | - // close the connection and cleanup | |
| 582 | - fclose($this->smtp_conn); | |
| 583 | - $this->smtp_conn = null; //Makes for cleaner serialization | |
| 584 | -            $this->edebug('Connection: closed', self::DEBUG_CONNECTION);
 | |
| 585 | - } | |
| 586 | - } | |
| 587 | - | |
| 588 | - /** | |
| 589 | - * Send an SMTP DATA command. | |
| 590 | - * Issues a data command and sends the msg_data to the server, | |
| 591 | - * finializing the mail transaction. $msg_data is the message | |
| 592 | - * that is to be send with the headers. Each header needs to be | |
| 593 | - * on a single line followed by a <CRLF> with the message headers | |
| 594 | - * and the message body being separated by and additional <CRLF>. | |
| 595 | - * Implements rfc 821: DATA <CRLF> | |
| 596 | - * @param string $msg_data Message data to send | |
| 597 | - * @access public | |
| 598 | - * @return boolean | |
| 599 | - */ | |
| 600 | - public function data($msg_data) | |
| 601 | -    {
 | |
| 602 | - //This will use the standard timelimit | |
| 603 | -        if (!$this->sendCommand('DATA', 'DATA', 354)) {
 | |
| 604 | - return false; | |
| 605 | - } | |
| 606 | - | |
| 607 | - /* The server is ready to accept data! | |
| 448 | + require_once 'extras/ntlm_sasl_client.php'; | |
| 449 | + $temp = new stdClass; | |
| 450 | + $ntlm_client = new ntlm_sasl_client_class; | |
| 451 | + //Check that functions are available | |
| 452 | +				if (!$ntlm_client->Initialize($temp)) {
 | |
| 453 | + $this->setError($temp->error); | |
| 454 | + $this->edebug( | |
| 455 | + 'You need to enable some modules in your php.ini file: ' | |
| 456 | + . $this->error['error'], | |
| 457 | + self::DEBUG_CLIENT | |
| 458 | + ); | |
| 459 | + return false; | |
| 460 | + } | |
| 461 | + //msg1 | |
| 462 | + $msg1 = $ntlm_client->TypeMsg1($realm, $workstation); //msg1 | |
| 463 | + | |
| 464 | + if (!$this->sendCommand( | |
| 465 | + 'AUTH NTLM', | |
| 466 | + 'AUTH NTLM ' . base64_encode($msg1), | |
| 467 | + 334 | |
| 468 | + ) | |
| 469 | +				) {
 | |
| 470 | + return false; | |
| 471 | + } | |
| 472 | + //Though 0 based, there is a white space after the 3 digit number | |
| 473 | + //msg2 | |
| 474 | + $challenge = substr($this->last_reply, 3); | |
| 475 | + $challenge = base64_decode($challenge); | |
| 476 | + $ntlm_res = $ntlm_client->NTLMResponse( | |
| 477 | + substr($challenge, 24, 8), | |
| 478 | + $password | |
| 479 | + ); | |
| 480 | + //msg3 | |
| 481 | + $msg3 = $ntlm_client->TypeMsg3( | |
| 482 | + $ntlm_res, | |
| 483 | + $username, | |
| 484 | + $realm, | |
| 485 | + $workstation | |
| 486 | + ); | |
| 487 | + // send encoded username | |
| 488 | +				return $this->sendCommand('Username', base64_encode($msg3), 235);
 | |
| 489 | + case 'CRAM-MD5': | |
| 490 | + // Start authentication | |
| 491 | +				if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {
 | |
| 492 | + return false; | |
| 493 | + } | |
| 494 | + // Get the challenge | |
| 495 | + $challenge = base64_decode(substr($this->last_reply, 4)); | |
| 496 | + | |
| 497 | + // Build the response | |
| 498 | + $response = $username . ' ' . $this->hmac($challenge, $password); | |
| 499 | + | |
| 500 | + // send encoded credentials | |
| 501 | +				return $this->sendCommand('Username', base64_encode($response), 235);
 | |
| 502 | + default: | |
| 503 | +				$this->setError("Authentication method \"$authtype\" is not supported");
 | |
| 504 | + return false; | |
| 505 | + } | |
| 506 | + return true; | |
| 507 | + } | |
| 508 | + | |
| 509 | + /** | |
| 510 | + * Calculate an MD5 HMAC hash. | |
| 511 | +	 * Works like hash_hmac('md5', $data, $key)
 | |
| 512 | + * in case that function is not available | |
| 513 | + * @param string $data The data to hash | |
| 514 | + * @param string $key The key to hash with | |
| 515 | + * @access protected | |
| 516 | + * @return string | |
| 517 | + */ | |
| 518 | + protected function hmac($data, $key) | |
| 519 | +	{
 | |
| 520 | +		if (function_exists('hash_hmac')) {
 | |
| 521 | +			return hash_hmac('md5', $data, $key);
 | |
| 522 | + } | |
| 523 | + | |
| 524 | + // The following borrowed from | |
| 525 | + // http://php.net/manual/en/function.mhash.php#27225 | |
| 526 | + | |
| 527 | + // RFC 2104 HMAC implementation for php. | |
| 528 | + // Creates an md5 HMAC. | |
| 529 | + // Eliminates the need to install mhash to compute a HMAC | |
| 530 | + // by Lance Rushing | |
| 531 | + | |
| 532 | + $bytelen = 64; // byte length for md5 | |
| 533 | +		if (strlen($key) > $bytelen) {
 | |
| 534 | +			$key = pack('H*', md5($key));
 | |
| 535 | + } | |
| 536 | + $key = str_pad($key, $bytelen, chr(0x00)); | |
| 537 | +		$ipad = str_pad('', $bytelen, chr(0x36));
 | |
| 538 | +		$opad = str_pad('', $bytelen, chr(0x5c));
 | |
| 539 | + $k_ipad = $key ^ $ipad; | |
| 540 | + $k_opad = $key ^ $opad; | |
| 541 | + | |
| 542 | +		return md5($k_opad . pack('H*', md5($k_ipad . $data)));
 | |
| 543 | + } | |
| 544 | + | |
| 545 | + /** | |
| 546 | + * Check connection state. | |
| 547 | + * @access public | |
| 548 | + * @return boolean True if connected. | |
| 549 | + */ | |
| 550 | + public function connected() | |
| 551 | +	{
 | |
| 552 | +		if (is_resource($this->smtp_conn)) {
 | |
| 553 | + $sock_status = stream_get_meta_data($this->smtp_conn); | |
| 554 | +			if ($sock_status['eof']) {
 | |
| 555 | + // The socket is valid but we are not connected | |
| 556 | + $this->edebug( | |
| 557 | + 'SMTP NOTICE: EOF caught while checking if connected', | |
| 558 | + self::DEBUG_CLIENT | |
| 559 | + ); | |
| 560 | + $this->close(); | |
| 561 | + return false; | |
| 562 | + } | |
| 563 | + return true; // everything looks good | |
| 564 | + } | |
| 565 | + return false; | |
| 566 | + } | |
| 567 | + | |
| 568 | + /** | |
| 569 | + * Close the socket and clean up the state of the class. | |
| 570 | + * Don't use this function without first trying to use QUIT. | |
| 571 | + * @see quit() | |
| 572 | + * @access public | |
| 573 | + * @return void | |
| 574 | + */ | |
| 575 | + public function close() | |
| 576 | +	{
 | |
| 577 | +		$this->setError('');
 | |
| 578 | + $this->server_caps = null; | |
| 579 | + $this->helo_rply = null; | |
| 580 | +		if (is_resource($this->smtp_conn)) {
 | |
| 581 | + // close the connection and cleanup | |
| 582 | + fclose($this->smtp_conn); | |
| 583 | + $this->smtp_conn = null; //Makes for cleaner serialization | |
| 584 | +			$this->edebug('Connection: closed', self::DEBUG_CONNECTION);
 | |
| 585 | + } | |
| 586 | + } | |
| 587 | + | |
| 588 | + /** | |
| 589 | + * Send an SMTP DATA command. | |
| 590 | + * Issues a data command and sends the msg_data to the server, | |
| 591 | + * finializing the mail transaction. $msg_data is the message | |
| 592 | + * that is to be send with the headers. Each header needs to be | |
| 593 | + * on a single line followed by a <CRLF> with the message headers | |
| 594 | + * and the message body being separated by and additional <CRLF>. | |
| 595 | + * Implements rfc 821: DATA <CRLF> | |
| 596 | + * @param string $msg_data Message data to send | |
| 597 | + * @access public | |
| 598 | + * @return boolean | |
| 599 | + */ | |
| 600 | + public function data($msg_data) | |
| 601 | +	{
 | |
| 602 | + //This will use the standard timelimit | |
| 603 | +		if (!$this->sendCommand('DATA', 'DATA', 354)) {
 | |
| 604 | + return false; | |
| 605 | + } | |
| 606 | + | |
| 607 | + /* The server is ready to accept data! | |
| 608 | 608 | * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF) | 
| 609 | 609 | * so we will break the data up into lines by \r and/or \n then if needed we will break each of those into | 
| 610 | 610 | * smaller lines to fit within the limit. | 
| @@ -612,541 +612,541 @@ discard block | ||
| 612 | 612 | * NOTE: this does not count towards line-length limit. | 
| 613 | 613 | */ | 
| 614 | 614 | |
| 615 | - // Normalize line breaks before exploding | |
| 616 | -        $lines = explode("\n", str_replace(array("\r\n", "\r"), "\n", $msg_data));
 | |
| 615 | + // Normalize line breaks before exploding | |
| 616 | +		$lines = explode("\n", str_replace(array("\r\n", "\r"), "\n", $msg_data));
 | |
| 617 | 617 | |
| 618 | - /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field | |
| 618 | + /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field | |
| 619 | 619 |           * of the first line (':' separated) does not contain a space then it _should_ be a header and we will
 | 
| 620 | 620 | * process all lines before a blank line as headers. | 
| 621 | 621 | */ | 
| 622 | 622 | |
| 623 | - $field = substr($lines[0], 0, strpos($lines[0], ':')); | |
| 624 | - $in_headers = false; | |
| 625 | -        if (!empty($field) && strpos($field, ' ') === false) {
 | |
| 626 | - $in_headers = true; | |
| 627 | - } | |
| 628 | - | |
| 629 | -        foreach ($lines as $line) {
 | |
| 630 | - $lines_out = array(); | |
| 631 | -            if ($in_headers and $line == '') {
 | |
| 632 | - $in_headers = false; | |
| 633 | - } | |
| 634 | - //Break this line up into several smaller lines if it's too long | |
| 635 | - //Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len), | |
| 636 | -            while (isset($line[self::MAX_LINE_LENGTH])) {
 | |
| 637 | - //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on | |
| 638 | - //so as to avoid breaking in the middle of a word | |
| 639 | - $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' '); | |
| 640 | - //Deliberately matches both false and 0 | |
| 641 | -                if (!$pos) {
 | |
| 642 | - //No nice break found, add a hard break | |
| 643 | - $pos = self::MAX_LINE_LENGTH - 1; | |
| 644 | - $lines_out[] = substr($line, 0, $pos); | |
| 645 | - $line = substr($line, $pos); | |
| 646 | -                } else {
 | |
| 647 | - //Break at the found point | |
| 648 | - $lines_out[] = substr($line, 0, $pos); | |
| 649 | - //Move along by the amount we dealt with | |
| 650 | - $line = substr($line, $pos + 1); | |
| 651 | - } | |
| 652 | - //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1 | |
| 653 | -                if ($in_headers) {
 | |
| 654 | - $line = "\t" . $line; | |
| 655 | - } | |
| 656 | - } | |
| 657 | - $lines_out[] = $line; | |
| 658 | - | |
| 659 | - //Send the lines to the server | |
| 660 | -            foreach ($lines_out as $line_out) {
 | |
| 661 | - //RFC2821 section 4.5.2 | |
| 662 | -                if (!empty($line_out) and $line_out[0] == '.') {
 | |
| 663 | - $line_out = '.' . $line_out; | |
| 664 | - } | |
| 665 | - $this->client_send($line_out . self::CRLF); | |
| 666 | - } | |
| 667 | - } | |
| 668 | - | |
| 669 | - //Message data has been sent, complete the command | |
| 670 | - //Increase timelimit for end of DATA command | |
| 671 | - $savetimelimit = $this->Timelimit; | |
| 672 | - $this->Timelimit = $this->Timelimit * 2; | |
| 673 | -        $result = $this->sendCommand('DATA END', '.', 250);
 | |
| 674 | - //Restore timelimit | |
| 675 | - $this->Timelimit = $savetimelimit; | |
| 676 | - return $result; | |
| 677 | - } | |
| 678 | - | |
| 679 | - /** | |
| 680 | - * Send an SMTP HELO or EHLO command. | |
| 681 | - * Used to identify the sending server to the receiving server. | |
| 682 | - * This makes sure that client and server are in a known state. | |
| 683 | - * Implements RFC 821: HELO <SP> <domain> <CRLF> | |
| 684 | - * and RFC 2821 EHLO. | |
| 685 | - * @param string $host The host name or IP to connect to | |
| 686 | - * @access public | |
| 687 | - * @return boolean | |
| 688 | - */ | |
| 689 | - public function hello($host = '') | |
| 690 | -    {
 | |
| 691 | - //Try extended hello first (RFC 2821) | |
| 692 | -        return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host));
 | |
| 693 | - } | |
| 694 | - | |
| 695 | - /** | |
| 696 | - * Send an SMTP HELO or EHLO command. | |
| 697 | - * Low-level implementation used by hello() | |
| 698 | - * @see hello() | |
| 699 | - * @param string $hello The HELO string | |
| 700 | - * @param string $host The hostname to say we are | |
| 701 | - * @access protected | |
| 702 | - * @return boolean | |
| 703 | - */ | |
| 704 | - protected function sendHello($hello, $host) | |
| 705 | -    {
 | |
| 706 | - $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250); | |
| 707 | - $this->helo_rply = $this->last_reply; | |
| 708 | -        if ($noerror) {
 | |
| 709 | - $this->parseHelloFields($hello); | |
| 710 | -        } else {
 | |
| 711 | - $this->server_caps = null; | |
| 712 | - } | |
| 713 | - return $noerror; | |
| 714 | - } | |
| 715 | - | |
| 716 | - /** | |
| 717 | - * Parse a reply to HELO/EHLO command to discover server extensions. | |
| 718 | - * In case of HELO, the only parameter that can be discovered is a server name. | |
| 719 | - * @access protected | |
| 720 | - * @param string $type - 'HELO' or 'EHLO' | |
| 721 | - */ | |
| 722 | - protected function parseHelloFields($type) | |
| 723 | -    {
 | |
| 724 | - $this->server_caps = array(); | |
| 725 | -        $lines = explode("\n", $this->last_reply);
 | |
| 726 | -        foreach ($lines as $n => $s) {
 | |
| 727 | - $s = trim(substr($s, 4)); | |
| 728 | -            if (!$s) {
 | |
| 729 | - continue; | |
| 730 | - } | |
| 731 | -            $fields = explode(' ', $s);
 | |
| 732 | -            if (!empty($fields)) {
 | |
| 733 | -                if (!$n) {
 | |
| 734 | - $name = $type; | |
| 735 | - $fields = $fields[0]; | |
| 736 | -                } else {
 | |
| 737 | - $name = array_shift($fields); | |
| 738 | -                    if ($name == 'SIZE') {
 | |
| 739 | - $fields = ($fields) ? $fields[0] : 0; | |
| 740 | - } | |
| 741 | - } | |
| 742 | - $this->server_caps[$name] = ($fields ? $fields : true); | |
| 743 | - } | |
| 744 | - } | |
| 745 | - } | |
| 746 | - | |
| 747 | - /** | |
| 748 | - * Send an SMTP MAIL command. | |
| 749 | - * Starts a mail transaction from the email address specified in | |
| 750 | - * $from. Returns true if successful or false otherwise. If True | |
| 751 | - * the mail transaction is started and then one or more recipient | |
| 752 | - * commands may be called followed by a data command. | |
| 753 | - * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF> | |
| 754 | - * @param string $from Source address of this message | |
| 755 | - * @access public | |
| 756 | - * @return boolean | |
| 757 | - */ | |
| 758 | - public function mail($from) | |
| 759 | -    {
 | |
| 760 | - $useVerp = ($this->do_verp ? ' XVERP' : ''); | |
| 761 | - return $this->sendCommand( | |
| 762 | - 'MAIL FROM', | |
| 763 | - 'MAIL FROM:<' . $from . '>' . $useVerp, | |
| 764 | - 250 | |
| 765 | - ); | |
| 766 | - } | |
| 767 | - | |
| 768 | - /** | |
| 769 | - * Send an SMTP QUIT command. | |
| 770 | - * Closes the socket if there is no error or the $close_on_error argument is true. | |
| 771 | - * Implements from rfc 821: QUIT <CRLF> | |
| 772 | - * @param boolean $close_on_error Should the connection close if an error occurs? | |
| 773 | - * @access public | |
| 774 | - * @return boolean | |
| 775 | - */ | |
| 776 | - public function quit($close_on_error = true) | |
| 777 | -    {
 | |
| 778 | -        $noerror = $this->sendCommand('QUIT', 'QUIT', 221);
 | |
| 779 | - $err = $this->error; //Save any error | |
| 780 | -        if ($noerror or $close_on_error) {
 | |
| 781 | - $this->close(); | |
| 782 | - $this->error = $err; //Restore any error from the quit command | |
| 783 | - } | |
| 784 | - return $noerror; | |
| 785 | - } | |
| 786 | - | |
| 787 | - /** | |
| 788 | - * Send an SMTP RCPT command. | |
| 789 | - * Sets the TO argument to $toaddr. | |
| 790 | - * Returns true if the recipient was accepted false if it was rejected. | |
| 791 | - * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF> | |
| 792 | - * @param string $toaddr The address the message is being sent to | |
| 793 | - * @access public | |
| 794 | - * @return boolean | |
| 795 | - */ | |
| 796 | - public function recipient($toaddr) | |
| 797 | -    {
 | |
| 798 | - return $this->sendCommand( | |
| 799 | - 'RCPT TO', | |
| 800 | - 'RCPT TO:<' . $toaddr . '>', | |
| 801 | - array(250, 251) | |
| 802 | - ); | |
| 803 | - } | |
| 804 | - | |
| 805 | - /** | |
| 806 | - * Send an SMTP RSET command. | |
| 807 | - * Abort any transaction that is currently in progress. | |
| 808 | - * Implements rfc 821: RSET <CRLF> | |
| 809 | - * @access public | |
| 810 | - * @return boolean True on success. | |
| 811 | - */ | |
| 812 | - public function reset() | |
| 813 | -    {
 | |
| 814 | -        return $this->sendCommand('RSET', 'RSET', 250);
 | |
| 815 | - } | |
| 816 | - | |
| 817 | - /** | |
| 818 | - * Send a command to an SMTP server and check its return code. | |
| 819 | - * @param string $command The command name - not sent to the server | |
| 820 | - * @param string $commandstring The actual command to send | |
| 821 | - * @param integer|array $expect One or more expected integer success codes | |
| 822 | - * @access protected | |
| 823 | - * @return boolean True on success. | |
| 824 | - */ | |
| 825 | - protected function sendCommand($command, $commandstring, $expect) | |
| 826 | -    {
 | |
| 827 | -        if (!$this->connected()) {
 | |
| 828 | -            $this->setError("Called $command without being connected");
 | |
| 829 | - return false; | |
| 830 | - } | |
| 831 | - $this->client_send($commandstring . self::CRLF); | |
| 832 | - | |
| 833 | - $this->last_reply = $this->get_lines(); | |
| 834 | - // Fetch SMTP code and possible error code explanation | |
| 835 | - $matches = array(); | |
| 836 | -        if (preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/", $this->last_reply, $matches)) {
 | |
| 837 | - $code = $matches[1]; | |
| 838 | - $code_ex = (count($matches) > 2 ? $matches[2] : null); | |
| 839 | - // Cut off error code from each response line | |
| 840 | - $detail = preg_replace( | |
| 841 | -                "/{$code}[ -]".($code_ex ? str_replace('.', '\\.', $code_ex).' ' : '')."/m",
 | |
| 842 | - '', | |
| 843 | - $this->last_reply | |
| 844 | - ); | |
| 845 | -        } else {
 | |
| 846 | - // Fall back to simple parsing if regex fails | |
| 847 | - $code = substr($this->last_reply, 0, 3); | |
| 848 | - $code_ex = null; | |
| 849 | - $detail = substr($this->last_reply, 4); | |
| 850 | - } | |
| 851 | - | |
| 852 | -        $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);
 | |
| 853 | - | |
| 854 | -        if (!in_array($code, (array)$expect)) {
 | |
| 855 | - $this->setError( | |
| 856 | - "$command command failed", | |
| 857 | - $detail, | |
| 858 | - $code, | |
| 859 | - $code_ex | |
| 860 | - ); | |
| 861 | - $this->edebug( | |
| 862 | - 'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply, | |
| 863 | - self::DEBUG_CLIENT | |
| 864 | - ); | |
| 865 | - return false; | |
| 866 | - } | |
| 867 | - | |
| 868 | -        $this->setError('');
 | |
| 869 | - return true; | |
| 870 | - } | |
| 871 | - | |
| 872 | - /** | |
| 873 | - * Send an SMTP SAML command. | |
| 874 | - * Starts a mail transaction from the email address specified in $from. | |
| 875 | - * Returns true if successful or false otherwise. If True | |
| 876 | - * the mail transaction is started and then one or more recipient | |
| 877 | - * commands may be called followed by a data command. This command | |
| 878 | - * will send the message to the users terminal if they are logged | |
| 879 | - * in and send them an email. | |
| 880 | - * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF> | |
| 881 | - * @param string $from The address the message is from | |
| 882 | - * @access public | |
| 883 | - * @return boolean | |
| 884 | - */ | |
| 885 | - public function sendAndMail($from) | |
| 886 | -    {
 | |
| 887 | -        return $this->sendCommand('SAML', "SAML FROM:$from", 250);
 | |
| 888 | - } | |
| 889 | - | |
| 890 | - /** | |
| 891 | - * Send an SMTP VRFY command. | |
| 892 | - * @param string $name The name to verify | |
| 893 | - * @access public | |
| 894 | - * @return boolean | |
| 895 | - */ | |
| 896 | - public function verify($name) | |
| 897 | -    {
 | |
| 898 | -        return $this->sendCommand('VRFY', "VRFY $name", array(250, 251));
 | |
| 899 | - } | |
| 900 | - | |
| 901 | - /** | |
| 902 | - * Send an SMTP NOOP command. | |
| 903 | - * Used to keep keep-alives alive, doesn't actually do anything | |
| 904 | - * @access public | |
| 905 | - * @return boolean | |
| 906 | - */ | |
| 907 | - public function noop() | |
| 908 | -    {
 | |
| 909 | -        return $this->sendCommand('NOOP', 'NOOP', 250);
 | |
| 910 | - } | |
| 911 | - | |
| 912 | - /** | |
| 913 | - * Send an SMTP TURN command. | |
| 914 | - * This is an optional command for SMTP that this class does not support. | |
| 915 | - * This method is here to make the RFC821 Definition complete for this class | |
| 916 | - * and _may_ be implemented in future | |
| 917 | - * Implements from rfc 821: TURN <CRLF> | |
| 918 | - * @access public | |
| 919 | - * @return boolean | |
| 920 | - */ | |
| 921 | - public function turn() | |
| 922 | -    {
 | |
| 923 | -        $this->setError('The SMTP TURN command is not implemented');
 | |
| 924 | -        $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);
 | |
| 925 | - return false; | |
| 926 | - } | |
| 927 | - | |
| 928 | - /** | |
| 929 | - * Send raw data to the server. | |
| 930 | - * @param string $data The data to send | |
| 931 | - * @access public | |
| 932 | - * @return integer|boolean The number of bytes sent to the server or false on error | |
| 933 | - */ | |
| 934 | - public function client_send($data) | |
| 935 | -    {
 | |
| 936 | -        $this->edebug("CLIENT -> SERVER: $data", self::DEBUG_CLIENT);
 | |
| 937 | - return fwrite($this->smtp_conn, $data); | |
| 938 | - } | |
| 939 | - | |
| 940 | - /** | |
| 941 | - * Get the latest error. | |
| 942 | - * @access public | |
| 943 | - * @return array | |
| 944 | - */ | |
| 945 | - public function getError() | |
| 946 | -    {
 | |
| 947 | - return $this->error; | |
| 948 | - } | |
| 949 | - | |
| 950 | - /** | |
| 951 | - * Get SMTP extensions available on the server | |
| 952 | - * @access public | |
| 953 | - * @return array|null | |
| 954 | - */ | |
| 955 | - public function getServerExtList() | |
| 956 | -    {
 | |
| 957 | - return $this->server_caps; | |
| 958 | - } | |
| 959 | - | |
| 960 | - /** | |
| 961 | - * A multipurpose method | |
| 962 | - * The method works in three ways, dependent on argument value and current state | |
| 963 | - * 1. HELO/EHLO was not sent - returns null and set up $this->error | |
| 964 | - * 2. HELO was sent | |
| 965 | - * $name = 'HELO': returns server name | |
| 966 | - * $name = 'EHLO': returns boolean false | |
| 967 | - * $name = any string: returns null and set up $this->error | |
| 968 | - * 3. EHLO was sent | |
| 969 | - * $name = 'HELO'|'EHLO': returns server name | |
| 970 | - * $name = any string: if extension $name exists, returns boolean True | |
| 971 | - * or its options. Otherwise returns boolean False | |
| 972 | - * In other words, one can use this method to detect 3 conditions: | |
| 973 | - * - null returned: handshake was not or we don't know about ext (refer to $this->error) | |
| 974 | - * - false returned: the requested feature exactly not exists | |
| 975 | - * - positive value returned: the requested feature exists | |
| 976 | - * @param string $name Name of SMTP extension or 'HELO'|'EHLO' | |
| 977 | - * @return mixed | |
| 978 | - */ | |
| 979 | - public function getServerExt($name) | |
| 980 | -    {
 | |
| 981 | -        if (!$this->server_caps) {
 | |
| 982 | -            $this->setError('No HELO/EHLO was sent');
 | |
| 983 | - return null; | |
| 984 | - } | |
| 985 | - | |
| 986 | - // the tight logic knot ;) | |
| 987 | -        if (!array_key_exists($name, $this->server_caps)) {
 | |
| 988 | -            if ($name == 'HELO') {
 | |
| 989 | - return $this->server_caps['EHLO']; | |
| 990 | - } | |
| 991 | -            if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) {
 | |
| 992 | - return false; | |
| 993 | - } | |
| 994 | -            $this->setError('HELO handshake was used. Client knows nothing about server extensions');
 | |
| 995 | - return null; | |
| 996 | - } | |
| 997 | - | |
| 998 | - return $this->server_caps[$name]; | |
| 999 | - } | |
| 1000 | - | |
| 1001 | - /** | |
| 1002 | - * Get the last reply from the server. | |
| 1003 | - * @access public | |
| 1004 | - * @return string | |
| 1005 | - */ | |
| 1006 | - public function getLastReply() | |
| 1007 | -    {
 | |
| 1008 | - return $this->last_reply; | |
| 1009 | - } | |
| 1010 | - | |
| 1011 | - /** | |
| 1012 | - * Read the SMTP server's response. | |
| 1013 | - * Either before eof or socket timeout occurs on the operation. | |
| 1014 | - * With SMTP we can tell if we have more lines to read if the | |
| 1015 | - * 4th character is '-' symbol. If it is a space then we don't | |
| 1016 | - * need to read anything else. | |
| 1017 | - * @access protected | |
| 1018 | - * @return string | |
| 1019 | - */ | |
| 1020 | - protected function get_lines() | |
| 1021 | -    {
 | |
| 1022 | - // If the connection is bad, give up straight away | |
| 1023 | -        if (!is_resource($this->smtp_conn)) {
 | |
| 1024 | - return ''; | |
| 1025 | - } | |
| 1026 | - $data = ''; | |
| 1027 | - $endtime = 0; | |
| 1028 | - stream_set_timeout($this->smtp_conn, $this->Timeout); | |
| 1029 | -        if ($this->Timelimit > 0) {
 | |
| 1030 | - $endtime = time() + $this->Timelimit; | |
| 1031 | - } | |
| 1032 | -        while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
 | |
| 1033 | - $str = @fgets($this->smtp_conn, 515); | |
| 1034 | -            $this->edebug("SMTP -> get_lines(): \$data was \"$data\"", self::DEBUG_LOWLEVEL);
 | |
| 1035 | -            $this->edebug("SMTP -> get_lines(): \$str is \"$str\"", self::DEBUG_LOWLEVEL);
 | |
| 1036 | - $data .= $str; | |
| 1037 | -            $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL);
 | |
| 1038 | - // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen | |
| 1039 | -            if ((isset($str[3]) and $str[3] == ' ')) {
 | |
| 1040 | - break; | |
| 1041 | - } | |
| 1042 | - // Timed-out? Log and break | |
| 1043 | - $info = stream_get_meta_data($this->smtp_conn); | |
| 1044 | -            if ($info['timed_out']) {
 | |
| 1045 | - $this->edebug( | |
| 1046 | -                    'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)',
 | |
| 1047 | - self::DEBUG_LOWLEVEL | |
| 1048 | - ); | |
| 1049 | - break; | |
| 1050 | - } | |
| 1051 | - // Now check if reads took too long | |
| 1052 | -            if ($endtime and time() > $endtime) {
 | |
| 1053 | - $this->edebug( | |
| 1054 | -                    'SMTP -> get_lines(): timelimit reached ('.
 | |
| 1055 | - $this->Timelimit . ' sec)', | |
| 1056 | - self::DEBUG_LOWLEVEL | |
| 1057 | - ); | |
| 1058 | - break; | |
| 1059 | - } | |
| 1060 | - } | |
| 1061 | - return $data; | |
| 1062 | - } | |
| 1063 | - | |
| 1064 | - /** | |
| 1065 | - * Enable or disable VERP address generation. | |
| 1066 | - * @param boolean $enabled | |
| 1067 | - */ | |
| 1068 | - public function setVerp($enabled = false) | |
| 1069 | -    {
 | |
| 1070 | - $this->do_verp = $enabled; | |
| 1071 | - } | |
| 1072 | - | |
| 1073 | - /** | |
| 1074 | - * Get VERP address generation mode. | |
| 1075 | - * @return boolean | |
| 1076 | - */ | |
| 1077 | - public function getVerp() | |
| 1078 | -    {
 | |
| 1079 | - return $this->do_verp; | |
| 1080 | - } | |
| 1081 | - | |
| 1082 | - /** | |
| 1083 | - * Set error messages and codes. | |
| 1084 | - * @param string $message The error message | |
| 1085 | - * @param string $detail Further detail on the error | |
| 1086 | - * @param string $smtp_code An associated SMTP error code | |
| 1087 | - * @param string $smtp_code_ex Extended SMTP code | |
| 1088 | - */ | |
| 1089 | - protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '') | |
| 1090 | -    {
 | |
| 1091 | - $this->error = array( | |
| 1092 | - 'error' => $message, | |
| 1093 | - 'detail' => $detail, | |
| 1094 | - 'smtp_code' => $smtp_code, | |
| 1095 | - 'smtp_code_ex' => $smtp_code_ex | |
| 1096 | - ); | |
| 1097 | - } | |
| 1098 | - | |
| 1099 | - /** | |
| 1100 | - * Set debug output method. | |
| 1101 | - * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it. | |
| 1102 | - */ | |
| 1103 | - public function setDebugOutput($method = 'echo') | |
| 1104 | -    {
 | |
| 1105 | - $this->Debugoutput = $method; | |
| 1106 | - } | |
| 1107 | - | |
| 1108 | - /** | |
| 1109 | - * Get debug output method. | |
| 1110 | - * @return string | |
| 1111 | - */ | |
| 1112 | - public function getDebugOutput() | |
| 1113 | -    {
 | |
| 1114 | - return $this->Debugoutput; | |
| 1115 | - } | |
| 1116 | - | |
| 1117 | - /** | |
| 1118 | - * Set debug output level. | |
| 1119 | - * @param integer $level | |
| 1120 | - */ | |
| 1121 | - public function setDebugLevel($level = 0) | |
| 1122 | -    {
 | |
| 1123 | - $this->do_debug = $level; | |
| 1124 | - } | |
| 1125 | - | |
| 1126 | - /** | |
| 1127 | - * Get debug output level. | |
| 1128 | - * @return integer | |
| 1129 | - */ | |
| 1130 | - public function getDebugLevel() | |
| 1131 | -    {
 | |
| 1132 | - return $this->do_debug; | |
| 1133 | - } | |
| 1134 | - | |
| 1135 | - /** | |
| 1136 | - * Set SMTP timeout. | |
| 1137 | - * @param integer $timeout | |
| 1138 | - */ | |
| 1139 | - public function setTimeout($timeout = 0) | |
| 1140 | -    {
 | |
| 1141 | - $this->Timeout = $timeout; | |
| 1142 | - } | |
| 1143 | - | |
| 1144 | - /** | |
| 1145 | - * Get SMTP timeout. | |
| 1146 | - * @return integer | |
| 1147 | - */ | |
| 1148 | - public function getTimeout() | |
| 1149 | -    {
 | |
| 1150 | - return $this->Timeout; | |
| 1151 | - } | |
| 623 | + $field = substr($lines[0], 0, strpos($lines[0], ':')); | |
| 624 | + $in_headers = false; | |
| 625 | +		if (!empty($field) && strpos($field, ' ') === false) {
 | |
| 626 | + $in_headers = true; | |
| 627 | + } | |
| 628 | + | |
| 629 | +		foreach ($lines as $line) {
 | |
| 630 | + $lines_out = array(); | |
| 631 | +			if ($in_headers and $line == '') {
 | |
| 632 | + $in_headers = false; | |
| 633 | + } | |
| 634 | + //Break this line up into several smaller lines if it's too long | |
| 635 | + //Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len), | |
| 636 | +			while (isset($line[self::MAX_LINE_LENGTH])) {
 | |
| 637 | + //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on | |
| 638 | + //so as to avoid breaking in the middle of a word | |
| 639 | + $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' '); | |
| 640 | + //Deliberately matches both false and 0 | |
| 641 | +				if (!$pos) {
 | |
| 642 | + //No nice break found, add a hard break | |
| 643 | + $pos = self::MAX_LINE_LENGTH - 1; | |
| 644 | + $lines_out[] = substr($line, 0, $pos); | |
| 645 | + $line = substr($line, $pos); | |
| 646 | +				} else {
 | |
| 647 | + //Break at the found point | |
| 648 | + $lines_out[] = substr($line, 0, $pos); | |
| 649 | + //Move along by the amount we dealt with | |
| 650 | + $line = substr($line, $pos + 1); | |
| 651 | + } | |
| 652 | + //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1 | |
| 653 | +				if ($in_headers) {
 | |
| 654 | + $line = "\t" . $line; | |
| 655 | + } | |
| 656 | + } | |
| 657 | + $lines_out[] = $line; | |
| 658 | + | |
| 659 | + //Send the lines to the server | |
| 660 | +			foreach ($lines_out as $line_out) {
 | |
| 661 | + //RFC2821 section 4.5.2 | |
| 662 | +				if (!empty($line_out) and $line_out[0] == '.') {
 | |
| 663 | + $line_out = '.' . $line_out; | |
| 664 | + } | |
| 665 | + $this->client_send($line_out . self::CRLF); | |
| 666 | + } | |
| 667 | + } | |
| 668 | + | |
| 669 | + //Message data has been sent, complete the command | |
| 670 | + //Increase timelimit for end of DATA command | |
| 671 | + $savetimelimit = $this->Timelimit; | |
| 672 | + $this->Timelimit = $this->Timelimit * 2; | |
| 673 | +		$result = $this->sendCommand('DATA END', '.', 250);
 | |
| 674 | + //Restore timelimit | |
| 675 | + $this->Timelimit = $savetimelimit; | |
| 676 | + return $result; | |
| 677 | + } | |
| 678 | + | |
| 679 | + /** | |
| 680 | + * Send an SMTP HELO or EHLO command. | |
| 681 | + * Used to identify the sending server to the receiving server. | |
| 682 | + * This makes sure that client and server are in a known state. | |
| 683 | + * Implements RFC 821: HELO <SP> <domain> <CRLF> | |
| 684 | + * and RFC 2821 EHLO. | |
| 685 | + * @param string $host The host name or IP to connect to | |
| 686 | + * @access public | |
| 687 | + * @return boolean | |
| 688 | + */ | |
| 689 | + public function hello($host = '') | |
| 690 | +	{
 | |
| 691 | + //Try extended hello first (RFC 2821) | |
| 692 | +		return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host));
 | |
| 693 | + } | |
| 694 | + | |
| 695 | + /** | |
| 696 | + * Send an SMTP HELO or EHLO command. | |
| 697 | + * Low-level implementation used by hello() | |
| 698 | + * @see hello() | |
| 699 | + * @param string $hello The HELO string | |
| 700 | + * @param string $host The hostname to say we are | |
| 701 | + * @access protected | |
| 702 | + * @return boolean | |
| 703 | + */ | |
| 704 | + protected function sendHello($hello, $host) | |
| 705 | +	{
 | |
| 706 | + $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250); | |
| 707 | + $this->helo_rply = $this->last_reply; | |
| 708 | +		if ($noerror) {
 | |
| 709 | + $this->parseHelloFields($hello); | |
| 710 | +		} else {
 | |
| 711 | + $this->server_caps = null; | |
| 712 | + } | |
| 713 | + return $noerror; | |
| 714 | + } | |
| 715 | + | |
| 716 | + /** | |
| 717 | + * Parse a reply to HELO/EHLO command to discover server extensions. | |
| 718 | + * In case of HELO, the only parameter that can be discovered is a server name. | |
| 719 | + * @access protected | |
| 720 | + * @param string $type - 'HELO' or 'EHLO' | |
| 721 | + */ | |
| 722 | + protected function parseHelloFields($type) | |
| 723 | +	{
 | |
| 724 | + $this->server_caps = array(); | |
| 725 | +		$lines = explode("\n", $this->last_reply);
 | |
| 726 | +		foreach ($lines as $n => $s) {
 | |
| 727 | + $s = trim(substr($s, 4)); | |
| 728 | +			if (!$s) {
 | |
| 729 | + continue; | |
| 730 | + } | |
| 731 | +			$fields = explode(' ', $s);
 | |
| 732 | +			if (!empty($fields)) {
 | |
| 733 | +				if (!$n) {
 | |
| 734 | + $name = $type; | |
| 735 | + $fields = $fields[0]; | |
| 736 | +				} else {
 | |
| 737 | + $name = array_shift($fields); | |
| 738 | +					if ($name == 'SIZE') {
 | |
| 739 | + $fields = ($fields) ? $fields[0] : 0; | |
| 740 | + } | |
| 741 | + } | |
| 742 | + $this->server_caps[$name] = ($fields ? $fields : true); | |
| 743 | + } | |
| 744 | + } | |
| 745 | + } | |
| 746 | + | |
| 747 | + /** | |
| 748 | + * Send an SMTP MAIL command. | |
| 749 | + * Starts a mail transaction from the email address specified in | |
| 750 | + * $from. Returns true if successful or false otherwise. If True | |
| 751 | + * the mail transaction is started and then one or more recipient | |
| 752 | + * commands may be called followed by a data command. | |
| 753 | + * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF> | |
| 754 | + * @param string $from Source address of this message | |
| 755 | + * @access public | |
| 756 | + * @return boolean | |
| 757 | + */ | |
| 758 | + public function mail($from) | |
| 759 | +	{
 | |
| 760 | + $useVerp = ($this->do_verp ? ' XVERP' : ''); | |
| 761 | + return $this->sendCommand( | |
| 762 | + 'MAIL FROM', | |
| 763 | + 'MAIL FROM:<' . $from . '>' . $useVerp, | |
| 764 | + 250 | |
| 765 | + ); | |
| 766 | + } | |
| 767 | + | |
| 768 | + /** | |
| 769 | + * Send an SMTP QUIT command. | |
| 770 | + * Closes the socket if there is no error or the $close_on_error argument is true. | |
| 771 | + * Implements from rfc 821: QUIT <CRLF> | |
| 772 | + * @param boolean $close_on_error Should the connection close if an error occurs? | |
| 773 | + * @access public | |
| 774 | + * @return boolean | |
| 775 | + */ | |
| 776 | + public function quit($close_on_error = true) | |
| 777 | +	{
 | |
| 778 | +		$noerror = $this->sendCommand('QUIT', 'QUIT', 221);
 | |
| 779 | + $err = $this->error; //Save any error | |
| 780 | +		if ($noerror or $close_on_error) {
 | |
| 781 | + $this->close(); | |
| 782 | + $this->error = $err; //Restore any error from the quit command | |
| 783 | + } | |
| 784 | + return $noerror; | |
| 785 | + } | |
| 786 | + | |
| 787 | + /** | |
| 788 | + * Send an SMTP RCPT command. | |
| 789 | + * Sets the TO argument to $toaddr. | |
| 790 | + * Returns true if the recipient was accepted false if it was rejected. | |
| 791 | + * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF> | |
| 792 | + * @param string $toaddr The address the message is being sent to | |
| 793 | + * @access public | |
| 794 | + * @return boolean | |
| 795 | + */ | |
| 796 | + public function recipient($toaddr) | |
| 797 | +	{
 | |
| 798 | + return $this->sendCommand( | |
| 799 | + 'RCPT TO', | |
| 800 | + 'RCPT TO:<' . $toaddr . '>', | |
| 801 | + array(250, 251) | |
| 802 | + ); | |
| 803 | + } | |
| 804 | + | |
| 805 | + /** | |
| 806 | + * Send an SMTP RSET command. | |
| 807 | + * Abort any transaction that is currently in progress. | |
| 808 | + * Implements rfc 821: RSET <CRLF> | |
| 809 | + * @access public | |
| 810 | + * @return boolean True on success. | |
| 811 | + */ | |
| 812 | + public function reset() | |
| 813 | +	{
 | |
| 814 | +		return $this->sendCommand('RSET', 'RSET', 250);
 | |
| 815 | + } | |
| 816 | + | |
| 817 | + /** | |
| 818 | + * Send a command to an SMTP server and check its return code. | |
| 819 | + * @param string $command The command name - not sent to the server | |
| 820 | + * @param string $commandstring The actual command to send | |
| 821 | + * @param integer|array $expect One or more expected integer success codes | |
| 822 | + * @access protected | |
| 823 | + * @return boolean True on success. | |
| 824 | + */ | |
| 825 | + protected function sendCommand($command, $commandstring, $expect) | |
| 826 | +	{
 | |
| 827 | +		if (!$this->connected()) {
 | |
| 828 | +			$this->setError("Called $command without being connected");
 | |
| 829 | + return false; | |
| 830 | + } | |
| 831 | + $this->client_send($commandstring . self::CRLF); | |
| 832 | + | |
| 833 | + $this->last_reply = $this->get_lines(); | |
| 834 | + // Fetch SMTP code and possible error code explanation | |
| 835 | + $matches = array(); | |
| 836 | +		if (preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/", $this->last_reply, $matches)) {
 | |
| 837 | + $code = $matches[1]; | |
| 838 | + $code_ex = (count($matches) > 2 ? $matches[2] : null); | |
| 839 | + // Cut off error code from each response line | |
| 840 | + $detail = preg_replace( | |
| 841 | +				"/{$code}[ -]".($code_ex ? str_replace('.', '\\.', $code_ex).' ' : '')."/m",
 | |
| 842 | + '', | |
| 843 | + $this->last_reply | |
| 844 | + ); | |
| 845 | +		} else {
 | |
| 846 | + // Fall back to simple parsing if regex fails | |
| 847 | + $code = substr($this->last_reply, 0, 3); | |
| 848 | + $code_ex = null; | |
| 849 | + $detail = substr($this->last_reply, 4); | |
| 850 | + } | |
| 851 | + | |
| 852 | +		$this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);
 | |
| 853 | + | |
| 854 | +		if (!in_array($code, (array)$expect)) {
 | |
| 855 | + $this->setError( | |
| 856 | + "$command command failed", | |
| 857 | + $detail, | |
| 858 | + $code, | |
| 859 | + $code_ex | |
| 860 | + ); | |
| 861 | + $this->edebug( | |
| 862 | + 'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply, | |
| 863 | + self::DEBUG_CLIENT | |
| 864 | + ); | |
| 865 | + return false; | |
| 866 | + } | |
| 867 | + | |
| 868 | +		$this->setError('');
 | |
| 869 | + return true; | |
| 870 | + } | |
| 871 | + | |
| 872 | + /** | |
| 873 | + * Send an SMTP SAML command. | |
| 874 | + * Starts a mail transaction from the email address specified in $from. | |
| 875 | + * Returns true if successful or false otherwise. If True | |
| 876 | + * the mail transaction is started and then one or more recipient | |
| 877 | + * commands may be called followed by a data command. This command | |
| 878 | + * will send the message to the users terminal if they are logged | |
| 879 | + * in and send them an email. | |
| 880 | + * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF> | |
| 881 | + * @param string $from The address the message is from | |
| 882 | + * @access public | |
| 883 | + * @return boolean | |
| 884 | + */ | |
| 885 | + public function sendAndMail($from) | |
| 886 | +	{
 | |
| 887 | +		return $this->sendCommand('SAML', "SAML FROM:$from", 250);
 | |
| 888 | + } | |
| 889 | + | |
| 890 | + /** | |
| 891 | + * Send an SMTP VRFY command. | |
| 892 | + * @param string $name The name to verify | |
| 893 | + * @access public | |
| 894 | + * @return boolean | |
| 895 | + */ | |
| 896 | + public function verify($name) | |
| 897 | +	{
 | |
| 898 | +		return $this->sendCommand('VRFY', "VRFY $name", array(250, 251));
 | |
| 899 | + } | |
| 900 | + | |
| 901 | + /** | |
| 902 | + * Send an SMTP NOOP command. | |
| 903 | + * Used to keep keep-alives alive, doesn't actually do anything | |
| 904 | + * @access public | |
| 905 | + * @return boolean | |
| 906 | + */ | |
| 907 | + public function noop() | |
| 908 | +	{
 | |
| 909 | +		return $this->sendCommand('NOOP', 'NOOP', 250);
 | |
| 910 | + } | |
| 911 | + | |
| 912 | + /** | |
| 913 | + * Send an SMTP TURN command. | |
| 914 | + * This is an optional command for SMTP that this class does not support. | |
| 915 | + * This method is here to make the RFC821 Definition complete for this class | |
| 916 | + * and _may_ be implemented in future | |
| 917 | + * Implements from rfc 821: TURN <CRLF> | |
| 918 | + * @access public | |
| 919 | + * @return boolean | |
| 920 | + */ | |
| 921 | + public function turn() | |
| 922 | +	{
 | |
| 923 | +		$this->setError('The SMTP TURN command is not implemented');
 | |
| 924 | +		$this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);
 | |
| 925 | + return false; | |
| 926 | + } | |
| 927 | + | |
| 928 | + /** | |
| 929 | + * Send raw data to the server. | |
| 930 | + * @param string $data The data to send | |
| 931 | + * @access public | |
| 932 | + * @return integer|boolean The number of bytes sent to the server or false on error | |
| 933 | + */ | |
| 934 | + public function client_send($data) | |
| 935 | +	{
 | |
| 936 | +		$this->edebug("CLIENT -> SERVER: $data", self::DEBUG_CLIENT);
 | |
| 937 | + return fwrite($this->smtp_conn, $data); | |
| 938 | + } | |
| 939 | + | |
| 940 | + /** | |
| 941 | + * Get the latest error. | |
| 942 | + * @access public | |
| 943 | + * @return array | |
| 944 | + */ | |
| 945 | + public function getError() | |
| 946 | +	{
 | |
| 947 | + return $this->error; | |
| 948 | + } | |
| 949 | + | |
| 950 | + /** | |
| 951 | + * Get SMTP extensions available on the server | |
| 952 | + * @access public | |
| 953 | + * @return array|null | |
| 954 | + */ | |
| 955 | + public function getServerExtList() | |
| 956 | +	{
 | |
| 957 | + return $this->server_caps; | |
| 958 | + } | |
| 959 | + | |
| 960 | + /** | |
| 961 | + * A multipurpose method | |
| 962 | + * The method works in three ways, dependent on argument value and current state | |
| 963 | + * 1. HELO/EHLO was not sent - returns null and set up $this->error | |
| 964 | + * 2. HELO was sent | |
| 965 | + * $name = 'HELO': returns server name | |
| 966 | + * $name = 'EHLO': returns boolean false | |
| 967 | + * $name = any string: returns null and set up $this->error | |
| 968 | + * 3. EHLO was sent | |
| 969 | + * $name = 'HELO'|'EHLO': returns server name | |
| 970 | + * $name = any string: if extension $name exists, returns boolean True | |
| 971 | + * or its options. Otherwise returns boolean False | |
| 972 | + * In other words, one can use this method to detect 3 conditions: | |
| 973 | + * - null returned: handshake was not or we don't know about ext (refer to $this->error) | |
| 974 | + * - false returned: the requested feature exactly not exists | |
| 975 | + * - positive value returned: the requested feature exists | |
| 976 | + * @param string $name Name of SMTP extension or 'HELO'|'EHLO' | |
| 977 | + * @return mixed | |
| 978 | + */ | |
| 979 | + public function getServerExt($name) | |
| 980 | +	{
 | |
| 981 | +		if (!$this->server_caps) {
 | |
| 982 | +			$this->setError('No HELO/EHLO was sent');
 | |
| 983 | + return null; | |
| 984 | + } | |
| 985 | + | |
| 986 | + // the tight logic knot ;) | |
| 987 | +		if (!array_key_exists($name, $this->server_caps)) {
 | |
| 988 | +			if ($name == 'HELO') {
 | |
| 989 | + return $this->server_caps['EHLO']; | |
| 990 | + } | |
| 991 | +			if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) {
 | |
| 992 | + return false; | |
| 993 | + } | |
| 994 | +			$this->setError('HELO handshake was used. Client knows nothing about server extensions');
 | |
| 995 | + return null; | |
| 996 | + } | |
| 997 | + | |
| 998 | + return $this->server_caps[$name]; | |
| 999 | + } | |
| 1000 | + | |
| 1001 | + /** | |
| 1002 | + * Get the last reply from the server. | |
| 1003 | + * @access public | |
| 1004 | + * @return string | |
| 1005 | + */ | |
| 1006 | + public function getLastReply() | |
| 1007 | +	{
 | |
| 1008 | + return $this->last_reply; | |
| 1009 | + } | |
| 1010 | + | |
| 1011 | + /** | |
| 1012 | + * Read the SMTP server's response. | |
| 1013 | + * Either before eof or socket timeout occurs on the operation. | |
| 1014 | + * With SMTP we can tell if we have more lines to read if the | |
| 1015 | + * 4th character is '-' symbol. If it is a space then we don't | |
| 1016 | + * need to read anything else. | |
| 1017 | + * @access protected | |
| 1018 | + * @return string | |
| 1019 | + */ | |
| 1020 | + protected function get_lines() | |
| 1021 | +	{
 | |
| 1022 | + // If the connection is bad, give up straight away | |
| 1023 | +		if (!is_resource($this->smtp_conn)) {
 | |
| 1024 | + return ''; | |
| 1025 | + } | |
| 1026 | + $data = ''; | |
| 1027 | + $endtime = 0; | |
| 1028 | + stream_set_timeout($this->smtp_conn, $this->Timeout); | |
| 1029 | +		if ($this->Timelimit > 0) {
 | |
| 1030 | + $endtime = time() + $this->Timelimit; | |
| 1031 | + } | |
| 1032 | +		while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
 | |
| 1033 | + $str = @fgets($this->smtp_conn, 515); | |
| 1034 | +			$this->edebug("SMTP -> get_lines(): \$data was \"$data\"", self::DEBUG_LOWLEVEL);
 | |
| 1035 | +			$this->edebug("SMTP -> get_lines(): \$str is \"$str\"", self::DEBUG_LOWLEVEL);
 | |
| 1036 | + $data .= $str; | |
| 1037 | +			$this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL);
 | |
| 1038 | + // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen | |
| 1039 | +			if ((isset($str[3]) and $str[3] == ' ')) {
 | |
| 1040 | + break; | |
| 1041 | + } | |
| 1042 | + // Timed-out? Log and break | |
| 1043 | + $info = stream_get_meta_data($this->smtp_conn); | |
| 1044 | +			if ($info['timed_out']) {
 | |
| 1045 | + $this->edebug( | |
| 1046 | +					'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)',
 | |
| 1047 | + self::DEBUG_LOWLEVEL | |
| 1048 | + ); | |
| 1049 | + break; | |
| 1050 | + } | |
| 1051 | + // Now check if reads took too long | |
| 1052 | +			if ($endtime and time() > $endtime) {
 | |
| 1053 | + $this->edebug( | |
| 1054 | +					'SMTP -> get_lines(): timelimit reached ('.
 | |
| 1055 | + $this->Timelimit . ' sec)', | |
| 1056 | + self::DEBUG_LOWLEVEL | |
| 1057 | + ); | |
| 1058 | + break; | |
| 1059 | + } | |
| 1060 | + } | |
| 1061 | + return $data; | |
| 1062 | + } | |
| 1063 | + | |
| 1064 | + /** | |
| 1065 | + * Enable or disable VERP address generation. | |
| 1066 | + * @param boolean $enabled | |
| 1067 | + */ | |
| 1068 | + public function setVerp($enabled = false) | |
| 1069 | +	{
 | |
| 1070 | + $this->do_verp = $enabled; | |
| 1071 | + } | |
| 1072 | + | |
| 1073 | + /** | |
| 1074 | + * Get VERP address generation mode. | |
| 1075 | + * @return boolean | |
| 1076 | + */ | |
| 1077 | + public function getVerp() | |
| 1078 | +	{
 | |
| 1079 | + return $this->do_verp; | |
| 1080 | + } | |
| 1081 | + | |
| 1082 | + /** | |
| 1083 | + * Set error messages and codes. | |
| 1084 | + * @param string $message The error message | |
| 1085 | + * @param string $detail Further detail on the error | |
| 1086 | + * @param string $smtp_code An associated SMTP error code | |
| 1087 | + * @param string $smtp_code_ex Extended SMTP code | |
| 1088 | + */ | |
| 1089 | + protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '') | |
| 1090 | +	{
 | |
| 1091 | + $this->error = array( | |
| 1092 | + 'error' => $message, | |
| 1093 | + 'detail' => $detail, | |
| 1094 | + 'smtp_code' => $smtp_code, | |
| 1095 | + 'smtp_code_ex' => $smtp_code_ex | |
| 1096 | + ); | |
| 1097 | + } | |
| 1098 | + | |
| 1099 | + /** | |
| 1100 | + * Set debug output method. | |
| 1101 | + * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it. | |
| 1102 | + */ | |
| 1103 | + public function setDebugOutput($method = 'echo') | |
| 1104 | +	{
 | |
| 1105 | + $this->Debugoutput = $method; | |
| 1106 | + } | |
| 1107 | + | |
| 1108 | + /** | |
| 1109 | + * Get debug output method. | |
| 1110 | + * @return string | |
| 1111 | + */ | |
| 1112 | + public function getDebugOutput() | |
| 1113 | +	{
 | |
| 1114 | + return $this->Debugoutput; | |
| 1115 | + } | |
| 1116 | + | |
| 1117 | + /** | |
| 1118 | + * Set debug output level. | |
| 1119 | + * @param integer $level | |
| 1120 | + */ | |
| 1121 | + public function setDebugLevel($level = 0) | |
| 1122 | +	{
 | |
| 1123 | + $this->do_debug = $level; | |
| 1124 | + } | |
| 1125 | + | |
| 1126 | + /** | |
| 1127 | + * Get debug output level. | |
| 1128 | + * @return integer | |
| 1129 | + */ | |
| 1130 | + public function getDebugLevel() | |
| 1131 | +	{
 | |
| 1132 | + return $this->do_debug; | |
| 1133 | + } | |
| 1134 | + | |
| 1135 | + /** | |
| 1136 | + * Set SMTP timeout. | |
| 1137 | + * @param integer $timeout | |
| 1138 | + */ | |
| 1139 | + public function setTimeout($timeout = 0) | |
| 1140 | +	{
 | |
| 1141 | + $this->Timeout = $timeout; | |
| 1142 | + } | |
| 1143 | + | |
| 1144 | + /** | |
| 1145 | + * Get SMTP timeout. | |
| 1146 | + * @return integer | |
| 1147 | + */ | |
| 1148 | + public function getTimeout() | |
| 1149 | +	{
 | |
| 1150 | + return $this->Timeout; | |
| 1151 | + } | |
| 1152 | 1152 | } | 
| 1153 | 1153 | \ No newline at end of file | 
| @@ -174,6 +174,10 @@ discard block | ||
| 174 | 174 | return trim($test); | 
| 175 | 175 | } | 
| 176 | 176 | |
| 177 | + /** | |
| 178 | + * @param string $monitorType | |
| 179 | + * @param boolean $isBlocked | |
| 180 | + */ | |
| 177 | 181 |  	public static function logBlockListStats($server, $monitorType, $isBlocked){ | 
| 178 | 182 | if(Setup::$settings['log_rbl_stats']==0) return true; | 
| 179 | 183 | $mysql = new _MySQL(); | 
| @@ -403,6 +407,12 @@ discard block | ||
| 403 | 407 | ); | 
| 404 | 408 | } | 
| 405 | 409 | |
| 410 | + /** | |
| 411 | + * @param string $host | |
| 412 | + * @param boolean $isBlocked | |
| 413 | + * @param string $rDNS | |
| 414 | + * @param string $status | |
| 415 | + */ | |
| 406 | 416 |  	public static function makeAPICallback($url, $host, $isBlocked, $rDNS, $status){ | 
| 407 | 417 | if(substr($url,0,4)!='http') return false; | 
| 408 | 418 | |
| @@ -438,6 +448,10 @@ discard block | ||
| 438 | 448 | return false; | 
| 439 | 449 | } | 
| 440 | 450 | |
| 451 | + /** | |
| 452 | + * @param string $beginText | |
| 453 | + * @param string $endText | |
| 454 | + */ | |
| 441 | 455 | public static function parseBetweenText( | 
| 442 | 456 | $text, | 
| 443 | 457 | $beginText, | 
| @@ -471,6 +485,11 @@ discard block | ||
| 471 | 485 | return ($firstResultOnlyNoArray && empty($results) ? '' : $results); | 
| 472 | 486 | } | 
| 473 | 487 | |
| 488 | + /** | |
| 489 | + * @param _MySQL $mysql | |
| 490 | + * | |
| 491 | + * @return string | |
| 492 | + */ | |
| 474 | 493 |  	public static function getNextMonitor($mysql){ | 
| 475 | 494 |  		$ipDomain = $mysql->runQueryReturnVar("select ipDomain from monitors where beenChecked = 0"); | 
| 476 | 495 |  		$mysql->runQuery("update monitors set beenChecked = 1 where ipDomain = '".$mysql->escape($ipDomain)."'"); | 
| @@ -518,6 +537,9 @@ discard block | ||
| 518 | 537 | } | 
| 519 | 538 | } | 
| 520 | 539 | |
| 540 | + /** | |
| 541 | + * @param string $command | |
| 542 | + */ | |
| 521 | 543 |  	public static function run_in_background($command, $priority = 0) { | 
| 522 | 544 | $log = Setup::$settings['log_path']; | 
| 523 | 545 |  		if($priority !=0){ | 
| @@ -32,7 +32,7 @@ discard block | ||
| 32 | 32 |  		while($row = mysqli_fetch_array($rs, MYSQL_ASSOC)){ | 
| 33 | 33 |  			if($row['monitorType']=='ip'){ | 
| 34 | 34 | $cacheData['ips'][] = $row['host']; | 
| 35 | -			}else{ | |
| 35 | +			} else{ | |
| 36 | 36 | $cacheData['domains'][] = $row['host']; | 
| 37 | 37 | } | 
| 38 | 38 | } | 
| @@ -58,20 +58,20 @@ discard block | ||
| 58 | 58 |  				if($r!='') { | 
| 59 | 59 | self::$isBlocked = 1; | 
| 60 | 60 | self::logBlockListStats($server, 'ip', true); | 
| 61 | -				}else{ | |
| 61 | +				} else{ | |
| 62 | 62 | self::logBlockListStats($server, 'ip', false); | 
| 63 | 63 | } | 
| 64 | 64 |  				if($r!='' || $reportClean==true) { | 
| 65 | 65 | $return[] = array(trim($server),$r); | 
| 66 | 66 | } | 
| 67 | 67 | } | 
| 68 | -		}else{ | |
| 68 | +		} else{ | |
| 69 | 69 |  			foreach(self::$domainBlacklists as $server){ | 
| 70 | 70 | $r = self::domainCheck($domainOrIp, $server); | 
| 71 | 71 |  				if($r!='') { | 
| 72 | 72 | self::$isBlocked = 1; | 
| 73 | 73 | self::logBlockListStats($server, 'domain', true); | 
| 74 | -				}else{ | |
| 74 | +				} else{ | |
| 75 | 75 | self::logBlockListStats($server, 'domain', false); | 
| 76 | 76 | } | 
| 77 | 77 |  				if($r!='' || $reportClean==true) { | 
| @@ -113,17 +113,23 @@ discard block | ||
| 113 | 113 |  				$testArray = explode("\t", $test); | 
| 114 | 114 | $test = end($testArray); | 
| 115 | 115 |  				$test = str_replace(array('\'','"'),'',$test); | 
| 116 | -			}else{ | |
| 116 | +			} else{ | |
| 117 | 117 | $test = 'blocked'; | 
| 118 | 118 | } | 
| 119 | 119 | } | 
| 120 | - if(strripos($test,'not found')!==false) return ''; | |
| 121 | - if(strripos($test,'SERVFAIL')!==false) return ''; | |
| 120 | +		if(strripos($test,'not found')!==false) { | |
| 121 | + return ''; | |
| 122 | + } | |
| 123 | +		if(strripos($test,'SERVFAIL')!==false) { | |
| 124 | + return ''; | |
| 125 | + } | |
| 122 | 126 | return trim($test); | 
| 123 | 127 | } | 
| 124 | 128 | |
| 125 | 129 |  	public static function ipCheck($ip, $server){ | 
| 126 | - if(_IpAddresses::isIPAddress($ip)===false) return ''; | |
| 130 | +		if(_IpAddresses::isIPAddress($ip)===false) { | |
| 131 | + return ''; | |
| 132 | + } | |
| 127 | 133 | $server = trim($server); | 
| 128 | 134 | |
| 129 | 135 |  		$parts = explode('.', $ip); | 
| @@ -164,23 +170,31 @@ discard block | ||
| 164 | 170 | $test = (isset($a[1])) ? 'Listed ' . $a[1] : $test2; | 
| 165 | 171 | break; | 
| 166 | 172 | } | 
| 167 | - if($test2!='') $test = $test2; | |
| 168 | -			}else{ | |
| 173 | +				if($test2!='') { | |
| 174 | + $test = $test2; | |
| 175 | + } | |
| 176 | +			} else{ | |
| 169 | 177 | $test = 'blocked'; | 
| 170 | 178 | } | 
| 171 | 179 | } | 
| 172 | - if(strripos($test,'not found')!==false) return ''; | |
| 173 | - if(strripos($test,'SERVFAIL')!==false) return ''; | |
| 180 | +		if(strripos($test,'not found')!==false) { | |
| 181 | + return ''; | |
| 182 | + } | |
| 183 | +		if(strripos($test,'SERVFAIL')!==false) { | |
| 184 | + return ''; | |
| 185 | + } | |
| 174 | 186 | return trim($test); | 
| 175 | 187 | } | 
| 176 | 188 | |
| 177 | 189 |  	public static function logBlockListStats($server, $monitorType, $isBlocked){ | 
| 178 | - if(Setup::$settings['log_rbl_stats']==0) return true; | |
| 190 | +		if(Setup::$settings['log_rbl_stats']==0) { | |
| 191 | + return true; | |
| 192 | + } | |
| 179 | 193 | $mysql = new _MySQL(); | 
| 180 | 194 | $mysql->connect(Setup::$connectionArray); | 
| 181 | 195 |  		if($isBlocked){ | 
| 182 | 196 | $sql = "update blockLists set blocksToday=(blocksToday+1), lastBlockReport=now() where host = '".$mysql->escape($server)."' and monitorType = '$monitorType';"; | 
| 183 | -		}else{ | |
| 197 | +		} else{ | |
| 184 | 198 | $sql = "update blockLists set cleanToday=(cleanToday+1) where host = '".$mysql->escape($server)."' and monitorType = '$monitorType';"; | 
| 185 | 199 | } | 
| 186 | 200 | $mysql->runQuery($sql); | 
| @@ -202,7 +216,9 @@ discard block | ||
| 202 | 216 |  	public static function updateDomains($domains, $monitorGroupId){ | 
| 203 | 217 | $domains = trim($domains); | 
| 204 | 218 | $monitorGroupId = (int)$monitorGroupId; | 
| 205 | - if($monitorGroupId===0) return false; | |
| 219 | +		if($monitorGroupId===0) { | |
| 220 | + return false; | |
| 221 | + } | |
| 206 | 222 | $mysql = new _MySQL(); | 
| 207 | 223 | $mysql->connect(Setup::$connectionArray); | 
| 208 | 224 |  		$mysql->runQuery("update monitors set keepOnUpdate = 0 where isDomain = 1 and monitorGroupId = $monitorGroupId"); | 
| @@ -241,7 +257,9 @@ discard block | ||
| 241 | 257 |  	public static function updateIPs($ips, $monitorGroupId){ | 
| 242 | 258 | $ips = trim($ips); | 
| 243 | 259 | $monitorGroupId = (int)$monitorGroupId; | 
| 244 | - if($monitorGroupId===0) return false; | |
| 260 | +		if($monitorGroupId===0) { | |
| 261 | + return false; | |
| 262 | + } | |
| 245 | 263 | $mysql = new _MySQL(); | 
| 246 | 264 | $mysql->connect(Setup::$connectionArray); | 
| 247 | 265 |  		$mysql->runQuery("update monitors set keepOnUpdate = 0 where isDomain = 0 and monitorGroupId = $monitorGroupId"); | 
| @@ -267,16 +285,25 @@ discard block | ||
| 267 | 285 | keepOnUpdate = 1 | 
| 268 | 286 | "); | 
| 269 | 287 | } | 
| 270 | -			}else{ | |
| 288 | +			} else{ | |
| 271 | 289 | //cidr /24's max... | 
| 272 | 290 |  				if(trim($i)!=''){ | 
| 273 | - if(strpos($i, ' ')!==false) continue; | |
| 274 | - if(strpos($i, ':')!==false) continue; | |
| 291 | +					if(strpos($i, ' ')!==false) { | |
| 292 | + continue; | |
| 293 | + } | |
| 294 | +					if(strpos($i, ':')!==false) { | |
| 295 | + continue; | |
| 296 | + } | |
| 275 | 297 | $range = _IpAddresses::cidrToRange($i); | 
| 276 | - if($range===false) continue; | |
| 298 | +					if($range===false) { | |
| 299 | + continue; | |
| 300 | + } | |
| 277 | 301 |  					$start = explode('.', $range[0]); | 
| 278 | 302 |  					$end = explode('.', $range[1]); | 
| 279 | - if($range[0]==0) continue;// starts with 0 | |
| 303 | +					if($range[0]==0) { | |
| 304 | + continue; | |
| 305 | + } | |
| 306 | + // starts with 0 | |
| 280 | 307 |  					for($i = $start[3]; $i <= $end[3]; $i++){ | 
| 281 | 308 |  						$host = "{$start[0]}.{$start[1]}.{$start[2]}.$i"; | 
| 282 | 309 |  						if(_IpAddresses::isIPAddress($host)){ | 
| @@ -308,7 +335,7 @@ discard block | ||
| 308 | 335 |  	public static function isLoggedIn(){ | 
| 309 | 336 |  		if(isset($_SESSION['id']) && (int)$_SESSION['id'] > 0){ | 
| 310 | 337 | return $_SESSION['id']; | 
| 311 | -		}else{ | |
| 338 | +		} else{ | |
| 312 | 339 | return false; | 
| 313 | 340 | } | 
| 314 | 341 | } | 
| @@ -353,7 +380,7 @@ discard block | ||
| 353 | 380 | where "; | 
| 354 | 381 |  		if(trim($apiKey) != ''){ | 
| 355 | 382 | $sql .= " apiKey = '".$mysql->escape($apiKey)."'"; | 
| 356 | -		}else{ | |
| 383 | +		} else{ | |
| 357 | 384 | $sql .= " passwd = '".$mysql->escape(md5($passwd))."' | 
| 358 | 385 | and username = '".$mysql->escape($userName)."'"; | 
| 359 | 386 | } | 
| @@ -369,12 +396,12 @@ discard block | ||
| 369 | 396 |  	public static function lookupHostDNS($host){ | 
| 370 | 397 |  		if(_IpAddresses::isIPAddress($host)){ | 
| 371 | 398 | return _IpAddresses::getHostByIp($host); | 
| 372 | -		}else{ | |
| 399 | +		} else{ | |
| 373 | 400 | $host = escapeshellarg($host); | 
| 374 | 401 |  			exec('host -t a -W 2 '.$host, $output, $return); | 
| 375 | 402 |  			if ($return !== 0) { | 
| 376 | 403 | return ''; | 
| 377 | -			}else{ | |
| 404 | +			} else{ | |
| 378 | 405 | $output = implode($output); | 
| 379 | 406 | $ips = _IpAddresses::getAllIPsFromString($output, true); | 
| 380 | 407 | $ir = ""; | 
| @@ -404,7 +431,9 @@ discard block | ||
| 404 | 431 | } | 
| 405 | 432 | |
| 406 | 433 |  	public static function makeAPICallback($url, $host, $isBlocked, $rDNS, $status){ | 
| 407 | - if(substr($url,0,4)!='http') return false; | |
| 434 | +		if(substr($url,0,4)!='http') { | |
| 435 | + return false; | |
| 436 | + } | |
| 408 | 437 | |
| 409 | 438 | $vars = json_encode( | 
| 410 | 439 | array( | 
| @@ -424,7 +453,9 @@ discard block | ||
| 424 | 453 | curl_setopt($ch,CURLOPT_POSTFIELDS,$vars); | 
| 425 | 454 |  			curl_setopt($ch,CURLOPT_HTTPHEADER, array('Content-Type: application/json'));  | 
| 426 | 455 | curl_exec($ch); | 
| 427 | - if (curl_errno($ch)) $err = false; | |
| 456 | +			if (curl_errno($ch)) { | |
| 457 | + $err = false; | |
| 458 | + } | |
| 428 | 459 |  		} catch (Exception $e) { | 
| 429 | 460 | $err = false; | 
| 430 | 461 | } | 
| @@ -449,10 +480,14 @@ discard block | ||
| 449 | 480 | $endPos = 0; | 
| 450 | 481 |  		while(true) { | 
| 451 | 482 | $beginPos = stripos($text, $beginText, $endPos); | 
| 452 | - if($beginPos===false) break; | |
| 483 | +				if($beginPos===false) { | |
| 484 | + break; | |
| 485 | + } | |
| 453 | 486 | $beginPos = $beginPos+strlen($beginText); | 
| 454 | 487 | $endPos = stripos($text, $endText, $beginPos); | 
| 455 | - if($endPos===false) break; | |
| 488 | +				if($endPos===false) { | |
| 489 | + break; | |
| 490 | + } | |
| 456 | 491 | $result = substr($text, $beginPos, $endPos-$beginPos); | 
| 457 | 492 |  				if($removeSpace){ | 
| 458 | 493 |  						$result = str_replace("\t","",$result); | 
| @@ -465,8 +500,12 @@ discard block | ||
| 465 | 500 |  				if($removeHtmlTags){ | 
| 466 | 501 | $result = strip_tags($result); | 
| 467 | 502 | } | 
| 468 | - if($firstResultOnlyNoArray) return $result; | |
| 469 | - if($result != '') $results[] = $result; | |
| 503 | +				if($firstResultOnlyNoArray) { | |
| 504 | + return $result; | |
| 505 | + } | |
| 506 | +				if($result != '') { | |
| 507 | + $results[] = $result; | |
| 508 | + } | |
| 470 | 509 | } | 
| 471 | 510 | return ($firstResultOnlyNoArray && empty($results) ? '' : $results); | 
| 472 | 511 | } | 
| @@ -480,40 +519,54 @@ discard block | ||
| 480 | 519 |  	public static function getHostChangeCount($mysql, $monitorGroupId = 0) { | 
| 481 | 520 | $sql = ''; | 
| 482 | 521 | $monitorGroupId = (int)$monitorGroupId; | 
| 483 | - if($monitorGroupId > 0) $sql = " and monitorGroupId = $monitorGroupId"; | |
| 522 | +		if($monitorGroupId > 0) { | |
| 523 | + $sql = " and monitorGroupId = $monitorGroupId"; | |
| 524 | + } | |
| 484 | 525 |  		return $mysql->runQueryReturnVar("select COALESCE(count(ipDomain),0) as cnt from monitors where lastStatusChanged = 1 $sql"); | 
| 485 | 526 | } | 
| 486 | 527 | |
| 487 | 528 |  	public static function getHostErrorCount($mysql, $monitorGroupId = 0, $onlyNew = false) { | 
| 488 | 529 | $sql = ''; | 
| 489 | 530 | $monitorGroupId = (int)$monitorGroupId; | 
| 490 | - if($monitorGroupId > 0) $sql = " and monitorGroupId = $monitorGroupId"; | |
| 491 | - if($onlyNew) $sql .= " and lastStatusChanged = 1 "; | |
| 531 | +		if($monitorGroupId > 0) { | |
| 532 | + $sql = " and monitorGroupId = $monitorGroupId"; | |
| 533 | + } | |
| 534 | +		if($onlyNew) { | |
| 535 | + $sql .= " and lastStatusChanged = 1 "; | |
| 536 | + } | |
| 492 | 537 |  		return $mysql->runQueryReturnVar("select COALESCE(count(ipDomain),0) as cnt from monitors where isBlocked = 1 $sql"); | 
| 493 | 538 | } | 
| 494 | 539 | |
| 495 | 540 |  	public static function getHostCleanCount($mysql, $monitorGroupId = 0, $onlyNew = false) { | 
| 496 | 541 | $sql = ''; | 
| 497 | 542 | $monitorGroupId = (int)$monitorGroupId; | 
| 498 | - if($monitorGroupId > 0) $sql = " and monitorGroupId = $monitorGroupId"; | |
| 499 | - if($onlyNew) $sql .= " and lastStatusChanged = 1 "; | |
| 543 | +		if($monitorGroupId > 0) { | |
| 544 | + $sql = " and monitorGroupId = $monitorGroupId"; | |
| 545 | + } | |
| 546 | +		if($onlyNew) { | |
| 547 | + $sql .= " and lastStatusChanged = 1 "; | |
| 548 | + } | |
| 500 | 549 |  		return $mysql->runQueryReturnVar("select COALESCE(count(ipDomain),0) as cnt from monitors where isBlocked = 0 $sql"); | 
| 501 | 550 | } | 
| 502 | 551 | |
| 503 | 552 |  	public static function getHostCount($mysql, $monitorGroupId = 0) { | 
| 504 | 553 | $sql = ''; | 
| 505 | 554 | $monitorGroupId = (int)$monitorGroupId; | 
| 506 | - if($monitorGroupId > 0) $sql = " where monitorGroupId = $monitorGroupId"; | |
| 555 | +		if($monitorGroupId > 0) { | |
| 556 | + $sql = " where monitorGroupId = $monitorGroupId"; | |
| 557 | + } | |
| 507 | 558 |  		return $mysql->runQueryReturnVar("select COALESCE(count(ipDomain),0) as cnt from monitors $sql"); | 
| 508 | 559 | } | 
| 509 | 560 | |
| 510 | 561 | //CREDIT: http://braincrafted.com/php-background-processes/ | 
| 511 | 562 |  	public static function is_process_running($pid){ | 
| 512 | 563 | $pid = (int)$pid; | 
| 513 | - if($pid == 0) return false; | |
| 564 | +		if($pid == 0) { | |
| 565 | + return false; | |
| 566 | + } | |
| 514 | 567 |  		if(file_exists('/proc/'.$pid)){ | 
| 515 | 568 | return true; | 
| 516 | -		}else{ | |
| 569 | +		} else{ | |
| 517 | 570 | return false; | 
| 518 | 571 | } | 
| 519 | 572 | } | 
| @@ -522,7 +575,7 @@ discard block | ||
| 522 | 575 | $log = Setup::$settings['log_path']; | 
| 523 | 576 |  		if($priority !=0){ | 
| 524 | 577 |  			$pid = shell_exec("nohup nice -n $priority $command >> $log 2>&1 & echo $!"); | 
| 525 | -		}else{ | |
| 578 | +		} else{ | |
| 526 | 579 |  			$pid = shell_exec("nohup $command >> $log 2>&1 & echo $!"); | 
| 527 | 580 | } | 
| 528 | 581 | return($pid); | 
| @@ -12,12 +12,12 @@ discard block | ||
| 12 | 12 |  	public static $frequencyCheckOptions = array('1hour', '2hour', '8hour', 'daily', 'weekly'); | 
| 13 | 13 | public static $mysql = false; | 
| 14 | 14 | |
| 15 | -	public static function setBlockLists(){ | |
| 15 | +	public static function setBlockLists() { | |
| 16 | 16 |  		$localCache = new _FileCache('blacklistmonitor-Utilities-BlockLists', 60); | 
| 17 | 17 | $cacheKey = 'bl'; | 
| 18 | 18 | $cacheData = $localCache->get($cacheKey); | 
| 19 | -		if ($cacheData !== false) { | |
| 20 | -			if(isset($cacheData['domains']) && isset($cacheData['ips']) ) { | |
| 19 | +		if ($cacheData!==false) { | |
| 20 | +			if (isset($cacheData['domains']) && isset($cacheData['ips'])) { | |
| 21 | 21 | self::$domainBlacklists = $cacheData['domains']; | 
| 22 | 22 | self::$ipBlacklists = $cacheData['ips']; | 
| 23 | 23 | return true; | 
| @@ -29,10 +29,10 @@ discard block | ||
| 29 | 29 | $rs = $mysql->runQuery($sql); | 
| 30 | 30 | $cacheData['domains'] = array(); | 
| 31 | 31 | $cacheData['ips'] = array(); | 
| 32 | -		while($row = mysqli_fetch_array($rs)){ | |
| 33 | -			if($row['monitorType']=='ip'){ | |
| 32 | +		while ($row = mysqli_fetch_array($rs)) { | |
| 33 | +			if ($row['monitorType']=='ip') { | |
| 34 | 34 | $cacheData['ips'][] = $row['host']; | 
| 35 | -			}else{ | |
| 35 | +			}else { | |
| 36 | 36 | $cacheData['domains'][] = $row['host']; | 
| 37 | 37 | } | 
| 38 | 38 | } | 
| @@ -43,46 +43,46 @@ discard block | ||
| 43 | 43 | return false; | 
| 44 | 44 | } | 
| 45 | 45 | |
| 46 | -	public static function randomDNSServer(){ | |
| 47 | - return Setup::$settings['dns_servers'][mt_rand(0,(count(Setup::$settings['dns_servers'])-1))]; | |
| 46 | +	public static function randomDNSServer() { | |
| 47 | + return Setup::$settings['dns_servers'][mt_rand(0, (count(Setup::$settings['dns_servers'])-1))]; | |
| 48 | 48 | } | 
| 49 | 49 | |
| 50 | 50 | public static $isBlocked = 0; | 
| 51 | 51 | |
| 52 | -	public static function checkBlacklists($domainOrIp, $reportClean=false){ | |
| 52 | +	public static function checkBlacklists($domainOrIp, $reportClean = false) { | |
| 53 | 53 | self::$isBlocked = 0; | 
| 54 | 54 | $return = array(); | 
| 55 | -		if(_IpAddresses::isIPAddress($domainOrIp)){ | |
| 56 | -			foreach(self::$ipBlacklists as $server){ | |
| 55 | +		if (_IpAddresses::isIPAddress($domainOrIp)) { | |
| 56 | +			foreach (self::$ipBlacklists as $server) { | |
| 57 | 57 | $r = self::ipCheck($domainOrIp, $server); | 
| 58 | -				if($r!='') { | |
| 58 | +				if ($r!='') { | |
| 59 | 59 | self::$isBlocked = 1; | 
| 60 | 60 | self::logBlockListStats($server, 'ip', true); | 
| 61 | -				}else{ | |
| 61 | +				}else { | |
| 62 | 62 | self::logBlockListStats($server, 'ip', false); | 
| 63 | 63 | } | 
| 64 | -				if($r!='' || $reportClean==true) { | |
| 65 | - $return[] = array(trim($server),$r); | |
| 64 | +				if ($r!='' || $reportClean==true) { | |
| 65 | + $return[] = array(trim($server), $r); | |
| 66 | 66 | } | 
| 67 | 67 | } | 
| 68 | -		}else{ | |
| 69 | -			foreach(self::$domainBlacklists as $server){ | |
| 68 | +		}else { | |
| 69 | +			foreach (self::$domainBlacklists as $server) { | |
| 70 | 70 | $r = self::domainCheck($domainOrIp, $server); | 
| 71 | -				if($r!='') { | |
| 71 | +				if ($r!='') { | |
| 72 | 72 | self::$isBlocked = 1; | 
| 73 | 73 | self::logBlockListStats($server, 'domain', true); | 
| 74 | -				}else{ | |
| 74 | +				}else { | |
| 75 | 75 | self::logBlockListStats($server, 'domain', false); | 
| 76 | 76 | } | 
| 77 | -				if($r!='' || $reportClean==true) { | |
| 78 | - $return[] = array(trim($server),$r); | |
| 77 | +				if ($r!='' || $reportClean==true) { | |
| 78 | + $return[] = array(trim($server), $r); | |
| 79 | 79 | } | 
| 80 | 80 | } | 
| 81 | 81 | } | 
| 82 | 82 | return $return; | 
| 83 | 83 | } | 
| 84 | 84 | |
| 85 | -	public static function domainCheck($domain, $server){ | |
| 85 | +	public static function domainCheck($domain, $server) { | |
| 86 | 86 | $server = trim($server); | 
| 87 | 87 |  		$host = escapeshellarg("$domain.$server"); | 
| 88 | 88 | $t = "dig @".self::randomDNSServer()." +time=".Setup::$settings['dns_request_timeout']." $host"; | 
| @@ -98,8 +98,8 @@ discard block | ||
| 98 | 98 |  		$testArray = explode("\t", $test); | 
| 99 | 99 | $test = end($testArray); | 
| 100 | 100 | |
| 101 | -		if(trim($test)!=''){ | |
| 102 | -			if(Setup::$settings['rbl_txt_extended_status']){ | |
| 101 | +		if (trim($test)!='') { | |
| 102 | +			if (Setup::$settings['rbl_txt_extended_status']) { | |
| 103 | 103 | $t = "dig @".self::randomDNSServer()." +time=".Setup::$settings['dns_request_timeout']." $host txt"; | 
| 104 | 104 |  		//		echo("$t</br>"); | 
| 105 | 105 | $text = shell_exec($t); | 
| @@ -112,18 +112,18 @@ discard block | ||
| 112 | 112 | true); | 
| 113 | 113 |  				$testArray = explode("\t", $test); | 
| 114 | 114 | $test = end($testArray); | 
| 115 | -				$test = str_replace(array('\'','"'),'',$test); | |
| 116 | -			}else{ | |
| 115 | +				$test = str_replace(array('\'', '"'), '', $test); | |
| 116 | +			}else { | |
| 117 | 117 | $test = 'blocked'; | 
| 118 | 118 | } | 
| 119 | 119 | } | 
| 120 | - if(strripos($test,'not found')!==false) return ''; | |
| 121 | - if(strripos($test,'SERVFAIL')!==false) return ''; | |
| 120 | + if (strripos($test, 'not found')!==false) return ''; | |
| 121 | + if (strripos($test, 'SERVFAIL')!==false) return ''; | |
| 122 | 122 | return trim($test); | 
| 123 | 123 | } | 
| 124 | 124 | |
| 125 | -	public static function ipCheck($ip, $server){ | |
| 126 | - if(_IpAddresses::isIPAddress($ip)===false) return ''; | |
| 125 | +	public static function ipCheck($ip, $server) { | |
| 126 | + if (_IpAddresses::isIPAddress($ip)===false) return ''; | |
| 127 | 127 | $server = trim($server); | 
| 128 | 128 | |
| 129 | 129 |  		$parts = explode('.', $ip); | 
| @@ -143,8 +143,8 @@ discard block | ||
| 143 | 143 |  		$testArray = preg_split("/IN\s+A\s+/i", $test); | 
| 144 | 144 | $test = trim(end($testArray)); | 
| 145 | 145 | // echo "<pre>$test</pre>\n"; | 
| 146 | -		if(trim($test)!=''){ | |
| 147 | -			if(Setup::$settings['rbl_txt_extended_status']){ | |
| 146 | +		if (trim($test)!='') { | |
| 147 | +			if (Setup::$settings['rbl_txt_extended_status']) { | |
| 148 | 148 | $t = "dig @".self::randomDNSServer()." +time=".Setup::$settings['dns_request_timeout']." $host txt"; | 
| 149 | 149 |  		//		echo("$t</br>"); | 
| 150 | 150 | $text = shell_exec($t); | 
| @@ -157,41 +157,41 @@ discard block | ||
| 157 | 157 | true); | 
| 158 | 158 |  				$testArray = preg_split("/IN\s+TXT\s+/i", $test2); | 
| 159 | 159 | $test2 = trim(end($testArray)); | 
| 160 | -				$test2 = str_replace(array('\'','"'),'',$test2); | |
| 161 | -				switch($server){ | |
| 160 | +				$test2 = str_replace(array('\'', '"'), '', $test2); | |
| 161 | +				switch ($server) { | |
| 162 | 162 | case 'bl.mailspike.net': | 
| 163 | -						$a = explode("|",$test2); | |
| 164 | - $test = (isset($a[1])) ? 'Listed ' . $a[1] : $test2; | |
| 163 | +						$a = explode("|", $test2); | |
| 164 | + $test = (isset($a[1])) ? 'Listed '.$a[1] : $test2; | |
| 165 | 165 | break; | 
| 166 | 166 | } | 
| 167 | - if($test2!='') $test = $test2; | |
| 168 | -			}else{ | |
| 167 | + if ($test2!='') $test = $test2; | |
| 168 | +			}else { | |
| 169 | 169 | $test = 'blocked'; | 
| 170 | 170 | } | 
| 171 | 171 | } | 
| 172 | - if(strripos($test,'not found')!==false) return ''; | |
| 173 | - if(strripos($test,'SERVFAIL')!==false) return ''; | |
| 172 | + if (strripos($test, 'not found')!==false) return ''; | |
| 173 | + if (strripos($test, 'SERVFAIL')!==false) return ''; | |
| 174 | 174 | return trim($test); | 
| 175 | 175 | } | 
| 176 | 176 | |
| 177 | -	public static function logBlockListStats($server, $monitorType, $isBlocked){ | |
| 178 | - if(Setup::$settings['log_rbl_stats']==0) return true; | |
| 177 | +	public static function logBlockListStats($server, $monitorType, $isBlocked) { | |
| 178 | + if (Setup::$settings['log_rbl_stats']==0) return true; | |
| 179 | 179 | $mysql = new _MySQL(); | 
| 180 | 180 | $mysql->connect(Setup::$connectionArray); | 
| 181 | -		if($isBlocked){ | |
| 181 | +		if ($isBlocked) { | |
| 182 | 182 | $sql = "update blockLists set blocksToday=(blocksToday+1), lastBlockReport=now() where host = '".$mysql->escape($server)."' and monitorType = '$monitorType';"; | 
| 183 | -		}else{ | |
| 183 | +		}else { | |
| 184 | 184 | $sql = "update blockLists set cleanToday=(cleanToday+1) where host = '".$mysql->escape($server)."' and monitorType = '$monitorType';"; | 
| 185 | 185 | } | 
| 186 | 186 | $mysql->runQuery($sql); | 
| 187 | 187 | $mysql->close(); | 
| 188 | 188 | } | 
| 189 | 189 | |
| 190 | -	public static function ensureGroupExists($groupName){ | |
| 190 | +	public static function ensureGroupExists($groupName) { | |
| 191 | 191 | $mysql = new _MySQL(); | 
| 192 | 192 | $mysql->connect(Setup::$connectionArray); | 
| 193 | 193 |  		$id = $mysql->runQueryReturnVar("select id from monitorGroup where groupName = '".$mysql->escape($groupName)."'"); | 
| 194 | -		if($id===false){ | |
| 194 | +		if ($id===false) { | |
| 195 | 195 |  			$mysql->runQuery("insert into monitorGroup set groupName = '".$mysql->escape($groupName)."'"); | 
| 196 | 196 | $id = $mysql->identity; | 
| 197 | 197 | } | 
| @@ -199,23 +199,23 @@ discard block | ||
| 199 | 199 | return $id; | 
| 200 | 200 | } | 
| 201 | 201 | |
| 202 | -	public static function updateDomains($domains, $monitorGroupId){ | |
| 202 | +	public static function updateDomains($domains, $monitorGroupId) { | |
| 203 | 203 | $domains = trim($domains); | 
| 204 | 204 | $monitorGroupId = (int)$monitorGroupId; | 
| 205 | - if($monitorGroupId===0) return false; | |
| 205 | + if ($monitorGroupId===0) return false; | |
| 206 | 206 | $mysql = new _MySQL(); | 
| 207 | 207 | $mysql->connect(Setup::$connectionArray); | 
| 208 | 208 |  		$mysql->runQuery("update monitors set keepOnUpdate = 0 where isDomain = 1 and monitorGroupId = $monitorGroupId"); | 
| 209 | 209 |  		$mysql->runQuery("update users set lastUpdate = '".$mysql->escape(date('Y-m-d H:i:s'))."'"); | 
| 210 | 210 |  		$mysql->runQuery("update monitorGroup set domains = '".$mysql->escape($domains)."' where id = $monitorGroupId"); | 
| 211 | 211 |  		$domainArray = preg_split('/\s+/', $domains); | 
| 212 | -		foreach($domainArray as $d){ | |
| 212 | +		foreach ($domainArray as $d) { | |
| 213 | 213 | $d = trim($d); | 
| 214 | 214 |  			$d = str_ireplace('http://', '', $d); | 
| 215 | 215 |  			$d = str_ireplace('https://', '', $d); | 
| 216 | 216 |  			$d = str_ireplace('/', '', $d); | 
| 217 | 217 |  			$d = preg_replace('/[[:^print:]]/', '', $d); | 
| 218 | -			if($d != ''){ | |
| 218 | +			if ($d!='') { | |
| 219 | 219 |  				$mysql->runQuery(" | 
| 220 | 220 | update monitors set | 
| 221 | 221 | keepOnUpdate = 1 | 
| @@ -224,7 +224,7 @@ discard block | ||
| 224 | 224 | and ipDomain = '".$mysql->escape($d)."' | 
| 225 | 225 | and isDomain = 1 | 
| 226 | 226 | "); | 
| 227 | -				if($mysql->affectedRows == 0){ | |
| 227 | +				if ($mysql->affectedRows==0) { | |
| 228 | 228 |  					$mysql->runQuery("insert ignore into monitors set | 
| 229 | 229 | monitorGroupId = $monitorGroupId, | 
| 230 | 230 | ipDomain = '".$mysql->escape($d)."', | 
| @@ -238,19 +238,19 @@ discard block | ||
| 238 | 238 | $mysql->close(); | 
| 239 | 239 | } | 
| 240 | 240 | |
| 241 | -	public static function updateIPs($ips, $monitorGroupId){ | |
| 241 | +	public static function updateIPs($ips, $monitorGroupId) { | |
| 242 | 242 | $ips = trim($ips); | 
| 243 | 243 | $monitorGroupId = (int)$monitorGroupId; | 
| 244 | - if($monitorGroupId===0) return false; | |
| 244 | + if ($monitorGroupId===0) return false; | |
| 245 | 245 | $mysql = new _MySQL(); | 
| 246 | 246 | $mysql->connect(Setup::$connectionArray); | 
| 247 | 247 |  		$mysql->runQuery("update monitors set keepOnUpdate = 0 where isDomain = 0 and monitorGroupId = $monitorGroupId"); | 
| 248 | 248 |  		$mysql->runQuery("update users set lastUpdate = '".$mysql->escape(date('Y-m-d H:i:s'))."'"); | 
| 249 | 249 |  		$mysql->runQuery("update monitorGroup set ips = '".$mysql->escape($ips)."' where id = $monitorGroupId"); | 
| 250 | -		$ipsArray  = preg_split('/\s+/', $ips); | |
| 251 | -		foreach($ipsArray as $i){ | |
| 250 | +		$ipsArray = preg_split('/\s+/', $ips); | |
| 251 | +		foreach ($ipsArray as $i) { | |
| 252 | 252 | // ip checks | 
| 253 | -			if(_IpAddresses::isIPAddress($i)){ | |
| 253 | +			if (_IpAddresses::isIPAddress($i)) { | |
| 254 | 254 |  				$mysql->runQuery(" | 
| 255 | 255 | update monitors set | 
| 256 | 256 | keepOnUpdate = 1 | 
| @@ -259,7 +259,7 @@ discard block | ||
| 259 | 259 | and ipDomain = '".$mysql->escape($i)."' | 
| 260 | 260 | and isDomain = 0 | 
| 261 | 261 | "); | 
| 262 | -				if($mysql->affectedRows == 0){ | |
| 262 | +				if ($mysql->affectedRows==0) { | |
| 263 | 263 |  					$mysql->runQuery("insert ignore into monitors set | 
| 264 | 264 | monitorGroupId = $monitorGroupId, | 
| 265 | 265 | ipDomain = '".$mysql->escape($i)."', | 
| @@ -267,19 +267,19 @@ discard block | ||
| 267 | 267 | keepOnUpdate = 1 | 
| 268 | 268 | "); | 
| 269 | 269 | } | 
| 270 | -			}else{ | |
| 270 | +			}else { | |
| 271 | 271 | //cidr /24's max... | 
| 272 | -				if(trim($i)!=''){ | |
| 273 | - if(strpos($i, ' ')!==false) continue; | |
| 274 | - if(strpos($i, ':')!==false) continue; | |
| 272 | +				if (trim($i)!='') { | |
| 273 | + if (strpos($i, ' ')!==false) continue; | |
| 274 | + if (strpos($i, ':')!==false) continue; | |
| 275 | 275 | $range = _IpAddresses::cidrToRange($i); | 
| 276 | - if($range===false) continue; | |
| 276 | + if ($range===false) continue; | |
| 277 | 277 |  					$start = explode('.', $range[0]); | 
| 278 | 278 |  					$end = explode('.', $range[1]); | 
| 279 | - if($range[0]==0) continue;// starts with 0 | |
| 280 | -					for($i = $start[3]; $i <= $end[3]; $i++){ | |
| 279 | + if ($range[0]==0) continue; // starts with 0 | |
| 280 | +					for ($i = $start[3]; $i <= $end[3]; $i++) { | |
| 281 | 281 |  						$host = "{$start[0]}.{$start[1]}.{$start[2]}.$i"; | 
| 282 | -						if(_IpAddresses::isIPAddress($host)){ | |
| 282 | +						if (_IpAddresses::isIPAddress($host)) { | |
| 283 | 283 |  							$mysql->runQuery(" | 
| 284 | 284 | update monitors set | 
| 285 | 285 | keepOnUpdate = 1 | 
| @@ -288,7 +288,7 @@ discard block | ||
| 288 | 288 | and ipDomain = '".$mysql->escape($host)."' | 
| 289 | 289 | and isDomain = 0 | 
| 290 | 290 | "); | 
| 291 | -							if($mysql->affectedRows == 0){ | |
| 291 | +							if ($mysql->affectedRows==0) { | |
| 292 | 292 |  								$mysql->runQuery("insert ignore into monitors set | 
| 293 | 293 | monitorGroupId = $monitorGroupId, | 
| 294 | 294 | ipDomain = '".$mysql->escape($host)."', | 
| @@ -305,15 +305,15 @@ discard block | ||
| 305 | 305 | $mysql->close(); | 
| 306 | 306 | } | 
| 307 | 307 | |
| 308 | -	public static function isLoggedIn(){ | |
| 309 | -		if(isset($_SESSION['id']) && (int)$_SESSION['id'] > 0){ | |
| 308 | +	public static function isLoggedIn() { | |
| 309 | +		if (isset($_SESSION['id']) && (int)$_SESSION['id'] > 0) { | |
| 310 | 310 | return $_SESSION['id']; | 
| 311 | -		}else{ | |
| 311 | +		}else { | |
| 312 | 312 | return false; | 
| 313 | 313 | } | 
| 314 | 314 | } | 
| 315 | 315 | |
| 316 | -	public static function getAccount(){ | |
| 316 | +	public static function getAccount() { | |
| 317 | 317 | $mysql = new _MySQL(); | 
| 318 | 318 | $mysql->connect(Setup::$connectionArray); | 
| 319 | 319 | $ret = false; | 
| @@ -330,12 +330,12 @@ discard block | ||
| 330 | 330 | apiCallbackURL, | 
| 331 | 331 | checkFrequency | 
| 332 | 332 | from users limit 1"); | 
| 333 | -		while($row = mysqli_fetch_array($rs)){ | |
| 333 | +		while ($row = mysqli_fetch_array($rs)) { | |
| 334 | 334 | $ret = $row; | 
| 335 | 335 | } | 
| 336 | 336 | $mysql->close(); | 
| 337 | 337 | |
| 338 | -		if(!$ret){ | |
| 338 | +		if (!$ret) { | |
| 339 | 339 | //account | 
| 340 | 340 |  			_Logging::appLog("no user account"); | 
| 341 | 341 | exit(); | 
| @@ -344,44 +344,44 @@ discard block | ||
| 344 | 344 | return $ret; | 
| 345 | 345 | } | 
| 346 | 346 | |
| 347 | -	public static function validateLogin($userName, $passwd, $api = false, $apiKey = ''){ | |
| 347 | +	public static function validateLogin($userName, $passwd, $api = false, $apiKey = '') { | |
| 348 | 348 | $mysql = new _MySQL(); | 
| 349 | 349 | $mysql->connect(Setup::$connectionArray); | 
| 350 | 350 | $sql = " | 
| 351 | 351 | select username | 
| 352 | 352 | from users | 
| 353 | 353 | where "; | 
| 354 | -		if(trim($apiKey) != ''){ | |
| 354 | +		if (trim($apiKey)!='') { | |
| 355 | 355 | $sql .= " apiKey = '".$mysql->escape($apiKey)."'"; | 
| 356 | -		}else{ | |
| 356 | +		}else { | |
| 357 | 357 | $sql .= " passwd = '".$mysql->escape(md5($passwd))."' | 
| 358 | 358 | and username = '".$mysql->escape($userName)."'"; | 
| 359 | 359 | } | 
| 360 | 360 | $rs = $mysql->runQuery($sql); | 
| 361 | 361 | $id = 0; | 
| 362 | -		while($row = mysqli_fetch_array($rs)){ | |
| 362 | +		while ($row = mysqli_fetch_array($rs)) { | |
| 363 | 363 | $id = 1; | 
| 364 | 364 | } | 
| 365 | 365 | $mysql->close(); | 
| 366 | 366 | return $id; | 
| 367 | 367 | } | 
| 368 | 368 | |
| 369 | -	public static function lookupHostDNS($host){ | |
| 370 | -		if(_IpAddresses::isIPAddress($host)){ | |
| 369 | +	public static function lookupHostDNS($host) { | |
| 370 | +		if (_IpAddresses::isIPAddress($host)) { | |
| 371 | 371 | return _IpAddresses::getHostByIp($host); | 
| 372 | -		}else{ | |
| 372 | +		}else { | |
| 373 | 373 | $host = escapeshellarg($host); | 
| 374 | 374 |  			exec('host -t a -W 2 '.$host, $output, $return); | 
| 375 | -			if ($return !== 0) { | |
| 375 | +			if ($return!==0) { | |
| 376 | 376 | return ''; | 
| 377 | -			}else{ | |
| 377 | +			}else { | |
| 378 | 378 | $output = implode($output); | 
| 379 | 379 | $ips = _IpAddresses::getAllIPsFromString($output, true); | 
| 380 | 380 | $ir = ""; | 
| 381 | -				foreach($ips as $ip){ | |
| 381 | +				foreach ($ips as $ip) { | |
| 382 | 382 | $ir .= "$ip,"; | 
| 383 | 383 | } | 
| 384 | - return trim($ir,','); | |
| 384 | + return trim($ir, ','); | |
| 385 | 385 | } | 
| 386 | 386 | |
| 387 | 387 | /* | 
| @@ -394,7 +394,7 @@ discard block | ||
| 394 | 394 | } | 
| 395 | 395 | } | 
| 396 | 396 | |
| 397 | -	public static function testAPICallback($url){ | |
| 397 | +	public static function testAPICallback($url) { | |
| 398 | 398 | return self::makeAPICallback($url, | 
| 399 | 399 | 'samplehosttest.com', | 
| 400 | 400 | true, | 
| @@ -403,8 +403,8 @@ discard block | ||
| 403 | 403 | ); | 
| 404 | 404 | } | 
| 405 | 405 | |
| 406 | -	public static function makeAPICallback($url, $host, $isBlocked, $rDNS, $status){ | |
| 407 | - if(substr($url,0,4)!='http') return false; | |
| 406 | +	public static function makeAPICallback($url, $host, $isBlocked, $rDNS, $status) { | |
| 407 | + if (substr($url, 0, 4)!='http') return false; | |
| 408 | 408 | |
| 409 | 409 | $vars = json_encode( | 
| 410 | 410 | array( | 
| @@ -415,14 +415,14 @@ discard block | ||
| 415 | 415 | ) | 
| 416 | 416 | ); | 
| 417 | 417 | $err = true; | 
| 418 | -		try{ | |
| 418 | +		try { | |
| 419 | 419 | $ch = curl_init(); | 
| 420 | - curl_setopt($ch,CURLOPT_URL,$url); | |
| 421 | - curl_setopt($ch,CURLOPT_POST,true); | |
| 422 | - curl_setopt($ch,CURLOPT_FAILONERROR,true); | |
| 423 | - curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); | |
| 424 | - curl_setopt($ch,CURLOPT_POSTFIELDS,$vars); | |
| 425 | -			curl_setopt($ch,CURLOPT_HTTPHEADER, array('Content-Type: application/json'));  | |
| 420 | + curl_setopt($ch, CURLOPT_URL, $url); | |
| 421 | + curl_setopt($ch, CURLOPT_POST, true); | |
| 422 | + curl_setopt($ch, CURLOPT_FAILONERROR, true); | |
| 423 | + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |
| 424 | + curl_setopt($ch, CURLOPT_POSTFIELDS, $vars); | |
| 425 | +			curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));  | |
| 426 | 426 | curl_exec($ch); | 
| 427 | 427 | if (curl_errno($ch)) $err = false; | 
| 428 | 428 |  		} catch (Exception $e) { | 
| @@ -431,7 +431,7 @@ discard block | ||
| 431 | 431 | return $err; | 
| 432 | 432 | } | 
| 433 | 433 | |
| 434 | -	public static function isValidEmail($emailAddress){ | |
| 434 | +	public static function isValidEmail($emailAddress) { | |
| 435 | 435 |  		if (filter_var($emailAddress, FILTER_VALIDATE_EMAIL)) { | 
| 436 | 436 | return true; | 
| 437 | 437 | } | 
| @@ -442,36 +442,36 @@ discard block | ||
| 442 | 442 | $text, | 
| 443 | 443 | $beginText, | 
| 444 | 444 | $endText, | 
| 445 | - $removeSpace=true, | |
| 446 | - $removeHtmlTags=true, | |
| 447 | -		$firstResultOnlyNoArray=false) { | |
| 445 | + $removeSpace = true, | |
| 446 | + $removeHtmlTags = true, | |
| 447 | +		$firstResultOnlyNoArray = false) { | |
| 448 | 448 | $results = array(); | 
| 449 | 449 | $endPos = 0; | 
| 450 | -		while(true) { | |
| 450 | +		while (true) { | |
| 451 | 451 | $beginPos = stripos($text, $beginText, $endPos); | 
| 452 | - if($beginPos===false) break; | |
| 452 | + if ($beginPos===false) break; | |
| 453 | 453 | $beginPos = $beginPos+strlen($beginText); | 
| 454 | 454 | $endPos = stripos($text, $endText, $beginPos); | 
| 455 | - if($endPos===false) break; | |
| 455 | + if ($endPos===false) break; | |
| 456 | 456 | $result = substr($text, $beginPos, $endPos-$beginPos); | 
| 457 | -				if($removeSpace){ | |
| 458 | -						$result = str_replace("\t","",$result); | |
| 459 | -						$result = str_replace("\n","",$result); | |
| 460 | -						$result = preg_replace("/  /"," ",$result); | |
| 461 | -						$result = preg_replace("~[\s]{2}?[\t]?~i"," ",$result); | |
| 462 | -						$result = str_replace("  "," ",$result); | |
| 457 | +				if ($removeSpace) { | |
| 458 | +						$result = str_replace("\t", "", $result); | |
| 459 | +						$result = str_replace("\n", "", $result); | |
| 460 | +						$result = preg_replace("/  /", " ", $result); | |
| 461 | +						$result = preg_replace("~[\s]{2}?[\t]?~i", " ", $result); | |
| 462 | +						$result = str_replace("  ", " ", $result); | |
| 463 | 463 | $result = trim($result); | 
| 464 | 464 | } | 
| 465 | -				if($removeHtmlTags){ | |
| 465 | +				if ($removeHtmlTags) { | |
| 466 | 466 | $result = strip_tags($result); | 
| 467 | 467 | } | 
| 468 | - if($firstResultOnlyNoArray) return $result; | |
| 469 | - if($result != '') $results[] = $result; | |
| 468 | + if ($firstResultOnlyNoArray) return $result; | |
| 469 | + if ($result!='') $results[] = $result; | |
| 470 | 470 | } | 
| 471 | 471 | return ($firstResultOnlyNoArray && empty($results) ? '' : $results); | 
| 472 | 472 | } | 
| 473 | 473 | |
| 474 | -	public static function getNextMonitor($mysql){ | |
| 474 | +	public static function getNextMonitor($mysql) { | |
| 475 | 475 |  		$ipDomain = $mysql->runQueryReturnVar("select ipDomain from monitors where beenChecked = 0"); | 
| 476 | 476 |  		$mysql->runQuery("update monitors set beenChecked = 1 where ipDomain = '".$mysql->escape($ipDomain)."'"); | 
| 477 | 477 | return $ipDomain; | 
| @@ -480,49 +480,49 @@ discard block | ||
| 480 | 480 |  	public static function getHostChangeCount($mysql, $monitorGroupId = 0) { | 
| 481 | 481 | $sql = ''; | 
| 482 | 482 | $monitorGroupId = (int)$monitorGroupId; | 
| 483 | - if($monitorGroupId > 0) $sql = " and monitorGroupId = $monitorGroupId"; | |
| 483 | + if ($monitorGroupId > 0) $sql = " and monitorGroupId = $monitorGroupId"; | |
| 484 | 484 |  		return $mysql->runQueryReturnVar("select COALESCE(count(ipDomain),0) as cnt from monitors where lastStatusChanged = 1 $sql"); | 
| 485 | 485 | } | 
| 486 | 486 | |
| 487 | 487 |  	public static function getHostErrorCount($mysql, $monitorGroupId = 0, $onlyNew = false) { | 
| 488 | 488 | $sql = ''; | 
| 489 | 489 | $monitorGroupId = (int)$monitorGroupId; | 
| 490 | - if($monitorGroupId > 0) $sql = " and monitorGroupId = $monitorGroupId"; | |
| 491 | - if($onlyNew) $sql .= " and lastStatusChanged = 1 "; | |
| 490 | + if ($monitorGroupId > 0) $sql = " and monitorGroupId = $monitorGroupId"; | |
| 491 | + if ($onlyNew) $sql .= " and lastStatusChanged = 1 "; | |
| 492 | 492 |  		return $mysql->runQueryReturnVar("select COALESCE(count(ipDomain),0) as cnt from monitors where isBlocked = 1 $sql"); | 
| 493 | 493 | } | 
| 494 | 494 | |
| 495 | 495 |  	public static function getHostCleanCount($mysql, $monitorGroupId = 0, $onlyNew = false) { | 
| 496 | 496 | $sql = ''; | 
| 497 | 497 | $monitorGroupId = (int)$monitorGroupId; | 
| 498 | - if($monitorGroupId > 0) $sql = " and monitorGroupId = $monitorGroupId"; | |
| 499 | - if($onlyNew) $sql .= " and lastStatusChanged = 1 "; | |
| 498 | + if ($monitorGroupId > 0) $sql = " and monitorGroupId = $monitorGroupId"; | |
| 499 | + if ($onlyNew) $sql .= " and lastStatusChanged = 1 "; | |
| 500 | 500 |  		return $mysql->runQueryReturnVar("select COALESCE(count(ipDomain),0) as cnt from monitors where isBlocked = 0 $sql"); | 
| 501 | 501 | } | 
| 502 | 502 | |
| 503 | 503 |  	public static function getHostCount($mysql, $monitorGroupId = 0) { | 
| 504 | 504 | $sql = ''; | 
| 505 | 505 | $monitorGroupId = (int)$monitorGroupId; | 
| 506 | - if($monitorGroupId > 0) $sql = " where monitorGroupId = $monitorGroupId"; | |
| 506 | + if ($monitorGroupId > 0) $sql = " where monitorGroupId = $monitorGroupId"; | |
| 507 | 507 |  		return $mysql->runQueryReturnVar("select COALESCE(count(ipDomain),0) as cnt from monitors $sql"); | 
| 508 | 508 | } | 
| 509 | 509 | |
| 510 | 510 | //CREDIT: http://braincrafted.com/php-background-processes/ | 
| 511 | -	public static function is_process_running($pid){ | |
| 511 | +	public static function is_process_running($pid) { | |
| 512 | 512 | $pid = (int)$pid; | 
| 513 | - if($pid == 0) return false; | |
| 514 | -		if(file_exists('/proc/'.$pid)){ | |
| 513 | + if ($pid==0) return false; | |
| 514 | +		if (file_exists('/proc/'.$pid)) { | |
| 515 | 515 | return true; | 
| 516 | -		}else{ | |
| 516 | +		}else { | |
| 517 | 517 | return false; | 
| 518 | 518 | } | 
| 519 | 519 | } | 
| 520 | 520 | |
| 521 | 521 |  	public static function run_in_background($command, $priority = 0) { | 
| 522 | 522 | $log = Setup::$settings['log_path']; | 
| 523 | -		if($priority !=0){ | |
| 523 | +		if ($priority!=0) { | |
| 524 | 524 |  			$pid = shell_exec("nohup nice -n $priority $command >> $log 2>&1 & echo $!"); | 
| 525 | -		}else{ | |
| 525 | +		}else { | |
| 526 | 526 |  			$pid = shell_exec("nohup $command >> $log 2>&1 & echo $!"); | 
| 527 | 527 | } | 
| 528 | 528 | return($pid); | 
| @@ -5,7 +5,7 @@ discard block | ||
| 5 | 5 |  class_exists('_MySQL', false) or include('classes/_MySQL.class.php'); | 
| 6 | 6 |  class_exists('PHPMailer', false) or include('classes/class.phpmailer.php'); | 
| 7 | 7 | |
| 8 | -if(Utilities::isLoggedIn()===false){ | |
| 8 | +if (Utilities::isLoggedIn()===false) { | |
| 9 | 9 |  	header('Location: login.php'); | 
| 10 | 10 | exit(); | 
| 11 | 11 | } | 
| @@ -13,17 +13,17 @@ discard block | ||
| 13 | 13 | $titlePreFix = "account"; | 
| 14 | 14 | $message = array(); | 
| 15 | 15 | |
| 16 | -$username = array_key_exists('username', $_POST) ? substr(trim($_POST['username']),0,100) : ''; | |
| 17 | -$noticeEmailAddresses = array_key_exists('noticeEmailAddresses', $_POST) ? substr($_POST['noticeEmailAddresses'],0,8000) : ''; | |
| 18 | -$textMessageEmails = array_key_exists('textMessageEmails', $_POST) ? substr($_POST['textMessageEmails'],0,8000) : ''; | |
| 19 | -$passwd = array_key_exists('passwd', $_POST) ? substr($_POST['passwd'],0,32) : ''; | |
| 20 | -$passwdOld = array_key_exists('passwdOld', $_POST) ? substr($_POST['passwdOld'],0,32) : ''; | |
| 21 | -$apiKey = array_key_exists('apiKey', $_POST) ? substr($_POST['apiKey'],0,32) : ''; | |
| 16 | +$username = array_key_exists('username', $_POST) ? substr(trim($_POST['username']), 0, 100) : ''; | |
| 17 | +$noticeEmailAddresses = array_key_exists('noticeEmailAddresses', $_POST) ? substr($_POST['noticeEmailAddresses'], 0, 8000) : ''; | |
| 18 | +$textMessageEmails = array_key_exists('textMessageEmails', $_POST) ? substr($_POST['textMessageEmails'], 0, 8000) : ''; | |
| 19 | +$passwd = array_key_exists('passwd', $_POST) ? substr($_POST['passwd'], 0, 32) : ''; | |
| 20 | +$passwdOld = array_key_exists('passwdOld', $_POST) ? substr($_POST['passwdOld'], 0, 32) : ''; | |
| 21 | +$apiKey = array_key_exists('apiKey', $_POST) ? substr($_POST['apiKey'], 0, 32) : ''; | |
| 22 | 22 |  $disableEmailNotices = array_key_exists('disableEmailNotices', $_POST) ? (int)$_POST['disableEmailNotices'] : 0; | 
| 23 | 23 |  $beenChecked = array_key_exists('beenChecked', $_POST) ? (int)$_POST['beenChecked'] : 0; | 
| 24 | -$twitterHandle = array_key_exists('twitterHandle', $_POST) ? substr(trim($_POST['twitterHandle']),0,15) : ''; | |
| 25 | -$twitterHandle = str_replace('@','',$twitterHandle); | |
| 26 | -$apiCallbackURL = array_key_exists('apiCallbackURL', $_POST) ? substr(trim($_POST['apiCallbackURL']),0,2000) : ''; | |
| 24 | +$twitterHandle = array_key_exists('twitterHandle', $_POST) ? substr(trim($_POST['twitterHandle']), 0, 15) : ''; | |
| 25 | +$twitterHandle = str_replace('@', '', $twitterHandle); | |
| 26 | +$apiCallbackURL = array_key_exists('apiCallbackURL', $_POST) ? substr(trim($_POST['apiCallbackURL']), 0, 2000) : ''; | |
| 27 | 27 |  $testUrl = array_key_exists('testUrl', $_GET) ? $_GET['testUrl'] : ''; | 
| 28 | 28 | |
| 29 | 29 | $mysql = new _MySQL(); | 
| @@ -32,40 +32,40 @@ discard block | ||
| 32 | 32 | // audit check frequency | 
| 33 | 33 |  $checkFrequency = array_key_exists('checkFrequency', $_POST) ? $_POST['checkFrequency'] : ''; | 
| 34 | 34 | |
| 35 | -if($testUrl!=''){ | |
| 36 | -	if(Utilities::testAPICallback($testUrl)){ | |
| 35 | +if ($testUrl!='') { | |
| 36 | +	if (Utilities::testAPICallback($testUrl)) { | |
| 37 | 37 |  		echo('true'); | 
| 38 | -	}else{ | |
| 38 | +	}else { | |
| 39 | 39 |  		echo('false'); | 
| 40 | 40 | } | 
| 41 | 41 | exit(); | 
| 42 | 42 | } | 
| 43 | 43 | |
| 44 | 44 |  if (isset($_POST["submit"])) { | 
| 45 | - if($passwd=='') $message[] = 'You must select a password.'; | |
| 45 | + if ($passwd=='') $message[] = 'You must select a password.'; | |
| 46 | 46 | |
| 47 | -	if($passwdOld != $passwd){ | |
| 47 | +	if ($passwdOld!=$passwd) { | |
| 48 | 48 | $passwdOld = md5($passwd); | 
| 49 | 49 | } | 
| 50 | 50 | |
| 51 | -	$ta = explode("\n",$noticeEmailAddresses); | |
| 51 | +	$ta = explode("\n", $noticeEmailAddresses); | |
| 52 | 52 | $noticeEmailAddresses = ""; | 
| 53 | -	foreach($ta as $e){ | |
| 53 | +	foreach ($ta as $e) { | |
| 54 | 54 | $e = trim($e); | 
| 55 | -		if(Utilities::isValidEmail($e)){ | |
| 55 | +		if (Utilities::isValidEmail($e)) { | |
| 56 | 56 | $noticeEmailAddresses .= "$e\n"; | 
| 57 | 57 | } | 
| 58 | 58 | } | 
| 59 | -	$ta = explode("\n",$textMessageEmails); | |
| 59 | +	$ta = explode("\n", $textMessageEmails); | |
| 60 | 60 | $textMessageEmails = ""; | 
| 61 | -	foreach($ta as $e){ | |
| 61 | +	foreach ($ta as $e) { | |
| 62 | 62 | $e = trim($e); | 
| 63 | -		if(Utilities::isValidEmail($e)){ | |
| 63 | +		if (Utilities::isValidEmail($e)) { | |
| 64 | 64 | $textMessageEmails .= "$e\n"; | 
| 65 | 65 | } | 
| 66 | 66 | } | 
| 67 | 67 | //TODO: make sure blacklists are domains with an ip address on them | 
| 68 | -	if(count($message) == 0){ | |
| 68 | +	if (count($message)==0) { | |
| 69 | 69 | //update | 
| 70 | 70 |  		$mysql->runQuery(" | 
| 71 | 71 | update users set username = '".$mysql->escape($username)."', | 
| @@ -81,11 +81,11 @@ discard block | ||
| 81 | 81 | checkFrequency = '".$mysql->escape($checkFrequency)."', | 
| 82 | 82 | disableEmailNotices = $disableEmailNotices | 
| 83 | 83 | "); | 
| 84 | -		if($beenChecked==1){ | |
| 84 | +		if ($beenChecked==1) { | |
| 85 | 85 |  			$mysql->runQuery("update users set beenChecked = 0"); | 
| 86 | 86 | $message[] = "Check scheduled."; | 
| 87 | 87 | } | 
| 88 | -		if($twitterHandle!=''){ | |
| 88 | +		if ($twitterHandle!='') { | |
| 89 | 89 | $t = new Twitter(); | 
| 90 | 90 | $t->follow($twitterHandle); | 
| 91 | 91 | } | 
| @@ -93,7 +93,7 @@ discard block | ||
| 93 | 93 | } | 
| 94 | 94 | } | 
| 95 | 95 | $user = Utilities::getAccount(); | 
| 96 | -if(!$user){ | |
| 96 | +if (!$user) { | |
| 97 | 97 | //invalid account | 
| 98 | 98 |  	echo("<script>window.location='login.php?logout=1';</script>"); | 
| 99 | 99 | exit(); | 
| @@ -106,8 +106,8 @@ discard block | ||
| 106 | 106 | <div class="row"> | 
| 107 | 107 | <div class="col-md-3"> | 
| 108 | 108 | <ul class="nav nav-pills nav-stacked"> | 
| 109 | - <li>Hosts Total <span class="badge pull-right"><?php echo(number_format(Utilities::getHostCount($mysql)));?></span></li> | |
| 110 | - <li>Hosts Blocked <span class="badge pull-right"><?php echo(number_format(Utilities::getHostErrorCount($mysql)));?></span></li> | |
| 109 | + <li>Hosts Total <span class="badge pull-right"><?php echo(number_format(Utilities::getHostCount($mysql))); ?></span></li> | |
| 110 | + <li>Hosts Blocked <span class="badge pull-right"><?php echo(number_format(Utilities::getHostErrorCount($mysql))); ?></span></li> | |
| 111 | 111 | </ul> | 
| 112 | 112 | </div> | 
| 113 | 113 | </div> | 
| @@ -136,7 +136,7 @@ discard block | ||
| 136 | 136 | </script> | 
| 137 | 137 | |
| 138 | 138 | <?php | 
| 139 | -foreach($message as $m){ | |
| 139 | +foreach ($message as $m) { | |
| 140 | 140 |  	echo("<div class=\"alert alert-info alert-dismissable\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">×</button>$m</div>"); | 
| 141 | 141 | } | 
| 142 | 142 | ?> | 
| @@ -145,30 +145,30 @@ discard block | ||
| 145 | 145 | <div class="form-group"> | 
| 146 | 146 | <label class="col-sm-3 control-label" for="username">Login Username</label> | 
| 147 | 147 | <div class="col-sm-6"> | 
| 148 | - <input class="form-control" type="text" id="username" name="username" value="<?php echo($user['username']);?>" placeholder="username"> | |
| 148 | + <input class="form-control" type="text" id="username" name="username" value="<?php echo($user['username']); ?>" placeholder="username"> | |
| 149 | 149 | </div> | 
| 150 | 150 | </div> | 
| 151 | 151 | <div class="form-group"> | 
| 152 | 152 | <label class="col-sm-3 control-label" for="passwd">Password</label> | 
| 153 | 153 | <div class="col-sm-6"> | 
| 154 | - <input class="form-control" type="password" name="passwd" id="passwd" value="<?php echo($user['passwd']);?>" class="form-control" placeholder="Password"> | |
| 154 | + <input class="form-control" type="password" name="passwd" id="passwd" value="<?php echo($user['passwd']); ?>" class="form-control" placeholder="Password"> | |
| 155 | 155 | </div> | 
| 156 | 156 | </div> | 
| 157 | 157 | <div class="form-group"> | 
| 158 | 158 | <label class="col-sm-3 control-label" for="apiKey">API Key</label> | 
| 159 | 159 | <div class="col-sm-6"> | 
| 160 | - <input class="form-control" maxlength="32" type="text" id="apiKey" name="apiKey" value="<?php echo($user['apiKey']);?>" placeholder="api key"> | |
| 160 | + <input class="form-control" maxlength="32" type="text" id="apiKey" name="apiKey" value="<?php echo($user['apiKey']); ?>" placeholder="api key"> | |
| 161 | 161 | </div> | 
| 162 | 162 | </div> | 
| 163 | 163 | <div class="form-group"> | 
| 164 | 164 | <label class="col-sm-3 control-label" for="checkFrequency">Check Frequency</label> | 
| 165 | 165 | <div class="col-sm-6"> | 
| 166 | 166 | <select id="checkFrequency" name="checkFrequency" class="form-control"> | 
| 167 | - <option value="weekly"<?php if($user['checkFrequency']=='weekly') echo ' selected'?>>Weekly</option> | |
| 168 | - <option value="daily"<?php if($user['checkFrequency']=='daily') echo ' selected'?>>Daily</option> | |
| 169 | - <option value="8hour"<?php if($user['checkFrequency']=='8hour') echo ' selected'?>>Every 8 Hours</option> | |
| 170 | - <option value="2hour"<?php if($user['checkFrequency']=='2hour') echo ' selected'?>>Every 2 Hours</option> | |
| 171 | - <option value="1hour"<?php if($user['checkFrequency']=='1hour') echo ' selected'?>>Hourly</option> | |
| 167 | + <option value="weekly"<?php if ($user['checkFrequency']=='weekly') echo ' selected'?>>Weekly</option> | |
| 168 | + <option value="daily"<?php if ($user['checkFrequency']=='daily') echo ' selected'?>>Daily</option> | |
| 169 | + <option value="8hour"<?php if ($user['checkFrequency']=='8hour') echo ' selected'?>>Every 8 Hours</option> | |
| 170 | + <option value="2hour"<?php if ($user['checkFrequency']=='2hour') echo ' selected'?>>Every 2 Hours</option> | |
| 171 | + <option value="1hour"<?php if ($user['checkFrequency']=='1hour') echo ' selected'?>>Hourly</option> | |
| 172 | 172 | </select> | 
| 173 | 173 | </div> | 
| 174 | 174 | </div> | 
| @@ -190,7 +190,7 @@ discard block | ||
| 190 | 190 | <div class="col-sm-6"> | 
| 191 | 191 | <div class="input-group"> | 
| 192 | 192 | <span class="input-group-addon">@</span> | 
| 193 | - <input class="form-control" type="text" id="twitterHandle" name="twitterHandle" value="<?php echo($user['twitterHandle']);?>" placeholder="twitter username"> | |
| 193 | + <input class="form-control" type="text" id="twitterHandle" name="twitterHandle" value="<?php echo($user['twitterHandle']); ?>" placeholder="twitter username"> | |
| 194 | 194 | </div> | 
| 195 | 195 | </div> | 
| 196 | 196 | </div> | 
| @@ -200,7 +200,7 @@ discard block | ||
| 200 | 200 | </label> | 
| 201 | 201 | <div class="col-sm-6"> | 
| 202 | 202 | <div class="input-group"> | 
| 203 | - <input class="form-control" type="text" id="apiCallbackURL" name="apiCallbackURL" value="<?php echo($user['apiCallbackURL']);?>" placeholder="api callback url"> | |
| 203 | + <input class="form-control" type="text" id="apiCallbackURL" name="apiCallbackURL" value="<?php echo($user['apiCallbackURL']); ?>" placeholder="api callback url"> | |
| 204 | 204 | <span class="input-group-btn"> | 
| 205 | 205 | <button class="btn btn-default" type="button" onclick="testAPIUrl()">Test Callback</button> | 
| 206 | 206 | </span> | 
| @@ -209,7 +209,7 @@ discard block | ||
| 209 | 209 | </div> | 
| 210 | 210 | </div> | 
| 211 | 211 | <div class="form-group"> | 
| 212 | -		<label class="col-sm-3 control-label" for="disableEmailNotices"><input type="checkbox" id="disableEmailNotices" name="disableEmailNotices" value="1" class="input-block-level" <?php if($user['disableEmailNotices']==1) echo(' checked');?>></label> | |
| 212 | +		<label class="col-sm-3 control-label" for="disableEmailNotices"><input type="checkbox" id="disableEmailNotices" name="disableEmailNotices" value="1" class="input-block-level" <?php if ($user['disableEmailNotices']==1) echo(' checked'); ?>></label> | |
| 213 | 213 | <div class="col-sm-6"> | 
| 214 | 214 | Disable Notices<br/><small>You can pause receiving email/text alerts when your status changes. Useful if you have a frequently changing network. This does not pause api call backs.</small> | 
| 215 | 215 | </div> | 
| @@ -225,7 +225,7 @@ discard block | ||
| 225 | 225 | <button type="submit" name="submit" value="submit" class="btn btn-primary">Save changes</button> | 
| 226 | 226 | </div> | 
| 227 | 227 | </div> | 
| 228 | - <input type="hidden" value="<?php echo($user['passwd']);?>" name="passwdOld"/> | |
| 228 | + <input type="hidden" value="<?php echo($user['passwd']); ?>" name="passwdOld"/> | |
| 229 | 229 | </form> | 
| 230 | 230 | |
| 231 | 231 | <br/><br/><br/><br/> | 
| @@ -35,14 +35,16 @@ discard block | ||
| 35 | 35 |  if($testUrl!=''){ | 
| 36 | 36 |  	if(Utilities::testAPICallback($testUrl)){ | 
| 37 | 37 |  		echo('true'); | 
| 38 | -	}else{ | |
| 38 | +	} else{ | |
| 39 | 39 |  		echo('false'); | 
| 40 | 40 | } | 
| 41 | 41 | exit(); | 
| 42 | 42 | } | 
| 43 | 43 | |
| 44 | 44 |  if (isset($_POST["submit"])) { | 
| 45 | - if($passwd=='') $message[] = 'You must select a password.'; | |
| 45 | +	if($passwd=='') { | |
| 46 | + $message[] = 'You must select a password.'; | |
| 47 | + } | |
| 46 | 48 | |
| 47 | 49 |  	if($passwdOld != $passwd){ | 
| 48 | 50 | $passwdOld = md5($passwd); | 
| @@ -164,7 +166,8 @@ discard block | ||
| 164 | 166 | <label class="col-sm-3 control-label" for="checkFrequency">Check Frequency</label> | 
| 165 | 167 | <div class="col-sm-6"> | 
| 166 | 168 | <select id="checkFrequency" name="checkFrequency" class="form-control"> | 
| 167 | - <option value="weekly"<?php if($user['checkFrequency']=='weekly') echo ' selected'?>>Weekly</option> | |
| 169 | +				<option value="weekly"<?php if($user['checkFrequency']=='weekly') { | |
| 170 | + echo ' selected'?>>Weekly</option> | |
| 168 | 171 | <option value="daily"<?php if($user['checkFrequency']=='daily') echo ' selected'?>>Daily</option> | 
| 169 | 172 | <option value="8hour"<?php if($user['checkFrequency']=='8hour') echo ' selected'?>>Every 8 Hours</option> | 
| 170 | 173 | <option value="2hour"<?php if($user['checkFrequency']=='2hour') echo ' selected'?>>Every 2 Hours</option> | 
| @@ -190,7 +193,9 @@ discard block | ||
| 190 | 193 | <div class="col-sm-6"> | 
| 191 | 194 | <div class="input-group"> | 
| 192 | 195 | <span class="input-group-addon">@</span> | 
| 193 | - <input class="form-control" type="text" id="twitterHandle" name="twitterHandle" value="<?php echo($user['twitterHandle']);?>" placeholder="twitter username"> | |
| 196 | + <input class="form-control" type="text" id="twitterHandle" name="twitterHandle" value="<?php echo($user['twitterHandle']); | |
| 197 | +} | |
| 198 | +?>" placeholder="twitter username"> | |
| 194 | 199 | </div> | 
| 195 | 200 | </div> | 
| 196 | 201 | </div> | 
| @@ -209,7 +214,10 @@ discard block | ||
| 209 | 214 | </div> | 
| 210 | 215 | </div> | 
| 211 | 216 | <div class="form-group"> | 
| 212 | -		<label class="col-sm-3 control-label" for="disableEmailNotices"><input type="checkbox" id="disableEmailNotices" name="disableEmailNotices" value="1" class="input-block-level" <?php if($user['disableEmailNotices']==1) echo(' checked');?>></label> | |
| 217 | +		<label class="col-sm-3 control-label" for="disableEmailNotices"><input type="checkbox" id="disableEmailNotices" name="disableEmailNotices" value="1" class="input-block-level" <?php if($user['disableEmailNotices']==1) { | |
| 218 | +	echo(' checked'); | |
| 219 | +} | |
| 220 | +?>></label> | |
| 213 | 221 | <div class="col-sm-6"> | 
| 214 | 222 | Disable Notices<br/><small>You can pause receiving email/text alerts when your status changes. Useful if you have a frequently changing network. This does not pause api call backs.</small> | 
| 215 | 223 | </div> | 
| @@ -1,8 +1,8 @@ | ||
| 1 | 1 | <div id="accountSubnav"> | 
| 2 | 2 | <ul class="nav nav-tabs"> | 
| 3 | -		<li <?php if($pageName=='account.php') echo('class="active"');?>><a href="account.php">Profile</a></li> | |
| 4 | -		<li <?php if($pageName=='monitorGroup.php') echo('class="active"');?>><a href="monitorGroup.php">Monitor Groups</a></li> | |
| 5 | -		<li <?php if($pageName=='blockLists.php') echo('class="active"');?>><a href="blockLists.php">Block Lists</a></li> | |
| 6 | -		<li <?php if($pageName=='apiDocumentation.php') echo('class="active"');?>><a href="apiDocumentation.php">API Documentation</a></li> | |
| 3 | +		<li <?php if ($pageName=='account.php') echo('class="active"'); ?>><a href="account.php">Profile</a></li> | |
| 4 | +		<li <?php if ($pageName=='monitorGroup.php') echo('class="active"'); ?>><a href="monitorGroup.php">Monitor Groups</a></li> | |
| 5 | +		<li <?php if ($pageName=='blockLists.php') echo('class="active"'); ?>><a href="blockLists.php">Block Lists</a></li> | |
| 6 | +		<li <?php if ($pageName=='apiDocumentation.php') echo('class="active"'); ?>><a href="apiDocumentation.php">API Documentation</a></li> | |
| 7 | 7 | </ul> | 
| 8 | 8 | </div> | 
| 9 | 9 | \ No newline at end of file | 
| @@ -1,8 +1,20 @@ | ||
| 1 | 1 | <div id="accountSubnav"> | 
| 2 | 2 | <ul class="nav nav-tabs"> | 
| 3 | -		<li <?php if($pageName=='account.php') echo('class="active"');?>><a href="account.php">Profile</a></li> | |
| 4 | -		<li <?php if($pageName=='monitorGroup.php') echo('class="active"');?>><a href="monitorGroup.php">Monitor Groups</a></li> | |
| 5 | -		<li <?php if($pageName=='blockLists.php') echo('class="active"');?>><a href="blockLists.php">Block Lists</a></li> | |
| 6 | -		<li <?php if($pageName=='apiDocumentation.php') echo('class="active"');?>><a href="apiDocumentation.php">API Documentation</a></li> | |
| 3 | +		<li <?php if($pageName=='account.php') { | |
| 4 | +	echo('class="active"'); | |
| 5 | +} | |
| 6 | +?>><a href="account.php">Profile</a></li> | |
| 7 | +		<li <?php if($pageName=='monitorGroup.php') { | |
| 8 | +	echo('class="active"'); | |
| 9 | +} | |
| 10 | +?>><a href="monitorGroup.php">Monitor Groups</a></li> | |
| 11 | +		<li <?php if($pageName=='blockLists.php') { | |
| 12 | +	echo('class="active"'); | |
| 13 | +} | |
| 14 | +?>><a href="blockLists.php">Block Lists</a></li> | |
| 15 | +		<li <?php if($pageName=='apiDocumentation.php') { | |
| 16 | +	echo('class="active"'); | |
| 17 | +} | |
| 18 | +?>><a href="apiDocumentation.php">API Documentation</a></li> | |
| 7 | 19 | </ul> | 
| 8 | 20 | </div> | 
| 9 | 21 | \ No newline at end of file | 
| @@ -24,51 +24,51 @@ discard block | ||
| 24 | 24 | } | 
| 25 | 25 | |
| 26 | 26 |  switch($type){ | 
| 27 | - case 'updateDomains': | |
| 28 | -		if($groupName=='') { | |
| 29 | - $result['status'] = 'groupName is required'; | |
| 27 | + case 'updateDomains': | |
| 28 | +			if($groupName=='') { | |
| 29 | + $result['status'] = 'groupName is required'; | |
| 30 | + break; | |
| 31 | + } | |
| 32 | + $id = Utilities::ensureGroupExists($groupName); | |
| 33 | + Utilities::updateDomains($data, $id); | |
| 34 | + $result['status'] = 'success'; | |
| 30 | 35 | break; | 
| 31 | - } | |
| 32 | - $id = Utilities::ensureGroupExists($groupName); | |
| 33 | - Utilities::updateDomains($data, $id); | |
| 34 | - $result['status'] = 'success'; | |
| 35 | - break; | |
| 36 | 36 | |
| 37 | - case 'updateIPs': | |
| 38 | -		if($groupName=='') { | |
| 39 | - $result['status'] = 'groupName is required'; | |
| 37 | + case 'updateIPs': | |
| 38 | +			if($groupName=='') { | |
| 39 | + $result['status'] = 'groupName is required'; | |
| 40 | + break; | |
| 41 | + } | |
| 42 | + $id = Utilities::ensureGroupExists($groupName); | |
| 43 | + Utilities::updateIPs($data, $id); | |
| 44 | + $result['status'] = 'success'; | |
| 40 | 45 | break; | 
| 41 | - } | |
| 42 | - $id = Utilities::ensureGroupExists($groupName); | |
| 43 | - Utilities::updateIPs($data, $id); | |
| 44 | - $result['status'] = 'success'; | |
| 45 | - break; | |
| 46 | 46 | |
| 47 | - case 'checkHostStatus': | |
| 48 | - $result['status'] = 'success'; | |
| 49 | - Utilities::setBlockLists(); | |
| 50 | - $result['result'] = Utilities::checkBlacklists($data); | |
| 51 | - break; | |
| 47 | + case 'checkHostStatus': | |
| 48 | + $result['status'] = 'success'; | |
| 49 | + Utilities::setBlockLists(); | |
| 50 | + $result['result'] = Utilities::checkBlacklists($data); | |
| 51 | + break; | |
| 52 | 52 | |
| 53 | - case 'clearAllHostAndGroupData': | |
| 54 | - $mysql = new _MySQL(); | |
| 55 | - $mysql->connect(Setup::$connectionArray); | |
| 56 | -		$mysql->runQuery("truncate table monitors"); | |
| 57 | -		$mysql->runQuery("truncate table monitorGroup"); | |
| 58 | - $result['status'] = 'success'; | |
| 59 | - break; | |
| 53 | + case 'clearAllHostAndGroupData': | |
| 54 | + $mysql = new _MySQL(); | |
| 55 | + $mysql->connect(Setup::$connectionArray); | |
| 56 | +			$mysql->runQuery("truncate table monitors"); | |
| 57 | +			$mysql->runQuery("truncate table monitorGroup"); | |
| 58 | + $result['status'] = 'success'; | |
| 59 | + break; | |
| 60 | 60 | |
| 61 | - case 'blacklistStatus': | |
| 62 | -		$localCache = new _FileCache('blacklistmonitor-api', 90); | |
| 63 | -		$cacheKey = md5("$username|$passwd|$apiKey|$type|$data"); | |
| 64 | - $cacheData = $localCache->get($cacheKey); | |
| 65 | -		if ($cacheData !== false) { | |
| 66 | - output($cacheData); | |
| 67 | - } | |
| 68 | - $mysql = new _MySQL(); | |
| 69 | - $mysql->connect(Setup::$connectionArray); | |
| 70 | - $searchSQL = ''; | |
| 71 | -		switch($data){ | |
| 61 | + case 'blacklistStatus': | |
| 62 | +			$localCache = new _FileCache('blacklistmonitor-api', 90); | |
| 63 | +			$cacheKey = md5("$username|$passwd|$apiKey|$type|$data"); | |
| 64 | + $cacheData = $localCache->get($cacheKey); | |
| 65 | +			if ($cacheData !== false) { | |
| 66 | + output($cacheData); | |
| 67 | + } | |
| 68 | + $mysql = new _MySQL(); | |
| 69 | + $mysql->connect(Setup::$connectionArray); | |
| 70 | + $searchSQL = ''; | |
| 71 | +			switch($data){ | |
| 72 | 72 | case 'changed': | 
| 73 | 73 | $searchSQL .= " and lastStatusChanged = 1 "; | 
| 74 | 74 | break; | 
| @@ -79,7 +79,7 @@ discard block | ||
| 79 | 79 | break; | 
| 80 | 80 | case 'all': | 
| 81 | 81 | default: | 
| 82 | - } | |
| 82 | + } | |
| 83 | 83 | |
| 84 | 84 |  		$rs = $mysql->runQuery(" | 
| 85 | 85 | select ipDomain,isBlocked,rDNS,status,lastStatusChangeTime,lastUpdate | 
| @@ -101,8 +101,8 @@ discard block | ||
| 101 | 101 | $localCache->set($cacheKey, $result); | 
| 102 | 102 | break; | 
| 103 | 103 | |
| 104 | - default: | |
| 105 | - $result['status'] = 'no such method'; | |
| 104 | + default: | |
| 105 | + $result['status'] = 'no such method'; | |
| 106 | 106 | } | 
| 107 | 107 | |
| 108 | 108 | output(); | 
| @@ -42,7 +42,7 @@ | ||
| 42 | 42 | domains = '".$mysql->escape($domains)."' | 
| 43 | 43 | where id = $id | 
| 44 | 44 | "); | 
| 45 | -	}else{ | |
| 45 | +	} else{ | |
| 46 | 46 |  		$mysql->runQuery(" | 
| 47 | 47 | insert into monitorGroup set groupName = '".$mysql->escape($groupName)."', | 
| 48 | 48 | ips = '".$mysql->escape($ips)."', | 
| @@ -18,14 +18,14 @@ discard block | ||
| 18 | 18 | ); | 
| 19 | 19 | |
| 20 | 20 | $id = Utilities::validateLogin($username, $passwd, true, $apiKey); | 
| 21 | -if($id == 0) { | |
| 21 | +if ($id==0) { | |
| 22 | 22 | $result['status'] = 'invalid login'; | 
| 23 | 23 | output(); | 
| 24 | 24 | } | 
| 25 | 25 | |
| 26 | -switch($type){ | |
| 26 | +switch ($type) { | |
| 27 | 27 | case 'updateDomains': | 
| 28 | -		if($groupName=='') { | |
| 28 | +		if ($groupName=='') { | |
| 29 | 29 | $result['status'] = 'groupName is required'; | 
| 30 | 30 | break; | 
| 31 | 31 | } | 
| @@ -35,7 +35,7 @@ discard block | ||
| 35 | 35 | break; | 
| 36 | 36 | |
| 37 | 37 | case 'updateIPs': | 
| 38 | -		if($groupName=='') { | |
| 38 | +		if ($groupName=='') { | |
| 39 | 39 | $result['status'] = 'groupName is required'; | 
| 40 | 40 | break; | 
| 41 | 41 | } | 
| @@ -62,13 +62,13 @@ discard block | ||
| 62 | 62 |  		$localCache = new _FileCache('blacklistmonitor-api', 90); | 
| 63 | 63 |  		$cacheKey = md5("$username|$passwd|$apiKey|$type|$data"); | 
| 64 | 64 | $cacheData = $localCache->get($cacheKey); | 
| 65 | -		if ($cacheData !== false) { | |
| 65 | +		if ($cacheData!==false) { | |
| 66 | 66 | output($cacheData); | 
| 67 | 67 | } | 
| 68 | 68 | $mysql = new _MySQL(); | 
| 69 | 69 | $mysql->connect(Setup::$connectionArray); | 
| 70 | 70 | $searchSQL = ''; | 
| 71 | -		switch($data){ | |
| 71 | +		switch ($data) { | |
| 72 | 72 | case 'changed': | 
| 73 | 73 | $searchSQL .= " and lastStatusChanged = 1 "; | 
| 74 | 74 | break; | 
| @@ -87,7 +87,7 @@ discard block | ||
| 87 | 87 | where 1=1 $searchSQL"); | 
| 88 | 88 | $result['status'] = 'success'; | 
| 89 | 89 | $result['result'] = array(); | 
| 90 | -		while($row = mysqli_fetch_array($rs)){ | |
| 90 | +		while ($row = mysqli_fetch_array($rs)) { | |
| 91 | 91 | $result['result'][] = array( | 
| 92 | 92 | 'host'=>$row['ipDomain'], | 
| 93 | 93 | 'isBlocked'=>$row['isBlocked'], | 
| @@ -107,11 +107,11 @@ discard block | ||
| 107 | 107 | |
| 108 | 108 | output(); | 
| 109 | 109 | |
| 110 | -function output($data = false){ | |
| 110 | +function output($data = false) { | |
| 111 | 111 | global $result; | 
| 112 | -	if($data!==false){ | |
| 112 | +	if ($data!==false) { | |
| 113 | 113 | echo(json_encode($data)); | 
| 114 | -	}else{ | |
| 114 | +	}else { | |
| 115 | 115 | echo(json_encode($result)); | 
| 116 | 116 | } | 
| 117 | 117 | exit(); | 
| @@ -2,7 +2,7 @@ discard block | ||
| 2 | 2 |  class_exists('Setup', false) or include('classes/Setup.class.php'); | 
| 3 | 3 |  class_exists('Utilities', false) or include('classes/Utilities.class.php'); | 
| 4 | 4 | |
| 5 | -if(Utilities::isLoggedIn()===false){ | |
| 5 | +if (Utilities::isLoggedIn()===false) { | |
| 6 | 6 |  	header('Location: login.php'); | 
| 7 | 7 | exit(); | 
| 8 | 8 | } | 
| @@ -28,7 +28,7 @@ discard block | ||
| 28 | 28 | </tr> | 
| 29 | 29 | <tr> | 
| 30 | 30 | <td>apiKey</td> | 
| 31 | - <td>Your api key: <?php echo $user['apiKey'];?></td> | |
| 31 | + <td>Your api key: <?php echo $user['apiKey']; ?></td> | |
| 32 | 32 | </tr> | 
| 33 | 33 | <tr> | 
| 34 | 34 | <td>type</td> | 
| @@ -65,7 +65,7 @@ discard block | ||
| 65 | 65 | <br/> | 
| 66 | 66 | <pre> | 
| 67 | 67 | <?php | 
| 68 | -$apiKey = '<?php echo $user['apiKey'];?>'; | |
| 68 | +$apiKey = '<?php echo $user['apiKey']; ?>'; | |
| 69 | 69 | |
| 70 | 70 | $requestBody = | 
| 71 | 71 | "apiKey=".urlencode($apiKey). | 
| @@ -21,7 +21,7 @@ discard block | ||
| 21 | 21 | update blockLists | 
| 22 | 22 | set isActive = '0' | 
| 23 | 23 | where md5(host) = '".$mysql->escape($host)."'"); | 
| 24 | -	}else{ | |
| 24 | +	} else{ | |
| 25 | 25 |  		$mysql->runQuery(" | 
| 26 | 26 | update blockLists | 
| 27 | 27 | set isActive = '1' | 
| @@ -103,7 +103,7 @@ discard block | ||
| 103 | 103 |  			echo('<td style="text-align: center;">'); | 
| 104 | 104 |  			if($row['isActive']==0){ | 
| 105 | 105 |  				echo('<a data-blstatus="0" data-host="'.md5($row['host']).'" id="'.md5($row['host']).'" class="blockListLinks glyphicon glyphicon-remove" href="#"></a></td>'); | 
| 106 | -			}else{ | |
| 106 | +			} else{ | |
| 107 | 107 |  				echo('<a data-blstatus="1" data-host="'.md5($row['host']).'" id="'.md5($row['host']).'" class="blockListLinks glyphicon glyphicon-ok" href="#"></a></td>'); | 
| 108 | 108 | } | 
| 109 | 109 |  			echo('<td style="white-space: nowrap"><a target="_blank" href="'.$row['website'].'">'.$row['host'].'</a></td>'); | 
| @@ -3,7 +3,7 @@ discard block | ||
| 3 | 3 |  class_exists('Utilities', false) or include('classes/Utilities.class.php'); | 
| 4 | 4 |  class_exists('_MySQL', false) or include('classes/_MySQL.class.php'); | 
| 5 | 5 | |
| 6 | -if(Utilities::isLoggedIn()===false){ | |
| 6 | +if (Utilities::isLoggedIn()===false) { | |
| 7 | 7 |  	header('Location: login.php?location='.urlencode('hosts.php')); | 
| 8 | 8 | exit(); | 
| 9 | 9 | } | 
| @@ -15,13 +15,13 @@ discard block | ||
| 15 | 15 | $user = Utilities::getAccount(); | 
| 16 | 16 | $mysql = new _MySQL(); | 
| 17 | 17 | $mysql->connect(Setup::$connectionArray); | 
| 18 | -if($host != ''){ | |
| 19 | -	if($toggle==0){ | |
| 18 | +if ($host!='') { | |
| 19 | +	if ($toggle==0) { | |
| 20 | 20 |  		$mysql->runQuery(" | 
| 21 | 21 | update blockLists | 
| 22 | 22 | set isActive = '0' | 
| 23 | 23 | where md5(host) = '".$mysql->escape($host)."'"); | 
| 24 | -	}else{ | |
| 24 | +	}else { | |
| 25 | 25 |  		$mysql->runQuery(" | 
| 26 | 26 | update blockLists | 
| 27 | 27 | set isActive = '1' | 
| @@ -98,28 +98,28 @@ discard block | ||
| 98 | 98 | </thead> | 
| 99 | 99 | <tbody> | 
| 100 | 100 | <?php | 
| 101 | -		while($row = mysqli_fetch_array($rs)){ | |
| 101 | +		while ($row = mysqli_fetch_array($rs)) { | |
| 102 | 102 |  			echo('<tr>'); | 
| 103 | 103 |  			echo('<td style="text-align: center;">'); | 
| 104 | -			if($row['isActive']==0){ | |
| 104 | +			if ($row['isActive']==0) { | |
| 105 | 105 |  				echo('<a data-blstatus="0" data-host="'.md5($row['host']).'" id="'.md5($row['host']).'" class="blockListLinks glyphicon glyphicon-remove" href="#"></a></td>'); | 
| 106 | -			}else{ | |
| 106 | +			}else { | |
| 107 | 107 |  				echo('<a data-blstatus="1" data-host="'.md5($row['host']).'" id="'.md5($row['host']).'" class="blockListLinks glyphicon glyphicon-ok" href="#"></a></td>'); | 
| 108 | 108 | } | 
| 109 | 109 |  			echo('<td style="white-space: nowrap"><a target="_blank" href="'.$row['website'].'">'.$row['host'].'</a></td>'); | 
| 110 | 110 |  			echo('<td style="white-space: nowrap">'.($row['monitorType']=='ip' ? 'IP' : 'Domain').'</td>'); | 
| 111 | 111 |  			echo('<td>'.$row['description'].'</td>'); | 
| 112 | 112 |  			echo('<td style="text-align: center;">'); | 
| 113 | -			switch($row['importance']){ | |
| 113 | +			switch ($row['importance']) { | |
| 114 | 114 |  				case 3: echo('<span class="label label-primary">High</span>'); break; | 
| 115 | 115 |  				case 2: echo('<span class="label label-info">Medium</span>'); break; | 
| 116 | 116 |  				case 1: echo('<span class="label label-default">Low</span>'); break; | 
| 117 | 117 | } | 
| 118 | 118 |  			echo('</td>'); | 
| 119 | -			echo('<td style="white-space: nowrap">'.number_format($row['blocksToday'],0).'</td>'); | |
| 120 | -			echo('<td style="white-space: nowrap">'.number_format($row['cleanToday'],0).'</td>'); | |
| 121 | -			echo('<td style="white-space: nowrap">'.number_format($row['blocksYesterday'],0).'</td>'); | |
| 122 | -			echo('<td style="white-space: nowrap">'.number_format($row['cleanYesterday'],0).'</td>'); | |
| 119 | +			echo('<td style="white-space: nowrap">'.number_format($row['blocksToday'], 0).'</td>'); | |
| 120 | +			echo('<td style="white-space: nowrap">'.number_format($row['cleanToday'], 0).'</td>'); | |
| 121 | +			echo('<td style="white-space: nowrap">'.number_format($row['blocksYesterday'], 0).'</td>'); | |
| 122 | +			echo('<td style="white-space: nowrap">'.number_format($row['cleanYesterday'], 0).'</td>'); | |
| 123 | 123 |  			echo('</tr>'); | 
| 124 | 124 | } | 
| 125 | 125 | $mysql->close(); | 
| @@ -9,22 +9,22 @@ discard block | ||
| 9 | 9 | |
| 10 | 10 |  	public function __construct() { | 
| 11 | 11 | |
| 12 | -		if(self::$instance===null){ | |
| 12 | +		if (self::$instance===null) { | |
| 13 | 13 | |
| 14 | -			if(!file_exists('/etc/blacklistmonitor.cfg')) echo('no config file in /etc/blacklistmonitor.cfg'); | |
| 14 | +			if (!file_exists('/etc/blacklistmonitor.cfg')) echo('no config file in /etc/blacklistmonitor.cfg'); | |
| 15 | 15 |  			ini_set('error_reporting', E_ALL | E_STRICT | E_NOTICE); | 
| 16 | 16 |  			$cfg = parse_ini_file('/etc/blacklistmonitor.cfg', false); | 
| 17 | 17 |  			ini_set('display_errors', $cfg['display_errors']); | 
| 18 | 18 |  			ini_set('error_log', $cfg['log_path']); | 
| 19 | 19 | |
| 20 | 20 | self::$settings = $cfg; | 
| 21 | -			self::$settings['dns_servers'] = explode(',',$cfg['dns_servers']); | |
| 21 | +			self::$settings['dns_servers'] = explode(',', $cfg['dns_servers']); | |
| 22 | 22 | |
| 23 | 23 | // clean up | 
| 24 | - if(Setup::$settings['rbl_txt_extended_status']=='true' || | |
| 25 | -			  Setup::$settings['rbl_txt_extended_status']=='1'){ | |
| 24 | + if (Setup::$settings['rbl_txt_extended_status']=='true' || | |
| 25 | +			  Setup::$settings['rbl_txt_extended_status']=='1') { | |
| 26 | 26 | Setup::$settings['rbl_txt_extended_status'] = true; | 
| 27 | -			}else{ | |
| 27 | +			}else { | |
| 28 | 28 | Setup::$settings['rbl_txt_extended_status'] = false; | 
| 29 | 29 | } | 
| 30 | 30 | |
| @@ -44,6 +44,6 @@ discard block | ||
| 44 | 44 | } | 
| 45 | 45 | |
| 46 | 46 | Setup::$instance = new Setup(); | 
| 47 | -if(php_sapi_name()!=='cli'){ | |
| 47 | +if (php_sapi_name()!=='cli') { | |
| 48 | 48 | session_start(); | 
| 49 | 49 | } | 
| 50 | 50 | \ No newline at end of file | 
| @@ -11,7 +11,9 @@ discard block | ||
| 11 | 11 | |
| 12 | 12 |  		if(self::$instance===null){ | 
| 13 | 13 | |
| 14 | -			if(!file_exists('/etc/blacklistmonitor.cfg')) echo('no config file in /etc/blacklistmonitor.cfg'); | |
| 14 | +			if(!file_exists('/etc/blacklistmonitor.cfg')) { | |
| 15 | +				echo('no config file in /etc/blacklistmonitor.cfg'); | |
| 16 | + } | |
| 15 | 17 |  			ini_set('error_reporting', E_ALL | E_STRICT | E_NOTICE); | 
| 16 | 18 |  			$cfg = parse_ini_file('/etc/blacklistmonitor.cfg', false); | 
| 17 | 19 |  			ini_set('display_errors', $cfg['display_errors']); | 
| @@ -24,7 +26,7 @@ discard block | ||
| 24 | 26 | if(Setup::$settings['rbl_txt_extended_status']=='true' || | 
| 25 | 27 |  			  Setup::$settings['rbl_txt_extended_status']=='1'){ | 
| 26 | 28 | Setup::$settings['rbl_txt_extended_status'] = true; | 
| 27 | -			}else{ | |
| 29 | +			} else{ | |
| 28 | 30 | Setup::$settings['rbl_txt_extended_status'] = false; | 
| 29 | 31 | } | 
| 30 | 32 | |