WordPress.org

Plugin Directory

Changeset 1726463


Ignore:
Timestamp:
09/08/17 00:55:39 (6 weeks ago)
Author:
travislopes
Message:

Share Drafts Publicly (1.1.4)

  • Added security enhancements.
Location:
share-drafts-publicly
Files:
7 added
4 edited

Legend:

Unmodified
Added
Removed
  • share-drafts-publicly/trunk/css/share-drafts-publicly.css

    r1197339 r1726463  
    1 #share_drafts_publicly .inside { padding-top: 6px; } 
    2 #share_drafts_publicly input[type="text"] { margin-bottom: 12px; } 
     1#share_drafts_publicly .inside { 
     2    padding-top: 6px; 
     3} 
     4 
     5#share_drafts_publicly input[type="text"] { 
     6    margin-bottom: 12px; 
     7} 
  • share-drafts-publicly/trunk/js/share-drafts-publicly.js

    r1197339 r1726463  
    1 function make_draft_public( post_id ) { 
     1( function( $ ) { 
     2    'use strict'; 
    23 
    3     var $ = jQuery; 
     4    var makePublic  = $('#sdp_make_public'), 
     5        makePrivate = $('#sdp_make_private'); 
    46 
    5     /* Show activity spinner. */ 
    6     $( '#share_drafts_publicly .spinner' ).css( 'visibility', 'visible' ); 
     7    makePublic.on( 'click', function() { 
    78 
    8     /* Process AJAX action. */ 
    9     $.ajax( ajaxurl, { 
    10         'data':     { 
    11             'action': 'share_drafts_publicly', 
    12             'make':   'public', 
    13             'post_id': post_id 
    14         }, 
    15         'dataType': 'json', 
    16         'success':  function ( response ) { 
    17              
    18             if ( response.success ) { 
    19                  
    20                 /* Change link box value to new permalink. */ 
    21                 $( '#share_drafts_publicly #sdp_link' ).val( response.data.permalink ); 
    22                  
    23                 /* Hide "Make Draft Public" button. */ 
    24                 $( '#share_drafts_publicly #sdp_make_public' ).hide(); 
    25                  
    26                 /* Show "Make Draft Private" button and link box. */ 
    27                 $( '#share_drafts_publicly #sdp_link, #share_drafts_publicly #sdp_make_private' ).show(); 
    28                                  
    29             } else { 
    30                  
    31                 /* Send error alert. */ 
    32                 alert( response.data.message ); 
    33                  
     9        // Show activity spinner. 
     10        $( '#share_drafts_publicly .spinner' ).css( 'visibility', 'visible' ); 
     11 
     12        // Process AJAX action. 
     13        $.ajax( ajaxurl, { 
     14            'data':     { 
     15                'action' : 'share_drafts_publicly', 
     16                'make'   : 'public', 
     17                'nonce'  : shareDraftsPublicly.nonce, 
     18                'post_id': shareDraftsPublicly.postId 
     19            }, 
     20            'dataType': 'json', 
     21            'success' : function( response ) { 
     22 
     23                if ( response.success ) { 
     24 
     25                    // Change link box value to new permalink. 
     26                    $( '#share_drafts_publicly #sdp_link' ).val( response.data.permalink ); 
     27 
     28                    // Hide "Make Draft Public" button. 
     29                    $( '#share_drafts_publicly #sdp_make_public' ).hide(); 
     30 
     31                    // Show "Make Draft Private" button and link box. 
     32                    $( '#share_drafts_publicly #sdp_link, #share_drafts_publicly #sdp_make_private' ).show(); 
     33 
     34                } else { 
     35 
     36                    // Send error alert. 
     37                    alert( response.data.message ); 
     38 
     39                } 
     40 
     41                // Hide spinner. 
     42                $( '#share_drafts_publicly .spinner' ).css( 'visibility', 'hidden' ); 
     43 
    3444            } 
    35              
    36             /* Hide spinner. */ 
    37             $( '#share_drafts_publicly .spinner' ).css( 'visibility', 'hidden' ); 
    3845 
    39              
    40         } 
    41          
    42     } ); 
     46        } ); 
     47    }); 
    4348 
    44 } 
     49    makePrivate.on( 'click', function() { 
    4550 
    46 function make_draft_private( post_id ) { 
    47      
    48     var $ = jQuery; 
     51        // Show activity spinner. 
     52        $( '#share_drafts_publicly .spinner' ).css( 'visibility', 'visible' ); 
    4953 
    50     /* Show activity spinner. */ 
    51     $( '#share_drafts_publicly .spinner' ).css( 'visibility', 'visible' ); 
     54        // Process AJAX action. 
     55        $.ajax( ajaxurl, { 
     56            'data':     { 
     57                'action' : 'share_drafts_publicly', 
     58                'make'   : 'private', 
     59                'nonce'  : shareDraftsPublicly.nonce, 
     60                'post_id': shareDraftsPublicly.postId 
     61            }, 
     62            'dataType': 'json', 
     63            'success' : function( response ) { 
    5264 
    53     /* Process AJAX action. */ 
    54     $.ajax( ajaxurl, { 
    55         'data':     { 
    56             'action': 'share_drafts_publicly', 
    57             'make':   'private', 
    58             'post_id': post_id 
    59         }, 
    60         'dataType': 'json', 
    61         'success':  function ( response ) { 
    62              
    63             if ( response.success ) { 
    64                  
    65                 /* Show "Make Draft Public" button. */ 
    66                 $( '#share_drafts_publicly #sdp_make_public' ).show(); 
    67                  
    68                 /* Hide "Make Draft Private" button and link box. */ 
    69                 $( '#share_drafts_publicly #sdp_link, #share_drafts_publicly #sdp_make_private' ).hide(); 
    70                                  
    71             } else { 
    72                  
    73                 /* Send error alert. */ 
    74                 alert( response.data.message ); 
    75                  
     65                if ( response.success ) { 
     66 
     67                    // Show "Make Draft Public" button. 
     68                    $( '#share_drafts_publicly #sdp_make_public' ).show(); 
     69 
     70                    // Hide "Make Draft Private" button and link box. 
     71                    $( '#share_drafts_publicly #sdp_link, #share_drafts_publicly #sdp_make_private' ).hide(); 
     72 
     73                } else { 
     74 
     75                    // Send error alert. 
     76                    alert( response.data.message ); 
     77 
     78                } 
     79 
     80                // Hide spinner. 
     81                $( '#share_drafts_publicly .spinner' ).css( 'visibility', 'hidden' ); 
     82 
    7683            } 
    77              
    78             /* Hide spinner. */ 
    79             $( '#share_drafts_publicly .spinner' ).css( 'visibility', 'hidden' ); 
    8084 
    81              
    82         } 
    83          
    84     } ); 
    85      
    86 } 
     85        } ); 
     86    }); 
     87 
     88} ) (jQuery ); 
  • share-drafts-publicly/trunk/readme.txt

    r1447851 r1726463  
    11=== Share Drafts Publicly === 
    2 Contributors: travislopes 
     2Contributors: travislopes, pereirinha 
    33Tags: admin, post, draft, share, public 
    44Requires at least: 3.0 
    5 Tested up to: 4.4.2 
     5Tested up to: 4.8.1 
    66Stable tag: 4.2.2 
    77 
     
    2626 
    2727== Changelog == 
     28= v1.1.4 = 
     29* Added security enhancements. 
    2830= v1.1.3 = 
    2931* Fixed PHP error when determining if draft should be shown. 
  • share-drafts-publicly/trunk/share-drafts-publicly.php

    r1447851 r1726463  
    33Plugin Name: Share Drafts Publicy 
    44Description: Provide a secret link to non-logged in users to view post drafts. 
    5 Version: 1.1.3 
     5Version: 1.1.4 
    66Author: Travis Lopes 
    77Author URI: http://travislop.es 
     
    99Text Domain: share_drafts_publicly 
    1010Domain Path: /languages 
    11  */ 
     11*/ 
    1212 
    1313class Share_Drafts_Publicly { 
    1414 
    1515    /** 
    16      * Instance of Share Drafts Publicly class 
     16     * Instance of Share Drafts Publicly class. 
    1717     * 
    1818     * @var    object 
     
    2525     * Get instance of this class. 
    2626     * 
     27     * @since  1.1 
    2728     * @access public 
    2829     * @static 
     30     * 
    2931     * @return $_instance 
    3032     */ 
     
    4244     * Register needed hooks. 
    4345     * 
     46     * @since  1.0 
    4447     * @access public 
    4548     */ 
     
    6770     * Enqueue needed scripts. 
    6871     * 
    69      * @access public 
     72     * @since  1.1 
     73     * @access public 
     74     * 
     75     * @uses Share_Drafts_Publicly::enqueue_script() 
    7076     */ 
    7177    public function scripts() { 
    7278 
    73         wp_register_script( 'share-drafts-publicly', plugins_url( 'share-drafts-publicly/js/share-drafts-publicly.js' ), array( 'jquery' ), filemtime( plugin_dir_path( __FILE__ ) . 'js/share-drafts-publicly.js' ), true ); 
     79        // Localize strings. 
     80        $localization = array( 
     81            'nonce'  => wp_create_nonce( 'share-drafts-publicly' ), 
     82            'postId' => get_the_ID() ? get_the_ID() : ( isset( $_GET['post'] ) ? absint( $_GET['post'] ) : 0 ), 
     83        ); 
     84 
     85        wp_register_script( 'share-drafts-publicly', plugin_dir_url( __FILE__ ) . 'js/share-drafts-publicly.js', array( 'jquery' ), filemtime( plugin_dir_path( __FILE__ ) . 'js/share-drafts-publicly.js' ), true ); 
     86        wp_localize_script( 'share-drafts-publicly', 'shareDraftsPublicly', $localization ); 
    7487 
    7588        if ( $this->enqueue_script() ) { 
     
    8295     * Enqueue needed styles. 
    8396     * 
    84      * @access public 
     97     * @since  1.1 
     98     * @access public 
     99     * 
     100     * @uses Share_Drafts_Publicly::enqueue_script() 
    85101     */ 
    86102    public function styles() { 
    87103 
    88         wp_register_style( 'share-drafts-publicly', plugins_url( 'share-drafts-publicly/css/share-drafts-publicly.css' ) ); 
     104        wp_register_style( 'share-drafts-publicly', plugin_dir_url( __FILE__ ) . 'css/share-drafts-publicly.css' ); 
    89105 
    90106        if ( $this->enqueue_script() ) { 
     
    97113     * Helper function to determine if script should be enqueued. 
    98114     * 
    99      * @access public 
     115     * @since  1.1 
     116     * @access public 
     117     * 
    100118     * @return bool 
    101119     */ 
     
    112130     * Add meta box. 
    113131     * 
    114      * @access public 
    115      * @return void 
     132     * @since  1.1 
     133     * @access public 
    116134     */ 
    117135    public function add_meta_box() { 
    118136 
    119         $post_id          = isset( $_GET['post'] ) ? sanitize_text_field( wp_unslash( $_GET['post'] ) ) : null; 
    120         $post_status      = get_post_status( $post_id ); 
     137        // Get current post ID and status. 
     138        $post_id     = isset( $_GET['post'] ) ? absint( $_GET['post'] ) : null; 
     139        $post_status = get_post_status( $post_id ); 
     140 
     141        /** 
     142         * Modify which post statuses are allowed to be shared publicly. 
     143         * 
     144         * @since 1.1.1 
     145         * 
     146         * @param array $allowed_statuses Post statuses allowed to be shared publicly. 
     147         */ 
    121148        $allowed_statuses = apply_filters( 'sdp_allowed_post_status', array( 'draft', 'pending', 'auto-draft', 'future' ) ); 
    122149 
     
    130157     * Display meta box contents. 
    131158     * 
    132      * @access public 
    133      * @return void 
     159     * @since  1.1 
     160     * @access public 
     161     * 
     162     * @uses Share_Drafts_Publicly::is_draft_public() 
    134163     */ 
    135164    public function display_meta_box() { 
    136165 
    137         // Get post ID and draft URL. 
    138         $post_id   = get_the_ID() ? get_the_ID() : sanitize_text_field( wp_unslash( $_GET['post'] ) ); 
     166        // Get draft URL. 
    139167        $draft_url = $this->get_draft_url(); 
    140168 
    141169        // Prepare button styling. 
    142170        $public_styling  = $this->is_draft_public() ? 'display:none;' : 'display:inline-block;'; 
    143         $private_styling = ! $this->is_draft_public() ? 'display:none;' : 'display:inline-block;'; 
    144  
    145         /* Prepare HTML for meta box. */ 
    146         $html  = '<input id="sdp_link" type="text" value="' . esc_attr( $draft_url ) . '" style="' . $private_styling . '" class="widefat" onclick="this.setSelectionRange( 0, this.value.length );" readonly />'; 
    147         $html .= '<input id="sdp_make_public" class="button" type="button" style="' . $public_styling . '" name="sdp_make_public" onclick="make_draft_public(' . esc_attr( $post_id ) . ');" value="' . esc_attr__( 'Make Draft Public', 'share_drafts_publicly' ) . '" />'; 
    148         $html .= '<input id="sdp_make_private" class="button" type="button" style="' . $private_styling . '" name="sdp_make_private" onclick="make_draft_private(' . esc_attr( $post_id ) . ');" value="' . esc_attr__( 'Make Draft Private', 'share_drafts_publicly' ) . '" />'; 
    149         $html .= '<span class="spinner"></span>'; 
     171        $private_styling = $this->is_draft_public() ? 'display:inline-block;' : 'display:none;'; 
     172 
     173        // Prepare HTML for meta box. 
     174        ob_start(); 
     175        ?> 
     176 
     177        <input id="sdp_link" type="text" value="<?php echo esc_url( $draft_url ); ?>" style="<?php echo esc_attr( $private_styling ); ?>" class="widefat" onclick="this.setSelectionRange( 0, this.value.length );" readonly /> 
     178        <input id="sdp_make_public" class="button" type="button" style="<?php echo esc_attr( $public_styling ); ?>" name="sdp_make_public" value="<?php esc_attr_e( 'Make Draft Public', 'share_drafts_publicly' ); ?>" /> 
     179        <input id="sdp_make_private" class="button" type="button" style="<?php echo esc_attr( $private_styling ); ?>" name="sdp_make_private" value="<?php esc_attr_e( 'Make Draft Private', 'share_drafts_publicly' ); ?>" /> 
     180        <span class="spinner"></span> 
     181 
     182        <?php 
     183        $html = ob_get_contents(); 
     184        ob_clean(); 
    150185 
    151186        echo $html; 
     
    156191     * Show draft if provided secret key. 
    157192     * 
    158      * @access public 
    159      * @param  array    $posts The array of retrieved posts. 
    160      * @param  WP_Query $wp_query The WP_Query instance. 
    161      * @return array $posts 
     193     * @since  1.1 
     194     * @access public 
     195     * 
     196     * @param array    $posts    The array of retrieved posts. 
     197     * @param WP_Query $wp_query The WP_Query instance. 
     198     * 
     199     * @uses wpdb::get_results() 
     200     * @uses wpdb::is_main_query() 
     201     * 
     202     * @return array 
    162203     */ 
    163204    public function show_draft_publicly( $posts, $wp_query ) { 
     
    165206        global $wpdb; 
    166207 
    167         if ( isset( $_GET['secret'] ) && $wp_query->is_main_query() && get_post_meta( $wp_query->query_vars['p'], '_draft_secret_key', true ) === $_GET['secret'] ) { 
     208        if ( isset( $_GET['secret'] ) && $wp_query->is_main_query() && get_post_meta( $wp_query->query_vars['p'], '_draft_secret_key', true ) === sanitize_text_field( $_GET['secret'] ) ) { 
    168209            $posts = $wpdb->get_results( $wp_query->request ); 
    169210        } 
     
    176217     * Add public draft link to post actions. 
    177218     * 
    178      * @access public 
    179      * @param  array   $actions An array of row action links. 
    180      * @param  WP_Post $post The post object. 
    181      * @return array $actions 
     219     * @since  1.0 
     220     * @access public 
     221     * 
     222     * @param array   $actions An array of row action links. 
     223     * @param WP_Post $post    The current Post object. 
     224     * 
     225     * @uses Share_Drafts_Publicly::get_draft_url() 
     226     * @uses Share_Drafts_Publicly::is_draft_public() 
     227     * 
     228     * @return array 
    182229     */ 
    183230    public function add_post_row_action( $actions, $post ) { 
     
    194241     * Change draft status of post. 
    195242     * 
    196      * @access public 
     243     * @since  1.1 
     244     * @access public 
     245     * 
     246     * @uses Share_Drafts_Publicly::make_draft_private() 
     247     * @uses Share_Drafts_Publicly::make_draft_public() 
    197248     */ 
    198249    public function ajax_change_status() { 
     250 
     251        // Verify nonce. 
     252        if ( ! wp_verify_nonce( $_GET['nonce'], 'share-drafts-publicly' ) ) { 
     253            wp_send_json_error( array( 'message' => esc_html__( 'Invalid request.', 'share_drafts_publicly' ) ) ); 
     254        } 
    199255 
    200256        // Get provided informaton. 
     
    205261 
    206262            case 'private': 
     263 
    207264                $make_private = $this->make_draft_private( $post_id ); 
    208265 
     
    214271 
    215272            case 'public': 
     273 
    216274                $make_public = $this->make_draft_public( $post_id ); 
    217275 
     
    229287     * Get public draft URL. 
    230288     * 
    231      * @access public 
    232      * @param  int    $post_id (default: null) Post ID. 
    233      * @param  string $secret_key (default: null) Secret key. 
     289     * @since  1.1 
     290     * @access public 
     291     * 
     292     * @param int    $post_id    Post ID. 
     293     * @param string $secret_key Secret key. 
     294     * 
    234295     * @return string 
    235296     */ 
     
    238299        // Get the post ID if not set. 
    239300        if ( empty( $post_id ) && isset( $_GET['post'] ) ) { 
    240             $post_id = sanitize_text_field( wp_unslash( $_GET['post'] ) ); 
     301            $post_id = absint( $_GET['post'] ); 
    241302        } 
    242303 
     
    258319     * Determine if draft is being shared publicly. 
    259320     * 
    260      * @access public 
    261      * @param  int $post_id (default: null) Post ID. 
     321     * @since  1.1 
     322     * @access public 
     323     * 
     324     * @param int $post_id Post ID. 
     325     * 
    262326     * @return bool 
    263327     */ 
     
    266330        // Get the post ID if not set. 
    267331        if ( empty( $post_id ) && isset( $_GET['post'] ) ) { 
    268             $post_id = sanitize_text_field( wp_unslash( $_GET['post'] ) ); 
     332            $post_id = absint( $_GET['post'] ); 
    269333        } 
    270334 
     
    279343     * Make draft private. 
    280344     * 
    281      * @access public 
    282      * @param  int $post_id Post ID to make private. 
     345     * @since  1.1 
     346     * @access public 
     347     * 
     348     * @param int $post_id Post ID to make private. 
     349     * 
    283350     * @return bool 
    284351     */ 
    285     public function make_draft_private( $post_id ) { 
     352    public function make_draft_private( $post_id = 0 ) { 
    286353 
    287354        // Delete post meta. 
     
    293360     * Make draft public. 
    294361     * 
    295      * @access public 
    296      * @param  int $post_id Post ID to make public. 
     362     * @since  1.1 
     363     * @access public 
     364     * 
     365     * @param int $post_id Post ID to make public. 
     366     * 
     367     * @uses Share_Drafts_Publicly::get_draft_url() 
     368     * 
    297369     * @return string|bool 
    298370     */ 
    299     public function make_draft_public( $post_id ) { 
     371    public function make_draft_public( $post_id = 0 ) { 
    300372 
    301373        // Generate secret key. 
     
    303375 
    304376        // Add secret key to post meta. 
    305         $secret_key_status = add_post_meta( $post_id, '_draft_secret_key', $secret_key, true ); 
     377        $secret_key_status = add_post_meta( absint( $post_id ), '_draft_secret_key', $secret_key, true ); 
    306378 
    307379        // Return draft URL. 
Note: See TracChangeset for help on using the changeset viewer.