プロジェクト

全般

プロフィール

Backport(バックポート) #2288

完了

既に新規登録申請を行ったアドレスで2度目に新規登録申請を行うとInternal Server Errorになる

Tsuyoshi Tsurushima さんが13年以上前に追加. ほぼ13年前に更新.

ステータス:
Invalid(無効)
優先度:
High(高め)
担当者:
対象バージョン:
開始日:
2010-11-28
期日:
進捗率:

0%

予定工数:

説明

Overview (現象)

管理画面のopAuthMailAddressPluginで招待モードを「招待なしでの登録を許可する」にした際に可能になる新規登録にて、1度新規登録申請を行い、本登録をせずにそのままにしている場合、2度目の新規登録申請を行うとエラーになります。

エラーは以下の通りです。

500 | Internal Server Error | Doctrine_Connection_Mysql_Exception
SQLSTATE: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`openpne3`.`member_config`, CONSTRAINT `member_config_member_id_member_id` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`) ON DELETE CASCADE)

Causes (原因)

opRequestRegisterURLForm::validateAddress() で member_config に 'pc_address_pre' が存在していた場合、
その MemberConfig オブジェクトから Member オブジェクトを取得するような処理が入ってる。

$this->member = $config->getMember();

しかし、このままではActivateビヘイビアが有効であるため、
レコードが取得できていない状態となっている。(新規登録の状態ではis_active=0であるため、但しオブジェクトの取得自体はできている)
結果的に opRequestRegisterURLForm::sendMail() で
$member->setConfig('pc_address_pre', $address);

としたときに、id が null の状態であるため、レコードの挿入に失敗している。

Way to fix (修正内容)

MemberConfig::getMember() する際に、Activateビヘイビアを無効にする。

      $activation = opActivateBehavior::getEnabled();
      opActivateBehavior::disable();

      $this->member = $config->getMember();

      if ($activation)
      {
        opActivateBehavior::enable();
      }


関連するチケット 1 (0件未完了1件完了)

関連している opAuthMailAddressPlugin - Bug(バグ) #1815: 既に新規登録申請を行ったアドレスで2度目に新規登録申請を行うとInternal Server ErrorになるFixed(完了)Masato Nagasawa2010-11-28

操作

Kousuke Ebihara さんが13年以上前に更新

  • 対象バージョン1.3.3 から 1.2.2 に変更

Yuya Watanabe さんがほぼ13年前に更新

  • ステータスNew(新規) から Invalid(無効) に変更
  • 担当者Yuya Watanabe にセット

この問題が発生したのは 下記コミットによる Enhancement で追加されたフォームで正しく処理が行われていないことに起因しています.

https://github.com/ebihara/opAuthMailAddressPlugin/commit/34d1a6fa643fec419be74174420b2d7402402548

opAuthMailAddressPlugin 1.2 では コア側の InviteForm.class.php を使用しており,下記のようにバックポート元と同様の処理は行われていて本問題は発生しない状態となっています.よって本チケットを Invalid としてチケットをクローズします.

lib/form/doctrine/InviteForm.class.php

 81   protected function validateAddress($configName, $configValue)
 82   {
 83     $activation = opActivateBehavior::getEnabled();
 84     opActivateBehavior::disable();
 85 
 86     if ($config = Doctrine::getTable('MemberConfig')->retrieveByNameAndValue($configName, $configValue))
 87     {
 88       if ($config->getMember()->getIsActive() || !$config->getMember()->getConfig($configName.'_token'))
 89       {
 90         if ($activation)
 91         {
 92           opActivateBehavior::enable();
 93         }
 94         return false;
 95       }
 96 
 97       $this->member = $config->getMember();
 98     }
 99     elseif ($config = Doctrine::getTable('MemberConfig')->retrieveByNameAndValue($configName.'_pre', $configValue))
100     {
101       $this->member = $config->getMember();
102     }
103 
104     if ($activation)
105     {
106       opActivateBehavior::enable();
107     }
108     return true;
109   }

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