$value) { $data[$key] = CRM_Utils_Type::escape($value, $type, $abort); } return $data; } /** * Verify that a variable is of a given type, and apply a bit of processing. * * @param mixed $data * The value to be verified/escaped. * @param string $type * The type to verify against. * @param bool $abort * If TRUE, the operation will CRM_Core_Error::fatal() on invalid data. * * @return mixed * The data, escaped if necessary. */ public static function escape($data, $type, $abort = TRUE) { switch ($type) { case 'Integer': case 'Int': if (CRM_Utils_Rule::integer($data)) { return (int) $data; } break; case 'Positive': if (CRM_Utils_Rule::positiveInteger($data)) { return (int) $data; } break; // CRM-8925 for custom fields of this type case 'Country': case 'StateProvince': // Handle multivalued data in delimited or array format if (is_array($data) || (strpos($data, CRM_Core_DAO::VALUE_SEPARATOR) !== FALSE)) { $valid = TRUE; foreach (CRM_Utils_Array::explodePadded($data) as $item) { if (!CRM_Utils_Rule::positiveInteger($item)) { $valid = FALSE; } } if ($valid) { return $data; } } elseif (CRM_Utils_Rule::positiveInteger($data)) { return (int) $data; } break; case 'File': if (CRM_Utils_Rule::positiveInteger($data)) { return (int) $data; } break; case 'Link': if (CRM_Utils_Rule::url($data = trim($data))) { return $data; } break; case 'Boolean': if (CRM_Utils_Rule::boolean($data)) { return $data; } break; case 'Float': case 'Money': if (CRM_Utils_Rule::numeric($data)) { return $data; } break; case 'String': case 'Memo': case 'Text': return CRM_Core_DAO::escapeString($data); case 'Date': case 'Timestamp': // a null date or timestamp is valid if (strlen(trim($data)) == 0) { return trim($data); } if ((preg_match('/^\d{8}$/', $data) || preg_match('/^\d{14}$/', $data) ) && CRM_Utils_Rule::mysqlDate($data) ) { return $data; } break; case 'ContactReference': if (strlen(trim($data)) == 0) { return trim($data); } if (CRM_Utils_Rule::validContact($data)) { return (int) $data; } break; default: CRM_Core_Error::fatal( $type . " is not a recognised (camel cased) data type." ); break; } // @todo Use exceptions instead of CRM_Core_Error::fatal(). if ($abort) { $data = htmlentities($data); CRM_Core_Error::fatal("$data is not of the type $type"); } return NULL; } /** * Verify that a variable is of a given type. * * @param mixed $data * The value to validate. * @param string $type * The type to validate against. * @param bool $abort * If TRUE, the operation will CRM_Core_Error::fatal() on invalid data. * @name string $name * The name of the attribute * * @return mixed * The data, escaped if necessary */ public static function validate($data, $type, $abort = TRUE, $name = 'One of parameters ') { switch ($type) { case 'Integer': case 'Int': if (CRM_Utils_Rule::integer($data)) { return (int) $data; } break; case 'Positive': if (CRM_Utils_Rule::positiveInteger($data)) { return (int) $data; } break; case 'Boolean': if (CRM_Utils_Rule::boolean($data)) { return $data; } break; case 'Float': case 'Money': if (CRM_Utils_Rule::numeric($data)) { return $data; } break; case 'Text': case 'String': case 'Link': case 'Memo': return $data; case 'Date': // a null date is valid if (strlen(trim($data)) == 0) { return trim($data); } if (preg_match('/^\d{8}$/', $data) && CRM_Utils_Rule::mysqlDate($data) ) { return $data; } break; case 'Timestamp': // a null timestamp is valid if (strlen(trim($data)) == 0) { return trim($data); } if ((preg_match('/^\d{14}$/', $data) || preg_match('/^\d{8}$/', $data) ) && CRM_Utils_Rule::mysqlDate($data) ) { return $data; } break; case 'ContactReference': // null is valid if (strlen(trim($data)) == 0) { return trim($data); } if (CRM_Utils_Rule::validContact($data)) { return $data; } break; default: CRM_Core_Error::fatal("Cannot recognize $type for $data"); break; } if ($abort) { $data = htmlentities($data); CRM_Core_Error::fatal("$name (value: $data) is not of the type $type"); } return NULL; } }