Backport(バックポート) #2199
Minoru Takai さんが13年以上前に更新
h3. 概要 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 オブジェクトかそのサブクラスのオブジェクトが返ることを期待している <pre> lib/routing/opDynamicAclRoute.class.php 37- if ($result instanceof opAccessControlRecordInterface) 38- { 39- if (!$result->isAllowed($this->getCurrentMember(), $this->options['privilege'])) </pre> また、「ログイン中メンバー」であることを確認するために opSecurityUser::getMemberId() を用いている箇所があるが、「仮登録中メンバー」であっても member_id が取得できてしまうため、権限を正しく判定できていない。 h3. 修正方針 opSecurityUser::getMember(), opSecurityUser::getMemberId() が返す値の仕様を変更する。 詳細は "note-16":http://redmine.openpne.jp/issues/1944#note-16 以降を参照。 h3. 対象バージョン * stable-3.6.x ブランチ * master ブランチ 3.4.x 以前は外部公開機能がなく 3.6.x 以降と事情が異なるため、この問題の対象ではない(仮に似た問題があったとしても別のものと考えたほうがよい)。 h2. チケット作成時の内容 仮登録状態でメンバープロフィールページにアクセスするとFatal Error h3. 現象 OpenPNE-3.6beta8 で、仮登録状態でメンバープロフィールページにアクセスすると Fatal Error が発生する。 OpenPNE3.6beta8で仮登録状態で、メンバープロフィールページにアクセスするとFatal Errorが発生します。 <pre> 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 </pre> h3. 再現手順 # SNSから招待状(新規登録メール)をユーザ 1. メンバー A に送る がプロフィール確認画面を開く # ユーザ A が、その招待状の登録用URLにアクセスする 2. 1. に記載されているの URL を控えておく(例:http://36x.bughunt.uh-openpne5.pne.jp/pc_frontend_dev.php/member/1) # プロフィール入力フォームのあるページへ遷移する 3. ログアウトする # その状態で(他のページにアクセスせずに) member/1 4. 管理画面からメンバー B 宛に招待メールを送信する 5. メンバー B がその招待メールに記述された URL にアクセスする 6. メンバー登録フォームが表示されたことを確認できたら、 2. で控えておいた URL にアクセスする h3. 再現バージョン * OpenPNE3.6beta8 で確認、 master でも確認 * OpenPNE3.0、3.2、3.4では再現しません。 OpenPNE-3.4.x 以前では再現しません。 追記 OpenPNE-3.6beta9 master(OpenPNE-3.7.0) でも再現します。 h3. 原因 h3. 修正内容