Files
gustavoo-me/wp-content/plugins/fluent-crm/app/Services/Sanitize.php
T
2026-07-23 22:56:30 -03:00

370 lines
12 KiB
PHP

<?php
namespace FluentCrm\App\Services;
use FluentCrm\App\Models\CustomCompanyField;
use FluentCrm\App\Models\Lists;
use FluentCrm\App\Models\Tag;
use FluentCrm\Framework\Support\Arr;
class Sanitize
{
public static function campaign($data)
{
$fieldMaps = [
'title' => 'sanitize_text_field',
'slug' => 'sanitize_text_field',
'template_id' => 'intval',
'email_subject' => 'sanitize_text_field',
'email_pre_header' => 'sanitize_text_field',
'utm_status' => 'intval',
'utm_source' => 'sanitize_text_field',
'utm_medium' => 'sanitize_text_field',
'utm_campaign' => 'sanitize_text_field',
'utm_term' => 'sanitize_text_field',
'utm_content' => 'sanitize_text_field',
'scheduled_at' => 'sanitize_text_field',
'design_template' => 'sanitize_text_field'
];
foreach ($data as $key => $value) {
if ($value && isset($fieldMaps[$key]) && !is_array($value)) {
$data[$key] = call_user_func($fieldMaps[$key], $value);
}
}
if (!empty($data['settings']) && is_array($data['settings'])) {
$data['settings'] = self::sanitizeCampaignSettings($data['settings']);
}
return $data;
}
private static function sanitizeCampaignSettings($settings)
{
if (!is_array($settings)) {
return [];
}
$footerSettings = Arr::get($settings, 'footer_settings');
if (is_array($footerSettings)) {
$settings['footer_settings'] = self::sanitizeFooterSettings($footerSettings);
}
return $settings;
}
private static function sanitizeFooterSettings($footerSettings)
{
$fontSize = intval(Arr::get($footerSettings, 'font_size', 13));
$footerPadding = intval(Arr::get($footerSettings, 'footer_padding', 20));
$fontColor = sanitize_hex_color(Arr::get($footerSettings, 'font_color', '#202020')) ?: '#202020';
$backgroundColor = Arr::get($footerSettings, 'background_color', 'transparent');
$backgroundColor = ($backgroundColor === 'transparent')
? 'transparent'
: (sanitize_hex_color($backgroundColor) ?: 'transparent');
return [
'disable_footer' => Arr::get($footerSettings, 'disable_footer') === 'yes' ? 'yes' : 'no',
'custom_footer' => Arr::get($footerSettings, 'custom_footer') === 'yes' ? 'yes' : 'no',
'footer_content' => self::sanitizeFooterHtml(Arr::get($footerSettings, 'footer_content', '')),
'font_size' => min(24, max(8, $fontSize)),
'font_color' => $fontColor,
'background_color' => $backgroundColor,
'footer_padding' => min(80, max(0, $footerPadding))
];
}
public static function sanitizeFooterHtml($footerHtml)
{
if (!is_scalar($footerHtml)) {
return '';
}
$footerHtml = (string) $footerHtml;
if ($footerHtml === '') {
return '';
}
$allowedTags = wp_kses_allowed_html('post');
$styleAllowedTags = [
'a', 'p', 'div', 'span', 'img', 'ul', 'ol', 'li',
'strong', 'em', 'b', 'i', 'u', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
'table', 'tbody', 'thead', 'tfoot', 'tr', 'td', 'th', 'blockquote'
];
foreach ($styleAllowedTags as $tagName) {
if (!isset($allowedTags[$tagName])) {
$allowedTags[$tagName] = [];
}
$allowedTags[$tagName]['style'] = [];
}
if (isset($allowedTags['a'])) {
$allowedTags['a']['target'] = [];
$allowedTags['a']['rel'] = [];
}
if (isset($allowedTags['img'])) {
$allowedTags['img']['loading'] = [];
$allowedTags['img']['decoding'] = [];
}
return wp_kses($footerHtml, $allowedTags);
}
public static function contact($data)
{
$fieldMaps = [
'hash' => 'sanitize_text_field',
'prefix' => 'sanitize_text_field',
'first_name' => 'sanitize_text_field',
'last_name' => 'sanitize_text_field',
'user_id' => 'intval',
'email' => 'sanitize_email',
'status' => 'sanitize_text_field',
'contact_type' => 'sanitize_text_field',
'address_line_1' => 'sanitize_text_field',
'address_line_2' => 'sanitize_text_field',
'postal_code' => 'sanitize_text_field',
'city' => 'sanitize_text_field',
'state' => 'sanitize_text_field',
'country' => 'sanitize_text_field',
'phone' => 'sanitize_text_field',
'timezone' => 'sanitize_text_field',
'date_of_birth' => 'sanitize_text_field',
'source' => 'sanitize_text_field',
'life_time_value' => 'sanitize_text_field',
'last_activity' => 'sanitize_text_field',
'total_points' => 'intval',
'latitude' => 'sanitize_text_field',
'longitude' => 'sanitize_text_field',
'ip' => 'sanitize_text_field',
'created_at' => 'sanitize_text_field',
'updated_at' => 'sanitize_text_field',
'avatar' => 'esc_url_raw',
'company_id' => 'intval',
];
foreach ($data as $key => $value) {
if ($value && isset($fieldMaps[$key]) && !is_array($value)) {
$data[$key] = call_user_func($fieldMaps[$key], $value);
}
}
if (isset($data['status'])) {
$status = $data['status'];
if (!in_array($status, fluentcrm_subscriber_statuses())) {
unset($data['status']);
}
}
if (isset($data['contact_type'])) {
if (!array_key_exists($data['contact_type'], fluentcrm_contact_types())) {
unset($data['contact_type']);
}
}
return $data;
}
public static function contactNote($data)
{
$fieldMaps = [
'subscriber_id' => 'intval',
'parent_id' => 'intval',
'created_by' => 'sanitize_text_field',
'status' => 'sanitize_text_field',
'type' => 'sanitize_text_field',
'title' => 'sanitize_text_field',
'description' => 'wp_kses_post',
'created_at' => 'sanitize_text_field'
];
foreach ($data as $key => $value) {
if ($value && isset($fieldMaps[$key]) && !is_array($value)) {
$data[$key] = call_user_func($fieldMaps[$key], $value);
}
}
return $data;
}
public static function funnel($data)
{
$fieldMaps = [
'type' => 'sanitize_text_field',
'title' => 'sanitize_text_field',
'trigger_name' => 'sanitize_text_field',
'status' => 'sanitize_text_field',
'created_by' => 'intval',
'updated_at' => 'sanitize_text_field'
];
foreach ($data as $key => $value) {
if ($value && isset($fieldMaps[$key]) && !is_array($value)) {
$data[$key] = call_user_func($fieldMaps[$key], $value);
}
}
return $data;
}
public static function company($data)
{
$fieldMaps = [
'name' => 'sanitize_text_field',
'description' => 'wp_kses_post',
'phone' => 'sanitize_text_field',
'email' => 'sanitize_email',
'owner_id' => 'intval',
'employees_number' => 'intval',
'industry' => 'sanitize_text_field',
'type' => 'sanitize_text_field',
'address_line_1' => 'sanitize_text_field',
'address_line_2' => 'sanitize_text_field',
'postal_code' => 'sanitize_text_field',
'city' => 'sanitize_text_field',
'state' => 'sanitize_text_field',
'country' => 'sanitize_text_field',
'website' => 'esc_url_raw',
'linkedin_url' => 'esc_url_raw',
'facebook_url' => 'esc_url_raw',
'twitter_url' => 'esc_url_raw',
'logo' => 'esc_url_raw',
];
foreach ($data as $key => $value) {
if ($value && isset($fieldMaps[$key]) && !is_array($value)) {
$data[$key] = call_user_func($fieldMaps[$key], $value);
}
}
if (isset($data['custom_values'])) {
$customValues = Arr::get($data, 'custom_values', []);
$customFieldKeys = [];
$customFields = (new CustomCompanyField())->getGlobalFields()['fields'];
foreach ($customFields as $field) {
$customFieldKeys[] = $field['slug'];
}
if ($customFieldKeys) {
if ($customValues) {
$customValues = (new CustomCompanyField)->formatCustomFieldValues($customValues);
}
}
$data['custom_values'] = $customValues;
}
return $data;
}
public static function sanitizeTagIds($inputTagIds, $willCreate = true)
{
if (!$inputTagIds) {
return [];
}
$tagIds = [];
$nonNumericIds = [];
foreach ($inputTagIds as $tagId) {
if (is_numeric($tagId)) {
$tagIds[] = (int)$tagId;
} else {
$nonNumericIds[] = $tagId;
}
}
if (!$nonNumericIds) {
return $tagIds;
}
foreach ($nonNumericIds as $maybeNewTag) {
if (strlen($maybeNewTag) < 3) {
continue;
}
$exit = Tag::where('title', $maybeNewTag)
->orWhere('slug', $maybeNewTag)
->first();
if ($exit) {
$tagIds[] = $exit->id;
continue;
}
if (!$willCreate) {
continue;
}
// Let's create a new
$tag = Tag::create([
'title' => $maybeNewTag,
'slug' => sanitize_title($maybeNewTag)
]);
$tagIds[] = $tag->id;
do_action('fluent_crm/tag_created', $tag);
}
return $tagIds;
}
public static function sanitizeListIds($inputListIds, $willCreate = true)
{
if (!$inputListIds) {
return [];
}
$listIds = [];
$nonNumericIds = [];
foreach ($inputListIds as $listId) {
if (is_numeric($listId)) {
$listIds[] = (int)$listId;
} else {
$nonNumericIds[] = $listId;
}
}
if (!$nonNumericIds) {
return $listIds;
}
foreach ($nonNumericIds as $maybeNewList) {
if (strlen($maybeNewList) < 3) {
continue;
}
$exit = Lists::where('title', $maybeNewList)
->orWhere('slug', $maybeNewList)
->first();
if ($exit) {
$listIds[] = $exit->id;
continue;
}
if (!$willCreate) {
continue;
}
// Let's create a new
$list = Lists::create([
'title' => sanitize_text_field($maybeNewList),
'slug' => sanitize_title($maybeNewList)
]);
$listIds[] = $list->id;
do_action('fluent_crm/list_created', $listIds);
}
return $listIds;
}
}