Backport(バックポート) #2062
完了コミュニティのメンバー管理画面に戻るためのYes/Noフォームで「いいえ」を選ぶとアクセスエラーになる
100%
説明
現象¶
- 自分が管理者であるコミュニティページ(/community/:id)にアクセスする
- メンバー管理ページ(/community/member/manage?id=:id)にアクセスする
- メンバー管理画面に戻るためのYes/Noフォームがあるページへ遷移する
- 副管理者に対する「副管理者から降格」リンクから遷移できるページ (/community/removeSubAdmin/id/1/member_id/2) あるいは、
- コミュニティメンバーに対する「退会させる」リンクから遷移できるページ (/community/removeSubAdmin/id/1/member_id/2) のどちらでもよい。
- メンバー管理画面に戻るための「いいえ」ボタンを押下する
- /default/error エラーページへ遷移する
原因¶
#1004 での 修正 によって、以下のルーティングが指定されており、
community_memberManage: url: /community/member/manage param: { module: community, action: memberManage }
このルーティングにマッチした上で、クエリストリングとしてパラメータを含めようとする。 /community/member/manage?id=1 のようなURLとなる。
GET method のフォームに対して action 属性値に ?id=xxx の形のクエリストリングが付与されたURLを渡すと、action 属性値のパラメータを無視する実装のUAが多いらしい。 関連記事(「form action クエリ」や「form action querystring」で検索すると記事がいくつか見つかる) [1] [2]
上記のルーティングが定義されていない場合は lib/routing/opSymfonyDefaultRouteCollection.class.php で
$this->routes['default'] = new opDeprecatedRoute( '/:module/:action/*' );
のように定義されているルーティングにマッチし、 /community/memberManage/id/123 のようなURLとなり、パラメータが渡っていたため想定通りに動作していた。
修正内容¶
PC版、携帯版ともに、ルーティングの定義を
community_memberManage: url: /community/member/manage param: { module: community, action: memberManage }
から、id パラメータを含めた形
community_memberManage: url: /community/member/manage/:id param: { module: community, action: memberManage } requirements: { id: \d+ }
に変更する。
当該のYes/Noフォームにおいて、action 属性値に含まれるクエリストリングを input 要素などを介して渡すことでこの問題を回避することも可能だが、本質的な解決策ではない。
補足¶
この問題は #1004 での修正における書き換え時のミスだと思われる。
- id を付加する必要性について
- community/memberManage アクションは、特定の id のコミュニティのメンバー管理画面を表示するためのアクションである。つまり id を受け取ることを前提としている。
- lib/action/opCommunityAction.class.php の preExecute() メソッドおよび executeMemberManage($request) を見れば明らかである。
- community/memberManage アクションは、特定の id のコミュニティのメンバー管理画面を表示するためのアクションである。つまり id を受け取ることを前提としている。
- ルーティング定義を変更してしまうことによる副作用はないか
- id を受け取らない community/memberManage の呼び出しは前述のとおり想定されていないため、もしそのようなリンクがあったとしてもエラーページに飛ばされるだけである。
- community/memberManage アクションを指すURL /community/member/manage (idを含まないURL)が無くなっても問題はないと判断している。
Masato Nagasawa さんが13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 d75a66ebbe5abe661da5685a827b47404fc1837f で適用されました。
Kousuke Ebihara さんが13年以上前に更新
- 対象バージョン を OpenPNE3.6beta11 から OpenPNE3.6beta12 に変更
親チケットが「テスト待ち」「完了」でないものをすべて beta12 以降での対応とします。
Minoru Takai さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Accepted(着手) に変更
- 担当者 を Masato Nagasawa から Minoru Takai に変更
修正方針を変更する可能性があります。親チケットが完了次第着手します。
Minoru Takai さんが13年以上前に更新
- 題名 を コミュニティの副管理者降格画面(/community/removeSubAdmin/id/:id/member_id/:id)で「いいえ」を選ぶとアクセスエラーになる から コミュニティのメンバー管理画面に戻るためのYes/Noフォームで「いいえ」を選ぶとアクセスエラーになる に変更
Minoru Takai さんが13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
更新履歴 73872e3bbcbb65e7ffc69572f89233e41d18cdd4 で適用されました。
Naoya Tozuka さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
新修正方針に基づいた修正を確認しました。問題ありません。
Minoru Takai さんが13年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Pending Review(レビュー待ち) に変更
- 進捗率 を 70 から 50 に変更
更新履歴 674dbc8a2a594c4c56d722620cc2fc4fbad3b086 で適用されました。
Kousuke Ebihara さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
http://redmine.openpne.jp/issues/2062#note-10 のリリースブランチへの取り込みでステータスが「レビュー待ち」に巻き戻ってしまいましたので、もとに戻します。
Minoru Takai さんが13年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更