Пример #1
0
function plugin_referer_pingback($page)
{
    global $_referer_msg;
    $pb = new PingBackFile($page);
    if (!$pb->has() || $pb->count() === 0) {
        return '<p class="alert alert-warning">' . $_referer_msg['msg_no_data'] . '</p>';
    }
    foreach ($pb->get() as $line) {
        list($time, $url, $title) = explode("\t", $line);
        $ret[] = '<li><a href="' . $url . '" rel="external">' . $title . '</a></li>';
    }
    return '<ul class="plugin-referer-pingbacklist">' . join("\n", $ret) . '</ul>';
}
Пример #2
0
 /**
  * Pingback
  *
  * @param string $source ページのPing送信用のアドレス
  * @param string $target ページのPing待受用のアドレス
  * @return int
  */
 public function ping($source, $target)
 {
     // Zend\Uri\Uriオブジェクトを生成
     $source_url = Uri::factory($source);
     $target_url = Uri::factory($target);
     // 無効なアドレス
     if (!$target_url->isValid()) {
         return self::RESPONSE_FAULT_TARGET_INVALID;
     }
     if (!$source_url->isValid()) {
         return self::RESPONSE_FAULT_GENERIC;
     }
     if ($target_url->getHost() === $source_url->getHost()) {
         // ターゲットとソースのホストが一緒
         // TODO: 同じドメインのサイトの場合、同じサイトとみなされる
         return self::RESPONSE_FAULT_SOURCE;
     }
     // 相手のサイトに接続
     $source_client = new Client($source_url);
     $source_response = $source_client->request(Client::GET);
     // 接続できたかをチェック
     if (!$source_response->isSuccessful()) {
         return self::RESPONSE_FAULT_SOURCE;
     }
     // 相手のサイトの中身を取得
     $source_body = $source_response->getBody();
     // 中身を取得できない
     if (!$source_body) {
         return self::RESPONSE_FAULT_SOURCE;
     }
     if ($target_url->getHost() !== $source_url->getHost() && strpos($source_body, $source_url) === false) {
         // ソース URI のデータにターゲット URI へのリンクが存在しないため、ソースとして使用できない。
         return self::RESPONSE_FAULT_SOURCE_LINK;
     }
     // 相手サイトのタイトルを取得(XMLとして処理した方がいい?)
     $source_titles = array();
     preg_match('/<title>([^<]*?)</title>/is', $source_body, $source_titles);
     // タイトルが存在しないUntitled
     $source_title = empty($source_titles[1]) ? self::UNTITLED_TITLE : $source_titles[1];
     // ターゲットのクエリを取得(自サイト)
     $query = $target_url->getQuery();
     if (empty($query)) {
         // http://[host]/[pagename]の場合(スラッシュは再エンコード)
         $r_page = str_replace('/', '%2F', $target_url->getPath());
         // $url_suffixが含まれる場合、正規表現でそこを削除
         //$page = empty($url_suffix) ? $r_page : preg_replace('/'.$url_suffix.'$/', '', $r_page);
         $page = rawurldecode($r_page);
         unset($r_page);
     } else {
         // ターゲットに=が含まれる場合はページではないので無効
         if (strpbrk($query, '=')) {
             return self::RESPONSE_FAULT_TARGET_INVALID;
         }
         $page = $query;
     }
     // ページ名からWikiを呼び出す
     $wiki = Factory::Wiki($page);
     if (!$wiki->isValied()) {
         // 無効なページ名
         return self::RESPONSE_FAULT_TARGET_INVALID;
     }
     if (!$wiki->isReadable()) {
         // 読み込み不可なページ
         return self::RESPONSE_FAULT_ACCESS_DENIED;
     }
     // PingBackファイルを読み込む
     $pb = new PingBackFile($page);
     $lines = $pb->get();
     if (count($lines) !== 0) {
         foreach ($lines as $line) {
             list($time, $url, $title) = explode("\t", $line);
             if ($url === $target_url) {
                 // すでに登録されている
                 return self::RESPONSE_FAULT_ALREADY_REGISTERED;
             }
         }
     }
     // 新しいデーターを登録
     $lines[] = join("\t", array(UTIME, $source_url, $source_title));
     // 保存
     $pb->set($lines);
     return self::RESPONSE_SUCCESS;
 }