timeout=0;
/* Data transfer timeout */
$http->data_timeout=0;
$http->user_agent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$http->GetRequestArguments("http://update.limesurvey.org?updaterbuild=$updaterversion",$arguments);
$updateinfo=false;
$error=$http->Open($arguments);
$error=$http->SendRequest($arguments);
$http->ReadReplyHeaders($headers);
if($error=="") {
$body=''; $full_body='';
for(;;){
$error = $http->ReadReplyBody($body,10000);
if($error != "" || strlen($body)==0) break;
$full_body .= $body;
}
$updateinfo=json_decode($full_body,true);
if ($http->response_status!='200')
{
$updateinfo['errorcode']=$http->response_status;
$updateinfo['errorhtml']=$full_body;
}
}
else
{
$updateinfo['errorcode']=$error;
$updateinfo['errorhtml']=$error;
}
unset( $http );
if ((int)$updateinfo['UpdaterRevision']<=$updaterversion)
{
return true;
}
if (!is_writable($tempdir))
{
echo "
".sprintf($clang->gT("Tempdir %s is not writable"),$tempdir)."
";
$error=true;
}
if (!is_writable($homedir.DIRECTORY_SEPARATOR.'update'.DIRECTORY_SEPARATOR.'updater.php'))
{
echo "
".sprintf($clang->gT("Updater file is not writable (%s). Please set according file permissions."),$homedir.DIRECTORY_SEPARATOR.'update'.DIRECTORY_SEPARATOR.'updater.php')."
";
$error=true;
}
// Download the zip file, unpack it and replace the updater file accordingly
// Create DB and file backups now
require_once("classes/pclzip/pclzip.lib.php");
// require_once('classes/pclzip/pcltrace.lib.php');
// require_once('classes/pclzip/pclzip-trace.lib.php');
// PclTraceOn(2);
require_once($homedir."/classes/http/http.php");
$downloaderror=false;
$http=new http_class;
// Allow redirects
$http->follow_redirect=1;
/* Connection timeout */
$http->timeout=0;
/* Data transfer timeout */
$http->data_timeout=0;
$http->user_agent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$http->GetRequestArguments("http://update.limesurvey.org/updates/downloadupdater/$updaterversion",$arguments);
$httperror=$http->Open($arguments);
$httperror=$http->SendRequest($arguments);
$http->ReadReplyHeaders($headers);
if ($headers['content-type']=='text/html')
{
@unlink($tempdir.'/updater.zip');
}
elseif($httperror=='') {
$body=''; $full_body='';
for(;;){
$httperror = $http->ReadReplyBody($body,100000);
if($httperror != "" || strlen($body)==0) break;
$full_body .= $body;
}
file_put_contents($tempdir.'/updater.zip',$full_body);
}
else
{
print( $httperror );
}
//Now unzip the new updater over the existing ones.
if (file_exists($tempdir.'/updater.zip')){
$archive = new PclZip($tempdir.'/updater.zip');
if ($archive->extract(PCLZIP_OPT_PATH, $homedir.'/update/', PCLZIP_OPT_REPLACE_NEWER)== 0) {
die("Error : ".$archive->errorInfo(true));
}
else
{
unlink($tempdir.'/updater.zip');
}
}
else
{
echo $clang->gT('There was a problem downloading the updater file. Please try to restart the update process.').' ';
$error=true;
}
}
function UpdateStep1()
{
global $clang, $scriptname, $updatekey, $subaction, $updatebuild, $homedir, $buildnumber, $tempdir, $rootdir;
if ($subaction=='keyupdate')
{
setGlobalSetting('updatekey',sanitize_paranoid_string($_POST['updatekey']));
}
$error=false;
echo '
'.$clang->gT('Welcome to the ComfortUpdate').'
';
echo $clang->gT('The LimeSurvey ComfortUpdate is an easy procedure to quickly update to the latest version of LimeSurvey.').' ';
echo $clang->gT('The following steps will be done by this update:').'
';
echo '
'.$clang->gT('Your LimeSurvey installation is checked if the update can be run successfully.').'
';
echo '
'.$clang->gT('Your DB and any changed files will be backed up.').'
';
echo '
'.$clang->gT('New files will be downloaded and installed.').'
';
echo '
'.$clang->gT('If necessary the database will be updated.').'
';
echo '
'.$clang->gT('Checking basic requirements...').'
';
if ($updatekey==''){
echo $clang->gT('You need an update key to run the comfort update. During the beta test of this update feature the key "LIMESURVEYUPDATE" can be used.');
echo " ';
}
else {
echo "
".$clang->gT('Update key: Valid')."
";
if (!is_writable($tempdir))
{
echo "
".sprintf($clang->gT("Tempdir %s is not writable"),$tempdir)."
";
$error=true;
}
if (!is_writable($rootdir.DIRECTORY_SEPARATOR.'version.php'))
{
echo "
".sprintf($clang->gT("Version file is not writable (%s). Please set according file permissions."),$rootdir.DIRECTORY_SEPARATOR.'version.php')."
'.$clang->gT('When checking your installation we found one or more problems. Please check for any error messages above and fix these before you can proceed.');
echo "";
}
else
{
echo '
'.$clang->gT('Everything looks alright. Please proceed to the next step.');
echo "";
}
echo '
';
}
function UpdateStep2()
{
global $clang, $scriptname, $homedir, $buildnumber, $updatebuild, $debug, $rootdir;
// Request the list with changed files from the server
require_once($homedir."/classes/http/http.php");
$updatekey=getGlobalSetting('updatekey');
echo '
';
$http=new http_class;
/* Connection timeout */
$http->timeout=0;
/* Data transfer timeout */
$http->data_timeout=0;
$http->user_agent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$http->GetRequestArguments("http://update.limesurvey.org/updates/update/$buildnumber/$updatebuild/$updatekey",$arguments);
$updateinfo=false;
$error=$http->Open($arguments);
$error=$http->SendRequest($arguments);
if($error=="") {
$body=''; $full_body='';
for(;;){
$error = $http->ReadReplyBody($body,10000);
if($error != "" || strlen($body)==0) break;
$full_body .= $body;
}
$updateinfo=json_decode($full_body,true);
$http->SaveCookies($site_cookies);
}
else
{
print( $error );
}
if (isset($updateinfo['error']))
{
echo $clang->gT('On requesting the update information from limesurvey.org there has been an error:').' ';
if ($updateinfo['error']==1)
{
setGlobalSetting('updatekey','');
echo $clang->gT('Your update key is invalid and was removed. ').' ';
}
else
echo $clang->gT('On requesting the update information from limesurvey.org there has been an error:').' ';
}
// okay, updateinfo now contains all necessary updateinformation
// Now check if the existing files have the mentioned checksum
$existingfiles=array();
$modifiedfiles=array();
$readonlyfiles=array();
if (!isset($updateinfo['files']))
{
echo "
".$clang->gT('Update server busy')."
".$clang->gT('The update server is currently busy. This usually happens when the update files for a new version are being prepared.')."
".$clang->gT('Please be patient and try again in about 10 minutes.')."
";
}
else
{
foreach ($updateinfo['files'] as $afile)
{
if ($afile['type']=='A' && !file_exists($rootdir.$afile['file']))
{
$searchpath=$rootdir.$afile['file'];
$is_writable=is_writable(dirname($searchpath));
while (!$is_writable && strlen($searchpath)>strlen($rootdir))
{
$searchpath=dirname($searchpath);
if (file_exists($searchpath))
{
$is_writable=is_writable($searchpath);
break;
}
}
if (!$is_writable)
{
$readonlyfiles[]=$searchpath;
}
}
elseif (file_exists($rootdir.$afile['file']) && !is_writable($rootdir.$afile['file'])) {
$readonlyfiles[]=$rootdir.$afile['file'];
}
if ($afile['type']=='A' && file_exists($rootdir.$afile['file']))
{
//A new file, check if this already exists
$existingfiles[]=$afile;
}
elseif (($afile['type']=='D' || $afile['type']=='M') && is_file($rootdir.$afile['file']) && sha1_file($rootdir.$afile['file'])!=$afile['checksum']) // A deleted or modified file - check if it is unmodified
{
$modifiedfiles[]=$afile;
}
}
echo '
';
if (count($readonlyfiles)>0)
{
echo ''.$clang->gT('Warning: The following files/directories need to be updated but their permissions are set to read-only.').' ';
echo $clang->gT('You must set according write permissions on these filese before you can proceed. If you are unsure what to do please contact your system administrator for advice.').' ';
echo '
';
$readonlyfiles=array_unique($readonlyfiles);
sort($readonlyfiles);
foreach ($readonlyfiles as $readonlyfile)
{
echo '
'.htmlspecialchars($readonlyfile).'
';
}
echo '
';
}
if (count($existingfiles)>0)
{
echo $clang->gT('The following files would be added by the update but already exist. This is very unusual and may be co-incidental.').' ';
echo $clang->gT('We recommend that these files should be replaced by the update procedure.').' ';
echo '
';
sort($existingfiles);
foreach ($existingfiles as $existingfile)
{
echo '
'.htmlspecialchars($existingfile['file']).'
';
}
echo '
';
}
if (count($modifiedfiles)>0)
{
echo $clang->gT('The following files will be modified or deleted but were already modified by someone else.').' ';
echo $clang->gT('We recommend that these files should be replaced by the update procedure.').' ';
echo '
';
sort($modifiedfiles);
foreach ($modifiedfiles as $modifiedfile)
{
echo '
'.htmlspecialchars($modifiedfile['file']).'
';
}
echo '
';
}
if (count($readonlyfiles)>0)
{
echo ' '.$clang->gT('When checking your file permissions we found one or more problems. Please check for any error messages above and fix these before you can proceed.');
echo "";
}
else
{
echo $clang->gT('Please check any problems above and then proceed to the next step.').' ';
echo "";
}
}
$_SESSION['updateinfo']=$updateinfo;
$_SESSION['updatesession']=$site_cookies;
}
function UpdateStep3()
{
global $clang, $scriptname, $homedir, $buildnumber, $updatebuild, $debug, $rootdir, $publicdir, $tempdir, $database_exists, $databasetype, $action, $demoModeOnly;
echo '
';
if (!isset( $_SESSION['updateinfo']))
{
echo $clang->gT('On requesting the update information from limesurvey.org there has been an error:').' ';
if ($updateinfo['error']==1)
{
setGlobalSetting('updatekey','');
echo $clang->gT('Your update key is invalid and was removed. ').' ';
}
else
echo $clang->gT('On requesting the update information from limesurvey.org there has been an error:').' ';
}
else
{
$updateinfo=$_SESSION['updateinfo'];
}
// okay, updateinfo now contains all necessary updateinformation
// Create DB and file backups now
$basefilename = date("YmdHis-").md5(uniqid(rand(), true));
//Now create a backup of the files to be delete or modified
$filestozip=array();
Foreach ($updateinfo['files'] as $file)
{
if (is_file($publicdir.$file['file'])===true) // Sort out directories
{
$filestozip[]=$publicdir.$file['file'];
}
}
require_once("classes/pclzip/pclzip.lib.php");
// require_once('classes/pclzip/pcltrace.lib.php');
// require_once('classes/pclzip/pclzip-trace.lib.php');
//PclTraceOn(1);
$archive = new PclZip($tempdir.DIRECTORY_SEPARATOR.'files-'.$basefilename.'.zip');
$v_list = $archive->add($filestozip, PCLZIP_OPT_REMOVE_PATH, $publicdir);
echo $clang->gT('Creating file backup... ').' ';
if ($v_list == 0) {
die("Error : ".$archive->errorInfo(true));
}
else
{
echo "".$clang->gT('File backup created:').' '.htmlspecialchars($tempdir.DIRECTORY_SEPARATOR.'files-'.$basefilename.'.zip').'
';
}
}
else
{
echo "".$clang->gT('No DB backup created:').' '.$clang->gT('Database backup functionality is currently not available for your database type. Before proceeding please backup your database using a backup tool!').'
';
}
echo $clang->gT('Please check any problems above and then proceed to the final step.');
echo "";
echo '
';
if (!isset( $_SESSION['updateinfo']))
{
echo $clang->gT('On requesting the update information from limesurvey.org there has been an error:').' ';
if ($updateinfo['error']==1)
{
setGlobalSetting('updatekey','');
echo $clang->gT('Your update key is invalid and was removed. ').' ';
}
else
echo $clang->gT('On requesting the update information from limesurvey.org there has been an error:').' ';
}
else
{
$updateinfo=$_SESSION['updateinfo'];
}
// this is the last step - Download the zip file, unpack it and replace files accordingly
// Create DB and file backups now
require_once("classes/pclzip/pclzip.lib.php");
// require_once('classes/pclzip/pcltrace.lib.php');
// require_once('classes/pclzip/pclzip-trace.lib.php');
// PclTraceOn(2);
require_once($homedir."/classes/http/http.php");
$downloaderror=false;
$http=new http_class;
// Allow redirects
$http->follow_redirect=1;
/* Connection timeout */
$http->timeout=0;
/* Data transfer timeout */
$http->data_timeout=0;
$http->user_agent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$http->GetRequestArguments("http://update.limesurvey.org/updates/download/{$updateinfo['downloadid']}",$arguments);
$http->RestoreCookies($_SESSION['updatesession']);
$error=$http->Open($arguments);
$error=$http->SendRequest($arguments);
$http->ReadReplyHeaders($headers);
if ($headers['content-type']=='text/html')
{
@unlink($tempdir.'/update.zip');
}
elseif($error=='') {
$body='';
$pFile = fopen($tempdir.'/update.zip', 'w');
for(;;){
$error = $http->ReadReplyBody($body,100000);
if($error != "" || strlen($body)==0) break;
fwrite($pFile, $body);
}
fclose($pFile);
}
else
{
print( $error );
}
// Now remove all files that are to be deleted according to update process
foreach ($updateinfo['files'] as $afile)
{
if ($afile['type']=='D' && file_exists($rootdir.$afile['file']))
{
if (is_file($rootdir.$afile['file']))
{
unlink($rootdir.$afile['file']);
}
else{
rmdirr($rootdir.$afile['file']);
}
echo sprintf($clang->gT('File deleted: %s'),$afile['file']).' ';
}
}
//Now unzip the new files over the existing ones.
if (file_exists($tempdir.'/update.zip')){
$archive = new PclZip($tempdir.'/update.zip');
if ($archive->extract(PCLZIP_OPT_PATH, $rootdir.'/', PCLZIP_OPT_REPLACE_NEWER)== 0) {
die("Error : ".$archive->errorInfo(true));
}
else
{
echo $clang->gT('New files were successfully installed.').' ';
unlink($tempdir.'/update.zip');
}
}
else
{
echo $clang->gT('There was a problem downloading the update file. Please try to restart the update process.').' ';
$downloaderror=true;
}
// PclTraceDisplay();
// Now we have to update version.php
if (!$downloaderror)
{
@ini_set('auto_detect_line_endings', true);
$versionlines=file($rootdir.'/version.php');
$handle = fopen($rootdir.'/version.php', "w");
foreach ($versionlines as $line)
{
if(strpos($line,'$buildnumber')!==false)
{
$line='$buildnumber'." = '{$_SESSION['updateinfo']['toversion']}';\r\n";
}
fwrite($handle,$line);
}
fclose($handle);
echo sprintf($clang->gT('Buildnumber was successfully updated to %s.'),$_SESSION['updateinfo']['toversion']).' ';
echo $clang->gT('Please check any problems above - update was done.').' ';
}
echo "";
echo '
';
setGlobalSetting('updatelastcheck','1980-01-01 00:00');
setGlobalSetting('updateavailable','0');
}
/**
* This functions checks if the databaseversion in the settings table is the same one as required
* If not then the necessary upgrade procedures are run
*/
function CheckForDBUpgrades()
{
global $connect, $databasetype, $dbprefix, $dbversionnumber, $clang;
$currentDBVersion=GetGlobalSetting('DBVersion');
if (floatval($dbversionnumber)>intval($currentDBVersion))
{
if(isset($_GET['continue']) && $_GET['continue']==1)
{
echo "
";
$upgradedbtype=$databasetype;
if ($upgradedbtype=='mssql_n' || $upgradedbtype=='odbc_mssql' || $upgradedbtype=='odbtp') $upgradedbtype='mssql';
if ($upgradedbtype=='mssqlnative') $upgradedbtype = 'mssqlnative';
if ($upgradedbtype=='mysqli') $upgradedbtype='mysql';
include ('upgrade-'.$upgradedbtype.'.php');
include ('upgrade-all.php');
$tables = $connect->MetaTables();
db_upgrade_all(floatval($currentDBVersion));
db_upgrade(floatval($currentDBVersion));
echo " ".sprintf($clang->gT("Database has been successfully upgraded to version %s"),$dbversionnumber);
}
else {
ShowDBUpgradeNotice();
}
}
}
function ShowDBUpgradeNotice() {
global $databasetype, $dbprefix, $databasename, $sitename, $rooturl,$clang;
$error=false;
echo "
".$clang->gT('Database upgrade').'
';
echo $clang->gT('Please verify the following information before continuing with the database upgrade:').'