2011-12-13 12:29:05 +01:00
< ? php
if ( IN_serendipity !== true ) {
die ( " Don't hack! " );
}
// Probe for a language include with constants. Still include defines later on, if some constants were missing
$probelang = dirname ( __FILE__ ) . '/' . $serendipity [ 'charset' ] . 'lang_' . $serendipity [ 'lang' ] . '.inc.php' ;
if ( file_exists ( $probelang )) {
include $probelang ;
}
include dirname ( __FILE__ ) . '/lang_en.inc.php' ;
class serendipity_event_autoupdate extends serendipity_event {
var $title = PLUGIN_EVENT_AUTOUPDATE_NAME ;
function introspect ( & $propbag ) {
global $serendipity ;
$propbag -> add ( 'name' , PLUGIN_EVENT_AUTOUPDATE_NAME );
$propbag -> add ( 'description' , PLUGIN_EVENT_AUTOUPDATE_DESC );
$propbag -> add ( 'stackable' , false );
2013-04-27 10:37:11 +02:00
$propbag -> add ( 'author' , 'onli, Ian' );
$propbag -> add ( 'version' , '0.5' );
2011-12-13 12:29:05 +01:00
$propbag -> add ( 'requirements' , array (
2012-08-14 20:20:52 +02:00
'serendipity' => '0.8' ,
'php' => '5.1'
2011-12-13 12:29:05 +01:00
));
$propbag -> add ( 'event_hooks' , array ( 'plugin_dashboard_updater' => true ,
'backend_sidebar_entries_event_display_update' => true ));
$propbag -> add ( 'groups' , array ( 'BACKEND_FEATURES' ));
2013-04-27 10:37:11 +02:00
$this -> dependencies = array ( 'serendipity_event_dashboard' => 'keep' );
2011-12-13 12:29:05 +01:00
}
function generate_content ( & $title ) {
$title = $this -> title ;
}
/* function introspect_config_item ( $name , & $propbag ) {
} */
2013-04-27 10:37:11 +02:00
/**
* flush progress or error messages
*/
function show_message ( $message = '' , $pname = '' , $next = '' ) {
if ( ! empty ( $pname )) {
// Total processes
$total = 3 ;
// fake processing loop
for ( $i = 1 ; $i <= $total ; $i ++ ){
// Calculate the percentation
$percent = intval ( $i / $total * 100 ) . " % " ;
// Javascript for updating the progress bar and information
echo '
< script language = " javascript " >
document . getElementById ( " progress " ) . innerHTML = " <div style= \" width:'. $percent .';background-color:#ddd; \" > </div> " ;
document . getElementById ( " information " ) . innerHTML = " '. $percent .' processed. " ;
</ script > ' ;
// Send output to browser immediately
flush ();
// Sleep one second so we can see the delay
sleep ( 1 );
}
$wait = strstr ( $pname , 'Function' ) ? ' Please wait ... Processing: ' . $next . ' ...' : '' ; // no tags allowed here
// Tell user that the process is completed
echo '<script language="javascript">document.getElementById("information").innerHTML="' . $pname . ' completed!' . $wait . '"</script>' ;
}
echo " $message\n " ;
$levels = ob_get_level ();
for ( $i = 0 ; $i < $levels ; $i ++ ) {
ob_end_flush ();
}
flush ();
}
2011-12-13 12:29:05 +01:00
2012-06-13 14:47:45 +02:00
function event_hook ( $event , & $bag , & $eventData , $addData = null ) {
2011-12-13 12:29:05 +01:00
global $serendipity ;
$hooks = & $bag -> get ( 'event_hooks' );
if ( isset ( $hooks [ $event ])) {
switch ( $event ) {
case 'plugin_dashboard_updater' :
$eventData = ' < form action = " ?serendipity[adminModule]=event_display&serendipity[adminAction]=update " method = " POST " >
< input type = " hidden " name = " serendipity[newVersion] " value = " '. $addData .' " />
< input type = " submit " value = " '.PLUGIN_EVENT_AUTOUPDATE_UPDATEBUTTON.' " />
</ form > ' ;
return true ;
break ;
case 'backend_sidebar_entries_event_display_update' :
if ( ! ( serendipity_checkPermission ( 'siteConfiguration' ) || serendipity_checkPermission ( 'blogConfiguration' ))) {
return ;
}
2013-04-27 10:37:11 +02:00
@ ini_set ( 'max_execution_time' , 210 ); // 180 + (21+9 gui happenings)
#@ini_set('memory_limit', '-1'); // extending memory_limit may be prevented by suhosin extension.
2012-08-14 20:20:52 +02:00
/*
As long scripts are not running within safe_mode they are free to change the memory_limit to whatever value they want .
Suhosin changes this fact and disallows setting the memory_limit to a value greater than the one the script started with ,
when this option is left at 0. A value greater than 0 means that Suhosin will disallows scripts setting the memory_limit
to a value above this configured hard limit . This is for example usefull if you want to run the script normaly with a limit
of 16 M but image processing scripts may raise it to 20 M .
Edit / etc / php5 / conf . d / suhosin . ini and add e . g . suhosin . memory_limit = 512 M ...
*/
2013-04-27 10:37:11 +02:00
$self_info = sprintf ( USER_SELF_INFO , htmlspecialchars ( $serendipity [ 'serendipityUser' ]), $serendipity [ 'permissionLevels' ][ $serendipity [ 'serendipityUserlevel' ]]);
$lang_char = LANG_CHARSET ;
$ad_suite = SERENDIPITY_ADMIN_SUITE ;
2013-04-27 11:17:32 +02:00
$css_upd = file_get_contents ( dirname ( __FILE__ ) . '/upgrade.min.css' );
2013-04-27 10:37:11 +02:00
$nv = htmlspecialchars ( $_REQUEST [ 'serendipity' ][ 'newVersion' ]); // reduce to POST only?
$logmsg = '' ;
echo <<< EOS
<! DOCTYPE html >
< html >
< head >
< base target = " _self " />
< title > Startpage - { $ad_suite } </ title >
< meta http - equiv = " Content-Type " content = " text/html; charset= { $lang_char } " >
< style type = " text/css " >
{ $css_upd }
</ style >
</ head >
< body id = " serendipity_admin_page " >
< header id = " top " >
< div class = " clearfix " >
< div id = " banner " >
< h1 > { $ad_suite } </ h1 >
< span class = " block_level " > { $self_info } </ span >
</ div >
< nav id = " user_menu " >
< h2 class = " visuallyhidden " > User menu </ h2 >
< ul >
< li >< a class = " icon_link " href = " serendipity_admin.php " title = " Startpage " >< span class = " icon-home " ></ span >< span class = " visuallyhidden " > Startpage </ span ></ a ></ li >
</ ul >
</ nav >
</ div >
</ header >
< div id = " main " class = " clearfix " >
< div id = " serendipity_updater " class = " clearfix " >
< header >
< h2 > Serendipity Auto - Upgrade Processor </ h2 >
<!-- Progress bar holder -->
< div id = " progress " style = " width:500px;border:1px solid #ccc; " ></ div >
<!-- Progress information -->
< div id = " information " style = " width " ></ div >
< div id = " loader " >< span ></ span >< span ></ span >< span ></ span ></ div >
</ header >
< article >
EOS ;
$this -> show_message ( '<p class="msg_notice"><span class="icon-attention-circle"></span>Download, verify, check, unzip, copy, remove temporary stuff for Serendipity Update: ' . $_REQUEST [ 'serendipity' ][ 'newVersion' ] . ' may take a little while...<br>Please don\'t get nervous and do not close this page while in progress!</p><hr>' );
$this -> show_message ( '<p class="msg_notice"><span class="icon-attention"></span>PHP max execution time set to 210 seconds</p>' );
2012-08-14 20:20:52 +02:00
$start = microtime ( true );
2013-04-27 10:37:11 +02:00
if ( false === ( $update = $this -> fetchUpdate ( $nv ))) {
$this -> close_page ( true );
}
2012-08-14 20:20:52 +02:00
usleep ( 1 );
$time = microtime ( true ) - $start ;
2013-04-27 10:37:11 +02:00
$logmsg .= $lmsg = sprintf ( " In %0.4d seconds run fcn fetchUpdate()... \n " , $time ); // print in readable format 1.2345
$this -> show_message ( '<p class="msg_run"><span class="icon-clock"></span><em>' . $lmsg . '</em></p>' , 'Function fetch update' , 'verify the update pack' );
2011-12-13 12:29:05 +01:00
if ( ! empty ( $update )) {
2012-08-14 20:20:52 +02:00
$start = microtime ( true );
2011-12-13 12:29:05 +01:00
if ( $this -> verifyUpdate ( $update , $nv )) {
2012-08-14 20:20:52 +02:00
usleep ( 1 );
$time = microtime ( true ) - $start ;
2013-04-27 10:37:11 +02:00
$logmsg .= $lmsg = sprintf ( " In %0.4d seconds run fcn verifyUpdate()... \n " , $time ); // print in readable format 1.2345
$this -> show_message ( '<p class="msg_run"><span class="icon-clock"></span><em>' . $lmsg . '</em></p>' , 'Function verify update' , 'checking write permissions' );
2012-08-14 20:20:52 +02:00
$start = microtime ( true );
2011-12-13 12:29:05 +01:00
if ( $this -> checkWritePermissions ( $update )) {
2012-08-14 20:20:52 +02:00
usleep ( 1 );
$time = microtime ( true ) - $start ;
2013-04-27 10:37:11 +02:00
$logmsg .= $lmsg = sprintf ( " In %0.4d seconds run fcn checkWritePermissions()... \n " , $time ); // print in readable format 1.2345
$this -> show_message ( '<p class="msg_run"><span class="icon-clock"></span><em>' . $lmsg . '</em></p>' , 'Function check write permissions' , 'unpacking the update' );
2012-08-14 20:20:52 +02:00
$start = microtime ( true );
2011-12-13 12:29:05 +01:00
$unpacked = $this -> unpackUpdate ( $nv );
2012-08-14 20:20:52 +02:00
usleep ( 1 );
$time = microtime ( true ) - $start ;
2013-04-27 10:37:11 +02:00
$logmsg .= $lmsg = sprintf ( " In %0.4d seconds run fcn unpackUpdate()... \n " , $time ); // print in readable format 1.2345
$this -> show_message ( '<p class="msg_run"><span class="icon-clock"></span><em>' . $lmsg . '</em></p>' , 'Function unpack update' , 'checking integrity' );
2011-12-13 12:29:05 +01:00
if ( $unpacked ) {
2012-08-14 20:20:52 +02:00
$start = microtime ( true );
2011-12-13 12:29:05 +01:00
if ( $this -> checkIntegrity ( $nv )) {
2012-08-14 20:20:52 +02:00
usleep ( 1 );
$time = microtime ( true ) - $start ;
2013-04-27 10:37:11 +02:00
$logmsg .= $lmsg = sprintf ( " In %0.4d seconds run fcn checkIntegrity()... \n " , $time ); // print in readable format 1.2345
$this -> show_message ( '<p class="msg_run"><span class="icon-clock"></span><em>' . $lmsg . '</em></p>' , 'Function check integrity' , 'finally copy update' );
2012-08-14 20:20:52 +02:00
$start = microtime ( true );
2012-06-08 14:46:31 +02:00
$copied = $this -> copyUpdate ( $nv );
2012-08-14 20:20:52 +02:00
usleep ( 1 );
$time = microtime ( true ) - $start ;
2013-04-27 10:37:11 +02:00
$logmsg .= $lmsg = sprintf ( " In %0.4d seconds run fcn copyUpdate()... \n " , $time ); // print in readable format 1.2345
$this -> show_message ( '<p class="msg_run"><span class="icon-clock"></span><em>' . $lmsg . '</em></p>' , 'Function copy update' , 'cleaning up temporary directory' );
2012-06-08 14:46:31 +02:00
if ( $copied ) {
2012-08-14 20:20:52 +02:00
$start = microtime ( true );
2013-04-27 10:37:11 +02:00
if ( true === $this -> cleanTemplatesC ( $nv , true ) ) {
$this -> show_message ( '<p class="msg_success"><span class="icon-ok-circle"></span>Cleanup download temp done!</p>' );
2012-08-14 20:20:52 +02:00
}
usleep ( 1 );
$time = microtime ( true ) - $start ;
2013-04-27 10:37:11 +02:00
$logmsg .= $lmsg = sprintf ( " In %0.4d seconds run fcn cleanTemplatesC()... \n " , $time ); // print in readable format 1.2345
$this -> show_message ( '<p class="msg_run"><span class="icon-clock"></span><em>' . $lmsg . '</em></p>' , 'Function cleanup templates_c' , 'finish processing unit' );
sleep ( 2 );
echo '<script language="javascript">var el = document.getElementById("loader"); el.style.display = "none";</script>' ;
sleep ( 2 );
$this -> show_message ( '<p class="msg_notice"><span class="icon-attention-circle"></span><a href="' . $serendipity [ 'serendipityHTTPPath' ] . '">click to start Serendipity Installer here</a>!</p>' );
sleep ( 1 );
$this -> doUpdate (); //$logmsg
2012-06-08 14:46:31 +02:00
} else {
2013-04-27 10:37:11 +02:00
$this -> show_message ( '<p class="msg_error"><span class="icon-cancel-circle"></span>Copying the files for the update failed</p>' );
2012-06-08 14:46:31 +02:00
}
2011-12-13 12:29:05 +01:00
} else {
$this -> showChecksumErrors ( $nv );
echo ' < form action = " ?serendipity[adminModule]=event_display&serendipity[adminAction]=update " method = " POST " >
< input type = " hidden " name = " serendipity[newVersion] " value = " '. $nv .' " />
< input type = " submit " value = " '.PLUGIN_EVENT_AUTOUPDATE_UPDATEBUTTON.' " />
</ form > ' ;
}
} else {
2013-04-27 10:37:11 +02:00
$this -> show_message ( '<p class="msg_error"><span class="icon-cancel-circle"></span>Unpacking the update failed</p>' );
if ( true === $this -> cleanTemplatesC ( $nv , false ) ) {
$this -> show_message ( '<p class="msg_success"><span class="icon-ok-circle"></span>Cleaning up the failed unpack directory!</p>' );
}
$this -> show_message ( '<p class="msg_notice"><span class="icon-attention-circle"></span>Please reload this page by F5 to have another try upgrading your Blog successfully!</p>' );
2011-12-13 12:29:05 +01:00
}
} else {
$this -> showNotWriteable ( $update );
echo ' < form action = " ?serendipity[adminModule]=event_display&serendipity[adminAction]=update " method = " POST " >
< input type = " hidden " name = " serendipity[newVersion] " value = " '. $nv .' " />
< input type = " submit " value = " '.PLUGIN_EVENT_AUTOUPDATE_UPDATEBUTTON.' " />
</ form > ' ;
}
}
}
2013-04-27 10:37:11 +02:00
$this -> close_page ( true );
2011-12-13 12:29:05 +01:00
return true ;
break ;
default :
return false ;
}
} else {
return false ;
}
}
2012-08-14 20:20:52 +02:00
/**
* fetch the zip file from server
* @ param string version
2013-04-27 10:37:11 +02:00
* @ return mixed updatepath / bool
2012-08-14 20:20:52 +02:00
*/
2011-12-13 12:29:05 +01:00
function fetchUpdate ( $version ) {
global $serendipity ;
2013-04-27 10:37:11 +02:00
2012-08-14 20:20:52 +02:00
$url = ( string ) " http://prdownloads.sourceforge.net/php-blog/serendipity- $version .zip?download " ;
$update = ( string ) $serendipity [ 'serendipityPath' ] . 'templates_c/' . " serendipity- $version .zip " ;
2013-04-27 10:37:11 +02:00
2012-08-14 20:20:52 +02:00
// do we already have it?
$done = ! file_exists ( $update ) ? @ copy ( $url , $update ) : true ;
2013-04-27 10:37:11 +02:00
2011-12-13 12:29:05 +01:00
if ( ! $done ) {
//try it again with curl if copy was forbidden
if ( function_exists ( 'curl_init' )) {
2012-08-14 20:20:52 +02:00
$out = @ fopen ( $file , 'wb' );
$ch = @ curl_init ();
2013-04-27 10:37:11 +02:00
2012-08-14 20:20:52 +02:00
@ curl_setopt ( $ch , CURLOPT_FILE , $out );
@ curl_setopt ( $ch , CURLOPT_HEADER , 0 );
@ curl_setopt ( $ch , CURLOPT_URL , $update );
2011-12-13 12:29:05 +01:00
2012-08-14 20:20:52 +02:00
$success = @ curl_exec ( $ch );
if ( ! $success ) {
2013-04-27 10:37:11 +02:00
$this -> show_message ( '<p class="msg_error"><span class="icon-cancel-circle"></span>Downloading update failed</p>' );
return false ;
2011-12-13 12:29:05 +01:00
}
}
}
2013-04-27 10:37:11 +02:00
$this -> show_message ( '<p class="msg_success"><span class="icon-ok-circle"></span>Fetch download to templates_c done</p>' );
2011-12-13 12:29:05 +01:00
return $update ;
}
2012-08-14 20:20:52 +02:00
/**
* compare the md5 of downloaded archive with the md5 posted on the downloadpage
* @ param string updatePath
* @ param string version
* @ return boolean
*/
2011-12-13 12:29:05 +01:00
function verifyUpdate ( $update , $version ) {
2013-04-27 10:37:11 +02:00
$url = ( string ) " http://prdownloads.sourceforge.net/php-blog/serendipity- $version .zip?download " ;
$updatePage = ( string ) $this -> getPage ( " http://www.s9y.org/12.html " );
2011-12-13 12:29:05 +01:00
$downloadLink = substr ( $updatePage , strpos ( $updatePage , $url ), 200 );
2013-04-27 10:37:11 +02:00
$found = array ();
2012-08-14 20:20:52 +02:00
// grep the checksum
2011-12-13 12:29:05 +01:00
preg_match ( " / \ (MD5: (.*) \ )/ " , $downloadLink , $found );
$checksum = $found [ 1 ];
$check = md5_file ( $update );
if ( $check == $checksum ) {
return true ;
} else {
2013-04-27 10:37:11 +02:00
$this -> show_message ( '<p class="msg_error"><span class="icon-cancel-circle"></span>Error. Could not verify the update.</p>' );
2011-12-13 12:29:05 +01:00
return false ;
}
}
2012-08-14 20:20:52 +02:00
/**
* get file content of updatePage
* @ param string url
* @ return page content
*/
2011-12-13 12:29:05 +01:00
function getPage ( $url ) {
$page = file_get_contents ( $url );
2012-08-14 20:20:52 +02:00
if ( empty ( $page ) ) {
2011-12-13 12:29:05 +01:00
//try it again with curl if fopen was forbidden
if ( function_exists ( 'curl_init' )) {
$ch = curl_init ( $url );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 );
curl_setopt ( $ch , CURLOPT_TIMEOUT , " 20 " );
$page = curl_exec ( $ch );
curl_close ( $ch );
}
}
return $page ;
}
2012-08-14 20:20:52 +02:00
/**
* unpack the update to templates_c
* @ param string version
* @ return boolean
*/
2011-12-13 12:29:05 +01:00
function unpackUpdate ( $version ) {
global $serendipity ;
2013-04-27 10:37:11 +02:00
2012-08-14 20:20:52 +02:00
$update = ( string ) $serendipity [ 'serendipityPath' ] . 'templates_c/' . " serendipity- $version .zip " ;
$updateDir = ( string ) $serendipity [ 'serendipityPath' ] . 'templates_c/' . " serendipity- $version / " ;
2013-04-27 10:37:11 +02:00
2012-08-14 20:20:52 +02:00
// do we already have it?
2013-04-27 10:37:11 +02:00
if ( is_dir ( $updateDir ) && is_file ( $updateDir . '/serendipity/README.markdown' ) && is_file ( $updateDir . '/serendipity/checksums.inc.php' )) {
2012-08-14 20:20:52 +02:00
return true ;
}
2011-12-13 12:29:05 +01:00
$zip = new ZipArchive ;
2013-04-27 10:37:11 +02:00
2011-12-13 12:29:05 +01:00
if ( $zip -> open ( $update ) === true ) {
2012-08-14 20:20:52 +02:00
// 1.get all filenames apart from the root 'serendipity'
2011-12-13 12:29:05 +01:00
$i = 1 ;
$files = array ();
$name = $zip -> getNameIndex ( $i );
while ( ! empty ( $name )) {
$files [] = $name ;
$name = $zip -> getNameIndex ( $i );
$i += 1 ;
}
2012-08-14 20:20:52 +02:00
// 2.extraxt all files to temp
2011-12-13 12:29:05 +01:00
$zip -> extractTo ( $updateDir );
2013-04-27 10:37:11 +02:00
$this -> show_message ( '<p class="msg_success"><span class="icon-ok-circle"></span>Extracting the zip in templates_c done</p>' );
2011-12-13 12:29:05 +01:00
$zip -> close ();
} else {
return false ;
}
return true ;
}
2012-08-14 20:20:52 +02:00
/**
* copy the update from templates_c over the existing files
* @ param string version
* @ return boolean
*/
2011-12-13 12:29:05 +01:00
function copyUpdate ( $version ) {
global $serendipity ;
2013-04-27 10:37:11 +02:00
2012-08-14 20:20:52 +02:00
$update = ( string ) $serendipity [ 'serendipityPath' ] . 'templates_c/' . " serendipity- $version .zip " ;
$updateDir = ( string ) $serendipity [ 'serendipityPath' ] . 'templates_c/' . " serendipity- $version / " ;
2013-04-27 10:37:11 +02:00
2011-12-13 12:29:05 +01:00
$zip = new ZipArchive ;
2013-04-27 10:37:11 +02:00
2011-12-13 12:29:05 +01:00
if ( $zip -> open ( $update ) === true ) {
2012-08-14 20:20:52 +02:00
// 1.get all filenames apart from the root 'serendipity'
2011-12-13 12:29:05 +01:00
$i = 1 ;
$files = array ();
$name = $zip -> getNameIndex ( $i );
2012-08-14 20:20:52 +02:00
while ( ! empty ( $name ) ) {
2011-12-13 12:29:05 +01:00
$files [] = $name ;
$name = $zip -> getNameIndex ( $i );
$i += 1 ;
}
$zip -> close ();
2012-08-14 20:20:52 +02:00
// 2. copy them over
2011-12-13 12:29:05 +01:00
foreach ( $files as $file ) {
$target = $serendipity [ 'serendipityPath' ] . substr ( $file , 12 );
2012-06-08 14:46:31 +02:00
if ( is_dir ( $updateDir . $file )) {
if ( ! file_exists ( $target )) {
$success = mkdir ( $target );
} else {
$success = true ;
}
} else {
2012-08-14 20:20:52 +02:00
$success = @ copy ( $updateDir . $file , $target );
2012-06-08 14:46:31 +02:00
}
2012-08-14 20:20:52 +02:00
if ( ! $success ) {
2013-04-27 10:37:11 +02:00
$this -> show_message ( '<p class="msg_error"><span class="icon-cancel-circle"></span>Error copying file to ' . $target . '</p>' );
2011-12-13 12:29:05 +01:00
return false ;
}
}
} else {
return false ;
}
return true ;
}
2012-08-14 20:20:52 +02:00
/**
* check write permissions
* @ param string updatePath
* @ return boolean
*/
2011-12-13 12:29:05 +01:00
function checkWritePermissions ( $update ) {
global $serendipity ;
2013-04-27 10:37:11 +02:00
2011-12-13 12:29:05 +01:00
$zip = new ZipArchive ;
2013-04-27 10:37:11 +02:00
2011-12-13 12:29:05 +01:00
if ( $zip -> open ( $update ) === true ) {
$i = 0 ;
$files = array ();
$name = $zip -> getNameIndex ( $i );
while ( ! empty ( $name )) {
$files [] = $name ;
$name = $zip -> getNameIndex ( $i );
$i += 1 ;
}
foreach ( $files as $file ) {
$target = $serendipity [ 'serendipityPath' ] . substr ( $file , 12 );
2012-06-08 14:46:31 +02:00
if ( ( ! is_writable ( $target )) && file_exists ( $target ) ) {
2011-12-13 12:29:05 +01:00
return false ;
}
}
}
return true ;
}
2012-08-14 20:20:52 +02:00
/**
* show not writable
* @ param string updatePath
* @ return error
*/
2011-12-13 12:29:05 +01:00
function showNotWriteable ( $update ) {
global $serendipity ;
2013-04-27 10:37:11 +02:00
2011-12-13 12:29:05 +01:00
$zip = new ZipArchive ;
2013-04-27 10:37:11 +02:00
2011-12-13 12:29:05 +01:00
if ( $zip -> open ( $update ) === true ) {
$i = 0 ;
$files = array ();
$name = $zip -> getNameIndex ( $i );
while ( ! empty ( $name )) {
$files [] = $name ;
$name = $zip -> getNameIndex ( $i );
$i += 1 ;
}
$notWritable = array ();
foreach ( $files as $file ) {
$target = $serendipity [ 'serendipityPath' ] . substr ( $file , 12 );
2012-06-08 14:46:31 +02:00
if (( ! is_writable ( $target )) && file_exists ( $target ) ) {
2011-12-13 12:29:05 +01:00
$notWriteable [] = $target ;
}
}
}
2013-04-27 10:37:11 +02:00
ob_start ();
echo '<p class="msg_error"><span class="icon-cancel-circle"></span>Unpacking the update failed, because following files were not writeable:</p>' ;
2011-12-13 12:29:05 +01:00
echo " <ul> " ;
foreach ( $notWriteable as $file ) {
echo " <li> $file </li> " ;
}
echo " </ul> " ;
2013-04-27 10:37:11 +02:00
$write_error = ob_get_contents ();
ob_end_clean ();
$this -> show_message ( $write_error );
2011-12-13 12:29:05 +01:00
}
2012-08-14 20:20:52 +02:00
/**
* checks updates checksum file array with updates realfiles
* @ param string version
* @ return boolean
*/
2011-12-13 12:29:05 +01:00
function checkIntegrity ( $version ) {
global $serendipity ;
2013-04-27 10:37:11 +02:00
2012-08-14 20:20:52 +02:00
$updateDir = ( string ) $serendipity [ 'serendipityPath' ] . 'templates_c/' . " serendipity- $version / " ;
$checksumFile = ( string ) $updateDir . " serendipity/checksums.inc.php " ;
2013-04-27 10:37:11 +02:00
2011-12-13 12:29:05 +01:00
include_once $checksumFile ;
2013-04-27 10:37:11 +02:00
2012-08-14 20:20:52 +02:00
$checksums = $serendipity [ 'checksums_' . $version ];
2013-04-27 10:37:11 +02:00
2011-12-13 12:29:05 +01:00
foreach ( $checksums as $file => $checksum ) {
$check = serendipity_FTPChecksum ( $updateDir . " serendipity/ " . $file );
if ( $checksum != $check ) {
return false ;
}
}
return true ;
}
2012-08-14 20:20:52 +02:00
/**
* checks updates checksum file array with updates realfiles
* @ param string version
* @ return error
*/
2011-12-13 12:29:05 +01:00
function showChecksumErrors ( $version ) {
global $serendipity ;
2013-04-27 10:37:11 +02:00
2012-08-14 20:20:52 +02:00
$updateDir = ( string ) $serendipity [ 'serendipityPath' ] . 'templates_c/' . " serendipity- $version / " ;
$checksumFile = ( string ) $updateDir . " serendipity/checksums.inc.php " ;
2013-04-27 10:37:11 +02:00
2011-12-13 12:29:05 +01:00
include_once $checksumFile ;
2013-04-27 10:37:11 +02:00
2012-08-14 20:20:52 +02:00
$checksums = $serendipity [ 'checksums_' . $version ];
2013-04-27 10:37:11 +02:00
$errors = array ();
2011-12-13 12:29:05 +01:00
foreach ( $checksums as $file => $checksum ) {
$check = serendipity_FTPChecksum ( $updateDir . " serendipity/ " . $file );
if ( $checksum != $check ) {
$errors [] = $updateDir . " serendipity/ " . $file ;
}
}
2013-04-27 10:37:11 +02:00
ob_start ();
echo '<p class="msg_error"><span class="icon-cancel-circle"></span>Updating failed, because the integrity-test for the following files failed:</p>' ;
2011-12-13 12:29:05 +01:00
echo " <ul> " ;
foreach ( $errors as $file ) {
echo " <li> $file </li> " ;
}
echo " </ul> " ;
2013-04-27 10:37:11 +02:00
$integrity_error = ob_get_contents ();
ob_end_clean ();
$this -> show_message ( $integrity_error );
}
/**
* close the autoupdate progress page
* @ param bool 007 title ; - )
*/
function close_page ( $terminate = false ) {
echo <<< EOS
</ article >
</ div >
</ div >
</ body >
</ html >
EOS ;
if ( $terminate ) die ();
2011-12-13 12:29:05 +01:00
}
2012-08-14 20:20:52 +02:00
/**
2013-04-27 10:37:11 +02:00
* visit the rootpage to manually start the update installer process
2012-08-14 20:20:52 +02:00
* @ param string update messages
* @ return refresh page
*/
2013-04-27 10:37:11 +02:00
function doUpdate () {
2011-12-13 12:29:05 +01:00
global $serendipity ;
2012-08-14 20:20:52 +02:00
2013-04-27 10:37:11 +02:00
$msg = " Autoupdate successfully done! \n We now refresh to Serendipity Installer! \n " ;
$this -> show_message ( '<p class="msg_success"><span class="icon-ok-circle"></span>Autoupdate successfully done - refresh to Serendipity Installer</p>' , 'Autoupdate' );
$this -> close_page ();
// this is working for me.... is it for you?
2012-08-14 20:20:52 +02:00
if ( die ( " <script type='text/javascript'>alert(' " . mysql_real_escape_string ( $msg ) . " '); window.location = ' " . $serendipity [ 'serendipityHTTPPath' ] . " ';</script> \n " )) {
return ;
} else {
if ( ! headers_sent ()) {
if ( header ( 'Location: http://' . $_SERVER [ 'HTTP_HOST' ] . $serendipity [ 'serendipityHTTPPath' ])) exit ;
} else {
echo '<script type="text/javascript">' ;
echo ' window.location.href="' . $serendipity [ 'serendipityHTTPPath' ] . '"' ;
echo '</script>' . " \n " ;
echo '<noscript>' ;
echo ' <meta http-equiv="refresh" content="0;url=' . $serendipity [ 'serendipityHTTPPath' ] . '" />' ;
echo '</noscript>' ;
exit ;
}
}
2011-12-13 12:29:05 +01:00
}
2012-08-14 20:20:52 +02:00
/**
* empty a directory using the Standard PHP Library ( SPL ) iterator
* @ param string directory
*/
function empty_dir ( $dir ) {
$iterator = new RecursiveIteratorIterator ( new RecursiveDirectoryIterator ( $dir ), RecursiveIteratorIterator :: CHILD_FIRST );
foreach ( $iterator as $file ) {
if ( $file -> isFile ()) {
unlink ( $file -> __toString ());
} else {
2013-04-27 10:37:11 +02:00
@ rmdir ( $file -> __toString ());
2012-08-14 20:20:52 +02:00
}
}
}
/**
* delete all cache - files in cache templates_c to prevent display - errors after update
* @ param string version
* @ return boolean
*/
2013-04-27 10:37:11 +02:00
function cleanTemplatesC ( $version , $finish ) {
2012-06-08 14:46:31 +02:00
global $serendipity ;
2012-08-14 20:20:52 +02:00
$zip = ( string ) $serendipity [ 'serendipityPath' ] . 'templates_c/' . " serendipity- $version .zip " ;
$zipDir = ( string ) $serendipity [ 'serendipityPath' ] . 'templates_c/' . " serendipity- $version " ;
2013-04-27 10:37:11 +02:00
2012-08-14 20:20:52 +02:00
// leave rm zip untouched here as not causing any errors
2013-04-27 10:37:11 +02:00
#unlink($zip);// if(unlink($zip)) { else error note?
#$this->show_message('<p class="msg_success"><span class="icon-ok-circle"></span>Removing the zip file in templates_c done</p>');
2012-08-14 20:20:52 +02:00
// As trying to remove a directory that php is still using, we use open/closedir($handle) to be sure
if ( $handle = opendir ( $zipDir ) ) {
$this -> empty_dir ( $zipDir );
2013-04-27 10:37:11 +02:00
$this -> show_message ( '<p class="msg_success"><span class="icon-ok-circle"></span>Removing all files in ' . $zipDir . ' done</p>' );
2012-08-14 20:20:52 +02:00
closedir ( $handle );
}
2013-04-27 10:37:11 +02:00
if ( rmdir ( $zipDir )) {
$this -> show_message ( '<p class="msg_success"><span class="icon-ok-circle"></span>Removing the empty directory: ' . $zipDir . ' done</p>' );
} else {
$this -> show_message ( '<p class="msg_error"><span class="icon-cancel-circle"></span>Removing the empty directory: ' . $zipDir . ' failed!</p>' );
2012-08-14 20:20:52 +02:00
}
2013-04-27 10:37:11 +02:00
// We clear all compiles smarty template files in templates_c which only leaves the page we are on: /serendipity/templates/default/admin/index.tpl
if ( $finish ) {
// We have to reduce this call() = all tpl files, to clear the blogs template only, to not have the following automated recompile, force the servers memory
// to get exhausted, when using serendipity_event_gravatar plugin, which can eat up some MB...
if ( method_exists ( $serendipity [ 'smarty' ], 'clearCompiledTemplate' )) { // SMARTY 3
if ( $serendipity [ 'smarty' ] -> clearCompiledTemplate ( null , $serendipity [ 'template' ])) {
return true ;
}
}
if ( method_exists ( $serendipity [ 'smarty' ], 'clear_compiled_tpl' )) { // SMARTY 2
if ( $serendipity [ 'smarty' ] -> clear_compiled_tpl ( null , $serendipity [ 'template' ])) {
return true ;
}
2012-08-14 20:20:52 +02:00
}
2012-06-08 14:46:31 +02:00
}
}
2012-08-14 20:20:52 +02:00
/**
* debug
* @ param string msg
*/
2011-12-13 12:29:05 +01:00
function debugMsg ( $msg ) {
2012-08-14 20:20:52 +02:00
global $serendipity ;
$this -> debug_fp = @ fopen ( $serendipity [ 'serendipityPath' ] . 'templates_c/autoupdate.log' , 'a' );
if ( ! $this -> debug_fp ) {
return false ;
}
if ( empty ( $msg )) {
fwrite ( $this -> debug_fp , " failure \n " );
} else {
fwrite ( $this -> debug_fp , print_r ( $msg , true ) );
}
fclose ( $this -> debug_fp );
}
2011-12-13 12:29:05 +01:00
}
/* vim: set sts=4 ts=4 expandtab : */