Skip to content

Commit b0173f7

Browse files
oakbanialiabbasrizvi
authored andcommitted
feat(attribute_value): Don't target NAN, INF, -INF and > 2^53 (#147)
1 parent bd4c3a4 commit b0173f7

File tree

2 files changed

+66
-3
lines changed

2 files changed

+66
-3
lines changed

src/Optimizely/Utils/Validator.php

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,17 +70,52 @@ public static function areAttributesValid($attributes)
7070
return count(array_filter(array_keys($attributes), 'is_string')) > 0;
7171
}
7272

73+
/**
74+
* @param $value The value to validate.
75+
*
76+
* @return boolean Representing whether attribute's value is
77+
* a number and not NAN, INF, -INF or greater than absolute limit of 2^53.
78+
*/
79+
public static function isFiniteNumber($value)
80+
{
81+
if (!(is_int($value) || is_float($value))) {
82+
return false;
83+
}
84+
85+
if (is_nan($value) || is_infinite($value)) {
86+
return false;
87+
}
88+
89+
if (abs($value) > pow(2, 53)) {
90+
return false;
91+
}
92+
93+
return true;
94+
}
95+
7396
/**
7497
* @param $attributeKey The key to validate.
7598
* @param $attributeValue The value to validate.
7699
*
77100
* @return boolean Representing whether attribute's key and value are
78-
* valid for event payload or not.
101+
* valid for event payload or not. Valid attribute key must be a string.
102+
* Valid attribute value can be a string, bool, or a finite number.
79103
*/
80104
public static function isAttributeValid($attributeKey, $attributeValue)
81105
{
82-
$validTypes = array('boolean', 'double', 'integer', 'string');
83-
return is_string($attributeKey) && in_array(gettype($attributeValue), $validTypes);
106+
if (!is_string($attributeKey)) {
107+
return false;
108+
}
109+
110+
if (is_string($attributeValue) || is_bool($attributeValue)) {
111+
return true;
112+
}
113+
114+
if (is_int($attributeValue) || is_float($attributeValue)) {
115+
return Validator::isFiniteNumber($attributeValue);
116+
}
117+
118+
return false;
84119
}
85120

86121
/**

tests/UtilsTests/ValidatorTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,34 @@ public function testisAttributeValidAttributeWithInValidKeyValue()
123123
$this->assertFalse(Validator::isAttributeValid(5.5, 'value'));
124124
}
125125

126+
public function testIsFiniteNumberWithInvalidValues()
127+
{
128+
$this->assertFalse(Validator::IsFiniteNumber('HelloWorld'));
129+
$this->assertFalse(Validator::IsFiniteNumber(true));
130+
$this->assertFalse(Validator::IsFiniteNumber(false));
131+
$this->assertFalse(Validator::IsFiniteNumber(null));
132+
$this->assertFalse(Validator::IsFiniteNumber((object)[]));
133+
$this->assertFalse(Validator::IsFiniteNumber([]));
134+
$this->assertFalse(Validator::IsFiniteNumber(INF));
135+
$this->assertFalse(Validator::IsFiniteNumber(-INF));
136+
$this->assertFalse(Validator::IsFiniteNumber(NAN));
137+
$this->assertFalse(Validator::IsFiniteNumber(pow(2,53) + 1));
138+
$this->assertFalse(Validator::IsFiniteNumber(-pow(2,53) - 1));
139+
$this->assertFalse(Validator::IsFiniteNumber(pow(2,53) + 2.0));
140+
$this->assertFalse(Validator::IsFiniteNumber(-pow(2,53) - 2.0));
141+
}
142+
143+
public function testIsFiniteNumberWithValidValues()
144+
{
145+
$this->assertTrue(Validator::IsFiniteNumber(0));
146+
$this->assertTrue(Validator::IsFiniteNumber(5));
147+
$this->assertTrue(Validator::IsFiniteNumber(5.5));
148+
// float pow(2,53) + 1.0 evaluates to float pow(2,53)
149+
$this->assertTrue(Validator::IsFiniteNumber(pow(2,53) + 1.0));
150+
$this->assertTrue(Validator::IsFiniteNumber(-pow(2,53) - 1.0));
151+
$this->assertTrue(Validator::IsFiniteNumber(pow(2,53)));
152+
}
153+
126154
public function testAreEventTagsValidValidEventTags()
127155
{
128156
// Empty attributes

0 commit comments

Comments
 (0)