操作
Backport(バックポート) #2288
完了既に新規登録申請を行ったアドレスで2度目に新規登録申請を行うとInternal Server Errorになる
開始日:
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(); }
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 }
操作