[ticket/10005] Add validation of dropdown custom profile field values

PHPBB3-10005
This commit is contained in:
Nils Adermann 2011-06-02 08:45:48 +02:00
parent 2159e4f285
commit 7b10f859de
4 changed files with 97 additions and 1 deletions

View file

@ -150,6 +150,17 @@ class custom_profile
case FIELD_DROPDOWN: case FIELD_DROPDOWN:
$field_value = (int) $field_value; $field_value = (int) $field_value;
// retrieve option lang data if necessary
if (!isset($this->options_lang[$field_data['field_id']]) || !isset($this->options_lang[$field_data['field_id']][$field_data['lang_id']]) || !sizeof($this->options_lang[$file_data['field_id']][$field_data['lang_id']]))
{
$this->get_option_lang($field_data['field_id'], $field_data['lang_id'], FIELD_DROPDOWN, false);
}
if (!isset($this->options_lang[$field_data['field_id']][$field_data['lang_id']][$field_value]))
{
return 'FIELD_INVALID_VALUE';
}
if ($field_value == $field_data['field_novalue'] && $field_data['field_required']) if ($field_value == $field_data['field_novalue'] && $field_data['field_required'])
{ {
return 'FIELD_REQUIRED'; return 'FIELD_REQUIRED';
@ -302,6 +313,7 @@ class custom_profile
switch ($cp_result) switch ($cp_result)
{ {
case 'FIELD_INVALID_DATE': case 'FIELD_INVALID_DATE':
case 'FIELD_INVALID_VALUE':
case 'FIELD_REQUIRED': case 'FIELD_REQUIRED':
$error = sprintf($user->lang[$cp_result], $row['lang_name']); $error = sprintf($user->lang[$cp_result], $row['lang_name']);
break; break;

View file

@ -194,6 +194,7 @@ $lang = array_merge($lang, array(
'FIELD_INVALID_CHARS_ALPHA_ONLY' => 'The field “%s” has invalid characters, only alphanumeric characters are allowed.', 'FIELD_INVALID_CHARS_ALPHA_ONLY' => 'The field “%s” has invalid characters, only alphanumeric characters are allowed.',
'FIELD_INVALID_CHARS_SPACERS_ONLY' => 'The field “%s” has invalid characters, only alphanumeric, space or -+_[] characters are allowed.', 'FIELD_INVALID_CHARS_SPACERS_ONLY' => 'The field “%s” has invalid characters, only alphanumeric, space or -+_[] characters are allowed.',
'FIELD_INVALID_DATE' => 'The field “%s” has an invalid date.', 'FIELD_INVALID_DATE' => 'The field “%s” has an invalid date.',
'FIELD_INVALID_VALUE' => 'The field “%s” has an invalid value.',
'FOE_MESSAGE' => 'Message from foe', 'FOE_MESSAGE' => 'Message from foe',
'FOES_EXPLAIN' => 'Foes are users which will be ignored by default. Posts by these users will not be fully visible. Personal messages from foes are still permitted. Please note that you cannot ignore moderators or administrators.', 'FOES_EXPLAIN' => 'Foes are users which will be ignored by default. Posts by these users will not be fully visible. Personal messages from foes are still permitted. Please note that you cannot ignore moderators or administrators.',

View file

@ -0,0 +1,52 @@
<?php
/**
*
* @package testing
* @copyright (c) 2011 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_profile_fields.php';
class phpbb_profile_custom_test extends phpbb_database_test_case
{
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/profile_fields.xml');
}
static public function dropdownFields()
{
return array(
// novalue, required, value, expected
array(1, 1, '0', 'FIELD_INVALID_VALUE'),
array(1, 1, '1', 'FIELD_REQUIRED'),
array(1, 1, '2', false),
array(1, 0, '0', 'FIELD_INVALID_VALUE'),
array(1, 0, '1', false),
array(1, 0, '2', false),
);
}
/**
* @dataProvider dropdownFields
*/
public function test_dropdown_validate($field_novalue, $field_required, $field_value, $expected)
{
global $db;
$db = $this->new_dbal();
$field_data = array(
'field_id' => 1,
'lang_id' => 1,
'field_novalue' => $field_novalue,
'field_required' => $field_required,
);
$cp = new custom_profile;
$result = $cp->validate_profile_field(FIELD_DROPDOWN, &$field_value, $field_data);
$this->assertEquals($expected, $result);
}
}

View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_profile_fields_lang">
<column>field_id</column>
<column>lang_id</column>
<column>option_id</column>
<column>field_type</column>
<column>lang_value</column>
<row>
<value>1</value>
<value>1</value>
<value>0</value>
<value>5</value>
<value>Default Option</value>
</row>
<row>
<value>1</value>
<value>1</value>
<value>1</value>
<value>5</value>
<value>First Alternative</value>
</row>
<row>
<value>1</value>
<value>1</value>
<value>2</value>
<value>5</value>
<value>Third Alternative</value>
</row>
</table>
</dataset>