WordPress.org

Plugin Directory

Changeset 610170


Ignore:
Timestamp:
10/09/12 20:39:23 (19 months ago)
Author:
andy
Message:

jetpack notes: merge notes branch into trunk via export-over-trunk method, props mdawaffe

Location:
jetpack/trunk
Files:
6 added
7 edited

Legend:

Unmodified
Added
Removed
  • jetpack/trunk/_inc/jetpack.css

    r604108 r610170  
    608608        #minileven.jetpack-module div.module-image { 
    609609            background-position: -1570px 5px; 
     610        } 
     611        #notes.jetpack-module div.module-image { 
     612            background-position: -1806px 5px; 
     613        } 
     614         
     615        #json-api.jetpack-module div.module-image { 
     616            background-position: -1689px 5px; 
    610617        } 
    611618 
  • jetpack/trunk/class.jetpack-signature.php

    r558855 r610170  
    1818    } 
    1919 
    20     function sign_current_request( $override = null ) { 
     20    function sign_current_request( $override = array() ) { 
     21        if ( isset( $override['scheme'] ) ) { 
     22            $scheme = $override['scheme']; 
     23            if ( !in_array( $scheme, array( 'http', 'https' ) ) ) { 
     24                return new Jetpack_Error( 'invalid_sheme', 'Invalid URL scheme' ); 
     25            } 
     26        } else { 
     27            if ( is_ssl() ) { 
     28                $scheme = 'https'; 
     29            } else { 
     30                $scheme = 'http'; 
     31            } 
     32        } 
     33 
    2134        if ( is_ssl() ) { 
    22             $scheme = 'https'; 
    2335            $port = JETPACK_SIGNATURE__HTTPS_PORT == $_SERVER['SERVER_PORT'] ? '' : $_SERVER['SERVER_PORT']; 
    2436        } else { 
    25             $scheme = 'http'; 
    2637            $port = JETPACK_SIGNATURE__HTTP_PORT  == $_SERVER['SERVER_PORT'] ? '' : $_SERVER['SERVER_PORT']; 
    2738        } 
     
    2940        $url = "{$scheme}://{$_SERVER['HTTP_HOST']}:{$port}" . stripslashes( $_SERVER['REQUEST_URI'] ); 
    3041 
    31         if ( isset( $override['body'] ) && !is_null( $override['body'] ) ) { 
     42        if ( array_key_exists( 'body', $override ) && !is_null( $override['body'] ) ) { 
    3243            $body = $override['body']; 
    3344        } else if ( 'POST' == strtoupper( $_SERVER['REQUEST_METHOD'] ) ) { 
     
    4657        } 
    4758 
    48         return $this->sign_request( $a['token'], $a['timestamp'], $a['nonce'], $a['body-hash'], $_SERVER['REQUEST_METHOD'], $url, $body, true ); 
     59        $method = isset( $override['method'] ) ? $override['method'] : $_SERVER['REQUEST_METHOD'];  
     60        return $this->sign_request( $a['token'], $a['timestamp'], $a['nonce'], $a['body-hash'], $method, $url, $body, true ); 
    4961    } 
    5062 
  • jetpack/trunk/class.jetpack-xmlrpc-server.php

    r607320 r610170  
    1515     * so they will get a "does not exist" error. 
    1616     */ 
    17     function xmlrpc_methods() { 
    18         if ( !$user = $this->login() ) { 
    19             return array(); 
    20         } 
    21  
    22         return apply_filters( 'jetpack_xmlrpc_methods', array( 
    23             'jetpack.testConnection'    => array( $this, 'test_connection' ), 
    24             'jetpack.featuresAvailable' => array( $this, 'features_available' ), 
    25             'jetpack.featuresEnabled'   => array( $this, 'features_enabled' ), 
    26             'jetpack.getPost'           => array( $this, 'get_post' ), 
    27             'jetpack.getComment'        => array( $this, 'get_comment' ),   
    28         ) ); 
     17    function xmlrpc_methods( $core_methods ) { 
     18        $jetpack_methods = array( 
     19            'jetpack.jsonAPI' => array( $this, 'json_api' ), 
     20        ); 
     21 
     22        $user = $this->login(); 
     23 
     24        if ( $user ) { 
     25            $jetpack_methods = array_merge( $jetpack_methods, array( 
     26                'jetpack.testConnection'    => array( $this, 'test_connection' ), 
     27                'jetpack.testAPIUserCode'   => array( $this, 'test_api_user_code' ), 
     28                'jetpack.featuresAvailable' => array( $this, 'features_available' ), 
     29                'jetpack.featuresEnabled'   => array( $this, 'features_enabled' ), 
     30                'jetpack.getPost'           => array( $this, 'get_post' ), 
     31                'jetpack.getComment'        => array( $this, 'get_comment' ),   
     32            ) ); 
     33 
     34            if ( isset( $core_methods['metaWeblog.editPost'] ) ) { 
     35                $jetpack_methods['metaWeblog.newMediaObject'] = $core_methods['metaWeblog.newMediaObject']; 
     36                $jetpack_methods['jetpack.updateAttachmentParent'] = array( $this, 'update_attachment_parent' ); 
     37            } 
     38        } 
     39 
     40        return apply_filters( 'jetpack_xmlrpc_methods', $jetpack_methods, $core_methods, $user ); 
    2941    } 
    3042 
     
    133145     */ 
    134146    function test_connection() { 
    135         return true; 
     147        return JETPACK__VERSION; 
     148    } 
     149     
     150    function test_api_user_code( $args ) { 
     151        $client_id = (int) $args[0]; 
     152        $user_id   = (int) $args[1]; 
     153        $nonce     = (string) $args[2]; 
     154        $verify    = (string) $args[3]; 
     155 
     156        if ( !$client_id || !$user_id || !strlen( $nonce ) || 32 !== strlen( $verify ) ) { 
     157            return false; 
     158        } 
     159 
     160        $user = get_user_by( 'id', $user_id ); 
     161        if ( !$user || is_wp_error( $user ) ) { 
     162            return false; 
     163        } 
     164 
     165        /* debugging 
     166        error_log( "CLIENT: $client_id" ); 
     167        error_log( "USER:   $user_id" ); 
     168        error_log( "NONCE:  $nonce" ); 
     169        error_log( "VERIFY: $verify" ); 
     170        */ 
     171 
     172        $jetpack_token = Jetpack_Data::get_access_token( 1 ); 
     173 
     174        $api_user_code = get_user_meta( $user_id, "jetpack_json_api_$client_id", true ); 
     175        if ( !$api_user_code ) { 
     176            return false; 
     177        } 
     178 
     179        $hmac = hash_hmac( 'md5', json_encode( (object) array( 
     180            'client_id' => (int) $client_id, 
     181            'user_id'   => (int) $user_id, 
     182            'nonce'     => (string) $nonce, 
     183            'code'      => (string) $api_user_code, 
     184        ) ), $jetpack_token->secret ); 
     185 
     186        if ( $hmac !== $verify ) { 
     187            return false; 
     188        } 
     189 
     190        return $user_id; 
    136191    } 
    137192 
     
    195250        return $comment; 
    196251    } 
     252     
     253    function update_attachment_parent( $args ) { 
     254        $attachment_id = (int) $args[0]; 
     255        $parent_id     = (int) $args[1]; 
     256 
     257        return wp_update_post( array( 
     258            'ID'          => $attachment_id, 
     259            'post_parent' => $parent_id, 
     260        ) ); 
     261    } 
     262 
     263    function json_api( $args = array() ) { 
     264        $json_api_args = $args[0]; 
     265        $verify_api_user_args = $args[1]; 
     266 
     267        $method    = (string) $json_api_args[0]; 
     268        $url       = (string) $json_api_args[1]; 
     269        $post_body = is_null( $json_api_args[2] ) ? null : (string) $json_api_args[2]; 
     270        $my_id     = (int) $json_api_args[3]; 
     271 
     272        if ( !$verify_api_user_args ) { 
     273            $user_id = 0; 
     274        } elseif ( 'internal' === $verify_api_user_args[0] ) { 
     275            $user_id = (int) $verify_api_user_args[1]; 
     276            if ( $user_id ) { 
     277                $user = get_user_by( 'id', $user_id ); 
     278                if ( !$user || is_wp_error( $user ) ) { 
     279                    return false; 
     280                } 
     281            } 
     282        } else { 
     283            $user_id = call_user_func( array( $this, 'test_api_user_code' ), $verify_api_user_args ); 
     284            if ( !$user_id ) { 
     285                return false; 
     286            } 
     287        } 
     288 
     289        /* debugging 
     290        error_log( "-- begin json api via jetpack debugging -- " ); 
     291        error_log( "METHOD: $method" ); 
     292        error_log( "URL: $url" ); 
     293        error_log( "POST BODY: $post_body" ); 
     294        error_log( "MY JETPACK ID: $my_id" ); 
     295        error_log( "VERIFY_ARGS: " . print_r( $verify_api_user_args, 1 ) ); 
     296        error_log( "VERIFIED USER_ID: " . (int) $user_id ); 
     297        error_log( "-- end json api via jetpack debugging -- " ); 
     298        */ 
     299 
     300        $old_user = wp_get_current_user(); 
     301        wp_set_current_user( $user_id ); 
     302 
     303        $token = Jetpack_Data::get_access_token( get_current_user_id() ); 
     304        if ( !$token || is_wp_error( $token ) ) { 
     305            return false; 
     306        } 
     307 
     308        define( 'REST_API_REQUEST', true ); 
     309        define( 'WPCOM_JSON_API__BASE', 'public-api.wordpress.com/rest/v1' ); 
     310 
     311        // needed? 
     312        require_once ABSPATH . 'wp-admin/includes/admin.php'; 
     313 
     314        require_once dirname( __FILE__ ) . '/class.json-api.php'; 
     315        $api = WPCOM_JSON_API::init( $method, $url, $post_body ); 
     316        require_once dirname( __FILE__ ) . '/class.json-api-endpoints.php'; 
     317 
     318        $display_errors = ini_set( 'display_errors', 0 ); 
     319        ob_start(); 
     320        $content_type = $api->serve( false ); 
     321        $output = ob_get_clean(); 
     322        ini_set( 'display_errors', $display_errors ); 
     323 
     324        $nonce = wp_generate_password( 10, false ); 
     325        $hmac  = hash_hmac( 'md5', $nonce . $output, $token->secret ); 
     326 
     327        wp_set_current_user( isset( $old_user->ID ) ? $old_user->ID : 0 ); 
     328 
     329        return array( 
     330            (string) $output, 
     331            (string) $nonce, 
     332            (string) $hmac, 
     333        ); 
     334    } 
    197335} 
  • jetpack/trunk/jetpack.php

    r607739 r610170  
    66 * Description: Bring the power of the WordPress.com cloud to your self-hosted WordPress. Jetpack enables you to connect your blog to a WordPress.com account to use the powerful features normally only available to WordPress.com users. 
    77 * Author: Automattic 
    8  * Version: 1.8.1 
     8 * Version: 1.9-alpha 
    99 * Author URI: http://jetpack.me 
    1010 * License: GPL2+ 
     
    1818defined( 'JETPACK_CLIENT__AUTH_LOCATION' ) or define( 'JETPACK_CLIENT__AUTH_LOCATION', 'header' ); 
    1919defined( 'JETPACK_CLIENT__HTTPS' ) or define( 'JETPACK_CLIENT__HTTPS', 'AUTO' ); 
    20 define( 'JETPACK__VERSION', '1.8.1' ); 
     20define( 'JETPACK__VERSION', '1.9-alpha' ); 
    2121define( 'JETPACK__PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); 
    2222defined( 'JETPACK__GLOTPRESS_LOCALES_PATH' ) or define( 'JETPACK__GLOTPRESS_LOCALES_PATH', JETPACK__PLUGIN_DIR . 'locales.php' ); 
     
    6363    var $capability_translations = array( 
    6464        'administrator' => 'manage_options', 
    65 //      'editor' => 'edit_others_posts', 
    66 //      'author' => 'publish_posts', 
    67 //      'contributor' => 'edit_posts', 
     65        'editor' => 'edit_others_posts', 
     66        'author' => 'publish_posts', 
     67        'contributor' => 'edit_posts', 
     68        'subscriber' => 'read', 
    6869    ); 
    6970 
     
    7980     */ 
    8081    var $error = ''; 
     82 
     83    /** 
     84     * Modules that need more privacy description. 
     85     * @var string 
     86     */ 
     87    var $privacy_checks = ''; 
    8188 
    8289    /** 
     
    9198     */ 
    9299    var $sync; 
     100     
     101    /** 
     102     * Verified data for JSON authorization request 
     103     */ 
     104    var $json_api_authorization_request = array(); 
    93105 
    94106    /** 
     
    172184    function Jetpack() { 
    173185        $this->sync = new Jetpack_Sync; 
    174  
     186         
    175187        // Modules should do Jetpack_Sync::sync_options( __FILE__, $option, ... ); instead 
    176188        // We access the "internal" method here only because the Jetpack object isn't instantiated yet 
     
    208220            // Now that no one can authenticate, and we're whitelisting all XML-RPC methods, force enable_xmlrpc on. 
    209221            add_filter( 'pre_option_enable_xmlrpc', '__return_true' ); 
    210         } 
     222        } else { 
     223            if ( $this->is_active() ) {  
     224                add_action( 'login_form_jetpack_json_api_authorization', array( &$this, 'login_form_json_api_authorization' ) );  
     225            }  
     226        } 
    211227 
    212228        add_action( 'jetpack_clean_nonces', array( $this, 'clean_nonces' ) ); 
     
    318334 
    319335        return array( 
    320             'id',                           // (int)    The Client ID/WP.com Blog ID of this site. 
    321             'blog_token',                   // (string) The Client Secret/Blog Token of this site. 
    322             'user_token',                   // (string) The User Token of this site. (deprecated) 
    323             'master_user',                  // (int)    The local User ID of the user who connected this site to jetpack.wordpress.com. 
    324             'user_tokens',                  // (array)  User Tokens for each user of this site who has connected to jetpack.wordpress.com. 
    325             'version',                      // (string) Used during upgrade procedure to auto-activate new modules. version:time 
    326             'old_version',                  // (string) Used to determine which modules are the most recently added. previous_version:time 
    327             'fallback_no_verify_ssl_certs', // (int)    Flag for determining if this host must skip SSL Certificate verification due to misconfigured SSL. 
    328             'time_diff',                    // (int)    Offset between Jetpack server's clocks and this server's clocks. Jetpack Server Time = time() + (int) Jetpack::get_option( 'time_diff' ) 
     336            'id',                           // (int)      The Client ID/WP.com Blog ID of this site. 
     337            'blog_token',                   // (string)   The Client Secret/Blog Token of this site. 
     338            'user_token',                   // (string)   The User Token of this site. (deprecated) 
     339            'master_user',                  // (int)      The local User ID of the user who connected this site to jetpack.wordpress.com. 
     340            'user_tokens',                  // (array)    User Tokens for each user of this site who has connected to jetpack.wordpress.com. 
     341            'version',                      // (string)   Used during upgrade procedure to auto-activate new modules. version:time 
     342            'old_version',                  // (string)   Used to determine which modules are the most recently added. previous_version:time 
     343            'fallback_no_verify_ssl_certs', // (int)      Flag for determining if this host must skip SSL Certificate verification due to misconfigured SSL. 
     344            'time_diff',                    // (int)      Offset between Jetpack server's clocks and this server's clocks. Jetpack Server Time = time() + (int) Jetpack::get_option( 'time_diff' ) 
     345            'public',                       // (int|bool) If we think this site is public or not (1, 0), false if we haven't yet tried to figure it out. 
    329346        ); 
    330347    } 
     
    585602            // Add special cases here for modules to avoid auto-activation 
    586603            switch ( $module ) { 
     604 
     605            // These modules are default off: they change things blog-side 
    587606            case 'comments' : 
    588607            case 'carousel' : 
    589608            case 'minileven': 
    590                 continue; 
     609                break; 
     610 
     611            // These modules are default off if we think the site is a private one 
     612            case 'enhanced-distribution' : 
     613            case 'json-api' : 
     614                if ( !Jetpack::get_option( 'public' ) ) { 
     615                    break; 
     616                } 
     617                // else no break 
     618            // The rest are default on 
    591619            default : 
    592620                $return[] = $module; 
     
    724752            exit; 
    725753        } 
     754 
     755        do_action( 'jetpack_before_activate_default_modules', $min_version, $max_version, $other_modules ); 
    726756 
    727757        // Check each module for fatal errors, a la wp-admin/plugins.php::activate before activating 
     
    757787            ob_start(); 
    758788            require $file; 
     789            do_action( "jetpack_activate_module_$module" ); 
    759790            $active[] = $module; 
    760791            $state = in_array( $module, $other_modules ) ? 'reactivated_modules' : 'activated_modules'; 
     
    772803        Jetpack::state( 'module', false ); 
    773804        Jetpack::catch_errors( false ); 
     805        do_action( 'jetpack_activate_default_modules', $min_version, $max_version, $other_modules ); 
    774806    } 
    775807 
     
    11481180        } 
    11491181 
    1150         $hook = add_menu_page( 'Jetpack', $title, 'manage_options', 'jetpack', array( $this, 'admin_page' ), 'div' ); 
     1182        $hook = add_menu_page( 'Jetpack', $title, 'read', 'jetpack', array( $this, 'admin_page' ), 'div' ); 
    11511183 
    11521184        add_action( "load-$hook", array( $this, 'admin_page_load' ) ); 
     
    12071239 
    12081240        // Screen Content 
    1209         $current_screen->add_help_tab( array( 
    1210             'id'        => 'modules', 
    1211             'title'     => __( 'Modules', 'jetpack' ), 
    1212             'content'   => 
    1213                 '<p><strong>' . __( 'Jetpack by WordPress.com',                                              'jetpack' ) . '</strong></p>' . 
    1214                 '<p>' . __( 'You can activate or deactivate individual Jetpack modules to suit your needs.', 'jetpack' ) . '</p>' . 
    1215                 '<ol>' . 
    1216                     '<li>' . __( 'Find the component you want to manage',                            'jetpack' ) . '</li>' . 
    1217                     '<li>' . __( 'Click on Learn More',                                              'jetpack' ) . '</li>' . 
    1218                     '<li>' . __( 'An Activate or Deactivate button will appear',                     'jetpack' ) . '</li>' . 
    1219                     '<li>' . __( 'If additional settings are available, a link to them will appear', 'jetpack' ) . '</li>' . 
    1220                 '</ol>' 
    1221         ) ); 
     1241        if ( current_user_can( 'manage_options' ) ) { 
     1242            $current_screen->add_help_tab( array( 
     1243                'id'        => 'modules', 
     1244                'title'     => __( 'Modules', 'jetpack' ), 
     1245                'content'   => 
     1246                    '<p><strong>' . __( 'Jetpack by WordPress.com',                                              'jetpack' ) . '</strong></p>' . 
     1247                    '<p>' . __( 'You can activate or deactivate individual Jetpack modules to suit your needs.', 'jetpack' ) . '</p>' . 
     1248                    '<ol>' . 
     1249                        '<li>' . __( 'Find the component you want to manage',                            'jetpack' ) . '</li>' . 
     1250                        '<li>' . __( 'Click on Learn More',                                              'jetpack' ) . '</li>' . 
     1251                        '<li>' . __( 'An Activate or Deactivate button will appear',                     'jetpack' ) . '</li>' . 
     1252                        '<li>' . __( 'If additional settings are available, a link to them will appear', 'jetpack' ) . '</li>' . 
     1253                    '</ol>' 
     1254            ) ); 
     1255        } 
    12221256 
    12231257        // Help Sidebar 
     
    12681302 
    12691303    function admin_head() { 
    1270         if ( isset( $_GET['configure'] ) && Jetpack::is_module( $_GET['configure'] ) ) 
     1304        if ( isset( $_GET['configure'] ) && Jetpack::is_module( $_GET['configure'] ) && current_user_can( 'manage_options' ) ) 
    12711305            do_action( 'jetpack_module_configuration_head_' . $_GET['configure'] ); 
    12721306    } 
     
    13911425     *     - The XML-RPC request verifies secret_1, deletes both secrets and responds with: secret_2 
    13921426     *     - https://jetpack.wordpress.com/jetpack.register/1/ verifies that XML-RPC response (secret_2) then finally responds itself with 
    1393      *       jetpack_id, jetpack_secret 
     1427     *       jetpack_id, jetpack_secret, jetpack_public 
    13941428     *     - ::register() then stores jetpack_options: id => jetpack_id, blog_token => jetpack_secret 
    13951429     * 4 - redirect to https://jetpack.wordpress.com/jetpack.authorize/1/ 
     
    14671501                exit; 
    14681502            case 'deactivate' : 
    1469                 $module = stripslashes( $_GET['module'] ); 
    1470                 check_admin_referer( "jetpack_deactivate-$module" ); 
    1471                 Jetpack::deactivate_module( $module ); 
    1472                 Jetpack::state( 'message', 'module_deactivated' ); 
    1473                 Jetpack::state( 'module', $module ); 
     1503                $modules = stripslashes( $_GET['module'] ); 
     1504                check_admin_referer( "jetpack_deactivate-$modules" ); 
     1505                foreach ( explode( ',', $modules ) as $module ) { 
     1506                    Jetpack::deactivate_module( $module ); 
     1507                    Jetpack::state( 'message', 'module_deactivated' ); 
     1508                } 
     1509                Jetpack::state( 'module', $modules ); 
    14741510                wp_safe_redirect( Jetpack::admin_url() ); 
    14751511                exit; 
     
    16371673 
    16381674        case 'module_deactivated' : 
    1639             if ( $module = Jetpack::get_module( Jetpack::state( 'module' ) ) ) { 
    1640                 $this->message = sprintf( __( '<strong>%s Deactivated!</strong> You can activate it again at any time using the activate button on the module card.', 'jetpack' ), $module['name']  ); 
    1641                 $this->stat( 'module-deactivated', Jetpack::state( 'module' ) ); 
    1642             } 
     1675            $modules = Jetpack::state( 'module' ); 
     1676            if ( !$modules ) { 
     1677                break; 
     1678            } 
     1679 
     1680            $module_names = array(); 
     1681            foreach ( explode( ',', $modules ) as $module_slug ) { 
     1682                $module = Jetpack::get_module( $module_slug ); 
     1683                if ( $module ) { 
     1684                    $module_names[] = $module['name']; 
     1685                } 
     1686 
     1687                $this->stat( 'module-deactivated', $module_slug ); 
     1688            } 
     1689 
     1690            if ( !$module_names ) { 
     1691                break; 
     1692            } 
     1693 
     1694            $this->message = wp_sprintf( 
     1695                _nx( 
     1696                    '<strong>%l Deactivated!</strong> You can activate it again at any time using the activate button on the module card.', 
     1697                    '<strong>%l Deactivated!</strong> You can activate them again at any time using the activate buttons on their module cards.', 
     1698                    count( $module_names ), 
     1699                    '%l = list of Jetpack module/feature names', 
     1700                    'jetpack' 
     1701                ), 
     1702                $module_names 
     1703            ); 
    16431704            break; 
    16441705 
     
    17051766        } 
    17061767 
    1707         if ( $this->message || $this->error ) { 
     1768        $this->privacy_checks = Jetpack::state( 'privacy_checks' ); 
     1769 
     1770        if ( $this->message || $this->error || $this->privacy_checks ) { 
    17081771            add_action( 'jetpack_notices', array( $this, 'admin_notices' ) ); 
    17091772        } 
    17101773 
    1711         if ( isset( $_GET['configure'] ) && Jetpack::is_module( $_GET['configure'] ) ) { 
     1774        if ( isset( $_GET['configure'] ) && Jetpack::is_module( $_GET['configure'] ) && current_user_can( 'manage_options' ) ) { 
    17121775            do_action( 'jetpack_module_configuration_load_' . $_GET['configure'] ); 
    17131776        } 
     
    17391802</div> 
    17401803<?php 
    1741         } 
     1804 
     1805        } 
     1806 
     1807        if ( $this->privacy_checks ) : 
     1808            $module_names = $module_slugs = array(); 
     1809 
     1810            $privacy_checks = explode( ',', $this->privacy_checks ); 
     1811            foreach ( $privacy_checks as $module_slug ) { 
     1812                $module = Jetpack::get_module( $module_slug ); 
     1813                if ( !$module ) { 
     1814                    continue; 
     1815                } 
     1816 
     1817                $module_slugs[] = $module_slug; 
     1818                $module_names[] = "<strong>{$module['name']}</strong>"; 
     1819            } 
     1820 
     1821            $module_slugs = join( ',', $module_slugs ); 
     1822?> 
     1823<div id="message" class="jetpack-message jetpack-err"> 
     1824    <div class="squeezer"> 
     1825        <h4><strong><?php esc_html_e( 'Is this site private?', 'jetpack' ); ?></strong></h4><br /> 
     1826        <p><?php 
     1827            echo wp_kses( wptexturize( wp_sprintf( 
     1828                _nx( 
     1829                    "Like your site's RSS feeds, %l allows access to your posts and other content to third parties.",  
     1830                    "Like your site's RSS feeds, %l allow access to your posts and other content to third parties.", 
     1831                    count( $privacy_checks ), 
     1832                    '%l = list of Jetpack module/feature names', 
     1833                    'jetpack' 
     1834                ), 
     1835                $module_names 
     1836            ) ), array( 'strong' => true ) ); 
     1837 
     1838            echo "\n<br />\n"; 
     1839 
     1840            echo wp_kses( sprintf( 
     1841                _nx( 
     1842                    'If your site is not publicly accessible, consider <a href="%1$s" title="%2$s">deactivating this feature</a>.', 
     1843                    'If your site is not publicly accessible, consider <a href="%1$s" title="%2$s">deactivating these features</a>.', 
     1844                    count( $privacy_checks ), 
     1845                    '%1$s = deactivation URL, %2$s = "Deactivate {list of Jetpack module/feature names}', 
     1846                    'jetpack' 
     1847                ), 
     1848                wp_nonce_url( 
     1849                    Jetpack::admin_url( array( 
     1850                        'action' => 'deactivate', 
     1851                        'module' => urlencode( $module_slugs ), 
     1852                    ) ), 
     1853                    "jetpack_deactivate-$module_slugs" 
     1854                                ), 
     1855                esc_attr( wp_kses( wp_sprintf( _x( 'Deactivate %l', '%l = list of Jetpack module/feature names', 'jetpack' ), $module_names ), array() ) ) 
     1856            ), array( 'a' => array( 'href' => true, 'title' => true ) ) ); 
     1857        ?></p> 
     1858    </div> 
     1859</div> 
     1860<?php 
     1861        endif; 
    17421862    } 
    17431863 
     
    18141934                'user_email' => $user->user_email, 
    18151935                'user_login' => $user->user_login, 
     1936                'is_active' => Jetpack::is_active(), 
    18161937            ) ); 
    18171938 
     
    18231944 
    18241945    function admin_url( $args = null ) { 
    1825         $url = menu_page_url( 'jetpack', false ); 
     1946        $url = admin_url( 'admin.php?page=jetpack' ); 
    18261947        if ( is_array( $args ) ) 
    18271948            $url = add_query_arg( $args, $url ); 
     
    18581979                    <?php if ( $is_connected ) : ?> 
    18591980                    <div id="jp-disconnectors"> 
    1860                     <div id="jp-disconnect" class="jp-disconnect"> 
    1861                         <a href="<?php echo wp_nonce_url( Jetpack::admin_url( array( 'action' => 'disconnect' ) ), 'jetpack-disconnect' ); ?>"><div class="deftext"><?php _e( 'Connected to WordPress.com', 'jetpack' ); ?></div><div class="hovertext"><?php _e( 'Disconnect from WordPress.com', 'jetpack' ) ?></div></a> 
    1862                     </div> 
     1981                        <?php if ( current_user_can( 'manage_options' ) ) : ?> 
     1982                        <div id="jp-disconnect" class="jp-disconnect"> 
     1983                            <a href="<?php echo wp_nonce_url( Jetpack::admin_url( array( 'action' => 'disconnect' ) ), 'jetpack-disconnect' ); ?>"><div class="deftext"><?php _e( 'Connected to WordPress.com', 'jetpack' ); ?></div><div class="hovertext"><?php _e( 'Disconnect from WordPress.com', 'jetpack' ) ?></div></a> 
     1984                        </div> 
     1985                        <?php endif; ?> 
    18631986                        <?php if ( $is_user_connected && !$is_master_user ) : ?> 
    18641987                        <div id="jp-unlink" class="jp-disconnect"> 
     
    19142037                        </div> 
    19152038                        <div class="jetpack-install-container"> 
    1916                             <p class="submit"><a href="<?php echo $this->build_connect_url() ?>" class="button-connector" id="wpcom-connect"><?php _e( 'Link accounts with WordPress.com', 'jetpack' ); ?></a></p> 
     2039                            <p class="submit"><a href="<?php echo $this->build_connect_url() ?>" class="button-connector" id="wpcom-connect"><?php _e( 'Link account with WordPress.com', 'jetpack' ); ?></a></p> 
    19172040                        </div> 
    19182041                    </div> 
     
    19252048            <?php 
    19262049            // If we select the configure option for a module, show the configuration screen. 
    1927             if ( isset( $_GET['configure'] ) && Jetpack::is_module( $_GET['configure'] ) ) : 
     2050            if ( isset( $_GET['configure'] ) && Jetpack::is_module( $_GET['configure'] ) && current_user_can( 'manage_options' ) ) : 
    19282051                $this->admin_screen_configure_module( $_GET['configure'] ); 
    19292052 
     
    19862109                    <a href="http://automattic.com/privacy/" target="_blank"><?php _e( 'Privacy Policy', 'jetpack' ); ?></a> | 
    19872110                    <a href="http://wordpress.com/tos/" target="_blank"><?php _e( 'Terms of Service', 'jetpack' ); ?></a> | 
     2111<?php if ( current_user_can( 'manage_options' ) ) : ?> 
    19882112                    <a href="<?php echo esc_url( wp_nonce_url( admin_url( 'admin-ajax.php?action=jetpack_debug' ), 'jetpack_debug' ) ); ?>" id="jp-debug"><?php _e( 'Debug', 'jetpack' ); ?></a> | 
     2113<?php endif; ?> 
    19892114                    <a href="http://jetpack.me/support/" target="_blank"><?php _e( 'Support', 'jetpack' ); ?></a> 
    19902115                </p> 
     
    19992124 
    20002125    function ajax_debug() { 
     2126        nocache_headers(); 
     2127 
    20012128        check_ajax_referer( 'jetpack_debug' ); 
    20022129 
     
    20262153            'VERSION'     => 'version', 
    20272154            'OLD_VERSION' => 'old_version', 
     2155            'PUBLIC'      => 'public', 
    20282156        ) as $label => $option_name ) : 
    20292157        ?> 
     
    20402168 
    20412169    function admin_screen_configure_module( $module_id ) { 
    2042         if ( !in_array( $module_id, $this->get_active_modules() ) ) 
     2170        if ( !in_array( $module_id, $this->get_active_modules() ) || !current_user_can( 'manage_options' ) ) 
    20432171            return false; ?> 
    20442172 
     
    21652293                <div class="jetpack-module-actions"> 
    21662294                <?php if ( $jetpack_connected ) : ?> 
    2167                     <?php if ( !$activated ) : ?> 
     2295                    <?php if ( !$activated && current_user_can( 'manage_options' ) ) : ?> 
    21682296                        <a href="<?php echo esc_url( $toggle_url ); ?>" class="jetpack-toggle-button<?php echo ( 'inactive' == $css ? ' button-primary' : ' button' ); ?>"><?php echo $toggle; ?></a>&nbsp; 
    21692297                    <?php endif; ?> 
     
    21722300 
    21732301                    <?php 
    2174                     if ( apply_filters( 'jetpack_module_configurable_' . $module, false ) ) { 
     2302                    if ( current_user_can( 'manage_options' ) && apply_filters( 'jetpack_module_configurable_' . $module, false ) ) { 
    21752303                        echo '<a href="' . esc_attr( Jetpack::module_configuration_url( $module ) ) . '" class="jetpack-configure-button button">' . __( 'Configure', 'jetpack' ) . '</a>'; 
    21762304                    } 
    2177                     ?><?php if ( $activated && $module_data['deactivate'] ) : ?><a style="display: none;" href="<?php echo esc_url( $toggle_url ); ?>" class="jetpack-deactivate-button button"><?php echo $toggle; ?></a>&nbsp;<?php endif; ?> 
     2305                    ?><?php if ( $activated && $module_data['deactivate'] && current_user_can( 'manage_options' ) ) : ?><a style="display: none;" href="<?php echo esc_url( $toggle_url ); ?>" class="jetpack-deactivate-button button"><?php echo $toggle; ?></a>&nbsp;<?php endif; ?> 
    21782306 
    21792307                <?php else : ?> 
     
    23752503            return new Jetpack_Error( 'jetpack_secret', '', $code ); 
    23762504 
     2505        if ( isset( $json->jetpack_public ) ) { 
     2506            $jetpack_public = (int) $json->jetpack_public; 
     2507        } else { 
     2508            $jetpack_public = false; 
     2509        } 
     2510 
    23772511        Jetpack::update_options( array( 
    23782512            'id'         => (int)    $json->jetpack_id, 
    23792513            'blog_token' => (string) $json->jetpack_secret, 
     2514            'public'     => $jetpack_public, 
    23802515        ) ); 
    23812516 
     
    24412576        } 
    24422577 
    2443         if ( !$this->add_nonce( $_GET['timestamp'], $_GET['nonce'] ) ) { 
     2578        $timestamp = (int) $_GET['timestamp']; 
     2579        $nonce     = stripslashes( (string) $_GET['nonce'] ); 
     2580 
     2581        if ( !$this->add_nonce( $timestamp, $nonce ) ) { 
    24442582            return $user; 
    24452583        } 
     
    24522590    function add_nonce( $timestamp, $nonce ) { 
    24532591        global $wpdb; 
     2592        static $nonces_used_this_request = array(); 
     2593 
     2594        if ( isset( $nonces_used_this_request["$timestamp:$nonce"] ) ) { 
     2595            return $nonces_used_this_request["$timestamp:$nonce"]; 
     2596        } 
    24542597 
    24552598        // This should always have gone through Jetpack_Signature::sign_request() first to check $timestamp an $nonce 
     2599        $timestamp = (int) $timestamp; 
     2600        $nonce     = $wpdb->escape( $nonce ); 
    24562601 
    24572602        // Raw query so we can avoid races: add_option will also update 
     
    24642609        ) ); 
    24652610        $wpdb->show_errors( $show_errors ); 
     2611 
     2612        $nonces_used_this_request["$timestamp:$nonce"] = $return; 
     2613 
    24662614        return $return; 
    24672615    } 
     
    25792727    } 
    25802728 
     2729    static function check_privacy( $file ) { 
     2730        static $is_site_publicly_accessible = null; 
     2731 
     2732        if ( is_null( $is_site_publicly_accessible ) ) { 
     2733            $is_site_publicly_accessible = false; 
     2734 
     2735            Jetpack::load_xml_rpc_client(); 
     2736            $rpc = new Jetpack_IXR_Client(); 
     2737 
     2738            $success = $rpc->query( 'jetpack.isSitePubliclyAccessible', home_url() ); 
     2739            if ( $success ) { 
     2740                $response = $rpc->getResponse(); 
     2741                if ( $response ) { 
     2742                    $is_site_publicly_accessible = true; 
     2743                } 
     2744            } 
     2745 
     2746            Jetpack::update_option( 'public', (int) $is_site_publicly_accessible ); 
     2747        } 
     2748 
     2749        if ( $is_site_publicly_accessible ) { 
     2750            return; 
     2751        } 
     2752 
     2753        $module_slug = self::get_module_slug( $file ); 
     2754 
     2755        $privacy_checks = Jetpack::state( 'privacy_checks' ); 
     2756        if ( !$privacy_checks ) { 
     2757            $privacy_checks = $module_slug; 
     2758        } else { 
     2759            $privacy_checks .= ",$module_slug"; 
     2760        } 
     2761 
     2762        Jetpack::state( 'privacy_checks', $privacy_checks ); 
     2763    } 
     2764 
    25812765    /** 
    25822766     * Helper method for multicall XMLRPC. 
     
    26402824 
    26412825        return preg_replace( '|://[^/]+?/|', "://s$static_counter.wp.com/", $url ); 
     2826    } 
     2827     
     2828/* JSON API Authorization */ 
     2829 
     2830    /** 
     2831     * Handles the login action for Authorizing the JSON API 
     2832     */ 
     2833    function login_form_json_api_authorization() { 
     2834        $this->verify_json_api_authorization_request(); 
     2835 
     2836        add_action( 'wp_login', array( &$this, 'store_json_api_authorization_token' ), 10, 2 ); 
     2837 
     2838        add_action( 'login_message', array( &$this, 'login_message_json_api_authorization' ) ); 
     2839        add_action( 'login_form', array( &$this, 'preserve_action_in_login_form_for_json_api_authorization' ) ); 
     2840        add_filter( 'site_url', array( &$this, 'post_login_form_to_signed_url' ), 10, 3 ); 
     2841    } 
     2842 
     2843    // Make sure the login form is POSTed to the signed URL so we can reverify the request 
     2844    function post_login_form_to_signed_url( $url, $path, $scheme ) { 
     2845        if ( 'wp-login.php' !== $path || 'login_post' !== $scheme ) { 
     2846            return $url; 
     2847        } 
     2848 
     2849        return "$url?{$_SERVER['QUERY_STRING']}"; 
     2850    } 
     2851 
     2852    // Make sure the POSTed request is handled by the same action 
     2853    function preserve_action_in_login_form_for_json_api_authorization() { 
     2854        echo "<input type='hidden' name='action' value='jetpack_json_api_authorization' />\n"; 
     2855    } 
     2856 
     2857    // If someone logs in to approve API access, store the Access Code in usermeta 
     2858    function store_json_api_authorization_token( $user_login, $user ) { 
     2859        add_filter( 'login_redirect', array( &$this, 'add_token_to_login_redirect_json_api_authorization' ), 10, 3 ); 
     2860        add_filter( 'allowed_redirect_hosts', array( &$this, 'allow_wpcom_public_api_domain' ) ); 
     2861        $token = wp_generate_password( 32, false ); 
     2862        update_user_meta( $user->ID, 'jetpack_json_api_' . $this->json_api_authorization_request['client_id'], $token ); 
     2863    } 
     2864 
     2865    // Add public-api.wordpress.com to the safe redirect whitelist - only added when someone allows API access 
     2866    function allow_wpcom_public_api_domain( $domains ) { 
     2867        $domains[] = 'public-api.wordpress.com'; 
     2868        return $domains; 
     2869    } 
     2870 
     2871    // Add the Access Code details to the public-api.wordpress.com redirect 
     2872    function add_token_to_login_redirect_json_api_authorization( $redirect_to, $original_redirect_to, $user ) { 
     2873        return add_query_arg( urlencode_deep( array( 
     2874            'jetpack-code'    => get_user_meta( $user->ID, 'jetpack_json_api_' . $this->json_api_authorization_request['client_id'], true ), 
     2875            'jetpack-user-id' => (int) $user->ID, 
     2876            'jetpack-state'   => $this->json_api_authorization_request['state'], 
     2877        ) ), $redirect_to ); 
     2878    } 
     2879 
     2880    // Verifies the request by checking the signature 
     2881    function verify_json_api_authorization_request() { 
     2882        require_once dirname( __FILE__ ) . '/class.jetpack-signature.php'; 
     2883 
     2884        $token = Jetpack_Data::get_access_token( 1 ); 
     2885        if ( !$token || empty( $token->secret ) ) { 
     2886            wp_die( __( 'You must connect your Jetpack plugin to WordPress.com to use this feature.' ) ); 
     2887        } 
     2888 
     2889        $die_error = __( 'Someone may be trying to trick you into giving them access to your site.  Or it could be you just encountered a bug :).  Either way, please close this window.', 'jetpack' ); 
     2890 
     2891        $jetpack_signature =& new Jetpack_Signature( $token->secret, (int) Jetpack::get_option( 'time_diff' ) ); 
     2892        $signature = $jetpack_signature->sign_current_request( array( 'body' => null, 'method' => 'GET' ) ); 
     2893        if ( !$signature ) { 
     2894            wp_die( $die_error ); 
     2895        } else if ( is_wp_error( $signature ) ) { 
     2896            wp_die( $die_error ); 
     2897        } else if ( $signature !== $_GET['signature'] ) { 
     2898            if ( is_ssl() ) { 
     2899                // If we signed an HTTP request on the Jetpack Servers, but got redirected to HTTPS by the local blog, check the HTTP signature as well 
     2900                $signature = $jetpack_signature->sign_current_request( array( 'scheme' => 'http', 'body' => null, 'method' => 'GET' ) ); 
     2901                if ( !$signature || is_wp_error( $signature ) || $signature !== $_GET['signature'] ) { 
     2902                    wp_die( $die_error ); 
     2903                } 
     2904            } else { 
     2905                wp_die( $die_error ); 
     2906            } 
     2907        } 
     2908 
     2909        $timestamp = (int) $_GET['timestamp']; 
     2910        $nonce     = stripslashes( (string) $_GET['nonce'] ); 
     2911 
     2912        if ( !$this->add_nonce( $timestamp, $nonce ) ) { 
     2913            // De-nonce the nonce, at least for 5 minutes. 
     2914            // We have to reuse this nonce at least once (used the first time when the initial request is made, used a second time when the login form is POSTed) 
     2915            $old_nonce_time = get_option( "jetpack_nonce_{$timestamp}_{$nonce}" ); 
     2916            if ( $old_nonce_time < time() - 300 ) { 
     2917                wp_die( __( 'The authorization process expired.  Please go back and try again.' ) ); 
     2918            } 
     2919        } 
     2920 
     2921        $data = json_decode( base64_decode( stripslashes( $_GET['data'] ) ) ); 
     2922        $data_filters = array( 
     2923            'state'        => 'opaque', 
     2924            'client_id'    => 'int', 
     2925            'client_title' => 'string', 
     2926            'client_image' => 'url', 
     2927        ); 
     2928 
     2929        foreach ( $data_filters as $key => $sanitation ) { 
     2930            if ( !isset( $data->$key ) ) { 
     2931                wp_die( $die_error ); 
     2932            } 
     2933 
     2934            switch ( $sanitation ) { 
     2935            case 'int' : 
     2936                $this->json_api_authorization_request[$key] = (int) $data->$key; 
     2937                break; 
     2938            case 'opaque' : 
     2939                $this->json_api_authorization_request[$key] = (string) $data->$key; 
     2940                break; 
     2941            case 'string' : 
     2942                $this->json_api_authorization_request[$key] = wp_kses( (string) $data->$key, array() ); 
     2943                break; 
     2944            case 'url' : 
     2945                $this->json_api_authorization_request[$key] = esc_url_raw( (string) $data->$key ); 
     2946                break; 
     2947            } 
     2948        } 
     2949 
     2950        if ( empty( $this->json_api_authorization_request['client_id'] ) ) { 
     2951            wp_die( $die_error ); 
     2952        } 
     2953    } 
     2954 
     2955    function login_message_json_api_authorization( $message ) { 
     2956        return '<p class="message">' . sprintf( 
     2957            esc_html__( '%s wants to access your site&#8217;s data.  Log in to authorize that access.' ), 
     2958            '<strong>' . esc_html( $this->json_api_authorization_request['client_title'] ) . '</strong>' 
     2959        ) . '<img src="' . esc_url( $this->json_api_authorization_request['client_image'] ) . '" /></p>'; 
    26422960    } 
    26432961} 
     
    29933311            } 
    29943312 
     3313            $jetpack->sync->register( 'noop' ); // Spawn a sync to make sure the Jetpack Servers know what modules are active. 
     3314 
    29953315            // Start nonce cleaner 
    29963316            wp_clear_scheduled_hook( 'jetpack_clean_nonces' ); 
     
    31403460    static function sync_posts( $file, array $settings = null ) { 
    31413461        $jetpack = Jetpack::init(); 
    3142         return call_user_func_array( array( $jetpack->sync, 'posts' ), func_get_args() ); 
     3462        $args = func_get_args(); 
     3463        return call_user_func_array( array( $jetpack->sync, 'posts' ), $args ); 
    31433464    } 
    31443465 
     
    31533474    static function sync_comments( $file, array $settings = null ) { 
    31543475        $jetpack = Jetpack::init(); 
    3155         return call_user_func_array( array( $jetpack->sync, 'comments' ), func_get_args() ); 
     3476        $args = func_get_args(); 
     3477        return call_user_func_array( array( $jetpack->sync, 'comments' ), $args ); 
    31563478    } 
    31573479 
     
    31633485    static function sync_options( $file, $option /*, $option, ... */ ) { 
    31643486        $jetpack = Jetpack::init(); 
    3165         return call_user_func_array( array( $jetpack->sync, 'options' ), func_get_args() ); 
     3487        $args = func_get_args(); 
     3488        return call_user_func_array( array( $jetpack->sync, 'options' ), $args ); 
    31663489    } 
    31673490 
     
    34053728        $delete_on_behalf_of = array(); 
    34063729        $submit_on_behalf_of = array(); 
    3407         $delete_stati = array( 'trash', 'delete' ); 
     3730        $delete_stati = array( 'delete' ); 
    34083731 
    34093732        foreach ( $module_conditions as $module => $conditions ) { 
     
    36313954        $delete_on_behalf_of = array(); 
    36323955        $submit_on_behalf_of = array(); 
    3633         $delete_stati = array( 'trash', 'delete', 'spam' ); 
     3956        $delete_stati = array( 'delete' ); 
    36343957 
    36353958        foreach ( $this->sync_conditions['comments'] as $module => $conditions ) { 
  • jetpack/trunk/modules/enhanced-distribution.php

    r607320 r610170  
    1313    Jetpack_Sync::sync_comments( __FILE__ ); 
    1414} 
     15 
     16function jetpack_enhanced_distribution_activate() { 
     17    Jetpack::check_privacy( __FILE__ ); 
     18} 
     19 
     20 
     21// In case it's active prior to upgrading to 1.9 
     22function jetpack_enhanced_distribution_before_activate_default_modules() { 
     23    $old_version = Jetpack::get_option( 'old_version' ); 
     24    list( $old_version ) = explode( ':', $old_version ); 
     25 
     26    if ( version_compare( $old_version, '1.9-something', '>=' ) ) { 
     27        return; 
     28    } 
     29 
     30    Jetpack::check_privacy( __FILE__ ); 
     31} 
     32 
     33add_action( 'jetpack_activate_module_enhanced-distribution', 'jetpack_enhanced_distribution_activate' ); 
     34add_action( 'jetpack_before_activate_default_modules', 'jetpack_enhanced_distribution_before_activate_default_modules' ); 
  • jetpack/trunk/modules/module-info.php

    r607411 r610170  
    210210 
    211211 
     212// WordPress.com Notifications 
     213function notes_more_info() { ?> 
     214    <div class="jp-info-img"> 
     215        <a href="http://support.wordpress.com/notifications/"> 
     216            <img class="jp-info-img" src="<?php echo plugins_url( basename( dirname( dirname( __FILE__ ) ) ) . '/_inc/images/screenshots/notes.png' ) ?>" alt="<?php esc_attr_e( 'WordPress.com Notifications', 'jetpack' ) ?>" width="300" height="150" /> 
     217        </a> 
     218    </div> 
     219 
     220    <h4><?php esc_html_e( 'WordPress.com Notifications' , 'jetpack' ); ?></h4> 
     221    <p><?php esc_html_e( 'Keep up with the latest happenings on all your WordPress sites and interact with other WordPress.com users.', 'jetpack' ) ?></p> 
     222<?php 
     223} 
     224add_action( 'jetpack_module_more_info_notes', 'notes_more_info' ); 
     225 
     226function notes_more_info_connected() { ?> 
     227    <div class="jp-info-img"> 
     228        <a href="http://support.wordpress.com/notifications/"> 
     229            <img class="jp-info-img" src="<?php echo plugins_url( basename( dirname( dirname( __FILE__ ) ) ) . '/_inc/images/screenshots/notes.png' ) ?>" alt="<?php esc_attr_e( 'WordPress.com Notifications', 'jetpack' ) ?>" width="300" height="150" /> 
     230        </a> 
     231    </div> 
     232 
     233    <h4><?php esc_html_e( 'WordPress.com Notifications' , 'jetpack' ); ?></h4> 
     234    <p><?php esc_html_e( 'Keep up with the latest happenings on all your WordPress sites and interact with other WordPress.com users.', 'jetpack' ) ?></p> 
     235    <p><?php printf( __( 'You can view your notifications in the toolbar and <a href="%s">on WordPress.com</a>.', 'jetpack' ), 'http://wordpress.com/#!/notifications/' ); ?></p> 
     236<?php 
     237} 
     238add_filter( 'jetpack_module_more_info_connected_notes', 'notes_more_info_connected' ); 
     239 
     240 
     241function notes_load_more_link( $description ) { 
     242    echo '<a class="button more-info-link" href="http://support.wordpress.com/notifications/">' . esc_html__( 'Learn More', 'jetpack' ) . '</a>'; 
     243} 
     244add_filter( 'jetpack_learn_more_button_notes', 'notes_load_more_link' ); 
     245 
     246 
    212247// LaTeX 
    213248function latex_more_info() { ?> 
     
    399434add_action( 'jetpack_learn_more_button_enhanced-distribution', 'jetpack_enhanced_distribution_more_link' ); 
    400435 
     436// JSON API 
     437function jetpack_json_api_more_info() { ?> 
     438    <h4><?php esc_html_e( 'JSON API' , 'jetpack' ); ?></h4> 
     439 
     440    <p><?php esc_html_e( 'Jetpack will allow you to authorize applications and services to securely connect to your blog and allow them to use your content in new ways and offer you new functionality.', 'jetpack' ); ?> 
     441 
     442    <p><?php _e( "Developers can use WordPress.com's <a href='http://developer.wordpress.com/docs/oauth2/'>OAuth2</a> authentication system and <a href='http://developer.wordpress.com/docs/api/'>WordPress.com REST API</a> to manage and access your site's content.", 'jetpack' ); ?></p> 
     443 
     444<?php 
     445} 
     446 
     447add_action( 'jetpack_module_more_info_json-api', 'jetpack_json_api_more_info' ); 
     448add_action( 'jetpack_module_more_info_connected_json-api', 'jetpack_json_api_more_info' ); 
     449 
     450function jetpack_json_api_more_link() { 
     451    echo '<a class="button more-info-link" href="http://jetpack.me/support/json-api/">' . esc_html__( 'Learn More', 'jetpack' ) . '</a>'; 
     452} 
     453add_action( 'jetpack_learn_more_button_json-api', 'jetpack_json_api_more_link' ); 
     454 
    401455// Contact Form: START 
    402456function jetpack_contact_form_learn_more_button() { 
  • jetpack/trunk/readme.txt

    r607711 r610170  
    11=== Jetpack by WordPress.com === 
    2 Contributors: automattic, apeatling, beaulebens, hugobaeta, joen, mdawaffe, andy, designsimply, hew, westi, eoigal, tmoorewp, matt, pento, cfinke, daniloercoli, chellycat 
    3 Tags: WordPress.com, statistics, stats, views, tweets, twitter, widget, gravatar, hovercards, profile, equations, latex, math, maths, youtube, shortcode, archives, audio, blip, bliptv, dailymotion, digg, flickr, googlevideo, google, googlemaps, kyte, kytetv, livevideo, redlasso, rockyou, rss, scribd, slide, slideshare, soundcloud, vimeo, shortlinks, wp.me, subscriptions 
     2Contributors: automattic, apeatling, beaulebens, hugobaeta, joen, mdawaffe, andy, designsimply, hew, westi, eoigal, tmoorewp, matt, pento, cfinke, daniloercoli, chellycat, gibrown, jblz, jshreve 
     3Tags: WordPress.com, statistics, stats, views, tweets, twitter, widget, gravatar, hovercards, profile, equations, latex, math, maths, youtube, shortcode, archives, audio, blip, bliptv, dailymotion, digg, flickr, googlevideo, google, googlemaps, kyte, kytetv, livevideo, redlasso, rockyou, rss, scribd, slide, slideshare, soundcloud, vimeo, shortlinks, wp.me, subscriptions, notifications, notes, json, api, rest 
    44Requires at least: 3.2 
    55Tested up to: 3.4.2 
     
    3030* A CSS editor that lets you customize your site design without modifying your theme. 
    3131* A mobile theme that automatically streamlines your site for visitors on mobile devices. 
    32 * Mobile push notifications for new comments via WordPress mobile apps.  
     32* Mobile push notifications for new comments via WordPress mobile apps. 
     33* The ability to allow applications to securely authenticate and access your site with your permission.  
    3334* and *many* more to come! 
    3435 
Note: See TracChangeset for help on using the changeset viewer.