Bug(バグ) #4055
完了OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターからアクセスする日記やコミュニティのURLが正しくない
100%
説明
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_for
や app_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
パラメーターに指定している実装が存在しており、一律な対応を執ることが困難なためである。
kaoru n さんがほぼ8年前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
https://github.com/openpne/OpenPNE3/pull/393
にてプルリクエストしました。
レビューをお願いします。
isao sano さんがほぼ8年前に更新
- 関連している Backport(バックポート) #4057: OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターからアクセスする日記やコミュニティのURLが正しくない を追加
isao sano さんがほぼ8年前に更新
- 関連している Backport(バックポート) #4058: OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターからアクセスする日記やコミュニティのURLが正しくない を追加
kaoru n さんがほぼ8年前に更新
- 関連している Enhancement(機能追加・改善) #4064: OpenPNE が http://example.com/sns/ のようにサブディレクトリ以下に設置されている場合に、通知センターからアクセスするURLが正しくない問題に対する opLikePlugin の独自修正を取り除く を追加
Shinichi Urabe さんがほぼ8年前に更新
- ステータス を 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
の末尾に一つだけ /
が存在するようにしておくほうが望ましい
kaoru n さんがほぼ8年前に更新
- ステータス を 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
Shinichi Urabe さんがほぼ8年前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
Javascript のコーディング規約はありませんが、少なくとも web/js/jquery.notify.js 内の文字リテラルは '
シングルクオートで囲んでいますので、統一しておいたほうがよいですdataLocationUrl.replace(/^\/*/g, "");
の空文字のダブルクオートの箇所
kaoru n さんがほぼ8年前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
変換文字列をダブルクォートではなくシングルクオートで囲むように修正しました
https://github.com/openpne/OpenPNE3/pull/393
Shinichi Urabe さんがほぼ8年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
kaoru n さんがほぼ8年前に更新
- opLikePlugin 独自にサブディレクトリを考慮している( #4064-8 参照)
- opCommunityTopicPlugin(1.1.x) 独自にサブディレクトリを考慮している
- opMessagePlugin(2.0.0) 独自にサブディレクトリを考慮している
- opTimelinePlugin
https://github.com/tejimaya/opTimelinePlugin/blob/master/lib/util/opTimelinePluginUtil.class.php#L36
にて、通知するよう実装があるが、hasScreenName() はどこからもコールされていないので、現状通知は行われない
対応するチケットのみ作成 #4075
Shinichi Urabe さんがほぼ8年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Youichi Kimura さんがほぼ8年前に更新
- ステータス を Pending Testing(テスト待ち) から Pending Review(レビュー待ち) に変更
- 進捗率 を 70 から 50 に変更
#4055-13 についてですが、通知の URL に internal uri (@obj_member_profile?id=1
や member/1
のような形式) が使用された場合にサブディレクトリを考慮した URL を出力するというのは、JS 側ではなく API 側での対応を想定していました。
// 伝わりにくくてすみません...
以下の Pull Request が想定している修正内容です。
https://github.com/openpne/OpenPNE3/pull/433
各プラグインにおける修正との兼ね合いもあるため、この内容でプラグインが対応可能であるかもどうか念のため確認をお願いします。
Shinichi Urabe さんが7年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
- 課題本文の説明にある「原因」とそれに対する「修正内容」が以前の内容のままです
HTTPs://
のように URL スキームに大文字が混ざっている場合は想定しない動作になります
Youichi Kimura さんが7年以上前に更新
- 説明 を更新 (差分)
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
#4055-19 の指摘について修正しました(master ブランチが変更になったため PR の扱いは要検討)
https://github.com/openpne/OpenPNE3/pull/433
isao sano さんが6年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
https://github.com/openpne/OpenPNE3/pull/502
にてプルリクエストしました。
Rimpei Ogawa さんが6年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
kaoru n さんが4年以上前に更新
https://github.com/openpne/OpenPNE3/pull/604
3.11.0-dev 向けに rebase しました。