Plugin Directory

Changeset 3421916


Ignore:
Timestamp:
12/17/2025 12:54:14 PM (3 months ago)
Author:
feedspace
Message:

Update to version 1.0.6 - Fixed WordPress.org guideline violations (plugin name, superlative claims), security improvements (CSRF protection, input sanitization, XSS prevention)

Location:
feedspace/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • feedspace/trunk/build/js/widgets-block.js

    r3400157 r3421916  
    1 !function(){"use strict";var e=wp.blocks,t=wp.i18n,a=wp.blockEditor,s=wp.components,d=wp.element;(0,e.registerBlockType)("feedspace/widgets",{apiVersion:3,title:(0,t.__)("Feedspace Widget","feedspace"),description:(0,t.__)("Display any Feedspace widget using widget code.","feedspace"),category:"feedspace",icon:"embed-generic",keywords:[(0,t.__)("widget","feedspace"),(0,t.__)("feedspace","feedspace"),(0,t.__)("widget","feedspace"),(0,t.__)("reviews","feedspace")],supports:{html:!1,align:["wide","full"]},attributes:{widgetId:{type:"string",default:""},embedCode:{type:"string",default:""},align:{type:"string",default:"wide"},className:{type:"string",default:""}},edit:function({attributes:e,setAttributes:i}){const{widgetId:c,embedCode:l,align:n}=e,[r,p]=(0,d.useState)(""),[o,f]=(0,d.useState)(!1),[m,u]=(0,d.useState)(""),[g,w]=(0,d.useState)(!1),_=(0,a.useBlockProps)({className:`wp-block-feedspace-widgets align${n}`}),v=e=>{if(!e)return{valid:!1,error:""};const a=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(e),s=/^[a-zA-Z0-9._-]+$/.test(e)&&e.length>=8;return a||s?{valid:!0,error:""}:{valid:!1,error:(0,t.__)("Widget ID must be a valid UUID or alphanumeric string (8+ characters)","feedspace")}};return(0,d.useEffect)(()=>{if(c&&g)p(`<div class="feedspace-embed" data-id="${c}"></div>`);else if(l){const e=l.match(/<div[^>]*class="[^"]*feedspace-widget[^"]*"[^>]*data-id="([^"]*)"[^>]*>/);if(e){const t=e[1];p(`<div class="feedspace-widget" data-id="${t}"></div>`)}else p(l)}else p("")},[c,l,g]),(0,d.useEffect)(()=>{if(!document.querySelector('script[src*="js.feedspace.io"]')){const e=document.createElement("script");e.src=window.feedspace_admin&&window.feedspace_admin.widgetScriptUrl||window.feedspace_admin&&window.feedspace_admin.widgetScriptFallbackUrl||"https://js.feedspace.io/v1/embed/embed.min.js",e.type="text/javascript",e.async=!0,document.head.appendChild(e)}},[]),(0,d.useEffect)(()=>{if(c){const e=v(c);w(e.valid)}else if(l){const e=extractWidgetIdFromEmbedCode(l);if(e){const t=v(e);w(t.valid)}}},[]),React.createElement("div",_,React.createElement(a.InspectorControls,null,React.createElement(s.PanelBody,{title:(0,t.__)("Widget Settings","feedspace"),initialOpen:!0},React.createElement(s.TextControl,{label:(0,t.__)("Widget ID","feedspace"),value:c,onChange:e=>{i({widgetId:e}),u(""),f(!0),setTimeout(()=>{const t=v(e);w(t.valid),u(t.error),f(!1)},500)},help:(0,t.__)("Enter your Feedspace Widget ID directly (recommended)","feedspace"),placeholder:(0,t.__)("e.g., 12345678-1234-1234-1234-123456789abc","feedspace")}),o&&React.createElement("div",{className:"feedspace-validation-status"},React.createElement(s.Spinner,null),React.createElement("span",null,(0,t.__)("Validating...","feedspace"))),m&&React.createElement(s.Notice,{status:"error",isDismissible:!1},m),c&&g&&!o&&React.createElement(s.Notice,{status:"success",isDismissible:!1},(0,t.__)("Widget ID is valid!","feedspace")))),React.createElement("div",{className:"feedspace-widgets-preview"},r?React.createElement("div",{className:"feedspace-widget-preview",dangerouslySetInnerHTML:{__html:r}}):React.createElement("div",{className:"feedspace-widget-placeholder"},React.createElement("p",null,(0,t.__)("Feedspace Widget Preview","feedspace")),React.createElement("p",null,(0,t.__)("Enter a Widget ID to get started","feedspace")))))},save:function(){return null}})}();
     1!function(){"use strict";var e=wp.blocks,t=wp.i18n,a=wp.blockEditor,s=wp.components,d=wp.element;(0,e.registerBlockType)("feedspace/widgets",{apiVersion:3,title:(0,t.__)("Feedspace Widget","feedspace"),description:(0,t.__)("Display any Feedspace widget using widget code.","feedspace"),category:"feedspace",icon:"embed-generic",keywords:[(0,t.__)("widget","feedspace"),(0,t.__)("feedspace","feedspace"),(0,t.__)("widget","feedspace"),(0,t.__)("reviews","feedspace")],supports:{html:!1,align:["wide","full"]},attributes:{widgetId:{type:"string",default:""},embedCode:{type:"string",default:""},align:{type:"string",default:"wide"},className:{type:"string",default:""}},edit:function({attributes:e,setAttributes:c}){const{widgetId:i,embedCode:n,align:l}=e,[r,p]=(0,d.useState)(""),[o,f]=(0,d.useState)(!1),[m,u]=(0,d.useState)(""),[g,w]=(0,d.useState)(!1),_=(0,a.useBlockProps)({className:`wp-block-feedspace-widgets align${l}`}),v=e=>{if(!e)return{valid:!1,error:""};const a=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(e),s=/^[a-zA-Z0-9._-]+$/.test(e)&&e.length>=8;return a||s?{valid:!0,error:""}:{valid:!1,error:(0,t.__)("Widget ID must be a valid UUID or alphanumeric string (8+ characters)","feedspace")}},E=e=>{const t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"};return e.replace(/[&<>"']/g,e=>t[e])};return(0,d.useEffect)(()=>{if(i&&g){const e=E(i);p(`<div class="feedspace-embed" data-id="${e}"></div>`)}else if(n){const e=n.match(/<div[^>]*class="[^"]*feedspace-widget[^"]*"[^>]*data-id="([^"]*)"[^>]*>/);if(e){const t=e[1],a=E(t);p(`<div class="feedspace-widget" data-id="${a}"></div>`)}else p("")}else p("")},[i,n,g]),(0,d.useEffect)(()=>{if(!document.querySelector('script[src*="js.feedspace.io"]')){const e=document.createElement("script");e.src=window.feedspace_admin&&window.feedspace_admin.widgetScriptUrl||window.feedspace_admin&&window.feedspace_admin.widgetScriptFallbackUrl||"https://js.feedspace.io/v1/embed/embed.min.js",e.type="text/javascript",e.async=!0,document.head.appendChild(e)}},[]),(0,d.useEffect)(()=>{if(i){const e=v(i);w(e.valid)}else if(n){const e=extractWidgetIdFromEmbedCode(n);if(e){const t=v(e);w(t.valid)}}},[]),React.createElement("div",_,React.createElement(a.InspectorControls,null,React.createElement(s.PanelBody,{title:(0,t.__)("Widget Settings","feedspace"),initialOpen:!0},React.createElement(s.TextControl,{label:(0,t.__)("Widget ID","feedspace"),value:i,onChange:e=>{c({widgetId:e}),u(""),f(!0),setTimeout(()=>{const t=v(e);w(t.valid),u(t.error),f(!1)},500)},help:(0,t.__)("Enter your Feedspace Widget ID directly (recommended)","feedspace"),placeholder:(0,t.__)("e.g., 12345678-1234-1234-1234-123456789abc","feedspace")}),o&&React.createElement("div",{className:"feedspace-validation-status"},React.createElement(s.Spinner,null),React.createElement("span",null,(0,t.__)("Validating...","feedspace"))),m&&React.createElement(s.Notice,{status:"error",isDismissible:!1},m),i&&g&&!o&&React.createElement(s.Notice,{status:"success",isDismissible:!1},(0,t.__)("Widget ID is valid!","feedspace")))),React.createElement("div",{className:"feedspace-widgets-preview"},r?React.createElement("div",{className:"feedspace-widget-preview",dangerouslySetInnerHTML:{__html:r}}):React.createElement("div",{className:"feedspace-widget-placeholder"},React.createElement("p",null,(0,t.__)("Feedspace Widget Preview","feedspace")),React.createElement("p",null,(0,t.__)("Enter a Widget ID to get started","feedspace")))))},save:function(){return null}})}();
    22//# sourceMappingURL=widgets-block.js.map
  • feedspace/trunk/feedspace.php

    r3419846 r3421916  
    99 *
    1010 * @wordpress-plugin
    11  * Plugin Name:       Feedspace: Best Testimonials & Reviews Widget for WordPress Sites
     11 * Plugin Name:       Feedspace Review Widgets
    1212 * Plugin URI:        https://feedspace.io/
    1313 * Description:       Embed Feedspace widgets using widget IDs with a modern, user-friendly interface.
    14  * Version:           1.0.5
     14 * Version:           1.0.6
    1515 * Requires at least: 5.0
    1616 * Requires PHP:      7.0
     
    3030
    3131// Define plugin constants.
    32 define( 'FEEDSPACE_VERSION', '1.0.5' );
     32define( 'FEEDSPACE_VERSION', '1.0.6' );
    3333define( 'FEEDSPACE_PLUGIN_FILE', __FILE__ );
    3434define( 'FEEDSPACE_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
  • feedspace/trunk/includes/class-feedspace-admin.php

    r3400157 r3421916  
    235235    public function ajax_save_advanced_settings() {
    236236        // Verify nonce
    237         if ( ! wp_verify_nonce( $_POST['nonce'], 'feedspace_admin_nonce' ) ) {
     237        if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'feedspace_admin_nonce' ) ) {
    238238            wp_die( esc_html__( 'Security check failed.', 'feedspace' ) );
    239239        }
     
    245245
    246246        // Save preserve settings option
    247         $preserve_settings = isset( $_POST['preserve_settings'] ) ? (bool) $_POST['preserve_settings'] : false;
     247        $preserve_settings = isset( $_POST['preserve_settings'] ) ? (bool) sanitize_text_field( wp_unslash( $_POST['preserve_settings'] ) ) : false;
    248248        update_option( Feedspace_Constants::OPTION_PRESERVE_SETTINGS, $preserve_settings );
    249249
  • feedspace/trunk/readme.txt

    r3421082 r3421916  
    1 === Feedspace: Best Testimonials & Reviews Widget for WordPress Sites ===
     1=== Feedspace Review Widgets ===
    22Contributors: feedspace
    33Tags: testimonials, reviews, widgets
     
    55Tested up to: 6.8
    66Requires PHP: 7.0
    7 Stable tag: 1.0.5
     7Stable tag: 1.0.6
    88License: GPL-2.0-or-later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    2929✔ Customize layouts, colors, and styles without coding
    3030✔ Show reviewer names, roles, photos, and star ratings
    31 ✔ Works with Elementor, Gutenberg, and all major page builders
     31✔ Works with Elementor, Gutenberg, and popular page builders
    3232✔ Suitable for any type of website, including SaaS, agencies, and eCommerce
    3333
     
    4141✔ Easy Customization
    4242✔ Import & Sync Easily
    43 Best SEO & Performance
     43Excellent SEO & Performance
    4444✔ Smooth Integration
    4545
Note: See TracChangeset for help on using the changeset viewer.