プロジェクト

全般

プロフィール

Bug(バグ) #2344

携帯で新規登録が出来ない

Mutsumi Imamura12年以上前に追加. 12年以上前に更新.

ステータス:
Fixed(完了)
優先度:
Urgent(急いで)
担当者:
対象バージョン:
開始日:
2011-08-10
期日:
進捗率:

100%

3.6 で発生するか:
3.8 で発生するか:
Unknown (未調査)

説明

Overview (現象)

OpenPNE3.4.15-devで、携帯で新規登録ができない。
新規登録リンクをクリックし、opAuthMailAddress/requestRegisterURLのページから登録ページのURLを取得しようとすると、「サーバーが混み合っています」というエラーメッセージが携帯メールに届く。

再現バージョン

  • OpenPNE3.4.13 〜 OpenPNE3.4.15-dev
  • opAuthMailAddressPlugin 1.2.1

その他のバージョンでは再現しません。

再現手順

  1. 管理画面のopAuthMailAdressPluginの設定で招待モードの設定を「招待なしでの登録を許可する」にする
  2. 携帯でログイン画面にアクセスする
  3. 新規登録リンクをクリックし、opAuthMailAddress/requestRegisterURLのページにアクセスする
  4. メールで登録のリンクをクリックし登録ページのURLを取得するメールを送る
  5. エラーメッセージが届く

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() が呼べる処理の流れになっているため、上記修正で問題ないと考える

関連するチケット

関連している OpenPNE 3 - Backport(バックポート) #2044: pc_frontend から利用可能な認証プラグインがない状態でメール投稿がおこなえない Fixed(完了) 2010-12-10

関係しているリビジョン

リビジョン f0569ab5 (差分)
Shinichi Urabe12年以上前に追加

(fixes #2344) Check sfOpenPNESecurityUser object in InviteForm::save().

リビジョン 08cc1999 (差分)
Shinichi Urabe12年以上前に追加

(fixes #2344) Check sfOpenPNESecurityUser object in InviteForm::save() for getCurrentAuthMode().

履歴

#1 Shinichi Urabe12年以上前に更新

  • ステータスNew(新規) から Accepted(着手) に変更
  • 優先度Normal(通常) から Urgent(急いで) に変更

#2 Shinichi Urabe12年以上前に更新

原因

新規登録時に 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() が呼べる処理の流れになっているため、上記修正で問題ないと考える

テスト範囲

  1. 管理画面からの招待
  2. PC,携帯からの招待(招待者としてひも付いているかも管理画面のメンバー一覧から確認)
  3. 携帯からのメール投稿での新規登録
  4. 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から新規登録

#3 Shinichi Urabe12年以上前に更新

  • 説明 を更新 (diff)

#4 Shinichi Urabe12年以上前に更新

  • 説明 を更新 (diff)

#5 Shinichi Urabe12年以上前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

更新履歴 f0569ab5b52aae7601709e8f722ed2e3f52dc288 で適用されました。

#6 Shinichi Urabe12年以上前に更新

  • 説明 を更新 (diff)

#7 Mutsumi Imamura12年以上前に更新

  • ステータスPending Review(レビュー待ち) から Rejected(差し戻し) に変更

携帯から新規登録を実施すると、登録用URLお知らせメールともに修正前と同様な「サーバーが混み合っています」というエラーメールが返ってきます。

その他の↓の動作は問題ありません。

1. 管理画面からの招待
2. PC,携帯からの招待(招待者としてひも付いているかも管理画面のメンバー一覧から確認)
4. PCの新規登録

#8 Shinichi Urabe12年以上前に更新

  • ステータスRejected(差し戻し) から Pending Review(レビュー待ち) に変更

更新履歴 08cc1999746120c9bf356dfd1c2fc3f7ef528309 で適用されました。

#9 Shinichi Urabe12年以上前に更新

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) と修正した

#10 Shinichi Urabe12年以上前に更新

  • 説明 を更新 (diff)

#11 Shinichi Urabe12年以上前に更新

  • 説明 を更新 (diff)

#12 Mutsumi Imamura12年以上前に更新

エラーメールが来なくなることを確認しました。
再度、日記のメール投稿とメンバーから招待されて登録した場合の動作も確認し問題ないことを確認しました。
動作確認OKです。

#13 Minoru Takai12年以上前に更新

  • 説明 を更新 (diff)

#14 Minoru Takai12年以上前に更新

  • ステータス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 です(この修正によって別の問題が生じたりする可能性はないと判断できます)。

#15 Mutsumi Imamura12年以上前に更新

  • ステータスPending Testing(テスト待ち) から Fixed(完了) に変更
  • 進捗率70 から 100 に変更

http://redmine.openpne.jp/issues/2344#note-12
で動作確認済みです。
問題ありませんのでチケットクローズします。

他の形式にエクスポート: Atom PDF