Skip to content

Commit a973f7b

Browse files
committed
fix(field): avoid html entitization of accented chars
1 parent ececfe3 commit a973f7b

File tree

9 files changed

+178
-11
lines changed

9 files changed

+178
-11
lines changed

inc/fields/checkboxesfield.class.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,10 @@ public function prepareQuestionInputForSave($input) {
109109
return [];
110110
} else {
111111
$input['values'] = $this->trimValue($input['values']);
112-
$input['values'] = addslashes($input['values']);
113112
}
114113
}
115114
if (isset($input['default_values'])) {
116115
$input['default_values'] = $this->trimValue($input['default_values']);
117-
$input['default_values'] = addslashes($input['default_values']);
118116
}
119117
return $input;
120118
}

inc/fields/multiselectfield.class.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public function displayField($canEdit = true) {
3737
} else {
3838
$answer = $this->getAnswer();
3939
echo '<div class="form_field">';
40-
echo empty($answer) ? '' : implode('<br />', json_decode($answer));
40+
echo empty($answer) ? '' : implode('<br />', $answer);
4141
echo '</div>';
4242
}
4343
}
@@ -64,7 +64,7 @@ public function getAnswer() {
6464
$return[] = $value;
6565
}
6666
}
67-
return json_encode($return);
67+
return $return;
6868
}
6969

7070
public static function getName() {

inc/fields/radiosfield.class.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,11 @@ public function prepareQuestionInputForSave($input) {
5757
} else {
5858
// trim values
5959
$input['values'] = $this->trimValue($input['values']);
60-
$input['values'] = addslashes($input['values']);
6160
}
6261
}
6362
if (isset($input['default_values'])) {
6463
// trim values
6564
$input['default_values'] = $this->trimValue($input['default_values']);
66-
$input['default_values'] = addslashes($input['default_values']);
6765
}
6866
return $input;
6967
}

inc/fields/selectfield.class.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,11 @@ public function prepareQuestionInputForSave($input) {
6363
} else {
6464
// trim values
6565
$input['values'] = $this->trimValue($input['values']);
66-
$input['values'] = addslashes($input['values']);
6766
}
6867
}
6968
if (isset($input['default_values'])) {
7069
// trim values
7170
$input['default_values'] = $this->trimValue($input['default_values']);
72-
$input['default_values'] = addslashes($input['default_values']);
7371
}
7472
return $input;
7573
}

inc/question.class.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -352,10 +352,19 @@ public function prepareInputForUpdate($input) {
352352
}
353353

354354
// Decode (if already encoded) and encode strings to avoid problems with quotes
355+
// The if() {} structures here will grow until the call to plugin_formcreator_encode
356+
// becomes obsolete
355357
foreach ($input as $key => $value) {
356358
if ($input['fieldtype'] != 'dropdown'
357-
|| $input['fieldtype'] != 'dropdown' && $key != 'values') {
358-
$input[$key] = plugin_formcreator_encode($value);
359+
|| $input['fieldtype'] != 'dropdown' && $key != 'values' && $key != 'default_values') {
360+
if (!($input['fieldtype'] == 'select' && ($key == 'values' || $key == 'default_values'))
361+
&& !($input['fieldtype'] == 'checkboxes' && ($key == 'values' || $key == 'default_values'))
362+
&& !($input['fieldtype'] == 'radios' && ($key == 'values' || $key == 'default_values'))
363+
&& !($input['fieldtype'] == 'multiselect' && ($key == 'values' || $key == 'default_values'))) {
364+
$input[$key] = plugin_formcreator_encode($value);
365+
} else {
366+
$input[$key] = str_replace('\r\n', "\r\n", $input[$key]);
367+
}
359368
}
360369
}
361370

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?php
2-
class CheckboxFieldTest extends SuperAdminTestCase {
2+
class CheckboxesFieldTest extends SuperAdminTestCase {
33

44
public function provider() {
55

@@ -138,4 +138,45 @@ public function testFieldIsValid($fields, $data, $expectedValue, $expectedValidi
138138
$isValid = $fieldInstance->isValid($values);
139139
$this->assertEquals($expectedValidity, $isValid);
140140
}
141+
142+
public function testPrepareInputForSave() {
143+
$fields = array(
144+
'fieldtype' => 'checkboxes',
145+
'name' => 'question',
146+
'required' => '0',
147+
'default_values' => "1\r\n2\r\n3\r\n5\r\n6",
148+
'values' => "1\r\n2\r\n3\r\n4\r\n5\r\n6",
149+
'order' => '1',
150+
'show_rule' => 'always',
151+
'range_min' => 3,
152+
'range_max' => 4,
153+
);
154+
$fieldInstance = new PluginFormcreatorCheckboxesField($fields);
155+
156+
// Test a value is mandatory
157+
$input = [
158+
'values' => "",
159+
'name' => 'foo',
160+
];
161+
$out = $fieldInstance->prepareQuestionInputForSave($input);
162+
$this->assertEquals(0, count($out));
163+
164+
// Test accented chars are kept
165+
$input = [
166+
'values' => "éè\r\nsomething else",
167+
'default_values' => "éè",
168+
];
169+
$out = $fieldInstance->prepareQuestionInputForSave($input);
170+
$this->assertEquals("éè\r\nsomething else", $out['values']);
171+
$this->assertEquals("éè", $out['default_values']);
172+
173+
// Test values are trimmed
174+
$input = [
175+
'values' => ' something \r\n something else ',
176+
'default_values' => " something ",
177+
];
178+
$out = $fieldInstance->prepareQuestionInputForSave($input);
179+
$this->assertEquals('something\r\nsomething else', $out['values']);
180+
$this->assertEquals("something", $out['default_values']);
181+
}
141182
}

tests/0005_Unit/MultiselectFieldTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,4 +130,44 @@ public function testFieldIsValid($fields, $data, $expectedValue, $expectedValidi
130130
$this->assertEquals($expectedValidity, $isValid);
131131
}
132132

133+
public function testPrepareInputForSave() {
134+
$fields = array(
135+
'fieldtype' => 'multiselect',
136+
'name' => 'question',
137+
'required' => '0',
138+
'default_values' => "1\r\n2\r\n3\r\n5\r\n6",
139+
'values' => "1\r\n2\r\n3\r\n4\r\n5\r\n6",
140+
'order' => '1',
141+
'show_rule' => 'always',
142+
'range_min' => 3,
143+
'range_max' => 4,
144+
);
145+
$fieldInstance = new PluginFormcreatorMultiselectField($fields);
146+
147+
// Test a value is mandatory
148+
$input = [
149+
'values' => "",
150+
'name' => 'foo',
151+
];
152+
$out = $fieldInstance->prepareQuestionInputForSave($input);
153+
$this->assertEquals(0, count($out));
154+
155+
// Test accented chars are kept
156+
$input = [
157+
'values' => "éè\r\nsomething else",
158+
'default_values' => "éè",
159+
];
160+
$out = $fieldInstance->prepareQuestionInputForSave($input);
161+
$this->assertEquals("éè\r\nsomething else", $out['values']);
162+
$this->assertEquals("éè", $out['default_values']);
163+
164+
// Test values are trimmed
165+
$input = [
166+
'values' => ' something \r\n something else ',
167+
'default_values' => " something ",
168+
];
169+
$out = $fieldInstance->prepareQuestionInputForSave($input);
170+
$this->assertEquals('something\r\nsomething else', $out['values']);
171+
$this->assertEquals("something", $out['default_values']);
172+
}
133173
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
class RadiossFieldTest extends SuperAdminTestCase {
3+
public function testPrepareInputForSave() {
4+
$fields = array(
5+
'fieldtype' => 'radios',
6+
'name' => 'question',
7+
'required' => '0',
8+
'default_values' => "1\r\n2\r\n3\r\n5\r\n6",
9+
'values' => "1\r\n2\r\n3\r\n4\r\n5\r\n6",
10+
'order' => '1',
11+
'show_rule' => 'always',
12+
'range_min' => 3,
13+
'range_max' => 4,
14+
);
15+
$fieldInstance = new PluginFormcreatorRadiosField($fields);
16+
17+
// Test a value is mandatory
18+
$input = [
19+
'values' => "",
20+
'name' => 'foo',
21+
];
22+
$out = $fieldInstance->prepareQuestionInputForSave($input);
23+
$this->assertEquals(0, count($out));
24+
25+
// Test accented chars are kept
26+
$input = [
27+
'values' => "éè\r\nsomething else",
28+
'default_values' => "éè",
29+
];
30+
$out = $fieldInstance->prepareQuestionInputForSave($input);
31+
$this->assertEquals("éè\r\nsomething else", $out['values']);
32+
$this->assertEquals("éè", $out['default_values']);
33+
34+
// Test values are trimmed
35+
$input = [
36+
'values' => ' something \r\n something else ',
37+
'default_values' => " something ",
38+
];
39+
$out = $fieldInstance->prepareQuestionInputForSave($input);
40+
$this->assertEquals('something\r\nsomething else', $out['values']);
41+
$this->assertEquals("something", $out['default_values']);
42+
}
43+
}

tests/0005_Unit/SelectFieldTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,44 @@ public function testFieldIsValid($fields, $data, $expectedValue, $expectedValidi
120120
$this->assertEquals($expectedValidity, $isValid);
121121
}
122122

123+
public function testPrepareInputForSave() {
124+
$fields = array(
125+
'fieldtype' => 'select',
126+
'name' => 'question',
127+
'required' => '0',
128+
'default_values' => "1\r\n2\r\n3\r\n5\r\n6",
129+
'values' => "1\r\n2\r\n3\r\n4\r\n5\r\n6",
130+
'order' => '1',
131+
'show_rule' => 'always',
132+
'range_min' => 3,
133+
'range_max' => 4,
134+
);
135+
$fieldInstance = new PluginFormcreatorSelectField($fields);
136+
137+
// Test a value is mandatory
138+
$input = [
139+
'values' => "",
140+
'name' => 'foo',
141+
];
142+
$out = $fieldInstance->prepareQuestionInputForSave($input);
143+
$this->assertEquals(0, count($out));
144+
145+
// Test accented chars are kept
146+
$input = [
147+
'values' => "éè\r\nsomething else",
148+
'default_values' => "éè",
149+
];
150+
$out = $fieldInstance->prepareQuestionInputForSave($input);
151+
$this->assertEquals("éè\r\nsomething else", $out['values']);
152+
$this->assertEquals("éè", $out['default_values']);
153+
154+
// Test values are trimmed
155+
$input = [
156+
'values' => ' something \r\n something else ',
157+
'default_values' => " something ",
158+
];
159+
$out = $fieldInstance->prepareQuestionInputForSave($input);
160+
$this->assertEquals('something\r\nsomething else', $out['values']);
161+
$this->assertEquals("something", $out['default_values']);
162+
}
123163
}

0 commit comments

Comments
 (0)