From e6190adb47604362a237928c4ca533536753e1f8 Mon Sep 17 00:00:00 2001 From: Rishad Alam <101513331+RishadAlam@users.noreply.github.com> Date: Sat, 14 Feb 2026 13:32:22 +0600 Subject: [PATCH 01/23] fix: security vulnerabilities and improve error handling - Enhanced Route validation and sanitization to prevent path traversal attacks - Improved email notification system with better error handling - Updated multiple action controllers with security enhancements - Added email notification template for integration failures - Renamed integration images for consistency - Updated deployment workflow configuration - Improved helper functions and smart tags processing --- .github/workflows/deploy.yml | 140 +++++++-------- .../src/components/Flow/New/SelectAction.jsx | 12 +- .../src/resource/img/integ/Zoom Meeting.webp | Bin 4280 -> 0 bytes .../{kit(ConvertKit).webp => convertKit.webp} | Bin ...ttoKit(SureTriggers).webp => ottoKit.webp} | Bin ...sarbacane(Mailify).webp => sarbacane.webp} | Bin ...Hub).webp => zohoMarketingAutomation.webp} | Bin .../Actions/Affiliate/AffiliateController.php | 2 +- includes/Actions/Clickup/RecordApiHelper.php | 5 +- includes/Actions/Fabman/FabmanController.php | 1 - .../Actions/GamiPress/GamiPressController.php | 10 +- .../Actions/GoogleDrive/RecordApiHelper.php | 1 - .../Actions/LifterLms/LifterLmsController.php | 14 +- .../Actions/MailMint/MailMintController.php | 4 +- .../PaidMembershipProController.php | 2 +- .../Actions/Salesforce/RecordApiHelper.php | 2 +- .../WooCommerce/WooCommerceController.php | 16 +- includes/Core/Util/EmailNotification.php | 153 +--------------- includes/Core/Util/Helper.php | 16 +- includes/Core/Util/Route.php | 25 ++- includes/Core/Util/SmartTags.php | 5 +- includes/Core/Util/UnInstallation.php | 13 +- includes/Plugin.php | 11 -- .../FallbackTrigger/TriggerFallback.php | 12 +- .../integration-failure-notification.php | 165 ++++++++++++++++++ 25 files changed, 298 insertions(+), 311 deletions(-) delete mode 100644 frontend-dev/src/resource/img/integ/Zoom Meeting.webp rename frontend-dev/src/resource/img/integ/{kit(ConvertKit).webp => convertKit.webp} (100%) rename frontend-dev/src/resource/img/integ/{ottoKit(SureTriggers).webp => ottoKit.webp} (100%) rename frontend-dev/src/resource/img/integ/{sarbacane(Mailify).webp => sarbacane.webp} (100%) rename frontend-dev/src/resource/img/integ/{zohoMarketingAutomation(ZohoMarketingHub).webp => zohoMarketingAutomation.webp} (100%) create mode 100644 views/emails/integration-failure-notification.php diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c7b5ff44e..efcb396b2 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,107 +1,95 @@ -name: Deploy to WordPress.org Repository +name: WordPress Plugin Check on: push: branches: - - release - release: - types: [released] + - main + pull_request: + branches: + - main + +env: + PLUGIN_SLUG: bit-smtp jobs: - deploy_to_wp_repository: - name: Deploy to WP.org + plugin-check: + name: Plugin Check runs-on: ubuntu-latest - env: - PLUGIN_SLUG: bit-integrations + steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 1 - - name: Install pnpm - uses: pnpm/action-setup@v4 + - name: Setup PHP + uses: shivammathur/setup-php@v2 with: - version: 9 - run_install: false + php-version: "8.1" + coverage: none + tools: composer:v2, wp-cli - name: Setup Node uses: actions/setup-node@v4 with: node-version: 22 - cache: "pnpm" - cache-dependency-path: "frontend-dev/pnpm-lock.yaml" + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + run_install: false - name: Get pnpm store directory id: pnpm-cache shell: bash run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + echo "dir=$(pnpm store path --silent)" >> $GITHUB_OUTPUT - - uses: actions/cache@v3 - name: Setup pnpm cache - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- + - name: Get composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - name: Install frontend dependencies - run: | - cd frontend-dev - pnpm install - - - name: Check for SVN - id: check_svn - run: | - if ! command -v svn &> /dev/null; then - echo "SVN not found, installing..." - sudo apt-get update - sudo apt-get install -y subversion - else - echo "SVN is already installed." - fi - - - name: Setup PHP - id: setup-php - uses: shivammathur/setup-php@v2 + - name: Setup package cache + uses: actions/cache@v4 with: - php-version: "8.x" - tools: composer:v2, wp-cli + path: | + ${{ steps.pnpm-cache.outputs.dir }} + ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-plugin-check-${{ hashFiles('**/pnpm-lock.yaml', '**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-plugin-check- - - name: Determine if this is a release or push - id: set-test-action + - name: Install dependencies run: | - if [[ "${{ github.event_name }}" == "release" ]]; then - echo "TEST_ACTION=false" >> $GITHUB_ENV - else - echo "TEST_ACTION=true" >> $GITHUB_ENV - fi + composer install --prefer-dist --no-progress --no-dev --optimize-autoloader + pnpm install --frozen-lockfile - - name: Build - id: build-plugin + - name: Build plugin run: | - bash .github/build - if [ -d "${{ github.workspace }}/build/${{ env.PLUGIN_SLUG }}" ]; then - echo "free_exists=true" >> "${GITHUB_OUTPUT}" - else - echo "free_exists=false" >> "${GITHUB_OUTPUT}" - fi + pnpm production + bash .github/copy-assets - - name: WordPress Plugin Deploy - if: steps.build-plugin.outputs.free_exists == 'true' - id: deploy - uses: 10up/action-wordpress-plugin-deploy@stable - with: - generate-zip: true - dry-run: ${{ env.TEST_ACTION }} - env: - SVN_USERNAME: ${{ secrets.SVN_USERNAME }} - SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} - BUILD_DIR: "${{ github.workspace }}/build/${{ env.PLUGIN_SLUG }}" - SLUG: ${{ env.PLUGIN_SLUG }} - - name: Upload release asset - if: steps.build-plugin.outputs.free_exists == 'true' - uses: softprops/action-gh-release@v2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: WordPress Plugin Check + uses: wordpress/plugin-check-action@v1 with: - files: ${{ steps.deploy.outputs['zip-path'] }} + build-dir: "./build/${{ env.PLUGIN_SLUG }}" + exclude-directories: | + vendor + node_modules + categories: | + general + security + performance + accessibility + plugin_repo + checks: | + i18n_usage + late_escaping + plugin_header + plugin_readme + file_type + performant_wp_query_params + plugin_updater + enqueued_scripts_size + plugin_review_phpcs + trademarks diff --git a/frontend-dev/src/components/Flow/New/SelectAction.jsx b/frontend-dev/src/components/Flow/New/SelectAction.jsx index 9b1fe80d7..8ef15b37b 100644 --- a/frontend-dev/src/components/Flow/New/SelectAction.jsx +++ b/frontend-dev/src/components/Flow/New/SelectAction.jsx @@ -52,7 +52,7 @@ export default function SelectAction() { { type: 'WooCommerce' }, { type: 'Zoho Bigin' }, { type: 'Zoho Campaigns' }, - { type: 'Zoho Marketing Automation(Zoho Marketing Hub)' }, + { type: 'Zoho Marketing Automation(Zoho Marketing Hub)', logo: 'zohoMarketingAutomation' }, { type: 'Zoho Recruit' }, { type: 'Getgist' }, { type: 'ElasticEmail' }, @@ -105,7 +105,7 @@ export default function SelectAction() { { type: 'CustomApi' }, { type: 'SureCart' }, { type: 'Agiled CRM' }, - { type: 'Kit(ConvertKit)' }, + { type: 'Kit(ConvertKit)', logo: 'convertKit' }, { type: 'BenchMark' }, { type: 'DirectIq' }, { type: 'GiveWp' }, @@ -124,7 +124,7 @@ export default function SelectAction() { { type: 'Propovoice CRM' }, { type: 'Mail Mint' }, { type: 'CopperCRM' }, - { type: 'Sarbacane(Mailify)' }, + { type: 'Sarbacane(Mailify)', logo: 'sarbacane' }, { type: 'Lemlist' }, { type: 'Salesmate' }, { type: 'LionDesk' }, @@ -145,7 +145,7 @@ export default function SelectAction() { { type: 'WPWebhooks' }, { type: 'AdvancedFormIntegration' }, { type: 'PerfexCRM' }, - { type: 'OttoKit (SureTriggers)' }, + { type: 'OttoKit (SureTriggers)', logo: 'ottoKit' }, { type: 'OneHashCRM' }, { type: 'Salesflare' }, { type: 'AcademyLms' }, @@ -252,8 +252,8 @@ export default function SelectAction() { )} - {/* */} - + +
{inte.type}
))} diff --git a/frontend-dev/src/resource/img/integ/Zoom Meeting.webp b/frontend-dev/src/resource/img/integ/Zoom Meeting.webp deleted file mode 100644 index 73d00eaaa8c4c7c976a8ffeb8ba96c8be780a841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4280 zcmV;p5J&G)Nk&Gn5C8yIMM6+kP&iDZ5C8x#E5S+-)du4>k|K3g{#gSJd%h!L0`g2q z;JP?o!sMTO4>oM+RGTz*aTCoETiiUh-#F(MFykD<@pBnhsW&#S%ZY5e?q1OTggX3g zxJkIh1E~O!G6*0L07tH0IT2I~5nYIs0yrykLnZfxlC$k`Bj@Vu%u5|XN6At8CIL9f zsQ&+tTy@Kk0m1RgVJ4HzB%&Y}n91PE;KorSNscto7fM0cr{9b71!JK&h$Kl;J7QuEpS;Q*GBQjybAEE*f7EXbn_jgO)Q0gpN{W7I*_C!<&eb+kqkuVNRpV9hCA#V`nI%2aGt zzQ&S(zBWx`t)P5mmkAhi)R+b=%yUqS1_QzPUTw9*FrX^3YKLJ!AuGWO1A+>eNK7+b ztAI)uV+K(hMX#938C6A9E~qLj6;VZ2#BGp}Ua=K8uN7PgV5%pTs#SnxOu^7i*DAsS zp#z_^3bA~FocIsvYZYYq;zMrCX-w0R(w6(EL6Y5bl2=QGiK!4W;KVRaa4C3c%jL`; z+jPY!Hbzo0`B z*MWV|A)R3ibg{7NR9$;@Ksj?9)&L$-x%CvVi#0cHuL8XL%1ffZ9F|pXoTLLp;3IE< z-1C^0PnMhTP7g3*w|TJMWPWVpJMZMSBjUL}Sy3At?1dimH>>V};UA}gjq^;S(xhWdhvYrBt75w>^zL3cR8l|q zn*FtVd~|IJ7;5YMwh{Wld#)dyNyngzYy?vr_Mx@JEMSf#LCbz{#m*yJSZ}6)bsfmqBq)5xs_z?cD@vi7~6Vkqh>lU%)Eg)d(o= zwYfWKt_n9FTxB&Xi2L36(HeOKsB2%QLhydK?}QWA@|bl#eeQ>9)+HSCbHMaL`&5l> zU-2#HvYUM`CDD7T)ZB@Zv;ryV5x4ozMbd@i966rfV*s^hI0nCY_0mJ|&+(r7(5+Jy z?&CEk8CTBEa{hDS$l^|}7WZ*LwqPIL2tH1j!vbB$Ol5*JTse>P%rTWNxuC53F6l;( z-c5K0!K&ngqKc%^%*+yar~(8f=}4A;uu)Y3gJPsdJ?(%curlu^u{6~`V!fTq*_pn?*C z#G=?KDy2G?doeqqG?Q{&txv5ik8GJ6^jH7W3X>Hsh`+xD#rKWjTT(s2@#-u0mDbMW zNi2Hq9<@jY-@v%0eaZAB30Oeib<+JM+5!+Y#%3(2EhsYa? z)oh*Ne==Ck))h4DXySba2V5&D=sfcf`2D72BH;TC$wjzAvJo!ud(z78b=RaP?HFJ+ zdh477e0iK_R>CDx!_p}5s$^ofbq?sSA~4*R5O68zh2d6TKo6H$W0-}&wmo@nO$c_( zgX#XfK-cOG8)~HQIAJ#Fc$(mXhW+B70b^pZF-!>9wy@rP9o!li@9Iyrgu#N!*@rgP zxYb>Oa$>(>OPm>|I|{zix{I4$-ym#T7G{P%8^k;Tz^66J?M}En<$4>Ag|{OY!S`9 zB5hF7dk$3*)i{~5%8Ko<9x!t38tktG?qoj^Ne*Q^~kH@z@ z6(I7_WX=Wpu?yFyD4SHMYnCWMX5{<`Qu$R=I3RL(z&|EtHv#kvQPb`gMAweh=>lb6 z>!ulKSyby}w`z{yMJi>z8wM&C9dFSVryK%SQ!EA|7CpCta17r<&bdiNGkh>tG%R*} z4mUR)TKF%i>{__tiZA|Hs?CVsE%?72b{^(*Rq!T%!^pH2=!;>syjA)vmV8aK)A)7i zhGAXr2K1mukZJxd^s2s&CoFw=o!!R|L3Bea+Rp(UI(dY40i|lbQgokT5#-_8)3d9O z_r9+h|JJev5|+g7_f_NFhHZ{Mar{k?J|@|KwqZfzUw=T`i((_z#OB!RZFV%@j#ojm z#tqqD%&c#U@qZGy9&fYb`Fva6#`H@@CM3p)eZDQXvse7v4Zdftb$YSzIcsG-rZ#&O zfAXI`9!R!hujWZqkSw5cr)``o<&he*Bp0lhVx92)5Ax?R--W$+K!p$I-tJNGdd(8M-(nY=VDd>f9 z8axt#Hu1q|!8<7iuPoEouKL$fME*xOnRNFwP#3mcXp$ztIgV@9?u%o#$ZP=d9@-OK zBkD#@uL62GDbjcZ1qN$30b3v#=T1O+sLz-^3^s8+>3 z0eH#-LAX}<65}LCcBwuqUG1E7xW;!V_59VC)AQj4*bO z-vwMO7$p?~BN1culLe1Wy9vW*e37W>G`S3dvFY}}6v?=gBPb2xIE5Gz(M>c~txxx) z2yOjPiTYnKbp4>%eJmydJAoW=07W0%bRZQ@tBEI?xv>irbgHzH)UnA=3YkEQ65$$5 zLoqmBmQL2yc{6Jx5mo4iw@ z+;gK?G7a_TL&!1D(TtkHt`z4QM}qD$|E4q+K4#viiuoT3{_YqB6Bse@#P?1n(+omG zpa6P8P=vWX4!xW2A=fHN{$WuhpcE6Ts07RI8k!HISFHKb?yVT?^a&d zmsKLt7iEpSg!7vDYJKrqhY={JU^^&+B#5m`1b zV=lpTW882U7TUrHY@&Mc@gXRMAy_T(IZm5hl_=*1 z{Chg{^-T^&5QLrXWjnkpXfndFviIp9Lg>7}m!=KIMJh$DF3=Z>EgYhr^g+aq;6qW^ zYz`C@C`aJ<6P$Zt8Zdp|whMs~lSxPY1n%X~3VP-h8vU!sA!#4r%zooD`-nkte*GY= z+d0-{-N5M>1DqWmGEE1XZiF!q`x|E8{%Q|a#1Q&iLeppJ`Z2JO4y=Loz!6plh593* zcXRvz-qky1W#rj07093B?aG2;D!fhybDx&@YS#oh;Bkybfw` zqUNAOnoEIrE=7+KiFhUSW34W*C4M2Z>uj?3SC;Qg)w_l`s7)-mGBpqqCZBF1ywqJz zqkQj8L*wJR-u0#TRT}3W!;7@Tao@vZ$RlF4De-W=4f6|9oQ2RwV!v@7T1b12I8UGP a_{LkFShITxV}?AQG@tG&wyF8}Ja+(}`W^%T diff --git a/frontend-dev/src/resource/img/integ/kit(ConvertKit).webp b/frontend-dev/src/resource/img/integ/convertKit.webp similarity index 100% rename from frontend-dev/src/resource/img/integ/kit(ConvertKit).webp rename to frontend-dev/src/resource/img/integ/convertKit.webp diff --git a/frontend-dev/src/resource/img/integ/ottoKit(SureTriggers).webp b/frontend-dev/src/resource/img/integ/ottoKit.webp similarity index 100% rename from frontend-dev/src/resource/img/integ/ottoKit(SureTriggers).webp rename to frontend-dev/src/resource/img/integ/ottoKit.webp diff --git a/frontend-dev/src/resource/img/integ/sarbacane(Mailify).webp b/frontend-dev/src/resource/img/integ/sarbacane.webp similarity index 100% rename from frontend-dev/src/resource/img/integ/sarbacane(Mailify).webp rename to frontend-dev/src/resource/img/integ/sarbacane.webp diff --git a/frontend-dev/src/resource/img/integ/zohoMarketingAutomation(ZohoMarketingHub).webp b/frontend-dev/src/resource/img/integ/zohoMarketingAutomation.webp similarity index 100% rename from frontend-dev/src/resource/img/integ/zohoMarketingAutomation(ZohoMarketingHub).webp rename to frontend-dev/src/resource/img/integ/zohoMarketingAutomation.webp diff --git a/includes/Actions/Affiliate/AffiliateController.php b/includes/Actions/Affiliate/AffiliateController.php index 022514fbb..fdd6b2e29 100644 --- a/includes/Actions/Affiliate/AffiliateController.php +++ b/includes/Actions/Affiliate/AffiliateController.php @@ -44,7 +44,7 @@ public static function getAllAffiliate() global $wpdb; $affiliatesIds = $wpdb->get_results( - $wpdb->prepare('SELECT affiliate_Id FROM %1s', $wpdb->prefix . 'affiliate_wp_affiliates') + "SELECT affiliate_Id FROM {$wpdb->prefix}affiliate_wp_affiliates" ); foreach ($affiliatesIds as $val) { diff --git a/includes/Actions/Clickup/RecordApiHelper.php b/includes/Actions/Clickup/RecordApiHelper.php index 45e5f8a43..0c424dd57 100644 --- a/includes/Actions/Clickup/RecordApiHelper.php +++ b/includes/Actions/Clickup/RecordApiHelper.php @@ -6,9 +6,10 @@ namespace BitCode\FI\Actions\Clickup; -use BitCode\FI\Log\LogHandler; use BitCode\FI\Core\Util\Common; use BitCode\FI\Core\Util\HttpHelper; +use BitCode\FI\Log\LogHandler; +use CURLFile; /** * Provide functionality for Record insert, upsert @@ -121,7 +122,7 @@ private function uploadFile($files, $taskId) $file = Common::filePath($file); $result = HttpHelper::post( $this->apiUrl . "task/{$taskId}/attachment", - ['attachment' => curl_file_create($file)], + ['attachment' => new CURLFile($file)], [ 'Authorization' => $this->integrationDetails->api_key, 'Content-Type' => 'multipart/form-data', diff --git a/includes/Actions/Fabman/FabmanController.php b/includes/Actions/Fabman/FabmanController.php index 81b29a84f..10c253a11 100644 --- a/includes/Actions/Fabman/FabmanController.php +++ b/includes/Actions/Fabman/FabmanController.php @@ -75,7 +75,6 @@ public static function execute($integrationData, $fieldValues) $integId = $integrationData->id; $memberId = $integrationDetails->selectedMember ?? null; $lockVersion = $integrationDetails->selectedLockVersion ?? null; - error_log('lockVersion: ' . $lockVersion); $needsMemberLookup = \in_array($actionName, ['update_member', 'delete_member']) && ($actionName === 'delete_member' || empty($memberId)); diff --git a/includes/Actions/GamiPress/GamiPressController.php b/includes/Actions/GamiPress/GamiPressController.php index ab4c25daa..f50361b57 100644 --- a/includes/Actions/GamiPress/GamiPressController.php +++ b/includes/Actions/GamiPress/GamiPressController.php @@ -68,7 +68,7 @@ public static function fetchAllRankType() global $wpdb; return $wpdb->get_results( - $wpdb->prepare("SELECT ID, post_name, post_title, post_type FROM %1s where post_type like 'rank-type' AND post_status = 'publish'", $wpdb->posts) + "SELECT ID, post_name, post_title, post_type FROM {$wpdb->posts} where post_type = 'rank-type' AND post_status = 'publish'" ); } @@ -78,7 +78,7 @@ public static function fetchAllRankBYType($query_params) global $wpdb; $ranks = $wpdb->get_results( - $wpdb->prepare("SELECT ID, post_name, post_title, post_type FROM %1s where post_type like %s AND post_status = 'publish'", $wpdb->posts, $selectRankType) + $wpdb->prepare("SELECT ID, post_name, post_title, post_type FROM {$wpdb->posts} where post_type like %s AND post_status = 'publish'", $selectRankType) ); wp_send_json_success($ranks); @@ -89,7 +89,7 @@ public static function fetchAllAchievementType() global $wpdb; return $wpdb->get_results( - $wpdb->prepare("SELECT ID, post_name, post_title, post_type FROM %1s WHERE post_type LIKE 'achievement-type' AND post_status = 'publish' ORDER BY post_title ASC", $wpdb->posts) + "SELECT ID, post_name, post_title, post_type FROM {$wpdb->posts} WHERE post_type = 'achievement-type' AND post_status = 'publish' ORDER BY post_title ASC" ); } @@ -99,7 +99,7 @@ public static function fetchAllAchievementBYType($query_params) global $wpdb; $awards = $wpdb->get_results( - $wpdb->prepare("SELECT ID, post_name, post_title, post_type FROM %1s where post_type like %s AND post_status = 'publish'", $wpdb->posts, $selectAchievementType) + $wpdb->prepare("SELECT ID, post_name, post_title, post_type FROM {$wpdb->posts} where post_type like %s AND post_status = 'publish'", $selectAchievementType) ); array_unshift($awards, ['ID' => 'Any', 'post_name' => 'any_achievement', 'post_title' => 'Any Achievement']); @@ -111,7 +111,7 @@ public static function fetchAllPointType() { global $wpdb; $points = $wpdb->get_results( - $wpdb->prepare("SELECT ID, post_name, post_title, post_type FROM %1s WHERE post_type LIKE 'points-type' AND post_status = 'publish' ORDER BY post_title ASC", $wpdb->posts) + "SELECT ID, post_name, post_title, post_type FROM {$wpdb->posts} WHERE post_type = 'points-type' AND post_status = 'publish' ORDER BY post_title ASC" ); wp_send_json_success($points); } diff --git a/includes/Actions/GoogleDrive/RecordApiHelper.php b/includes/Actions/GoogleDrive/RecordApiHelper.php index cb52f65a4..c53c39291 100644 --- a/includes/Actions/GoogleDrive/RecordApiHelper.php +++ b/includes/Actions/GoogleDrive/RecordApiHelper.php @@ -47,7 +47,6 @@ public function handleAllFiles($folderWithFile, $actions, $folderKey = null) if (\is_array($file)) { $this->handleAllFiles($file, $actions, $folder); } else { - error_log(print_r(['action' => $actions], true)); $response = $this->uploadFile($folder, $file); $this->storeInState($response); $this->deleteFile($file, $actions); diff --git a/includes/Actions/LifterLms/LifterLmsController.php b/includes/Actions/LifterLms/LifterLmsController.php index 9e425d5cd..604cb2c96 100644 --- a/includes/Actions/LifterLms/LifterLmsController.php +++ b/includes/Actions/LifterLms/LifterLmsController.php @@ -73,12 +73,7 @@ public static function getAllLifterLmsCourse() global $wpdb; $allCourse = $wpdb->get_results( - $wpdb->prepare( - "SELECT ID, post_title FROM %1s WHERE %2s = 'publish' AND %3s = 'course' ORDER BY post_title", - $wpdb->posts, - $wpdb->posts . '.post_status', - $wpdb->posts . '.post_type' - ) + "SELECT ID, post_title FROM {$wpdb->posts} WHERE {$wpdb->posts}.post_status = 'publish' AND {$wpdb->posts}.post_type = 'course' ORDER BY post_title" ); return $allCourse; @@ -89,12 +84,7 @@ public static function getAllLifterLmsMembership() global $wpdb; $allMembership = $wpdb->get_results( - $wpdb->prepare( - "SELECT ID, post_title FROM %1s WHERE %2s = 'publish' AND %3s = 'llms_membership' ORDER BY post_title", - $wpdb->posts, - $wpdb->posts . '.post_status', - $wpdb->posts . '.post_type' - ) + "SELECT ID, post_title FROM {$wpdb->posts} WHERE {$wpdb->posts}.post_status = 'publish' AND {$wpdb->posts}.post_type = 'llms_membership' ORDER BY post_title" ); return $allMembership; diff --git a/includes/Actions/MailMint/MailMintController.php b/includes/Actions/MailMint/MailMintController.php index 841d11bda..3fbf8ae43 100644 --- a/includes/Actions/MailMint/MailMintController.php +++ b/includes/Actions/MailMint/MailMintController.php @@ -2,10 +2,10 @@ namespace BitCode\FI\Actions\MailMint; -use WP_Error; use Mint\MRM\Constants; use Mint\MRM\DataBase\Models\ContactGroupModel; use Mint\MRM\DataBase\Tables\CustomFieldSchema; +use WP_Error; class MailMintController { @@ -31,7 +31,7 @@ public static function allCustomFields() $allFields = []; $fields_table = $wpdb->prefix . CustomFieldSchema::$table_name; $primaryFields = get_option('mint_contact_primary_fields', Constants::$primary_contact_fields); - $customFields = $wpdb->get_results($wpdb->prepare('SELECT title, slug, type, group_id FROM %s ', $fields_table), ARRAY_A); + $customFields = $wpdb->get_results("SELECT title, slug, type, group_id FROM `{$fields_table}`", ARRAY_A); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Querying third-party plugin table if (!empty($customFields)) { $primaryFields['other'] = array_merge($primaryFields['other'], $customFields); diff --git a/includes/Actions/PaidMembershipPro/PaidMembershipProController.php b/includes/Actions/PaidMembershipPro/PaidMembershipProController.php index 0572100da..8b742d285 100644 --- a/includes/Actions/PaidMembershipPro/PaidMembershipProController.php +++ b/includes/Actions/PaidMembershipPro/PaidMembershipProController.php @@ -28,7 +28,7 @@ public static function getAllPaidMembershipProLevel() global $wpdb; $levels = $wpdb->get_results( - $wpdb->prepare('SELECT * FROM %1s ORDER BY id ASC', $wpdb->pmpro_membership_levels) + "SELECT * FROM {$wpdb->pmpro_membership_levels} ORDER BY id ASC" ); $allLevels = []; diff --git a/includes/Actions/Salesforce/RecordApiHelper.php b/includes/Actions/Salesforce/RecordApiHelper.php index 2f55aac9c..105c31741 100644 --- a/includes/Actions/Salesforce/RecordApiHelper.php +++ b/includes/Actions/Salesforce/RecordApiHelper.php @@ -401,7 +401,7 @@ public static function convertToSalesforceFormat($input) $yy = \intval(substr($clean, -2)); // Sliding window: interpret two-digit year as closest to current year within 50 years - $currentYear = \intval(date('Y')); + $currentYear = \intval(gmdate('Y')); $century = \intval($currentYear / 100) * 100; $fullYear = $century + $yy; $window = 50; diff --git a/includes/Actions/WooCommerce/WooCommerceController.php b/includes/Actions/WooCommerce/WooCommerceController.php index 3c369b0e6..43c2cab09 100644 --- a/includes/Actions/WooCommerce/WooCommerceController.php +++ b/includes/Actions/WooCommerce/WooCommerceController.php @@ -274,22 +274,16 @@ public static function allSubscriptionsProducts() { global $wpdb; $allSubscriptions = $wpdb->get_results( - $wpdb->prepare( - "SELECT posts.ID, posts.post_title FROM %1s as posts - LEFT JOIN %2s as rel ON (posts.ID = rel.object_id) - WHERE rel.term_taxonomy_id IN (SELECT term_id FROM %3s WHERE slug IN ('subscription','variable-subscription')) + "SELECT posts.ID, posts.post_title FROM {$wpdb->posts} as posts + LEFT JOIN {$wpdb->term_relationships} as rel ON (posts.ID = rel.object_id) + WHERE rel.term_taxonomy_id IN (SELECT term_id FROM {$wpdb->terms} WHERE slug IN ('subscription','variable-subscription')) AND posts.post_type = 'product' AND posts.post_status = 'publish' UNION ALL - SELECT ID, post_title FROM %4s + SELECT ID, post_title FROM {$wpdb->posts} WHERE post_type = 'shop_subscription' AND post_status = 'publish' - ORDER BY post_title", - $wpdb->posts, - $wpdb->term_relationships, - $wpdb->terms, - $wpdb->posts - ) + ORDER BY post_title" ); $subscriptions[] = [ diff --git a/includes/Core/Util/EmailNotification.php b/includes/Core/Util/EmailNotification.php index eee73f5e3..6994aeaf0 100644 --- a/includes/Core/Util/EmailNotification.php +++ b/includes/Core/Util/EmailNotification.php @@ -57,156 +57,17 @@ public static function sendFailureNotification($flowId, $actionName, $triggerNam */ private static function buildEmailMessage($flowId, $actionName, $triggerName, $recordType, $errorMessage, $siteName) { + // Prepare data for template $adminUrl = admin_url('admin.php?page=bit-integrations#/flow/action/edit/' . $flowId); $logUrl = admin_url('admin.php?page=bit-integrations#/flow/action/log/' . $flowId . '/' . $actionName); $timestamp = current_time('mysql'); - $title = esc_html__('Integration Failure Alert', 'bit-integrations'); - $greeting = \sprintf( - esc_html__('Hello, an integration on your site %s has failed to execute.', 'bit-integrations'), - '' . esc_html($siteName) . '' - ); - $detailsTitle = esc_html__('Failure Details', 'bit-integrations'); - $flowLabel = esc_html__('Integration ID:', 'bit-integrations'); - $actionNameLabel = esc_html__('Action Name:', 'bit-integrations'); - $triggerNameLabel = esc_html__('Trigger Name:', 'bit-integrations'); - $recordTypeLabel = esc_html__('Record Type:', 'bit-integrations'); - $timeLabel = esc_html__('Time:', 'bit-integrations'); - $errorLabel = esc_html__('Error Message:', 'bit-integrations'); - $resolveText = esc_html__('To resolve this issue, please check the integration settings and logs:', 'bit-integrations'); - $viewIntegration = esc_html__('View Integration', 'bit-integrations'); - $viewLogs = esc_html__('View Logs', 'bit-integrations'); - $footerText = \sprintf( - esc_html__('You are receiving this email because failure notifications are enabled in %s. You can disable these notifications in the plugin settings.', 'bit-integrations'), - 'Bit Integrations' - ); + // Load email template + $templatePath = \dirname(BTCBI_PLUGIN_BASEDIR) . '/views/emails/integration-failure-notification.php'; + + ob_start(); + include $templatePath; - // Modern email template with improved structure and design - return << - - - - - {$title} - - - - - - -
- - - - - - - - - - - - - - - -
-

- ⚠️ {$title} -

-
-

- {$greeting} -

- - -
-

- {$detailsTitle} -

- - - - - - - - - - - - - - - - - - - - - - -
- {$flowLabel} - - #{$flowId} -
- {$actionNameLabel} - - {$actionName} -
- {$triggerNameLabel} - - {$triggerName} -
- {$recordTypeLabel} - - {$recordType} -
- {$timeLabel} - - {$timestamp} -
- -
-

- {$errorLabel} -

-
- {$errorMessage} -
-
-
- - -
-

- {$resolveText} -

- - - - - -
- - {$viewIntegration} - - - - {$viewLogs} - -
-
-
-

- {$footerText} -

-
-
- - -HTML; + return ob_get_clean(); } } diff --git a/includes/Core/Util/Helper.php b/includes/Core/Util/Helper.php index 780214e55..24eafa159 100644 --- a/includes/Core/Util/Helper.php +++ b/includes/Core/Util/Helper.php @@ -187,13 +187,6 @@ public static function multiFileMoveWpMedia($files, $postId) return $attachMentId; } - public static function dd($data) - { - echo '
';
-        var_dump($data); // or var_dump($data);
-        echo '
'; - } - public static function isProActivate() { return \function_exists('btcbi_pro_activate_plugin'); @@ -518,16 +511,17 @@ public static function jsonEncodeDecode($data) public static function getPostIdFromReferer($referer) { - if ($referer === null) { - $referer = $_SERVER['HTTP_REFERER'] ?? null; + if ($referer === null && isset($_SERVER['HTTP_REFERER'])) { + $referer = sanitize_text_field(wp_unslash($_SERVER['HTTP_REFERER'])); } if (empty($referer)) { return; } - $referer = wp_unslash($referer); - $referer = sanitize_text_field($referer); + if (!\is_string($referer)) { + return; + } return url_to_postid($referer); } diff --git a/includes/Core/Util/Route.php b/includes/Core/Util/Route.php index c3639d0a3..df9d4c98b 100644 --- a/includes/Core/Util/Route.php +++ b/includes/Core/Util/Route.php @@ -26,10 +26,7 @@ public static function post($hook, $invokeable) public static function request($method, $hook, $invokeable) { - $action = $_REQUEST['action'] ?? $_POST['action'] ?? $_GET['action'] ?? null; - $action = sanitize_text_field( - wp_unslash($action) - ); + $action = static::getActionFromRequest(); if ( ( @@ -68,10 +65,7 @@ public static function request($method, $hook, $invokeable) public static function action() { - $action = $_REQUEST['action'] ?? $_POST['action'] ?? $_GET['action'] ?? null; - $action = sanitize_text_field( - wp_unslash($action) - ); + $action = static::getActionFromRequest(); $sanitizedMethod = isset($_SERVER['REQUEST_METHOD']) ? sanitize_text_field(wp_unslash($_SERVER['REQUEST_METHOD'])) @@ -148,4 +142,19 @@ public static function ignore_token() return new static(); } + + private static function getActionFromRequest() + { + if (isset($_REQUEST['action'])) { + return sanitize_text_field(wp_unslash($_REQUEST['action'])); + } + + if (isset($_POST['action'])) { + return sanitize_text_field(wp_unslash($_POST['action'])); + } + + if (isset($_GET['action'])) { + return sanitize_text_field(wp_unslash($_GET['action'])); + } + } } diff --git a/includes/Core/Util/SmartTags.php b/includes/Core/Util/SmartTags.php index 7d0f84874..4d0094550 100644 --- a/includes/Core/Util/SmartTags.php +++ b/includes/Core/Util/SmartTags.php @@ -12,10 +12,11 @@ final class SmartTags public static function getPostUserData($isReferer) { $post = []; - $postId = $isReferer ? Helper::getPostIdFromReferer($_SERVER['HTTP_REFERER']) : null; + $postId = $isReferer ? Helper::getPostIdFromReferer(null) : null; if (!$isReferer && empty($postId) && isset($_SERVER['REQUEST_URI'])) { - $postId = Helper::getPostIdFromReferer($_SERVER['REQUEST_URI']); + $requestUri = sanitize_text_field(wp_unslash($_SERVER['REQUEST_URI'])); + $postId = Helper::getPostIdFromReferer($requestUri); } if ($postId) { diff --git a/includes/Core/Util/UnInstallation.php b/includes/Core/Util/UnInstallation.php index d394ec846..c92797a21 100644 --- a/includes/Core/Util/UnInstallation.php +++ b/includes/Core/Util/UnInstallation.php @@ -39,10 +39,7 @@ public function uninstall() ]; foreach ($tableArray as $tablename) { $wpdb->query( - $wpdb->prepare( - 'DROP TABLE IF EXISTS %1s', - $tablename - ) + "DROP TABLE IF EXISTS `{$tablename}`" // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange ); } @@ -52,17 +49,15 @@ public function uninstall() foreach ($columns as $column) { $wpdb->query( $wpdb->prepare( - 'DELETE FROM %1s WHERE option_name= %2s', - "{$wpdb->prefix}options", - $column, + "DELETE FROM `{$wpdb->prefix}options` WHERE option_name = %s", + $column ) ); } $wpdb->query( $wpdb->prepare( - 'DELETE FROM %1s WHERE `option_name` LIKE %2s', - "{$wpdb->prefix}options", + "DELETE FROM `{$wpdb->prefix}options` WHERE `option_name` LIKE %s", '%btcbi_webhook_%' ) ); diff --git a/includes/Plugin.php b/includes/Plugin.php index fc78c1398..3260b5f6d 100644 --- a/includes/Plugin.php +++ b/includes/Plugin.php @@ -51,7 +51,6 @@ public function initialize() public function init_plugin() { Hooks::add('init', [$this, 'init_classes'], 8); - Hooks::add('init', [$this, 'localization_setup']); Hooks::add('btcbi_delete_integ_log', [$this, 'integrationlogDelete'], PHP_INT_MAX); Hooks::filter('plugin_action_links_' . plugin_basename(BTCBI_PLUGIN_MAIN_FILE), [$this, 'plugin_action_links']); Hooks::filter('cron_schedules', [$this, 'every_week_time_cron']); @@ -106,16 +105,6 @@ public function init_classes() } } - /** - * Initially load the plugin text domain - * - * @return void - */ - public function localization_setup() - { - load_plugin_textdomain('bit-integrations', false, basename(BTCBI_PLUGIN_BASEDIR) . '/languages'); - } - /** * Plugin action links * diff --git a/includes/Triggers/FallbackTrigger/TriggerFallback.php b/includes/Triggers/FallbackTrigger/TriggerFallback.php index 9014b1a90..11be8e8ec 100644 --- a/includes/Triggers/FallbackTrigger/TriggerFallback.php +++ b/includes/Triggers/FallbackTrigger/TriggerFallback.php @@ -44,7 +44,7 @@ public static function handleFormidableSubmit($conf_method, $form, $form_option, } $form_data = self::getFormidableFieldsValues($form, $entry_id); - $post_id = Helper::getPostIdFromReferer($_SERVER['HTTP_REFERER']); + $post_id = Helper::getPostIdFromReferer(null); if (!empty($form->id)) { if (isset($post_id)) { @@ -1639,7 +1639,7 @@ public static function getBuddyBossProfileField() global $wpdb; $table_name = $wpdb->prefix . 'bp_xprofile_fields'; - $query = $wpdb->prepare('SELECT id, type, name FROM %1s', $table_name); + $query = "SELECT id, type, name FROM " . esc_sql($table_name); return $wpdb->get_results($query); } @@ -2252,7 +2252,7 @@ public static function handleFormcraftSubmit($template, $meta, $content, $integr public static function handleForminatorSubmit($entry, $form_id, $form_data) { - $post_id = Helper::getPostIdFromReferer($_SERVER['HTTP_REFERER']); + $post_id = Helper::getPostIdFromReferer(null); if (!empty($form_id) && $flows = Flow::exists('Forminator', $form_id)) { $data = []; @@ -2741,7 +2741,7 @@ public static function happySaveImage($base64_img, $title) $upload_dir = $upload['basedir']; $upload_dir = $upload_dir . '/bihappy'; if (!is_dir($upload_dir)) { - mkdir($upload_dir, 0700); + wp_mkdir_p($upload_dir); } $upload_path = $upload_dir; @@ -2777,7 +2777,7 @@ public static function happyGetPath($val) public static function handleHappySubmit($submission, $form, $a) { - $post_id = Helper::getPostIdFromReferer($_SERVER['HTTP_REFERER']); + $post_id = Helper::getPostIdFromReferer(null); $form_id = $form['ID']; if (!empty($form_id) && $flows = Flow::exists('Happy', $form_id)) { @@ -4130,10 +4130,12 @@ public static function handlePiotnetAddonFormSubmit($form_submission) // PiotnetForms all functions public static function handlePiotnetSubmit($fields) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Third-party form submission if (empty($_REQUEST['post_id'])) { return; } + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Third-party form submission $post_id = sanitize_text_field( wp_unslash($_REQUEST['post_id']) ); diff --git a/views/emails/integration-failure-notification.php b/views/emails/integration-failure-notification.php new file mode 100644 index 000000000..196f1028f --- /dev/null +++ b/views/emails/integration-failure-notification.php @@ -0,0 +1,165 @@ +' . esc_html($siteName) . '' +); +$details_title = esc_html__('Failure Details', 'bit-integrations'); +$flow_label = esc_html__('Integration ID:', 'bit-integrations'); +$action_name_label = esc_html__('Action Name:', 'bit-integrations'); +$trigger_name_label = esc_html__('Trigger Name:', 'bit-integrations'); +$record_type_label = esc_html__('Record Type:', 'bit-integrations'); +$time_label = esc_html__('Time:', 'bit-integrations'); +$error_label = esc_html__('Error Message:', 'bit-integrations'); +$resolve_text = esc_html__('To resolve this issue, please check the integration settings and logs:', 'bit-integrations'); +$view_integration = esc_html__('View Integration', 'bit-integrations'); +$view_logs = esc_html__('View Logs', 'bit-integrations'); +$footer_text = sprintf( + esc_html__('You are receiving this email because failure notifications are enabled in %s. You can disable these notifications in the plugin settings.', 'bit-integrations'), + 'Bit Integrations' +); +?> + + + + + + <?php echo esc_html($title); ?> + + + + + + +
+ + + + + + + + + + + + + + + +
+

+ ⚠️ +

+
+

+ +

+ + +
+

+ +

+ + + + + + + + + + + + + + + + + + + + + + +
+ + + # +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+

+ +

+
+ +
+
+
+ + +
+

+ +

+ + + + + +
+ + + + + + + +
+
+
+

+ +

+
+
+ + From d7c45fc98cbfaeed106baeff1f45fd6423a415ed Mon Sep 17 00:00:00 2001 From: Rishad Alam <101513331+RishadAlam@users.noreply.github.com> Date: Sat, 14 Feb 2026 15:07:13 +0600 Subject: [PATCH 02/23] fix: security vulnerabilities in API helpers and admin components --- .../Actions/AcademyLms/AcademyLmsController.php | 5 +++-- includes/Actions/Fabman/RecordApiHelper.php | 2 +- .../Actions/GoogleContacts/RecordApiHelper.php | 10 ++++++++-- includes/Actions/WooCommerce/RecordApiHelper.php | 6 +++++- includes/Actions/ZohoCRM/FilesApiHelper.php | 12 +++++++++++- includes/Admin/AdminAjax.php | 3 ++- includes/Core/Util/Helper.php | 14 +++++++++++++- includes/Core/Util/Route.php | 10 ++++++---- 8 files changed, 49 insertions(+), 13 deletions(-) diff --git a/includes/Actions/AcademyLms/AcademyLmsController.php b/includes/Actions/AcademyLms/AcademyLmsController.php index 8d20d4d6d..f289949f6 100644 --- a/includes/Actions/AcademyLms/AcademyLmsController.php +++ b/includes/Actions/AcademyLms/AcademyLmsController.php @@ -193,9 +193,10 @@ public static function resetCourse($selectedCourse) $QuizIds = $wpdb->get_col($wpdb->prepare("select quiz_id from {$wpdb->prefix}academy_quiz_attempts where user_id = '14' AND course_id = %d ", $course_id)); if (!empty($QuizIds)) { - $QuizIds = "'" . implode("','", $QuizIds) . "'"; + $placeholders = implode(',', array_fill(0, \count($QuizIds), '%d')); $wpdb->query($wpdb->prepare("DELETE from {$wpdb->prefix}academy_quiz_attempts WHERE user_id = %d AND course_id = %d", $user_id, $course_id)); - $wpdb->query($wpdb->prepare("DELETE from {$wpdb->prefix}academy_quiz_attempt_answers WHERE user_id = %d AND quiz_id in (%s) ", $user_id, $QuizIds)); + $query = $wpdb->prepare("DELETE from {$wpdb->prefix}academy_quiz_attempt_answers WHERE user_id = %d AND quiz_id in ({$placeholders}) ", $user_id, ...$QuizIds); + $wpdb->query($query); } $wpdb->query($wpdb->prepare("DELETE from {$wpdb->comments} WHERE comment_agent = 'academy' AND comment_type = 'course_completed' AND comment_post_ID = %d AND user_id = %d", $course_id, $user_id)); diff --git a/includes/Actions/Fabman/RecordApiHelper.php b/includes/Actions/Fabman/RecordApiHelper.php index 054e0bc6e..dcd966aa0 100644 --- a/includes/Actions/Fabman/RecordApiHelper.php +++ b/includes/Actions/Fabman/RecordApiHelper.php @@ -111,7 +111,7 @@ private function logValidationError($fieldName, $value): void $this->integrationID, ['type' => 'validation', 'field' => $fieldName, 'value' => $value], 'error', - __('Field validation failed for: ' . $fieldName, 'bit-integrations') + \sprintf(__('Field validation failed for: %s', 'bit-integrations'), $fieldName) ); } diff --git a/includes/Actions/GoogleContacts/RecordApiHelper.php b/includes/Actions/GoogleContacts/RecordApiHelper.php index 8fefbf35e..932073c25 100644 --- a/includes/Actions/GoogleContacts/RecordApiHelper.php +++ b/includes/Actions/GoogleContacts/RecordApiHelper.php @@ -2,9 +2,9 @@ namespace BitCode\FI\Actions\GoogleContacts; -use BitCode\FI\Log\LogHandler; use BitCode\FI\Core\Util\Common; use BitCode\FI\Core\Util\HttpHelper; +use BitCode\FI\Log\LogHandler; class RecordApiHelper { @@ -136,8 +136,14 @@ public function handleUploadPhoto($imageLocation, $resourceName) // "personFields" => 'addresses,biographies,emailAddresses,names,phoneNumbers' // ]; + $response = wp_remote_get($imageLocation); + if (is_wp_error($response)) { + return $response; + } + $imageData = wp_remote_retrieve_body($response); + $dataNew = [ - 'photoBytes' => base64_encode(file_get_contents($imageLocation)), + 'photoBytes' => base64_encode($imageData), 'personFields' => 'addresses,biographies,emailAddresses,names,phoneNumbers' ]; diff --git a/includes/Actions/WooCommerce/RecordApiHelper.php b/includes/Actions/WooCommerce/RecordApiHelper.php index 93aa325e3..89cb1f8a9 100644 --- a/includes/Actions/WooCommerce/RecordApiHelper.php +++ b/includes/Actions/WooCommerce/RecordApiHelper.php @@ -618,8 +618,12 @@ public function upload_attachment($product_id, $url) $image_url = $url; $url_array = explode('/', $url); $image_name = $url_array[\count($url_array) - 1]; - $image_data = file_get_contents($image_url); + $response = wp_remote_get($image_url); + if (is_wp_error($response)) { + return false; + } + $image_data = wp_remote_retrieve_body($response); $upload_dir = wp_upload_dir(); $unique_file_name = wp_unique_filename($upload_dir['path'], $image_name); $filename = basename($unique_file_name); diff --git a/includes/Actions/ZohoCRM/FilesApiHelper.php b/includes/Actions/ZohoCRM/FilesApiHelper.php index dd036c8c8..b28d0aece 100644 --- a/includes/Actions/ZohoCRM/FilesApiHelper.php +++ b/includes/Actions/ZohoCRM/FilesApiHelper.php @@ -100,7 +100,17 @@ public function preparePayload($file) $payload .= 'Content-Disposition: form-data; name="' . 'file' . '"; filename="' . basename("{$file}") . '"' . "\r\n"; $payload .= "\r\n"; - $payload .= file_get_contents("{$file}"); + + if (filter_var($file, FILTER_VALIDATE_URL)) { + $response = wp_remote_get($file); + if (is_wp_error($response)) { + return ''; + } + $payload .= wp_remote_retrieve_body($response); + } else { + $payload .= file_get_contents("{$file}"); + } + $payload .= "\r\n"; } diff --git a/includes/Admin/AdminAjax.php b/includes/Admin/AdminAjax.php index f8f519b5c..dfe821d4c 100644 --- a/includes/Admin/AdminAjax.php +++ b/includes/Admin/AdminAjax.php @@ -47,7 +47,8 @@ public function setChangelogVersion() if (wp_verify_nonce($nonce, 'btcbi_nonce') && isset($_REQUEST['data'])) { $inputJSON = stripslashes(wp_unslash($_REQUEST['data'])); - $input = json_decode($inputJSON); + $decoded = json_decode($inputJSON); + $input = \is_object($decoded) || \is_array($decoded) ? map_deep($decoded, 'sanitize_text_field') : $decoded; $version = isset($input->version) ? sanitize_text_field($input->version) : ''; update_option('btcbi_changelog_version', $version); diff --git a/includes/Core/Util/Helper.php b/includes/Core/Util/Helper.php index 24eafa159..b9768107a 100644 --- a/includes/Core/Util/Helper.php +++ b/includes/Core/Util/Helper.php @@ -88,8 +88,20 @@ public static function uploadFeatureImg($filePath, $postID) } $imgFileName = basename($file); + + // Get file content using WordPress HTTP API for remote files + if (filter_var($file, FILTER_VALIDATE_URL)) { + $response = wp_remote_get($file); + if (is_wp_error($response)) { + continue; + } + $fileContent = wp_remote_retrieve_body($response); + } else { + $fileContent = file_get_contents($file); + } + // prepare upload image to WordPress Media Library - $upload = wp_upload_bits($imgFileName, null, file_get_contents($file)); + $upload = wp_upload_bits($imgFileName, null, $fileContent); if (!empty($upload['error']) || !isset($upload['file'])) { continue; diff --git a/includes/Core/Util/Route.php b/includes/Core/Util/Route.php index df9d4c98b..9f34dcfb2 100644 --- a/includes/Core/Util/Route.php +++ b/includes/Core/Util/Route.php @@ -96,15 +96,17 @@ public static function action() && strpos(sanitize_text_field(wp_unslash($_SERVER['CONTENT_TYPE'])), 'x-www-form-urlencoded') === false ) { $inputJSON = file_get_contents('php://input'); - $data = \is_string($inputJSON) ? json_decode($inputJSON) : $inputJSON; + $decoded = \is_string($inputJSON) ? json_decode($inputJSON) : $inputJSON; + $data = \is_object($decoded) || \is_array($decoded) ? map_deep($decoded, 'sanitize_text_field') : $decoded; } elseif (isset($_POST['data'])) { $postReq = wp_unslash($_POST['data']); - $data = \is_string($postReq) ? json_decode($postReq) : $postReq; + $decoded = \is_string($postReq) ? json_decode($postReq) : $postReq; + $data = \is_object($decoded) || \is_array($decoded) ? map_deep($decoded, 'sanitize_text_field') : $decoded; } else { - $data = (object) $_POST; + $data = (object) map_deep(wp_unslash($_POST), 'sanitize_text_field'); } } else { - $data = (object) $_GET; + $data = (object) map_deep(wp_unslash($_GET), 'sanitize_text_field'); } $reflectionMethod = new ReflectionMethod($invokeable[0], $invokeable[1]); From 50915cbaa2debe11bc57d4a35103baf8d9ec49a3 Mon Sep 17 00:00:00 2001 From: Rishad Alam <101513331+RishadAlam@users.noreply.github.com> Date: Sat, 14 Feb 2026 15:44:18 +0600 Subject: [PATCH 03/23] fix SQL injection vulnerabilities --- .../Actions/AcademyLms/AcademyLmsController.php | 2 +- includes/Actions/BuddyBoss/BuddyBossController.php | 4 ++-- includes/Actions/BuddyBoss/RecordApiHelper.php | 5 ++--- includes/Actions/LearnDash/RecordApiHelper.php | 8 ++++---- includes/Actions/MailMint/MailMintController.php | 2 +- .../PropovoiceCRM/PropovoiceCRMController.php | 10 ++++++++-- includes/Actions/TutorLms/TutorLmsController.php | 10 ++++++++-- includes/Core/Database/LogModel.php | 14 +++++++++++--- includes/Core/Util/Multisite.php | 2 +- includes/Log/LogHandler.php | 3 +-- 10 files changed, 39 insertions(+), 21 deletions(-) diff --git a/includes/Actions/AcademyLms/AcademyLmsController.php b/includes/Actions/AcademyLms/AcademyLmsController.php index f289949f6..255cf1b28 100644 --- a/includes/Actions/AcademyLms/AcademyLmsController.php +++ b/includes/Actions/AcademyLms/AcademyLmsController.php @@ -190,7 +190,7 @@ public static function resetCourse($selectedCourse) $wpdb->query($wpdb->prepare("DELETE from {$wpdb->usermeta} WHERE user_id = %d AND meta_key = %s", $user_id, $complete_topics)); $wpdb->query($wpdb->prepare("DELETE from {$wpdb->posts} WHERE post_author = %d AND post_parent = %d AND post_type = %s ", $user_id, $course_id, 'academy_enrolled')); - $QuizIds = $wpdb->get_col($wpdb->prepare("select quiz_id from {$wpdb->prefix}academy_quiz_attempts where user_id = '14' AND course_id = %d ", $course_id)); + $QuizIds = $wpdb->get_col($wpdb->prepare("SELECT quiz_id FROM {$wpdb->prefix}academy_quiz_attempts WHERE user_id = %d AND course_id = %d", $user_id, $course_id)); if (!empty($QuizIds)) { $placeholders = implode(',', array_fill(0, \count($QuizIds), '%d')); diff --git a/includes/Actions/BuddyBoss/BuddyBossController.php b/includes/Actions/BuddyBoss/BuddyBossController.php index 7c91a50e7..0ebac262d 100644 --- a/includes/Actions/BuddyBoss/BuddyBossController.php +++ b/includes/Actions/BuddyBoss/BuddyBossController.php @@ -32,7 +32,7 @@ public static function getAllGroups() include_once ABSPATH . 'wp-admin/includes/plugin.php'; if (self::pluginActive()) { global $wpdb; - $groups = $wpdb->get_results("select id,name from {$wpdb->prefix}bp_groups"); + $groups = $wpdb->get_results($wpdb->prepare("SELECT id, name FROM {$wpdb->prefix}bp_groups")); wp_send_json_success($groups, 200); } @@ -44,7 +44,7 @@ public static function getAllUser() include_once ABSPATH . 'wp-admin/includes/plugin.php'; if (self::pluginActive()) { global $wpdb; - $users = $wpdb->get_results("select ID,display_name from {$wpdb->prefix}users"); + $users = $wpdb->get_results($wpdb->prepare("SELECT ID, display_name FROM {$wpdb->prefix}users")); wp_send_json_success($users, 200); } wp_send_json_error(wp_sprintf(__('%s must be activated!', 'bit-integrations'), 'BuddyBoss')); diff --git a/includes/Actions/BuddyBoss/RecordApiHelper.php b/includes/Actions/BuddyBoss/RecordApiHelper.php index 931daea6a..601c22d6f 100644 --- a/includes/Actions/BuddyBoss/RecordApiHelper.php +++ b/includes/Actions/BuddyBoss/RecordApiHelper.php @@ -580,9 +580,8 @@ public static function addPostToGroup($group_id, $friendId, $finalData) if ('any' === $group_id) { global $wpdb; $statuses = ['public', 'private', 'hidden']; - $in_str_arr = array_fill(0, \count($statuses), '%s'); - $in_str = join(',', $in_str_arr); - $results = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}bp_groups WHERE status IN (%s)", $in_str)); + $placeholders = implode(', ', array_fill(0, \count($statuses), '%s')); + $results = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}bp_groups WHERE status IN ({$placeholders})", ...$statuses)); if ($results) { foreach ($results as $result) { $hide_sitewide = false; diff --git a/includes/Actions/LearnDash/RecordApiHelper.php b/includes/Actions/LearnDash/RecordApiHelper.php index 5c4e46eec..9a6388d07 100644 --- a/includes/Actions/LearnDash/RecordApiHelper.php +++ b/includes/Actions/LearnDash/RecordApiHelper.php @@ -6,10 +6,10 @@ namespace BitCode\FI\Actions\LearnDash; -use LDLMS_DB; -use BitCode\FI\Log\LogHandler; -use BitCode\FI\Core\Util\Common; use BitCode\FI\Actions\Mail\MailController; +use BitCode\FI\Core\Util\Common; +use BitCode\FI\Log\LogHandler; +use LDLMS_DB; /** * Provide functionality for Record insert, upsert @@ -630,7 +630,7 @@ public static function delete_user_activity($user_id, $course_id) delete_user_meta($user_id, 'course_completed_' . $course_id); delete_user_meta($user_id, 'learndash_course_expired_' . $course_id); - $activity_ids = $wpdb->get_results($wpdb->prepare("SELECT activity_id FROM ' . {$wpdb->prefix} . 'learndash_user_activity WHERE course_id = %d AND user_id = %d", $course_id, $user_id)); + $activity_ids = $wpdb->get_results($wpdb->prepare("SELECT activity_id FROM {$wpdb->prefix}learndash_user_activity WHERE course_id = %d AND user_id = %d", $course_id, $user_id)); if ($activity_ids) { foreach ($activity_ids as $activity_id) { diff --git a/includes/Actions/MailMint/MailMintController.php b/includes/Actions/MailMint/MailMintController.php index 3fbf8ae43..6bccee98b 100644 --- a/includes/Actions/MailMint/MailMintController.php +++ b/includes/Actions/MailMint/MailMintController.php @@ -31,7 +31,7 @@ public static function allCustomFields() $allFields = []; $fields_table = $wpdb->prefix . CustomFieldSchema::$table_name; $primaryFields = get_option('mint_contact_primary_fields', Constants::$primary_contact_fields); - $customFields = $wpdb->get_results("SELECT title, slug, type, group_id FROM `{$fields_table}`", ARRAY_A); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Querying third-party plugin table + $customFields = $wpdb->get_results($wpdb->prepare("SELECT title, slug, type, group_id FROM `{$fields_table}`"), ARRAY_A); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Querying third-party plugin table, table name is from plugin constant if (!empty($customFields)) { $primaryFields['other'] = array_merge($primaryFields['other'], $customFields); diff --git a/includes/Actions/PropovoiceCRM/PropovoiceCRMController.php b/includes/Actions/PropovoiceCRM/PropovoiceCRMController.php index 725ed5f60..42f2fcd83 100644 --- a/includes/Actions/PropovoiceCRM/PropovoiceCRMController.php +++ b/includes/Actions/PropovoiceCRM/PropovoiceCRMController.php @@ -24,14 +24,20 @@ public static function authorizePropovoiceCrm() public static function leadTags() { global $wpdb; - $tags = $wpdb->get_results("SELECT term_id, name FROM {$wpdb->terms} WHERE term_id IN (SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'ndpv_tag')"); + $tags = $wpdb->get_results($wpdb->prepare( + "SELECT term_id, name FROM {$wpdb->terms} WHERE term_id IN (SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE taxonomy = %s)", + 'ndpv_tag' + )); wp_send_json_success($tags, 200); } public static function leadLabel() { global $wpdb; - $labels = $wpdb->get_results("SELECT term_id, name FROM {$wpdb->terms} WHERE term_id IN (SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'ndpv_lead_level')"); + $labels = $wpdb->get_results($wpdb->prepare( + "SELECT term_id, name FROM {$wpdb->terms} WHERE term_id IN (SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE taxonomy = %s)", + 'ndpv_lead_level' + )); wp_send_json_success($labels, 200); } diff --git a/includes/Actions/TutorLms/TutorLmsController.php b/includes/Actions/TutorLms/TutorLmsController.php index a58511295..cd2040037 100644 --- a/includes/Actions/TutorLms/TutorLmsController.php +++ b/includes/Actions/TutorLms/TutorLmsController.php @@ -157,11 +157,17 @@ public static function resetCourse($selectedCourse) if (\is_array($completedLessonIds) && \count($completedLessonIds)) { $lessonMetaIds = []; foreach ($completedLessonIds as $lesson_id) { + $lesson_id = absint($lesson_id); $lessonMetaIds[] = '_tutor_completed_lesson_id_' . $lesson_id; } - $ids = implode("','", $lessonMetaIds); - $wpdb->query($wpdb->prepare("DELETE from {$wpdb->usermeta} WHERE user_id = %d AND meta_key in(%s) ", $user_id, $ids)); + // Create placeholders for IN clause + $placeholders = implode(', ', array_fill(0, \count($lessonMetaIds), '%s')); + $query = $wpdb->prepare( + "DELETE from {$wpdb->usermeta} WHERE user_id = %d AND meta_key IN ({$placeholders})", + array_merge([$user_id], $lessonMetaIds) + ); + $wpdb->query($query); } $courseContents = tutils()->get_course_contents_by_id($course_id); diff --git a/includes/Core/Database/LogModel.php b/includes/Core/Database/LogModel.php index 9281d0a48..f64799344 100644 --- a/includes/Core/Database/LogModel.php +++ b/includes/Core/Database/LogModel.php @@ -1,4 +1,5 @@ prefix . static::$table; + $intervalDays = absint($intervalDays); - $result = $this->app_db->get_results("DELETE FROM {$tableName} WHERE {$condition}", OBJECT_K); + $result = $this->app_db->get_results( + $wpdb->prepare( + "DELETE FROM {$tableName} WHERE DATE_ADD(date(created_at), INTERVAL %d DAY) < CURRENT_DATE", + $intervalDays + ), + OBJECT_K + ); return $result; } diff --git a/includes/Core/Util/Multisite.php b/includes/Core/Util/Multisite.php index 561b0b28d..f34f39de7 100644 --- a/includes/Core/Util/Multisite.php +++ b/includes/Core/Util/Multisite.php @@ -13,7 +13,7 @@ public static function all_blog_ids() if (\function_exists('get_sites') && \function_exists('get_current_network_id')) { $site_ids = get_sites(['fields' => 'ids', 'network_id' => get_current_network_id()]); } else { - $site_ids = $wpdb->get_col("SELECT blog_id FROM {$wpdb->blogs} WHERE site_id = {$wpdb->siteid};"); + $site_ids = $wpdb->get_col($wpdb->prepare("SELECT blog_id FROM {$wpdb->blogs} WHERE site_id = %d", $wpdb->siteid)); } return $site_ids; diff --git a/includes/Log/LogHandler.php b/includes/Log/LogHandler.php index 3dad92365..c80f78264 100644 --- a/includes/Log/LogHandler.php +++ b/includes/Log/LogHandler.php @@ -140,10 +140,9 @@ public static function delete($data) public static function logAutoDelte($intervalDate) { - $condition = "DATE_ADD(date(created_at), INTERVAL {$intervalDate} DAY) < CURRENT_DATE"; $logModel = new LogModel(); - return $logModel->autoLogDelete($condition); + return $logModel->autoLogDelete($intervalDate); } /** From 72496b8dbd57ce32a66f0018374886b230fb8993 Mon Sep 17 00:00:00 2001 From: Rishad Alam <101513331+RishadAlam@users.noreply.github.com> Date: Sat, 14 Feb 2026 16:09:29 +0600 Subject: [PATCH 04/23] refactor: updated controllers, helpers, and route files for all integrations namespaces --- includes/Actions/ACPT/ACPTController.php | 4 ++-- includes/Actions/ACPT/ACPTHelper.php | 6 ++--- includes/Actions/ACPT/RecordApiHelper.php | 6 ++--- includes/Actions/ACPT/Routes.php | 4 ++-- .../AcademyLms/AcademyLmsController.php | 4 ++-- includes/Actions/AcademyLms/Routes.php | 4 ++-- includes/Actions/ActionController.php | 4 ++-- .../ActiveCampaignController.php | 4 ++-- .../ActiveCampaign/RecordApiHelper.php | 6 ++--- includes/Actions/ActiveCampaign/Routes.php | 4 ++-- .../Acumbamail/AcumbamailController.php | 4 ++-- .../Actions/Acumbamail/RecordApiHelper.php | 8 +++---- includes/Actions/Acumbamail/Routes.php | 4 ++-- .../AdvancedFormIntegrationController.php | 4 ++-- .../Actions/Affiliate/AffiliateController.php | 2 +- .../Actions/Affiliate/RecordApiHelper.php | 6 ++--- includes/Actions/Affiliate/Routes.php | 4 ++-- .../Actions/AgiledCRM/AgiledCRMController.php | 4 ++-- .../Actions/AgiledCRM/RecordApiHelper.php | 8 +++---- includes/Actions/AgiledCRM/Routes.php | 4 ++-- .../Actions/Airtable/AirtableController.php | 4 ++-- includes/Actions/Airtable/RecordApiHelper.php | 8 +++---- includes/Actions/Airtable/Routes.php | 4 ++-- includes/Actions/Albato/AlbatoController.php | 4 ++-- .../Actions/AntApps/AntAppsController.php | 4 ++-- includes/Actions/Asana/AsanaController.php | 4 ++-- includes/Actions/Asana/RecordApiHelper.php | 8 +++---- includes/Actions/Asana/Routes.php | 4 ++-- .../AutomatorWP/AutomatorWPController.php | 4 ++-- .../Actions/Autonami/AutonamiController.php | 6 ++--- includes/Actions/Autonami/RecordApiHelper.php | 4 ++-- includes/Actions/Autonami/Routes.php | 4 ++-- .../Actions/BenchMark/BenchMarkController.php | 4 ++-- .../Actions/BenchMark/RecordApiHelper.php | 6 ++--- includes/Actions/BenchMark/Routes.php | 4 ++-- includes/Actions/Bento/BentoController.php | 4 ++-- includes/Actions/Bento/BentoHelper.php | 4 ++-- includes/Actions/Bento/RecordApiHelper.php | 8 +++---- includes/Actions/Bento/Routes.php | 4 ++-- .../Actions/BitForm/BitFormController.php | 4 ++-- includes/Actions/BitForm/RecordApiHelper.php | 8 +++---- includes/Actions/BitForm/Routes.php | 4 ++-- .../Actions/BuddyBoss/BuddyBossController.php | 2 +- includes/Actions/BuddyBoss/Hooks.php | 4 ++-- .../Actions/BuddyBoss/RecordApiHelper.php | 6 ++--- includes/Actions/BuddyBoss/Routes.php | 4 ++-- .../CampaignMonitorController.php | 4 ++-- .../CampaignMonitor/RecordApiHelper.php | 8 +++---- includes/Actions/CampaignMonitor/Routes.php | 4 ++-- .../CapsuleCRM/CapsuleCRMController.php | 4 ++-- .../Actions/CapsuleCRM/RecordApiHelper.php | 6 ++--- includes/Actions/CapsuleCRM/Routes.php | 4 ++-- .../Actions/Clickup/ClickupController.php | 4 ++-- includes/Actions/Clickup/RecordApiHelper.php | 8 +++---- includes/Actions/Clickup/Routes.php | 4 ++-- .../Actions/ClinchPad/ClinchPadController.php | 4 ++-- .../Actions/ClinchPad/RecordApiHelper.php | 8 +++---- includes/Actions/ClinchPad/Routes.php | 4 ++-- .../CompanyHub/CompanyHubController.php | 4 ++-- .../Actions/CompanyHub/RecordApiHelper.php | 8 +++---- includes/Actions/CompanyHub/Routes.php | 4 ++-- .../ConstantContactController.php | 8 +++---- .../ConstantContact/RecordApiHelper.php | 8 +++---- includes/Actions/ConstantContact/Routes.php | 4 ++-- .../ConvertKit/ConvertKitController.php | 4 ++-- .../Actions/ConvertKit/RecordApiHelper.php | 8 +++---- includes/Actions/ConvertKit/Routes.php | 4 ++-- .../Actions/CopperCRM/CopperCRMController.php | 4 ++-- .../Actions/CopperCRM/RecordApiHelper.php | 8 +++---- includes/Actions/CopperCRM/Routes.php | 4 ++-- .../CustomAction/CustomActionController.php | 4 ++-- includes/Actions/CustomAction/Routes.php | 4 ++-- .../Actions/CustomApi/CustomApiController.php | 8 +++---- includes/Actions/Demio/DemioController.php | 4 ++-- includes/Actions/Demio/RecordApiHelper.php | 6 ++--- includes/Actions/Demio/Routes.php | 4 ++-- .../Actions/DirectIq/DirectIqController.php | 4 ++-- includes/Actions/DirectIq/RecordApiHelper.php | 6 ++--- includes/Actions/DirectIq/Routes.php | 4 ++-- .../Actions/Discord/DiscordController.php | 4 ++-- includes/Actions/Discord/FilesApiHelper.php | 4 ++-- includes/Actions/Discord/RecordApiHelper.php | 12 +++++----- includes/Actions/Discord/Routes.php | 4 ++-- includes/Actions/Dokan/DokanController.php | 2 +- includes/Actions/Dokan/RecordApiHelper.php | 8 +++---- includes/Actions/Dokan/Routes.php | 4 ++-- includes/Actions/Drip/DripController.php | 4 ++-- includes/Actions/Drip/RecordApiHelper.php | 8 +++---- includes/Actions/Drip/Routes.php | 4 ++-- .../Actions/Dropbox/DropboxController.php | 10 ++++----- includes/Actions/Dropbox/RecordApiHelper.php | 8 +++---- includes/Actions/Dropbox/Routes.php | 4 ++-- .../ElasticEmail/ElasticEmailController.php | 4 ++-- .../Actions/ElasticEmail/RecordApiHelper.php | 8 +++---- includes/Actions/ElasticEmail/Routes.php | 4 ++-- .../EmailOctopus/EmailOctopusController.php | 4 ++-- .../Actions/EmailOctopus/RecordApiHelper.php | 8 +++---- includes/Actions/EmailOctopus/Routes.php | 4 ++-- .../Actions/Encharge/EnchargeController.php | 4 ++-- includes/Actions/Encharge/RecordApiHelper.php | 8 +++---- includes/Actions/Encharge/Routes.php | 4 ++-- includes/Actions/Fabman/FabmanController.php | 4 ++-- includes/Actions/Fabman/RecordApiHelper.php | 8 +++---- includes/Actions/Fabman/Routes.php | 4 ++-- .../FlowMattic/FlowMatticController.php | 4 ++-- includes/Actions/Flowlu/FlowluController.php | 4 ++-- includes/Actions/Flowlu/RecordApiHelper.php | 8 +++---- includes/Actions/Flowlu/Routes.php | 4 ++-- .../FluentCart/FluentCartController.php | 2 +- .../Actions/FluentCart/RecordApiHelper.php | 6 ++--- includes/Actions/FluentCart/Routes.php | 4 ++-- .../Actions/FluentCrm/FluentCrmController.php | 10 ++++----- .../Actions/FluentCrm/RecordApiHelper.php | 4 ++-- includes/Actions/FluentCrm/Routes.php | 4 ++-- .../FluentSupport/FluentSupportController.php | 2 +- .../Actions/FluentSupport/RecordApiHelper.php | 8 +++---- includes/Actions/FluentSupport/Routes.php | 5 +++-- .../FreshSales/FreshSalesController.php | 4 ++-- .../Actions/FreshSales/RecordApiHelper.php | 10 ++++----- includes/Actions/FreshSales/Routes.php | 4 ++-- .../Actions/Freshdesk/AllFilesApiHelper.php | 4 ++-- includes/Actions/Freshdesk/FilesApiHelper.php | 4 ++-- .../Actions/Freshdesk/FreshdeskController.php | 4 ++-- .../Actions/Freshdesk/RecordApiHelper.php | 8 +++---- includes/Actions/Freshdesk/Routes.php | 4 ++-- .../Actions/GamiPress/GamiPressController.php | 2 +- .../Actions/GamiPress/RecordApiHelper.php | 6 ++--- includes/Actions/GamiPress/Routes.php | 4 ++-- .../GetResponse/GetResponseController.php | 4 ++-- .../Actions/GetResponse/RecordApiHelper.php | 10 ++++----- includes/Actions/GetResponse/Routes.php | 4 ++-- .../Actions/Getgist/GetgistController.php | 4 ++-- includes/Actions/Getgist/RecordApiHelper.php | 8 +++---- includes/Actions/Getgist/Routes.php | 4 ++-- includes/Actions/GiveWp/GiveWpController.php | 2 +- includes/Actions/GiveWp/RecordApiHelper.php | 6 ++--- includes/Actions/GiveWp/Routes.php | 4 ++-- .../GoogleCalendarController.php | 10 ++++----- .../GoogleCalendar/RecordApiHelper.php | 10 ++++----- includes/Actions/GoogleCalendar/Routes.php | 4 ++-- .../GoogleContactsController.php | 10 ++++----- .../GoogleContacts/RecordApiHelper.php | 8 +++---- includes/Actions/GoogleContacts/Routes.php | 4 ++-- .../GoogleDrive/GoogleDriveController.php | 10 ++++----- .../Actions/GoogleDrive/RecordApiHelper.php | 8 +++---- includes/Actions/GoogleDrive/Routes.php | 4 ++-- .../GoogleSheet/GoogleSheetController.php | 6 ++--- .../Actions/GoogleSheet/RecordApiHelper.php | 14 ++++++------ includes/Actions/GoogleSheet/Routes.php | 4 ++-- .../Actions/Gravitec/GravitecController.php | 4 ++-- includes/Actions/Gravitec/RecordApiHelper.php | 6 ++--- includes/Actions/Gravitec/Routes.php | 4 ++-- .../Groundhogg/GroundhoggController.php | 4 ++-- .../Actions/Groundhogg/RecordApiHelper.php | 8 +++---- includes/Actions/Groundhogg/Routes.php | 4 ++-- .../Actions/HighLevel/HighLevelController.php | 4 ++-- .../Actions/HighLevel/RecordApiHelper.php | 10 ++++----- includes/Actions/HighLevel/Routes.php | 4 ++-- .../Actions/Hubspot/HubspotController.php | 6 ++--- .../Hubspot/HubspotRecordApiHelper.php | 10 ++++----- includes/Actions/Hubspot/Routes.php | 4 ++-- .../Actions/Insightly/InsightlyController.php | 4 ++-- .../Actions/Insightly/RecordApiHelper.php | 6 ++--- includes/Actions/Insightly/Routes.php | 4 ++-- .../Integrately/IntegratelyController.php | 4 ++-- .../Integromat/IntegromatController.php | 4 ++-- .../Actions/JetEngine/JetEngineController.php | 2 +- .../Actions/JetEngine/RecordApiHelper.php | 8 +++---- includes/Actions/JetEngine/Routes.php | 4 ++-- includes/Actions/Keap/KeapController.php | 6 ++--- includes/Actions/Keap/RecordApiHelper.php | 8 +++---- includes/Actions/Keap/Routes.php | 4 ++-- .../KirimEmail/KirimEmailController.php | 4 ++-- .../Actions/KirimEmail/RecordApiHelper.php | 8 +++---- includes/Actions/KirimEmail/Routes.php | 4 ++-- .../Actions/Klaviyo/KlaviyoController.php | 4 ++-- includes/Actions/Klaviyo/RecordApiHelper.php | 8 +++---- includes/Actions/Klaviyo/Routes.php | 4 ++-- .../KonnectzIT/KonnectzITController.php | 4 ++-- includes/Actions/LMFWC/LMFWCController.php | 4 ++-- includes/Actions/LMFWC/RecordApiHelper.php | 8 +++---- includes/Actions/LMFWC/Routes.php | 4 ++-- .../Actions/LearnDash/LearnDashController.php | 2 +- .../Actions/LearnDash/RecordApiHelper.php | 8 +++---- includes/Actions/LearnDash/Routes.php | 4 ++-- .../Actions/Lemlist/LemlistController.php | 4 ++-- includes/Actions/Lemlist/RecordApiHelper.php | 6 ++--- includes/Actions/Lemlist/Routes.php | 4 ++-- .../Actions/LifterLms/LifterLmsController.php | 2 +- .../Actions/LifterLms/RecordApiHelper.php | 4 ++-- includes/Actions/LifterLms/Routes.php | 4 ++-- includes/Actions/Line/LineController.php | 4 ++-- includes/Actions/Line/RecordApiHelper.php | 8 +++---- includes/Actions/Line/Routes.php | 4 ++-- .../Actions/LionDesk/LionDeskController.php | 4 ++-- includes/Actions/LionDesk/RecordApiHelper.php | 6 ++--- includes/Actions/LionDesk/Routes.php | 4 ++-- .../Actions/Livestorm/LivestormController.php | 4 ++-- .../Actions/Livestorm/RecordApiHelper.php | 6 ++--- includes/Actions/Livestorm/Routes.php | 4 ++-- includes/Actions/Mail/MailController.php | 6 ++--- .../MailBluster/MailBlusterController.php | 4 ++-- .../Actions/MailBluster/RecordApiHelper.php | 8 +++---- includes/Actions/MailBluster/Routes.php | 4 ++-- .../Actions/MailChimp/MailChimpController.php | 6 ++--- .../Actions/MailChimp/RecordApiHelper.php | 8 +++---- includes/Actions/MailChimp/Routes.php | 4 ++-- .../Actions/MailMint/MailMintController.php | 2 +- includes/Actions/MailMint/RecordApiHelper.php | 6 ++--- includes/Actions/MailMint/Routes.php | 4 ++-- .../Actions/MailPoet/MailPoetController.php | 4 ++-- includes/Actions/MailPoet/RecordApiHelper.php | 6 ++--- includes/Actions/MailPoet/Routes.php | 4 ++-- .../Actions/MailRelay/MailRelayController.php | 4 ++-- .../Actions/MailRelay/RecordApiHelper.php | 10 ++++----- includes/Actions/MailRelay/Routes.php | 4 ++-- .../MailerLite/MailerLiteController.php | 4 ++-- .../Actions/MailerLite/RecordApiHelper.php | 8 +++---- includes/Actions/MailerLite/Routes.php | 4 ++-- .../MailerPress/MailerPressController.php | 5 ++--- .../Actions/MailerPress/RecordApiHelper.php | 6 ++--- includes/Actions/MailerPress/Routes.php | 5 ++--- .../Mailercloud/MailercloudController.php | 4 ++-- .../Actions/Mailercloud/RecordApiHelper.php | 8 +++---- includes/Actions/Mailercloud/Routes.php | 4 ++-- .../Actions/Mailify/MailifyController.php | 4 ++-- includes/Actions/Mailify/RecordApiHelper.php | 6 ++--- includes/Actions/Mailify/Routes.php | 4 ++-- .../Actions/Mailjet/MailjetController.php | 4 ++-- includes/Actions/Mailjet/RecordApiHelper.php | 8 +++---- includes/Actions/Mailjet/Routes.php | 4 ++-- .../Actions/Mailster/MailsterController.php | 2 +- includes/Actions/Mailster/RecordApiHelper.php | 6 ++--- includes/Actions/Mailster/Routes.php | 4 ++-- includes/Actions/Mailup/MailupController.php | 6 ++--- includes/Actions/Mailup/RecordApiHelper.php | 8 +++---- includes/Actions/Mailup/Routes.php | 4 ++-- .../MasterStudyLmsController.php | 2 +- .../MasterStudyLms/MasterStudyLmsHelper.php | 2 +- .../MasterStudyLms/RecordApiHelper.php | 10 ++++----- includes/Actions/MasterStudyLms/Routes.php | 4 ++-- includes/Actions/Mautic/MauticController.php | 4 ++-- includes/Actions/Mautic/RecordApiHelper.php | 8 +++---- includes/Actions/Mautic/Routes.php | 4 ++-- .../Memberpress/MemberpressController.php | 2 +- .../Actions/Memberpress/RecordApiHelper.php | 6 ++--- includes/Actions/Memberpress/Routes.php | 4 ++-- .../Actions/Moosend/MoosendController.php | 4 ++-- includes/Actions/Moosend/MoosendHelper.php | 2 +- includes/Actions/Moosend/RecordApiHelper.php | 8 +++---- includes/Actions/Moosend/Routes.php | 4 ++-- .../Actions/MoxieCRM/MoxieCRMController.php | 4 ++-- includes/Actions/MoxieCRM/RecordApiHelper.php | 6 ++--- includes/Actions/MoxieCRM/Routes.php | 4 ++-- includes/Actions/N8n/N8nController.php | 4 ++-- .../Newsletter/NewsletterController.php | 2 +- .../Actions/Newsletter/RecordApiHelper.php | 6 ++--- includes/Actions/Newsletter/Routes.php | 4 ++-- includes/Actions/Nimble/NimbleController.php | 4 ++-- includes/Actions/Nimble/RecordApiHelper.php | 6 ++--- includes/Actions/Nimble/Routes.php | 4 ++-- includes/Actions/Notion/NotionController.php | 4 ++-- includes/Actions/Notion/RecordApiHelper.php | 10 ++++----- includes/Actions/Notion/Routes.php | 4 ++-- .../NutshellCRM/NutshellCRMController.php | 4 ++-- .../Actions/NutshellCRM/RecordApiHelper.php | 6 ++--- includes/Actions/NutshellCRM/Routes.php | 4 ++-- .../Actions/OmniSend/OmniSendController.php | 4 ++-- includes/Actions/OmniSend/RecordApiHelper.php | 12 +++++----- includes/Actions/OmniSend/Routes.php | 4 ++-- .../Actions/OneDrive/OneDriveController.php | 10 ++++----- includes/Actions/OneDrive/RecordApiHelper.php | 8 +++---- includes/Actions/OneDrive/Routes.php | 4 ++-- .../OneHashCRM/OneHashCRMController.php | 4 ++-- .../Actions/OneHashCRM/RecordApiHelper.php | 6 ++--- includes/Actions/OneHashCRM/Routes.php | 4 ++-- includes/Actions/PCloud/PCloudController.php | 8 +++---- includes/Actions/PCloud/RecordApiHelper.php | 6 ++--- includes/Actions/PCloud/Routes.php | 4 ++-- includes/Actions/Pabbly/PabblyController.php | 4 ++-- .../PaidMembershipProController.php | 2 +- .../PaidMembershipPro/RecordApiHelper.php | 6 ++--- includes/Actions/PaidMembershipPro/Routes.php | 4 ++-- .../Actions/PerfexCRM/PerfexCRMController.php | 4 ++-- .../Actions/PerfexCRM/RecordApiHelper.php | 8 +++---- includes/Actions/PerfexCRM/Routes.php | 4 ++-- .../Actions/PipeDrive/PipeDriveController.php | 4 ++-- .../Actions/PipeDrive/RecordApiHelper.php | 8 +++---- includes/Actions/PipeDrive/Routes.php | 4 ++-- includes/Actions/Pods/PodsController.php | 10 ++++----- .../PostCreation/PostCreationController.php | 12 +++++----- .../Actions/PropovoiceCRM/FilesApiHelper.php | 2 +- .../PropovoiceCRM/PropovoiceCRMController.php | 2 +- .../Actions/PropovoiceCRM/RecordApiHelper.php | 6 ++--- includes/Actions/PropovoiceCRM/Routes.php | 4 ++-- .../Actions/Rapidmail/RapidmailController.php | 8 +++---- .../Actions/Rapidmail/RecordApiHelper.php | 10 ++++----- includes/Actions/Rapidmail/Routes.php | 4 ++-- .../Registration/RegistrationController.php | 8 +++---- .../RestrictContent/RecordApiHelper.php | 4 ++-- .../RestrictContentController.php | 4 ++-- includes/Actions/RestrictContent/Routes.php | 4 ++-- .../Actions/Salesflare/RecordApiHelper.php | 6 ++--- includes/Actions/Salesflare/Routes.php | 4 ++-- .../Salesflare/SalesflareController.php | 4 ++-- .../Actions/Salesforce/RecordApiHelper.php | 8 +++---- includes/Actions/Salesforce/Routes.php | 4 ++-- .../Salesforce/SalesforceController.php | 6 ++--- .../Actions/Salesmate/RecordApiHelper.php | 6 ++--- includes/Actions/Salesmate/Routes.php | 4 ++-- .../Actions/Salesmate/SalesmateController.php | 4 ++-- includes/Actions/Selzy/RecordApiHelper.php | 8 +++---- includes/Actions/Selzy/Routes.php | 4 ++-- includes/Actions/Selzy/SelzyController.php | 4 ++-- includes/Actions/SendFox/RecordApiHelper.php | 8 +++---- includes/Actions/SendFox/Routes.php | 4 ++-- .../Actions/SendFox/SendFoxController.php | 4 ++-- includes/Actions/SendGrid/RecordApiHelper.php | 8 +++---- includes/Actions/SendGrid/Routes.php | 4 ++-- .../Actions/SendGrid/SendGridController.php | 4 ++-- .../Actions/SendPulse/RecordApiHelper.php | 6 ++--- includes/Actions/SendPulse/Routes.php | 4 ++-- .../Actions/SendPulse/SendPulseController.php | 8 +++---- .../Actions/SendinBlue/RecordApiHelper.php | 8 +++---- includes/Actions/SendinBlue/Routes.php | 4 ++-- .../SendinBlue/SendinBlueController.php | 4 ++-- includes/Actions/Sendy/RecordApiHelper.php | 8 +++---- includes/Actions/Sendy/Routes.php | 4 ++-- includes/Actions/Sendy/SendyController.php | 6 ++--- includes/Actions/SeoPress/RecordApiHelper.php | 6 ++--- includes/Actions/SeoPress/Routes.php | 4 ++-- .../Actions/SeoPress/SeoPressController.php | 2 +- includes/Actions/Slack/FilesApiHelper.php | 5 +++-- includes/Actions/Slack/RecordApiHelper.php | 16 +++++++------- includes/Actions/Slack/Routes.php | 4 ++-- includes/Actions/Slack/SlackController.php | 4 ++-- includes/Actions/SliceWp/RecordApiHelper.php | 6 ++--- includes/Actions/SliceWp/Routes.php | 4 ++-- .../Actions/SliceWp/SliceWpController.php | 2 +- includes/Actions/Smaily/RecordApiHelper.php | 6 ++--- includes/Actions/Smaily/Routes.php | 4 ++-- includes/Actions/Smaily/SmailyController.php | 4 ++-- .../Actions/SmartSuite/RecordApiHelper.php | 8 +++---- includes/Actions/SmartSuite/Routes.php | 4 ++-- .../SmartSuite/SmartSuiteController.php | 4 ++-- .../Actions/SperseIO/SperseIOController.php | 4 ++-- .../Actions/SuiteDash/RecordApiHelper.php | 6 ++--- includes/Actions/SuiteDash/Routes.php | 4 ++-- .../Actions/SuiteDash/SuiteDashController.php | 4 ++-- includes/Actions/SureCart/RecordApiHelper.php | 6 ++--- includes/Actions/SureCart/Routes.php | 4 ++-- .../Actions/SureCart/SureCartController.php | 2 +- .../Actions/SureMembers/RecordApiHelper.php | 6 ++--- includes/Actions/SureMembers/Routes.php | 4 ++-- .../SureMembers/SureMembersController.php | 2 +- .../SureTriggers/SureTriggersController.php | 4 ++-- .../SyncSpider/SyncSpiderController.php | 4 ++-- .../Actions/SystemeIO/RecordApiHelper.php | 6 ++--- includes/Actions/SystemeIO/Routes.php | 4 ++-- .../Actions/SystemeIO/SystemeIOController.php | 4 ++-- .../RecordApiHelper.php | 6 ++--- .../TeamsForWooCommerceMemberships/Routes.php | 5 ++--- ...amsForWooCommerceMembershipsController.php | 3 +-- includes/Actions/Telegram/FilesApiHelper.php | 4 ++-- includes/Actions/Telegram/RecordApiHelper.php | 8 +++---- includes/Actions/Telegram/Routes.php | 4 ++-- .../Actions/Telegram/TelegramController.php | 4 ++-- .../TheEventsCalendar/RecordApiHelper.php | 6 ++--- includes/Actions/TheEventsCalendar/Routes.php | 4 ++-- .../TheEventsCalendarController.php | 2 +- .../ThriveAutomatorController.php | 4 ++-- includes/Actions/Trello/RecordApiHelper.php | 8 +++---- includes/Actions/Trello/Routes.php | 4 ++-- includes/Actions/Trello/TrelloController.php | 4 ++-- includes/Actions/TutorLms/Routes.php | 4 ++-- .../Actions/TutorLms/TutorLmsController.php | 4 ++-- includes/Actions/Twilio/RecordApiHelper.php | 8 +++---- includes/Actions/Twilio/Routes.php | 4 ++-- includes/Actions/Twilio/TwilioController.php | 6 ++--- .../UncannyAutomatorController.php | 4 ++-- includes/Actions/Vbout/RecordApiHelper.php | 8 +++---- includes/Actions/Vbout/Routes.php | 4 ++-- includes/Actions/Vbout/VboutController.php | 4 ++-- includes/Actions/Voxel/RecordApiHelper.php | 6 ++--- includes/Actions/Voxel/Routes.php | 4 ++-- includes/Actions/Voxel/VoxelController.php | 4 ++-- includes/Actions/Voxel/VoxelHelper.php | 4 ++-- includes/Actions/Voxel/VoxelTasks.php | 2 +- includes/Actions/WPCafe/RecordApiHelper.php | 6 ++--- includes/Actions/WPCafe/Routes.php | 4 ++-- includes/Actions/WPCafe/WPCafeController.php | 2 +- .../Actions/WPCourseware/RecordApiHelper.php | 4 ++-- includes/Actions/WPCourseware/Routes.php | 4 ++-- .../WPCourseware/WPCoursewareController.php | 4 ++-- includes/Actions/WPForo/RecordApiHelper.php | 6 ++--- includes/Actions/WPForo/Routes.php | 4 ++-- includes/Actions/WPForo/WPForoController.php | 2 +- .../Actions/WPFusion/WPFusionController.php | 4 ++-- .../WPWebhooks/WPWebhooksController.php | 4 ++-- includes/Actions/WebHooks/Routes.php | 4 ++-- .../Actions/WebHooks/WebHooksController.php | 8 +++---- includes/Actions/WhatsApp/RecordApiHelper.php | 10 ++++----- includes/Actions/WhatsApp/Routes.php | 4 ++-- .../Actions/WhatsApp/WhatsAppController.php | 4 ++-- .../WishlistMember/RecordApiHelper.php | 6 ++--- includes/Actions/WishlistMember/Routes.php | 4 ++-- .../WishlistMemberController.php | 2 +- .../Actions/WooCommerce/RecordApiHelper.php | 6 ++--- includes/Actions/WooCommerce/Routes.php | 4 ++-- .../WooCommerce/WooCommerceController.php | 4 ++-- .../WooCommerce/WooCommerceMetaFields.php | 4 ++-- .../WooCommerce/WooCommerceStaticFields.php | 2 +- .../Actions/Woodpecker/RecordApiHelper.php | 6 ++--- includes/Actions/Woodpecker/Routes.php | 4 ++-- .../Woodpecker/WoodpeckerController.php | 4 ++-- includes/Actions/ZagoMail/RecordApiHelper.php | 6 ++--- includes/Actions/ZagoMail/Routes.php | 4 ++-- .../Actions/ZagoMail/ZagoMailController.php | 4 ++-- includes/Actions/Zapier/ZapierController.php | 4 ++-- includes/Actions/Zendesk/RecordApiHelper.php | 6 ++--- includes/Actions/Zendesk/Routes.php | 4 ++-- .../Actions/Zendesk/ZendeskController.php | 4 ++-- .../Actions/ZohoAnalytics/RecordApiHelper.php | 10 ++++----- includes/Actions/ZohoAnalytics/Routes.php | 4 ++-- .../ZohoAnalytics/ZohoAnalyticsController.php | 10 ++++----- includes/Actions/ZohoBigin/FilesApiHelper.php | 4 ++-- .../Actions/ZohoBigin/RecordApiHelper.php | 10 ++++----- includes/Actions/ZohoBigin/Routes.php | 4 ++-- .../Actions/ZohoBigin/ZohoBiginController.php | 8 +++---- includes/Actions/ZohoCRM/FilesApiHelper.php | 6 ++--- .../Actions/ZohoCRM/MetaDataApiHelper.php | 5 +++-- includes/Actions/ZohoCRM/RecordApiHelper.php | 12 +++++----- includes/Actions/ZohoCRM/Routes.php | 4 ++-- includes/Actions/ZohoCRM/TagApiHelper.php | 5 +++-- .../Actions/ZohoCRM/ZohoCRMController.php | 8 +++---- .../Actions/ZohoCampaigns/RecordApiHelper.php | 6 ++--- includes/Actions/ZohoCampaigns/Routes.php | 4 ++-- .../ZohoCampaigns/ZohoCampaignsController.php | 10 ++++----- .../Actions/ZohoCreator/FilesApiHelper.php | 4 ++-- .../Actions/ZohoCreator/RecordApiHelper.php | 10 ++++----- includes/Actions/ZohoCreator/Routes.php | 4 ++-- .../ZohoCreator/ZohoCreatorController.php | 6 ++--- includes/Actions/ZohoDesk/FilesApiHelper.php | 4 ++-- includes/Actions/ZohoDesk/RecordApiHelper.php | 8 +++---- includes/Actions/ZohoDesk/Routes.php | 4 ++-- .../Actions/ZohoDesk/ZohoDeskController.php | 6 ++--- .../Actions/ZohoFlow/ZohoFlowController.php | 4 ++-- .../ZohoMarketingHub/RecordApiHelper.php | 6 ++--- includes/Actions/ZohoMarketingHub/Routes.php | 4 ++-- .../ZohoMarketingHubController.php | 6 ++--- .../Actions/ZohoProjects/FilesApiHelper.php | 4 ++-- .../Actions/ZohoProjects/RecordApiHelper.php | 10 ++++----- .../ZohoProjects/ZohoProjectsController.php | 6 ++--- .../Actions/ZohoRecruit/FilesApiHelper.php | 4 ++-- .../Actions/ZohoRecruit/RecordApiHelper.php | 10 ++++----- includes/Actions/ZohoRecruit/Routes.php | 4 ++-- .../ZohoRecruit/ZohoRecruitController.php | 6 ++--- .../Actions/ZohoSheet/RecordApiHelper.php | 8 +++---- includes/Actions/ZohoSheet/Routes.php | 4 ++-- .../Actions/ZohoSheet/ZohoSheetController.php | 6 ++--- includes/Actions/Zoom/RecordApiHelper.php | 8 +++---- includes/Actions/Zoom/Routes.php | 4 ++-- includes/Actions/Zoom/ZoomController.php | 6 ++--- .../Actions/ZoomWebinar/RecordApiHelper.php | 8 +++---- includes/Actions/ZoomWebinar/Routes.php | 4 ++-- .../ZoomWebinar/ZoomWebinarController.php | 6 ++--- includes/Admin/AdminAjax.php | 4 ++-- includes/Admin/Admin_Bar.php | 8 +++---- includes/Config.php | 2 +- includes/Core/Database/AuthModel.php | 3 ++- includes/Core/Database/DB.php | 2 +- includes/Core/Database/FlowModel.php | 3 ++- includes/Core/Database/LogModel.php | 2 +- includes/Core/Database/Model.php | 2 +- includes/Core/Hooks/HookService.php | 10 ++++----- includes/Core/Util/API.php | 2 +- includes/Core/Util/Activation.php | 4 ++-- includes/Core/Util/AllProActionFeat.php | 2 +- includes/Core/Util/AllTriggersName.php | 2 +- includes/Core/Util/AttachmentHandler.php | 2 +- includes/Core/Util/Capabilities.php | 2 +- includes/Core/Util/Common.php | 2 +- includes/Core/Util/CustomFuncValidator.php | 2 +- includes/Core/Util/DateTimeHelper.php | 2 +- includes/Core/Util/Deactivation.php | 2 +- includes/Core/Util/EmailNotification.php | 2 +- includes/Core/Util/Helper.php | 4 ++-- includes/Core/Util/Hooks.php | 2 +- includes/Core/Util/HttpHelper.php | 2 +- includes/Core/Util/IpTool.php | 2 +- includes/Core/Util/Multisite.php | 2 +- includes/Core/Util/Post.php | 2 +- includes/Core/Util/Request.php | 2 +- includes/Core/Util/Route.php | 2 +- includes/Core/Util/SmartTags.php | 2 +- includes/Core/Util/StoreInCache.php | 4 ++-- includes/Core/Util/UnInstallation.php | 2 +- includes/Core/Util/User.php | 2 +- includes/Flow/Flow.php | 20 ++++++++--------- includes/Flow/FlowController.php | 8 +++---- includes/Log/LogHandler.php | 12 +++++----- includes/Plugin.php | 22 +++++++++---------- includes/Routes/ajax.php | 18 +++++++-------- includes/Routes/api.php | 10 ++++----- .../ActionHook/ActionHookController.php | 6 ++--- includes/Triggers/ActionHook/Hooks.php | 8 +++---- .../BitAssist/BitAssistController.php | 4 ++-- .../Triggers/BitForm/BitFormController.php | 6 ++--- includes/Triggers/BitForm/Hooks.php | 4 ++-- includes/Triggers/BitForm/Routes.php | 4 ++-- .../BitSocial/BitSocialController.php | 6 ++--- includes/Triggers/BitSocial/Hooks.php | 4 ++-- includes/Triggers/BitSocial/Routes.php | 4 ++-- includes/Triggers/BitSocial/StaticData.php | 2 +- .../Triggers/Breakdance/BreakdanceAction.php | 6 ++--- .../Breakdance/BreakdanceController.php | 4 ++-- .../Triggers/Breakdance/BreakdanceHelper.php | 2 +- includes/Triggers/Breakdance/Hooks.php | 2 +- includes/Triggers/Breakdance/Routes.php | 4 ++-- includes/Triggers/CF7/CF7Controller.php | 8 +++---- includes/Triggers/CF7/Hooks.php | 4 ++-- includes/Triggers/CF7/Routes.php | 4 ++-- .../Elementor/ElementorController.php | 4 ++-- .../Triggers/Elementor/ElementorHelper.php | 4 ++-- includes/Triggers/Elementor/Hooks.php | 4 ++-- includes/Triggers/Elementor/Routes.php | 4 ++-- .../FallbackTrigger/FallbackHooks.php | 2 +- .../FallbackTriggerController.php | 4 ++-- includes/Triggers/FallbackTrigger/Hooks.php | 10 ++++----- .../FallbackTrigger/TriggerFallback.php | 10 ++++----- includes/Triggers/TriggerController.php | 8 +++---- includes/Triggers/WC/Hooks.php | 4 ++-- includes/Triggers/WC/Routes.php | 4 ++-- includes/Triggers/WC/WCController.php | 6 ++--- includes/Triggers/WC/WCHelper.php | 4 ++-- includes/Triggers/WC/WCStaticFields.php | 4 ++-- includes/Triggers/WPF/Hooks.php | 6 ++--- includes/Triggers/WPF/Routes.php | 4 ++-- includes/Triggers/WPF/WPFController.php | 4 ++-- includes/Triggers/Webhook/Routes.php | 6 ++--- .../Triggers/Webhook/WebhookController.php | 6 ++--- includes/controller/AuthDataController.php | 4 ++-- .../controller/BtcbiAnalyticsController.php | 4 ++-- .../OneClickCredentialController.php | 4 ++-- includes/controller/PostController.php | 4 ++-- includes/controller/UserController.php | 4 ++-- includes/hooks.php | 8 +++---- includes/loader.php | 2 +- 548 files changed, 1409 insertions(+), 1407 deletions(-) diff --git a/includes/Actions/ACPT/ACPTController.php b/includes/Actions/ACPT/ACPTController.php index 18adbcb5e..a4d7781d4 100644 --- a/includes/Actions/ACPT/ACPTController.php +++ b/includes/Actions/ACPT/ACPTController.php @@ -4,9 +4,9 @@ * ACPT Integration */ -namespace BitCode\FI\Actions\ACPT; +namespace BitApps\BTCBI_FI\Actions\ACPT; -use BitCode\FI\Core\Util\HttpHelper; +use BitApps\BTCBI_FI\Core\Util\HttpHelper; use WP_Error; /** diff --git a/includes/Actions/ACPT/ACPTHelper.php b/includes/Actions/ACPT/ACPTHelper.php index f686841a3..87e86f03e 100644 --- a/includes/Actions/ACPT/ACPTHelper.php +++ b/includes/Actions/ACPT/ACPTHelper.php @@ -1,9 +1,9 @@ _accessToken); - $recordApiResponse = $sendPhotoApiHelper->uploadFiles($this->_apiEndPoint, $data, $this->_accessToken, $integrationDetails->selectedChannel); - $recordApiResponse = $this->sendMessages($data, $integrationDetails->selectedChannel); + $recordApiResponse = $sendPhotoApiHelper->uploadFiles($this->_apiEndPoint, $data, $this->_accessToken, $integrationDetails->selectedChannel); + $recordApiResponse = $this->sendMessages($data, $integrationDetails->selectedChannel); } else { $data = [ 'content' => $messagesBody, diff --git a/includes/Actions/Discord/Routes.php b/includes/Actions/Discord/Routes.php index 3755074be..5d91b1289 100644 --- a/includes/Actions/Discord/Routes.php +++ b/includes/Actions/Discord/Routes.php @@ -4,8 +4,8 @@ exit; } -use BitCode\FI\Actions\Discord\DiscordController; -use BitCode\FI\Core\Util\Route; +use BitApps\BTCBI_FI\Actions\Discord\DiscordController; +use BitApps\BTCBI_FI\Core\Util\Route; // Discord Route::post('handle_authorize', [DiscordController::class, 'handleAuthorize']); diff --git a/includes/Actions/Dokan/DokanController.php b/includes/Actions/Dokan/DokanController.php index 23ffdf933..1c4f640eb 100644 --- a/includes/Actions/Dokan/DokanController.php +++ b/includes/Actions/Dokan/DokanController.php @@ -4,7 +4,7 @@ * Dokan Integration */ -namespace BitCode\FI\Actions\Dokan; +namespace BitApps\BTCBI_FI\Actions\Dokan; use WeDevs\DokanPro\Modules\Germanized\Helper; use WP_Error; diff --git a/includes/Actions/Dokan/RecordApiHelper.php b/includes/Actions/Dokan/RecordApiHelper.php index a01e297d1..c82b304db 100644 --- a/includes/Actions/Dokan/RecordApiHelper.php +++ b/includes/Actions/Dokan/RecordApiHelper.php @@ -4,11 +4,11 @@ * Dokan Record Api */ -namespace BitCode\FI\Actions\Dokan; +namespace BitApps\BTCBI_FI\Actions\Dokan; -use BitCode\FI\Core\Util\Common; -use BitCode\FI\Core\Util\Helper; -use BitCode\FI\Log\LogHandler; +use BitApps\BTCBI_FI\Core\Util\Common; +use BitApps\BTCBI_FI\Core\Util\Helper; +use BitApps\BTCBI_FI\Log\LogHandler; use WeDevs\DokanPro\Refund\Validator; /** diff --git a/includes/Actions/Dokan/Routes.php b/includes/Actions/Dokan/Routes.php index 912977176..9af2a9d97 100644 --- a/includes/Actions/Dokan/Routes.php +++ b/includes/Actions/Dokan/Routes.php @@ -4,8 +4,8 @@ exit; } -use BitCode\FI\Actions\Dokan\DokanController; -use BitCode\FI\Core\Util\Route; +use BitApps\BTCBI_FI\Actions\Dokan\DokanController; +use BitApps\BTCBI_FI\Core\Util\Route; Route::post('dokan_authentication', [DokanController::class, 'authentication']); Route::post('dokan_fetch_eu_fields', [DokanController::class, 'getEUFields']); diff --git a/includes/Actions/Drip/DripController.php b/includes/Actions/Drip/DripController.php index a3d9672d7..e7d71ea93 100644 --- a/includes/Actions/Drip/DripController.php +++ b/includes/Actions/Drip/DripController.php @@ -4,9 +4,9 @@ * Drip Integration */ -namespace BitCode\FI\Actions\Drip; +namespace BitApps\BTCBI_FI\Actions\Drip; -use BitCode\FI\Core\Util\HttpHelper; +use BitApps\BTCBI_FI\Core\Util\HttpHelper; use WP_Error; /** diff --git a/includes/Actions/Drip/RecordApiHelper.php b/includes/Actions/Drip/RecordApiHelper.php index 848afc3b1..1c9ce7752 100644 --- a/includes/Actions/Drip/RecordApiHelper.php +++ b/includes/Actions/Drip/RecordApiHelper.php @@ -4,11 +4,11 @@ * Drip Record Api */ -namespace BitCode\FI\Actions\Drip; +namespace BitApps\BTCBI_FI\Actions\Drip; -use BitCode\FI\Core\Util\Common; -use BitCode\FI\Core\Util\HttpHelper; -use BitCode\FI\Log\LogHandler; +use BitApps\BTCBI_FI\Core\Util\Common; +use BitApps\BTCBI_FI\Core\Util\HttpHelper; +use BitApps\BTCBI_FI\Log\LogHandler; /** * Provide functionality for Record insert,update, exist diff --git a/includes/Actions/Drip/Routes.php b/includes/Actions/Drip/Routes.php index 2741bd93e..5ee8e02d3 100644 --- a/includes/Actions/Drip/Routes.php +++ b/includes/Actions/Drip/Routes.php @@ -4,8 +4,8 @@ exit; } -use BitCode\FI\Actions\Drip\DripController; -use BitCode\FI\Core\Util\Route; +use BitApps\BTCBI_FI\Actions\Drip\DripController; +use BitApps\BTCBI_FI\Core\Util\Route; Route::post('drip_authorize', [DripController::class, 'dripAuthorize']); Route::post('drip_fetch_all_custom_fields', [DripController::class, 'getCustomFields']); diff --git a/includes/Actions/Dropbox/DropboxController.php b/includes/Actions/Dropbox/DropboxController.php index 0398f82b5..02b373fff 100644 --- a/includes/Actions/Dropbox/DropboxController.php +++ b/includes/Actions/Dropbox/DropboxController.php @@ -1,11 +1,11 @@ headers->{$spreadsheetId}->{$worksheetName}->{$headerRow}; - + foreach ($fieldMap as $fieldKey => $fieldPair) { if (!empty($fieldPair->googleSheetField)) { if ($fieldPair->formField === 'custom' && isset($fieldPair->customValue)) { @@ -81,12 +81,12 @@ public function execute($spreadsheetId, $worksheetName, $headerRow, $header, $ac $values[] = ''; } } - + $data = []; $data['range'] = "{$worksheetName}!{$headerRow}"; $data['majorDimension'] = "{$header}"; $data['values'][] = $values; - + $recordApiResponse = $this->insertRecord($spreadsheetId, $worksheetName, $header, $headerRow, wp_json_encode($data)); $type = 'insert'; if (isset($recordApiResponse->error)) { diff --git a/includes/Actions/GoogleSheet/Routes.php b/includes/Actions/GoogleSheet/Routes.php index e52155659..0ad6b8443 100644 --- a/includes/Actions/GoogleSheet/Routes.php +++ b/includes/Actions/GoogleSheet/Routes.php @@ -4,8 +4,8 @@ exit; } -use BitCode\FI\Actions\GoogleSheet\GoogleSheetController; -use BitCode\FI\Core\Util\Route; +use BitApps\BTCBI_FI\Actions\GoogleSheet\GoogleSheetController; +use BitApps\BTCBI_FI\Core\Util\Route; Route::post('gsheet_generate_token', [GoogleSheetController::class, 'generateTokens']); Route::post('gsheet_refresh_spreadsheets', [GoogleSheetController::class, 'refreshSpreadsheetsAjaxHelper']); diff --git a/includes/Actions/Gravitec/GravitecController.php b/includes/Actions/Gravitec/GravitecController.php index a2e31761d..7f331199f 100644 --- a/includes/Actions/Gravitec/GravitecController.php +++ b/includes/Actions/Gravitec/GravitecController.php @@ -4,9 +4,9 @@ * Gravitec Integration */ -namespace BitCode\FI\Actions\Gravitec; +namespace BitApps\BTCBI_FI\Actions\Gravitec; -use BitCode\FI\Core\Util\HttpHelper; +use BitApps\BTCBI_FI\Core\Util\HttpHelper; use WP_Error; /** diff --git a/includes/Actions/Gravitec/RecordApiHelper.php b/includes/Actions/Gravitec/RecordApiHelper.php index 706df0f74..8a5d2d201 100644 --- a/includes/Actions/Gravitec/RecordApiHelper.php +++ b/includes/Actions/Gravitec/RecordApiHelper.php @@ -4,10 +4,10 @@ * Gravitec Record Api */ -namespace BitCode\FI\Actions\Gravitec; +namespace BitApps\BTCBI_FI\Actions\Gravitec; -use BitCode\FI\Log\LogHandler; -use BitCode\FI\Core\Util\HttpHelper; +use BitApps\BTCBI_FI\Core\Util\HttpHelper; +use BitApps\BTCBI_FI\Log\LogHandler; /** * Provide functionality for Record insert, upsert diff --git a/includes/Actions/Gravitec/Routes.php b/includes/Actions/Gravitec/Routes.php index 98ccdca81..2e835e064 100644 --- a/includes/Actions/Gravitec/Routes.php +++ b/includes/Actions/Gravitec/Routes.php @@ -4,7 +4,7 @@ exit; } -use BitCode\FI\Actions\Gravitec\GravitecController; -use BitCode\FI\Core\Util\Route; +use BitApps\BTCBI_FI\Actions\Gravitec\GravitecController; +use BitApps\BTCBI_FI\Core\Util\Route; Route::post('gravitec_authentication', [GravitecController::class, 'authentication']); diff --git a/includes/Actions/Groundhogg/GroundhoggController.php b/includes/Actions/Groundhogg/GroundhoggController.php index 70abedcd1..d8e877e33 100644 --- a/includes/Actions/Groundhogg/GroundhoggController.php +++ b/includes/Actions/Groundhogg/GroundhoggController.php @@ -4,9 +4,9 @@ * Groundhogg Integration */ -namespace BitCode\FI\Actions\Groundhogg; +namespace BitApps\BTCBI_FI\Actions\Groundhogg; -use BitCode\FI\Core\Util\HttpHelper; +use BitApps\BTCBI_FI\Core\Util\HttpHelper; use WP_Error; /** diff --git a/includes/Actions/Groundhogg/RecordApiHelper.php b/includes/Actions/Groundhogg/RecordApiHelper.php index 140bf7ce6..c8acd5050 100644 --- a/includes/Actions/Groundhogg/RecordApiHelper.php +++ b/includes/Actions/Groundhogg/RecordApiHelper.php @@ -4,11 +4,11 @@ * Groundhogg Record Api */ -namespace BitCode\FI\Actions\Groundhogg; +namespace BitApps\BTCBI_FI\Actions\Groundhogg; -use BitCode\FI\Core\Util\Common; -use BitCode\FI\Core\Util\HttpHelper; -use BitCode\FI\Log\LogHandler; +use BitApps\BTCBI_FI\Core\Util\Common; +use BitApps\BTCBI_FI\Core\Util\HttpHelper; +use BitApps\BTCBI_FI\Log\LogHandler; /** * Provide functionality for Record insert, upsert diff --git a/includes/Actions/Groundhogg/Routes.php b/includes/Actions/Groundhogg/Routes.php index 75583916f..22691c4a7 100644 --- a/includes/Actions/Groundhogg/Routes.php +++ b/includes/Actions/Groundhogg/Routes.php @@ -4,8 +4,8 @@ exit; } -use BitCode\FI\Actions\Groundhogg\GroundhoggController; -use BitCode\FI\Core\Util\Route; +use BitApps\BTCBI_FI\Actions\Groundhogg\GroundhoggController; +use BitApps\BTCBI_FI\Core\Util\Route; Route::post('groundhogg_authorization_and_fetch_contacts', [GroundhoggController::class, 'fetchAllContacts']); Route::post('groundhogg_fetch_all_tags', [GroundhoggController::class, 'groundhoggFetchAllTags']); diff --git a/includes/Actions/HighLevel/HighLevelController.php b/includes/Actions/HighLevel/HighLevelController.php index 492fcf3df..9410583c4 100644 --- a/includes/Actions/HighLevel/HighLevelController.php +++ b/includes/Actions/HighLevel/HighLevelController.php @@ -4,9 +4,9 @@ * HighLevel Integration */ -namespace BitCode\FI\Actions\HighLevel; +namespace BitApps\BTCBI_FI\Actions\HighLevel; -use BitCode\FI\Core\Util\HttpHelper; +use BitApps\BTCBI_FI\Core\Util\HttpHelper; use WP_Error; /** diff --git a/includes/Actions/HighLevel/RecordApiHelper.php b/includes/Actions/HighLevel/RecordApiHelper.php index 94ade9f5d..a1ad44790 100644 --- a/includes/Actions/HighLevel/RecordApiHelper.php +++ b/includes/Actions/HighLevel/RecordApiHelper.php @@ -4,12 +4,12 @@ * HighLevel Record Api */ -namespace BitCode\FI\Actions\HighLevel; +namespace BitApps\BTCBI_FI\Actions\HighLevel; -use BitCode\FI\Core\Util\Common; -use BitCode\FI\Core\Util\Helper; -use BitCode\FI\Core\Util\HttpHelper; -use BitCode\FI\Log\LogHandler; +use BitApps\BTCBI_FI\Core\Util\Common; +use BitApps\BTCBI_FI\Core\Util\Helper; +use BitApps\BTCBI_FI\Core\Util\HttpHelper; +use BitApps\BTCBI_FI\Log\LogHandler; /** * Provide functionality for Record insert,update, exist diff --git a/includes/Actions/HighLevel/Routes.php b/includes/Actions/HighLevel/Routes.php index b17aa2d3f..bc669bf13 100644 --- a/includes/Actions/HighLevel/Routes.php +++ b/includes/Actions/HighLevel/Routes.php @@ -4,8 +4,8 @@ exit; } -use BitCode\FI\Actions\HighLevel\HighLevelController; -use BitCode\FI\Core\Util\Route; +use BitApps\BTCBI_FI\Actions\HighLevel\HighLevelController; +use BitApps\BTCBI_FI\Core\Util\Route; Route::post('highLevel_authorization', [HighLevelController::class, 'highLevelAuthorization']); Route::post('get_highLevel_contact_custom_fields', [HighLevelController::class, 'getCustomFields']); diff --git a/includes/Actions/Hubspot/HubspotController.php b/includes/Actions/Hubspot/HubspotController.php index 0830bb895..0dfd1e0e7 100644 --- a/includes/Actions/Hubspot/HubspotController.php +++ b/includes/Actions/Hubspot/HubspotController.php @@ -1,9 +1,9 @@ _defaultHeader); } @@ -109,7 +109,7 @@ public function execute( $customFieldMap ) { $finalData = $this->generateReqDataFromFieldMap($fieldValues, $fieldMap); - $customProperties = apply_filters('btcbi_omnisend_custom_properties', (object) [], $customFieldMap,$fieldValues); + $customProperties = apply_filters('btcbi_omnisend_custom_properties', (object) [], $customFieldMap, $fieldValues); $apiResponse = $this->addContact( $channels, $emailStatus, diff --git a/includes/Actions/OmniSend/Routes.php b/includes/Actions/OmniSend/Routes.php index 6d19cd127..68cc1c858 100644 --- a/includes/Actions/OmniSend/Routes.php +++ b/includes/Actions/OmniSend/Routes.php @@ -4,7 +4,7 @@ exit; } -use BitCode\FI\Actions\OmniSend\OmniSendController; -use BitCode\FI\Core\Util\Route; +use BitApps\BTCBI_FI\Actions\OmniSend\OmniSendController; +use BitApps\BTCBI_FI\Core\Util\Route; Route::post('Omnisend_authorization', [OmniSendController::class, 'authorization']); diff --git a/includes/Actions/OneDrive/OneDriveController.php b/includes/Actions/OneDrive/OneDriveController.php index 49c9b43d2..f73203f8d 100644 --- a/includes/Actions/OneDrive/OneDriveController.php +++ b/includes/Actions/OneDrive/OneDriveController.php @@ -1,11 +1,11 @@ $integrationDetails->channel_id, 'initial_comment' => $messagesBody, - 'text' => $messagesBody, - 'parse_mode' => $integrationDetails->parse_mode, - 'file' => is_array($file) ? $file[0] : $file + 'text' => $messagesBody, + 'parse_mode' => $integrationDetails->parse_mode, + 'file' => \is_array($file) ? $file[0] : $file ]; $sendPhotoApiHelper = new FilesApiHelper($this->_accessToken); - $recordApiResponse = $sendPhotoApiHelper->uploadFiles($this->_apiEndPoint, $data, $this->_accessToken); + $recordApiResponse = $sendPhotoApiHelper->uploadFiles($this->_apiEndPoint, $data, $this->_accessToken); } else { $data = [ 'channel' => $integrationDetails->channel_id, diff --git a/includes/Actions/Slack/Routes.php b/includes/Actions/Slack/Routes.php index 0542697bc..32b4f7ef4 100644 --- a/includes/Actions/Slack/Routes.php +++ b/includes/Actions/Slack/Routes.php @@ -4,8 +4,8 @@ exit; } -use BitCode\FI\Actions\Slack\SlackController; -use BitCode\FI\Core\Util\Route; +use BitApps\BTCBI_FI\Actions\Slack\SlackController; +use BitApps\BTCBI_FI\Core\Util\Route; // Slack Route::post('slack_authorization_and_fetch_channels', [SlackController::class, 'checkAuthorizationAndFetchChannels']); diff --git a/includes/Actions/Slack/SlackController.php b/includes/Actions/Slack/SlackController.php index 186e030cd..720c0dd90 100644 --- a/includes/Actions/Slack/SlackController.php +++ b/includes/Actions/Slack/SlackController.php @@ -4,9 +4,9 @@ * slack Integration */ -namespace BitCode\FI\Actions\Slack; +namespace BitApps\BTCBI_FI\Actions\Slack; -use BitCode\FI\Core\Util\HttpHelper; +use BitApps\BTCBI_FI\Core\Util\HttpHelper; use WP_Error; /** diff --git a/includes/Actions/SliceWp/RecordApiHelper.php b/includes/Actions/SliceWp/RecordApiHelper.php index 3da85aaad..d32ef478c 100644 --- a/includes/Actions/SliceWp/RecordApiHelper.php +++ b/includes/Actions/SliceWp/RecordApiHelper.php @@ -1,9 +1,9 @@ update($multiSelectValues); diff --git a/includes/Actions/Voxel/VoxelTasks.php b/includes/Actions/Voxel/VoxelTasks.php index 6a50ce41b..0be85341c 100644 --- a/includes/Actions/Voxel/VoxelTasks.php +++ b/includes/Actions/Voxel/VoxelTasks.php @@ -1,6 +1,6 @@ data[0]->code === 'SUCCESS' && !empty($recordApiResponse->data[0]->details->id) ) { - if (!empty($actions->tag_rec) && class_exists('BitCode\FI\Actions\ZohoCRM\TagApiHelper')) { + if (!empty($actions->tag_rec) && class_exists('BitApps\BTCBI_FI\Actions\ZohoCRM\TagApiHelper')) { $tags = ''; $tag_rec = explode(',', $actions->tag_rec); foreach ($tag_rec as $tag) { diff --git a/includes/Actions/ZohoCRM/Routes.php b/includes/Actions/ZohoCRM/Routes.php index 8ca7ad92b..90ea24c10 100644 --- a/includes/Actions/ZohoCRM/Routes.php +++ b/includes/Actions/ZohoCRM/Routes.php @@ -4,8 +4,8 @@ exit; } -use BitCode\FI\Actions\ZohoCRM\ZohoCRMController; -use BitCode\FI\Core\Util\Route; +use BitApps\BTCBI_FI\Actions\ZohoCRM\ZohoCRMController; +use BitApps\BTCBI_FI\Core\Util\Route; Route::post('zcrm_get_users', [ZohoCRMController::class, 'refreshUsersAjaxHelper']); Route::post('zcrm_get_tags', [ZohoCRMController::class, 'refreshTagListAjaxHelper']); diff --git a/includes/Actions/ZohoCRM/TagApiHelper.php b/includes/Actions/ZohoCRM/TagApiHelper.php index 6c161b6ad..f379ff7af 100644 --- a/includes/Actions/ZohoCRM/TagApiHelper.php +++ b/includes/Actions/ZohoCRM/TagApiHelper.php @@ -1,11 +1,12 @@ */ -namespace BitCode\FI\Core\Database; +namespace BitApps\BTCBI_FI\Core\Database; /** * Database Migration diff --git a/includes/Core/Database/FlowModel.php b/includes/Core/Database/FlowModel.php index 545bfad6e..b6f67bf0f 100644 --- a/includes/Core/Database/FlowModel.php +++ b/includes/Core/Database/FlowModel.php @@ -1,9 +1,10 @@ ['required' => true]]); diff --git a/includes/Triggers/ActionHook/ActionHookController.php b/includes/Triggers/ActionHook/ActionHookController.php index 6e83f27dc..5bf9bc45b 100644 --- a/includes/Triggers/ActionHook/ActionHookController.php +++ b/includes/Triggers/ActionHook/ActionHookController.php @@ -1,10 +1,10 @@ prefix . 'bp_xprofile_fields'; - $query = "SELECT id, type, name FROM " . esc_sql($table_name); + $query = 'SELECT id, type, name FROM ' . esc_sql($table_name); return $wpdb->get_results($query); } diff --git a/includes/Triggers/TriggerController.php b/includes/Triggers/TriggerController.php index 0d1c7a5cd..84842ccd7 100644 --- a/includes/Triggers/TriggerController.php +++ b/includes/Triggers/TriggerController.php @@ -1,10 +1,10 @@ Date: Sat, 14 Feb 2026 16:23:02 +0600 Subject: [PATCH 05/23] fix: filter hooks prefix --- includes/Actions/FluentCrm/RecordApiHelper.php | 2 +- .../Actions/WishlistMember/RecordApiHelper.php | 14 +++++++------- includes/Admin/Admin_Bar.php | 1 - includes/Triggers/TriggerController.php | 4 ++-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/includes/Actions/FluentCrm/RecordApiHelper.php b/includes/Actions/FluentCrm/RecordApiHelper.php index 7b2e050de..47867d721 100644 --- a/includes/Actions/FluentCrm/RecordApiHelper.php +++ b/includes/Actions/FluentCrm/RecordApiHelper.php @@ -134,7 +134,7 @@ public function removeUser($data) public function execute($fieldValues, $fieldMap, $actions, $list_id, $tags, $actionName) { - $fieldData = apply_filters('fluent_crm_assign_company', [], (array) $actions); + $fieldData = apply_filters('btcbi_fluent_crm_assign_company', [], (array) $actions); foreach ($fieldMap as $fieldKey => $fieldPair) { if (!empty($fieldPair->fluentCRMField)) { diff --git a/includes/Actions/WishlistMember/RecordApiHelper.php b/includes/Actions/WishlistMember/RecordApiHelper.php index 43732355d..ddc76c249 100644 --- a/includes/Actions/WishlistMember/RecordApiHelper.php +++ b/includes/Actions/WishlistMember/RecordApiHelper.php @@ -50,7 +50,7 @@ public function updateLevel($finalData) } return self::handleFilterResponse( - apply_filters('wishlist_update_level', false, $finalData) + apply_filters('btcbi_wishlist_update_level', false, $finalData) ); } @@ -64,7 +64,7 @@ public function deleteLevel($finalData) } return self::handleFilterResponse( - apply_filters('wishlist_delete_level', false, $finalData) + apply_filters('btcbi_wishlist_delete_level', false, $finalData) ); } @@ -84,7 +84,7 @@ public function createMember($finalData) } return self::handleFilterResponse( - apply_filters('wishlist_create_member', false, $finalData, $levelId, $this->_integrationID) + apply_filters('btcbi_wishlist_create_member', false, $finalData, $levelId, $this->_integrationID) ); } @@ -156,28 +156,28 @@ public function execute($fieldValues, $fieldMap, $action) case 'update_member': $type = 'member'; $type_name = 'Update Member'; - $recordApiResponse = $this->handleMemberEvents($finalData, 'wishlist_update_member'); + $recordApiResponse = $this->handleMemberEvents($finalData, 'btcbi_wishlist_update_member'); break; case 'delete_member': $type = 'member'; $type_name = 'Delete Member'; - $recordApiResponse = $this->handleMemberEvents($finalData, 'wishlist_delete_member'); + $recordApiResponse = $this->handleMemberEvents($finalData, 'btcbi_wishlist_delete_member'); break; case 'add_member_to_level': $type = 'member'; $type_name = 'Add Member To Level'; - $recordApiResponse = $this->handleMemberAddOrRemoveFromLevel($finalData, 'wishlist_add_member_to_level'); + $recordApiResponse = $this->handleMemberAddOrRemoveFromLevel($finalData, 'btcbi_wishlist_add_member_to_level'); break; case 'remove_member_from_level': $type = 'member'; $type_name = 'Remove Member From Level'; - $recordApiResponse = $this->handleMemberAddOrRemoveFromLevel($finalData, 'wishlist_remove_member_from_level'); + $recordApiResponse = $this->handleMemberAddOrRemoveFromLevel($finalData, 'btcbi_wishlist_remove_member_from_level'); break; diff --git a/includes/Admin/Admin_Bar.php b/includes/Admin/Admin_Bar.php index ac0b6c6a6..dee0d32ff 100644 --- a/includes/Admin/Admin_Bar.php +++ b/includes/Admin/Admin_Bar.php @@ -16,7 +16,6 @@ public function register() Hooks::add('in_admin_header', [$this, 'RemoveAdminNotices']); Hooks::add('admin_menu', [$this, 'AdminMenu']); Hooks::add('admin_enqueue_scripts', [$this, 'AdminAssets']); - // Hooks::filter('btcbi_localized_script', [$this, 'filterAdminScriptVar']); add_filter('script_loader_tag', [$this, 'scriptTagFilter'], 0, 3); add_filter('script_loader_src', [$this, 'removeQueryParam'], 99999, 3); } diff --git a/includes/Triggers/TriggerController.php b/includes/Triggers/TriggerController.php index 84842ccd7..e57323114 100644 --- a/includes/Triggers/TriggerController.php +++ b/includes/Triggers/TriggerController.php @@ -35,7 +35,7 @@ public static function triggerList() $triggers = array_merge($triggers, AllTriggersName::allTriggersName()); } - return Hooks::apply('bit_integrations_triggers', $triggers); + return Hooks::apply('btcbi_triggers', $triggers); } public static function getTriggerField($triggerName, $data) @@ -51,7 +51,7 @@ public static function getTriggerField($triggerName, $data) return $trigger::fields($data->id); } } else { - return Hooks::apply('bit_integrations_trigger_fields', $triggerName, $data); + return Hooks::apply('btcbi_trigger_fields', $triggerName, $data); } return []; From 45a8ef6d127bc3510f9dc4180e7655b6d9d1fc77 Mon Sep 17 00:00:00 2001 From: Rishad Alam <101513331+RishadAlam@users.noreply.github.com> Date: Sat, 14 Feb 2026 17:20:57 +0600 Subject: [PATCH 06/23] fix: update GoogleSheet integration and remove OneClickCredentialController - Updated GoogleSheet components and common functions - Modified ajax.php routes - Removed OneClickCredentialController.php - Added EXTERNAL-SERVICES.md documentation - Updated readme.txt --- EXTERNAL-SERVICES.md | 2319 +++++++++++++++++ .../GoogleSheet/GoogleSheet.jsx | 13 - .../GoogleSheet/GoogleSheetAuthorization.jsx | 75 - .../GoogleSheet/GoogleSheetCommonFunc.js | 62 +- includes/Routes/ajax.php | 3 - .../OneClickCredentialController.php | 16 - readme.txt | 10 + 7 files changed, 2345 insertions(+), 153 deletions(-) create mode 100644 EXTERNAL-SERVICES.md delete mode 100644 includes/controller/OneClickCredentialController.php diff --git a/EXTERNAL-SERVICES.md b/EXTERNAL-SERVICES.md new file mode 100644 index 000000000..b1b22f116 --- /dev/null +++ b/EXTERNAL-SERVICES.md @@ -0,0 +1,2319 @@ +# External Services Documentation + +Bit Integrations connects to various third-party external services to enable automation workflows between WordPress and 300+ platforms. This document provides comprehensive information about all external services used by this plugin, including what data is sent, when it's sent, and links to each service's terms of service and privacy policies. + +**Important**: Data is only sent to external services when you actively configure and enable an integration. No data is transmitted unless you explicitly create a workflow that connects to a specific service. + +--- + +## Table of Contents + +- [Google Services](#google-services) +- [Zoho Services](#zoho-services) +- [Meta (Facebook) Services](#meta-facebook-services) +- [Email Marketing Services](#email-marketing-services) +- [CRM Services](#crm-services) +- [Project Management Services](#project-management-services) +- [Communication Services](#communication-services) +- [Storage Services](#storage-services) +- [Automation Platform Services](#automation-platform-services) +- [Learning Management Systems](#learning-management-systems) +- [E-commerce Services](#e-commerce-services) +- [Marketing Automation Services](#marketing-automation-services) +- [Other Third-Party Services](#other-third-party-services) + +--- + +## Google Services + +### Google Sheets + +**Service URL**: `https://sheets.googleapis.com/` and `https://oauth2.googleapis.com/` + +**What it does**: Enables syncing form submissions, WooCommerce orders, user registrations, and other WordPress data to Google Sheets spreadsheets. + +**Data sent**: + +- User-configured field mappings (name, email, custom fields, etc.) +- OAuth credentials for authentication +- Spreadsheet IDs and worksheet names +- Data is sent when a configured trigger event occurs (e.g., form submission, new order) + +**When data is sent**: When a workflow is triggered based on configured events (form submissions, purchases, registrations, etc.). + +**Terms of Service**: [Google Terms of Service](https://policies.google.com/terms) +**Privacy Policy**: [Google Privacy Policy](https://policies.google.com/privacy) + +--- + +### Google Calendar + +**Service URL**: `https://www.googleapis.com/calendar/` and `https://oauth2.googleapis.com/` + +**What it does**: Creates calendar events automatically when WordPress actions occur (bookings, registrations, etc.). + +**Data sent**: + +- Event details (title, description, date/time, location) +- OAuth credentials for authentication +- User email addresses for event invitations +- Data is sent when a configured trigger occurs + +**When data is sent**: When a workflow is triggered based on configured events. + +**Terms of Service**: [Google Terms of Service](https://policies.google.com/terms) +**Privacy Policy**: [Google Privacy Policy](https://policies.google.com/privacy) + +--- + +### Google Drive + +**Service URL**: `https://www.googleapis.com/drive/` and `https://oauth2.googleapis.com/` + +**What it does**: Uploads files from WordPress forms, media library, or other sources to Google Drive folders. + +**Data sent**: + +- File contents and metadata +- OAuth credentials for authentication +- Folder IDs and file names +- Data is sent when file upload workflows are triggered + +**When data is sent**: When a workflow with file upload is triggered. + +**Terms of Service**: [Google Terms of Service](https://policies.google.com/terms) +**Privacy Policy**: [Google Privacy Policy](https://policies.google.com/privacy) + +--- + +### Google Contacts + +**Service URL**: `https://people.googleapis.com/` and `https://oauth2.googleapis.com/` + +**What it does**: Syncs contact information from WordPress to Google Contacts. + +**Data sent**: + +- Contact details (names, emails, phone numbers, addresses) +- OAuth credentials for authentication +- Custom fields as configured +- Data is sent when contact-related workflows are triggered + +**When data is sent**: When a workflow is triggered based on configured events. + +**Terms of Service**: [Google Terms of Service](https://policies.google.com/terms) +**Privacy Policy**: [Google Privacy Policy](https://policies.google.com/privacy) + +--- + +## Zoho Services + +### Zoho CRM + +**Service URL**: `https://www.zohoapis.{dataCenter}/crm/` + +**What it does**: Syncs leads, contacts, deals, and other CRM data from WordPress to Zoho CRM. + +**Data sent**: + +- Contact information (name, email, phone, address) +- Custom field data as configured in workflows +- Lead and deal information +- OAuth credentials for authentication +- Data is sent when configured trigger events occur + +**When data is sent**: When workflows are triggered based on form submissions, purchases, or other configured events. + +**Terms of Service**: [Zoho Terms of Service](https://www.zoho.com/terms.html) +**Privacy Policy**: [Zoho Privacy Policy](https://www.zoho.com/privacy.html) + +--- + +### Zoho Campaigns + +**Service URL**: `https://campaigns.zoho.{dataCenter}/` + +**What it does**: Adds subscribers to email marketing lists in Zoho Campaigns. + +**Data sent**: + +- Subscriber information (email, name, custom fields) +- List IDs and contact preferences +- Authentication tokens +- Data is sent when subscription workflows are triggered + +**When data is sent**: When users opt-in via forms or other configured triggers. + +**Terms of Service**: [Zoho Terms of Service](https://www.zoho.com/terms.html) +**Privacy Policy**: [Zoho Privacy Policy](https://www.zoho.com/privacy.html) + +--- + +### Zoho Desk + +**Service URL**: `https://desk.zoho.{dataCenter}/` + +**What it does**: Creates support tickets in Zoho Desk from WordPress forms or other sources. + +**Data sent**: + +- Ticket details (subject, description, priority) +- Contact information (name, email) +- File attachments when configured +- Department and organization IDs +- Authentication tokens + +**When data is sent**: When ticket creation workflows are triggered. + +**Terms of Service**: [Zoho Terms of Service](https://www.zoho.com/terms.html) +**Privacy Policy**: [Zoho Privacy Policy](https://www.zoho.com/privacy.html) + +--- + +### Zoho Sheet + +**Service URL**: `https://sheet.zoho.{dataCenter}/` + +**What it does**: Syncs data from WordPress to Zoho Sheet spreadsheets. + +**Data sent**: + +- User-configured field mappings +- Spreadsheet and worksheet identifiers +- Authentication tokens +- Data records based on trigger events + +**When data is sent**: When configured workflow triggers occur. + +**Terms of Service**: [Zoho Terms of Service](https://www.zoho.com/terms.html) +**Privacy Policy**: [Zoho Privacy Policy](https://www.zoho.com/privacy.html) + +--- + +### Zoho Creator + +**Service URL**: `https://creator.zoho.{dataCenter}/` + +**What it does**: Submits form data to custom Zoho Creator applications. + +**Data sent**: + +- Form field data as configured +- Application and form identifiers +- Authentication tokens + +**When data is sent**: When form submission workflows are triggered. + +**Terms of Service**: [Zoho Terms of Service](https://www.zoho.com/terms.html) +**Privacy Policy**: [Zoho Privacy Policy](https://www.zoho.com/privacy.html) + +--- + +### Zoho Bigin + +**Service URL**: `https://www.zohoapis.{dataCenter}/bigin/` + +**What it does**: Syncs pipeline and contact data to Zoho Bigin CRM. + +**Data sent**: + +- Contact and company information +- Pipeline and deal data +- Custom fields as configured +- Authentication tokens + +**When data is sent**: When CRM sync workflows are triggered. + +**Terms of Service**: [Zoho Terms of Service](https://www.zoho.com/terms.html) +**Privacy Policy**: [Zoho Privacy Policy](https://www.zoho.com/privacy.html) + +--- + +### Zoho Marketing Hub + +**Service URL**: `https://marketinghub.zoho.{dataCenter}/` + +**What it does**: Manages leads and email subscribers in Zoho Marketing Hub. + +**Data sent**: + +- Lead information (name, email, custom fields) +- List subscriptions +- Authentication tokens + +**When data is sent**: When lead generation workflows are triggered. + +**Terms of Service**: [Zoho Terms of Service](https://www.zoho.com/terms.html) +**Privacy Policy**: [Zoho Privacy Policy](https://www.zoho.com/privacy.html) + +--- + +### Zoho Recruit + +**Service URL**: `https://recruit.zoho.{dataCenter}/` + +**What it does**: Manages candidate applications and job postings. + +**Data sent**: + +- Candidate information (resume, contact details) +- Job application data +- File attachments (resumes, documents) +- Authentication tokens + +**When data is sent**: When recruitment workflows are triggered. + +**Terms of Service**: [Zoho Terms of Service](https://www.zoho.com/terms.html) +**Privacy Policy**: [Zoho Privacy Policy](https://www.zoho.com/privacy.html) + +--- + +### Zoho Projects + +**Service URL**: `https://projectsapi.zoho.{dataCenter}/` + +**What it does**: Creates and manages projects, tasks, and bugs in Zoho Projects. + +**Data sent**: + +- Project and task details +- User assignments +- File attachments +- Time tracking data +- Authentication tokens + +**When data is sent**: When project management workflows are triggered. + +**Terms of Service**: [Zoho Terms of Service](https://www.zoho.com/terms.html) +**Privacy Policy**: [Zoho Privacy Policy](https://www.zoho.com/privacy.html) + +--- + +### Zoho Analytics + +**Service URL**: `https://analyticsapi.zoho.{dataCenter}/` + +**What it does**: Syncs data to Zoho Analytics for reporting and visualization. + +**Data sent**: + +- Configured data records for reporting +- Table and database identifiers +- Authentication tokens + +**When data is sent**: When analytics sync workflows are triggered. + +**Terms of Service**: [Zoho Terms of Service](https://www.zoho.com/terms.html) +**Privacy Policy**: [Zoho Privacy Policy](https://www.zoho.com/privacy.html) + +--- + +### Zoho Flow + +**Service URL**: `https://flow.zoho.{dataCenter}/` + +**What it does**: Triggers automation workflows in Zoho Flow. + +**Data sent**: + +- Webhook payload data as configured +- Trigger event information +- Authentication data + +**When data is sent**: When configured trigger events occur in WordPress. + +**Terms of Service**: [Zoho Terms of Service](https://www.zoho.com/terms.html) +**Privacy Policy**: [Zoho Privacy Policy](https://www.zoho.com/privacy.html) + +--- + +## Meta (Facebook) Services + +### WhatsApp Business API + +**Service URL**: `https://graph.facebook.com/v20.0/` + +**What it does**: Sends WhatsApp messages to users via WhatsApp Business API. + +**Data sent**: + +- Phone numbers +- Message content and templates +- Business Account IDs +- Access tokens for authentication +- Data is sent when messaging workflows are triggered + +**When data is sent**: When configured trigger events occur (form submissions, order confirmations, etc.). + +**Terms of Service**: [Meta Terms of Service](https://www.facebook.com/terms.php) +**Privacy Policy**: [Meta Privacy Policy](https://www.facebook.com/privacy/policy/) +**WhatsApp Business Terms**: [WhatsApp Business Terms](https://www.whatsapp.com/legal/business-terms) + +--- + +## Email Marketing Services + +### Mailchimp + +**Service URL**: `https://{{dc}}.api.mailchimp.com/` + +**What it does**: Manages email subscribers and audience lists in Mailchimp. + +**Data sent**: + +- Subscriber information (email, name, custom merge fields) +- List IDs and audience segments +- Tag assignments +- API keys for authentication + +**When data is sent**: When users subscribe via forms or other configured triggers. + +**Terms of Service**: [Mailchimp Terms of Use](https://mailchimp.com/legal/terms/) +**Privacy Policy**: [Mailchimp Privacy Policy](https://mailchimp.com/legal/privacy/) + +--- + +### ActiveCampaign + +**Service URL**: Account-specific URL (e.g., `https://account.api-us1.com/`) + +**What it does**: Manages contacts, lists, and automation in ActiveCampaign. + +**Data sent**: + +- Contact information (email, name, phone, address) +- Custom field data +- List subscriptions and tags +- API credentials + +**When data is sent**: When contact management workflows are triggered. + +**Terms of Service**: [ActiveCampaign Terms of Service](https://www.activecampaign.com/legal/terms-of-service) +**Privacy Policy**: [ActiveCampaign Privacy Policy](https://www.activecampaign.com/legal/privacy-policy) + +--- + +### SendinBlue (Brevo) + +**Service URL**: `https://api.sendinblue.com/` or `https://api.brevo.com/` + +**What it does**: Manages email contacts and sends transactional emails. + +**Data sent**: + +- Contact details (email, name, attributes) +- List IDs +- Email content for transactional emails +- API keys + +**When data is sent**: When email marketing workflows are triggered. + +**Terms of Service**: [Brevo Terms and Conditions](https://www.brevo.com/legal/termsofuse/) +**Privacy Policy**: [Brevo Privacy Policy](https://www.brevo.com/legal/privacypolicy/) + +--- + +### MailerLite + +**Service URL**: `https://api.mailerlite.com/` + +**What it does**: Manages subscribers and email campaigns in MailerLite. + +**Data sent**: + +- Subscriber information (email, name, custom fields) +- Group assignments +- API keys for authentication + +**When data is sent**: When subscription workflows are triggered. + +**Terms of Service**: [MailerLite Terms of Service](https://www.mailerlite.com/legal/terms-of-service) +**Privacy Policy**: [MailerLite Privacy Policy](https://www.mailerlite.com/legal/privacy-policy) + +--- + +### ConvertKit + +**Service URL**: `https://api.convertkit.com/` + +**What it does**: Manages email subscribers and automation sequences. + +**Data sent**: + +- Subscriber email addresses and names +- Tag and form IDs +- Custom field data +- API keys and secrets + +**When data is sent**: When email opt-in workflows are triggered. + +**Terms of Service**: [ConvertKit Terms of Service](https://convertkit.com/terms) +**Privacy Policy**: [ConvertKit Privacy Policy](https://convertkit.com/privacy) + +--- + +### GetResponse + +**Service URL**: `https://api.getresponse.com/` + +**What it does**: Manages email contacts and marketing campaigns. + +**Data sent**: + +- Contact information (email, name, custom fields) +- Campaign and list assignments +- API keys + +**When data is sent**: When marketing automation workflows are triggered. + +**Terms of Service**: [GetResponse Terms of Service](https://www.getresponse.com/legal/terms-of-service) +**Privacy Policy**: [GetResponse Privacy Policy](https://www.getresponse.com/legal/privacy) + +--- + +### Klaviyo + +**Service URL**: `https://a.klaviyo.com/` + +**What it does**: Manages customer profiles and email/SMS marketing for e-commerce. + +**Data sent**: + +- Customer profiles (email, phone, name) +- Purchase history and order data +- Custom properties +- List memberships +- API keys + +**When data is sent**: When e-commerce or marketing workflows are triggered. + +**Terms of Service**: [Klaviyo Terms of Service](https://www.klaviyo.com/legal/terms-of-service) +**Privacy Policy**: [Klaviyo Privacy Policy](https://www.klaviyo.com/legal/privacy) + +--- + +### SendGrid + +**Service URL**: `https://api.sendgrid.com/` + +**What it does**: Sends transactional and marketing emails via SendGrid. + +**Data sent**: + +- Email addresses (sender and recipients) +- Email content (subject, body, attachments) +- API keys for authentication + +**When data is sent**: When email sending workflows are triggered. + +**Terms of Service**: [SendGrid Terms of Service](https://www.twilio.com/legal/tos) +**Privacy Policy**: [SendGrid Privacy Policy](https://www.twilio.com/legal/privacy) + +--- + +### Moosend + +**Service URL**: `https://api.moosend.com/` + +**What it does**: Manages email subscribers and marketing automation. + +**Data sent**: + +- Subscriber details (email, name, custom fields) +- Mailing list IDs +- API keys + +**When data is sent**: When email marketing workflows are triggered. + +**Terms of Service**: [Moosend Terms of Service](https://moosend.com/terms/) +**Privacy Policy**: [Moosend Privacy Policy](https://moosend.com/privacy-policy/) + +--- + +### Omnisend + +**Service URL**: `https://api.omnisend.com/` + +**What it does**: Manages e-commerce email and SMS marketing. + +**Data sent**: + +- Contact information (email, phone) +- Purchase data and order history +- Custom properties +- API keys + +**When data is sent**: When e-commerce marketing workflows are triggered. + +**Terms of Service**: [Omnisend Terms of Use](https://www.omnisend.com/terms-of-use/) +**Privacy Policy**: [Omnisend Privacy Policy](https://www.omnisend.com/privacy/) + +--- + +### Drip + +**Service URL**: `https://api.getdrip.com/` + +**What it does**: Manages subscribers and e-commerce marketing automation. + +**Data sent**: + +- Subscriber information (email, name, tags) +- E-commerce events and order data +- Custom fields +- API tokens + +**When data is sent**: When marketing automation workflows are triggered. + +**Terms of Service**: [Drip Terms of Service](https://www.drip.com/terms) +**Privacy Policy**: [Drip Privacy Policy](https://www.drip.com/privacy) + +--- + +### Sendy + +**Service URL**: User's self-hosted installation URL + +**What it does**: Manages email subscribers in self-hosted Sendy installations. + +**Data sent**: + +- Subscriber email addresses and names +- List IDs +- Custom fields +- API keys + +**When data is sent**: When subscription workflows are triggered. + +**Terms of Service**: Varies by installation +**Privacy Policy**: Varies by installation + +--- + +### MailPoet + +**Service URL**: `https://api.mailpoet.com/` (for sending service) + +**What it does**: Manages email subscribers within WordPress using MailPoet plugin. + +**Data sent**: + +- Subscriber information (email, name, custom fields) +- List subscriptions +- Sending service data (when using MailPoet Sending Service) + +**When data is sent**: When subscription workflows are triggered; email content sent when using MailPoet Sending Service. + +**Terms of Service**: [MailPoet Terms of Service](https://www.mailpoet.com/terms/) +**Privacy Policy**: [MailPoet Privacy Policy](https://www.mailpoet.com/privacy-notice/) + +--- + +### SendPulse + +**Service URL**: `https://api.sendpulse.com/` + +**What it does**: Manages multi-channel marketing (email, SMS, web push). + +**Data sent**: + +- Contact information (email, phone, name) +- Mailing list data +- Custom variables +- API credentials + +**When data is sent**: When multi-channel marketing workflows are triggered. + +**Terms of Service**: [SendPulse Terms of Service](https://sendpulse.com/legal/termsofuse) +**Privacy Policy**: [SendPulse Privacy Policy](https://sendpulse.com/legal/privacy) + +--- + +### Acumbamail + +**Service URL**: `https://acumbamail.com/api/` + +**What it does**: Manages email marketing campaigns and subscribers. + +**Data sent**: + +- Subscriber data (email, name, custom fields) +- List assignments +- API authentication tokens + +**When data is sent**: When email marketing workflows are triggered. + +**Terms of Service**: [Acumbamail Terms](https://acumbamail.com/terminos-condiciones/) +**Privacy Policy**: [Acumbamail Privacy Policy](https://acumbamail.com/politica-privacidad/) + +--- + +### EmailOctopus + +**Service URL**: `https://emailoctopus.com/api/` + +**What it does**: Manages email lists and campaigns. + +**Data sent**: + +- Email addresses and contact details +- List IDs +- Custom fields +- API keys + +**When data is sent**: When subscriber management workflows are triggered. + +**Terms of Service**: [EmailOctopus Terms of Service](https://emailoctopus.com/legal/terms) +**Privacy Policy**: [EmailOctopus Privacy Policy](https://emailoctopus.com/legal/privacy) + +--- + +### BenchMark + +**Service URL**: `https://clientapi.benchmarkemail.com/` + +**What it does**: Manages email contacts and marketing campaigns. + +**Data sent**: + +- Contact information (email, name, fields) +- List subscriptions +- API credentials + +**When data is sent**: When email marketing workflows are triggered. + +**Terms of Service**: [Benchmark Terms of Service](https://www.benchmarkemail.com/terms-of-service/) +**Privacy Policy**: [Benchmark Privacy Policy](https://www.benchmarkemail.com/privacy-policy/) + +--- + +### ElasticEmail + +**Service URL**: `https://api.elasticemail.com/` + +**What it does**: Sends emails and manages email contacts. + +**Data sent**: + +- Email content and addresses +- Contact list data +- API keys + +**When data is sent**: When email sending workflows are triggered. + +**Terms of Service**: [Elastic Email Terms of Service](https://elasticemail.com/resources/usage-policies/terms-of-use/) +**Privacy Policy**: [Elastic Email Privacy Policy](https://elasticemail.com/resources/usage-policies/privacy-policy/) + +--- + +## CRM Services + +### HubSpot + +**Service URL**: `https://api.hubapi.com/` + +**What it does**: Manages contacts, companies, deals, and tickets in HubSpot CRM. + +**Data sent**: + +- Contact information (email, name, phone, address) +- Company and deal data +- Custom properties +- Activity and engagement data +- API keys or OAuth tokens + +**When data is sent**: When CRM workflows are triggered by form submissions, purchases, or other events. + +**Terms of Service**: [HubSpot Terms of Service](https://legal.hubspot.com/terms-of-service) +**Privacy Policy**: [HubSpot Privacy Policy](https://legal.hubspot.com/privacy-policy) + +--- + +### Salesforce + +**Service URL**: Account-specific (e.g., `https://yourinstance.salesforce.com/`) + +**What it does**: Manages leads, contacts, opportunities, and custom objects in Salesforce. + +**Data sent**: + +- Lead and contact information +- Opportunity and account data +- Custom object data +- OAuth credentials + +**When data is sent**: When Salesforce integration workflows are triggered. + +**Terms of Service**: [Salesforce Terms of Service](https://www.salesforce.com/company/legal/agreements/) +**Privacy Policy**: [Salesforce Privacy Policy](https://www.salesforce.com/company/privacy/) + +--- + +### Pipedrive + +**Service URL**: `https://api.pipedrive.com/` + +**What it does**: Manages deals, contacts, and organizations in Pipedrive CRM. + +**Data sent**: + +- Contact and organization details +- Deal information and pipeline data +- Custom fields +- API tokens + +**When data is sent**: When CRM sync workflows are triggered. + +**Terms of Service**: [Pipedrive Terms of Service](https://www.pipedrive.com/en/terms-of-service/us) +**Privacy Policy**: [Pipedrive Privacy Policy](https://www.pipedrive.com/en/privacy) + +--- + +### Insightly + +**Service URL**: `https://api.insightly.com/` or regional variants + +**What it does**: Manages contacts, organizations, and opportunities in Insightly CRM. + +**Data sent**: + +- Contact and organization data +- Opportunity information +- Custom fields +- API keys + +**When data is sent**: When CRM workflows are triggered. + +**Terms of Service**: [Insightly Terms of Service](https://www.insightly.com/terms-of-service) +**Privacy Policy**: [Insightly Privacy Policy](https://www.insightly.com/privacy-policy) + +--- + +### CapsuleCRM + +**Service URL**: `https://api.capsulecrm.com/` + +**What it does**: Manages contacts and sales opportunities in Capsule CRM. + +**Data sent**: + +- Contact information (name, email, address) +- Opportunity and case data +- Tags and custom fields +- API tokens + +**When data is sent**: When CRM workflows are triggered. + +**Terms of Service**: [Capsule CRM Terms](https://capsulecrm.com/terms/) +**Privacy Policy**: [Capsule CRM Privacy Policy](https://capsulecrm.com/privacy/) + +--- + +### Copper CRM + +**Service URL**: `https://api.copper.com/` + +**What it does**: Manages people, companies, and opportunities in Copper CRM. + +**Data sent**: + +- Person and company information +- Opportunity and project data +- Custom fields +- API keys + +**When data is sent**: When CRM workflows are triggered. + +**Terms of Service**: [Copper Terms of Service](https://www.copper.com/terms) +**Privacy Policy**: [Copper Privacy Policy](https://www.copper.com/privacy) + +--- + +### FreshSales (Freshworks CRM) + +**Service URL**: Account-specific (e.g., `https://domain.myfreshworks.com/crm/sales/`) + +**What it does**: Manages leads, contacts, accounts, and deals in Freshsales CRM. + +**Data sent**: + +- Lead and contact details +- Account and deal information +- Custom fields +- API keys + +**When data is sent**: When CRM workflows are triggered. + +**Terms of Service**: [Freshworks Terms of Service](https://www.freshworks.com/terms/) +**Privacy Policy**: [Freshworks Privacy Policy](https://www.freshworks.com/privacy/) + +--- + +### Salesmate + +**Service URL**: `https://apis.salesmate.io/` + +**What it does**: Manages contacts, companies, and deals in Salesmate CRM. + +**Data sent**: + +- Contact and company information +- Deal and activity data +- Custom fields +- API credentials + +**When data is sent**: When CRM workflows are triggered. + +**Terms of Service**: [Salesmate Terms of Service](https://www.salesmate.io/terms-of-service/) +**Privacy Policy**: [Salesmate Privacy Policy](https://www.salesmate.io/privacy-policy/) + +--- + +### Salesflare + +**Service URL**: `https://api.salesflare.com/` + +**What it does**: Manages contacts, accounts, and opportunities in Salesflare CRM. + +**Data sent**: + +- Contact and account information +- Opportunity data +- API keys + +**When data is sent**: When CRM workflows are triggered. + +**Terms of Service**: [Salesflare Terms](https://salesflare.com/terms) +**Privacy Policy**: [Salesflare Privacy](https://salesflare.com/privacy) + +--- + +### Agiled CRM + +**Service URL**: `https://app.agiled.app/` and API endpoints + +**What it does**: Manages contacts, deals, and projects in Agiled CRM. + +**Data sent**: + +- Contact and company information +- Deal and project data +- Custom fields +- API tokens + +**When data is sent**: When CRM workflows are triggered. + +**Terms of Service**: [Agiled Terms](https://agiled.app/terms-and-conditions) +**Privacy Policy**: [Agiled Privacy Policy](https://agiled.app/privacy-policy) + +--- + +### Nimble + +**Service URL**: `https://api.nimble.com/` + +**What it does**: Manages contacts and relationships in Nimble CRM. + +**Data sent**: + +- Contact information +- Notes and activities +- Tags and custom fields +- OAuth credentials + +**When data is sent**: When CRM workflows are triggered. + +**Terms of Service**: [Nimble Terms of Service](https://www.nimble.com/terms-of-service/) +**Privacy Policy**: [Nimble Privacy Policy](https://www.nimble.com/privacy-policy/) + +--- + +### OneHashCRM + +**Service URL**: User's self-hosted or cloud instance URL + +**What it does**: Manages leads, contacts, and deals in OneHash CRM. + +**Data sent**: + +- Lead and contact data +- Deal information +- Custom fields +- API keys + +**When data is sent**: When CRM workflows are triggered. + +**Terms of Service**: [OneHash Terms](https://onehash.ai/terms) +**Privacy Policy**: [OneHash Privacy Policy](https://onehash.ai/privacy-policy) + +--- + +### NutshellCRM + +**Service URL**: `https://api.nutshell.com/` + +**What it does**: Manages contacts, leads, and sales processes in Nutshell CRM. + +**Data sent**: + +- Contact and company information +- Lead and opportunity data +- Custom fields +- API credentials + +**When data is sent**: When CRM workflows are triggered. + +**Terms of Service**: [Nutshell Terms of Service](https://www.nutshell.com/terms) +**Privacy Policy**: [Nutshell Privacy Policy](https://www.nutshell.com/privacy) + +--- + +### CompanyHub + +**Service URL**: `https://api.companyhub.com/` + +**What it does**: Manages contacts, companies, and deals in CompanyHub CRM. + +**Data sent**: + +- Contact and company records +- Deal and pipeline data +- Custom fields +- API tokens + +**When data is sent**: When CRM workflows are triggered. + +**Terms of Service**: [CompanyHub Terms](https://companyhub.com/terms-of-service/) +**Privacy Policy**: [CompanyHub Privacy Policy](https://companyhub.com/privacy-policy/) + +--- + +### ClinchPad + +**Service URL**: `https://www.clinchpad.com/api/` + +**What it does**: Manages leads and sales pipeline in ClinchPad CRM. + +**Data sent**: + +- Lead information +- Pipeline and deal data +- Contact details +- API keys + +**When data is sent**: When leads or deals are created via configured workflows. + +**Terms of Service**: [ClinchPad Terms](https://clinchpad.com/terms-of-service) +**Privacy Policy**: [ClinchPad Privacy Policy](https://clinchpad.com/privacy-policy) + +--- + +### MoxieCRM (PropovoiceCRM) + +**Service URL**: Integration via WordPress plugins + +**What it does**: Manages customer relationships within WordPress. + +**Data sent**: + +- Contact information +- Deal and invoice data +- Project details +- Internal to WordPress installation + +**When data is sent**: When CRM workflows are triggered. + +**Terms of Service**: Based on plugin and hosting +**Privacy Policy**: Based on plugin and hosting + +--- + +### PerfexCRM + +**Service URL**: User's self-hosted installation URL + +**What it does**: Manages customers, leads, projects, and invoices in self-hosted Perfex CRM. + +**Data sent**: + +- Customer and lead information +- Project and task data +- Invoice details +- Custom fields +- API keys + +**When data is sent**: When CRM workflows are triggered. + +**Terms of Service**: Varies by installation +**Privacy Policy**: Varies by installation + +--- + +### Flowlu + +**Service URL**: `https://api.flowlu.com/` + +**What it does**: Manages CRM, projects, and collaboration in Flowlu. + +**Data sent**: + +- Contact and organization data +- Opportunity information +- Project and task data +- API tokens + +**When data is sent**: When CRM or project workflows are triggered. + +**Terms of Service**: [Flowlu Terms of Service](https://www.flowlu.com/terms/) +**Privacy Policy**: [Flowlu Privacy Policy](https://www.flowlu.com/privacy/) + +--- + +### LionDesk + +**Service URL**: `https://api.liondesk.com/` + +**What it does**: Real estate CRM for managing contacts and transactions. + +**Data sent**: + +- Contact information +- Transaction details +- Notes and activities +- API credentials + +**When data is sent**: When real estate CRM workflows are triggered. + +**Terms of Service**: [LionDesk Terms](https://www.liondesk.com/terms-of-service/) +**Privacy Policy**: [LionDesk Privacy Policy](https://www.liondesk.com/privacy-policy/) + +--- + +### HighLevel (GoHighLevel) + +**Service URL**: `https://rest.gohighlevel.com/` + +**What it does**: All-in-one marketing and CRM platform for agencies. + +**Data sent**: + +- Contact information +- Opportunity and pipeline data +- Appointment details +- Custom fields +- API tokens + +**When data is sent**: When CRM or marketing workflows are triggered. + +**Terms of Service**: [HighLevel Terms of Service](https://www.gohighlevel.com/terms-of-service) +**Privacy Policy**: [HighLevel Privacy Policy](https://www.gohighlevel.com/privacy-policy) + +--- + +### SuiteDash + +**Service URL**: User's SuiteDash instance URL + +**What it does**: Manages clients, projects, and business operations. + +**Data sent**: + +- Client information +- Project and file data +- Invoice details +- API keys + +**When data is sent**: When business management workflows are triggered. + +**Terms of Service**: [SuiteDash Terms](https://suitedash.com/terms-of-service/) +**Privacy Policy**: [SuiteDash Privacy Policy](https://suitedash.com/privacy-policy/) + +--- + +### Vbout + +**Service URL**: `https://api.vbout.com/` + +**What it does**: Marketing automation and CRM platform. + +**Data sent**: + +- Contact information +- List subscriptions +- Behavioral data +- API credentials + +**When data is sent**: When marketing automation workflows are triggered. + +**Terms of Service**: [Vbout Terms of Service](https://www.vbout.com/terms/) +**Privacy Policy**: [Vbout Privacy Policy](https://www.vbout.com/privacy/) + +--- + +## Project Management Services + +### Trello + +**Service URL**: `https://api.trello.com/` + +**What it does**: Creates cards, lists, and manages boards in Trello. + +**Data sent**: + +- Card details (title, description, due date) +- Board and list IDs +- Member assignments +- Attachment data +- API keys and tokens + +**When data is sent**: When project management workflows are triggered. + +**Terms of Service**: [Trello Terms of Service](https://www.atlassian.com/legal/customer-agreement) +**Privacy Policy**: [Atlassian Privacy Policy](https://www.atlassian.com/legal/privacy-policy) + +--- + +### Asana + +**Service URL**: `https://app.asana.com/api/` + +**What it does**: Creates and manages tasks and projects in Asana. + +**Data sent**: + +- Task details (name, description, due date) +- Project and workspace IDs +- Assignee information +- API tokens + +**When data is sent**: When task management workflows are triggered. + +**Terms of Service**: [Asana Terms of Service](https://asana.com/terms) +**Privacy Policy**: [Asana Privacy Policy](https://asana.com/terms#privacy-policy) + +--- + +### ClickUp + +**Service URL**: `https://api.clickup.com/` + +**What it does**: Manages tasks, lists, and projects in ClickUp. + +**Data sent**: + +- Task information (name, description, priority) +- List and folder IDs +- Assignee details +- Custom fields +- API tokens + +**When data is sent**: When project workflows are triggered. + +**Terms of Service**: [ClickUp Terms](https://clickup.com/terms) +**Privacy Policy**: [ClickUp Privacy Policy](https://clickup.com/privacy) + +--- + +## Communication Services + +### Slack + +**Service URL**: `https://slack.com/api/` + +**What it does**: Sends messages and notifications to Slack channels. + +**Data sent**: + +- Message content +- Channel IDs +- User mentions +- File attachments when configured +- Webhook URLs or API tokens + +**When data is sent**: When notification workflows are triggered. + +**Terms of Service**: [Slack Terms of Service](https://slack.com/terms-of-service) +**Privacy Policy**: [Slack Privacy Policy](https://slack.com/privacy-policy) + +--- + +### Telegram + +**Service URL**: `https://api.telegram.org/` + +**What it does**: Sends messages to Telegram chats or channels. + +**Data sent**: + +- Message text +- Chat IDs +- Bot tokens +- Media files when configured + +**When data is sent**: When messaging workflows are triggered. + +**Terms of Service**: [Telegram Terms of Service](https://telegram.org/tos) +**Privacy Policy**: [Telegram Privacy Policy](https://telegram.org/privacy) + +--- + +### Discord + +**Service URL**: `https://discord.com/api/` + +**What it does**: Sends messages to Discord channels via webhooks or bot. + +**Data sent**: + +- Message content +- Webhook URLs +- Embed data +- File attachments when configured + +**When data is sent**: When Discord notification workflows are triggered. + +**Terms of Service**: [Discord Terms of Service](https://discord.com/terms) +**Privacy Policy**: [Discord Privacy Policy](https://discord.com/privacy) + +--- + +### Twilio + +**Service URL**: `https://api.twilio.com/` + +**What it does**: Sends SMS messages via Twilio service. + +**Data sent**: + +- Phone numbers (sender and recipient) +- SMS message content +- Account SID and Auth Token + +**When data is sent**: When SMS workflows are triggered. + +**Terms of Service**: [Twilio Terms of Service](https://www.twilio.com/legal/tos) +**Privacy Policy**: [Twilio Privacy Policy](https://www.twilio.com/legal/privacy) + +--- + +## Storage Services + +### Dropbox + +**Service URL**: `https://api.dropboxapi.com/` + +**What it does**: Uploads files to Dropbox folders. + +**Data sent**: + +- File contents and metadata +- Folder paths +- OAuth tokens + +**When data is sent**: When file upload workflows are triggered. + +**Terms of Service**: [Dropbox Terms of Service](https://www.dropbox.com/terms) +**Privacy Policy**: [Dropbox Privacy Policy](https://www.dropbox.com/privacy) + +--- + +### OneDrive + +**Service URL**: `https://graph.microsoft.com/` (Microsoft Graph API) + +**What it does**: Uploads files to OneDrive storage. + +**Data sent**: + +- File contents and metadata +- Folder paths +- OAuth tokens + +**When data is sent**: When file upload workflows are triggered. + +**Terms of Service**: [Microsoft Services Agreement](https://www.microsoft.com/servicesagreement) +**Privacy Policy**: [Microsoft Privacy Statement](https://privacy.microsoft.com/privacystatement) + +--- + +### pCloud + +**Service URL**: `https://api.pcloud.com/` + +**What it does**: Uploads files to pCloud storage. + +**Data sent**: + +- File contents and metadata +- Folder identifiers +- Authentication tokens + +**When data is sent**: When file upload workflows are triggered. + +**Terms of Service**: [pCloud Terms of Service](https://www.pcloud.com/terms_and_conditions.html) +**Privacy Policy**: [pCloud Privacy Policy](https://www.pcloud.com/privacy_policy.html) + +--- + +## Automation Platform Services + +### Zapier + +**Service URL**: Webhook URLs provided by Zapier + +**What it does**: Triggers Zapier workflows (Zaps) to connect with 5000+ apps. + +**Data sent**: + +- Webhook payload data as configured in workflows +- Can include any WordPress data based on user configuration +- Data is sent to user-provided webhook URLs + +**When data is sent**: When configured trigger events occur in WordPress. + +**Terms of Service**: [Zapier Terms of Service](https://zapier.com/terms) +**Privacy Policy**: [Zapier Privacy Policy](https://zapier.com/privacy) + +--- + +### Make (Integromat) + +**Service URL**: Webhook URLs provided by Make + +**What it does**: Triggers Make scenarios to automate workflows across apps. + +**Data sent**: + +- Webhook payload data as configured +- Can include any WordPress data based on user configuration + +**When data is sent**: When configured trigger events occur in WordPress. + +**Terms of Service**: [Make Terms of Service](https://www.make.com/en/terms-of-service) +**Privacy Policy**: [Make Privacy Policy](https://www.make.com/en/privacy-policy) + +--- + +### Pabbly Connect + +**Service URL**: Webhook URLs provided by Pabbly + +**What it does**: Triggers Pabbly workflows to connect various applications. + +**Data sent**: + +- Webhook payload data as configured +- User-defined WordPress data + +**When data is sent**: When configured trigger events occur in WordPress. + +**Terms of Service**: [Pabbly Terms of Service](https://www.pabbly.com/terms-conditions/) +**Privacy Policy**: [Pabbly Privacy Policy](https://www.pabbly.com/privacy-policy/) + +--- + +### N8N + +**Service URL**: User's self-hosted or cloud N8N instance + +**What it does**: Triggers N8N workflows for automation. + +**Data sent**: + +- Webhook payload data as configured +- User-defined data based on workflows + +**When data is sent**: When configured trigger events occur in WordPress. + +**Terms of Service**: [N8N Terms](https://n8n.io/legal/terms/) (for cloud) +**Privacy Policy**: [N8N Privacy](https://n8n.io/legal/privacy/) (for cloud) + +--- + +### Integrately + +**Service URL**: Webhook URLs provided by Integrately + +**What it does**: Triggers Integrately automations. + +**Data sent**: + +- Webhook payload data +- User-configured WordPress data + +**When data is sent**: When configured trigger events occur. + +**Terms of Service**: [Integrately Terms](https://integrately.com/terms-of-service) +**Privacy Policy**: [Integrately Privacy Policy](https://integrately.com/privacy-policy) + +--- + +### KonnectzIT + +**Service URL**: Webhook URLs provided by KonnectzIT + +**What it does**: Triggers KonnectzIT workflows. + +**Data sent**: + +- Webhook payload data +- User-configured data + +**When data is sent**: When configured triggers occur. + +**Terms of Service**: [KonnectzIT Terms](https://www.konnectzit.com/terms-of-service/) +**Privacy Policy**: [KonnectzIT Privacy Policy](https://www.konnectzit.com/privacy-policy/) + +--- + +### SureTriggers (OttoKit) + +**Service URL**: Integration with SureTriggers WordPress plugin + +**What it does**: Triggers SureTriggers workflows within WordPress. + +**Data sent**: + +- Internal WordPress data exchange +- May connect to external services via SureTriggers + +**When data is sent**: When configured trigger events occur. + +**Terms of Service**: [SureTriggers Terms](https://suretriggers.com/terms-and-conditions/) +**Privacy Policy**: [SureTriggers Privacy Policy](https://suretriggers.com/privacy-policy/) + +--- + +### SyncSpider + +**Service URL**: `https://www.syncspider.com/` API endpoints + +**What it does**: Synchronizes data between applications. + +**Data sent**: + +- Configured WordPress data +- API credentials + +**When data is sent**: When sync workflows are triggered. + +**Terms of Service**: [SyncSpider Terms](https://syncspider.com/terms-and-conditions/) +**Privacy Policy**: [SyncSpider Privacy Policy](https://syncspider.com/privacy-policy/) + +--- + +### Albato + +**Service URL**: Webhook URLs provided by Albato + +**What it does**: Automates workflows between applications. + +**Data sent**: + +- Webhook payload data +- User-configured data + +**When data is sent**: When configured triggers occur. + +**Terms of Service**: [Albato Terms](https://albato.com/terms) +**Privacy Policy**: [Albato Privacy Policy](https://albato.com/privacy) + +--- + +### SperseIO + +**Service URL**: Webhook URLs provided by SperseIO + +**What it does**: Automates business workflows. + +**Data sent**: + +- Webhook payload data +- User-configured data + +**When data is sent**: When configured triggers occur. + +**Terms of Service**: [SperseIO Terms](https://www.sperse.io/terms-conditions/) +**Privacy Policy**: [SperseIO Privacy Policy](https://www.sperse.io/privacy-policy/) + +--- + +### AntApps + +**Service URL**: Webhook URLs provided by AntApps + +**What it does**: Triggers AntApps automations. + +**Data sent**: + +- Webhook payload data +- User-configured data + +**When data is sent**: When configured triggers occur. + +**Terms of Service**: Check AntApps website +**Privacy Policy**: Check AntApps website + +--- + +## Learning Management Systems + +### LearnDash (via WooCommerce or Direct) + +Note: LearnDash is a WordPress plugin. Data stays within WordPress unless connected to external services via other integrations. + +--- + +### TutorLMS (via WooCommerce or Direct) + +Note: TutorLMS is a WordPress plugin. Data stays within WordPress unless connected to external services via other integrations. + +--- + +### Academy LMS + +Note: Academy LMS is a WordPress plugin. Data stays within WordPress unless connected to external services. + +--- + +### MasterStudy LMS + +Note: MasterStudy LMS is a WordPress plugin. Data stays within WordPress unless connected to external services. + +--- + +### LifterLMS + +Note: LifterLMS is a WordPress plugin. Data stays within WordPress unless connected to external services. + +--- + +### Zoom (for webinars and meetings) + +**Service URL**: `https://api.zoom.us/` + +**What it does**: Creates meetings and webinars, manages registrations. + +**Data sent**: + +- Meeting/webinar details +- Registrant information (name, email) +- OAuth credentials + +**When data is sent**: When meeting/webinar workflows are triggered. + +**Terms of Service**: [Zoom Terms of Service](https://explore.zoom.us/en/terms/) +**Privacy Policy**: [Zoom Privacy Statement](https://explore.zoom.us/en/privacy/) + +--- + +## E-commerce Services + +Note: WooCommerce, GiveWP, SureCart, and other WordPress plugins process data within WordPress. Data is only sent externally when integrated with other external services through Bit Integrations. + +--- + +## Marketing Automation Services + +### Mautic + +**Service URL**: User's self-hosted or cloud Mautic instance + +**What it does**: Manages contacts and marketing automation campaigns. + +**Data sent**: + +- Contact information +- Behavioral data +- Campaign assignments +- API credentials + +**When data is sent**: When marketing automation workflows are triggered. + +**Terms of Service**: [Mautic Terms](https://www.mautic.org/terms-of-service) or per installation +**Privacy Policy**: [Mautic Privacy](https://www.mautic.org/privacy-policy) or per installation + +--- + +### Encharge + +**Service URL**: `https://api.encharge.io/` + +**What it does**: Marketing automation for SaaS and digital businesses. + +**Data sent**: + +- User and contact data +- Event tracking data +- Custom fields +- API keys + +**When data is sent**: When user behavior or form submissions trigger workflows. + +**Terms of Service**: [Encharge Terms](https://encharge.io/terms) +**Privacy Policy**: [Encharge Privacy Policy](https://encharge.io/privacy) + +--- + +### Lemlist + +**Service URL**: `https://api.lemlist.com/` + +**What it does**: Email outreach and campaign management. + +**Data sent**: + +- Lead information +- Campaign assignments +- Email addresses +- API keys + +**When data is sent**: When outreach workflows are triggered. + +**Terms of Service**: [Lemlist Terms](https://www.lemlist.com/terms-of-service) +**Privacy Policy**: [Lemlist Privacy Policy](https://www.lemlist.com/privacy-policy) + +--- + +### Woodpecker + +**Service URL**: `https://api.woodpecker.co/` + +**What it does**: Cold email automation and follow-ups. + +**Data sent**: + +- Prospect information +- Email content and campaign data +- API keys + +**When data is sent**: When email outreach workflows are triggered. + +**Terms of Service**: [Woodpecker Terms](https://woodpecker.co/terms/) +**Privacy Policy**: [Woodpecker Privacy Policy](https://woodpecker.co/privacy-policy/) + +--- + +### Gravitec + +**Service URL**: `https://gravitec.net/` API endpoints + +**What it does**: Web push notification service. + +**Data sent**: + +- Subscriber tokens +- Notification content +- Segmentation data +- API keys + +**When data is sent**: When push notification workflows are triggered. + +**Terms of Service**: [Gravitec Terms](https://gravitec.net/terms-of-service/) +**Privacy Policy**: [Gravitec Privacy Policy](https://gravitec.net/privacy-policy/) + +--- + +### SystemeIO + +**Service URL**: `https://api.systeme.io/api` + +**What it does**: All-in-one marketing platform for course creation, email marketing, and sales funnels. + +**Data sent**: + +- Contact information (email, name, tags) +- Course enrollment data +- Purchase information +- Custom field data +- API keys + +**When data is sent**: When marketing automation or course enrollment workflows are triggered. + +**Terms of Service**: [Systeme.io Terms](https://systeme.io/terms-and-conditions) +**Privacy Policy**: [Systeme.io Privacy Policy](https://systeme.io/privacy-policy) + +--- + +## Other Third-Party Services + +### Airtable + +**Service URL**: `https://api.airtable.com/` + +**What it does**: Syncs data to Airtable databases/tables. + +**Data sent**: + +- Record data as configured +- Table and base identifiers +- API keys + +**When data is sent**: When database sync workflows are triggered. + +**Terms of Service**: [Airtable Terms of Service](https://www.airtable.com/company/terms-of-service) +**Privacy Policy**: [Airtable Privacy Policy](https://www.airtable.com/company/privacy) + +--- + +### Notion + +**Service URL**: `https://api.notion.com/` + +**What it does**: Creates and updates pages and databases in Notion. + +**Data sent**: + +- Page content and properties +- Database records +- OAuth tokens + +**When data is sent**: When Notion workflows are triggered. + +**Terms of Service**: [Notion Terms of Service](https://www.notion.so/Terms-and-Privacy-28ffdd083dc3473e9c2da6ec011b58ac) +**Privacy Policy**: [Notion Privacy Policy](https://www.notion.so/Privacy-Policy-3468d120cf614d4c9014c09f6adc9091) + +--- + +### SmartSuite + +**Service URL**: `https://app.smartsuite.com/api/` + +**What it does**: Manages records in SmartSuite collaborative work management platform. + +**Data sent**: + +- Record data +- App and table identifiers +- API tokens + +**When data is sent**: When SmartSuite workflows are triggered. + +**Terms of Service**: [SmartSuite Terms](https://www.smartsuite.com/terms-of-service) +**Privacy Policy**: [SmartSuite Privacy Policy](https://www.smartsuite.com/privacy-policy) + +--- + +### Freshdesk + +**Service URL**: Account-specific (e.g., `https://domain.freshdesk.com/api/`) + +**What it does**: Creates support tickets and manages contacts in Freshdesk. + +**Data sent**: + +- Ticket details (subject, description, priority) +- Contact information +- Custom fields +- API keys + +**When data is sent**: When support ticket workflows are triggered. + +**Terms of Service**: [Freshworks Terms of Service](https://www.freshworks.com/terms/) +**Privacy Policy**: [Freshworks Privacy Policy](https://www.freshworks.com/privacy/) + +--- + +### Zendesk + +**Service URL**: Account-specific (e.g., `https://subdomain.zendesk.com/api/`) + +**What it does**: Creates tickets and manages contacts in Zendesk. + +**Data sent**: + +- Ticket information +- User/contact details +- Custom fields +- API tokens + +**When data is sent**: When ticket creation workflows are triggered. + +**Terms of Service**: [Zendesk Terms of Service](https://www.zendesk.com/company/agreements-and-terms/master-subscription-agreement/) +**Privacy Policy**: [Zendesk Privacy Policy](https://www.zendesk.com/company/agreements-and-terms/privacy-policy/) + +--- + +### Keap (Infusionsoft) + +**Service URL**: `https://api.infusionsoft.com/` + +**What it does**: Manages contacts, sales, and marketing automation. + +**Data sent**: + +- Contact information +- Tags and custom fields +- Order data +- OAuth credentials + +**When data is sent**: When CRM and marketing workflows are triggered. + +**Terms of Service**: [Keap Terms of Service](https://keap.com/legal/terms-of-service) +**Privacy Policy**: [Keap Privacy Policy](https://keap.com/legal/privacy-policy) + +--- + +### Demio + +**Service URL**: `https://my.demio.com/api/` + +**What it does**: Manages webinar registrations in Demio. + +**Data sent**: + +- Registrant information (name, email) +- Webinar IDs +- Custom fields +- API keys + +**When data is sent**: When webinar registration workflows are triggered. + +**Terms of Service**: [Demio Terms of Service](https://demio.com/terms) +**Privacy Policy**: [Demio Privacy Policy](https://demio.com/privacy) + +--- + +### Livestorm + +**Service URL**: `https://api.livestorm.co/` + +**What it does**: Manages event registrations for webinars and meetings. + +**Data sent**: + +- Participant information +- Event IDs +- Custom fields +- API tokens + +**When data is sent**: When event registration workflows are triggered. + +**Terms of Service**: [Livestorm Terms](https://livestorm.co/terms) +**Privacy Policy**: [Livestorm Privacy Policy](https://livestorm.co/privacy) + +--- + +### Fabman + +**Service URL**: `https://fabman.io/api/` + +**What it does**: Manages memberships and resource bookings for makerspaces and coworking spaces. + +**Data sent**: + +- Member information +- Booking data +- API keys + +**When data is sent**: When membership or booking workflows are triggered. + +**Terms of Service**: [Fabman Terms](https://fabman.io/terms/) +**Privacy Policy**: [Fabman Privacy Policy](https://fabman.io/privacy/) + +--- + +### DirectIQ + +**Service URL**: `https://www.directiq.com/` API endpoints + +**What it does**: Email marketing and newsletter management. + +**Data sent**: + +- Subscriber information +- List assignments +- API credentials + +**When data is sent**: When email marketing workflows are triggered. + +**Terms of Service**: [DirectIQ Terms](https://www.directiq.com/terms-of-service) +**Privacy Policy**: [DirectIQ Privacy Policy](https://www.directiq.com/privacy-policy) + +--- + +### GetGist + +**Service URL**: `https://api.getgist.com/` + +**What it does**: Marketing automation, live chat, and email marketing. + +**Data sent**: + +- Contact information +- Event tracking data +- Custom properties +- API keys + +**When data is sent**: When marketing workflows are triggered. + +**Terms of Service**: [Gist Terms of Service](https://getgist.com/terms/) +**Privacy Policy**: [Gist Privacy Policy](https://getgist.com/privacy/) + +--- + +### Bento + +**Service URL**: `https://app.bentonow.com/api/` + +**What it does**: Email marketing and automation platform. + +**Data sent**: + +- Subscriber data +- Event tracking +- Tags and custom properties +- API keys + +**When data is sent**: When email marketing workflows are triggered. + +**Terms of Service**: [Bento Terms](https://www.bentonow.com/terms) +**Privacy Policy**: [Bento Privacy Policy](https://www.bentonow.com/privacy) + +--- + +### Campaign Monitor + +**Service URL**: `https://api.createsend.com/` + +**What it does**: Email marketing campaign management. + +**Data sent**: + +- Subscriber information +- List IDs +- Custom fields +- API keys + +**When data is sent**: When email marketing workflows are triggered. + +**Terms of Service**: [Campaign Monitor Terms](https://www.campaignmonitor.com/policies/) +**Privacy Policy**: [Campaign Monitor Privacy](https://www.campaignmonitor.com/policies/) + +--- + +### Constant Contact + +**Service URL**: `https://api.cc.email/v3/` and `https://authz.constantcontact.com/` + +**What it does**: Email marketing platform for managing contacts, lists, and campaigns. + +**Data sent**: + +- Contact information (email, name, phone, address) +- List memberships +- Tags and custom fields +- OAuth credentials +- API keys + +**When data is sent**: When contact and email marketing workflows are triggered. + +**Terms of Service**: [Constant Contact Terms of Service](https://www.constantcontact.com/legal/terms-and-conditions) +**Privacy Policy**: [Constant Contact Privacy Policy](https://www.constantcontact.com/legal/privacy-statement) + +--- + +### MailRelay + +**Service URL**: `https://api.mailrelay.com/` + +**What it does**: Email marketing and newsletter service. + +**Data sent**: + +- Subscriber data +- Group assignments +- Custom fields +- API keys + +**When data is sent**: When email marketing workflows are triggered. + +**Terms of Service**: [MailRelay Terms](https://mailrelay.com/en/terms-and-conditions) +**Privacy Policy**: [MailRelay Privacy](https://mailrelay.com/en/privacy-policy) + +--- + +### MailUp + +**Service URL**: `https://services.mailup.com/` + +**What it does**: Email and SMS marketing platform. + +**Data sent**: + +- Contact information +- List subscriptions +- Custom fields +- API credentials + +**When data is sent**: When marketing workflows are triggered. + +**Terms of Service**: [MailUp Terms](https://www.mailup.com/terms-of-service/) +**Privacy Policy**: [MailUp Privacy Policy](https://www.mailup.com/privacy-policy/) + +--- + +### Mailercloud + +**Service URL**: `https://cloudapi.mailercloud.com/` + +**What it does**: Email marketing automation. + +**Data sent**: + +- Contact details +- List assignments +- Custom fields +- API keys + +**When data is sent**: When email workflows are triggered. + +**Terms of Service**: [Mailercloud Terms](https://www.mailercloud.com/terms-of-service) +**Privacy Policy**: [Mailercloud Privacy](https://www.mailercloud.com/privacy-policy) + +--- + +### Mailify (Sarbacane) + +**Service URL**: `https://api.mailify.com/` + +**What it does**: Email and SMS marketing platform. + +**Data sent**: + +- Contact information +- List subscriptions +- API credentials + +**When data is sent**: When marketing workflows are triggered. + +**Terms of Service**: [Mailify Terms](https://www.mailify.com/en/legal-notice) +**Privacy Policy**: [Mailify Privacy](https://www.mailify.com/en/privacy-policy) + +--- + +### Mailjet + +**Service URL**: `https://api.mailjet.com/` + +**What it does**: Email delivery and marketing platform. + +**Data sent**: + +- Email content and addresses +- Contact list data +- API keys + +**When data is sent**: When email sending workflows are triggered. + +**Terms of Service**: [Mailjet Terms](https://www.mailjet.com/legal/terms-of-use/) +**Privacy Policy**: [Mailjet Privacy](https://www.mailjet.com/legal/privacy-policy/) + +--- + +### Mailster + +Note: Mailster is a WordPress plugin. Data stays within WordPress unless connected to external email sending services. + +--- + +### MailBluster + +**Service URL**: `https://api.mailbluster.com/` + +**What it does**: Email marketing service built on Amazon SES. + +**Data sent**: + +- Contact information +- List data +- Email content +- API keys + +**When data is sent**: When email marketing workflows are triggered. + +**Terms of Service**: [MailBluster Terms](https://mailbluster.com/terms-of-service) +**Privacy Policy**: [MailBluster Privacy Policy](https://mailbluster.com/privacy-policy) + +--- + +### MailMint + +Note: MailMint is a WordPress-based email marketing plugin. Data stays within WordPress unless connected to external email sending services. + +--- + +### MailerPress + +Note: MailerPress is a WordPress plugin. Data stays within WordPress unless using external sending services. + +--- + +### KirimEmail + +**Service URL**: `https://api.kirimemail.com/` + +**What it does**: Email marketing service (Indonesia focused). + +**Data sent**: + +- Subscriber information +- List data +- API keys + +**When data is sent**: When email marketing workflows are triggered. + +**Terms of Service**: [KirimEmail Terms](https://www.kirim.email/terms) +**Privacy Policy**: [KirimEmail Privacy](https://www.kirim.email/privacy) + +--- + +### Rapidmail + +**Service URL**: `https://apiv3.emailsys.net/` + +**What it does**: Email marketing service. + +**Data sent**: + +- Recipient data +- List assignments +- API credentials + +**When data is sent**: When email marketing workflows are triggered. + +**Terms of Service**: [Rapidmail Terms](https://www.rapidmail.com/terms-and-conditions) +**Privacy Policy**: [Rapidmail Privacy](https://www.rapidmail.com/privacy-policy) + +--- + +### Selzy + +**Service URL**: `https://api.selzy.com/` + +**What it does**: Email marketing automation. + +**Data sent**: + +- Contact information +- List subscriptions +- API keys + +**When data is sent**: When email workflows are triggered. + +**Terms of Service**: [Selzy Terms](https://selzy.com/en/legal/terms/) +**Privacy Policy**: [Selzy Privacy](https://selzy.com/en/legal/privacy/) + +--- + +### SendFox + +**Service URL**: `https://api.sendfox.com/` + +**What it does**: Email marketing for content creators. + +**Data sent**: + +- Contact information +- List subscriptions +- API tokens + +**When data is sent**: When email marketing workflows are triggered. + +**Terms of Service**: [SendFox Terms](https://sendfox.com/terms) +**Privacy Policy**: [SendFox Privacy](https://sendfox.com/privacy) + +--- + +### Smaily + +**Service URL**: `https://api.smaily.com/` + +**What it does**: Email marketing automation. + +**Data sent**: + +- Subscriber data +- List assignments +- API credentials + +**When data is sent**: When email workflows are triggered. + +**Terms of Service**: [Smaily Terms](https://smaily.com/terms/) +**Privacy Policy**: [Smaily Privacy](https://smaily.com/privacy/) + +--- + +### ZagoMail + +**Service URL**: `https://api.zagomail.com/` + +**What it does**: Email marketing service. + +**Data sent**: + +- Contact information +- List data +- API keys + +**When data is sent**: When email marketing workflows are triggered. + +**Terms of Service**: [ZagoMail Terms](https://www.zagomail.com/terms-of-service) +**Privacy Policy**: [ZagoMail Privacy](https://www.zagomail.com/privacy-policy) + +--- + +### Line + +**Service URL**: `https://api.line.me/` + +**What it does**: Sends messages via Line messaging platform. + +**Data sent**: + +- Message content +- User IDs +- Channel access tokens + +**When data is sent**: When Line messaging workflows are triggered. + +**Terms of Service**: [Line Terms of Use](https://terms.line.me/line_terms/) +**Privacy Policy**: [Line Privacy Policy](https://line.me/en/terms/policy/) + +--- + +## Important Notes + +1. **User Control**: All external service connections are completely opt-in. Data is never sent to any external service unless you explicitly configure an integration. + +2. **API Keys and Credentials**: This plugin stores API keys, OAuth tokens, and credentials in your WordPress database (encrypted where possible). These credentials are used solely to authenticate with the services you choose to integrate. + +3. **Data Mapping**: You have complete control over what data is sent to each service through the field mapping interface. + +4. **Webhooks**: For webhook-based integrations, data is sent to URLs you provide. You are responsible for ensuring these webhook endpoints are secure and comply with privacy regulations. + +5. **Logging**: Integration logs are stored locally in your WordPress database for debugging purposes. You can control log retention in plugin settings. + +6. **GDPR and Privacy Compliance**: When using this plugin to send data to external services, you are responsible for: + - Obtaining appropriate user consent + - Providing privacy notices to your users + - Ensuring compliance with GDPR, CCPA, and other applicable regulations + - Reviewing the privacy policies and terms of service for each external service you use + +7. **Data Security**: Always use HTTPS for your WordPress site and ensure WordPress, this plugin, and all other plugins are kept up to date. + +8. **Third-Party Responsibility**: This plugin acts as a data processor. The third-party services you connect to have their own data processing practices. Please review their respective privacy policies and terms of service. + +--- + +## Contact and Support + +If you have questions about how this plugin uses external services or data privacy: + +- **Support**: [https://tawk.to/chat/60eac4b6d6e7610a49aab375/1faah0r3e](https://tawk.to/chat/60eac4b6d6e7610a49aab375/1faah0r3e) +- **Documentation**: [https://bit-integrations.com/wp-docs/](https://bit-integrations.com/wp-docs/) +- **Website**: [https://bit-integrations.com/](https://bit-integrations.com/) + +--- + +**Last Updated**: February 14, 2026 diff --git a/frontend-dev/src/components/AllIntegrations/GoogleSheet/GoogleSheet.jsx b/frontend-dev/src/components/AllIntegrations/GoogleSheet/GoogleSheet.jsx index 59acde23d..d747c9cb7 100644 --- a/frontend-dev/src/components/AllIntegrations/GoogleSheet/GoogleSheet.jsx +++ b/frontend-dev/src/components/AllIntegrations/GoogleSheet/GoogleSheet.jsx @@ -31,19 +31,6 @@ function GoogleSheet({ formFields, setFlow, flow, allIntegURL }) { actions: {} }) - useEffect(() => { - if (sheetConf.oneClickAuthCredentials === undefined) { - const requestParams = { - actionName: 'googleSheet' - } - bitsFetch(null, 'get/credentials', requestParams, 'Get').then(res => { - setSheetConf(prevConf => { - return { ...prevConf, oneClickAuthCredentials: res.data } - }) - }) - } - }, []) - const nextPage = () => { setTimeout(() => { document.getElementById('btcd-settings-wrp').scrollTop = 0 diff --git a/frontend-dev/src/components/AllIntegrations/GoogleSheet/GoogleSheetAuthorization.jsx b/frontend-dev/src/components/AllIntegrations/GoogleSheet/GoogleSheetAuthorization.jsx index 53f3e94b4..6c2707ade 100644 --- a/frontend-dev/src/components/AllIntegrations/GoogleSheet/GoogleSheetAuthorization.jsx +++ b/frontend-dev/src/components/AllIntegrations/GoogleSheet/GoogleSheetAuthorization.jsx @@ -33,30 +33,6 @@ export default function GoogleSheetAuthorization({ const [authData, setAuthData] = useState([]) const [authInfo, setAuthInfo] = useRecoilState(authInfoAtom) const [selectedAuthType, setSelectedAuthType] = useState('Custom Authorization') - // const [selectedUserId, setSelectedUserId] = useState(null) - - //Commented for one click authorization - - // const handleChange = (option) => { - // setSelectedAuthType(option) - // setIsAuthorized(false) - - // setSheetConf((prevConf) => ({ - // ...prevConf, - // selectedAuthType: option, - // ...(option === "One Click Authorization" && process.env.NODE_ENV !== 'development' - // ? { - // clientId: '', - // clientSecret: '', - // } - // : {}), - // })) - - // if (option === "One Click Authorization") { - // processAuth(option); - // } - // setIsLoading(false); - // }; const processAuth = option => { handleAuthorize(sheetConf, option, setError, setIsLoading) @@ -76,26 +52,6 @@ export default function GoogleSheetAuthorization({ }) } - // useEffect(() => { - // if (step === 1) { - // getAuthData() - // } - // }, []) - - // useEffect(() => { - - // if (step === 1 && isEdit) { - - // const authIdExists = authData.find(auth => auth.id === sheetConf.authId); - - // if (authIdExists) { - // setSelectedUserId(sheetConf.authId) - // } else { - // setSelectedUserId(null) - // } - // } - // }, [authData]) - const handleVerificationCode = async authInfo => { await tokenHelper( authInfo, @@ -109,7 +65,6 @@ export default function GoogleSheetAuthorization({ setSnackbar ) setAuthInfo(undefined) - // getAuthData() } useEffect(() => { @@ -128,13 +83,6 @@ export default function GoogleSheetAuthorization({ } const nextPage = () => { - // const selectedAuth = authData.find((item) => item.id === selectedUserId) - // setSheetConf((prevConf) => ({ - // ...prevConf, - // tokenDetails: selectedAuth ? selectedAuth.tokenDetails : '', - // authId: selectedAuth ? selectedAuth.id : '', - // })) - setTimeout(() => { document.getElementById('btcd-settings-wrp').scrollTop = 0 }, 300) @@ -152,16 +100,6 @@ export default function GoogleSheetAuthorization({ )} {googleSheet?.docLink && } - {/*
-

Choose channel

- -
*/} - {selectedAuthType === 'Custom Authorization' && (
@@ -258,19 +196,6 @@ export default function GoogleSheetAuthorization({ }} /> )} - {/* {authData.length > 0 && - <> -

Choose your connected account

- - - } */} {isAuthorized && selectedAuthType === 'One Click Authorization' && (