@@ -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 | |