| 682 | | debug_fwrite($log, 'Processing -- '.$pagelinkedto."\n\n"); |
|---|
| 683 | | |
|---|
| 684 | | $bits = parse_url($pagelinkedto); |
|---|
| 685 | | if (!isset($bits['host'])) { |
|---|
| 686 | | debug_fwrite($log, 'Couldn\'t find a hostname for '.$pagelinkedto."\n\n"); |
|---|
| 687 | | continue; |
|---|
| 688 | | } |
|---|
| 689 | | $host = $bits['host']; |
|---|
| 690 | | $path = isset($bits['path']) ? $bits['path'] : ''; |
|---|
| 691 | | if (isset($bits['query'])) { |
|---|
| 692 | | $path .= '?'.$bits['query']; |
|---|
| 693 | | } |
|---|
| 694 | | if (!$path) { |
|---|
| 695 | | $path = '/'; |
|---|
| 696 | | } |
|---|
| 697 | | $port = isset($bits['port']) ? $bits['port'] : 80; |
|---|
| 698 | | |
|---|
| 699 | | // Try to connect to the server at $host |
|---|
| 700 | | $fp = fsockopen($host, $port, $errno, $errstr, 3); |
|---|
| 701 | | if (!$fp) { |
|---|
| 702 | | debug_fwrite($log, 'Couldn\'t open a connection to '.$host."\n\n"); |
|---|
| 703 | | continue; |
|---|
| 704 | | } |
|---|
| 705 | | |
|---|
| 706 | | // Send the GET request |
|---|
| 707 | | $request = "GET $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: WordPress/$wp_version PHP/" . phpversion() . "\r\n\r\n"; |
|---|
| 708 | | ob_end_flush(); |
|---|
| 709 | | fputs($fp, $request); |
|---|
| 710 | | |
|---|
| 711 | | // Start receiving headers and content |
|---|
| 712 | | $contents = ''; |
|---|
| 713 | | $headers = ''; |
|---|
| 714 | | $gettingHeaders = true; |
|---|
| 715 | | $found_pingback_server = 0; |
|---|
| 716 | | while (!feof($fp)) { |
|---|
| 717 | | $line = fgets($fp, 4096); |
|---|
| 718 | | if (trim($line) == '') { |
|---|
| 719 | | $gettingHeaders = false; |
|---|
| 720 | | } |
|---|
| 721 | | if (!$gettingHeaders) { |
|---|
| 722 | | $contents .= trim($line)."\n"; |
|---|
| 723 | | $pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote); |
|---|
| 724 | | $pingback_link_offset_squote = strpos($contents, $pingback_str_squote); |
|---|
| 725 | | } else { |
|---|
| 726 | | $headers .= trim($line)."\n"; |
|---|
| 727 | | $x_pingback_header_offset = strpos(strtolower($headers), $x_pingback_str); |
|---|
| 728 | | } |
|---|
| 729 | | if ($x_pingback_header_offset) { |
|---|
| 730 | | preg_match('#x-pingback: (.+)#is', $headers, $matches); |
|---|
| 731 | | $pingback_server_url = trim($matches[1]); |
|---|
| 732 | | debug_fwrite($log, "Pingback server found from X-Pingback header @ $pingback_server_url\n"); |
|---|
| 733 | | $found_pingback_server = 1; |
|---|
| 734 | | break; |
|---|
| 735 | | } |
|---|
| 736 | | if ($pingback_link_offset_dquote || $pingback_link_offset_squote) { |
|---|
| 737 | | $quote = ($pingback_link_offset_dquote) ? '"' : '\''; |
|---|
| 738 | | $pingback_link_offset = ($quote=='"') ? $pingback_link_offset_dquote : $pingback_link_offset_squote; |
|---|
| 739 | | $pingback_href_pos = @strpos($contents, 'href=', $pingback_link_offset); |
|---|
| 740 | | $pingback_href_start = $pingback_href_pos+6; |
|---|
| 741 | | $pingback_href_end = @strpos($contents, $quote, $pingback_href_start); |
|---|
| 742 | | $pingback_server_url_len = $pingback_href_end-$pingback_href_start; |
|---|
| 743 | | $pingback_server_url = substr($contents, $pingback_href_start, $pingback_server_url_len); |
|---|
| 744 | | debug_fwrite($log, "Pingback server found from Pingback <link /> tag @ $pingback_server_url\n"); |
|---|
| 745 | | $found_pingback_server = 1; |
|---|
| 746 | | break; |
|---|
| 747 | | } |
|---|
| 748 | | } |
|---|
| 749 | | |
|---|
| 750 | | if (!$found_pingback_server) { |
|---|
| 751 | | debug_fwrite($log, "Pingback server not found\n\n*************************\n\n"); |
|---|
| 752 | | @fclose($fp); |
|---|
| 753 | | } else { |
|---|
| | 678 | |
|---|
| | 679 | debug_fwrite($log, "Processing -- $pagelinkedto\n"); |
|---|
| | 680 | $pingback_server_url = discover_pingback_server_uri($pagelinkedto, 2048); |
|---|
| | 681 | |
|---|
| | 682 | if($pingback_server_url) { |
|---|
| | 709 | |
|---|
| | 710 | function discover_pingback_server_uri($url, $timeout_bytes = 2048) { |
|---|
| | 711 | |
|---|
| | 712 | $byte_count = 0; |
|---|
| | 713 | $contents = ''; |
|---|
| | 714 | $headers = ''; |
|---|
| | 715 | $pingback_str_dquote = 'rel="pingback"'; |
|---|
| | 716 | $pingback_str_squote = 'rel=\'pingback\''; |
|---|
| | 717 | $x_pingback_str = 'x-pingback: '; |
|---|
| | 718 | $pingback_href_original_pos = 27; |
|---|
| | 719 | |
|---|
| | 720 | extract(parse_url($url)); |
|---|
| | 721 | |
|---|
| | 722 | if (!isset($host)) { |
|---|
| | 723 | // Not an URL. This should never happen. |
|---|
| | 724 | return false; |
|---|
| | 725 | } |
|---|
| | 726 | |
|---|
| | 727 | $path = (!isset($path)) ? '/' : $path; |
|---|
| | 728 | $path .= (isset($query)) ? '?'.$query : ''; |
|---|
| | 729 | $port = (isset($port)) ? $port : 80; |
|---|
| | 730 | |
|---|
| | 731 | // Try to connect to the server at $host |
|---|
| | 732 | $fp = fsockopen($host, $port, $errno, $errstr, 3); |
|---|
| | 733 | if (!$fp) { |
|---|
| | 734 | // Couldn't open a connection to $host; |
|---|
| | 735 | return false; |
|---|
| | 736 | } |
|---|
| | 737 | |
|---|
| | 738 | // Send the GET request |
|---|
| | 739 | $request = "GET $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: WordPress/$wp_version PHP/" . phpversion() . "\r\n\r\n"; |
|---|
| | 740 | ob_end_flush(); |
|---|
| | 741 | fputs($fp, $request); |
|---|
| | 742 | |
|---|
| | 743 | // Let's check for an X-Pingback header first |
|---|
| | 744 | while (!feof($fp)) { |
|---|
| | 745 | $line = fgets($fp, 512); |
|---|
| | 746 | if (trim($line) == '') { |
|---|
| | 747 | break; |
|---|
| | 748 | } |
|---|
| | 749 | $headers .= trim($line)."\n"; |
|---|
| | 750 | $x_pingback_header_offset = strpos(strtolower($headers), $x_pingback_str); |
|---|
| | 751 | if ($x_pingback_header_offset) { |
|---|
| | 752 | // We got it! |
|---|
| | 753 | preg_match('#x-pingback: (.+)#is', $headers, $matches); |
|---|
| | 754 | $pingback_server_url = trim($matches[1]); |
|---|
| | 755 | return $pingback_server_url; |
|---|
| | 756 | } |
|---|
| | 757 | if(strpos(strtolower($headers), 'content-type: ')) { |
|---|
| | 758 | preg_match('#content-type: (.+)#is', $headers, $matches); |
|---|
| | 759 | $content_type = trim($matches[1]); |
|---|
| | 760 | } |
|---|
| | 761 | } |
|---|
| | 762 | |
|---|
| | 763 | if (preg_match('#(image|audio|video|model)/#is', $content_type)) { |
|---|
| | 764 | // Not an (x)html, sgml, or xml page, no use going further |
|---|
| | 765 | return false; |
|---|
| | 766 | } |
|---|
| | 767 | |
|---|
| | 768 | while (!feof($fp)) { |
|---|
| | 769 | $line = fgets($fp, 1024); |
|---|
| | 770 | $contents .= trim($line); |
|---|
| | 771 | $pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote); |
|---|
| | 772 | $pingback_link_offset_squote = strpos($contents, $pingback_str_squote); |
|---|
| | 773 | if ($pingback_link_offset_dquote || $pingback_link_offset_squote) { |
|---|
| | 774 | $quote = ($pingback_link_offset_dquote) ? '"' : '\''; |
|---|
| | 775 | $pingback_link_offset = ($quote=='"') ? $pingback_link_offset_dquote : $pingback_link_offset_squote; |
|---|
| | 776 | $pingback_href_pos = @strpos($contents, 'href=', $pingback_link_offset); |
|---|
| | 777 | $pingback_href_start = $pingback_href_pos+6; |
|---|
| | 778 | $pingback_href_end = @strpos($contents, $quote, $pingback_href_start); |
|---|
| | 779 | $pingback_server_url_len = $pingback_href_end - $pingback_href_start; |
|---|
| | 780 | $pingback_server_url = substr($contents, $pingback_href_start, $pingback_server_url_len); |
|---|
| | 781 | // We may find rel="pingback" but an incomplete pingback URI |
|---|
| | 782 | if ($pingback_server_url_len > 0) { |
|---|
| | 783 | // We got it! |
|---|
| | 784 | return $pingback_server_url; |
|---|
| | 785 | } |
|---|
| | 786 | } |
|---|
| | 787 | $byte_count += strlen($line); |
|---|
| | 788 | if ($byte_count > $timeout_bytes) { |
|---|
| | 789 | // It's no use going further, there probably isn't any pingback |
|---|
| | 790 | // server to find in this file. (Prevents loading large files.) |
|---|
| | 791 | return false; |
|---|
| | 792 | } |
|---|
| | 793 | } |
|---|
| | 794 | |
|---|
| | 795 | // We didn't find anything. |
|---|
| | 796 | return false; |
|---|
| | 797 | } |
|---|
| | 798 | |
|---|