プロジェクト

全般

プロフィール

Bug(バグ) #4055

OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターからアクセスする日記やコミュニティのURLが正しくない

kaoru n7年以上前に追加. ほぼ4年前に更新.

ステータス:
Fixed(完了)
優先度:
Normal(通常)
担当者:
対象バージョン:
開始日:
2016-11-21
期日:
進捗率:

100%

3.6 で発生するか:
No (いいえ)
3.8 で発生するか:
Yes (はい)

説明

Overview (現象)

OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターから日記等にアクセスする場合、http://example.com/sns/diary/1 のようなURLになるべきであるが、http://example.com/diary/1 にアクセスしてしまう。

Causes (原因)

通知センターに表示される通知のリンク先は、opNotificationCenter::notify()url パラメーターによって指定される。
このパラメーターを実装した当初は diary/show?id=1@diary_show?id=1 のような url_for ヘルパーに指定するための Internal URI の形式を想定していた。
しかし、実際には誤った実装によって Internal URI での指定は正しく機能していない状態となっていた。
(opJsonApiHelper が実行されるのは api アプリケーションであるため、url_for ではなく app_url_for を呼び出すのが正しい)

source:apps/api/lib/helper/opJsonApiHelper.php@8205623#L203

    'url' => $notification['url'] ? url_for($notification['url'], array('abstract' => true)) : null,

通知センターによる通知機能を提供するプラグイン等では、上記の不具合を避けるために Internal URI ではなく /diary/1 などの URI を直接出力することで目的の URI へのリンクを実現している。

しかし、/diary/1 などの URI を指定した場合には、本来 url_forapp_url_for であれば自動的に付加されるサブディレクトリ部分の相対パス (sfWebRequest::getRelativeUrlRoot() に相当) が付加されないため、当チケットで報告されているような OpenPNE をサブディレクトリに設置した場合のリンクの不具合が生じる。

Way to fix (修正内容)

JSON API の /api.php/push/search.json の実装を修正し、opNotificationCenter::notify()url パラメーターに Internal URI が指定された場合でも正しく動作するようにする。この場合は、API 実行時にサブディレクトリを考慮した URI が生成されるものとする。

また、/diary/1 のような URI を直接 url パラメーターに指定していたプラグイン等との互換性を保つため、先頭が / から始まる URI であった場合には app_url_for ヘルパーを介さずに直接文字列を出力するように対応する。
この場合は、API 側ではサブディレクトリ部分の付加は行わずに出力する。これは、opLikePlugin のようにプラグイン側で独自にサブディレクトリ部分を付加した URI を url パラメーターに指定している実装が存在しており、一律な対応を執ることが困難なためである。


子チケット

Backport(バックポート) #4057: OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターからアクセスする日記やコミュニティのURLが正しくないInvalid(無効)isao sano

Backport(バックポート) #4058: OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターからアクセスする日記やコミュニティのURLが正しくないFixed(完了)Youichi Kimura

Backport(バックポート) #4379: OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターからアクセスする日記やコミュニティのURLが正しくないFixed(完了)isao sano


関連するチケット

関連している opLikePlugin - Enhancement(機能追加・改善) #4064: OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターからアクセスするURLが正しくない問題に対する opLikePlugin の独自修正を取り除く Won't fix(対応せず) 2016-12-02

関係しているリビジョン

リビジョン 89bdfabb (差分)
Youichi Kimuraほぼ4年前に追加

allow internal uri (the 'url_for()' format) for notification url (fixes #4055)

リビジョン 7876a312 (差分)
Youichi Kimuraほぼ4年前に追加

make case-insensitive to notification URI scheme (refs #4055)

リビジョン 7afda381
kaoru nほぼ4年前に追加

Merge pull request #604 from nishizoe/t-4055-master

allow internal uri (the 'url_for()' format) for notification url (fixes #4055)

履歴

#1 kaoru n7年以上前に更新

  • ステータスNew(新規) から Accepted(着手) に変更
  • 担当者kaoru n にセット
  • 対象バージョンOpenPNE 3.9.0-old にセット

#2 kaoru n7年以上前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

https://github.com/openpne/OpenPNE3/pull/393
にてプルリクエストしました。
レビューをお願いします。

#3 isao sano7年以上前に更新

  • 関連している Backport(バックポート) #4057: OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターからアクセスする日記やコミュニティのURLが正しくない を追加

#4 isao sano7年以上前に更新

  • 関連している Backport(バックポート) #4058: OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターからアクセスする日記やコミュニティのURLが正しくない を追加

#6 kaoru n7年以上前に更新

  • 関連している Enhancement(機能追加・改善) #4064: OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターからアクセスするURLが正しくない問題に対する opLikePlugin の独自修正を取り除く を追加

#7 Shinichi Urabe7年以上前に更新

  • ステータスPending Review(レビュー待ち) から Rejected(差し戻し) に変更

ソースを見る限り openpne.baseUrl には http://xxx.xxx/sns のように HTTP スキームから始まるような URL が入ることがないとは思われるが
含まれた場合 http:/xxx.xxx/sns のように置換されてしまう、念のためその点も考慮したほうがよいと思われる

var linkUrl = 'http://example.com//test/test/test//test';
linkUrl.replace(/\/\//g, "/");

→ 結果: "http:/example.com/test/test/test/test"

必要とされて // 連続するスラッシュがURLに含まれる可能性があるか分からないが、 data-location-url や openpne.baseUrl に含められる文字列を過剰に置換する可能性があるのは懸念点となる
対応としては結合される data-location-url の先頭、openpne.baseUrl の末尾に一つだけ / が存在するようにしておくほうが望ましい

#8 kaoru n7年以上前に更新

  • ステータスRejected(差し戻し) から Pending Review(レビュー待ち) に変更

https://github.com/openpne/OpenPNE3/blob/stable-3.8.x/apps/pc_frontend/templates/_layout.php#L22
のように、openpne.baseUrl は末尾に '/' が一つ付与されるため、data-location-url の先頭の '/' を取り除いて文字列を連結するように プルリクエストを更新しました。
https://github.com/openpne/OpenPNE3/pull/393

#9 kaoru n7年以上前に更新

  • 3.6 で発生するかUnknown (未調査) から No (いいえ) に変更
  • 3.8 で発生するかUnknown (未調査) から Yes (はい) に変更

#10 Shinichi Urabe7年以上前に更新

  • ステータスPending Review(レビュー待ち) から Rejected(差し戻し) に変更

Javascript のコーディング規約はありませんが、少なくとも web/js/jquery.notify.js 内の文字リテラルは ' シングルクオートで囲んでいますので、統一しておいたほうがよいです
dataLocationUrl.replace(/^\/*/g, ""); の空文字のダブルクオートの箇所

#11 kaoru n7年以上前に更新

  • ステータスRejected(差し戻し) から Pending Review(レビュー待ち) に変更

変換文字列をダブルクォートではなくシングルクオートで囲むように修正しました
https://github.com/openpne/OpenPNE3/pull/393

#12 Shinichi Urabe7年以上前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

#13 kaoru n7年以上前に更新

  • ステータスPending Testing(テスト待ち) から Rejected(差し戻し) に変更
  • 進捗率70 から 50 に変更

各プラグインにてサブディレクトリについて考慮されているものもあるため、下記の方針での修正とします。
・渡されたURLが「/」からはじまっている場合は、通知センター側でそのまま使用する、インターナルURIで渡された場合は、サブディレクトリ考慮するよう対応する
・プラグイン側は、現在サブディレクトリを考慮している場合はそのままでよい、考慮してないない場合は、インターナルURIで渡すように変更する

#14 kaoru n7年以上前に更新

  • ステータスRejected(差し戻し) から Pending Review(レビュー待ち) に変更

#4055-13 の仕様となるよう
https://github.com/openpne/OpenPNE3/pull/393
を更新しました。

渡されたURLが「/」からはじまっている場合のうち、「///」とスラッシュが連続していても通知センターでは考慮しません。
また、「http://」等から始まっている場合でも、「/」から始まっていないため、openpne.baseUrl を先頭に連結します。

#15 kaoru n7年以上前に更新

各プラグインの状況

#16 Shinichi Urabe7年以上前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

#17 Youichi Kimura7年以上前に更新

  • ステータスPending Testing(テスト待ち) から Pending Review(レビュー待ち) に変更
  • 進捗率70 から 50 に変更

#4055-13 についてですが、通知の URL に internal uri (@obj_member_profile?id=1member/1 のような形式) が使用された場合にサブディレクトリを考慮した URL を出力するというのは、JS 側ではなく API 側での対応を想定していました。
// 伝わりにくくてすみません...

以下の Pull Request が想定している修正内容です。
https://github.com/openpne/OpenPNE3/pull/433

各プラグインにおける修正との兼ね合いもあるため、この内容でプラグインが対応可能であるかもどうか念のため確認をお願いします。

#18 kaoru n約7年前に更新

  • 担当者kaoru n から Youichi Kimura に変更

#19 Shinichi Urabe約7年前に更新

  • ステータスPending Review(レビュー待ち) から Rejected(差し戻し) に変更
  • 課題本文の説明にある「原因」とそれに対する「修正内容」が以前の内容のままです
  • HTTPs:// のように URL スキームに大文字が混ざっている場合は想定しない動作になります

#20 Youichi Kimura約7年前に更新

  • 説明 を更新 (diff)
  • ステータスRejected(差し戻し) から Pending Review(レビュー待ち) に変更

#4055-19 の指摘について修正しました(master ブランチが変更になったため PR の扱いは要検討)
https://github.com/openpne/OpenPNE3/pull/433

#21 kaoru n約7年前に更新

  • ステータスPending Review(レビュー待ち) から Rejected(差し戻し) に変更
  • 対象バージョンOpenPNE 3.9.0-old から OpenPNE 3.9.0 に変更

対象バージョン変更により修正内容の確認が必要であるため差し戻します。

#22 isao sano約6年前に更新

  • ステータスRejected(差し戻し) から Accepted(着手) に変更
  • 進捗率50 から 0 に変更

#23 isao sano約6年前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

https://github.com/openpne/OpenPNE3/pull/502
にてプルリクエストしました。

#24 Rimpei Ogawa約6年前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

#25 kaoru n約4年前に更新

  • 対象バージョンOpenPNE 3.9.0 から OpenPNE 3.10.x に変更

#26 kaoru nほぼ4年前に更新

https://github.com/openpne/OpenPNE3/pull/604
3.11.0-dev 向けに rebase しました。

https://github.com/openpne/OpenPNE3/pull/502
はクローズ。

#27 isao sanoほぼ4年前に更新

  • ステータスPending Testing(テスト待ち) から Pending Merge(マージ待ち) に変更
  • 進捗率70 から 80 に変更

試験完了しました。
問題ありません。

#28 kaoru nほぼ4年前に更新

  • ステータスPending Merge(マージ待ち) から Fixed(完了) に変更
  • 進捗率80 から 100 に変更

マージしました

他の形式にエクスポート: Atom PDF