summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/json-endpoints/jetpack/class.jetpack-json-api-plugins-install-endpoint.php')
-rw-r--r--plugins/jetpack/json-endpoints/jetpack/class.jetpack-json-api-plugins-install-endpoint.php155
1 files changed, 135 insertions, 20 deletions
diff --git a/plugins/jetpack/json-endpoints/jetpack/class.jetpack-json-api-plugins-install-endpoint.php b/plugins/jetpack/json-endpoints/jetpack/class.jetpack-json-api-plugins-install-endpoint.php
index 081a5add..110c257f 100644
--- a/plugins/jetpack/json-endpoints/jetpack/class.jetpack-json-api-plugins-install-endpoint.php
+++ b/plugins/jetpack/json-endpoints/jetpack/class.jetpack-json-api-plugins-install-endpoint.php
@@ -5,38 +5,46 @@ include_once ABSPATH . 'wp-admin/includes/file.php';
class Jetpack_JSON_API_Plugins_Install_Endpoint extends Jetpack_JSON_API_Plugins_Endpoint {
- // POST /sites/%s/plugins/%s/new
+ // POST /sites/%s/plugins/%s/install
protected $needed_capabilities = 'install_plugins';
protected $action = 'install';
- protected $download_links = array();
protected function install() {
foreach ( $this->plugins as $index => $slug ) {
- $skin = new Automatic_Upgrader_Skin();
+ $skin = new Jetpack_Automatic_Plugin_Install_Skin();
$upgrader = new Plugin_Upgrader( $skin );
+ $zip_url = self::generate_wordpress_org_plugin_download_link( $slug );
- $result = $upgrader->install( $this->download_links[ $slug ] );
+ $result = $upgrader->install( $zip_url );
if ( ! $this->bulk && is_wp_error( $result ) ) {
return $result;
}
$plugin = self::get_plugin_id_by_slug( $slug );
-
+ $error_code = 'install_error';
if ( ! $plugin ) {
$error = $this->log[ $slug ]['error'] = __( 'There was an error installing your plugin', 'jetpack' );
}
if ( ! $this->bulk && ! $result ) {
- $error = $this->log[ $slug ]['error'] = __( 'An unknown error occurred during installation', 'jetpack' );
+ $error_code = $upgrader->skin->get_main_error_code();
+ $message = $upgrader->skin->get_main_error_message();
+ $error = $this->log[ $slug ]['error'] = $message ? $message : __( 'An unknown error occurred during installation' , 'jetpack' );
}
$this->log[ $plugin ][] = $upgrader->skin->get_upgrade_messages();
}
if ( ! $this->bulk && isset( $error ) ) {
- return new WP_Error( 'install_error', $this->log[ $slug ]['error'], 400 );
+
+ if ( 'download_failed' === $error_code ) {
+ // For backwards compatibility: versions prior to 3.9 would return no_package instead of download_failed.
+ $error_code = 'no_package';
+ }
+
+ return new WP_Error( $error_code, $this->log[ $slug ]['error'], 400 );
}
// replace the slug with the actual plugin id
@@ -50,34 +58,141 @@ class Jetpack_JSON_API_Plugins_Install_Endpoint extends Jetpack_JSON_API_Plugins
return new WP_Error( 'missing_plugins', __( 'No plugins found.', 'jetpack' ) );
}
foreach( $this->plugins as $index => $slug ) {
-
// make sure it is not already installed
if ( self::get_plugin_id_by_slug( $slug ) ) {
return new WP_Error( 'plugin_already_installed', __( 'The plugin is already installed', 'jetpack' ) );
}
- $response = wp_remote_get( "http://api.wordpress.org/plugins/info/1.0/$slug" );
- $plugin_data = unserialize( $response['body'] );
- if ( is_wp_error( $plugin_data ) ) {
- return $plugin_data;
- }
-
- $this->download_links[ $slug ] = $plugin_data->download_link;
-
}
return true;
}
+ protected static function generate_wordpress_org_plugin_download_link( $plugin_slug ) {
+ return "https://downloads.wordpress.org/plugin/{$plugin_slug}.latest-stable.zip";
+ }
+
protected static function get_plugin_id_by_slug( $slug ) {
$plugins = get_plugins();
- if( ! is_array( $plugins ) ) {
+ if ( ! is_array( $plugins ) ) {
return false;
}
- foreach( $plugins as $id => $plugin_data ) {
- if( strpos( $id, $slug ) !== false ) {
- return $id;
+ foreach( $plugins as $plugin_file => $plugin_data ) {
+ if ( self::get_slug_from_file_path( $plugin_file ) === $slug ) {
+ return $plugin_file;
}
}
return false;
}
+
+ protected static function get_slug_from_file_path( $plugin_file ) {
+ // Simular to get_plugin_slug() method.
+ $slug = dirname( $plugin_file );
+ if ( '.' === $slug ) {
+ $slug = preg_replace("/(.+)\.php$/", "$1", $plugin_file );
+ }
+ return $slug;
+ }
+}
+/**
+ * Allows us to capture that the site doesn't have proper file system access.
+ * In order to update the plugin.
+ */
+class Jetpack_Automatic_Plugin_Install_Skin extends Automatic_Upgrader_Skin {
+ /**
+ * Stores the last error key;
+ **/
+ protected $main_error_code = 'install_error';
+
+ /**
+ * Stores the last error message.
+ **/
+ protected $main_error_message = 'An unknown error occurred during installation';
+
+ /**
+ * Overwrites the set_upgrader to be able to tell if we e ven have the ability to write to the files.
+ *
+ * @param WP_Upgrader $upgrader
+ *
+ */
+ public function set_upgrader( &$upgrader ) {
+ parent::set_upgrader( $upgrader );
+
+ // Check if we even have permission to.
+ $result = $upgrader->fs_connect( array( WP_CONTENT_DIR, WP_PLUGIN_DIR ) );
+ if ( ! $result ) {
+ // set the string here since they are not available just yet
+ $upgrader->generic_strings();
+ $this->feedback( 'fs_unavailable' );
+ }
+ }
+
+ /**
+ * Overwrites the error function
+ */
+ public function error( $error ) {
+ if ( is_wp_error( $error ) ) {
+ $this->feedback( $error );
+ }
+ }
+
+ private function set_main_error_code( $code ) {
+ // Don't set the process_failed as code since it is not that helpful unless we don't have one already set.
+ $this->main_error_code = ( $code === 'process_failed' && $this->main_error_code ? $this->main_error_code : $code );
+ }
+
+ private function set_main_error_message( $message, $code ) {
+ // Don't set the process_failed as message since it is not that helpful unless we don't have one already set.
+ $this->main_error_message = ( $code === 'process_failed' && $this->main_error_code ? $this->main_error_code : $message );
+ }
+
+ public function get_main_error_code() {
+ return $this->main_error_code;
+ }
+
+ public function get_main_error_message() {
+ return $this->main_error_message;
+ }
+
+ /**
+ * Overwrites the feedback function
+ */
+ public function feedback( $data ) {
+
+ $current_error = null;
+ if ( is_wp_error( $data ) ) {
+ $this->set_main_error_code( $data->get_error_code() );
+ $string = $data->get_error_message();
+ } elseif ( is_array( $data ) ) {
+ return;
+ } else {
+ $string = $data;
+ }
+
+ if ( ! empty( $this->upgrader->strings[ $string ] ) ) {
+ $this->set_main_error_code( $string );
+
+ $current_error = $string;
+ $string = $this->upgrader->strings[ $string ];
+ }
+
+ if ( strpos( $string, '%' ) !== false ) {
+ $args = func_get_args();
+ $args = array_splice( $args, 1 );
+ if ( ! empty( $args ) )
+ $string = vsprintf( $string, $args );
+ }
+
+ $string = trim( $string );
+ $string = wp_kses( $string, array(
+ 'a' => array(
+ 'href' => true
+ ),
+ 'br' => true,
+ 'em' => true,
+ 'strong' => true,
+ ) );
+
+ $this->set_main_error_message( $string, $current_error );
+ $this->messages[] = $string;
+ }
}