[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fam4uj-zn3tQ_YE0hCFYl1z4ZhRl4yL7GqITjqjcfvrQ":3},{"slug":4,"name":5,"version":6,"author":7,"author_profile":8,"description":9,"short_description":10,"active_installs":11,"downloaded":12,"rating":11,"num_ratings":13,"last_updated":14,"tested_up_to":15,"requires_at_least":9,"requires_php":9,"tags":16,"homepage":17,"download_link":18,"security_score":11,"vuln_count":19,"unpatched_count":19,"last_vuln_date":20,"fetched_at":21,"vulnerabilities":22,"developer":23,"crawl_stats":20,"alternatives":29,"analysis":30,"fingerprints":254},"happy-texting","Happy Texting","1.2.20","Combustion Group","https:\u002F\u002Fprofiles.wordpress.org\u002Fcombustiongroup\u002F","","This plugin allows you to keep your customer list up to sync with www.happytexting.com",100,4193,1,"2026-01-22T18:25:00.000Z","6.6.5",[],"https:\u002F\u002Fhappytexting.com\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fhappy-texting.1.2.20.zip",0,null,"2026-03-15T15:16:48.613Z",[],{"slug":24,"display_name":7,"profile_url":8,"plugin_count":25,"total_installs":11,"avg_security_score":11,"avg_patch_time_days":26,"trust_score":27,"computed_at":28},"combustiongroup",2,30,94,"2026-04-04T19:05:20.345Z",[],{"attackSurface":31,"codeSignals":187,"taintFlows":227,"riskAssessment":247,"analyzedAt":253},{"hooks":32,"ajaxHandlers":149,"restRoutes":156,"shortcodes":182,"cronEvents":183,"entryPointCount":186,"unprotectedCount":19},[33,39,43,47,51,55,60,64,68,72,76,80,84,86,88,92,96,100,104,108,112,116,120,124,128,132,136,138,140,145],{"type":34,"name":35,"callback":36,"file":37,"line":38},"action","admin_menu","happy_texting_settings_add_plugin_page","core\\class-happy-texting.php",159,{"type":34,"name":40,"callback":41,"file":37,"line":42},"admin_init","happy_texting_settings_page_init",160,{"type":34,"name":44,"callback":45,"file":37,"line":46},"woocommerce_register_form","happy_texting_add_registration_checkbox",161,{"type":34,"name":48,"callback":49,"file":37,"line":50},"woocommerce_review_order_before_submit","happy_texting_add_checkout_checkbox",162,{"type":34,"name":52,"callback":53,"file":37,"line":54},"woocommerce_checkout_update_order_meta","happy_texting_checkout_field_order_meta_db",163,{"type":34,"name":56,"callback":57,"priority":58,"file":37,"line":59},"woocommerce_thankyou","happy_texting_checkout_hook",10,164,{"type":34,"name":61,"callback":62,"priority":58,"file":37,"line":63},"user_register","happy_texting_registration_hook",165,{"type":34,"name":65,"callback":66,"priority":58,"file":37,"line":67},"profile_update","happy_texting_profile_update_hook",168,{"type":34,"name":69,"callback":70,"priority":58,"file":37,"line":71},"edit_user_profile_update","happy_texting_admin_profile_update_hook",169,{"type":34,"name":73,"callback":74,"priority":58,"file":37,"line":75},"woocommerce_save_account_details","happy_texting_account_update_hook",170,{"type":34,"name":77,"callback":78,"priority":58,"file":37,"line":79},"personal_options_update","happy_texting_user_self_update_hook",171,{"type":34,"name":81,"callback":82,"file":37,"line":83},"rest_api_init","closure",173,{"type":34,"name":81,"callback":82,"file":37,"line":85},198,{"type":34,"name":81,"callback":82,"file":37,"line":87},223,{"type":34,"name":89,"callback":90,"priority":58,"file":37,"line":91},"wc_autoship_hmp_subscriptions_create","happy_texting_wc_autoship_hmp_subscriptions_create",252,{"type":34,"name":93,"callback":94,"priority":58,"file":37,"line":95},"wc_autoship_hmp_subscriptions_active","happy_texting_wc_autoship_hmp_subscriptions_active",253,{"type":34,"name":97,"callback":98,"priority":58,"file":37,"line":99},"wc_autoship_hmp_subscriptions_pause","happy_texting_wc_autoship_hmp_subscriptions_pause",254,{"type":34,"name":101,"callback":102,"priority":58,"file":37,"line":103},"wc_autoship_hmp_subscriptions_fail","happy_texting_wc_autoship_hmp_subscriptions_fail",255,{"type":34,"name":105,"callback":106,"priority":58,"file":37,"line":107},"wc_autoship_hmp_subscriptions_delete","happy_texting_wc_autoship_hmp_subscriptions_delete",256,{"type":34,"name":109,"callback":110,"priority":58,"file":37,"line":111},"wc_autoship_schedule_delete","happy_texting_wc_autoship_schedule_delete",257,{"type":34,"name":113,"callback":114,"priority":58,"file":37,"line":115},"wc_autoship_hmp_subscription_order_create","happy_texting_wc_autoship_hmp_subscription_order_create",258,{"type":34,"name":117,"callback":118,"priority":58,"file":37,"line":119},"wc_autoship_hmp_subscription_order_fail","happy_texting_wc_autoship_hmp_subscription_order_fail",259,{"type":34,"name":121,"callback":122,"file":37,"line":123},"admin_enqueue_scripts","happy_texting_settings_page_style",261,{"type":34,"name":125,"callback":126,"file":37,"line":127},"woocommerce_order_status_changed","happy_texting_send_message_on_wc_order_change",264,{"type":34,"name":129,"callback":130,"file":37,"line":131},"happy_texting_cleanup_logs","cleanup_old_logs",267,{"type":34,"name":133,"callback":134,"file":37,"line":135},"plugins_loaded","load_textdomain",339,{"type":34,"name":81,"callback":82,"file":37,"line":137},2260,{"type":34,"name":81,"callback":82,"file":37,"line":139},2312,{"type":34,"name":121,"callback":141,"priority":142,"file":143,"line":144},"enqueue_backend_scripts_and_styles",20,"core\\includes\\classes\\class-happy-texting-run.php",45,{"type":34,"name":133,"callback":146,"file":147,"line":148},"happy_texting_check_version_updates","happy-texting.php",90,[150],{"action":151,"nopriv":152,"callback":153,"hasNonce":154,"hasCapCheck":152,"file":143,"line":155},"my_demo_ajax_call",false,"my_demo_ajax_call_callback",true,46,[157,163,167,172,177],{"namespace":158,"route":159,"methods":160,"callback":159,"permissionCallback":82,"file":37,"line":162},"wc\u002Fv3","texting_webhook",[161],"GET",174,{"namespace":158,"route":164,"methods":165,"callback":164,"permissionCallback":82,"file":37,"line":166},"texting_webhook_auth_verify",[161],199,{"namespace":158,"route":168,"methods":169,"callback":168,"permissionCallback":82,"file":37,"line":171},"texting_webhook_bulk",[170],"POST",224,{"namespace":158,"route":173,"methods":174,"callback":175,"permissionCallback":82,"file":37,"line":176},"customers\u002Fschedules",[161],"get_customers_with_schedules",2261,{"namespace":158,"route":178,"methods":179,"callback":180,"permissionCallback":82,"file":37,"line":181},"customers\u002Fsubscription-statistics",[161],"get_subscription_statistics_endpoint",2313,[],[184],{"hook":129,"callback":129,"file":37,"line":185},269,6,{"dangerousFunctions":188,"sqlUsage":189,"outputEscaping":199,"fileOperations":19,"externalRequests":58,"nonceChecks":25,"capabilityChecks":19,"bundledLibraries":226},[],{"prepared":190,"raw":25,"locations":191},26,[192,196],{"file":193,"line":194,"context":195},"core\\includes\\classes\\class-happy-texting-logs.php",127,"$wpdb->get_var() with variable interpolation",{"file":193,"line":197,"context":198},140,"$wpdb->query() with variable interpolation",{"escaped":200,"rawEcho":201,"locations":202},122,11,[203,207,209,211,213,215,217,219,221,223,225],{"file":204,"line":205,"context":206},"core\\templates\\happy-texting-message-logs.php",25,"raw output",{"file":204,"line":208,"context":206},29,{"file":204,"line":210,"context":206},37,{"file":204,"line":212,"context":206},42,{"file":204,"line":214,"context":206},57,{"file":204,"line":216,"context":206},58,{"file":204,"line":218,"context":206},59,{"file":204,"line":220,"context":206},60,{"file":204,"line":222,"context":206},61,{"file":204,"line":224,"context":206},81,{"file":204,"line":148,"context":206},[],[228],{"entryPoint":229,"graph":230,"unsanitizedCount":19,"severity":246},"\u003Chappy-texting-logs> (core\\templates\\happy-texting-logs.php:0)",{"nodes":231,"edges":244},[232,238],{"id":233,"type":234,"label":235,"file":236,"line":237},"n0","source","$_GET (x6)","core\\templates\\happy-texting-logs.php",574,{"id":239,"type":240,"label":241,"file":236,"line":242,"wp_function":243},"n1","sink","echo() [XSS]",589,"echo",[245],{"from":233,"to":239,"sanitized":154},"low",{"summary":248,"deductions":249},"The plugin 'happy-texting' v1.2.20 exhibits a generally strong security posture based on the provided static analysis and vulnerability history. The absence of known CVEs and a history of vulnerabilities is a positive indicator. The static analysis reveals a well-protected attack surface, with all identified entry points (AJAX handlers, REST API routes, cron events) appearing to have authentication checks in place. Furthermore, the code demonstrates good practices in handling SQL queries, with a high percentage (93%) utilizing prepared statements, and a significant portion of outputs (92%) being properly escaped. The lack of dangerous functions, file operations, and critical\u002Fhigh severity taint flows further contributes to its secure appearance.\n\nHowever, there are areas for potential improvement. The presence of capability checks at zero is concerning, as this implies that none of the entry points are being protected by WordPress role-based permissions. This could be a weakness if the AJAX or REST API endpoints are intended to be restricted to specific user roles. Additionally, while the number of external HTTP requests is moderate, each represents a potential vector for supply chain attacks or data leakage if not handled with utmost care. The two nonce checks are present, but their limited number in relation to the total entry points could suggest an incomplete security implementation for all interactive elements.\n\nIn conclusion, 'happy-texting' v1.2.20 appears to be a relatively secure plugin with a clean vulnerability history and good data handling practices. The primary concern lies in the lack of capability checks, which needs to be investigated to ensure all sensitive functionalities are appropriately permissioned. The overall security is good, but not perfect, and a review of capability checks on all relevant entry points is recommended to solidify its defenses.",[250],{"reason":251,"points":252},"No capability checks on entry points",15,"2026-03-16T20:49:57.032Z",{"wat":255,"direct":266},{"assetPaths":256,"generatorPatterns":260,"scriptPaths":261,"versionParams":262},[257,258,259],"\u002Fwp-content\u002Fplugins\u002Fhappy-texting\u002Fcss\u002Fhappy-texting-admin.css","\u002Fwp-content\u002Fplugins\u002Fhappy-texting\u002Fjs\u002Fhappy-texting-admin.js","\u002Fwp-content\u002Fplugins\u002Fhappy-texting\u002Fjs\u002Fhappy-texting-public.js",[],[258,259],[263,264,265],"happy-texting\u002Fcss\u002Fhappy-texting-admin.css?ver=","happy-texting\u002Fjs\u002Fhappy-texting-admin.js?ver=","happy-texting\u002Fjs\u002Fhappy-texting-public.js?ver=",{"cssClasses":267,"htmlComments":270,"htmlAttributes":273,"restEndpoints":275,"jsGlobals":276,"shortcodeOutput":278},[268,269],"happy-texting-notice","happy-texting-form-field-wrap",[271,272],"Happy Texting - This is where you can add your custom code. It will be printed before the closing \u003C\u002Fhead> tag on the front end. ","The main function to load the only instance of our master class.",[274],"data-happy-texting-id",[],[277],"happy_texting_ajax_object",[]]