WordPress.org

Plugin Directory

Changeset 1671934


Ignore:
Timestamp:
06/06/17 16:43:27 (5 months ago)
Author:
dancameron
Message:

Deploy version 2.1.4

Location:
sprout-clients
Files:
2 added
10 edited

Legend:

Unmodified
Added
Removed
  • sprout-clients/tags/2.1.4/controllers/updates/Updates.php

    r1571584 r1671934  
    254254    } 
    255255} 
    256  
    257 if ( ! class_exists( 'EDD_SL_Plugin_Updater_SA_Mod' ) ) : 
    258  
    259     /** 
    260      * Allows plugins to use their own update API. 
    261      * 
    262      * @author Pippin Williamson 
    263      * @version 1.6 
    264      */ 
    265     class EDD_SL_Plugin_Updater_SA_Mod { 
    266         private $api_url   = ''; 
    267         private $api_data  = array(); 
    268         private $name      = ''; 
    269         private $slug      = ''; 
    270  
    271         /** 
    272          * Class constructor. 
    273          * 
    274          * @uses plugin_basename() 
    275          * @uses hook() 
    276          * 
    277          * @param string  $_api_url     The URL pointing to the custom API endpoint. 
    278          * @param string  $_plugin_file Path to the plugin file. 
    279          * @param array   $_api_data    Optional data to send with API calls. 
    280          * @return void 
    281          */ 
    282         function __construct( $_api_url, $_plugin_file, $_api_data = null ) { 
    283             $this->api_url  = trailingslashit( $_api_url ); 
    284             $this->api_data = $_api_data; 
    285             $this->name     = plugin_basename( $_plugin_file ); 
    286             $this->slug     = basename( $_plugin_file, '.php' ); 
    287             $this->version  = $_api_data['version']; 
    288  
    289             // Set up hooks. 
    290             $this->init(); 
    291             add_action( 'admin_init', array( $this, 'show_changelog' ) ); 
    292         } 
    293  
    294         /** 
    295          * Set up WordPress filters to hook into WP's update process. 
    296          * 
    297          * @uses add_filter() 
    298          * 
    299          * @return void 
    300          */ 
    301         public function init() { 
    302  
    303             add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ) ); 
    304             add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 ); 
    305  
    306             add_action( 'after_plugin_row_' . $this->name, array( $this, 'show_update_notification' ), 10, 2 ); 
    307         } 
    308  
    309         /** 
    310          * Check for Updates at the defined API endpoint and modify the update array. 
    311          * 
    312          * This function dives into the update API just when WordPress creates its update array, 
    313          * then adds a custom API call and injects the custom plugin data retrieved from the API. 
    314          * It is reassembled from parts of the native WordPress plugin update code. 
    315          * See wp-includes/update.php line 121 for the original wp_update_plugins() function. 
    316          * 
    317          * @uses api_request() 
    318          * 
    319          * @param array   $_transient_data Update array build by WordPress. 
    320          * @return array Modified update array with custom plugin data. 
    321          */ 
    322         function check_update( $_transient_data ) { 
    323  
    324             global $pagenow; 
    325  
    326             if ( ! is_object( $_transient_data ) ) { 
    327                 $_transient_data = new stdClass; 
    328             } 
    329  
    330             if ( 'plugins.php' == $pagenow && is_multisite() ) { 
    331                 return $_transient_data; 
    332             } 
    333  
    334             if ( empty( $_transient_data->response ) || empty( $_transient_data->response[ $this->name ] ) ) { 
    335  
    336                 $version_info = $this->api_request( 'plugin_latest_version', array( 'slug' => $this->slug ) ); 
    337  
    338                 if ( false !== $version_info && is_object( $version_info ) && isset( $version_info->new_version ) ) { 
    339  
    340                     $this->did_check = true; 
    341  
    342                     if ( version_compare( $this->version, $version_info->new_version, '<' ) ) { 
    343  
    344                         $_transient_data->response[ $this->name ] = $version_info; 
    345  
    346                     } 
    347  
    348                     $_transient_data->last_checked = time(); 
    349                     $_transient_data->checked[ $this->name ] = $this->version; 
    350  
    351                 } 
    352             } 
    353  
    354             return $_transient_data; 
    355         } 
    356  
    357         /** 
    358          * show update nofication row -- needed for multisite subsites, because WP won't tell you otherwise! 
    359          * 
    360          * @param string  $file 
    361          * @param array   $plugin 
    362          */ 
    363         public function show_update_notification( $file, $plugin ) { 
    364  
    365             if ( ! current_user_can( 'update_plugins' ) ) { 
    366                 return; 
    367             } 
    368  
    369             if ( ! is_multisite() ) { 
    370                 return; 
    371             } 
    372  
    373             if ( $this->name != $file ) { 
    374                 return; 
    375             } 
    376  
    377             // Remove our filter on the site transient 
    378             remove_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ), 10 ); 
    379  
    380             $update_cache = get_site_transient( 'update_plugins' ); 
    381  
    382             if ( ! is_object( $update_cache ) || empty( $update_cache->response ) || empty( $update_cache->response[ $this->name ] ) ) { 
    383  
    384                 $cache_key    = md5( 'edd_plugin_' .sanitize_key( $this->name ) . '_version_info' ); 
    385                 $version_info = get_transient( $cache_key ); 
    386  
    387                 if ( false === $version_info ) { 
    388  
    389                     $version_info = $this->api_request( 'plugin_latest_version', array( 'slug' => $this->slug ) ); 
    390  
    391                     set_transient( $cache_key, $version_info, 3600 ); 
    392                 } 
    393  
    394                 if ( ! is_object( $version_info ) ) { 
    395                     return; 
    396                 } 
    397  
    398                 if ( version_compare( $this->version, $version_info->new_version, '<' ) ) { 
    399  
    400                     $update_cache->response[ $this->name ] = $version_info; 
    401  
    402                 } 
    403  
    404                 $update_cache->last_checked = time(); 
    405                 $update_cache->checked[ $this->name ] = $this->version; 
    406  
    407                 set_site_transient( 'update_plugins', $update_cache ); 
    408  
    409             } else { 
    410  
    411                 $version_info = $update_cache->response[ $this->name ]; 
    412  
    413             } 
    414  
    415             // Restore our filter 
    416             add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ) ); 
    417  
    418             if ( ! empty( $update_cache->response[ $this->name ] ) && version_compare( $this->version, $version_info->new_version, '<' ) ) { 
    419  
    420                 // build a plugin list row, with update notification 
    421                 $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' ); 
    422                 echo '<tr class="plugin-update-tr"><td colspan="' . $wp_list_table->get_column_count() . '" class="plugin-update colspanchange"><div class="update-message">'; 
    423  
    424                 $changelog_link = self_admin_url( 'index.php?edd_sl_action=view_plugin_changelog&plugin=' . $this->name . '&slug=' . $this->slug . '&TB_iframe=true&width=772&height=911' ); 
    425  
    426                 if ( empty( $version_info->download_link ) ) { 
    427                     printf( 
    428                         __( 'There is a new version of %1$s available. <a target="_blank" class="thickbox" href="%2$s">View version %3$s details</a>.', 'edd' ), 
    429                         esc_html( $version_info->name ), 
    430                         esc_url( $changelog_link ), 
    431                         esc_html( $version_info->new_version ) 
    432                     ); 
    433                 } else { 
    434                     printf( 
    435                         __( 'There is a new version of %1$s available. <a target="_blank" class="thickbox" href="%2$s">View version %3$s details</a> or <a href="%4$s">update now</a>.', 'edd' ), 
    436                         esc_html( $version_info->name ), 
    437                         esc_url( $changelog_link ), 
    438                         esc_html( $version_info->new_version ), 
    439                         esc_url( wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' ) . $this->name, 'upgrade-plugin_' . $this->name ) ) 
    440                     ); 
    441                 } 
    442  
    443                 echo '</div></td></tr>'; 
    444             } 
    445         } 
    446  
    447  
    448         /** 
    449          * Updates information on the "View version x.x details" page with custom data. 
    450          * 
    451          * @uses api_request() 
    452          * 
    453          * @param mixed   $_data 
    454          * @param string  $_action 
    455          * @param object  $_args 
    456          * @return object $_data 
    457          */ 
    458         function plugins_api_filter( $_data, $_action = '', $_args = null ) { 
    459  
    460             if ( $_action !== 'plugin_information' ) { 
    461  
    462                 return $_data; 
    463  
    464             } 
    465  
    466             if ( ! isset( $_args->slug ) || ( $_args->slug !== $this->slug ) ) { 
    467  
    468                 return $_data; 
    469  
    470             } 
    471  
    472             $to_send = array( 
    473             'slug'   => $this->slug, 
    474             'is_ssl' => is_ssl(), 
    475             'fields' => array( 
    476                 'banners' => false, // These will be supported soon hopefully 
    477                 'reviews' => false, 
    478             ), 
    479             ); 
    480  
    481             $api_response = $this->api_request( 'plugin_information', $to_send ); 
    482  
    483             if ( false !== $api_response ) { 
    484                 $_data = $api_response; 
    485             } 
    486  
    487             return $_data; 
    488         } 
    489  
    490  
    491         /** 
    492      * Disable SSL verification in order to prevent download update failures 
    493      * 
    494      * @param array   $args 
    495      * @param string  $url 
    496      * @return object $array 
    497      */ 
    498         function http_request_args( $args, $url ) { 
    499             // If it is an https request and we are performing a package download, disable ssl verification 
    500             if ( strpos( $url, 'https://' ) !== false && strpos( $url, 'edd_action=package_download' ) ) { 
    501                 $args['sslverify'] = false; 
    502             } 
    503             return $args; 
    504         } 
    505  
    506         /** 
    507      * Calls the API and, if successfull, returns the object delivered by the API. 
    508      * 
    509      * @uses get_bloginfo() 
    510      * @uses wp_remote_post() 
    511      * @uses is_wp_error() 
    512      * 
    513      * @param string  $_action The requested action. 
    514      * @param array   $_data   Parameters for the API action. 
    515      * @return false||object 
    516      */ 
    517         private function api_request( $_action, $_data ) { 
    518  
    519             global $wp_version; 
    520  
    521             $data = array_merge( $this->api_data, $_data ); 
    522  
    523             if ( $data['slug'] !== $this->slug ) { 
    524                 return; } 
    525  
    526             if ( empty( $data['license'] ) ) { 
    527                 return; } 
    528  
    529             if ( $this->api_url === home_url() ) { 
    530                 return false; // Don't allow a plugin to ping itself 
    531             } 
    532  
    533             // Modification 
    534             if ( ! isset( $data['item_id'] ) && isset( $data['download_id'] ) ) { 
    535                 $data['item_id'] = $data['download_id']; 
    536             } 
    537  
    538             $api_params = array( 
    539             'edd_action' => 'get_version', 
    540             'license'    => $data['license'], 
    541             'item_name'  => isset( $data['item_name'] ) ? $data['item_name'] : false, 
    542             'item_id'    => isset( $data['item_id'] ) ? $data['item_id'] : false, 
    543             'slug'       => $data['slug'], 
    544             'author'     => $data['author'], 
    545             'url'        => home_url(), 
    546             ); 
    547  
    548             $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => false, 'body' => $api_params ) ); 
    549  
    550             if ( ! is_wp_error( $request ) ) { 
    551                 $request = json_decode( wp_remote_retrieve_body( $request ) ); 
    552             } 
    553  
    554             if ( $request && isset( $request->sections ) ) { 
    555                 $request->sections = maybe_unserialize( $request->sections ); 
    556             } else { 
    557                 $request = false; 
    558             } 
    559  
    560             return $request; 
    561         } 
    562  
    563         public function show_changelog() { 
    564  
    565             if ( empty( $_REQUEST['edd_sl_action'] ) || 'view_plugin_changelog' !== $_REQUEST['edd_sl_action'] ) { 
    566                 return; 
    567             } 
    568  
    569             if ( empty( $_REQUEST['plugin'] ) ) { 
    570                 return; 
    571             } 
    572  
    573             if ( empty( $_REQUEST['slug'] ) ) { 
    574                 return; 
    575             } 
    576  
    577             if ( ! current_user_can( 'update_plugins' ) ) { 
    578                 wp_die( __( 'You do not have permission to install plugin updates', 'edd' ), __( 'Error', 'edd' ), array( 'response' => 403 ) ); 
    579             } 
    580  
    581             $response = $this->api_request( 'plugin_latest_version', array( 'slug' => $_REQUEST['slug'] ) ); 
    582  
    583             if ( $response && isset( $response->sections['changelog'] ) ) { 
    584                 echo '<div style="background:#fff;padding:10px;">' . $response->sections['changelog'] . '</div>'; 
    585             } 
    586  
    587             exit; 
    588         } 
    589     } 
    590 endif; 
  • sprout-clients/tags/2.1.4/load.php

    r1571584 r1671934  
    7676    require_once SC_PATH.'/controllers/records/Records_Admin_Table.php'; 
    7777 
     78    // updater if SI isn't loaded 
     79    if ( ! class_exists( 'EDD_SL_Plugin_Updater_SA_Mod' ) && file_exists( SC_PATH.'/controllers/updates/Updater.php' ) ) { 
     80        require_once SC_PATH.'/controllers/updates/Updater.php'; 
     81    } 
     82 
    7883    // updates 
    79     if ( SC_PATH.'/controllers/updates/Updates.php' ) { 
     84    if ( file_exists( SC_PATH.'/controllers/updates/Updates.php' ) ) { 
    8085        require_once SC_PATH.'/controllers/updates/Updates.php'; 
    8186    } 
     87 
    8288    if ( file_exists( SC_PATH.'/controllers/updates/Free_License.php' ) ) { 
    8389        require_once SC_PATH.'/controllers/updates/Free_License.php'; 
  • sprout-clients/tags/2.1.4/readme.txt

    r1571584 r1671934  
    44Tags: crm, leads, client management, invoicing, emailing, messaging 
    55Requires at least: 4.4 
    6 Tested up to: 4.7 
     6Tested up to: 4.8 
    77Stable tag: 2.1.4 
    88License: GPLv2 or later 
  • sprout-clients/trunk/Sprout_Clients.php

    r1667939 r1671934  
    3232     * Current version. Should match sprout-invoices.php plugin version. 
    3333     */ 
    34     const SC_VERSION = '2.1.3'; 
     34    const SC_VERSION = '2.1.4'; 
    3535    /** 
    3636     * DB Version 
  • sprout-clients/trunk/changelog.txt

    r1667939 r1671934  
     1= 2.1.4 = 
     2 
     3* FIX: Select2 Compat issues with themes and other plugins 
     4 
    15= 2.1.3 = 
    26 
  • sprout-clients/trunk/controllers/compat/Compatibility.php

    r1667939 r1671934  
    1010 
    1111    public static function init() { 
     12        // attempt to kill all select2 registrations on si_admin pages 
     13        add_action( 'init', array( __CLASS__, 'deregister_select2' ), PHP_INT_MAX ); 
     14        // atttempt to kill all select2 registrations on si_admin pages REALLY LATE 
     15        add_action( 'wp_print_scripts', array( __CLASS__, 'deenqueue_select2' ), PHP_INT_MAX ); 
     16 
    1217        // WP SEO 
    1318        add_filter( 'init', array( __CLASS__, 'prevent_wpseo_from_being_assholes_about_admin_columns' ), 10 ); 
     
    3742 
    3843        add_action( 'parse_query', array( __CLASS__, 'remove_seo_header_stuff' ) ); 
     44    } 
     45 
     46    public static function deregister_select2() { 
     47        if ( self::is_sc_admin() ) { 
     48            wp_deregister_script( 'select2' ); 
     49            wp_deregister_style( 'select2' ); 
     50            // Register the SI version with the old handle 
     51            wp_register_style( 'select2', SC_URL . '/resources/admin/plugins/select2/css/select2.min.css', null, self::SC_VERSION, false ); 
     52            wp_register_script( 'select2', SC_URL . '/resources/admin/plugins/select2/js/select2.min.js', array( 'jquery' ), self::SC_VERSION, false ); 
     53 
     54            wp_deregister_script( 'select2_4.0' ); 
     55            wp_deregister_style( 'select2_4.0_css' ); 
     56        } 
     57    } 
     58 
     59    public static function deenqueue_select2() { 
     60        if ( self::is_sc_admin() ) { 
     61            foreach ( wp_scripts()->queue as $handle ) { 
     62                if ( strpos( $handle, 'select2' ) !== false && 'select2_4.0' !== $handle ) { 
     63                    wp_dequeue_script( $handle ); 
     64                    // Register the SI version with the old handle 
     65                    wp_register_script( 'select2', SC_URL . '/resources/admin/plugins/select2/js/select2.min.js', array( 'jquery' ), self::SC_VERSION, false ); 
     66 
     67                } 
     68            } 
     69 
     70            foreach ( wp_styles()->queue as $handle ) { 
     71                if ( strpos( $handle, 'select2' ) !== false && 'select2_4.0_css' !== $handle ) { 
     72                    wp_dequeue_style( $handle ); 
     73                    wp_register_style( 'select2', SC_URL . '/resources/admin/plugins/select2/css/select2.min.css', null, self::SC_VERSION, false ); 
     74                } 
     75            } 
     76        } 
    3977    } 
    4078 
  • sprout-clients/trunk/controllers/updates/Updates.php

    r1667939 r1671934  
    254254    } 
    255255} 
    256  
    257 if ( class_exists( 'EDD_SL_Plugin_Updater_SA_Mod' ) ) { 
    258     return; 
    259 } 
    260  
    261 if ( function_exists( 'sprout_invoices_load' ) ) { 
    262     return; 
    263 } 
    264  
    265 /** 
    266  * Allows plugins to use their own update API. 
    267  * 
    268  * @author Pippin Williamson 
    269  * @version 1.6.7 
    270  */ 
    271 class EDD_SL_Plugin_Updater_SA_Mod { 
    272  
    273     private $api_url     = ''; 
    274     private $api_data    = array(); 
    275     private $name        = ''; 
    276     private $slug        = ''; 
    277     private $version     = ''; 
    278     private $wp_override = false; 
    279     private $cache_key   = ''; 
    280  
    281     /** 
    282      * Class constructor. 
    283      * 
    284      * @uses plugin_basename() 
    285      * @uses hook() 
    286      * 
    287      * @param string  $_api_url     The URL pointing to the custom API endpoint. 
    288      * @param string  $_plugin_file Path to the plugin file. 
    289      * @param array   $_api_data    Optional data to send with API calls. 
    290      */ 
    291     public function __construct( $_api_url, $_plugin_file, $_api_data = null ) { 
    292  
    293         global $edd_plugin_data; 
    294  
    295         $this->api_url     = trailingslashit( $_api_url ); 
    296         $this->api_data    = $_api_data; 
    297         $this->name        = plugin_basename( $_plugin_file ); 
    298         $this->slug        = basename( $_plugin_file, '.php' ); 
    299         $this->version     = $_api_data['version']; 
    300         $this->wp_override = isset( $_api_data['wp_override'] ) ? (bool) $_api_data['wp_override'] : false; 
    301  
    302         $this->cache_key   = md5( serialize( $this->slug . $this->api_data['license'] ) ); 
    303  
    304         $edd_plugin_data[ $this->slug ] = $this->api_data; 
    305  
    306         // Set up hooks. 
    307         $this->init(); 
    308  
    309     } 
    310  
    311     /** 
    312      * Set up WordPress filters to hook into WP's update process. 
    313      * 
    314      * @uses add_filter() 
    315      * 
    316      * @return void 
    317      */ 
    318     public function init() { 
    319  
    320         add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ) ); 
    321         add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 ); 
    322         remove_action( 'after_plugin_row_' . $this->name, 'wp_plugin_update_row', 10 ); 
    323         add_action( 'after_plugin_row_' . $this->name, array( $this, 'show_update_notification' ), 10, 2 ); 
    324         add_action( 'admin_init', array( $this, 'show_changelog' ) ); 
    325  
    326     } 
    327  
    328     /** 
    329      * Check for Updates at the defined API endpoint and modify the update array. 
    330      * 
    331      * This function dives into the update API just when WordPress creates its update array, 
    332      * then adds a custom API call and injects the custom plugin data retrieved from the API. 
    333      * It is reassembled from parts of the native WordPress plugin update code. 
    334      * See wp-includes/update.php line 121 for the original wp_update_plugins() function. 
    335      * 
    336      * @uses api_request() 
    337      * 
    338      * @param array   $_transient_data Update array build by WordPress. 
    339      * @return array Modified update array with custom plugin data. 
    340      */ 
    341     public function check_update( $_transient_data ) { 
    342  
    343         global $pagenow; 
    344  
    345         if ( ! is_object( $_transient_data ) ) { 
    346             $_transient_data = new stdClass; 
    347         } 
    348  
    349         if ( 'plugins.php' == $pagenow && is_multisite() ) { 
    350             return $_transient_data; 
    351         } 
    352  
    353         if ( ! empty( $_transient_data->response ) && ! empty( $_transient_data->response[ $this->name ] ) && false === $this->wp_override ) { 
    354             return $_transient_data; 
    355         } 
    356  
    357         $version_info = $this->get_cached_version_info(); 
    358  
    359         if ( false === $version_info ) { 
    360             $version_info = $this->api_request( 'plugin_latest_version', array( 'slug' => $this->slug ) ); 
    361  
    362             $this->set_version_info_cache( $version_info ); 
    363  
    364         } 
    365  
    366         if ( false !== $version_info && is_object( $version_info ) && isset( $version_info->new_version ) ) { 
    367  
    368             if ( version_compare( $this->version, $version_info->new_version, '<' ) ) { 
    369  
    370                 $_transient_data->response[ $this->name ] = $version_info; 
    371  
    372             } 
    373  
    374             $_transient_data->last_checked           = current_time( 'timestamp' ); 
    375             $_transient_data->checked[ $this->name ] = $this->version; 
    376  
    377         } 
    378  
    379         return $_transient_data; 
    380     } 
    381  
    382     /** 
    383      * show update nofication row -- needed for multisite subsites, because WP won't tell you otherwise! 
    384      * 
    385      * @param string  $file 
    386      * @param array   $plugin 
    387      */ 
    388     public function show_update_notification( $file, $plugin ) { 
    389  
    390         if ( is_network_admin() ) { 
    391             return; 
    392         } 
    393  
    394         if ( ! current_user_can( 'update_plugins' ) ) { 
    395             return; 
    396         } 
    397  
    398         if ( ! is_multisite() ) { 
    399             return; 
    400         } 
    401  
    402         if ( $this->name != $file ) { 
    403             return; 
    404         } 
    405  
    406         // Remove our filter on the site transient 
    407         remove_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ), 10 ); 
    408  
    409         $update_cache = get_site_transient( 'update_plugins' ); 
    410  
    411         $update_cache = is_object( $update_cache ) ? $update_cache : new stdClass(); 
    412  
    413         if ( empty( $update_cache->response ) || empty( $update_cache->response[ $this->name ] ) ) { 
    414  
    415             $version_info = $this->get_cached_version_info(); 
    416  
    417             if ( false === $version_info ) { 
    418                 $version_info = $this->api_request( 'plugin_latest_version', array( 'slug' => $this->slug ) ); 
    419  
    420                 $this->set_version_info_cache( $version_info ); 
    421             } 
    422  
    423             if ( ! is_object( $version_info ) ) { 
    424                 return; 
    425             } 
    426  
    427             if ( version_compare( $this->version, $version_info->new_version, '<' ) ) { 
    428  
    429                 $update_cache->response[ $this->name ] = $version_info; 
    430  
    431             } 
    432  
    433             $update_cache->last_checked = current_time( 'timestamp' ); 
    434             $update_cache->checked[ $this->name ] = $this->version; 
    435  
    436             set_site_transient( 'update_plugins', $update_cache ); 
    437  
    438         } else { 
    439  
    440             $version_info = $update_cache->response[ $this->name ]; 
    441  
    442         } 
    443  
    444         // Restore our filter 
    445         add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ) ); 
    446  
    447         if ( ! empty( $update_cache->response[ $this->name ] ) && version_compare( $this->version, $version_info->new_version, '<' ) ) { 
    448  
    449             // build a plugin list row, with update notification 
    450             $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' ); 
    451             # <tr class="plugin-update-tr"><td colspan="' . $wp_list_table->get_column_count() . '" class="plugin-update colspanchange"> 
    452             echo '<tr class="plugin-update-tr" id="' . $this->slug . '-update" data-slug="' . $this->slug . '" data-plugin="' . $this->slug . '/' . $file . '">'; 
    453             echo '<td colspan="3" class="plugin-update colspanchange">'; 
    454             echo '<div class="update-message notice inline notice-warning notice-alt">'; 
    455  
    456             $changelog_link = self_admin_url( 'index.php?edd_sl_action=view_plugin_changelog&plugin=' . $this->name . '&slug=' . $this->slug . '&TB_iframe=true&width=772&height=911' ); 
    457  
    458             if ( empty( $version_info->download_link ) ) { 
    459                 printf( 
    460                     __( 'There is a new version of %1$s available. %2$sView version %3$s details%4$s.', 'easy-digital-downloads' ), 
    461                     esc_html( $version_info->name ), 
    462                     '<a target="_blank" class="thickbox" href="' . esc_url( $changelog_link ) . '">', 
    463                     esc_html( $version_info->new_version ), 
    464                     '</a>' 
    465                 ); 
    466             } else { 
    467                 printf( 
    468                     __( 'There is a new version of %1$s available. %2$sView version %3$s details%4$s or %5$supdate now%6$s.', 'easy-digital-downloads' ), 
    469                     esc_html( $version_info->name ), 
    470                     '<a target="_blank" class="thickbox" href="' . esc_url( $changelog_link ) . '">', 
    471                     esc_html( $version_info->new_version ), 
    472                     '</a>', 
    473                     '<a href="' . esc_url( wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' ) . $this->name, 'upgrade-plugin_' . $this->name ) ) .'">', 
    474                     '</a>' 
    475                 ); 
    476             } 
    477  
    478             do_action( "in_plugin_update_message-{$file}", $plugin, $version_info ); 
    479  
    480             echo '</div></td></tr>'; 
    481         } 
    482     } 
    483  
    484     /** 
    485      * Updates information on the "View version x.x details" page with custom data. 
    486      * 
    487      * @uses api_request() 
    488      * 
    489      * @param mixed   $_data 
    490      * @param string  $_action 
    491      * @param object  $_args 
    492      * @return object $_data 
    493      */ 
    494     public function plugins_api_filter( $_data, $_action = '', $_args = null ) { 
    495  
    496         if ( $_action != 'plugin_information' ) { 
    497  
    498             return $_data; 
    499  
    500         } 
    501  
    502         if ( ! isset( $_args->slug ) || ( $_args->slug != $this->slug ) ) { 
    503  
    504             return $_data; 
    505  
    506         } 
    507  
    508         $to_send = array( 
    509             'slug'   => $this->slug, 
    510             'is_ssl' => is_ssl(), 
    511             'fields' => array( 
    512                 'banners' => array(), 
    513                 'reviews' => false, 
    514             ), 
    515         ); 
    516  
    517         $cache_key = 'edd_api_request_' . md5( serialize( $this->slug . $this->api_data['license'] ) ); 
    518  
    519         // Get the transient where we store the api request for this plugin for 24 hours 
    520         $edd_api_request_transient = $this->get_cached_version_info( $cache_key ); 
    521  
    522         //If we have no transient-saved value, run the API, set a fresh transient with the API value, and return that value too right now. 
    523         if ( empty( $edd_api_request_transient ) ) { 
    524  
    525             $api_response = $this->api_request( 'plugin_information', $to_send ); 
    526  
    527             // Expires in 3 hours 
    528             $this->set_version_info_cache( $api_response, $cache_key ); 
    529  
    530             if ( false !== $api_response ) { 
    531                 $_data = $api_response; 
    532             } 
    533         } else { 
    534             $_data = $edd_api_request_transient; 
    535         } 
    536  
    537         return $_data; 
    538     } 
    539  
    540     /** 
    541      * Disable SSL verification in order to prevent download update failures 
    542      * 
    543      * @param array   $args 
    544      * @param string  $url 
    545      * @return object $array 
    546      */ 
    547     public function http_request_args( $args, $url ) { 
    548         // If it is an https request and we are performing a package download, disable ssl verification 
    549         if ( strpos( $url, 'https://' ) !== false && strpos( $url, 'edd_action=package_download' ) ) { 
    550             $args['sslverify'] = false; 
    551         } 
    552         return $args; 
    553     } 
    554  
    555     /** 
    556      * Calls the API and, if successfull, returns the object delivered by the API. 
    557      * 
    558      * @uses get_bloginfo() 
    559      * @uses wp_remote_post() 
    560      * @uses is_wp_error() 
    561      * 
    562      * @param string  $_action The requested action. 
    563      * @param array   $_data   Parameters for the API action. 
    564      * @return false|object 
    565      */ 
    566     private function api_request( $_action, $_data ) { 
    567  
    568         global $wp_version; 
    569  
    570         $data = array_merge( $this->api_data, $_data ); 
    571  
    572         if ( $data['slug'] != $this->slug ) { 
    573             return; 
    574         } 
    575  
    576         if ( $this->api_url == trailingslashit( home_url() ) ) { 
    577             return false; // Don't allow a plugin to ping itself 
    578         } 
    579  
    580         $api_params = array( 
    581             'edd_action' => 'get_version', 
    582             'license'    => ! empty( $data['license'] ) ? $data['license'] : '', 
    583             'item_name'  => isset( $data['item_name'] ) ? $data['item_name'] : false, 
    584             'item_id'    => isset( $data['item_id'] ) ? $data['item_id'] : false, 
    585             'slug'       => $data['slug'], 
    586             'author'     => $data['author'], 
    587             'url'        => home_url(), 
    588             'beta'       => isset( $data['beta'] ) ? $data['beta'] : false, 
    589         ); 
    590  
    591         $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => false, 'body' => $api_params ) ); 
    592  
    593         if ( ! is_wp_error( $request ) ) { 
    594             $request = json_decode( wp_remote_retrieve_body( $request ) ); 
    595         } 
    596  
    597         if ( $request && isset( $request->sections ) ) { 
    598             $request->sections = maybe_unserialize( $request->sections ); 
    599         } else { 
    600             $request = false; 
    601         } 
    602  
    603         if ( $request && isset( $request->banners ) ) { 
    604             $request->banners = maybe_unserialize( $request->banners ); 
    605         } else { 
    606             $request = false; 
    607         } 
    608  
    609         return $request; 
    610     } 
    611  
    612     public function show_changelog() { 
    613  
    614         global $edd_plugin_data; 
    615  
    616         if ( empty( $_REQUEST['edd_sl_action'] ) || 'view_plugin_changelog' != $_REQUEST['edd_sl_action'] ) { 
    617             return; 
    618         } 
    619  
    620         if ( empty( $_REQUEST['plugin'] ) ) { 
    621             return; 
    622         } 
    623  
    624         if ( empty( $_REQUEST['slug'] ) ) { 
    625             return; 
    626         } 
    627  
    628         if ( ! current_user_can( 'update_plugins' ) ) { 
    629             wp_die( __( 'You do not have permission to install plugin updates', 'easy-digital-downloads' ), __( 'Error', 'easy-digital-downloads' ), array( 'response' => 403 ) ); 
    630         } 
    631  
    632         $data         = $edd_plugin_data[ $_REQUEST['slug'] ]; 
    633         $cache_key    = md5( 'edd_plugin_' . sanitize_key( $_REQUEST['plugin'] ) . '_version_info' ); 
    634         $version_info = $this->get_cached_version_info( $cache_key ); 
    635  
    636         if ( false === $version_info ) { 
    637  
    638             $api_params = array( 
    639                 'edd_action' => 'get_version', 
    640                 'item_name'  => isset( $data['item_name'] ) ? $data['item_name'] : false, 
    641                 'item_id'    => isset( $data['item_id'] ) ? $data['item_id'] : false, 
    642                 'slug'       => $_REQUEST['slug'], 
    643                 'author'     => $data['author'], 
    644                 'url'        => home_url(), 
    645             ); 
    646  
    647             $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => false, 'body' => $api_params ) ); 
    648  
    649             if ( ! is_wp_error( $request ) ) { 
    650                 $version_info = json_decode( wp_remote_retrieve_body( $request ) ); 
    651             } 
    652  
    653             if ( ! empty( $version_info ) && isset( $version_info->sections ) ) { 
    654                 $version_info->sections = maybe_unserialize( $version_info->sections ); 
    655             } else { 
    656                 $version_info = false; 
    657             } 
    658  
    659             $this->set_version_info_cache( $version_info, $cache_key ); 
    660  
    661         } 
    662  
    663         if ( ! empty( $version_info ) && isset( $version_info->sections['changelog'] ) ) { 
    664             echo '<div style="background:#fff;padding:10px;">' . $version_info->sections['changelog'] . '</div>'; 
    665         } 
    666  
    667         exit; 
    668     } 
    669  
    670     public function get_cached_version_info( $cache_key = '' ) { 
    671  
    672         if ( empty( $cache_key ) ) { 
    673             $cache_key = $this->cache_key; 
    674         } 
    675  
    676         $cache = get_option( $cache_key ); 
    677  
    678         if ( empty( $cache['timeout'] ) || current_time( 'timestamp' ) > $cache['timeout'] ) { 
    679             return false; // Cache is expired 
    680         } 
    681  
    682         return json_decode( $cache['value'] ); 
    683  
    684     } 
    685  
    686     public function set_version_info_cache( $value = '', $cache_key = '' ) { 
    687  
    688         if ( empty( $cache_key ) ) { 
    689             $cache_key = $this->cache_key; 
    690         } 
    691  
    692         $data = array( 
    693             'timeout' => strtotime( '+3 hours', current_time( 'timestamp' ) ), 
    694             'value'   => json_encode( $value ), 
    695         ); 
    696  
    697         update_option( $cache_key, $data ); 
    698  
    699     } 
    700 } 
  • sprout-clients/trunk/load.php

    r1431877 r1671934  
    7676    require_once SC_PATH.'/controllers/records/Records_Admin_Table.php'; 
    7777 
     78    // updater if SI isn't loaded 
     79    if ( ! class_exists( 'EDD_SL_Plugin_Updater_SA_Mod' ) && file_exists( SC_PATH.'/controllers/updates/Updater.php' ) ) { 
     80        require_once SC_PATH.'/controllers/updates/Updater.php'; 
     81    } 
     82 
    7883    // updates 
    79     if ( SC_PATH.'/controllers/updates/Updates.php' ) { 
     84    if ( file_exists( SC_PATH.'/controllers/updates/Updates.php' ) ) { 
    8085        require_once SC_PATH.'/controllers/updates/Updates.php'; 
    8186    } 
     87 
    8288    if ( file_exists( SC_PATH.'/controllers/updates/Free_License.php' ) ) { 
    8389        require_once SC_PATH.'/controllers/updates/Free_License.php'; 
  • sprout-clients/trunk/readme.txt

    r1667939 r1671934  
    55Requires at least: 4.4 
    66Tested up to: 4.8 
    7 Stable tag: 2.1.3 
     7Stable tag: 2.1.4 
    88License: GPLv2 or later 
    99License URI: http://www.gnu.org/licenses/gpl-2.0.html 
  • sprout-clients/trunk/sprout-clients.php

    r1667939 r1671934  
    55 * Description: Contact relationship management to increase productivity in gaining clients and business relationships. 
    66 * Author: Sprout Apps 
    7  * Version: 2.1.3 
     7 * Version: 2.1.4 
    88 * Author URI: https://sproutapps.co 
    99 * Text Domain: sprout-invoices 
Note: See TracChangeset for help on using the changeset viewer.