WordPress.org

Plugin Directory

Changeset 613649


Ignore:
Timestamp:
10/17/12 16:19:48 (18 months ago)
Author:
tmoorewp
Message:

Merge changes from trunk.

Location:
jetpack/branches/grunion
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • jetpack/branches/grunion

  • jetpack/branches/grunion/class.jetpack-xmlrpc-server.php

    r610170 r613649  
    265265        $verify_api_user_args = $args[1]; 
    266266 
    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]; 
     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        $user_details = (array) $json_api_args[4]; 
    271272 
    272273        if ( !$verify_api_user_args ) { 
     
    314315        require_once dirname( __FILE__ ) . '/class.json-api.php'; 
    315316        $api = WPCOM_JSON_API::init( $method, $url, $post_body ); 
     317        $api->token_details['user'] = $user_details; 
    316318        require_once dirname( __FILE__ ) . '/class.json-api-endpoints.php'; 
    317319 
  • jetpack/branches/grunion/class.json-api-endpoints.php

    r611714 r613649  
    55    // The API Object 
    66    var $api; 
     7 
     8    var $pass_wpcom_user_details = false; 
     9    var $can_use_user_details_instead_of_blog_membership = false; 
    710 
    811    // One liner. 
     
    9093            'example_request'      => '', 
    9194            'example_request_data' => '', 
    92             'example_response'     => '' 
     95            'example_response'     => '', 
     96 
     97            'pass_wpcom_user_details' => false, 
     98            'can_use_user_details_instead_of_blog_membership' => false, 
    9399        ); 
    94100 
     
    21002106            break; 
    21012107        case 'display' : 
    2102             if ( 'approved' !== $status && !current_user_can( 'edit_comment', $comment->comment_ID ) ) { 
    2103                 return new WP_Error( 'unauthorized', 'User cannot read unapproved comment', 403 ); 
     2108            if ( 'approved' !== $status ) { 
     2109                $current_user_id = get_current_user_id(); 
     2110                $user_can_read_coment = false; 
     2111                if ( $current_user_id && $comment->user_id && $current_user_id == $comment->user_id ) { 
     2112                    $user_can_read_coment = true; 
     2113                } elseif ( 
     2114                    $comment->comment_author_email && $comment->comment_author 
     2115                && 
     2116                    isset( $this->api->token_details['user'] ) 
     2117                && 
     2118                    $this->api->token_details['user']['user_email'] === $comment->comment_author_email 
     2119                && 
     2120                    $this->api->token_details['user']['display_name'] === $comment->comment_author 
     2121                ) { 
     2122                    $user_can_read_coment = true; 
     2123                } else { 
     2124                    $user_can_read_coment = current_user_can( 'edit_comment', $comment->comment_ID ); 
     2125                } 
     2126 
     2127                if ( !$user_can_read_coment ) { 
     2128                    return new WP_Error( 'unauthorized', 'User cannot read unapproved comment', 403 ); 
     2129                } 
    21042130            } 
    21052131 
     
    24972523        $user = wp_get_current_user(); 
    24982524        if ( !$user || is_wp_error( $user ) || !$user->ID ) { 
    2499             return new WP_Error( 'authorization_required', 'An active access token must be used to comment.', 403 ); 
     2525            $auth_required = false; 
     2526            if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) { 
     2527                $auth_required = true; 
     2528            } elseif ( isset( $this->api->token_details['user'] ) ) { 
     2529                $user = (object) $this->api->token_details['user']; 
     2530                foreach ( array( 'display_name', 'user_email', 'user_url' ) as $user_datum ) { 
     2531                    if ( !isset( $user->$user_datum ) ) { 
     2532                        $auth_required = true; 
     2533                    } 
     2534                } 
     2535                if ( !isset( $user->ID ) ) { 
     2536                    $user->ID = 0; 
     2537                } 
     2538            } else { 
     2539                $auth_required = true; 
     2540            } 
     2541 
     2542            if ( $auth_required ) { 
     2543                return new WP_Error( 'authorization_required', 'An active access token must be used to comment.', 403 ); 
     2544            } 
    25002545        } 
    25012546 
     
    25052550            'comment_author'       => $user->display_name, 
    25062551            'comment_author_email' => $user->user_email, 
    2507             'comment_author_URL'   => $user->user_url, 
     2552            'comment_author_url'   => $user->user_url, 
    25082553            'comment_content'      => $input['content'], 
    25092554            'comment_parent'       => $comment_parent_id, 
     2555            'comment_type'         => '', 
    25102556        ); 
    25112557 
     
    32573303    ), 
    32583304 
     3305    'pass_wpcom_user_details' => true, 
     3306    'can_use_user_details_instead_of_blog_membership' => true, 
     3307 
    32593308    'example_request'      => 'https://public-api.wordpress.com/rest/v1/sites/30434183/posts/1222/replies/new/', 
    32603309    'example_request_data' =>  array( 
     
    33243373    ), 
    33253374 
     3375    'pass_wpcom_user_details' => true, 
     3376    'can_use_user_details_instead_of_blog_membership' => true, 
     3377 
    33263378    'example_request'      => 'https://public-api.wordpress.com/rest/v1/sites/30434183/comments/8/replies/new/', 
    33273379    'example_request_data' => array( 
  • jetpack/branches/grunion/class.json-api.php

    r610215 r613649  
    104104 
    105105    function initialize() { 
    106         $this->token_details = array( 
    107             'blog_id' => Jetpack::get_option( 'id' ), 
    108         ); 
     106        $this->token_details['blog_id'] = Jetpack::get_option( 'id' ); 
    109107    } 
    110108 
  • jetpack/branches/grunion/jetpack.php

    r613234 r613649  
    201201            $this->xmlrpc_server = new Jetpack_XMLRPC_Server(); 
    202202 
    203             // Don't let anyone authenticate 
    204             remove_all_filters( 'authenticate' ); 
     203            $this->require_jetpack_authentication(); 
    205204 
    206205            if ( $this->is_active() ) { 
    207                 // Allow Jetpack authentication 
    208                 add_filter( 'authenticate', array( $this, 'authenticate_xml_rpc' ), 10, 3 ); 
    209  
    210206                // Hack to preserve $HTTP_RAW_POST_DATA 
    211207                add_filter( 'xmlrpc_methods', array( $this, 'xmlrpc_methods' ) ); 
     
    220216            // Now that no one can authenticate, and we're whitelisting all XML-RPC methods, force enable_xmlrpc on. 
    221217            add_filter( 'pre_option_enable_xmlrpc', '__return_true' ); 
     218        } elseif ( is_admin() && isset( $_POST['action'] ) && 'jetpack_upload_file' == $_POST['action'] ) { 
     219            $this->require_jetpack_authentication(); 
     220            $this->add_remote_request_handlers(); 
    222221        } else { 
    223222            if ( $this->is_active() ) {  
     
    243242        add_action( 'customize_controls_enqueue_scripts', array( $this, 'devicepx' ) ); 
    244243        add_action( 'admin_enqueue_scripts', array( $this, 'devicepx' ) ); 
     244    } 
     245 
     246    function require_jetpack_authentication() { 
     247        // Don't let anyone authenticate 
     248        $_COOKIE = array(); 
     249        remove_all_filters( 'authenticate' ); 
     250 
     251        if ( $this->is_active() ) { 
     252            // Allow Jetpack authentication 
     253            add_filter( 'authenticate', array( $this, 'authenticate_jetpack' ), 10, 3 ); 
     254        } 
    245255    } 
    246256 
     
    12001210 
    12011211        do_action( 'jetpack_admin_menu' ); 
     1212    } 
     1213 
     1214    function add_remote_request_handlers() { 
     1215        add_action( 'wp_ajax_nopriv_jetpack_upload_file', array( $this, 'remote_request_handlers' ) ); 
     1216    } 
     1217 
     1218    function remote_request_handlers() { 
     1219        switch ( current_filter() ) { 
     1220        case 'wp_ajax_nopriv_jetpack_upload_file' : 
     1221            $response = $this->upload_handler(); 
     1222            break; 
     1223        default : 
     1224            $response = new Jetpack_Error( 'unknown_handler', 'Unknown Handler', 400 ); 
     1225            break; 
     1226        } 
     1227 
     1228        if ( !$response ) { 
     1229            $response = new Jetpack_Error( 'unknown_error', 'Unknown Error', 400 ); 
     1230        } 
     1231 
     1232        if ( is_wp_error( $response ) ) { 
     1233            $status_code       = $response->get_error_data(); 
     1234            $error             = $response->get_error_code(); 
     1235            $error_description = $response->get_error_message(); 
     1236 
     1237            if ( !is_int( $status_code ) ) { 
     1238                $status_code = 400; 
     1239            } 
     1240 
     1241            status_header( $status_code ); 
     1242            die( json_encode( (object) compact( 'error', 'error_description' ) ) ); 
     1243        } 
     1244 
     1245        status_header( 200 ); 
     1246        if ( true === $response ) { 
     1247            exit; 
     1248        } 
     1249 
     1250        die( json_encode( (object) $response ) ); 
     1251    } 
     1252 
     1253    function upload_handler() { 
     1254        if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) ) { 
     1255            return new Jetpack_Error( 405, get_status_header_desc( 405 ), 405 ); 
     1256        } 
     1257 
     1258        $user = wp_authenticate( '', '' ); 
     1259        if ( !$user || is_wp_error( $user ) ) { 
     1260            return new Jetpack_Error( 403, get_status_header_desc( 403 ), 403 ); 
     1261        } 
     1262 
     1263        wp_set_current_user( $user->ID ); 
     1264 
     1265        if ( !current_user_can( 'upload_files' ) ) { 
     1266            return new Jetpack_Error( 'cannot_upload_files', 'User does not have permission to upload files', 403 ); 
     1267        } 
     1268 
     1269        if ( empty( $_FILES ) ) { 
     1270            return new Jetpack_Error( 'no_files_uploaded', 'No files were uploaded: nothing to process', 400 ); 
     1271        } 
     1272 
     1273        foreach ( array_keys( $_FILES ) as $files_key ) { 
     1274            if ( !isset( $_POST["_jetpack_file_hmac_{$files_key}"] ) ) { 
     1275                return new Jetpack_Error( 'missing_hmac', 'An HMAC for one or more files is missing', 400 ); 
     1276            } 
     1277        } 
     1278 
     1279        $media_keys = array_keys( $_FILES['media'] ); 
     1280 
     1281        $token = Jetpack_Data::get_access_token( get_current_user_id() ); 
     1282        if ( !$token || is_wp_error( $token ) ) { 
     1283            return new Jetpack_Error( 'unknown_token', 'Unknown Jetpack token', 403 ); 
     1284        } 
     1285 
     1286        $uploaded_files = array(); 
     1287        $global_post = isset( $GLOBALS['post'] ) ? $GLOBALS['post'] : null; 
     1288        unset( $GLOBALS['post'] ); 
     1289        foreach ( $_FILES['media']['name'] as $index => $name ) { 
     1290            $file = array(); 
     1291            foreach ( $media_keys as $media_key ) { 
     1292                $file[$media_key] = $_FILES['media'][$media_key][$index]; 
     1293            } 
     1294 
     1295            list( $hmac_provided, $salt ) = explode( ':', $_POST['_jetpack_file_hmac_media'][$index] ); 
     1296 
     1297            $hmac_file = hash_hmac_file( 'sha1', $file['tmp_name'], $salt . $token->secret ); 
     1298            if ( $hmac_provided !== $hmac_file ) { 
     1299                $uploaded_files[$index] = (object) array( 'error' => 'invalid_hmac', 'error_description' => 'The corresponding HMAC for this file does not match' ); 
     1300                continue; 
     1301            } 
     1302 
     1303            $_FILES['.jetpack.upload.'] = $file; 
     1304            $attachment_id = media_handle_upload( '.jetpack.upload.', 0, array(), array( 
     1305                'action' => 'jetpack_upload_file', 
     1306            ) ); 
     1307 
     1308            if ( !$attachment_id ) { 
     1309                $uploaded_files[$index] = (object) array( 'error' => 'unknown', 'error_description' => 'An unknown problem occurred processing the upload on the Jetpack site' ); 
     1310            } elseif ( is_wp_error( $attachment_id ) ) { 
     1311                $uploaded_files[$index] = (object) array( 'error' => 'attachment_' . $attachment_id->get_error_code(), 'error_description' => $attachment_id->get_error_message() ); 
     1312            } else { 
     1313                $attachment = get_post( $attachment_id ); 
     1314                $uploaded_files[$index] = (object) array( 
     1315                    'id'   => (string) $attachment_id, 
     1316                    'file' => $attachment->post_title, 
     1317                    'url'  => wp_get_attachment_url( $attachment_id ), 
     1318                    'type' => $attachment->post_mime_type, 
     1319                ); 
     1320            } 
     1321        } 
     1322        if ( !is_null( $global_post ) ) { 
     1323            $GLOBALS['post'] = $global_post; 
     1324        } 
     1325 
     1326        return $uploaded_files; 
    12021327    } 
    12031328 
     
    25302655 
    25312656    /** 
    2532      * Authenticates XML-RPC requests from the Jetpack Server 
    2533      * 
    2534      * We don't actually know who the real user is; we set it to the account that created the connection. 
    2535      */ 
    2536     function authenticate_xml_rpc( $user, $username, $password ) { 
     2657     * Authenticates XML-RPC and other requests from the Jetpack Server 
     2658     */ 
     2659    function authenticate_jetpack( $user, $username, $password ) { 
    25372660        if ( is_a( $user, 'WP_User' ) ) { 
    25382661            return $user; 
     
    25402663 
    25412664        // It's not for us 
    2542         if ( !isset( $_GET['for'] ) || 'jetpack' != $_GET['for'] || !isset( $_GET['token'] ) || empty( $_GET['signature'] ) ) { 
     2665        if ( !isset( $_GET['token'] ) || empty( $_GET['signature'] ) ) { 
    25432666            return $user; 
    25442667        } 
     
    25672690 
    25682691        $jetpack_signature = new Jetpack_Signature( $token->secret, (int) Jetpack::get_option( 'time_diff' ) ); 
    2569         $signature = $jetpack_signature->sign_current_request( array( 'body' => $this->HTTP_RAW_POST_DATA ) ); 
     2692        if ( isset( $_POST['_jetpack_is_multipart'] ) ) { 
     2693            $post_data = $_POST; 
     2694            $file_hashes = array(); 
     2695            foreach ( $post_data as $post_data_key => $post_data_value ) { 
     2696                if ( 0 !== strpos( $post_data_key, '_jetpack_file_hmac_' ) ) { 
     2697                    continue; 
     2698                } 
     2699                $post_data_key = substr( $post_data_key, strlen( '_jetpack_file_hmac_' ) ); 
     2700                $file_hashes[$post_data_key] = $post_data_value; 
     2701            } 
     2702 
     2703            foreach ( $file_hashes as $post_data_key => $post_data_value ) { 
     2704                unset( $post_data["_jetpack_file_hmac_{$post_data_key}"] ); 
     2705                $post_data[$post_data_key] = $post_data_value; 
     2706            } 
     2707 
     2708            ksort( $post_data ); 
     2709 
     2710            $body = http_build_query( stripslashes_deep( $post_data ) ); 
     2711        } elseif ( is_null( $this->HTTP_RAW_POST_DATA ) ) { 
     2712            $body = file_get_contents( 'php://input' ); 
     2713        } else { 
     2714            $body = null; 
     2715        } 
     2716        $signature = $jetpack_signature->sign_current_request( array( 
     2717            'body' => is_null( $body ) ? $this->HTTP_RAW_POST_DATA : $body 
     2718        ) ); 
     2719 
    25702720        if ( !$signature ) { 
    25712721            return $user; 
Note: See TracChangeset for help on using the changeset viewer.