Project

General

Profile

Bug(バグ) #2344

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

Added by Mutsumi Imamura about 11 years ago. Updated about 11 years ago.

Status:
Fixed(完了)
Priority:
Urgent(急いで)
Target version:
Start date:
2011-08-10
Due date:
% Done:

100%

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

Description

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

Related issues

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

Associated revisions

Revision f0569ab5 (diff)
Added by Shinichi Urabe about 11 years ago

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

Revision 08cc1999 (diff)
Added by Shinichi Urabe about 11 years ago

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

History

#1 Updated by Shinichi Urabe about 11 years ago

  • Status changed from New(新規) to Accepted(着手)
  • Priority changed from Normal(通常) to Urgent(急いで)

#2 Updated by Shinichi Urabe about 11 years ago

原因

新規登録時に 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 Updated by Shinichi Urabe about 11 years ago

  • Description updated (diff)

#4 Updated by Shinichi Urabe about 11 years ago

  • Description updated (diff)

#5 Updated by Shinichi Urabe about 11 years ago

  • Status changed from Accepted(着手) to Pending Review(レビュー待ち)
  • % Done changed from 0 to 50

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

#6 Updated by Shinichi Urabe about 11 years ago

  • Description updated (diff)

#7 Updated by Mutsumi Imamura about 11 years ago

  • Status changed from Pending Review(レビュー待ち) to Rejected(差し戻し)

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

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

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

#8 Updated by Shinichi Urabe about 11 years ago

  • Status changed from Rejected(差し戻し) to Pending Review(レビュー待ち)

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

#9 Updated by Shinichi Urabe about 11 years ago

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 Updated by Shinichi Urabe about 11 years ago

  • Description updated (diff)

#11 Updated by Shinichi Urabe about 11 years ago

  • Description updated (diff)

#12 Updated by Mutsumi Imamura about 11 years ago

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

#13 Updated by Minoru Takai about 11 years ago

  • Description updated (diff)

#14 Updated by Minoru Takai about 11 years ago

  • Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
  • % Done changed from 50 to 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 Updated by Mutsumi Imamura about 11 years ago

  • Status changed from Pending Testing(テスト待ち) to Fixed(完了)
  • % Done changed from 70 to 100

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

Also available in: Atom PDF