Backport(バックポート) #2199
完了仮登録状態でメンバープロフィールページにアクセスするとFatal Error
100%
説明
概要¶
OpenPNE-3.6.x 以降で、認証が不要なページ(外部公開コンテンツのページ)に仮登録中にアクセスすると、その一部のページで Fatal Error が発生する。
例えば、次の手順でエラーの発生を確認できる。
- SNSから招待状(新規登録メール)をユーザ A に送る
- ユーザ A が、その招待状の登録用URLにアクセスする
- プロフィール入力フォームのあるページへ遷移する
- その状態で(他のページにアクセスせずに) member/1 にアクセスする
主なロールとして、以下の状態がある。
- ログイン中メンバー
- 仮登録中メンバー
- 非ログインユーザ
権限があるロールかを確認するために opSercurityUser::getMember() の返り値を用いている箇所(※)があるが、そこでは getMember() が Member オブジェクトか opAnonymousMember オブジェクトを返すことを前提としている。しかし仮登録中である場合には getMember() は false が返っているため Fatal Error が生じている。
- ※ opDynamicAclRoute::getObject() : 39 行目の $this->getCurrentMemner() では Member オブジェクトかそのサブクラスのオブジェクトが返ることを期待している
lib/routing/opDynamicAclRoute.class.php 37- if ($result instanceof opAccessControlRecordInterface) 38- { 39- if (!$result->isAllowed($this->getCurrentMember(), $this->options['privilege']))
また、「ログイン中メンバー」であることを確認するために opSecurityUser::getMemberId() を用いている箇所があるが、「仮登録中メンバー」であっても member_id が取得できてしまうため、権限を正しく判定できていない。
修正方針¶
opSecurityUser::getMember(), opSecurityUser::getMemberId() が返す値の仕様を変更する。
詳細は note-16 以降を参照。
対象バージョン¶
- stable-3.6.x ブランチ
- master ブランチ
3.4.x 以前は外部公開機能がなく 3.6.x 以降と事情が異なるため、この問題の対象ではない(仮に似た問題があったとしても別のものと考えたほうがよい)。
チケット作成時の内容¶
仮登録状態でメンバープロフィールページにアクセスするとFatal Error
現象¶
OpenPNE-3.6beta8 で、仮登録状態でメンバープロフィールページにアクセスすると Fatal Error が発生する。
Catchable fatal error: Argument 1 passed to opDoctrineRecord::isAllowed() must be an instance of Member, boolean given, called in /home/imamura/sns/36x.bughunt.uh-openpne5.pne.jp/lib/routing/opDynamicAclRoute.class.php on line 34 and defined in /home/imamura/sns/36x.bughunt.uh-openpne5.pne.jp/lib/util/opDoctrineRecord.class.php on line 154
再現手順¶
- SNSから招待状(新規登録メール)をユーザ A に送る
- ユーザ A が、その招待状の登録用URLにアクセスする
- プロフィール入力フォームのあるページへ遷移する
- その状態で(他のページにアクセスせずに) member/1 にアクセスする
再現バージョン¶
- OpenPNE3.6beta8 で確認、 master でも確認
- OpenPNE3.0、3.2、3.4では再現しません。
OpenPNE-3.4.x 以前では再現しません。
Kousuke Ebihara さんが13年以上前に更新
- 対象バージョン を OpenPNE3.6beta11 から OpenPNE3.6beta12 に変更
親チケットが「テスト待ち」「完了」でないものをすべて beta12 以降での対応とします。
Maki Takahashi さんが13年以上前に更新
- ステータス を New(新規) から Accepted(着手) に変更
- 担当者 を Shingo Yamada から Maki Takahashi に変更
BP引き受けます
匿名ユーザー さんが13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 695c7b25d3d051ac5a75bfd0697da990977bce89 で適用されました。
Kousuke Ebihara さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Mutsumi Imamura さんが13年以上前に更新
テスト実施しました。特に問題はありませんでした。
メンバーから招待、管理画面からの招待、自分で新規登録のそれぞれの方法で仮登録状態をつくり、web全体に公開しているメンバーのプロフィールページと、全体に公開(SNS内)にしているメンバーのプロフィールページにそれぞれアクセスする動作を確認しました。
opAshiatoPluginが有効になっている場合、仮登録状態でweb全体に公開しているプロフィールページにアクセスすると下記のような500エラーが発生します。
この問題はあしあとプラグインの問題と判断し別のチケットで対応することとします。
500 | Internal Server Error | Doctrine_Connection_Mysql_Exception SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`36beta13_tetete/ashiato`, CONSTRAINT `ashiato_member_id_from_member_id` FOREIGN KEY (`member_id_from`) REFERENCES `member` (`id`) ON DELETE SET NULL)
Mutsumi Imamura さんが13年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
opAshiatoPluginが有効になっている場合、仮登録状態でweb全体に公開しているプロフィールページにアクセスすると下記のような500エラーが発生します。
この問題についてのチケットを作成しました。
SNS仮登録状態でWeb全体に公開しているプロフィールのページにアクセスすると500エラーが発生する
http://redmine.openpne.jp/issues/2359