Make WordPress Core

Ticket #31528: 31528.10.diff

File 31528.10.diff, 11.9 KB (added by jorbin, 10 years ago)
  • src/wp-admin/css/forms.css

     
    850850        margin-bottom: 5px;
    851851}
    852852
     853/*------------------------------------------------------------------------------
     854   Credentials check dialog for Install and Updates
     855------------------------------------------------------------------------------*/
     856
     857.request-filesystem-credentials-dialog {
     858        display: none;
     859}
     860
     861.request-filesystem-credentials-dialog .notification-dialog{
     862        top: 15%
     863}
     864
     865.request-filesystem-credentials-dialog-content{
     866        margin: 25px;
     867}
     868.request-filesystem-credentials-dialog-content input[type="text"],
     869.request-filesystem-credentials-dialog-content input[type="password"]{
     870        width:85%;
     871}
     872
    853873/* =Media Queries
    854874-------------------------------------------------------------- */
    855875
  • src/wp-admin/includes/ajax-actions.php

     
    29132913        if ( is_wp_error( $result ) ) {
    29142914                $status['error'] = $result->get_error_message();
    29152915                wp_send_json_error( $status );
     2916        } else if ( is_null( $result ) ) {
     2917                $status['errorCode'] = 'unable_to_connect_to_filesystem';
     2918                $status['error'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' );
     2919                wp_send_json_error( $status );
    29162920        }
    29172921
    29182922        $plugin_status = install_plugin_install_status( $api );
     
    29542958
    29552959        $upgrader = new Plugin_Upgrader( new Automatic_Upgrader_Skin() );
    29562960        $result = $upgrader->bulk_upgrade( array( $plugin ) );
    2957 
    29582961        if ( is_array( $result ) ) {
    2959                 $result = $result[ $plugin ];
    2960         }
    2961 
    2962         if ( is_wp_error( $result ) ) {
     2962                wp_send_json_success( $status );
     2963        } else if ( is_wp_error( $result ) ) {
    29632964                $status['error'] = $result->get_error_message();
    29642965                wp_send_json_error( $status );
     2966        } else if ( is_bool( $result ) && ! $result ) {
     2967                $status['errorCode'] = 'unable_to_connect_to_filesystem';
     2968                $status['error'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' );
     2969                wp_send_json_error( $status );
    29652970        }
    2966 
    2967         wp_send_json_success( $status );
    29682971}
    29692972
    29702973/**
  • src/wp-admin/includes/file.php

     
    11921192<?php
    11931193        return false;
    11941194}
     1195
     1196/**
     1197 * Print the credentials modal when needed 
     1198 *
     1199 * @since 4.2.0
     1200 */
     1201function wp_print_request_filesystem_credentials_modal() {
     1202        $filesystem_method = get_filesystem_method();
     1203        ob_start();
     1204        $filesystem_credentials_are_stored = request_filesystem_credentials( self_admin_url() );
     1205        ob_end_clean();
     1206        $request_filesystem_credentials = ( $filesystem_method != 'direct' && ! $filesystem_credentials_are_stored );
     1207        if ( ! $request_filesystem_credentials ) {
     1208                return;
     1209        }
     1210        ?>
     1211        <div id="request-filesystem-credentials-dialog" class="notification-dialog-wrap request-filesystem-credentials-dialog">
     1212                <div class="notification-dialog-background"></div>
     1213                <div class="notification-dialog">
     1214                        <div class="request-filesystem-credentials-dialog-content">
     1215                                <?php request_filesystem_credentials( site_url() ); ?>
     1216                        <div>
     1217                </div>
     1218        </div>
     1219        <?php
     1220}
  • src/wp-admin/js/updates.js

     
    2222        wp.updates.l10n = window._wpUpdatesSettings.l10n;
    2323
    2424        /**
     25         * Whether filesystem credentials need to be requested from the user.
     26         *
     27         * @since 4.2.0
     28         *
     29         * @var bool
     30         */
     31        wp.updates.shouldRequestFilesystemCredentials = ( $( '#request-filesystem-credentials-dialog' ).length <= 0 ) ? false :true;
     32
     33        /**
     34         * Filesystem credentials to be packaged along with the request.
     35         *
     36         * @since  4.2.0
     37         *
     38         * @var object
     39         */
     40        wp.updates.filesystemCredentials = {
     41                ftp: {
     42                        host: null,
     43                        username: null,
     44                        password: null,
     45                        connectionType: null
     46                },
     47                ssh: {
     48                        publicKey: null,
     49                        privateKey: null
     50                }
     51        };
     52
     53        /**
    2554         * Flag if we're waiting for an install/update to complete.
    2655         *
    2756         * @since 4.2.0
     
    3160        wp.updates.updateLock = false;
    3261
    3362        /**
     63         * Flag if we've done an install or update successfully.
     64         *
     65         * @since 4.2.0
     66         *
     67         * @var bool
     68         */
     69        wp.updates.updateDoneSuccessfully = false;
     70
     71        /**
    3472         * If the user tries to install/update a plugin while an install/update is
    3573         * already happening, it can be placed in this queue to perform later.
    3674         *
     
    124162
    125163                var data = {
    126164                        '_ajax_nonce': wp.updates.ajaxNonce,
    127                         'plugin':      plugin,
    128                         'slug':        slug
     165                        'plugin':        plugin,
     166                        'slug':          slug,
     167                        username:        wp.updates.filesystemCredentials.ftp.username,
     168                        password:        wp.updates.filesystemCredentials.ftp.password,
     169                        hostname:        wp.updates.filesystemCredentials.ftp.hostname,
     170                        connection_type: wp.updates.filesystemCredentials.ftp.connectionType,
     171                        public_key:      wp.updates.filesystemCredentials.ssh.publicKey,
     172                        private_key:     wp.updates.filesystemCredentials.ssh.privateKey
    129173                };
    130174
    131175                wp.ajax.post( 'update-plugin', data )
     
    157201                wp.a11y.speak( wp.updates.l10n.updatedMsg );
    158202
    159203                wp.updates.decrementCount( 'plugin' );
     204
     205                wp.updates.updateDoneSuccessfully = true;
    160206        };
    161207
    162208        /**
     
    168214         */
    169215        wp.updates.updateError = function( response ) {
    170216                var $message;
     217                wp.updates.updateDoneSuccessfully = false;
     218                if ( response.errorCode && response.errorCode == 'unable_to_connect_to_filesystem' ) {
     219                        wp.updates.credentialError( response, 'update-plugin' );
     220                        return;
     221                }
    171222                if ( 'plugins' === pagenow || 'plugins-network' === pagenow ) {
    172223                        $message = $( '#' + response.slug ).next().find( '.update-message' );
    173224                } else if ( 'plugin-install' === pagenow ) {
     
    179230        };
    180231
    181232        /**
     233         * Show an
     234         *
     235         * @param {string} message
     236         * @since 4.2.0
     237         */
     238        wp.updates.showErrorInCredentialsForm = function( message ) {
     239                var $notificationDialog = $( '.notification-dialog' );
     240
     241                // Remove any existing error
     242                $notificationDialog.find( '.error' ).remove();
     243
     244                $notificationDialog.find( 'h3' ).after( '<div class="error">' + message + '</div>' );
     245    };
     246
     247        /**
    182248         * After an update attempt has completed, check the queue.
    183249         *
    184250         * @since 4.2.0
     
    216282                wp.updates.updateLock = true;
    217283
    218284                var data = {
    219                         '_ajax_nonce': wp.updates.ajaxNonce,
    220                         'slug':        slug
     285                        '_ajax_nonce':     wp.updates.ajaxNonce,
     286                        'slug':            slug,
     287                        'username':        wp.updates.filesystemCredentials.ftp.username,
     288                        'password':        wp.updates.filesystemCredentials.ftp.password,
     289                        'hostname':        wp.updates.filesystemCredentials.ftp.hostname,
     290                        'connection_type': wp.updates.filesystemCredentials.ftp.connectionType,
     291                        'public_key':      wp.updates.filesystemCredentials.ssh.publicKey,
     292                        'private_key':     wp.updates.filesystemCredentials.ssh.privateKey
    221293                };
    222294
    223295                wp.ajax.post( 'install-plugin', data )
     
    239311                $message.removeClass( 'updating-message' ).addClass( 'updated-message button-disabled' );
    240312                $message.text( wp.updates.l10n.installed );
    241313                wp.a11y.speak( wp.updates.l10n.installedMsg );
     314                wp.updates.updateDoneSuccessfully = true;
    242315        };
    243316
    244317        /**
     
    250323         */
    251324        wp.updates.installError = function( response ) {
    252325                var $message = $( '.plugin-card-' + response.slug ).find( '.install-now' );
     326                wp.updates.updateDoneSuccessfully = false;
     327                if ( response.errorCode && response.errorCode == 'unable_to_connect_to_filesystem' ) {
     328                        wp.updates.credentialError( response, 'update-plugin' );
     329                        return;
     330                }
    253331
    254332                $message.removeClass( 'updating-message' );
    255333                $message.text( wp.updates.l10n.installNow );
    256334        };
    257335
     336        /**
     337         * Events that need to happen when there is a credential error
     338         *
     339         * @since 4.2.0
     340         */
     341        wp.updates.credentialError = function( response, type ) {
     342                wp.updates.updateQueue.push( {
     343                        'type': type,
     344                        'data': {
     345                                // Not cool that we're depending on response for this data.
     346                                // This would feel more whole in a view all tied together.
     347                                plugin: response.plugin,
     348                                slug: response.slug
     349                        }
     350                } );
     351                wp.updates.showErrorInCredentialsForm( response.error );
     352                wp.updates.requestFilesystemCredentials();
     353        };
    258354
     355
    259356        /**
    260357         * If an install/update job has been placed in the queue, queueChecker pulls it out and runs it.
    261358         *
     
    281378                                break;
    282379                }
    283380        };
     381        /**
     382         * Request the users filesystem credentials if we don't have them already
     383         *
     384         * @since 4.2.0
     385         */
     386        wp.updates.requestFilesystemCredentials = function() {
     387                if ( wp.updates.updateDoneSuccessfully === false ) {
     388                        wp.updates.updateLock = true;
     389                        $( 'body' ).addClass( 'modal-open' );
     390                        $( '#request-filesystem-credentials-dialog' ).show();
     391                }
     392        };
    284393
     394        // Bind various click handlers.
    285395        $( document ).ready( function() {
     396                // File system credentials form submit noop-er / handler.
     397                $( '#request-filesystem-credentials-dialog form' ).on( 'submit', function() {
     398                        // Persist the credentials input by the user for the duration of the page load.
     399                        wp.updates.filesystemCredentials.ftp.hostname = $('#hostname').val();
     400                        wp.updates.filesystemCredentials.ftp.username = $('#username').val();
     401                        wp.updates.filesystemCredentials.ftp.password = $('#password').val();
     402                        wp.updates.filesystemCredentials.ftp.connectionType = $('input[name="connection_type"]:checked').val();
     403                        wp.updates.filesystemCredentials.ssh.publicKey = $('#public_key').val();
     404                        wp.updates.filesystemCredentials.ssh.privateKey = $('#private_key').val();
     405
     406                        $( '#request-filesystem-credentials-dialog' ).hide();
     407                        $( 'body' ).removeClass( 'modal-open' );
     408
     409                        // Unlock and invoke the queue.
     410                        wp.updates.updateLock = false;
     411                        wp.updates.queueChecker();
     412
     413                        return false;
     414                });
     415
     416                // Click handler for plugin updates in List Table view.
    286417                $( '.plugin-update-tr .update-link' ).on( 'click', function( e ) {
    287418                        e.preventDefault();
     419                        if ( wp.updates.shouldRequestFilesystemCredentials === '1' && ! wp.updates.updateLock ) {
     420                                wp.updates.requestFilesystemCredentials();
     421                        }
    288422                        var $row = $( e.target ).parents( '.plugin-update-tr' );
    289423                        wp.updates.updatePlugin( $row.data( 'plugin' ), $row.data( 'slug' ) );
    290424                } );
     
    315449
    316450                $( '.plugin-card .install-now' ).on( 'click', function( e ) {
    317451                        e.preventDefault();
     452                        if ( wp.updates.shouldRequestFilesystemCredentials === '1' && ! wp.updates.updateLock ) {
     453                                wp.updates.requestFilesystemCredentials();
     454                        }
     455
    318456                        var $button = $( e.target );
    319457                        if ( $button.hasClass( 'button-disabled' ) ) {
    320458                                return;
  • src/wp-admin/plugin-install.php

     
    128128 */
    129129do_action( "install_plugins_$tab", $paged ); ?>
    130130</div>
    131 <?php
     131
     132<?php
     133wp_print_request_filesystem_credentials_modal();
     134
    132135/**
    133136 * WordPress Administration Template Footer.
    134137 */
  • src/wp-admin/plugins.php

     
    476476</div>
    477477
    478478<?php
     479wp_print_request_filesystem_credentials_modal();
     480
    479481include(ABSPATH . 'wp-admin/admin-footer.php');
  • src/wp-includes/script-loader.php

     
    542542                ) );
    543543
    544544                $scripts->add( 'updates', "/wp-admin/js/updates$suffix.js", array( 'jquery', 'wp-util', 'wp-a11y' ) );
     545
     546
    545547                did_action( 'init' ) && $scripts->localize( 'updates', '_wpUpdatesSettings', array(
    546548                        'ajax_nonce' => wp_create_nonce( 'updates' ),
    547549                        'l10n'       => array(