Plugin Directory

Changeset 3464745


Ignore:
Timestamp:
02/19/2026 05:25:32 AM (5 weeks ago)
Author:
bitpressadmin
Message:

Update to version 1.6.1 from GitHub

Location:
bit-assist
Files:
82 edited
1 copied

Legend:

Unmodified
Added
Removed
  • bit-assist/tags/1.6.1/backend/app/Config.php

    r3429564 r3464745  
    55namespace BitApps\Assist;
    66
    7 use BitApps\AssistPro\Config as ProConfig;
    8 
    9 if (!\defined('ABSPATH')) {
     7if (!defined('ABSPATH')) {
    108    exit;
    119}
     10
     11use BitApps\AssistPro\Config as ProConfig;
    1212
    1313/**
     
    2222    public const VAR_PREFIX = 'bit_assist_';
    2323
    24     public const VERSION = '1.6.0';
     24    public const VERSION = '1.6.1';
    2525
    2626    public const DB_VERSION = '1.0.3';
     
    6060
    6161            case 'SITE_URL':
    62                 $parsedUrl = parse_url(get_admin_url());
     62                $parsedUrl = wp_parse_url(get_admin_url());
    6363                $siteUrl = $parsedUrl['scheme'] . '://' . $parsedUrl['host'];
    6464                $siteUrl .= empty($parsedUrl['port']) ? null : ':' . $parsedUrl['port'];
     
    6767
    6868            case 'SITE_DOMAIN':
    69                 $parsedUrl = parse_url(get_admin_url());
     69                $parsedUrl = wp_parse_url(get_admin_url());
    7070
    7171                return $parsedUrl['host'];
     
    187187    public static function isDev()
    188188    {
    189         return \defined('BITAPPS_DEV') && BITAPPS_DEV;
     189        return defined('BITAPPS_DEV') && BITAPPS_DEV;
    190190    }
    191191
  • bit-assist/tags/1.6.1/backend/app/HTTP/Controllers/AnalyticsController.php

    r3241612 r3464745  
    33namespace BitApps\Assist\HTTP\Controllers;
    44
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
     8
     9use AllowDynamicProperties;
    510use BitApps\Assist\Config;
    6 use AllowDynamicProperties;
     11use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
     12use BitApps\Assist\Deps\BitApps\WPKit\Http\Response;
    713use BitApps\Assist\Model\Analytics;
    8 use BitApps\Assist\Deps\BitApps\WPKit\Http\Response;
    9 use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
    1014
    1115#[AllowDynamicProperties]
     
    1620        $analyticsOption = Config::getOption('analytics_activate');
    1721
    18         return $analyticsOption ? (int)$analyticsOption : 0;
     22        return $analyticsOption ? (int) $analyticsOption : 0;
    1923    }
    2024
     
    8690        $iterations = 0;
    8791
    88         $cutoff = date('Y-m-d H:i:s', strtotime("-{$retentionDays} days"));
     92        $cutoff = gmdate('Y-m-d H:i:s', strtotime("-{$retentionDays} days"));
    8993
    9094        $table = $wpdb->prefix . Config::VAR_PREFIX . 'analytics';
    9195
     96        // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter, WordPress.DB.PreparedSQL.NotPrepared -- Table name from WordPress constants, cutoff is a valid date string, batch size is a valid integer
    9297        $preparedQuery = $wpdb->prepare(
    9398            "DELETE FROM {$table} WHERE created_at < %s LIMIT %d",
     
    97102
    98103        /**
    99         * If the number of records deleted in a batch is equal to the batch size,
    100         * and the number of iterations is less than the maximum number of iterations,
    101         * continue deleting records in batches.
    102         */
     104         * If the number of records deleted in a batch is equal to the batch size,
     105         * and the number of iterations is less than the maximum number of iterations,
     106         * continue deleting records in batches.
     107         */
    103108        do {
     109            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
    104110            $deletedCount = $wpdb->query($preparedQuery);
    105111
     
    115121        $isDate = preg_match($datePattern, $filterValue) === 1;
    116122
    117         $startDate = date('Y-m-d');
    118         $endDate = date('Y-m-d');
     123        $startDate = gmdate('Y-m-d');
     124        $endDate = gmdate('Y-m-d');
    119125        $dateRange = [];
    120126
     
    125131        $placeHolder = [0, 1, 0, 1, 1, 0, 0, 1];
    126132
     133        // Build the date condition SQL
    127134        $dateCondition = '';
    128135        if ($filterValue === '7days') {
     
    132139        } elseif ($filterValue === 'today') {
    133140            $dateCondition = 'DATE(analytics.created_at) = CURDATE()';
    134         } elseif ($isDate && isset($dateRange[0]) && isset($dateRange[1])) {
     141        } elseif ($isDate && isset($dateRange[0], $dateRange[1])) {
    135142            $startDate = $dateRange[0];
    136143            $endDate = $dateRange[1];
     
    138145            $placeHolder[] = $endDate;
    139146            $dateCondition = 'DATE(analytics.created_at) BETWEEN %s AND %s';
    140         } elseif ($isDate && count($dateRange) !== 2) {
     147        } elseif ($isDate && \count($dateRange) !== 2) {
    141148            $startDate = $dateRange[0];
    142149            $placeHolder[] = $startDate;
     
    146153        }
    147154
     155        // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- Table names from WordPress constants, date condition is built securely above, placeholder count varies by filter
    148156        $sql = $wpdb->prepare(
    149157            "SELECT
     
    158166                        (analytics.channel_id IS NULL AND (analytics.is_clicked = %d OR analytics.is_clicked = %d))
    159167                    AND
    160                         $dateCondition
     168                        {$dateCondition}
    161169                    GROUP BY
    162170                        analytics.widget_id, widgets.name",
    163171            $placeHolder
    164172        );
    165 
     173        // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber
     174
     175        // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Query is prepared above, direct query for analytics reporting
    166176        $widgetAnalyticsData = $wpdb->get_results($sql);
    167177
     
    176186        $filterValue = $request->filter;
    177187        $datePattern = '/\d{4}-\d{2}-\d{2}/';
    178         $isDate = is_array($filterValue) ? preg_match($datePattern, $filterValue[0]) === 1 : false;
    179 
    180         $startDate = date('Y-m-d');
    181         $endDate = date('Y-m-d');
     188        $isDate = \is_array($filterValue) ? preg_match($datePattern, $filterValue[0]) === 1 : false;
     189
     190        $startDate = gmdate('Y-m-d');
     191        $endDate = gmdate('Y-m-d');
    182192
    183193        $placeHolder = [1, 0, 1, 0, $widget_id, 1];
    184194
     195        // Build the date condition SQL
    185196        $dateCondition = '';
    186197        if ($filterValue === '7days') {
     
    190201        } elseif ($filterValue === 'today') {
    191202            $dateCondition = 'DATE(analytics.created_at) = CURDATE()';
    192         } elseif ($isDate && isset($filterValue[0]) && isset($filterValue[1])) {
     203        } elseif ($isDate && isset($filterValue[0], $filterValue[1])) {
    193204            $startDate = $filterValue[0];
    194205            $endDate = $filterValue[1];
     
    196207            $placeHolder[] = $endDate;
    197208            $dateCondition = 'DATE(analytics.created_at) BETWEEN %s AND %s';
    198         } elseif ($isDate && count($filterValue) !== 2) {
     209        } elseif ($isDate && \count($filterValue) !== 2) {
    199210            $startDate = $filterValue[0];
    200211            $placeHolder[] = $startDate;
     
    204215        }
    205216
     217        // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- Table names from WordPress constants, date condition is built securely above, placeholder count varies by filter
    206218        $sql = $wpdb->prepare(
    207219            "SELECT
     
    221233                    analytics.is_clicked = %d
    222234                AND
    223                     $dateCondition
     235                    {$dateCondition}
    224236                GROUP BY
    225237                    c.id",
    226238            $placeHolder
    227239        );
    228 
     240        // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber
     241
     242        // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Query is prepared above, direct query for analytics reporting
    229243        $results = $wpdb->get_results($sql);
    230244
     
    235249    {
    236250        Analytics::delete();
     251
    237252        return Response::success('Analytics removed!');
    238253    }
  • bit-assist/tags/1.6.1/backend/app/HTTP/Controllers/ApiWidgetController.php

    r3342737 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use AllowDynamicProperties;
     
    5963                $domainExceptWWW = $domain;
    6064            }
    61             $widget->where('domains', 'LIKE', '%' . parse_url($domainExceptWWW)['host'] . '%');
     65            $widget->where('domains', 'LIKE', '%' . wp_parse_url($domainExceptWWW)['host'] . '%');
    6266        } else {
    6367            return;
     
    7882    {
    7983        $widgetChannels = WidgetChannel::where('status', 1)->where('widget_id', $widgetId)->orderBy('sequence')->get(['id', 'channel_name', 'config']);
    80         if (!is_array($widgetChannels) || \count($widgetChannels) < 1) {
    81             return null;
     84        if (!\is_array($widgetChannels) || \count($widgetChannels) < 1) {
     85            return;
    8286        }
    8387
  • bit-assist/tags/1.6.1/backend/app/HTTP/Controllers/BitAssistAnalyticsController.php

    r3090183 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Model\WidgetChannel;
  • bit-assist/tags/1.6.1/backend/app/HTTP/Controllers/DownloadController.php

    r3243139 r3464745  
    33namespace BitApps\Assist\HTTP\Controllers;
    44
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
     8
    59use BitApps\Assist\Config;
     10use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
    611use BitApps\Assist\Helpers\FileHandler;
    712
    813final class DownloadController
    914{
    10     public function downloadResponseFile()
     15    public function downloadResponseFile(Request $request)
    1116    {
    12         if (!function_exists('wp_check_filetype_and_ext')) {
    13             require_once ABSPATH . 'wp-admin/includes/file.php';
    14         }
     17        $validated = $request->validate([
     18            'widgetChannelID' => ['required', 'integer'],
     19            'fileID'          => ['required', 'string', 'sanitize:text'],
     20            'fileName'        => ['required', 'string', 'sanitize:text'],
     21            'download'        => ['nullable'],
     22        ]);
    1523
    16         $widgetChannelID = intval(sanitize_text_field($_GET['widgetChannelID']));
    17 
    18         $fileID = sanitize_text_field($_GET['fileID']);
    19 
    20         $fileName = sanitize_text_field($_GET['fileName']);
    21 
    22         $forceDownload = isset($_GET['download']);
     24        $widgetChannelID = $validated['widgetChannelID'];
     25        $fileID = $validated['fileID'];
     26        $fileName = $validated['fileName'];
     27        $forceDownload = isset($validated['download']);
    2328
    2429        if (empty($widgetChannelID) || empty($fileID) || empty($fileName)) {
     
    4449    private function fileDownloadORView($filePath, $fileName, $forceDownload = false)
    4550    {
     51        global $wp_filesystem;
     52        if (empty($wp_filesystem)) {
     53            require_once ABSPATH . 'wp-admin/includes/file.php';
     54            WP_Filesystem();
     55        }
     56
    4657        if ($forceDownload) {
    4758            header('Content-Type: application/force-download');
     
    5465            if ($fileInfo['type'] && $fileInfo['ext']) {
    5566                $content_types = $fileInfo['type'];
    56                 if (in_array($fileInfo['ext'], ['txt', 'php', 'html', 'xhtml', 'json'])) {
     67                if (\in_array($fileInfo['ext'], ['txt', 'php', 'html', 'xhtml', 'json'])) {
    5768                    $content_types = 'text/plain';
    5869                }
    5970            }
    6071            header('Content-Disposition:filename="' . $fileName . '"');
    61             header("Content-Type: $content_types");
     72            header("Content-Type: {$content_types}");
    6273        }
    6374
     
    6980        header('Content-Transfer-Encoding: binary ');
    7081        flush();
    71         readfile($filePath);
    72         die();
     82
     83        // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Raw file content output for download/view, escaping would corrupt binary files.
     84        echo $wp_filesystem->get_contents($filePath);
     85        exit();
    7386    }
    7487
  • bit-assist/tags/1.6.1/backend/app/HTTP/Controllers/IframeController.php

    r3241612 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
     
    1317            'clientDomain' => ['required', 'string', 'sanitize:text'],
    1418        ]);
    15        
     19
    1620        $urlParts = explode('-protocol-bit-assist-', $validated['clientDomain']);
    1721        $protocol = $urlParts[0] === 'i' ? 'http://' : 'https://';
     
    2630        }
    2731
    28         echo <<<HTML
    29 <!DOCTYPE html>
    30 <html lang="en">
    31     <head>
    32         <meta charset="UTF-8" />
    33         <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    34         <title>Bit Assist Widget</title>
    35         <script crossorigin src="{$assetBase}/assets/index.js?ver={$version}"></script>
    36         <link rel="stylesheet" href="{$assetBase}/assets/index.css?ver={$version}">
    37     </head>
    38     <body>
    39         <div id="widgetWrapper" class="hide">
    40             <div id="contentWrapper" class="hide"></div>
    41             <div id="widgetBubbleRow">
    42                 <div id="widgetBubbleWrapper">
    43                     <button id="widgetBubble"><img alt="Widget Icon" id="widget-img" /></button>
    44                     <span id="credit"><a href="https://www.bitapps.pro/bit-assist" rel="nofollow noreferrer noopener" target="_blank">by Bit Assist</a></span>
    45                 </div>
    46             </div>
    47         </div>
    48     </body>
    49 </html>
    50 HTML;
     32        echo '<!DOCTYPE html>';
     33        echo '<html lang="en">';
     34        echo '<head>';
     35        echo '<meta charset="UTF-8" />';
     36        echo '<meta name="viewport" content="width=device-width, initial-scale=1.0" />';
     37        echo '<title>Bit Assist Widget</title>';
     38        // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript -- It can be outside of WordPress environment, so we can't rely on wp_enqueue_script.
     39        echo '<script crossorigin src="' . esc_url($assetBase . '/assets/index.js?ver=' . $version) . '"></script>';
     40        // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedStylesheet -- It can be outside of WordPress environment, so we can't rely on wp_enqueue_style.
     41        echo '<link rel="stylesheet" href="' . esc_url($assetBase . '/assets/index.css?ver=' . $version) . '">';
     42        echo '</head>';
     43        echo '<body>';
     44        echo '<div id="widgetWrapper" class="hide">';
     45        echo '<div id="contentWrapper" class="hide"></div>';
     46        echo '<div id="widgetBubbleRow">';
     47        echo '<div id="widgetBubbleWrapper">';
     48        echo '<button id="widgetBubble"><img alt="Widget Icon" id="widget-img" /></button>';
     49        echo '<span id="credit"><a href="https://www.bitapps.pro/bit-assist" rel="nofollow noreferrer noopener" target="_blank">by Bit Assist</a></span>';
     50        echo '</div>';
     51        echo '</div>';
     52        echo '</div>';
     53        echo '</body>';
     54        echo '</html>';
    5155
    5256        status_header(200);
  • bit-assist/tags/1.6.1/backend/app/HTTP/Controllers/ResponseController.php

    r3243139 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
  • bit-assist/tags/1.6.1/backend/app/HTTP/Controllers/WPPostController.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Deps\BitApps\WPKit\Http\Response;
  • bit-assist/tags/1.6.1/backend/app/HTTP/Controllers/WidgetChannelController.php

    r3241612 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
     
    183187    {
    184188        $validated['config']['title'] = sanitize_text_field($validated['config']['title']);
     189
    185190        return $validated;
    186191    }
  • bit-assist/tags/1.6.1/backend/app/HTTP/Controllers/WidgetController.php

    r3241612 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
  • bit-assist/tags/1.6.1/backend/app/HTTP/Controllers/WooChannelController.php

    r3429564 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use AllowDynamicProperties;
     
    2226        $order_id = sanitize_text_field($request->get('number'));
    2327        $billing_email = sanitize_email($request->get('email'));
    24         $widget_channel_id = intval($request->get('widget_channel_id'));
     28        $widget_channel_id = \intval($request->get('widget_channel_id'));
    2529
    2630        if (!$order_id) {
  • bit-assist/tags/1.6.1/backend/app/HTTP/Controllers/WpSearchController.php

    r3342879 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use AllowDynamicProperties;
     
    2933    private function getPageAndPosts($search, $page, $postTypes)
    3034    {
    31         $paged = max(1, intval($page));
     35        $paged = max(1, \intval($page));
    3236        $search = trim($search);
    3337
     
    7175            ];
    7276        }, array_filter($posts, function ($post) {
    73             return $post && is_object($post);
     77            return $post && \is_object($post);
    7478        }));
    7579    }
  • bit-assist/tags/1.6.1/backend/app/HTTP/Middleware/AdminCheckerMiddleware.php

    r3241612 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Middleware;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Deps\BitApps\WPKit\Http\Response;
  • bit-assist/tags/1.6.1/backend/app/HTTP/Middleware/LoggedInCheckerMiddleware.php

    r3407659 r3464745  
    33namespace BitApps\Assist\HTTP\Middleware;
    44
    5 // Prevent direct script access
    6 if (!\defined('ABSPATH')) {
     5if (!defined('ABSPATH')) {
    76    exit;
    87}
  • bit-assist/tags/1.6.1/backend/app/HTTP/Middleware/NonceCheckerMiddleware.php

    r3195774 r3464745  
    33namespace BitApps\Assist\HTTP\Middleware;
    44
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
     8
     9use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
    510use BitApps\Assist\Deps\BitApps\WPKit\Http\Response;
    6 use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
    711
    812final class NonceCheckerMiddleware
  • bit-assist/tags/1.6.1/backend/app/HTTP/Requests/WidgetChannelStoreRequest.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Requests;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
  • bit-assist/tags/1.6.1/backend/app/HTTP/Requests/WidgetChannelUpdateRequest.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Requests;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
  • bit-assist/tags/1.6.1/backend/app/HTTP/Requests/WidgetStoreRequest.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Requests;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
  • bit-assist/tags/1.6.1/backend/app/HTTP/Requests/WidgetUpdateRequest.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Requests;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
  • bit-assist/tags/1.6.1/backend/app/Helpers/FileHandler.php

    r3299751 r3464745  
    22
    33namespace BitApps\Assist\Helpers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
     
    1923        $file_uploaded = [];
    2024
    21         if (is_array($fileDetails['name'])) {
     25        if (\is_array($fileDetails['name'])) {
    2226            foreach ($fileDetails['name'] as $key => $fileName) {
    2327                $fileData = $this->saveFile($_upload_dir, $fileDetails['tmp_name'][$key], $fileName);
     
    4549    }
    4650
     51    public function deleteFiles($widgetChannelID, $files)
     52    {
     53        $_upload_dir = Config::get('UPLOAD_DIR') . DIRECTORY_SEPARATOR . $widgetChannelID;
     54        foreach ($files as $name) {
     55            wp_delete_file($_upload_dir . DIRECTORY_SEPARATOR . $name);
     56        }
     57    }
     58
    4759    private function saveFile($_upload_dir, $tmpName, $fileName)
    4860    {
     
    5466        $file_uploaded = ['uniqueName' => $uniqueFileName, 'originalName' => $fileName];
    5567
    56         $move_status = \move_uploaded_file($tmpName, $_upload_dir . DIRECTORY_SEPARATOR . $uniqueFileName);
     68        global $wp_filesystem;
     69        if (empty($wp_filesystem)) {
     70            require_once ABSPATH . 'wp-admin/includes/file.php';
     71            WP_Filesystem();
     72        }
     73
     74        $destination = $_upload_dir . DIRECTORY_SEPARATOR . $uniqueFileName;
     75        $move_status = $wp_filesystem->move($tmpName, $destination, true);
     76
    5777        if (!$move_status) {
    5878            return false;
    5979        }
     80
    6081        return $file_uploaded;
    6182    }
    62 
    63     public function deleteFiles($widgetChannelID, $files)
    64     {
    65         $_upload_dir = Config::get('UPLOAD_DIR') . DIRECTORY_SEPARATOR . $widgetChannelID;
    66         foreach ($files as $name) {
    67             unlink($_upload_dir . DIRECTORY_SEPARATOR . $name);
    68         }
    69     }
    7083}
  • bit-assist/tags/1.6.1/backend/app/Model/Analytics.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\Model;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
  • bit-assist/tags/1.6.1/backend/app/Model/Response.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\Model;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
  • bit-assist/tags/1.6.1/backend/app/Model/Widget.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\Model;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
     
    913{
    1014    protected $prefix = Config::VAR_PREFIX;
    11    
     15
    1216    protected $casts = [
    1317        'styles'           => 'object',
  • bit-assist/tags/1.6.1/backend/app/Model/WidgetChannel.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\Model;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
  • bit-assist/tags/1.6.1/backend/app/Plugin.php

    r3407659 r3464745  
    22
    33namespace BitApps\Assist;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59/*
     
    913 */
    1014
    11 use BitApps\Assist\Deps\BitApps\WPKit\Migration\MigrationHelper;
    1215use BitApps\Assist\Deps\BitApps\WPKit\Hooks\Hooks;
    1316use BitApps\Assist\Deps\BitApps\WPKit\Http\RequestType;
     17use BitApps\Assist\Deps\BitApps\WPKit\Migration\MigrationHelper;
    1418use BitApps\Assist\Deps\BitApps\WPKit\Utils\Capabilities;
    1519use BitApps\Assist\Deps\BitApps\WPTelemetry\Telemetry\Telemetry;
     
    6771        /**
    6872         * Add schedule to cleanup analytics if the plugin version is less than or equal to 1.5.3
     73         *
    6974         * @since 1.5.4
    7075         */
  • bit-assist/tags/1.6.1/backend/app/Providers/HookProvider.php

    r3407659 r3464745  
    22
    33namespace BitApps\Assist\Providers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
  • bit-assist/tags/1.6.1/backend/app/Providers/InstallerProvider.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\Providers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
  • bit-assist/tags/1.6.1/backend/app/Views/Layout.php

    r3195774 r3464745  
    4141                        $menu['capability'],
    4242                        $menu['slug'],
    43                         is_string($menu['callback']) ? (method_exists($this, $menu['callback']) ? [$this, $menu['callback']] : $menu['callback']) : $menu['callback'],
     43                        \is_string($menu['callback']) ? (method_exists($this, $menu['callback']) ? [$this, $menu['callback']] : $menu['callback']) : $menu['callback'],
    4444                        $menu['icon'],
    4545                        $menu['position']
     
    6868
    6969        // loading google fonts
     70        // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion -- External font resource version managed by Google
    7071        wp_enqueue_style('googleapis-PRECONNECT', 'https://fonts.googleapis.com');
     72        // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion -- External font resource version managed by Google
    7173        wp_enqueue_style('gstatic-PRECONNECT-CROSSORIGIN', 'https://fonts.gstatic.com');
    7274        wp_enqueue_style('font', self::FONT_URL, [], $version);
     
    7577
    7678        if (Config::isDev()) {
     79            // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter, WordPress.WP.EnqueuedResourceParameters.MissingVersion -- Dev mode hot reload script must load in header
    7780            wp_enqueue_script($slug . '-vite-client-helper-MODULE', Config::DEV_URL . '/config/devHotModule.js', [], null);
     81            // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter, WordPress.WP.EnqueuedResourceParameters.MissingVersion -- Dev mode hot reload script must load in header
    7882            wp_enqueue_script($slug . '-vite-client-MODULE', Config::DEV_URL . '/@vite/client', [], null);
     83            // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter, WordPress.WP.EnqueuedResourceParameters.MissingVersion -- Dev mode hot reload script must load in header
    7984            wp_enqueue_script($slug . '-index-MODULE', Config::DEV_URL . '/index.tsx', [], null);
    8085        } else {
     86            // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter -- Main app script must load in header for proper initialization
    8187            wp_enqueue_script($slug . '-index-MODULE', $assetUri . '/index.js', [], $version);
    8288            wp_enqueue_style($slug . '-styles', $assetUri . '/index.css', null, $version);
     
    132138        $rootURL = Config::get('ROOT_URI');
    133139
    134         // phpcs:disable Generic.PHP.ForbiddenFunctions.Found
    135 
    136         echo <<<HTML
    137         <noscript>You need to enable JavaScript to run this app.</noscript>
    138         <div id="bit-apps-root">
    139         <div
    140             style="display: flex;flex-direction: column;justify-content: center;
    141             align-items: center;height: 90vh;font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;">
    142             <img alt="bit-assist-logo" class="bit-logo" width="70" src="{$rootURL}/img/logo.svg">
    143             <h1>Welcome to Bit Assist</h1>
    144             <p></p>
    145         </div>
    146         </div>
    147 HTML;
     140        echo '<noscript>You need to enable JavaScript to run this app.</noscript>';
     141        echo '<div id="bit-apps-root">';
     142        echo '<div style="display: flex;flex-direction: column;justify-content: center;';
     143        echo 'align-items: center;height: 90vh;font-family: \'Segoe UI\', Tahoma, Geneva, Verdana, sans-serif;">';
     144        echo '<img alt="bit-assist-logo" class="bit-logo" width="70" src="' . esc_url($rootURL . '/img/logo.svg') . '">';
     145        echo '<h1>Welcome to Bit Assist</h1>';
     146        echo '<p></p>';
     147        echo '</div>';
     148        echo '</div>';
    148149    }
    149150
     
    212213    public function createConfigVariable()
    213214    {
     215        // phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.DynamicHooknameFound -- Hook name is prefixed via Config::withPrefix()
    214216        $frontendVars = apply_filters(
    215217            Config::withPrefix('localized_script'),
     
    228230            ]
    229231        );
     232        // phpcs:enable WordPress.NamingConventions.PrefixAllGlobals.DynamicHooknameFound
    230233        if (get_locale() !== 'en_US' && file_exists(Config::get('BASEDIR') . '/languages/generatedString.php')) {
    231234            include_once Config::get('BASEDIR') . '/languages/generatedString.php';
  • bit-assist/tags/1.6.1/backend/bootstrap.php

    r2814120 r3464745  
    11<?php
    22
    3 if (!\defined('ABSPATH')) {
     3if (!defined('ABSPATH')) {
    44    exit;
    55}
  • bit-assist/tags/1.6.1/backend/db/Migrations/BASTAnalyticsTableMigration.php

    r3195774 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Config;
    48use BitApps\Assist\Deps\BitApps\WPDatabase\Blueprint;
     9use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    510use BitApps\Assist\Deps\BitApps\WPKit\Migration\Migration;
    6 use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    711
    8 if (!\defined('ABSPATH')) {
    9     exit;
    10 }
    11 
     12// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound -- Migration class follows framework naming convention
    1213final class BASTAnalyticsTableMigration extends Migration
    1314{
  • bit-assist/tags/1.6.1/backend/db/Migrations/BASTPluginOptions.php

    r3195774 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Config;
     
    59use BitApps\Assist\Deps\BitApps\WPKit\Migration\Migration;
    610
    7 if (!\defined('ABSPATH')) {
    8     exit;
    9 }
    10 
     11// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound -- Migration class follows framework naming convention
    1112final class BASTPluginOptions extends Migration
    1213{
  • bit-assist/tags/1.6.1/backend/db/Migrations/BASTResponsesTableMigration.php

    r3195774 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Config;
    48use BitApps\Assist\Deps\BitApps\WPDatabase\Blueprint;
     9use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    510use BitApps\Assist\Deps\BitApps\WPKit\Migration\Migration;
    6 use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    711
    8 if (!\defined('ABSPATH')) {
    9     exit;
    10 }
    11 
     12// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound -- Migration class follows framework naming convention
    1213final class BASTResponsesTableMigration extends Migration
    1314{
  • bit-assist/tags/1.6.1/backend/db/Migrations/BASTUpdateCustomCssColumnInWidgetTableMigration.php

    r3195774 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Config;
    48use BitApps\Assist\Deps\BitApps\WPKit\Migration\Migration;
    59
    6 if (!\defined('ABSPATH')) {
    7     exit;
    8 }
    9 
     10// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound -- Migration class follows framework naming convention
    1011final class BASTUpdateCustomCssColumnInWidgetTableMigration extends Migration
    1112{
     
    1819        global $wpdb;
    1920        $table_name = Config::withDBPrefix('widgets');
    20         $sql = "ALTER TABLE $table_name MODIFY COLUMN custom_css LONGTEXT NULL;";
     21        // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Table name from trusted Config class, ALTER TABLE cannot use prepared statements
     22        $sql = "ALTER TABLE {$table_name} MODIFY COLUMN custom_css LONGTEXT NULL;";
     23        // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Table name from trusted Config class, ALTER TABLE cannot use prepared statements, direct DB query required for migration
    2124        $wpdb->query($sql);
    2225    }
     
    3033        global $wpdb;
    3134        $table_name = Config::withDBPrefix('widgets');
    32         $sql = "ALTER TABLE $table_name MODIFY COLUMN custom_css VARCHAR(255) NULL;";
     35        // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Table name from trusted Config class, ALTER TABLE cannot use prepared statements
     36        $sql = "ALTER TABLE {$table_name} MODIFY COLUMN custom_css VARCHAR(255) NULL;";
     37        // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Table name from trusted Config class, ALTER TABLE cannot use prepared statements, direct DB query required for migration
    3338        $wpdb->query($sql);
    3439    }
  • bit-assist/tags/1.6.1/backend/db/Migrations/BASTUpdateOptions.php

    r3195774 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Config;
    48use BitApps\Assist\Deps\BitApps\WPKit\Migration\Migration;
    59
    6 if (!\defined('ABSPATH')) {
    7     exit;
    8 }
    9 
     10// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound -- Migration class follows framework naming convention
    1011final class BASTUpdateOptions extends Migration
    1112{
     
    1819    public function down()
    1920    {
    20         return;
    2121    }
    2222}
  • bit-assist/tags/1.6.1/backend/db/Migrations/BASTWidgetChannelsTableMigration.php

    r3195774 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Config;
    48use BitApps\Assist\Deps\BitApps\WPDatabase\Blueprint;
     9use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    510use BitApps\Assist\Deps\BitApps\WPKit\Migration\Migration;
    6 use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    711
    8 if (!\defined('ABSPATH')) {
    9     exit;
    10 }
    11 
     12// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound -- Migration class follows framework naming convention
    1213final class BASTWidgetChannelsTableMigration extends Migration
    1314{
  • bit-assist/tags/1.6.1/backend/db/Migrations/BASTWidgetsTableMigration.php

    r3195774 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Config;
    48use BitApps\Assist\Deps\BitApps\WPDatabase\Blueprint;
     9use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    510use BitApps\Assist\Deps\BitApps\WPKit\Migration\Migration;
    6 use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    711
    8 if (!\defined('ABSPATH')) {
    9     exit;
    10 }
    11 
     12// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound -- Migration class follows framework naming convention
    1213final class BASTWidgetsTableMigration extends Migration
    1314{
  • bit-assist/tags/1.6.1/backend/hooks/ajax.php

    r3241612 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Deps\BitApps\WPKit\Http\Router\Route;
     
    812use BitApps\Assist\HTTP\Controllers\WidgetController;
    913use BitApps\Assist\HTTP\Controllers\WPPostController;
    10 
    11 if (!\defined('ABSPATH')) {
    12     exit;
    13 }
    1414
    1515// if (!headers_sent()) {
  • bit-assist/tags/1.6.1/backend/hooks/api.php

    r3407659 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Deps\BitApps\WPKit\Http\Router\Route;
     
    59use BitApps\Assist\HTTP\Controllers\ApiWidgetController;
    610use BitApps\Assist\HTTP\Controllers\IframeController;
     11use BitApps\Assist\HTTP\Controllers\ResponseController;
    712use BitApps\Assist\HTTP\Controllers\WooChannelController;
    8 use BitApps\Assist\HTTP\Controllers\ResponseController;
    913use BitApps\Assist\HTTP\Controllers\WpSearchController;
    10 
    11 if (!\defined('ABSPATH')) {
    12     exit;
    13 }
    1414
    1515Route::group(function () {
  • bit-assist/tags/1.6.1/index.php

    r3429564 r3464745  
    55 * Plugin URI:  https://bitapps.pro/bit-assist
    66 * Description: WhatsApp,Facebook Messenger chat, click to chat Live Chat Widget,Call button & 30+ social chat support button for customer support with sticky chat button
    7  * Version:     1.6.0
     7 * Version:     1.6.1
    88 * Author:      Bit Assist - Click to Chat Widget Live Chat Support Chat Button
    99 * Author URI:  https://bitapps.pro
     
    1414 * License: gpl2+
    1515 */
     16if (!defined('ABSPATH')) {
     17    exit;
     18}
     19
    1620require_once plugin_dir_path(__FILE__) . 'backend/bootstrap.php';
  • bit-assist/tags/1.6.1/readme.txt

    r3429564 r3464745  
    66Tested up to: 6.9
    77Requires PHP: 7.4
    8 Stable tag: 1.6.0
     8Stable tag: 1.6.1
    99License: GPLv2 or later
    1010
     
    349349
    350350== Changelog ==
     351= v1.6.1 (Feb 19, 2026) =
     352* Fix: WordPress Plugin Checker issues fixed.
     353
    351354= v1.6.0 (Dec 30, 2025) =
    352355* Fix: WooCommerce order details can now only be viewed by the user who placed the order.
  • bit-assist/tags/1.6.1/vendor/composer/installed.php

    r3429564 r3464745  
    22    'root' => array(
    33        'name' => 'bitapps/assist',
    4         'pretty_version' => '1.6.0',
    5         'version' => '1.6.0.0',
    6         'reference' => '88cb852704f8f67eb6e264dbe8a16b757d0147a9',
     4        'pretty_version' => '1.6.1',
     5        'version' => '1.6.1.0',
     6        'reference' => '0428cad0defb425d7b7e89022c5d9ddd47ce7542',
    77        'type' => 'library',
    88        'install_path' => __DIR__ . '/../../',
     
    1212    'versions' => array(
    1313        'bitapps/assist' => array(
    14             'pretty_version' => '1.6.0',
    15             'version' => '1.6.0.0',
    16             'reference' => '88cb852704f8f67eb6e264dbe8a16b757d0147a9',
     14            'pretty_version' => '1.6.1',
     15            'version' => '1.6.1.0',
     16            'reference' => '0428cad0defb425d7b7e89022c5d9ddd47ce7542',
    1717            'type' => 'library',
    1818            'install_path' => __DIR__ . '/../../',
  • bit-assist/trunk/backend/app/Config.php

    r3429564 r3464745  
    55namespace BitApps\Assist;
    66
    7 use BitApps\AssistPro\Config as ProConfig;
    8 
    9 if (!\defined('ABSPATH')) {
     7if (!defined('ABSPATH')) {
    108    exit;
    119}
     10
     11use BitApps\AssistPro\Config as ProConfig;
    1212
    1313/**
     
    2222    public const VAR_PREFIX = 'bit_assist_';
    2323
    24     public const VERSION = '1.6.0';
     24    public const VERSION = '1.6.1';
    2525
    2626    public const DB_VERSION = '1.0.3';
     
    6060
    6161            case 'SITE_URL':
    62                 $parsedUrl = parse_url(get_admin_url());
     62                $parsedUrl = wp_parse_url(get_admin_url());
    6363                $siteUrl = $parsedUrl['scheme'] . '://' . $parsedUrl['host'];
    6464                $siteUrl .= empty($parsedUrl['port']) ? null : ':' . $parsedUrl['port'];
     
    6767
    6868            case 'SITE_DOMAIN':
    69                 $parsedUrl = parse_url(get_admin_url());
     69                $parsedUrl = wp_parse_url(get_admin_url());
    7070
    7171                return $parsedUrl['host'];
     
    187187    public static function isDev()
    188188    {
    189         return \defined('BITAPPS_DEV') && BITAPPS_DEV;
     189        return defined('BITAPPS_DEV') && BITAPPS_DEV;
    190190    }
    191191
  • bit-assist/trunk/backend/app/HTTP/Controllers/AnalyticsController.php

    r3241612 r3464745  
    33namespace BitApps\Assist\HTTP\Controllers;
    44
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
     8
     9use AllowDynamicProperties;
    510use BitApps\Assist\Config;
    6 use AllowDynamicProperties;
     11use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
     12use BitApps\Assist\Deps\BitApps\WPKit\Http\Response;
    713use BitApps\Assist\Model\Analytics;
    8 use BitApps\Assist\Deps\BitApps\WPKit\Http\Response;
    9 use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
    1014
    1115#[AllowDynamicProperties]
     
    1620        $analyticsOption = Config::getOption('analytics_activate');
    1721
    18         return $analyticsOption ? (int)$analyticsOption : 0;
     22        return $analyticsOption ? (int) $analyticsOption : 0;
    1923    }
    2024
     
    8690        $iterations = 0;
    8791
    88         $cutoff = date('Y-m-d H:i:s', strtotime("-{$retentionDays} days"));
     92        $cutoff = gmdate('Y-m-d H:i:s', strtotime("-{$retentionDays} days"));
    8993
    9094        $table = $wpdb->prefix . Config::VAR_PREFIX . 'analytics';
    9195
     96        // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter, WordPress.DB.PreparedSQL.NotPrepared -- Table name from WordPress constants, cutoff is a valid date string, batch size is a valid integer
    9297        $preparedQuery = $wpdb->prepare(
    9398            "DELETE FROM {$table} WHERE created_at < %s LIMIT %d",
     
    97102
    98103        /**
    99         * If the number of records deleted in a batch is equal to the batch size,
    100         * and the number of iterations is less than the maximum number of iterations,
    101         * continue deleting records in batches.
    102         */
     104         * If the number of records deleted in a batch is equal to the batch size,
     105         * and the number of iterations is less than the maximum number of iterations,
     106         * continue deleting records in batches.
     107         */
    103108        do {
     109            // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
    104110            $deletedCount = $wpdb->query($preparedQuery);
    105111
     
    115121        $isDate = preg_match($datePattern, $filterValue) === 1;
    116122
    117         $startDate = date('Y-m-d');
    118         $endDate = date('Y-m-d');
     123        $startDate = gmdate('Y-m-d');
     124        $endDate = gmdate('Y-m-d');
    119125        $dateRange = [];
    120126
     
    125131        $placeHolder = [0, 1, 0, 1, 1, 0, 0, 1];
    126132
     133        // Build the date condition SQL
    127134        $dateCondition = '';
    128135        if ($filterValue === '7days') {
     
    132139        } elseif ($filterValue === 'today') {
    133140            $dateCondition = 'DATE(analytics.created_at) = CURDATE()';
    134         } elseif ($isDate && isset($dateRange[0]) && isset($dateRange[1])) {
     141        } elseif ($isDate && isset($dateRange[0], $dateRange[1])) {
    135142            $startDate = $dateRange[0];
    136143            $endDate = $dateRange[1];
     
    138145            $placeHolder[] = $endDate;
    139146            $dateCondition = 'DATE(analytics.created_at) BETWEEN %s AND %s';
    140         } elseif ($isDate && count($dateRange) !== 2) {
     147        } elseif ($isDate && \count($dateRange) !== 2) {
    141148            $startDate = $dateRange[0];
    142149            $placeHolder[] = $startDate;
     
    146153        }
    147154
     155        // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- Table names from WordPress constants, date condition is built securely above, placeholder count varies by filter
    148156        $sql = $wpdb->prepare(
    149157            "SELECT
     
    158166                        (analytics.channel_id IS NULL AND (analytics.is_clicked = %d OR analytics.is_clicked = %d))
    159167                    AND
    160                         $dateCondition
     168                        {$dateCondition}
    161169                    GROUP BY
    162170                        analytics.widget_id, widgets.name",
    163171            $placeHolder
    164172        );
    165 
     173        // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber
     174
     175        // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Query is prepared above, direct query for analytics reporting
    166176        $widgetAnalyticsData = $wpdb->get_results($sql);
    167177
     
    176186        $filterValue = $request->filter;
    177187        $datePattern = '/\d{4}-\d{2}-\d{2}/';
    178         $isDate = is_array($filterValue) ? preg_match($datePattern, $filterValue[0]) === 1 : false;
    179 
    180         $startDate = date('Y-m-d');
    181         $endDate = date('Y-m-d');
     188        $isDate = \is_array($filterValue) ? preg_match($datePattern, $filterValue[0]) === 1 : false;
     189
     190        $startDate = gmdate('Y-m-d');
     191        $endDate = gmdate('Y-m-d');
    182192
    183193        $placeHolder = [1, 0, 1, 0, $widget_id, 1];
    184194
     195        // Build the date condition SQL
    185196        $dateCondition = '';
    186197        if ($filterValue === '7days') {
     
    190201        } elseif ($filterValue === 'today') {
    191202            $dateCondition = 'DATE(analytics.created_at) = CURDATE()';
    192         } elseif ($isDate && isset($filterValue[0]) && isset($filterValue[1])) {
     203        } elseif ($isDate && isset($filterValue[0], $filterValue[1])) {
    193204            $startDate = $filterValue[0];
    194205            $endDate = $filterValue[1];
     
    196207            $placeHolder[] = $endDate;
    197208            $dateCondition = 'DATE(analytics.created_at) BETWEEN %s AND %s';
    198         } elseif ($isDate && count($filterValue) !== 2) {
     209        } elseif ($isDate && \count($filterValue) !== 2) {
    199210            $startDate = $filterValue[0];
    200211            $placeHolder[] = $startDate;
     
    204215        }
    205216
     217        // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- Table names from WordPress constants, date condition is built securely above, placeholder count varies by filter
    206218        $sql = $wpdb->prepare(
    207219            "SELECT
     
    221233                    analytics.is_clicked = %d
    222234                AND
    223                     $dateCondition
     235                    {$dateCondition}
    224236                GROUP BY
    225237                    c.id",
    226238            $placeHolder
    227239        );
    228 
     240        // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber
     241
     242        // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Query is prepared above, direct query for analytics reporting
    229243        $results = $wpdb->get_results($sql);
    230244
     
    235249    {
    236250        Analytics::delete();
     251
    237252        return Response::success('Analytics removed!');
    238253    }
  • bit-assist/trunk/backend/app/HTTP/Controllers/ApiWidgetController.php

    r3342737 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use AllowDynamicProperties;
     
    5963                $domainExceptWWW = $domain;
    6064            }
    61             $widget->where('domains', 'LIKE', '%' . parse_url($domainExceptWWW)['host'] . '%');
     65            $widget->where('domains', 'LIKE', '%' . wp_parse_url($domainExceptWWW)['host'] . '%');
    6266        } else {
    6367            return;
     
    7882    {
    7983        $widgetChannels = WidgetChannel::where('status', 1)->where('widget_id', $widgetId)->orderBy('sequence')->get(['id', 'channel_name', 'config']);
    80         if (!is_array($widgetChannels) || \count($widgetChannels) < 1) {
    81             return null;
     84        if (!\is_array($widgetChannels) || \count($widgetChannels) < 1) {
     85            return;
    8286        }
    8387
  • bit-assist/trunk/backend/app/HTTP/Controllers/BitAssistAnalyticsController.php

    r3090183 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Model\WidgetChannel;
  • bit-assist/trunk/backend/app/HTTP/Controllers/DownloadController.php

    r3243139 r3464745  
    33namespace BitApps\Assist\HTTP\Controllers;
    44
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
     8
    59use BitApps\Assist\Config;
     10use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
    611use BitApps\Assist\Helpers\FileHandler;
    712
    813final class DownloadController
    914{
    10     public function downloadResponseFile()
     15    public function downloadResponseFile(Request $request)
    1116    {
    12         if (!function_exists('wp_check_filetype_and_ext')) {
    13             require_once ABSPATH . 'wp-admin/includes/file.php';
    14         }
     17        $validated = $request->validate([
     18            'widgetChannelID' => ['required', 'integer'],
     19            'fileID'          => ['required', 'string', 'sanitize:text'],
     20            'fileName'        => ['required', 'string', 'sanitize:text'],
     21            'download'        => ['nullable'],
     22        ]);
    1523
    16         $widgetChannelID = intval(sanitize_text_field($_GET['widgetChannelID']));
    17 
    18         $fileID = sanitize_text_field($_GET['fileID']);
    19 
    20         $fileName = sanitize_text_field($_GET['fileName']);
    21 
    22         $forceDownload = isset($_GET['download']);
     24        $widgetChannelID = $validated['widgetChannelID'];
     25        $fileID = $validated['fileID'];
     26        $fileName = $validated['fileName'];
     27        $forceDownload = isset($validated['download']);
    2328
    2429        if (empty($widgetChannelID) || empty($fileID) || empty($fileName)) {
     
    4449    private function fileDownloadORView($filePath, $fileName, $forceDownload = false)
    4550    {
     51        global $wp_filesystem;
     52        if (empty($wp_filesystem)) {
     53            require_once ABSPATH . 'wp-admin/includes/file.php';
     54            WP_Filesystem();
     55        }
     56
    4657        if ($forceDownload) {
    4758            header('Content-Type: application/force-download');
     
    5465            if ($fileInfo['type'] && $fileInfo['ext']) {
    5566                $content_types = $fileInfo['type'];
    56                 if (in_array($fileInfo['ext'], ['txt', 'php', 'html', 'xhtml', 'json'])) {
     67                if (\in_array($fileInfo['ext'], ['txt', 'php', 'html', 'xhtml', 'json'])) {
    5768                    $content_types = 'text/plain';
    5869                }
    5970            }
    6071            header('Content-Disposition:filename="' . $fileName . '"');
    61             header("Content-Type: $content_types");
     72            header("Content-Type: {$content_types}");
    6273        }
    6374
     
    6980        header('Content-Transfer-Encoding: binary ');
    7081        flush();
    71         readfile($filePath);
    72         die();
     82
     83        // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Raw file content output for download/view, escaping would corrupt binary files.
     84        echo $wp_filesystem->get_contents($filePath);
     85        exit();
    7386    }
    7487
  • bit-assist/trunk/backend/app/HTTP/Controllers/IframeController.php

    r3241612 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
     
    1317            'clientDomain' => ['required', 'string', 'sanitize:text'],
    1418        ]);
    15        
     19
    1620        $urlParts = explode('-protocol-bit-assist-', $validated['clientDomain']);
    1721        $protocol = $urlParts[0] === 'i' ? 'http://' : 'https://';
     
    2630        }
    2731
    28         echo <<<HTML
    29 <!DOCTYPE html>
    30 <html lang="en">
    31     <head>
    32         <meta charset="UTF-8" />
    33         <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    34         <title>Bit Assist Widget</title>
    35         <script crossorigin src="{$assetBase}/assets/index.js?ver={$version}"></script>
    36         <link rel="stylesheet" href="{$assetBase}/assets/index.css?ver={$version}">
    37     </head>
    38     <body>
    39         <div id="widgetWrapper" class="hide">
    40             <div id="contentWrapper" class="hide"></div>
    41             <div id="widgetBubbleRow">
    42                 <div id="widgetBubbleWrapper">
    43                     <button id="widgetBubble"><img alt="Widget Icon" id="widget-img" /></button>
    44                     <span id="credit"><a href="https://www.bitapps.pro/bit-assist" rel="nofollow noreferrer noopener" target="_blank">by Bit Assist</a></span>
    45                 </div>
    46             </div>
    47         </div>
    48     </body>
    49 </html>
    50 HTML;
     32        echo '<!DOCTYPE html>';
     33        echo '<html lang="en">';
     34        echo '<head>';
     35        echo '<meta charset="UTF-8" />';
     36        echo '<meta name="viewport" content="width=device-width, initial-scale=1.0" />';
     37        echo '<title>Bit Assist Widget</title>';
     38        // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript -- It can be outside of WordPress environment, so we can't rely on wp_enqueue_script.
     39        echo '<script crossorigin src="' . esc_url($assetBase . '/assets/index.js?ver=' . $version) . '"></script>';
     40        // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedStylesheet -- It can be outside of WordPress environment, so we can't rely on wp_enqueue_style.
     41        echo '<link rel="stylesheet" href="' . esc_url($assetBase . '/assets/index.css?ver=' . $version) . '">';
     42        echo '</head>';
     43        echo '<body>';
     44        echo '<div id="widgetWrapper" class="hide">';
     45        echo '<div id="contentWrapper" class="hide"></div>';
     46        echo '<div id="widgetBubbleRow">';
     47        echo '<div id="widgetBubbleWrapper">';
     48        echo '<button id="widgetBubble"><img alt="Widget Icon" id="widget-img" /></button>';
     49        echo '<span id="credit"><a href="https://www.bitapps.pro/bit-assist" rel="nofollow noreferrer noopener" target="_blank">by Bit Assist</a></span>';
     50        echo '</div>';
     51        echo '</div>';
     52        echo '</div>';
     53        echo '</body>';
     54        echo '</html>';
    5155
    5256        status_header(200);
  • bit-assist/trunk/backend/app/HTTP/Controllers/ResponseController.php

    r3243139 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
  • bit-assist/trunk/backend/app/HTTP/Controllers/WPPostController.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Deps\BitApps\WPKit\Http\Response;
  • bit-assist/trunk/backend/app/HTTP/Controllers/WidgetChannelController.php

    r3241612 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
     
    183187    {
    184188        $validated['config']['title'] = sanitize_text_field($validated['config']['title']);
     189
    185190        return $validated;
    186191    }
  • bit-assist/trunk/backend/app/HTTP/Controllers/WidgetController.php

    r3241612 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
  • bit-assist/trunk/backend/app/HTTP/Controllers/WooChannelController.php

    r3429564 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use AllowDynamicProperties;
     
    2226        $order_id = sanitize_text_field($request->get('number'));
    2327        $billing_email = sanitize_email($request->get('email'));
    24         $widget_channel_id = intval($request->get('widget_channel_id'));
     28        $widget_channel_id = \intval($request->get('widget_channel_id'));
    2529
    2630        if (!$order_id) {
  • bit-assist/trunk/backend/app/HTTP/Controllers/WpSearchController.php

    r3342879 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Controllers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use AllowDynamicProperties;
     
    2933    private function getPageAndPosts($search, $page, $postTypes)
    3034    {
    31         $paged = max(1, intval($page));
     35        $paged = max(1, \intval($page));
    3236        $search = trim($search);
    3337
     
    7175            ];
    7276        }, array_filter($posts, function ($post) {
    73             return $post && is_object($post);
     77            return $post && \is_object($post);
    7478        }));
    7579    }
  • bit-assist/trunk/backend/app/HTTP/Middleware/AdminCheckerMiddleware.php

    r3241612 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Middleware;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Deps\BitApps\WPKit\Http\Response;
  • bit-assist/trunk/backend/app/HTTP/Middleware/LoggedInCheckerMiddleware.php

    r3407659 r3464745  
    33namespace BitApps\Assist\HTTP\Middleware;
    44
    5 // Prevent direct script access
    6 if (!\defined('ABSPATH')) {
     5if (!defined('ABSPATH')) {
    76    exit;
    87}
  • bit-assist/trunk/backend/app/HTTP/Middleware/NonceCheckerMiddleware.php

    r3195774 r3464745  
    33namespace BitApps\Assist\HTTP\Middleware;
    44
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
     8
     9use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
    510use BitApps\Assist\Deps\BitApps\WPKit\Http\Response;
    6 use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
    711
    812final class NonceCheckerMiddleware
  • bit-assist/trunk/backend/app/HTTP/Requests/WidgetChannelStoreRequest.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Requests;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
  • bit-assist/trunk/backend/app/HTTP/Requests/WidgetChannelUpdateRequest.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Requests;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
  • bit-assist/trunk/backend/app/HTTP/Requests/WidgetStoreRequest.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Requests;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
  • bit-assist/trunk/backend/app/HTTP/Requests/WidgetUpdateRequest.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\HTTP\Requests;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Deps\BitApps\WPKit\Http\Request\Request;
  • bit-assist/trunk/backend/app/Helpers/FileHandler.php

    r3299751 r3464745  
    22
    33namespace BitApps\Assist\Helpers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
     
    1923        $file_uploaded = [];
    2024
    21         if (is_array($fileDetails['name'])) {
     25        if (\is_array($fileDetails['name'])) {
    2226            foreach ($fileDetails['name'] as $key => $fileName) {
    2327                $fileData = $this->saveFile($_upload_dir, $fileDetails['tmp_name'][$key], $fileName);
     
    4549    }
    4650
     51    public function deleteFiles($widgetChannelID, $files)
     52    {
     53        $_upload_dir = Config::get('UPLOAD_DIR') . DIRECTORY_SEPARATOR . $widgetChannelID;
     54        foreach ($files as $name) {
     55            wp_delete_file($_upload_dir . DIRECTORY_SEPARATOR . $name);
     56        }
     57    }
     58
    4759    private function saveFile($_upload_dir, $tmpName, $fileName)
    4860    {
     
    5466        $file_uploaded = ['uniqueName' => $uniqueFileName, 'originalName' => $fileName];
    5567
    56         $move_status = \move_uploaded_file($tmpName, $_upload_dir . DIRECTORY_SEPARATOR . $uniqueFileName);
     68        global $wp_filesystem;
     69        if (empty($wp_filesystem)) {
     70            require_once ABSPATH . 'wp-admin/includes/file.php';
     71            WP_Filesystem();
     72        }
     73
     74        $destination = $_upload_dir . DIRECTORY_SEPARATOR . $uniqueFileName;
     75        $move_status = $wp_filesystem->move($tmpName, $destination, true);
     76
    5777        if (!$move_status) {
    5878            return false;
    5979        }
     80
    6081        return $file_uploaded;
    6182    }
    62 
    63     public function deleteFiles($widgetChannelID, $files)
    64     {
    65         $_upload_dir = Config::get('UPLOAD_DIR') . DIRECTORY_SEPARATOR . $widgetChannelID;
    66         foreach ($files as $name) {
    67             unlink($_upload_dir . DIRECTORY_SEPARATOR . $name);
    68         }
    69     }
    7083}
  • bit-assist/trunk/backend/app/Model/Analytics.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\Model;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
  • bit-assist/trunk/backend/app/Model/Response.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\Model;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
  • bit-assist/trunk/backend/app/Model/Widget.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\Model;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
     
    913{
    1014    protected $prefix = Config::VAR_PREFIX;
    11    
     15
    1216    protected $casts = [
    1317        'styles'           => 'object',
  • bit-assist/trunk/backend/app/Model/WidgetChannel.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\Model;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
  • bit-assist/trunk/backend/app/Plugin.php

    r3407659 r3464745  
    22
    33namespace BitApps\Assist;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59/*
     
    913 */
    1014
    11 use BitApps\Assist\Deps\BitApps\WPKit\Migration\MigrationHelper;
    1215use BitApps\Assist\Deps\BitApps\WPKit\Hooks\Hooks;
    1316use BitApps\Assist\Deps\BitApps\WPKit\Http\RequestType;
     17use BitApps\Assist\Deps\BitApps\WPKit\Migration\MigrationHelper;
    1418use BitApps\Assist\Deps\BitApps\WPKit\Utils\Capabilities;
    1519use BitApps\Assist\Deps\BitApps\WPTelemetry\Telemetry\Telemetry;
     
    6771        /**
    6872         * Add schedule to cleanup analytics if the plugin version is less than or equal to 1.5.3
     73         *
    6974         * @since 1.5.4
    7075         */
  • bit-assist/trunk/backend/app/Providers/HookProvider.php

    r3407659 r3464745  
    22
    33namespace BitApps\Assist\Providers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
  • bit-assist/trunk/backend/app/Providers/InstallerProvider.php

    r3195774 r3464745  
    22
    33namespace BitApps\Assist\Providers;
     4
     5if (!defined('ABSPATH')) {
     6    exit;
     7}
    48
    59use BitApps\Assist\Config;
  • bit-assist/trunk/backend/app/Views/Layout.php

    r3195774 r3464745  
    4141                        $menu['capability'],
    4242                        $menu['slug'],
    43                         is_string($menu['callback']) ? (method_exists($this, $menu['callback']) ? [$this, $menu['callback']] : $menu['callback']) : $menu['callback'],
     43                        \is_string($menu['callback']) ? (method_exists($this, $menu['callback']) ? [$this, $menu['callback']] : $menu['callback']) : $menu['callback'],
    4444                        $menu['icon'],
    4545                        $menu['position']
     
    6868
    6969        // loading google fonts
     70        // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion -- External font resource version managed by Google
    7071        wp_enqueue_style('googleapis-PRECONNECT', 'https://fonts.googleapis.com');
     72        // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion -- External font resource version managed by Google
    7173        wp_enqueue_style('gstatic-PRECONNECT-CROSSORIGIN', 'https://fonts.gstatic.com');
    7274        wp_enqueue_style('font', self::FONT_URL, [], $version);
     
    7577
    7678        if (Config::isDev()) {
     79            // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter, WordPress.WP.EnqueuedResourceParameters.MissingVersion -- Dev mode hot reload script must load in header
    7780            wp_enqueue_script($slug . '-vite-client-helper-MODULE', Config::DEV_URL . '/config/devHotModule.js', [], null);
     81            // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter, WordPress.WP.EnqueuedResourceParameters.MissingVersion -- Dev mode hot reload script must load in header
    7882            wp_enqueue_script($slug . '-vite-client-MODULE', Config::DEV_URL . '/@vite/client', [], null);
     83            // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter, WordPress.WP.EnqueuedResourceParameters.MissingVersion -- Dev mode hot reload script must load in header
    7984            wp_enqueue_script($slug . '-index-MODULE', Config::DEV_URL . '/index.tsx', [], null);
    8085        } else {
     86            // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter -- Main app script must load in header for proper initialization
    8187            wp_enqueue_script($slug . '-index-MODULE', $assetUri . '/index.js', [], $version);
    8288            wp_enqueue_style($slug . '-styles', $assetUri . '/index.css', null, $version);
     
    132138        $rootURL = Config::get('ROOT_URI');
    133139
    134         // phpcs:disable Generic.PHP.ForbiddenFunctions.Found
    135 
    136         echo <<<HTML
    137         <noscript>You need to enable JavaScript to run this app.</noscript>
    138         <div id="bit-apps-root">
    139         <div
    140             style="display: flex;flex-direction: column;justify-content: center;
    141             align-items: center;height: 90vh;font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;">
    142             <img alt="bit-assist-logo" class="bit-logo" width="70" src="{$rootURL}/img/logo.svg">
    143             <h1>Welcome to Bit Assist</h1>
    144             <p></p>
    145         </div>
    146         </div>
    147 HTML;
     140        echo '<noscript>You need to enable JavaScript to run this app.</noscript>';
     141        echo '<div id="bit-apps-root">';
     142        echo '<div style="display: flex;flex-direction: column;justify-content: center;';
     143        echo 'align-items: center;height: 90vh;font-family: \'Segoe UI\', Tahoma, Geneva, Verdana, sans-serif;">';
     144        echo '<img alt="bit-assist-logo" class="bit-logo" width="70" src="' . esc_url($rootURL . '/img/logo.svg') . '">';
     145        echo '<h1>Welcome to Bit Assist</h1>';
     146        echo '<p></p>';
     147        echo '</div>';
     148        echo '</div>';
    148149    }
    149150
     
    212213    public function createConfigVariable()
    213214    {
     215        // phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.DynamicHooknameFound -- Hook name is prefixed via Config::withPrefix()
    214216        $frontendVars = apply_filters(
    215217            Config::withPrefix('localized_script'),
     
    228230            ]
    229231        );
     232        // phpcs:enable WordPress.NamingConventions.PrefixAllGlobals.DynamicHooknameFound
    230233        if (get_locale() !== 'en_US' && file_exists(Config::get('BASEDIR') . '/languages/generatedString.php')) {
    231234            include_once Config::get('BASEDIR') . '/languages/generatedString.php';
  • bit-assist/trunk/backend/bootstrap.php

    r2814120 r3464745  
    11<?php
    22
    3 if (!\defined('ABSPATH')) {
     3if (!defined('ABSPATH')) {
    44    exit;
    55}
  • bit-assist/trunk/backend/db/Migrations/BASTAnalyticsTableMigration.php

    r3195774 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Config;
    48use BitApps\Assist\Deps\BitApps\WPDatabase\Blueprint;
     9use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    510use BitApps\Assist\Deps\BitApps\WPKit\Migration\Migration;
    6 use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    711
    8 if (!\defined('ABSPATH')) {
    9     exit;
    10 }
    11 
     12// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound -- Migration class follows framework naming convention
    1213final class BASTAnalyticsTableMigration extends Migration
    1314{
  • bit-assist/trunk/backend/db/Migrations/BASTPluginOptions.php

    r3195774 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Config;
     
    59use BitApps\Assist\Deps\BitApps\WPKit\Migration\Migration;
    610
    7 if (!\defined('ABSPATH')) {
    8     exit;
    9 }
    10 
     11// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound -- Migration class follows framework naming convention
    1112final class BASTPluginOptions extends Migration
    1213{
  • bit-assist/trunk/backend/db/Migrations/BASTResponsesTableMigration.php

    r3195774 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Config;
    48use BitApps\Assist\Deps\BitApps\WPDatabase\Blueprint;
     9use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    510use BitApps\Assist\Deps\BitApps\WPKit\Migration\Migration;
    6 use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    711
    8 if (!\defined('ABSPATH')) {
    9     exit;
    10 }
    11 
     12// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound -- Migration class follows framework naming convention
    1213final class BASTResponsesTableMigration extends Migration
    1314{
  • bit-assist/trunk/backend/db/Migrations/BASTUpdateCustomCssColumnInWidgetTableMigration.php

    r3195774 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Config;
    48use BitApps\Assist\Deps\BitApps\WPKit\Migration\Migration;
    59
    6 if (!\defined('ABSPATH')) {
    7     exit;
    8 }
    9 
     10// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound -- Migration class follows framework naming convention
    1011final class BASTUpdateCustomCssColumnInWidgetTableMigration extends Migration
    1112{
     
    1819        global $wpdb;
    1920        $table_name = Config::withDBPrefix('widgets');
    20         $sql = "ALTER TABLE $table_name MODIFY COLUMN custom_css LONGTEXT NULL;";
     21        // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Table name from trusted Config class, ALTER TABLE cannot use prepared statements
     22        $sql = "ALTER TABLE {$table_name} MODIFY COLUMN custom_css LONGTEXT NULL;";
     23        // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Table name from trusted Config class, ALTER TABLE cannot use prepared statements, direct DB query required for migration
    2124        $wpdb->query($sql);
    2225    }
     
    3033        global $wpdb;
    3134        $table_name = Config::withDBPrefix('widgets');
    32         $sql = "ALTER TABLE $table_name MODIFY COLUMN custom_css VARCHAR(255) NULL;";
     35        // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Table name from trusted Config class, ALTER TABLE cannot use prepared statements
     36        $sql = "ALTER TABLE {$table_name} MODIFY COLUMN custom_css VARCHAR(255) NULL;";
     37        // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Table name from trusted Config class, ALTER TABLE cannot use prepared statements, direct DB query required for migration
    3338        $wpdb->query($sql);
    3439    }
  • bit-assist/trunk/backend/db/Migrations/BASTUpdateOptions.php

    r3195774 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Config;
    48use BitApps\Assist\Deps\BitApps\WPKit\Migration\Migration;
    59
    6 if (!\defined('ABSPATH')) {
    7     exit;
    8 }
    9 
     10// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound -- Migration class follows framework naming convention
    1011final class BASTUpdateOptions extends Migration
    1112{
     
    1819    public function down()
    1920    {
    20         return;
    2121    }
    2222}
  • bit-assist/trunk/backend/db/Migrations/BASTWidgetChannelsTableMigration.php

    r3195774 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Config;
    48use BitApps\Assist\Deps\BitApps\WPDatabase\Blueprint;
     9use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    510use BitApps\Assist\Deps\BitApps\WPKit\Migration\Migration;
    6 use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    711
    8 if (!\defined('ABSPATH')) {
    9     exit;
    10 }
    11 
     12// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound -- Migration class follows framework naming convention
    1213final class BASTWidgetChannelsTableMigration extends Migration
    1314{
  • bit-assist/trunk/backend/db/Migrations/BASTWidgetsTableMigration.php

    r3195774 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Config;
    48use BitApps\Assist\Deps\BitApps\WPDatabase\Blueprint;
     9use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    510use BitApps\Assist\Deps\BitApps\WPKit\Migration\Migration;
    6 use BitApps\Assist\Deps\BitApps\WPDatabase\Schema;
    711
    8 if (!\defined('ABSPATH')) {
    9     exit;
    10 }
    11 
     12// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedClassFound -- Migration class follows framework naming convention
    1213final class BASTWidgetsTableMigration extends Migration
    1314{
  • bit-assist/trunk/backend/hooks/ajax.php

    r3241612 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Deps\BitApps\WPKit\Http\Router\Route;
     
    812use BitApps\Assist\HTTP\Controllers\WidgetController;
    913use BitApps\Assist\HTTP\Controllers\WPPostController;
    10 
    11 if (!\defined('ABSPATH')) {
    12     exit;
    13 }
    1414
    1515// if (!headers_sent()) {
  • bit-assist/trunk/backend/hooks/api.php

    r3407659 r3464745  
    11<?php
     2
     3if (!defined('ABSPATH')) {
     4    exit;
     5}
    26
    37use BitApps\Assist\Deps\BitApps\WPKit\Http\Router\Route;
     
    59use BitApps\Assist\HTTP\Controllers\ApiWidgetController;
    610use BitApps\Assist\HTTP\Controllers\IframeController;
     11use BitApps\Assist\HTTP\Controllers\ResponseController;
    712use BitApps\Assist\HTTP\Controllers\WooChannelController;
    8 use BitApps\Assist\HTTP\Controllers\ResponseController;
    913use BitApps\Assist\HTTP\Controllers\WpSearchController;
    10 
    11 if (!\defined('ABSPATH')) {
    12     exit;
    13 }
    1414
    1515Route::group(function () {
  • bit-assist/trunk/index.php

    r3429564 r3464745  
    55 * Plugin URI:  https://bitapps.pro/bit-assist
    66 * Description: WhatsApp,Facebook Messenger chat, click to chat Live Chat Widget,Call button & 30+ social chat support button for customer support with sticky chat button
    7  * Version:     1.6.0
     7 * Version:     1.6.1
    88 * Author:      Bit Assist - Click to Chat Widget Live Chat Support Chat Button
    99 * Author URI:  https://bitapps.pro
     
    1414 * License: gpl2+
    1515 */
     16if (!defined('ABSPATH')) {
     17    exit;
     18}
     19
    1620require_once plugin_dir_path(__FILE__) . 'backend/bootstrap.php';
  • bit-assist/trunk/readme.txt

    r3429564 r3464745  
    66Tested up to: 6.9
    77Requires PHP: 7.4
    8 Stable tag: 1.6.0
     8Stable tag: 1.6.1
    99License: GPLv2 or later
    1010
     
    349349
    350350== Changelog ==
     351= v1.6.1 (Feb 19, 2026) =
     352* Fix: WordPress Plugin Checker issues fixed.
     353
    351354= v1.6.0 (Dec 30, 2025) =
    352355* Fix: WooCommerce order details can now only be viewed by the user who placed the order.
  • bit-assist/trunk/vendor/composer/installed.php

    r3429564 r3464745  
    22    'root' => array(
    33        'name' => 'bitapps/assist',
    4         'pretty_version' => '1.6.0',
    5         'version' => '1.6.0.0',
    6         'reference' => '88cb852704f8f67eb6e264dbe8a16b757d0147a9',
     4        'pretty_version' => '1.6.1',
     5        'version' => '1.6.1.0',
     6        'reference' => '0428cad0defb425d7b7e89022c5d9ddd47ce7542',
    77        'type' => 'library',
    88        'install_path' => __DIR__ . '/../../',
     
    1212    'versions' => array(
    1313        'bitapps/assist' => array(
    14             'pretty_version' => '1.6.0',
    15             'version' => '1.6.0.0',
    16             'reference' => '88cb852704f8f67eb6e264dbe8a16b757d0147a9',
     14            'pretty_version' => '1.6.1',
     15            'version' => '1.6.1.0',
     16            'reference' => '0428cad0defb425d7b7e89022c5d9ddd47ce7542',
    1717            'type' => 'library',
    1818            'install_path' => __DIR__ . '/../../',
Note: See TracChangeset for help on using the changeset viewer.