Bug(バグ) #3401
完了sfValidatorChoice に数値以外を渡した場合に正しくバリデーションが行われない場合がある
0%
説明
概要¶
sfValidatorChoice に数値以外を渡した場合に正しくバリデーションが行われない場合がある.
sfValidatorChoice に choices オプションを渡すと渡された配列に含まれるかどうかについてバリデーションが行われるが,この choices に指定される配列の中身に "00" や "11.1" といったような文字列が渡された場合に正しくバリデーションが行われれない.
この問題については下記チケットで reopen されている.ただし動きはない.
#4212 (sfValidatorChoice in_array bug (php bug?)) - symfony - Trac
http://trac.symfony-project.org/ticket/4212
原因¶
chices に含まれるかどうかの判定で string にキャストした後に == でチェックしているため,文字列に数値が含まれる場合に正しく評価されない.
lib/vendor/symfony/lib/validator/sfValidatorChoice.class.php 117 /** 118 * Checks if a value is part of given choices (see bug #4212) 119 * 120 * @param mixed $value The value to check 121 * @param array $choices The array of available choices 122 * 123 * @return Boolean 124 */ 125 static protected function inChoices($value, array $choices = array()) 126 { 127 foreach ($choices as $choice) 128 { 129 if ((string) $choice == (string) $value) 130 { 131 return true; 132 } 133 } 134 135 return false; 136 }
修正案¶
sfValidatorChoice 自体は choices に整数値を与えることを目的としたバリデータとしたうえで, choices に文字列など整数値以外のものを対象とした opValidatorChoice のようなクラスを新たにつくり, inChoices および inChoices を用いた部分を上書きする. inChoices 自体が static で sfValidatorChoice で self 呼び出ししているため継承してオーバーライドするだけでは有効に働かない様子.
テストコード
<?php include_once dirname(__FILE__) . '/../../bootstrap/unit.php'; $t = new lime_test(9, new lime_output_color()); $t->diag('opValidatorChoice'); $t->diag('->clean()'); $v = new opValidatorChoice(array( 'choices' => array('00', '000', '0.0'), )); try { $v->clean('0'); $t->fail('->clean() throws a sfValidatorError if not in choices'); $t->skip('', 1); } catch (Exception $e) { $t->pass('->clean() throws a sfValidatorError if not in choices'); $t->is($e->getCode(), 'invalid', '->clean() throws a sfValidatorError'); } $t->is($v->clean('00'), '00', '->clean() accepts in choices'); $t->is($v->clean('000'), '000', '->clean() accepts in choices'); $t->is($v->clean('0.0'), '0.0', '->clean() accepts in choices'); $v = new opValidatorChoice(array( 'choices' => array('011', '11.0'), )); try { $v->clean('11'); $t->fail('->clean() throws a sfValidatorError if not in choices'); $t->skip('', 1); } catch (Exception $e) { $t->pass('->clean() throws a sfValidatorError if not in choices'); $t->is($e->getCode(), 'invalid', '->clean() throws a sfValidatorError'); } $t->is($v->clean('011'), '011', '->clean() accepts in choices'); $t->is($v->clean('11.0'), '11.0', '->clean() accepts in choices');
ファイル
Shinichi Urabe さんが9年以上前に更新
- ファイル t-2982.patch t-2982.patch を追加
修正案のパッチを添付します
ただし、本パッチを適用するのみではFIXとは言えないです
sfValidatorChoice が元々使われている箇所を opValidatorChoice に置き換える必要があります。以下 (テスト範囲大)
[urabe@urab-mbp OpenPNE3]$ ag -w sfValidatorChoice --ignore=vendor -l apps/pc_backend/modules/advanced/lib/opRichTextareaOpenPNEConfigForm.class.php apps/pc_backend/modules/design/lib/PickHomeLayoutForm.class.php apps/pc_backend/modules/mail/lib/opMailNotificationForm.class.php apps/pc_backend/modules/member/lib/AdminInviteForm.class.php apps/pc_backend/modules/plugin/lib/PluginActivationForm.class.php lib/form/doctrine/ActivityDataForm.class.php lib/form/doctrine/BannerForm.class.php lib/form/doctrine/CommunityConfigForm.class.php lib/form/doctrine/OAuthConsumerInformationForm.class.php lib/form/doctrine/opPermitMemberConfigSnsConfigForm.class.php lib/form/doctrine/ProfileForm.class.php lib/form/MemberConfigForm/MemberConfigMailForm.class.php lib/form/opLanguageSelecterForm.class.php lib/form/opPresetProfileForm.class.php lib/plugins/sfFormExtraPlugin/lib/validator/sfValidatorBlacklist.class.php lib/plugins/sfFormExtraPlugin/lib/widget/sfWidgetFormSelectUSState.class.php lib/util/opFormItemGenerator.class.php lib/validator/opValidatorProfile.class.php plugins/opAuthMailAddressPlugin/lib/form/opAuthMailAddressPasswordRecoveryForm.class.php
Chiharu Nakajima さんが9年以上前に更新
- コピー先 Backport(バックポート) #3810: sfValidatorChoice に数値以外を渡した場合に正しくバリデーションが行われない場合がある を追加
Chiharu Nakajima さんが9年以上前に更新
- コピー先 Backport(バックポート) #3811: sfValidatorChoice に数値以外を渡した場合に正しくバリデーションが行われない場合がある を追加
Chiharu Nakajima さんが9年以上前に更新
- ステータス を New(新規) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
プルリクエストしました。
https://github.com/openpne/OpenPNE3/pull/254
Shinichi Urabe さんが約9年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更