2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								< ? php  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Upgrade  API :  WP_Upgrader  class 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Requires  skin  classes  and  WP_Upgrader  subclasses  for  backward  compatibility . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ package  WordPress 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ subpackage  Upgrader 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** WP_Upgrader_Skin class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-wp-upgrader-skin.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** Plugin_Upgrader_Skin class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-plugin-upgrader-skin.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** Theme_Upgrader_Skin class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-theme-upgrader-skin.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** Bulk_Upgrader_Skin class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-bulk-upgrader-skin.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** Bulk_Plugin_Upgrader_Skin class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-bulk-plugin-upgrader-skin.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** Bulk_Theme_Upgrader_Skin class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-bulk-theme-upgrader-skin.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** Plugin_Installer_Skin class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-plugin-installer-skin.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** Theme_Installer_Skin class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-theme-installer-skin.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** Language_Pack_Upgrader_Skin class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-language-pack-upgrader-skin.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** Automatic_Upgrader_Skin class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-automatic-upgrader-skin.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** WP_Ajax_Upgrader_Skin class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-wp-ajax-upgrader-skin.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Core  class  used  for  upgrading / installing  a  local  set  of  files  via 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  the  Filesystem  Abstraction  classes  from  a  Zip  file . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  WP_Upgrader  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  The  error / notification  strings  used  to  update  the  user  on  the  progress . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ var  array  $strings 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  $strings  =  array (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  The  upgrader  skin  being  used . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ var  Automatic_Upgrader_Skin | WP_Upgrader_Skin  $skin 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  $skin  =  null ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  The  result  of  the  installation . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  This  is  set  by  WP_Upgrader :: install_package (),  only  when  the  package  is  installed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  successfully .  It  will  then  be  an  array ,  unless  a  WP_Error  is  returned  by  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  { @ see  'upgrader_post_install' }  filter .  In  that  case ,  the  WP_Error  will  be  assigned  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  it . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ var  WP_Error | array  $result  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *       @ type  string  $source              The  full  path  to  the  source  the  files  were  installed  from . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *       @ type  string  $source_files        List  of  all  the  files  in  the  source  directory . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *       @ type  string  $destination         The  full  path  to  the  installation  destination  folder . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *       @ type  string  $destination_name    The  name  of  the  destination  folder ,  or  empty  if  `$destination` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                        and  `$local_destination`  are  the  same . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *       @ type  string  $local_destination   The  full  local  path  to  the  destination  folder .  This  is  usually 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                        the  same  as  `$destination` . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *       @ type  string  $remote_destination  The  full  remote  path  to  the  destination  folder 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                        ( i . e . ,  from  `$wp_filesystem` ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *       @ type  bool    $clear_destination   Whether  the  destination  folder  was  cleared . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  $result  =  array (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  The  total  number  of  updates  being  performed . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Set  by  the  bulk  update  methods . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  3.0 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ var  int  $update_count 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  $update_count  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  The  current  update  if  multiple  updates  are  being  performed . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Used  by  the  bulk  update  methods ,  and  incremented  for  each  update . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  3.0 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ var  int 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  $update_current  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Construct  the  upgrader  with  a  skin . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param  WP_Upgrader_Skin  $skin  The  upgrader  skin  to  use .  Default  is  a  WP_Upgrader_Skin . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                instance . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  function  __construct (  $skin  =  null  )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  (  null  ==  $skin  )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											$this -> skin  =  new  WP_Upgrader_Skin (); 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											$this -> skin  =  $skin ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Initialize  the  upgrader . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  This  will  set  the  relationship  between  the  skin  being  used  and  this  upgrader , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  and  also  add  the  generic  strings  to  `WP_Upgrader::$strings` . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  function  init ()  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$this -> skin -> set_upgrader (  $this  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										$this -> generic_strings (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Add  the  generic  strings  to  WP_Upgrader :: $strings . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  function  generic_strings ()  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$this -> strings [ 'bad_request' ]        =  __ (  'Invalid data provided.'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'fs_unavailable' ]     =  __ (  'Could not access filesystem.'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'fs_error' ]           =  __ (  'Filesystem error.'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'fs_no_root_dir' ]     =  __ (  'Unable to locate WordPress root directory.'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'fs_no_content_dir' ]  =  __ (  'Unable to locate WordPress content directory (wp-content).'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'fs_no_plugins_dir' ]  =  __ (  'Unable to locate WordPress plugin directory.'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'fs_no_themes_dir' ]   =  __ (  'Unable to locate WordPress theme directory.'  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										/* translators: %s: directory name */ 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$this -> strings [ 'fs_no_folder' ]  =  __ (  'Unable to locate needed folder (%s).'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'download_failed' ]       =  __ (  'Download failed.'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'installing_package' ]    =  __ (  'Installing the latest version…'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'no_files' ]              =  __ (  'The package contains no files.'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'folder_exists' ]         =  __ (  'Destination folder already exists.'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'mkdir_failed' ]          =  __ (  'Could not create directory.'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'incompatible_archive' ]  =  __ (  'The package could not be installed.'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'files_not_writable' ]    =  __ (  'The update cannot be installed because we will be unable to copy some files. This is usually due to inconsistent file permissions.'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'maintenance_start' ]  =  __ (  'Enabling Maintenance mode…'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> strings [ 'maintenance_end' ]    =  __ (  'Disabling Maintenance mode…'  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Connect  to  the  filesystem . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  @ global  WP_Filesystem_Base  $wp_filesystem  WordPress  filesystem  subclass . 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param  array  $directories                   Optional .  A  list  of  directories .  If  any  of  these  do 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                             not  exist ,  a  WP_Error  object  will  be  returned . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                             Default  empty  array . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param  bool   $allow_relaxed_file_ownership  Whether  to  allow  relaxed  file  ownership . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                             Default  false . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ return  bool | WP_Error  True  if  able  to  connect ,  false  or  a  WP_Error  otherwise . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  function  fs_connect (  $directories  =  array (),  $allow_relaxed_file_ownership  =  false  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										global  $wp_filesystem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  false  ===  (  $credentials  =  $this -> skin -> request_filesystem_credentials (  false ,  $directories [ 0 ],  $allow_relaxed_file_ownership  )  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  !  WP_Filesystem (  $credentials ,  $directories [ 0 ],  $allow_relaxed_file_ownership  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$error  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  (  is_object (  $wp_filesystem  )  &&  $wp_filesystem -> errors -> has_errors ()  )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												$error  =  $wp_filesystem -> errors ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											// Failed to connect, Error and request again
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$this -> skin -> request_filesystem_credentials (  $error ,  $directories [ 0 ],  $allow_relaxed_file_ownership  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  (  !  is_object (  $wp_filesystem  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  new  WP_Error (  'fs_unavailable' ,  $this -> strings [ 'fs_unavailable' ]  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  (  is_wp_error (  $wp_filesystem -> errors  )  &&  $wp_filesystem -> errors -> has_errors ()  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  new  WP_Error (  'fs_error' ,  $this -> strings [ 'fs_error' ],  $wp_filesystem -> errors  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										foreach  (  ( array )  $directories  as  $dir  )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											switch  (  $dir  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												case  ABSPATH : 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  (  !  $wp_filesystem -> abspath ()  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														return  new  WP_Error (  'fs_no_root_dir' ,  $this -> strings [ 'fs_no_root_dir' ]  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												case  WP_CONTENT_DIR : 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  (  !  $wp_filesystem -> wp_content_dir ()  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														return  new  WP_Error (  'fs_no_content_dir' ,  $this -> strings [ 'fs_no_content_dir' ]  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												case  WP_PLUGIN_DIR : 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  (  !  $wp_filesystem -> wp_plugins_dir ()  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														return  new  WP_Error (  'fs_no_plugins_dir' ,  $this -> strings [ 'fs_no_plugins_dir' ]  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												case  get_theme_root () : 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  (  !  $wp_filesystem -> wp_themes_dir ()  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														return  new  WP_Error (  'fs_no_themes_dir' ,  $this -> strings [ 'fs_no_themes_dir' ]  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												default : 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  (  !  $wp_filesystem -> find_folder (  $dir  )  )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
														return  new  WP_Error (  'fs_no_folder' ,  sprintf (  $this -> strings [ 'fs_no_folder' ],  esc_html (  basename (  $dir  )  )  )  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  //end fs_connect();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Download  a  package . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 08:05:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  @ param  string  $package           The  URI  of  the  package .  If  this  is  the  full  path  to  an 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                  existing  local  file ,  it  will  be  returned  untouched . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param  bool    $check_signatures  Whether  to  validate  file  signatures .  Default  false . 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									 *  @ return  string | WP_Error  The  full  path  to  the  downloaded  package  file ,  or  a  WP_Error  object . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 08:05:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									public  function  download_package (  $package ,  $check_signatures  =  false  )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Filters  whether  to  return  the  package . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ since  3.7 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ param  bool         $reply    Whether  to  bail  without  returning  the  package . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *                              Default  false . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ param  string       $package  The  package  file  name . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ param  WP_Upgrader  $this     The  WP_Upgrader  instance . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$reply  =  apply_filters (  'upgrader_pre_download' ,  false ,  $package ,  $this  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  (  false  !==  $reply  )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  $reply ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  (  !  preg_match (  '!^(http|https|ftp)://!i' ,  $package  )  &&  file_exists (  $package  )  )  {  //Local file or remote?
 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  $package ;  //must be a local file..
 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  (  empty (  $package  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  new  WP_Error (  'no_package' ,  $this -> strings [ 'no_package' ]  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$this -> skin -> feedback (  'downloading_package' ,  $package  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 08:05:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$download_file  =  download_url (  $package ,  300 ,  $check_signatures  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 08:05:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  (  is_wp_error (  $download_file  )  &&  !  $download_file -> get_error_data (  'softfail-filename'  )  )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  new  WP_Error (  'download_failed' ,  $this -> strings [ 'download_failed' ],  $download_file -> get_error_message ()  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  $download_file ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Unpack  a  compressed  package  file . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  @ global  WP_Filesystem_Base  $wp_filesystem  WordPress  filesystem  subclass . 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param  string  $package         Full  path  to  the  package  file . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param  bool    $delete_package  Optional .  Whether  to  delete  the  package  file  after  attempting 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                to  unpack  it .  Default  true . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ return  string | WP_Error  The  path  to  the  unpacked  contents ,  or  a  WP_Error  on  failure . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  function  unpack_package (  $package ,  $delete_package  =  true  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										global  $wp_filesystem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$this -> skin -> feedback (  'unpack_package'  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$upgrade_folder  =  $wp_filesystem -> wp_content_dir ()  .  'upgrade/' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//Clean up contents of upgrade directory beforehand.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$upgrade_files  =  $wp_filesystem -> dirlist (  $upgrade_folder  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  !  empty (  $upgrade_files  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											foreach  (  $upgrade_files  as  $file  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												$wp_filesystem -> delete (  $upgrade_folder  .  $file [ 'name' ],  true  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// We need a working directory - Strip off any .tmp or .zip suffixes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$working_dir  =  $upgrade_folder  .  basename (  basename (  $package ,  '.tmp'  ),  '.zip'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Clean up working directory
 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  (  $wp_filesystem -> is_dir (  $working_dir  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$wp_filesystem -> delete (  $working_dir ,  true  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Unzip package to working directory
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$result  =  unzip_file (  $package ,  $working_dir  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Once extracted, delete the package if required.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  (  $delete_package  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											unlink (  $package  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  (  is_wp_error (  $result  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$wp_filesystem -> delete (  $working_dir ,  true  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  (  'incompatible_archive'  ==  $result -> get_error_code ()  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  new  WP_Error (  'incompatible_archive' ,  $this -> strings [ 'incompatible_archive' ],  $result -> get_error_data ()  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  $result ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  $working_dir ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Flatten  the  results  of  WP_Filesystem :: dirlist ()  for  iterating  over . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  4.9 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ access  protected 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param   array   $nested_files   Array  of  files  as  returned  by  WP_Filesystem :: dirlist () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param   string  $path           Relative  path  to  prepend  to  child  nodes .  Optional . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ return  array  $files  A  flattened  array  of  the  $nested_files  specified . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									protected  function  flatten_dirlist (  $nested_files ,  $path  =  ''  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$files  =  array (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										foreach  (  $nested_files  as  $name  =>  $details  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$files [  $path  .  $name  ]  =  $details ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Append children recursively
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  (  !  empty (  $details [ 'files' ]  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												$children  =  $this -> flatten_dirlist (  $details [ 'files' ],  $path  .  $name  .  '/'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Merge keeping possible numeric keys, which array_merge() will reindex from 0..n
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												$files  =  $files  +  $children ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  $files ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Clears  the  directory  where  this  item  is  going  to  be  installed  into . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  4.3 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  @ global  WP_Filesystem_Base  $wp_filesystem  WordPress  filesystem  subclass . 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param  string  $remote_destination  The  location  on  the  remote  filesystem  to  be  cleared 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ return  bool | WP_Error  True  upon  success ,  WP_Error  on  failure . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  function  clear_destination (  $remote_destination  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										global  $wp_filesystem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$files  =  $wp_filesystem -> dirlist (  $remote_destination ,  true ,  true  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// False indicates that the $remote_destination doesn't exist.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  false  ===  $files  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Flatten the file list to iterate over
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$files  =  $this -> flatten_dirlist (  $files  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Check all files are writable before attempting to clear the destination.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$unwritable_files  =  array (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Check writability.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										foreach  (  $files  as  $filename  =>  $file_details  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  (  !  $wp_filesystem -> is_writable (  $remote_destination  .  $filename  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Attempt to alter permissions to allow writes and try again.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												$wp_filesystem -> chmod (  $remote_destination  .  $filename ,  (  'd'  ==  $file_details [ 'type' ]  ?  FS_CHMOD_DIR  :  FS_CHMOD_FILE  )  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  (  !  $wp_filesystem -> is_writable (  $remote_destination  .  $filename  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													$unwritable_files []  =  $filename ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  !  empty (  $unwritable_files  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  new  WP_Error (  'files_not_writable' ,  $this -> strings [ 'files_not_writable' ],  implode (  ', ' ,  $unwritable_files  )  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  !  $wp_filesystem -> delete (  $remote_destination ,  true  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  new  WP_Error (  'remove_old_failed' ,  $this -> strings [ 'remove_old_failed' ]  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Install  a  package . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Copies  the  contents  of  a  package  form  a  source  directory ,  and  installs  them  in 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  a  destination  directory .  Optionally  removes  the  source .  It  can  also  optionally 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  clear  out  the  destination  folder  if  it  already  exists . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  @ global  WP_Filesystem_Base  $wp_filesystem         WordPress  filesystem  subclass . 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									 *  @ global  array               $wp_theme_directories 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param  array | string  $args  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      Optional .  Array  or  string  of  arguments  for  installing  a  package .  Default  empty  array . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      @ type  string  $source                       Required  path  to  the  package  source .  Default  empty . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      @ type  string  $destination                  Required  path  to  a  folder  to  install  the  package  in . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                Default  empty . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      @ type  bool    $clear_destination            Whether  to  delete  any  files  already  in  the  destination 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                folder .  Default  false . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      @ type  bool    $clear_working                Whether  to  delete  the  files  form  the  working  directory 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                after  copying  to  the  destination .  Default  false . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      @ type  bool    $abort_if_destination_exists  Whether  to  abort  the  installation  if 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                the  destination  folder  already  exists .  Default  true . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      @ type  array   $hook_extra                   Extra  arguments  to  pass  to  the  filter  hooks  called  by 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                WP_Upgrader :: install_package () .  Default  empty  array . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ return  array | WP_Error  The  result  ( also  stored  in  `WP_Upgrader::$result` ),  or  a  WP_Error  on  failure . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  function  install_package (  $args  =  array ()  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										global  $wp_filesystem ,  $wp_theme_directories ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$defaults  =  array ( 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											'source'                       =>  '' ,  // Please always pass this
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											'destination'                  =>  '' ,  // and this
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											'clear_destination'            =>  false , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											'clear_working'                =>  false , 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											'abort_if_destination_exists'  =>  true , 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											'hook_extra'                   =>  array (), 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$args  =  wp_parse_args (  $args ,  $defaults  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// These were previously extract()'d.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$source             =  $args [ 'source' ]; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$destination        =  $args [ 'destination' ]; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										$clear_destination  =  $args [ 'clear_destination' ]; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										@ set_time_limit (  300  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  empty (  $source  )  ||  empty (  $destination  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  new  WP_Error (  'bad_request' ,  $this -> strings [ 'bad_request' ]  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> skin -> feedback (  'installing_package'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Filters  the  install  response  before  the  installation  has  started . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Returning  a  truthy  value ,  or  one  that  could  be  evaluated  as  a  WP_Error 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  will  effectively  short - circuit  the  installation ,  returning  that  value 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  instead . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ param  bool | WP_Error  $response    Response . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ param  array          $hook_extra  Extra  arguments  passed  to  hooked  filters . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$res  =  apply_filters (  'upgrader_pre_install' ,  true ,  $args [ 'hook_extra' ]  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  is_wp_error (  $res  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  $res ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//Retain the Original source and destinations
 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$remote_source      =  $args [ 'source' ]; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										$local_destination  =  $destination ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$source_files        =  array_keys (  $wp_filesystem -> dirlist (  $remote_source  )  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										$remote_destination  =  $wp_filesystem -> find_folder (  $local_destination  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//Locate which directory to copy to the new folder, This is based on the actual folder holding the files.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  1  ==  count (  $source_files  )  &&  $wp_filesystem -> is_dir (  trailingslashit (  $args [ 'source' ]  )  .  $source_files [ 0 ]  .  '/'  )  )  {  //Only one folder? Then we want its contents.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$source  =  trailingslashit (  $args [ 'source' ]  )  .  trailingslashit (  $source_files [ 0 ]  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  elseif  (  count (  $source_files  )  ==  0  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  new  WP_Error (  'incompatible_archive_empty' ,  $this -> strings [ 'incompatible_archive' ],  $this -> strings [ 'no_files' ]  );  // There are no files?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  {  // It's only a single file, the upgrader will use the folder name of this file as the destination folder. Folder name is based on zip filename.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$source  =  trailingslashit (  $args [ 'source' ]  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Filters  the  source  file  location  for  the  upgrade  package . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ since  4.4 . 0  The  $hook_extra  parameter  became  available . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ param  string       $source         File  source  location . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ param  string       $remote_source  Remote  file  source  location . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ param  WP_Upgrader  $this           WP_Upgrader  instance . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ param  array        $hook_extra     Extra  arguments  passed  to  hooked  filters . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$source  =  apply_filters (  'upgrader_source_selection' ,  $source ,  $remote_source ,  $this ,  $args [ 'hook_extra' ]  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  is_wp_error (  $source  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  $source ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Has the source location changed? If so, we need a new source_files list.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  $source  !==  $remote_source  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$source_files  =  array_keys (  $wp_filesystem -> dirlist (  $source  )  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Protection  against  deleting  files  in  any  important  base  directories . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Theme_Upgrader  &  Plugin_Upgrader  also  trigger  this ,  as  they  pass  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  destination  directory  ( WP_PLUGIN_DIR  /  wp - content / themes )  intending 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  to  copy  the  directory  into  the  directory ,  whilst  they  pass  the  source 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  as  the  actual  files  to  copy . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$protected_directories  =  array (  ABSPATH ,  WP_CONTENT_DIR ,  WP_PLUGIN_DIR ,  WP_CONTENT_DIR  .  '/themes'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  is_array (  $wp_theme_directories  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$protected_directories  =  array_merge (  $protected_directories ,  $wp_theme_directories  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  in_array (  $destination ,  $protected_directories  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$remote_destination  =  trailingslashit (  $remote_destination  )  .  trailingslashit (  basename (  $source  )  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											$destination         =  trailingslashit (  $destination  )  .  trailingslashit (  basename (  $source  )  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  $clear_destination  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// We're going to clear the destination if there's something there.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											$this -> skin -> feedback (  'remove_old'  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$removed  =  $this -> clear_destination (  $remote_destination  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  Filters  whether  the  upgrader  cleared  the  destination . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  @ param  mixed   $removed             Whether  the  destination  was  cleared .  true  on  success ,  WP_Error  on  failure 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  @ param  string  $local_destination   The  local  package  destination . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  @ param  string  $remote_destination  The  remote  package  destination . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  @ param  array   $hook_extra          Extra  arguments  passed  to  hooked  filters . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$removed  =  apply_filters (  'upgrader_clear_destination' ,  $removed ,  $local_destination ,  $remote_destination ,  $args [ 'hook_extra' ]  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  (  is_wp_error (  $removed  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  $removed ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  elseif  (  $args [ 'abort_if_destination_exists' ]  &&  $wp_filesystem -> exists (  $remote_destination  )  )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											//If we're not clearing the destination folder and something exists there already, Bail.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											//But first check to see if there are actually any files in the folder.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											$_files  =  $wp_filesystem -> dirlist (  $remote_destination  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  (  !  empty (  $_files  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												$wp_filesystem -> delete (  $remote_source ,  true  );  //Clear out the source files.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  new  WP_Error (  'folder_exists' ,  $this -> strings [ 'folder_exists' ],  $remote_destination  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//Create destination if needed
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  !  $wp_filesystem -> exists (  $remote_destination  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  (  !  $wp_filesystem -> mkdir (  $remote_destination ,  FS_CHMOD_DIR  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  new  WP_Error (  'mkdir_failed_destination' ,  $this -> strings [ 'mkdir_failed' ],  $remote_destination  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Copy new version of item into place.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$result  =  copy_dir (  $source ,  $remote_destination  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  is_wp_error (  $result  )  )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  (  $args [ 'clear_working' ]  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												$wp_filesystem -> delete (  $remote_source ,  true  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  $result ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//Clear the Working folder?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  $args [ 'clear_working' ]  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$wp_filesystem -> delete (  $remote_source ,  true  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$destination_name  =  basename (  str_replace (  $local_destination ,  '' ,  $destination  )  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  (  '.'  ==  $destination_name  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$destination_name  =  '' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> result  =  compact (  'source' ,  'source_files' ,  'destination' ,  'destination_name' ,  'local_destination' ,  'remote_destination' ,  'clear_destination'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Filters  the  installation  response  after  the  installation  has  finished . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ param  bool   $response    Installation  response . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ param  array  $hook_extra  Extra  arguments  passed  to  hooked  filters . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ param  array  $result      Installation  result  data . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$res  =  apply_filters (  'upgrader_post_install' ,  true ,  $args [ 'hook_extra' ],  $this -> result  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  (  is_wp_error (  $res  )  )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											$this -> result  =  $res ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  $res ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//Bombard the calling function will all the info which we've just used.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  $this -> result ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Run  an  upgrade / installation . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Attempts  to  download  the  package  ( if  it  is  not  a  local  file ),  unpack  it ,  and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  install  it  in  the  destination  folder . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param  array  $options  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      Array  or  string  of  arguments  for  upgrading / installing  a  package . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      @ type  string  $package                      The  full  path  or  URI  of  the  package  to  install . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                Default  empty . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      @ type  string  $destination                  The  full  path  to  the  destination  folder . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                Default  empty . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      @ type  bool    $clear_destination            Whether  to  delete  any  files  already  in  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                destination  folder .  Default  false . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      @ type  bool    $clear_working                Whether  to  delete  the  files  form  the  working 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                directory  after  copying  to  the  destination . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                Default  false . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      @ type  bool    $abort_if_destination_exists  Whether  to  abort  the  installation  if  the  destination 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                folder  already  exists .  When  true ,  `$clear_destination` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                should  be  false .  Default  true . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      @ type  bool    $is_multi                     Whether  this  run  is  one  of  multiple  upgrade / installation 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                actions  being  performed  in  bulk .  When  true ,  the  skin 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                WP_Upgrader :: header ()  and  WP_Upgrader :: footer () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                aren ' t  called .  Default  false . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      @ type  array   $hook_extra                   Extra  arguments  to  pass  to  the  filter  hooks  called  by 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                                                WP_Upgrader :: run () . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ return  array | false | WP_error  The  result  from  self :: install_package ()  on  success ,  otherwise  a  WP_Error , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *                               or  false  if  unable  to  connect  to  the  filesystem . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  function  run (  $options  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$defaults  =  array ( 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											'package'                      =>  '' ,  // Please always pass this.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											'destination'                  =>  '' ,  // And this
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											'clear_destination'            =>  false , 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											'abort_if_destination_exists'  =>  true ,  // Abort if the Destination directory exists, Pass clear_destination as false please
 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											'clear_working'                =>  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											'is_multi'                     =>  false , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											'hook_extra'                   =>  array (),  // Pass any extra $hook_extra args here, this will be passed to any hooked filters.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$options  =  wp_parse_args (  $options ,  $defaults  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Filters  the  package  options  before  running  an  update . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  See  also  { @ see  'upgrader_process_complete' } . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ since  4.3 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  @ param  array  $options  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *      Options  used  by  the  upgrader . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *      @ type  string  $package                      Package  for  update . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *      @ type  string  $destination                  Update  location . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *      @ type  bool    $clear_destination            Clear  the  destination  resource . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *      @ type  bool    $clear_working                Clear  the  working  resource . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *      @ type  bool    $abort_if_destination_exists  Abort  if  the  Destination  directory  exists . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *      @ type  bool    $is_multi                     Whether  the  upgrader  is  running  multiple  times . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *      @ type  array   $hook_extra  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *          Extra  hook  arguments . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *          @ type  string  $action                Type  of  action .  Default  'update' . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *          @ type  string  $type                  Type  of  update  process .  Accepts  'plugin' ,  'theme' ,  or  'core' . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *          @ type  bool    $bulk                  Whether  the  update  process  is  a  bulk  update .  Default  true . 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 *          @ type  string  $plugin                Path  to  the  plugin  file  relative  to  the  plugins  directory . 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										 *          @ type  string  $theme                 The  stylesheet  or  template  name  of  the  theme . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *          @ type  string  $language_update_type  The  language  pack  update  type .  Accepts  'plugin' ,  'theme' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *                                             or  'core' . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *          @ type  object  $language_update       The  language  pack  update  offer . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *      } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$options  =  apply_filters (  'upgrader_package_options' ,  $options  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  !  $options [ 'is_multi' ]  )  {  // call $this->header separately if running multiple times
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$this -> skin -> header (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Connect to the Filesystem first.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$res  =  $this -> fs_connect (  array (  WP_CONTENT_DIR ,  $options [ 'destination' ]  )  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Mainly for non-connected filesystem.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  !  $res  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  (  !  $options [ 'is_multi' ]  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												$this -> skin -> footer (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> skin -> before (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  (  is_wp_error (  $res  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$this -> skin -> error (  $res  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											$this -> skin -> after (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  (  !  $options [ 'is_multi' ]  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												$this -> skin -> footer (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  $res ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Download  the  package  ( Note ,  This  just  returns  the  filename 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  of  the  file  if  the  package  is  a  local  file ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-08 08:05:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$download  =  $this -> download_package (  $options [ 'package' ],  true  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Allow for signature soft-fail.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// WARNING: This may be removed in the future.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  is_wp_error (  $download  )  &&  $download -> get_error_data (  'softfail-filename'  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Don't output the 'no signature could be found' failure message for now.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  (  'signature_verification_no_signature'  !=  $download -> get_error_code ()  ||  WP_DEBUG  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Outout the failure error as a normal feedback, and not as an error:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												$this -> skin -> feedback (  $download -> get_error_message ()  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// Report this failure back to WordPress.org for debugging purposes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												wp_version_check ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													array ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														'signature_failure_code'  =>  $download -> get_error_code (), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														'signature_failure_data'  =>  $download -> get_error_data (), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Pretend this error didn't happen.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$download  =  $download -> get_error_data (  'softfail-filename'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  (  is_wp_error (  $download  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$this -> skin -> error (  $download  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											$this -> skin -> after (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  (  !  $options [ 'is_multi' ]  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												$this -> skin -> footer (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  $download ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$delete_package  =  (  $download  !=  $options [ 'package' ]  );  // Do not delete a "local" file
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Unzips the file into a temporary directory.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$working_dir  =  $this -> unpack_package (  $download ,  $delete_package  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  (  is_wp_error (  $working_dir  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$this -> skin -> error (  $working_dir  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											$this -> skin -> after (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  (  !  $options [ 'is_multi' ]  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												$this -> skin -> footer (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  $working_dir ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// With the given options, this installs it to the destination directory.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										$result  =  $this -> install_package ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											array ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												'source'                       =>  $working_dir , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												'destination'                  =>  $options [ 'destination' ], 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												'clear_destination'            =>  $options [ 'clear_destination' ], 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												'abort_if_destination_exists'  =>  $options [ 'abort_if_destination_exists' ], 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												'clear_working'                =>  $options [ 'clear_working' ], 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												'hook_extra'                   =>  $options [ 'hook_extra' ], 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> skin -> set_result (  $result  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  is_wp_error (  $result  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$this -> skin -> error (  $result  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$this -> skin -> feedback (  'process_failed'  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Installation succeeded.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											$this -> skin -> feedback (  'process_success'  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$this -> skin -> after (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  !  $options [ 'is_multi' ]  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  Fires  when  the  upgrader  process  is  complete . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  See  also  { @ see  'upgrader_package_options' } . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  @ since  3.6 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  @ since  3.7 . 0  Added  to  WP_Upgrader :: run () . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  @ since  4.6 . 0  `$translations`  was  added  as  a  possible  argument  to  `$hook_extra` . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  @ param  WP_Upgrader  $this  WP_Upgrader  instance .  In  other  contexts ,  $this ,  might  be  a 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *                           Theme_Upgrader ,  Plugin_Upgrader ,  Core_Upgrade ,  or  Language_Pack_Upgrader  instance . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  @ param  array        $hook_extra  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *      Array  of  bulk  item  update  data . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *      @ type  string  $action        Type  of  action .  Default  'update' . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *      @ type  string  $type          Type  of  update  process .  Accepts  'plugin' ,  'theme' ,  'translation' ,  or  'core' . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *      @ type  bool    $bulk          Whether  the  update  process  is  a  bulk  update .  Default  true . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *      @ type  array   $plugins       Array  of  the  basename  paths  of  the  plugins '  main  files . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *      @ type  array   $themes        The  theme  slugs . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *      @ type  array   $translations  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *          Array  of  translations  update  data . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *          @ type  string  $language  The  locale  the  translation  is  for . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *          @ type  string  $type      Type  of  translation .  Accepts  'plugin' ,  'theme' ,  or  'core' . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *          @ type  string  $slug      Text  domain  the  translation  is  for .  The  slug  of  a  theme / plugin  or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *                                 'default'  for  core  translations . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *          @ type  string  $version   The  version  of  a  theme ,  plugin ,  or  core . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *      } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											do_action (  'upgrader_process_complete' ,  $this ,  $options [ 'hook_extra' ]  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$this -> skin -> footer (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  $result ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Toggle  maintenance  mode  for  the  site . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Creates / deletes  the  maintenance  file  to  enable / disable  maintenance  mode . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  2.8 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ global  WP_Filesystem_Base  $wp_filesystem  Subclass 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param  bool  $enable  True  to  enable  maintenance  mode ,  false  to  disable . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									public  function  maintenance_mode (  $enable  =  false  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										global  $wp_filesystem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$file  =  $wp_filesystem -> abspath ()  .  '.maintenance' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  $enable  )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											$this -> skin -> feedback (  'maintenance_start'  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											// Create maintenance file to signal that we are upgrading
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$maintenance_string  =  '<?php $upgrading = '  .  time ()  .  '; ?>' ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											$wp_filesystem -> delete (  $file  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$wp_filesystem -> put_contents (  $file ,  $maintenance_string ,  FS_CHMOD_FILE  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  elseif  (  !  $enable  &&  $wp_filesystem -> exists (  $file  )  )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											$this -> skin -> feedback (  'maintenance_end'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$wp_filesystem -> delete (  $file  ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  Creates  a  lock  using  WordPress  options . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  4.5 . 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param  string  $lock_name        The  name  of  this  unique  lock . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param  int     $release_timeout  Optional .  The  duration  in  seconds  to  respect  an  existing  lock . 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									 *                                 Default :  1  hour . 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  @ return  bool  False  if  a  lock  couldn ' t  be  created  or  if  the  lock  is  still  valid .  True  otherwise . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									public  static  function  create_lock (  $lock_name ,  $release_timeout  =  null  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										global  $wpdb ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  !  $release_timeout  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$release_timeout  =  HOUR_IN_SECONDS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$lock_option  =  $lock_name  .  '.lock' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Try to lock.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										$lock_result  =  $wpdb -> query (  $wpdb -> prepare (  " INSERT IGNORE INTO ` $wpdb->options ` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */ " ,  $lock_option ,  time ()  )  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  (  !  $lock_result  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											$lock_result  =  get_option (  $lock_option  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// If a lock couldn't be created, and there isn't a lock, bail.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  (  !  $lock_result  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Check to see if the lock is still valid. If it is, bail.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  (  $lock_result  >  (  time ()  -  $release_timeout  )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// There must exist an expired lock, clear it and re-gain it.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											WP_Upgrader :: release_lock (  $lock_name  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  WP_Upgrader :: create_lock (  $lock_name ,  $release_timeout  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Update the lock, as by this point we've definitely got a lock, just need to fire the actions.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										update_option (  $lock_option ,  time ()  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/** 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  Releases  an  upgrader  lock . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ since  4.5 . 0 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ see  WP_Upgrader :: create_lock () 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  @ param  string  $lock_name  The  name  of  this  unique  lock . 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									 *  @ return  bool  True  if  the  lock  was  successfully  released .  False  on  failure . 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-16 20:56:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-12 09:27:46 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									public  static  function  release_lock (  $lock_name  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  delete_option (  $lock_name  .  '.lock'  ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** Plugin_Upgrader class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-plugin-upgrader.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** Theme_Upgrader class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-theme-upgrader.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** Language_Pack_Upgrader class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-language-pack-upgrader.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** Core_Upgrader class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-core-upgrader.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** File_Upload_Upgrader class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-file-upload-upgrader.php' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/** WP_Automatic_Updater class */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								require_once  ABSPATH  .  'wp-admin/includes/class-wp-automatic-updater.php' ;