Bug(バグ) #2344
完了携帯で新規登録が出来ない
100%
説明
Overview (現象)¶
OpenPNE3.4.15-devで、携帯で新規登録ができない。
新規登録リンクをクリックし、opAuthMailAddress/requestRegisterURLのページから登録ページのURLを取得しようとすると、「サーバーが混み合っています」というエラーメッセージが携帯メールに届く。
再現バージョン¶
- OpenPNE3.4.13 〜 OpenPNE3.4.15-dev
- opAuthMailAddressPlugin 1.2.1
その他のバージョンでは再現しません。
再現手順¶
- 管理画面のopAuthMailAdressPluginの設定で招待モードの設定を「招待なしでの登録を許可する」にする
- 携帯でログイン画面にアクセスする
- 新規登録リンクをクリックし、opAuthMailAddress/requestRegisterURLのページにアクセスする
- メールで登録のリンクをクリックし登録ページのURLを取得するメールを送る
- エラーメッセージが届く
Causes (原因)¶
新規登録時に plugins/opAuthMailAddressPlugin/apps/mobile_mail_frontend/modules/opAuthMailAddress/actions/actions.class.php から InviteForm が呼ばれるが InviteForm::save() を実施された際に 143行目に以下のような処理が存在する。 #2044 で myUser クラスの親クラスを sfOpenPNESecurityUser から sfBasicSecurityUser に変更されたことにより、getMemberId() getCurrentAuthMode() は定義されていないため、この処理でエラーとなってしまう
- OpenPNE 3.6 用の opAuthMailAddressPlugin では InviteForm クラスは呼ばれず、構造自体異なるため、3.4.15-dev で発生するような問題はない
- OpenPNE 3.2 については mobile_mail_frontend アプリケーションの myUser クラスの親クラスは fOpenPNESecurityUser であるので問題はでない
$this->member->setInviteMemberId($user->getMemberId()); $this->member->setConfig('register_auth_mode', $this->getOption('authMode', $user->getCurrentAuthMode()));
Way to fix (修正内容)¶
- InviteForm::save() 処理内、$user オブジェクトが sfOpenPNESecurityUser でなければ、$user->getMemberId() $user->getCurrentAuthMode() から値を取得する必要のある処理をさせない修正を実施する
- 管理画面の AdminInviteForm クラスは InviteForm クラスを親クラスとして扱っているが、save() メソッドはオーバーライドされているので、Member::setInviteMemberId() が呼ばれることがないので上記修正で問題はでないと考えられる
- Member::setInviteMemberId() に紹介者のIDをセットする場合は、いずれの場合も、sfUser::getMemberId() が呼べる処理の流れになっているため、上記修正で問題ないと考える
Shinichi Urabe さんが13年以上前に更新
- ステータス を New(新規) から Accepted(着手) に変更
- 優先度 を Normal(通常) から Urgent(急いで) に変更
Shinichi Urabe さんが13年以上前に更新
原因¶
新規登録時に plugins/opAuthMailAddressPlugin/apps/mobile_mail_frontend/modules/opAuthMailAddress/actions/actions.class.php から InviteForm が呼ばれるが InviteForm::save() を実施された際に 143行目に以下のような処理が存在する。しかしながら #2044 で myUser クラスの親クラスを sfOpenPNESecurityUser から sfBasicSecurityUser に変更されたことにより、getMemberId() は定義されていないため、この処理でエラーとなってしまう
- OpenPNE 3.6 用の opAuthMailAddressPlugin では InviteForm クラスは呼ばれず、構造自体異なるため、3.4.15-dev で発生するような問題はない
- OpenPNE 3.2 については myUser クラスの親クラスは fOpenPNESecurityUser であるので問題はでない
$this->member->setInviteMemberId($user->getMemberId());
修正方針¶
- InviteForm::save() 処理内、$user オブジェクトが sfOpenPNESecurityUser であれば、上記処理を実施するように分岐を追記する
- 管理画面の AdminInviteForm クラスは InviteForm クラスを親クラスとして扱っているが、save() メソッドはオーバーライドされているので、Member::setInviteMemberId() が呼ばれることがないので上記修正で問題はでないと考えられる
- Member::setInviteMemberId() に紹介者のIDをセットする場合は、いずれの場合も、sfUser::getMemberId() が呼べる処理の流れになっているため、上記修正で問題ないと考える
テスト範囲¶
- 管理画面からの招待
- PC,携帯からの招待(招待者としてひも付いているかも管理画面のメンバー一覧から確認)
- 携帯からのメール投稿での新規登録
- PCの新規登録
InviteForm が呼ばれる箇所の確認¶
$ ack InviteForm apps/pc_backend/modules/member/actions/actions.class.php 101: $this->form = new AdminInviteForm(null, $options); // 管理画面からの招待 AdminInviteForm::save() は親クラスの save() メソッドを呼んでいないので myUser::getMemberId() が呼ばれることがないが、親クラスの修正になるため念のために動作確認必要 apps/pc_backend/modules/member/lib/AdminInviteForm.class.php 18:class AdminInviteForm extends InviteForm // AdminInviteForm の継承先が InviteForm lib/action/sfOpenPNEMemberAction.class.php 348: $this->form = new InviteForm(null, array('invited' => true)); // 動作確認必要(PC、携帯からのフレンド招待) lib/form/doctrine/InviteForm.class.php 18:class InviteForm extends MemberConfigPcAddressForm // クラス定義 plugins/opAuthMailAddressPlugin/apps/mobile_mail_frontend/modules/opAuthMailAddress/actions/actions.class.php 40: $this->form = new InviteForm(null, array('authMode' => 'MailAddress')); // 携帯から新規メール投稿(今回の問題の箇所) plugins/opAuthMailAddressPlugin/apps/pc_frontend/modules/opAuthMailAddress/actions/actions.class.php 30: $this->form = new InviteForm(null, array('authMode' => 'MailAddress')); // PCから新規登録
Shinichi Urabe さんが13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 f0569ab5b52aae7601709e8f722ed2e3f52dc288 で適用されました。
Mutsumi Imamura さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
携帯から新規登録を実施すると、登録用URLお知らせメールともに修正前と同様な「サーバーが混み合っています」というエラーメールが返ってきます。
その他の↓の動作は問題ありません。
1. 管理画面からの招待
2. PC,携帯からの招待(招待者としてひも付いているかも管理画面のメンバー一覧から確認)
4. PCの新規登録
Shinichi Urabe さんが13年以上前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
更新履歴 08cc1999746120c9bf356dfd1c2fc3f7ef528309 で適用されました。
Shinichi Urabe さんが13年以上前に更新
Imamura Mutsumi は書きました:
携帯から新規登録を実施すると、登録用URLお知らせメールともに修正前と同様な「サーバーが混み合っています」というエラーメールが返ってきます。
その他の↓の動作は問題ありません。
1. 管理画面からの招待
2. PC,携帯からの招待(招待者としてひも付いているかも管理画面のメンバー一覧から確認)
4. PCの新規登録
userクラスから getCurrentAuthMode() が呼べないのに呼ばれている箇所があるため、
InviteForm::save() 内の parent::save() でメール送信されるが、そのあとの $this->member->setConfig('register_auth_mode', $this->getOption('authMode', $user->getCurrentAuthMode())); でエラーが発生している。option の authMode は plugins/opAuthMailAddressPlugin/apps/mobile_mail_frontend/modules/opAuthMailAddress/actions/actions.class.php の InviteForm を生成した際に 第二引数に設定されているので、空になることはないため、user オブジェクトが sfOpenPNESecurityUser でない場合、null をデフォルト値にセットするように修正した
新規登録の際に呼ばれることはないが、フレンドリンクを設定する if ($this->getOption('is_link')) 以下の処理でも $user オブジェクトが sfOpenPNESecurityUser でない場合は getMemberId() が呼べないので、念のために if ($this->getOption('is_link') && $isSfOpenPNESecurityUser) と修正した
Mutsumi Imamura さんが13年以上前に更新
エラーメールが来なくなることを確認しました。
再度、日記のメール投稿とメンバーから招待されて登録した場合の動作も確認し問題ないことを確認しました。
動作確認OKです。
Minoru Takai さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
diff --git a/lib/form/doctrine/InviteForm.class.php b/lib/form/doctrine/InviteForm.class.php index fab05bd..23777aa 100644 --- a/lib/form/doctrine/InviteForm.class.php +++ b/lib/form/doctrine/InviteForm.class.php @@ -139,13 +139,20 @@ class InviteForm extends MemberConfigPcAddressForm public function save() { $user = sfContext::getInstance()->getUser(); - $this->member->setInviteMemberId($user->getMemberId()); + $isSfOpenPNESecurityUser = $user instanceof sfOpenPNESecurityUser; + + $currentAuthMode = null; + if ($isSfOpenPNESecurityUser) + { + $this->member->setInviteMemberId($user->getMemberId()); + $currentAuthMode = $user->getCurrentAuthMode(); + } parent::save(); - $this->member->setConfig('register_auth_mode', $this->getOption('authMode', $user->getCurrentAuthMode())); + $this->member->setConfig('register_auth_mode', $this->getOption('authMode', $currentAuthMode)); - if ($this->getOption('is_link')) + if ($this->getOption('is_link') && $isSfOpenPNESecurityUser) { $fromMemberId = $user->getMemberId(); $toMemberId = $this->member->getId();
このチケットでの差分を確認しました。 sfContext::getInstance()->getUser() が sfOpenPNESecurityUser のオブジェクトでないことによって生じていたエラーを適切に回避するコードとなっていると思いますので修正 OK です(この修正によって別の問題が生じたりする可能性はないと判断できます)。
Mutsumi Imamura さんが13年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
http://redmine.openpne.jp/issues/2344#note-12
で動作確認済みです。
問題ありませんのでチケットクローズします。