Plugin Directory

Changeset 2724522


Ignore:
Timestamp:
05/16/2022 11:33:17 AM (4 years ago)
Author:
pressmate
Message:

Security updates for plugin approval

Location:
makestories-helper/trunk
Files:
1 added
20 edited

Legend:

Unmodified
Added
Removed
  • makestories-helper/trunk/api/media.php

    r2481763 r2724522  
    1010        'post_status'    => 'inherit',
    1111        'posts_per_page' => 30,
    12         'paged' => isset($_REQUEST["page"]) ? $_REQUEST["page"] : 1,
     12        'paged' => isset($_REQUEST["page"]) ? sanitize_text_field($_REQUEST["page"]) : 1,
    1313    );
    1414
    15     $toSearch = isset($_REQUEST["search"]) ? $_REQUEST["search"] : false;
     15    $toSearch = isset($_REQUEST["search"]) ? sanitize_text_field($_REQUEST["search"]) : false;
    1616
    1717    // Filter query clauses to include filenames.
  • makestories-helper/trunk/api/publish.php

    r2659092 r2724522  
    1010    header("Content-Type: application/json");
    1111    if((isset($_REQUEST["slug"]) || isset($_REQUEST["post_id"])) && isset($_REQUEST["story"])){
    12         $storyId = $_REQUEST["story"];
    13         $r = ms_get_story_HTML($_GET['story']);
     12        $storyId = sanitize_text_field($_REQUEST["story"]);
     13        $r = ms_get_story_HTML($storyId);
    1414        $parsed = json_decode($r, true);
    1515        $html = $parsed['html'];
     
    1717
    1818        if(isset($_REQUEST['post_id'])) {
    19             $post = get_post((int)$_REQUEST['post_id']);
     19            $post = get_post((int)sanitize_text_field($_REQUEST['post_id']));
    2020            if ($post && $post->post_status != 'trash') {
    2121                $post = $post->ID;
    2222                $toCreate = false;
    2323
    24                 $pages = $_REQUEST["slides"];
     24                $pages = sanitize_text_field($_REQUEST["slides"]);
    2525                update_post_meta($post,"pages", $pages);
    2626            } else {
     
    2828            }
    2929        }else{
    30             $slug = $_REQUEST["slug"];
     30            $slug = sanitize_text_field($_REQUEST["slug"]);
    3131            $post = wp_insert_post([
    3232                "post_content" => $html,
     
    3838
    3939            if ($post) {
    40                 $pages = $_REQUEST["slides"];
     40                $pages = sanitize_text_field($_REQUEST["slides"]);
    4141                add_post_meta($post,"pages", $pages);
    4242            }
     
    116116            $category = ms_get_default_category();
    117117            if(isset($_REQUEST['category']) && !empty($_REQUEST['category'])){
    118                 $category = $_REQUEST['category'];
     118                $category = sanitize_text_field($_REQUEST['category']);
    119119            }
    120120            wp_set_post_terms($post, $category, MS_TAXONOMY);
    121121        }
    122122        $link = get_post_permalink($post);
    123         $slug = $_REQUEST["slug"];
     123        $slug = sanitize_text_field($_REQUEST["slug"]);
    124124        wp_update_post([
    125125            "post_content" => str_ireplace(MS_WORDPRESS_CANONICAL_SUBSTITUTION_PLACEHOLDER, $link, $html),
     
    401401    ];
    402402    if(isset($_REQUEST['story'])){
    403         $storyId = $_REQUEST['story'];
    404         $postType = $_REQUEST['post_type'];
    405         $postKey = $_REQUEST['post_key'];
     403        $storyId = sanitize_text_field($_REQUEST['story']);
     404        $postType = sanitize_text_field($_REQUEST['post_type']);
     405        $postKey = sanitize_text_field($_REQUEST['post_key']);
    406406        $args = [
    407407            "post_type" => $postType,
     
    434434    ];
    435435    if(isset($_REQUEST['story']) && isset($_REQUEST['post_id'])){
    436         $storyId = $_REQUEST['story'];
    437         $postId = $_REQUEST['post_id'];
     436        $storyId = sanitize_text_field($_REQUEST['story']);
     437        $postId = sanitize_text_field($_REQUEST['post_id']);
    438438        $args = [
    439439            "post_type" => MS_POST_TYPE,
     
    465465    $media = [];
    466466    if(isset($_REQUEST['post_id'])){
    467         $postId = $_REQUEST['post_id'];
     467        $postId = sanitize_text_field($_REQUEST['post_id']);
    468468        $post = get_post($postId);
    469469        $content = $post->post_content;
     
    605605    if($_REQUEST['post'] && $_REQUEST['slug']){
    606606        header("Content-Type: application/json");
    607         $postId = $_REQUEST['post'];
    608         $newTitle = $_REQUEST['slug'];
     607        $postId = sanitize_text_field($_REQUEST['post']);
     608        $newTitle = sanitize_text_field($_REQUEST['slug']);
    609609        $post = get_post($postId);
    610610        if($post){
  • makestories-helper/trunk/api/widget.php

    r2659092 r2724522  
    1010    ms_protect_ajax_route();
    1111    header("Content-Type: application/json");
    12     if((isset($_REQUEST["widgetId"]) && isset($_REQUEST["widgetName"]) && isset($_REQUEST["container"])) && isset($_REQUEST["script"]) && isset($_REQUEST["type"]) && isset($_REQUEST['divId'])){
    13         $widgetId = $_REQUEST["widgetId"];
    14         $title = $_REQUEST["widgetName"];
    15         $slug = $_REQUEST["slug"];
    16         $container = $_REQUEST["container"];
    17         $script = $_REQUEST["script"];
    18         $jsBlock = $_REQUEST["scriptBlock"];
    19         $type = $_REQUEST["type"];
    20         $categories = $_REQUEST["tagsSelected"];
    21         $design = $_REQUEST["designSelected"];
    22         $divId = $_REQUEST['divId'];
     12    if(
     13        isset($_REQUEST["widgetId"]) &&
     14        isset($_REQUEST["widgetName"]) &&
     15        isset($_REQUEST["container"]) &&
     16        isset($_REQUEST["script"]) &&
     17        isset($_REQUEST["type"]) &&
     18        isset($_REQUEST['divId'])
     19    ){
     20        $widgetId = sanitize_text_field($_REQUEST["widgetId"]);
     21        $title = sanitize_text_field($_REQUEST["widgetName"]);
     22        $slug = sanitize_text_field($_REQUEST["slug"]);
     23        $container = sanitize_text_field($_REQUEST["container"]);
     24        $script = sanitize_text_field($_REQUEST["script"]);
     25        $jsBlock = sanitize_text_field($_REQUEST["scriptBlock"]);
     26        $type = sanitize_text_field($_REQUEST["type"]);
     27        $categories = sanitize_text_field($_REQUEST["tagsSelected"]);
     28        $design = sanitize_text_field($_REQUEST["designSelected"]);
     29        $divId = sanitize_text_field($_REQUEST['divId']);
    2330
    2431        if(isset($_REQUEST['widgetPostId'])) {
    25             $post_id = get_post((int)$_REQUEST['widgetPostId']);
     32            $widgetPostId = (int)sanitize_text_field($_REQUEST['widgetPostId']);
     33            $post_id = get_post($widgetPostId);
    2634            if ($post_id && $post_id->post_status != 'trash') {
    2735                $post_id = $post_id->ID;
     
    4856            }
    4957        } else {
    50             $slug = $_REQUEST["slug"];
     58            $slug = sanitize_text_field($_REQUEST["slug"]);
    5159            $post_id = wp_insert_post([
    5260                "post_content" => $container,
  • makestories-helper/trunk/basic-auth.php

    r2481763 r2724522  
    1111        return $user;
    1212    }
    13     $username = $_SERVER['PHP_AUTH_USER'];
    14     $password = $_SERVER['PHP_AUTH_PW'];
     13    $username = sanitize_text_field($_SERVER['PHP_AUTH_USER']);
     14    $password = sanitize_text_field($_SERVER['PHP_AUTH_PW']);
    1515    /**
    1616     * In multi-site, wp_authenticate_spam_check filter is run on authentication. This filter calls
  • makestories-helper/trunk/config.php

    r2717916 r2724522  
    8989    "storyasset.link",
    9090]);
     91
     92define("MS_PLUGIN_BASE_FILE_PATH", plugin_dir_path( __DIR__ ));
  • makestories-helper/trunk/helpers.php

    r2659092 r2724522  
    7575    $options['categories_enabled'] = isset($_POST['categories_enabled']);
    7676    if(isset($_POST['post_slug'])){
    77         $options['post_slug'] = $_POST['post_slug'];
     77        $options['post_slug'] = sanitize_text_field($_POST['post_slug']);
    7878    }
    7979    if(isset($_POST['default_category'])){
    80         $options['default_category'] = $_POST['default_category'];
     80        $options['default_category'] = sanitize_text_field($_POST['default_category']);
    8181    }
    8282    if(isset($_POST['roles']) && is_array($_POST['roles'])){
    83         $options['roles'] = $_POST['roles'];
     83        $options['roles'] = sanitize_text_field($_POST['roles']);
    8484    }
    8585    $options['to_rewrite'] = true;
  • makestories-helper/trunk/hooks.php

    r2712777 r2724522  
    248248// Load more stories using ajax
    249249function mscpt_more_post_ajax(){
    250     $offset = $_POST["offset"];
    251     $ppp = $_POST["ppp"];
     250    $offset = sanitize_text_field($_POST["offset"]);
     251    $ppp = sanitize_text_field($_POST["ppp"]);
    252252
    253253    // header("Content-Type: text/html");
     
    297297//function to reinitialize story player class
    298298function mscpt_load_post_data_ajax() {
    299     $offset = $_POST["offset"];
    300     $ppp = $_POST["ppp"];
     299    $offset = sanitize_text_field($_POST["offset"]);
     300    $ppp = sanitize_text_field($_POST["ppp"]);
    301301
    302302    header("Content-Type: text/html");
  • makestories-helper/trunk/makestories.php

    r2717916 r2724522  
    44Plugin URI:     https://makestories.io/official-wordpress-webstories-plugin/
    55Description:    The leading Google Web Stories Editor is now available to create Stories in WordPress. It is easy to use, allows for extensive customization, and is adaptive for future changes.
    6 Version:        2.6.4
     6Version:        2.6.5
    77Author:         MakeStories Team
    88Author URI:     https://makestories.io
  • makestories-helper/trunk/pages/category-structure.php

    r2526622 r2724522  
    88    // Check if the form is submitted
    99    if ( isset( $_POST['category'] ) ) {
    10         $category = $_POST['category'];
     10        $category = sanitize_text_field($_POST['category']);
    1111       
    1212        wp_insert_term(
     
    3434                <th scope="row"><label for="slug">Slug</label></th>
    3535                <td>
    36                     <input id="slug" type="text" name="post_slug" value="<?php if($options['post_slug']){ echo $options['post_slug']; } ?>" class="regular-text">
     36                    <input id="slug" type="text" name="post_slug" value="<?php if($options['post_slug']){ echo esc_html($options['post_slug']); } ?>" class="regular-text">
    3737                </td>
    3838            </tr>
     
    5959                        ]);
    6060                        foreach($categories as $category) { ?>
    61                             <option <?php if($selected === $category->name){ echo "selected"; } ?> value="<?php echo $category->name; ?>"><?php echo $category->name; ?></option>
     61                            <option <?php if($selected === $category->name){ echo "selected"; } ?> value="<?php echo esc_attr($category->name); ?>"><?php echo esc_html($category->name); ?></option>
    6262                            <?php
    6363                        }
     
    7777                        <?php
    7878                        foreach($roleNames as $role => $roleName) { ?>
    79                             <label for="role_input_<?php echo $role; ?>">
    80                                 <input name="roles[]" type="checkbox" id="role_input_<?php echo $role; ?>" value="<?php echo $role; ?>"  <?php if(in_array($role, $options['roles'])){ echo "checked"; } ?>>
    81                                 <?php echo $roleName; ?></label>
     79                            <label for="role_input_<?php echo esc_html($role); ?>">
     80                                <input name="roles[]" type="checkbox" id="role_input_<?php echo esc_html($role); ?>" value="<?php echo esc_html($role); ?>"  <?php if(in_array($role, $options['roles'])){ echo "checked"; } ?>>
     81                                <?php echo esc_html($roleName); ?></label>
    8282                            <br>
    8383                            <?php
  • makestories-helper/trunk/pages/index.php

    r2481763 r2724522  
    5858function mscpt_amp_story_load_editor(){
    5959    if(is_admin() && isset($_GET['page'])){
    60         $pagenow = $_GET['page'];
     60        $pagenow = sanitize_text_field($_GET['page']);
    6161        if($pagenow === MS_ROUTING['EDITOR']['slug']){
    62             $subpage = isset($_GET['mspage']) ? $_GET['mspage'] : "homepage";
     62            $subpage = isset($_GET['mspage']) ? sanitize_text_field($_GET['mspage']) : "homepage";
    6363            if($subpage === "preview" && isset($_GET['story'])){
    64                 $r = ms_get_story_HTML($_GET['story']);
     64                $r = ms_get_story_HTML(sanitize_text_field($_GET['story']));
    6565                $parsed = json_decode($r, true);
    6666                if(is_array($parsed) && isset($parsed['html'])){
    67                     echo $parsed['html'];
     67                    echo esc_html($parsed['html']);
    6868                    die();
    6969                }
     
    7474
    7575function ms_editor_contents() {
    76     $subpage = isset($_GET['mspage']) ? $_GET['mspage'] : "homepage";
     76    $subpage = isset($_GET['mspage']) ? sanitize_text_field($_GET['mspage']) : "homepage";
    7777    require_once(MS_PLUGIN_BASE_PATH."/templates/editor.php");
    7878//    die();
     
    8484function ms_folded_menu($classes){
    8585    if(is_admin() && isset($_GET['page'])){
    86         $pagenow = $_GET['page'];
     86        $pagenow = sanitize_text_field($_GET['page']);
    8787        if($pagenow === MS_ROUTING['EDITOR']['slug']){
    8888            return $classes." folded";
     
    9595function isMSEditorPage(){
    9696    if(is_admin() && isset($_GET['page'])){
    97         $pagenow = $_GET['page'];
     97        $pagenow = sanitize_text_field($_GET['page']);
    9898        return $pagenow === MS_ROUTING['EDITOR']['slug'];
    9999    }
     
    112112    if(isMSEditorPage()){
    113113        require_once(MS_PLUGIN_BASE_PATH."/templates/editor-footer.php");
     114        wp_enqueue_script("ms_manifest_script_url", MS_MANIFEST_SCRIPT_URL, [], false, true);
     115        wp_enqueue_script("ms_vendor_script_url", MS_VENDOR_SCRIPT_URL, [], false, true);
     116        wp_enqueue_script("ms_main_script_url", MS_MAIN_SCRIPT_URL, [], false, true);
    114117    }
    115118}
  • makestories-helper/trunk/readme.txt

    r2712777 r2724522  
    44Requires at least: 4.0
    55Tested up to: 5.9.3
     6Stable tag: 2.6.5
    67Requires PHP: 5.6
    78
  • makestories-helper/trunk/shortcode.php

    r2659092 r2724522  
    1414    <section class="default-stories">
    1515    <?php if ($postCount > 0) { ?>
    16     <div id="ajax-posts" class="stories-group" data-posts="<?php echo $default_posts_per_page; ?>" data-ajax="<?php echo $getAjaxUrl; ?>" class="row">
     16    <div id="ajax-posts" class="stories-group" data-posts="<?php echo esc_attr($default_posts_per_page); ?>" data-ajax="<?php echo esc_attr($getAjaxUrl); ?>" class="row">
    1717        <?php
    1818        $postsPerPage = $default_posts_per_page;
  • makestories-helper/trunk/taxonomy-ms_story_category.php

    r2516559 r2724522  
    2020?>
    2121<section class="default-stories">
    22     <h3><?php $term = get_term($int_cat,MS_TAXONOMY); echo $term->name; ?></h3>
     22    <h3><?php $term = get_term($int_cat,MS_TAXONOMY); echo esc_html($term->name); ?></h3>
    2323    <div class="stories-group">
    2424        <?php
  • makestories-helper/trunk/templates/archive-stories.php

    r2659092 r2724522  
    88<section class="default-stories">
    99    <?php if ($postCount > 0) { ?>
    10     <div id="ajax-posts" class="stories-group" data-posts="<?php echo $default_posts_per_page; ?>" data-ajax="<?php echo $getAjaxUrl; ?>" class="row">
     10    <div id="ajax-posts" class="stories-group" data-posts="<?php echo esc_attr($default_posts_per_page); ?>" data-ajax="<?php echo esc_attr($getAjaxUrl); ?>" class="row">
    1111        <?php
    1212        $postsPerPage = $default_posts_per_page;
  • makestories-helper/trunk/templates/editor-footer.php

    r2404028 r2724522  
    2828    })();
    2929</script>
    30 <script src="<?php echo MS_MANIFEST_SCRIPT_URL ?>"></script>
    31 <script src="<?php echo MS_VENDOR_SCRIPT_URL ?>"></script>
    32 <script src="<?php echo MS_MAIN_SCRIPT_URL ?>"></script>
  • makestories-helper/trunk/templates/editor.php

    r2698925 r2724522  
    1111    ?>
    1212    const msWPConfig = {
    13         wpBaseUrl: '<?php echo get_site_url(""); ?>',
    14         currentPage: "<?php echo $subpage; ?>",
    15         wpAdminBaseURL: '<?php echo MS_WP_ADMIN_BASE_URL; ?>',
     13        wpBaseUrl: '<?php echo esc_html(get_site_url("")); ?>',
     14        currentPage: "<?php echo esc_html($subpage); ?>",
     15        wpAdminBaseURL: '<?php echo esc_html(MS_WP_ADMIN_BASE_URL); ?>',
    1616        adminAjaxUrl: '<?php echo admin_url('admin-ajax.php') ?>',
    17         cpt: "<?php echo MS_POST_TYPE; ?>",
    18         wpStoriesBaseURL: '<?php echo $baseUrl; ?>',
     17        cpt: "<?php echo esc_html(MS_POST_TYPE); ?>",
     18        wpStoriesBaseURL: '<?php echo esc_html($baseUrl); ?>',
    1919        wpNonce: '<?php echo wp_create_nonce(MS_NONCE_REFERRER) ?>',
    20         wpUser: '<?php echo $user->ID; ?>',
    21         wpEmail: '<?php echo $user->user_email; ?>',
    22         wpUsername: '<?php echo $user->first_name." ".$user->last_name; ?>',
     20        wpUser: '<?php echo esc_html($user->ID); ?>',
     21        wpEmail: '<?php echo esc_html($user->user_email); ?>',
     22        wpUsername: '<?php echo esc_html($user->first_name." ".$user->last_name); ?>',
    2323        isCategoriesEnabled: <?php echo ms_is_categories_enabled() ? "true" : "false"; ?>,
    2424        adminPublishPost: '<?php echo admin_url( 'edit.php?post_type=' . MS_POST_TYPE ); ?>',
  • makestories-helper/trunk/templates/listing-story-grid.php

    r2659092 r2724522  
    1515    }
    1616    ?>
    17         <div class="story-thumb-card card <?php echo $getClassNames[$index]; ?>" data-story-url="<?php echo $permalink; ?>">
     17        <div class="story-thumb-card card <?php echo esc_attr($getClassNames[$index]); ?>" data-story-url="<?php echo esc_attr($permalink); ?>">
    1818            <div class="cardin">
    1919                <div class="cardimage">
    2020                    <?php if ($index%8<=1) { ?>
    2121                        <?php if ($posterLandscape) { ?>
    22                             <img src="<?php echo $posterLandscape ?>" alt="Avatar"  class="story-img" />
     22                            <img src="<?php echo esc_attr($posterLandscape) ?>" alt="Avatar"  class="story-img" />
    2323                        <?php } else { ?>
    24                             <img src="https://www.onl.st/dev-stamps/default.jpeg" alt="Avatar-def-one" class="story-img" />
     24                            <img src="<?php echo MS_PLUGIN_BASE_FILE_PATH."assets/images/default-poster.jpeg" ?>" alt="Poster Image" class="story-img" />
    2525                        <?php
    2626                                }
     
    3030                    <?php if ($index%8 > 1 && $index%8 < 8) { ?>
    3131                        <?php if ($posterLandscape) { ?>
    32                             <img src="<?php echo $posterLandscape ?>" alt="Avatar"  class="story-img" />
     32                            <img src="<?php echo esc_attr($posterLandscape) ?>" alt="Avatar"  class="story-img" />
    3333                        <?php } else { ?>
    34                             <img src="https://www.onl.st/dev-stamps/default.jpeg" alt="Avatar-def-one" class="story-img" />
     34                            <img src="<?php echo MS_PLUGIN_BASE_FILE_PATH."assets/images/default-poster.jpeg" ?>" alt="Poster Image" class="story-img" />
    3535                        <?php
    3636                            }
     
    3939                </div>
    4040                <div class="container">
    41                     <p><?php echo $publishDate; ?></p>
    42                     <h2><?php echo $title; ?></h2>
     41                    <p><?php echo esc_html($publishDate); ?></p>
     42                    <h2><?php echo esc_html($title); ?></h2>
    4343                </div>
    4444            </div>
  • makestories-helper/trunk/templates/ms-single-post.php

    r2659092 r2724522  
    66</div> -->
    77<?php $index = 0; ?>
    8 <div class="story-thumb-card card bigmiddleStory" data-story-url="<?php echo $permalink; ?>">
     8<div class="story-thumb-card card bigmiddleStory" data-story-url="<?php echo esc_url($permalink); ?>">
    99            <div class="cardin">
    1010                <div class="cardimage">
    1111                    <?php if ($index%8<=1) { ?>
    1212                        <?php if ($posterLandscape) { ?>
    13                             <img src="<?php echo $posterLandscape ?>" alt="Avatar"  class="story-img" />
     13                            <img src="<?php echo esc_attr($posterLandscape) ?>" alt="Avatar"  class="story-img" />
    1414                        <?php } else { ?>
    15                             <img src="https://www.onl.st/dev-stamps/default.jpeg" alt="Avatar-def-one" class="story-img" />
     15                            <img src="<?php echo MS_PLUGIN_BASE_FILE_PATH."assets/images/default-poster.jpeg" ?>" alt="Poster Image" class="story-img" />
    1616                        <?php
    1717                                }
     
    2121                    <?php if ($index%8 > 1 && $index%8 < 8) { ?>
    2222                        <?php if ($posterLandscape) { ?>
    23                             <img src="<?php echo $posterLandscape ?>" alt="Avatar"  class="story-img" />
     23                            <img src="<?php echo esc_attr($posterLandscape) ?>" alt="Avatar"  class="story-img" />
    2424                        <?php } else { ?>
    25                             <img src="https://www.onl.st/dev-stamps/default.jpeg" alt="Avatar-def-one" class="story-img" />
     25                            <img src="<?php echo MS_PLUGIN_BASE_FILE_PATH."assets/images/default-poster.jpeg" ?>" alt="Poster Image" class="story-img" />
    2626                        <?php
    2727                            }
     
    3030                </div>
    3131                <div class="container">
    32                     <p><?php echo $publishDate; ?></p>
    33                     <h2><?php echo $title; ?></h2>
     32                    <p><?php echo esc_html($publishDate); ?></p>
     33                    <h2><?php echo esc_html($title); ?></h2>
    3434                </div>
    3535            </div>
  • makestories-helper/trunk/templates/ms-single-widget.php

    r2659092 r2724522  
    2424
    2525        //print the player code
    26         echo $scriptNew;
    27         echo $div;
     26        echo esc_js($scriptNew);
     27        echo esc_html($div);
    2828    ?>
    2929</div>
  • makestories-helper/trunk/templates/single-story.php

    r2526622 r2724522  
    11<div class="story-thumb">
    2     <a href="<?php echo $permalink; ?>" target="_blank">
     2    <a href="<?php echo esc_url($permalink); ?>" target="_blank">
    33        <figure>
    4             <img src="<?php echo $posterImage ?>" />
     4            <img src="<?php echo esc_attr($posterImage) ?>" />
    55        </figure>
    66        <div class="bottom-text">
    7             <h3><?php echo $title; ?></h3>
    8             <p><?php echo $publishDate; ?></p>
     7            <h3><?php echo esc_html($title); ?></h3>
     8            <p><?php echo esc_html(publishDate); ?></p>
    99        </div>
    1010    </a>
Note: See TracChangeset for help on using the changeset viewer.