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 以前では再現しません。