<?php use Xentral\Core\LegacyConfig\ConfigLoader; @date_default_timezone_set("Europe/Berlin"); @ini_set('default_charset', 'UTF-8'); @ini_set('display_errors', 'off'); @error_reporting(0); @ini_set("magic_quotes_runtime", 0); @ignore_user_abort(true); require_once dirname(__DIR__) . '/xentral_autoloader.php'; if (class_exists(Config::class)){ $config = new Config(); $updateHost = $config->updateHost ?: 'update.xentral.biz'; }else{ $updateHost = 'update.xentral.biz'; } define('XENTRAL_UPDATE_HOST', $updateHost); class erpAPI_Update { function __construct($app) { $this->app=$app; } function Branch() { return ''; } function Version() { return ''; } function RevisionPlain() { return ''; } function Revision() { return ''; } function Startseite() { if($this->app->User->GetID()!='') { $rand = md5(mt_rand()); header('Location: update.php?rand='.$rand); exit; } } function calledOnceAfterLogin() { } function Firmendaten($value) { $id = $this->app->DB->Select("SELECT max(id) FROM firmendaten"); if($id) { return $this->app->DB->Select("SELECT $value FROM firmendaten WHERE id = '$id' LIMIT 1"); } return ''; } /** * @param $name * * @return mixed */ public function GetKonfiguration($name) { return $this->app->DB->Select("SELECT wert FROM konfiguration WHERE name='$name' LIMIT 1"); } /** * @param string $name * @param string $value */ public function SetKonfigurationValue($name, $value) { $this->app->DB->Delete("DELETE FROM konfiguration WHERE name='$name' LIMIT 1"); $this->app->DB->Insert("INSERT INTO konfiguration (name,wert,firma,adresse) VALUES ('$name','$value',1,0)"); } /** * @param bool $active */ public function setMaintainance($active = true, $mode = 'updatedb') { $tags = json_encode('update'); if(!$active) { if($this->GetKonfiguration('update_maintenance') == '0') { return; } $this->SetKonfigurationValue('update_maintenance', 0); $this->SetKonfigurationValue('update_maintenance_mode', ''); $this->app->DB->Delete("DELETE FROM notification_message WHERE tags = '$tags'"); return; } if(true) { return;//@todo remove in 20.1 } if($this->GetKonfiguration('update_maintenance') == '1') { $this->SetKonfigurationValue('update_maintenance_time', time()); return; } $this->app->DB->Insert( "INSERT INTO notification_message (user_id, type, title, message, tags, options_json, priority, created_at) SELECT u.id, 'warning', 'laufender Updateprozess','Bitte schließen Sie Ihre Aufgaben','$tags','',1,NOW() FROM `user` AS u INNER JOIN useronline uo on u.id = uo.user_id AND uo.login = 1" ); $this->SetKonfigurationValue('update_maintenance', 1); $this->SetKonfigurationValue('update_maintenance_time', time()); } function ClearDataBeforeOutput($text) { $text = str_replace('form action=""','form action="#"',$text); $text = str_replace('NONBLOCKINGZERO','',$text); $text = str_replace("'","'",$text); return $text; } function convertToHtml($str) { if (version_compare(PHP_VERSION, '5.3.4') >= 0) { $trans_tbl = array_flip(get_html_translation_table(HTML_ENTITIES, ENT_COMPAT, 'UTF-8')); } else { $trans_tbl = array_flip(get_html_translation_table(HTML_ENTITIES, ENT_COMPAT)); if (!empty($trans_tbl)) { foreach ($trans_tbl as $key => $entry) { $trans_tbl[$key] = utf8_encode($entry); } } } // MS Word strangeness.. // smart single/ double quotes: $trans_tbl[chr(39)] = '''; $trans_tbl[chr(145)] = '\''; $trans_tbl[chr(146)] = '\''; //$trans_tbl[chr(147)] = '"'; $trans_tbl[chr(148)] = '"'; $trans_tbl[chr(142)] = 'é'; // //$trans_tbl[$this->unicode_chr(65279)] = "BENE"; //$str = str_replace("\xFF\xFE", "BENE", $str); return strtr ($str, $trans_tbl); } function superentities( $str ){ // get rid of existing entities else double-escape $str = html_entity_decode(stripslashes($str),ENT_QUOTES| ENT_HTML5,'UTF-8'); // $str = str_replace("'","'",$str); // return $str; $ar = preg_split('/(?<!^)(?!$)/u', $str ); // return array of every multi-byte character foreach ($ar as $c){ $o = ord($c); if ( (strlen($c) > 1) || /* multi-byte [unicode] */ ($o <32 || $o > 126) || /* <- control / latin weirdos -> */ ($o >33 && $o < 35) ||/* quotes + ambersand */ ($o >35 && $o < 40) ||/* quotes + ambersand */ ($o >59 && $o < 63) /* html */ ) { // convert to numeric entity //$c = @mb_encode_numericentity($c,array (0x0, 0xffff, 0, 0xffff), 'UTF-8'); $c = $this->convertToHtml($c); } if(!isset($str2))$str2 = ''; $str2 .= $c; } return $str2; } } class UpdateerpooSystem extends UpdateApplication { public $obj; public $starttime; public $endtime; public function __construct($config,$group="") { parent::__construct($config,$group); if(isset($_GET['action']) && $_GET['action'] == 'ajax' && isset($_GET['cmd']) && 'upgradedb' == $_GET['cmd']) { $className = 'erpAPI'; //$methodName = 'UpgradeDatabase'; if(file_exists(__DIR__.'/lib/class.erpapi.php')) { include_once(__DIR__.'/lib/class.erpapi.php'); } if(file_exists(__DIR__.'/lib/class.erpapi_custom.php')) { include_once(__DIR__.'/lib/class.erpapi_custom.php'); $className = 'erpAPICustom'; } //$r = new ReflectionMethod($className, $methodName); //$params = $r->getParameters(); //$anzargs = count($params); $this->erp = new $className($this); }else{ $this->erp = new erpAPI_Update($this); } } } class Md5Dateien { var $Dateien; function __construct($quellverzeichnis) { $this->getVerzeichnis($quellverzeichnis, '', 0, ''); } function getVerzeichnis($quellverzeichnis, $zielverzeichnis, $lvl, $relativ){ //echo "Verzeichnis: ".$quellverzeichnis." ".$zielverzeichnis. "\r\n"; $quelllast = $quellverzeichnis; if($quellverzeichnis[strlen($quellverzeichnis) - 1] === '/') { $quelllast = substr($quellverzeichnis, 0, strlen($quellverzeichnis) - 1); } $path_parts = pathinfo($quelllast); $quelllast = $path_parts['basename']; if(file_exists($quellverzeichnis)) { if(($quelllast !== 'importer' && $quelllast !== 'userdata') || $lvl != 1){ if ($handle = opendir($quellverzeichnis)) { while (false !== ($entry = readdir($handle))) { if($entry !== '.' && $entry !== '..' && $entry !== '.git' && $entry !== '.svn' && $entry != 'user.inc.php' && $entry != 'user_db_version.php' && $entry != 'pygen') { if(is_dir($quellverzeichnis.'/'.$entry)) { if(!($lvl == 1 && $entry === 'vorlagen' && strpos($quellverzeichnis,'www'))) { $this->getVerzeichnis($quellverzeichnis.(strrpos($quellverzeichnis,'/')!==strlen($quellverzeichnis)-1?'/':'').$entry,$zielverzeichnis .(strrpos($zielverzeichnis,'/')!==strlen($zielverzeichnis)-1?'/':'').$entry, $lvl + 1,$relativ.'/'.$entry); } } else { if(!($lvl == 0 && ($entry === 'INSTALL' || $entry === 'LICENSE_LIST' || $entry == 'LICENSE' || $entry == 'README' || $entry == 'gitlog.txt'))) { //$this->getFile($quellverzeichnis.(strrpos($quellverzeichnis,'/')!==strlen($quellverzeichnis)-1?'/':'').$entry,$zielverzeichnis .(strrpos($zielverzeichnis,'/')!==strlen($zielverzeichnis)-1?'/':'').$entry,$relativ.'/'.$entry); if(strtolower(substr($entry,-4)) === '.php') { $this->Dateien[$relativ.'/'.$entry] = md5_file($quellverzeichnis.(strrpos($quellverzeichnis,'/')!==strlen($quellverzeichnis)-1?'/':'').$entry); } } } } } @closedir($handle); } } } return true; } } class UpdateDB{ var $dbname; var $connection; function __construct($dbhost,$dbname,$dbuser,$dbpass,&$app="",$dbport=3306) { $this->app = &$app; $this->dbname=$dbname; $this->connection = mysqli_connect($dbhost, $dbuser, $dbpass, '', $dbport); mysqli_select_db($this->connection,$dbname); mysqli_query($this->connection,"SET NAMES 'utf8'"); mysqli_query($this->connection,"SET SESSION SQL_MODE := ''"); mysqli_query($this->connection,"SET CHARACTER SET 'utf8'"); mysqli_query($this->connection,'SET lc_time_names = "de_DE" '); } /** * @return string */ public function GetVersion() { if(empty($this->connection)) { return ''; } $version_string = mysqli_get_server_info($this->connection); $version_string = substr($version_string,0,3); $version_string = str_replace('.','',$version_string); if($version_string < 57) { $version = $this->Select('SELECT VERSION()'); if(strripos($version, 'maria') !== false && $version[0] === '1' && str_replace('.','', substr($version,0,4)) >= 102) { return '57'; } } return $version_string; } function Close() { mysqli_close($this->connection); } function SelectDB($database) { mysqli_select_db($database); } function Fetch_Assoc($sql) { return mysqli_fetch_assoc($sql); } function free($query = null){ // Speicher freimachen if(is_null($query))return mysqli_free_result($this->_result); return mysqli_free_result($query); } function ColumnExists($table, $column) { if($table=='' || $column=='') return false; $exists = $this->Select("SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = '{$this->dbname}' AND table_name = '$table' AND column_name = '$column'"); return $exists; } function Select($sql){ if(mysqli_query($this->connection,$sql)){ $this->results = mysqli_query($this->connection,$sql); /** * Abbrechen query mit SET beginnt */ if (substr(strtolower($sql),0,3) === 'set') { return ""; } $count = 0; $data = array(); while( $row = @mysqli_fetch_array($this->results)){ $data[$count] = $row; $count++; } @mysqli_free_result($this->results); } else return false; if(is_array($data)) { if(count($data) === 1) { return $data[0][0]; } if(count($data) < 1) { $data=''; } } else { $data=''; } return $data; } public function SelectRow($sql) { if(empty($sql) || empty($this->connection)) { return null; } $this->results = @mysqli_query($this->connection,$sql); if(!$this->results) { return null; } $count = 0; $data = null; if( $row = @mysqli_fetch_array($this->results)){ unset($ArrData); // erstelle datensatz array foreach($row as $key=>$value){ if(!is_numeric($key)) { $ArrData[$key]=$value; } } if(!empty($ArrData)){ $data = $ArrData; } $count++; } @mysqli_free_result($this->results); return $data; } function SelectArr($sql){ //if(mysqli_query($this->connection,$sql)){ if(1){ $this->results = mysqli_query($this->connection,$sql); $count = 0; $data = array(); while( $row = @mysqli_fetch_array($this->results)){ unset($ArrData); // erstelle datensatz array foreach($row as $key=>$value){ if(!is_numeric($key)) { $ArrData[$key]=$value; } } $data[$count] = $ArrData; $count++; } @mysqli_free_result($this->results); } return $data; } function Result($sql){ return mysqli_result(mysqli_query($this->connection,$sql), 0);} function GetInsertID(){ return mysqli_insert_id($this->connection);} function GetArray($sql){ $i=0; $result = mysqli_query($this->connection,$sql); while($row = mysqli_fetch_assoc($result)) { foreach ($row as $key=>$value){ $tmp[$i][$key]=$value; } $i++; } return $tmp; } function Insert($sql){ $this->LogSQL($sql,"insert"); return mysqli_query($this->connection,$sql); } function InsertWithoutLog($sql){ return mysqli_query($this->connection,$sql); } function Update($sql){$this->LogSQL($sql,"update"); return mysqli_query($this->connection,$sql); } function UpdateWithoutLog($sql){ return mysqli_query($this->connection,$sql); } function Delete($sql){$this->LogSQL($sql,"delete"); return mysqli_query($this->connection,$sql); } function LogSQL($sql,$befehl) { } function Count($sql){ if(mysqli_query($this->connection,$sql)){ return mysqli_num_rows(mysqli_query($this->connection,$sql)); } return 0; } function CheckTableExistence($table){ $result = mysqli_query($this->connection,"SELECT * FROM $table LIMIT 1"); if (!$result) { return false; } return true; } function CheckColExistence($table,$col) { if($this->CheckTableExistence($table)){ $result = mysqli_query($this->connection,"SHOW COLUMNS FROM $table"); if (!$result) { echo 'Could not run query: ' . mysqli_error(); exit; } if (mysqli_num_rows($result) > 0) { while ($row = mysqli_fetch_assoc($result)) { if($row['Field']==$col) return true; } } } return false; } function GetColArray($table) { if($this->CheckTableExistence($table)){ $result = mysqli_query($this->connection,"SHOW COLUMNS FROM $table"); if (!$result) { echo 'Could not run query: ' . mysqli_error(); exit; } if (mysqli_num_rows($result) > 0) { while ($row = mysqli_fetch_assoc($result)) { $ret[]=$row['Field']; } return $ret; } } } function GetColAssocArray($table) { if($this->CheckTableExistence($table)){ $result = mysqli_query($this->connection,"SHOW COLUMNS FROM $table"); if (!$result) { echo 'Could not run query: ' . mysqli_error(); exit; } if (mysqli_num_rows($result) > 0) { while ($row = mysqli_fetch_assoc($result)) { $ret[$row['Field']]=""; } return $ret; } } } function UpdateArr($tablename,$pk,$pkname,$ArrCols, $escape = false) { if(count($ArrCols)>0){ $zielspalten = $this->SelectArr("show columns from `$tablename`"); if($zielspalten) { foreach($zielspalten as $val)$ziel[$val['Field']] = true; } $sql = "UPDATE `$tablename` SET "; foreach($ArrCols as $key=>$value) { if($key!=$pkname && (isset($ziel[$key]) || !$zielspalten)) { $sqla[] = $key." = '".($escape?$this->real_escape_string($value):$value)."' "; } } $sql .= implode(', ',$sqla)." WHERE `$pkname`='$pk' LIMIT 1"; $this->Update($sql); if(mysqli_error($this->connection)) { foreach($ArrCols as $key=>$value){ if($key!=$pkname) { $this->Query("UPDATE `$tablename` SET `$key`='$value' WHERE `$pkname`='$pk' LIMIT 1"); } } } } } function InsertArr($tablename,$pkname,$ArrCols) { // save primary than update $this->Query("INSERT INTO `$tablename` (id) VALUES ('')"); $pk = $this->GetInsertID(); $this->UpdateArr($tablename,$pk,$pkname,$ArrCols); } /// get table content with specified cols function SelectTable($tablename,$cols){ $firstcol = true; if(count($cols)==0) $selection = '*'; else { $selection = ''; foreach($cols as $value) { if(!$firstcol) $selection .= ','; $selection .= $value; $firstcol=false; } } $sql = "SELECT $selection FROM $tablename"; return $this->SelectArr($sql); } function Query($query){ $ret = mysqli_query($this->connection,$query); if(mysqli_errno($this->connection) == 1118) { mysqli_query($this->connection, 'SET innodb_strict_mode = OFF'); $ret = mysqli_query($this->connection, $query); } return $ret; } function Fetch_Array($sql) { return mysqli_fetch_array($sql); } function MysqlCopyRow($TableName, $IDFieldName, $IDToDuplicate) { if ($TableName AND $IDFieldName AND $IDToDuplicate > 0) { $sql = "SELECT * FROM $TableName WHERE $IDFieldName = $IDToDuplicate"; $result = @mysqli_query($this->connection,$sql); if ($result) { $sql = "INSERT INTO $TableName SET "; $row = mysqli_fetch_array($result); $RowKeys = array_keys($row); $RowValues = array_values($row); $cKey = count($RowKeys); for ($i=3;$i<$cKey;$i+=2) { if ($i!=3) { $sql .= ", "; } $sql .= $RowKeys[$i] . " = '" . $RowValues[$i] . "'"; } @mysqli_query($this->connection,$sql); return $this->GetInsertID(); } } } function real_escape_string($value) { return mysqli_real_escape_string($this->connection, $value); } function affected_rows() { return mysqli_affected_rows($this->connection); } function error() { return mysqli_error($this->connection); } } class UpgradeClient { var $localmd5sums; var $erp; var $http_code; public $errormsg; function __construct($conf, $app) { $this->app = $app; $this->erp = $app->erp; $this->conf = $conf; } function Connect() { // check connection then stop } function CheckCRT() { $updateHost = XENTRAL_UPDATE_HOST; $cert = shell_exec("openssl s_client -connect {$updateHost}:443 < /dev/null 2>/dev/null | openssl x509 -in /dev/stdin"); if($cert==$this->conf['cert']."\n") { return 1; } echo "wrong\n"; exit; } function TestModul($modul) { $parameter['version']=@$this->conf['version']; $parameter['module'] = $modul; return $this->Request('settestmodul',$parameter); } function CheckVersionen($funktionen = null, $returnfirst = false) { $phpversion = PHP_VERSION; $ioncube_loader_version = ''; $this->app->Tpl->Set('PHPVERSION',$phpversion); $this->app->Tpl->Set('IONCUBEVERSION',''); if(!is_dir(dirname(__DIR__).'/download')){ if(!@mkdir(dirname(__DIR__) . '/download') && !is_dir(dirname(__DIR__) . '/download')){ $message = 'Im Hauptordner von xentral kann der Ordner "download" Verzeichnis nicht angelegt werden, Prüfen Sie die Rechte'; if($returnfirst) { return ['error'=>$message,'version'=>'']; } return $message; } } if(function_exists('ioncube_loader_version')) { $ioncube_loader_version = (String)ioncube_loader_version(); $this->app->Tpl->Set('IONCUBEVERSION',$ioncube_loader_version); } if($funktionen) { $parameter['funktionen'] = $funktionen; } $parameter['version']=@$this->conf['version']; $parameter['phpversion'] = $phpversion; $parameter['mysqlversion'] = $this->app->DB->GetVersion(); if(property_exists($this->app, 'multidb')){ $parameter['multidb'] = !empty($this->app->multidb); } $result = $this->Request('versionen',$parameter); if($result == ''){ $result = $this->Request('versionen',$parameter); } if($result == ''){ $message = 'Der Updateserver scheint nicht erreichbar zu sein Bitte prüfen Sie die Netzwerkeinstellungen'; if($returnfirst) { return ['error'=>$message,'version'=>'']; } return $message; } $ret = ''; $aktvers = ''; $masterkey1erlaubt = $ioncube_loader_version?true:false; $masterkey2erlaubt = $ioncube_loader_version?true:false; $masterkey3erlaubt = $ioncube_loader_version?true:false; $masterkey4erlaubt = $ioncube_loader_version?true:false; $isPhp72 = (float)substr($phpversion,0,3) >= 7.2; $isPhp73 = (float)substr($phpversion,0,3) >= 7.3; $php73Warning = false; $isMysql57 = $this->app->DB->GetVersion() >= 57; $allow201 = $isPhp72 && $isMysql57; if(!$allow201) { $masterkey4erlaubt = false; } if(strlen($phpversion) > 2 && $phpversion[0] == '5' && $phpversion[2] < 6) { $masterkey2erlaubt = false; $masterkey3erlaubt = false; $masterkey4erlaubt = false; } if((int)$phpversion[0] < 7) { $masterkey3erlaubt = false; $masterkey4erlaubt = false; } if($phpversion && $phpversion[0] === '8') { $masterkey1erlaubt = false; $masterkey2erlaubt = false; } if($phpversion && $phpversion[0] === '7') { $masterkey1erlaubt = false; } if(strlen($phpversion) > 2 && $phpversion[0] === '7' && $phpversion[2] !== '0') { $masterkey1erlaubt = false; $masterkey2erlaubt = false; } if(strlen($phpversion) > 2 && $phpversion[0] === '7' && $phpversion[2] === '0') { $masterkey1erlaubt = false; $masterkey3erlaubt = false; $masterkey4erlaubt = false; } if(strlen($ioncube_loader_version) > 2 && $ioncube_loader_version[0]< 5 && $ioncube_loader_version[1] === '.') { $masterkey1erlaubt = false; $masterkey2erlaubt = false; } $return = []; if(strpos($result, 'ERROR') === false) { $resulta = explode(';',$result); if($masterkey1erlaubt && $masterkey2erlaubt && $masterkey3erlaubt) //Pruefung der PHP-Version ist fehlgeschlagen => nehme aktuelle Version als Basis { $versa = explode(':',$resulta[0],2); $aktvers = $versa[0]; $revision = explode('_', $aktvers); $revision = $revision[count($revision)-1]; if(strpos($aktvers, 'masterkey1') !== false) { $aktmasterkey = 'masterkey1'; } elseif(strpos($aktvers, 'masterkey2') !== false) { $aktmasterkey = 'masterkey2'; } elseif(strpos($aktvers, 'masterkey3') !== false) { $aktmasterkey = 'masterkey3'; } elseif(strpos($aktvers, 'masterkey3') !== false) { $aktmasterkey = 'masterkey3'; } elseif(strpos($aktvers, 'masterkey4') !== false) { $aktmasterkey = 'masterkey4'; } else { $aktmasterkey = ''; } if($aktmasterkey === 'masterkey3' && $revision >= 20.2 && !$allow201) { $aktvers = ''; } elseif($aktmasterkey === 'masterkey4' && $revision >= 20.3 && !$allow201) { $aktvers = ''; } else{ if($aktmasterkey === 'masterkey1') { $masterkey2erlaubt = false; $masterkey3erlaubt = false; $masterkey4erlaubt = false; } elseif($aktmasterkey === 'masterkey2') { $masterkey1erlaubt = false; $masterkey3erlaubt = false; $masterkey4erlaubt = false; } elseif($aktmasterkey === 'masterkey3') { $masterkey1erlaubt = false; $masterkey2erlaubt = false; } elseif($aktmasterkey === 'masterkey4') { $masterkey1erlaubt = false; $masterkey2erlaubt = false; } } } foreach($resulta as $k => $v) { $versa = explode(':',$resulta[$k],2); $revision = explode('_', $versa[0]); $revision = $revision[count($revision)-1]; if($returnfirst && empty($return)){ $return['current_version'] = $versa[0]; } if(!$masterkey1erlaubt && strpos($versa[0], 'masterkey1')!== false) { unset($resulta[$k]); } elseif(!$masterkey2erlaubt && strpos($versa[0], 'masterkey2')!== false) { unset($resulta[$k]); } elseif(!$masterkey3erlaubt && strpos($versa[0], 'masterkey3')!== false) { unset($resulta[$k]); } elseif(!$masterkey4erlaubt && strpos($versa[0], 'masterkey4')!== false) { unset($resulta[$k]); } elseif($revision >= 20.2 && !$allow201 && strpos($versa[0], 'masterkey3')!== false) { unset($resulta[$k]); } elseif($revision >= 20.3 && !$allow201 && strpos($versa[0], 'masterkey4')!== false) { unset($resulta[$k]); } elseif($revision >= 21.1 && !$isPhp73 && strpos($versa[0], 'masterkey4')!== false) { $php73Warning = true; unset($resulta[$k]); } elseif($aktvers == '') { $aktvers = $versa[0]; if(strpos($aktvers, 'masterkey1') !== false) { $aktmasterkey = 'masterkey1'; } elseif(strpos($aktvers, 'masterkey2') !== false) { $aktmasterkey = 'masterkey2'; } elseif(strpos($aktvers, 'masterkey3') !== false) { $aktmasterkey = 'masterkey3'; } elseif(strpos($aktvers, 'masterkey3') !== false) { $aktmasterkey = 'masterkey3'; } elseif(strpos($aktvers, 'masterkey4') !== false) { $aktmasterkey = 'masterkey4'; } else { $aktmasterkey = ''; } } } foreach($resulta as $k => $v) { $versa = explode(':',$resulta[$k],2); if(!$aktvers) { $aktvers = $versa[0]; if(strpos($aktvers, 'masterkey1') !== false) { $aktmasterkey = 'masterkey1'; } elseif(strpos($aktvers, 'masterkey2') !== false) { $aktmasterkey = 'masterkey2'; } elseif(strpos($aktvers, 'masterkey3') !== false) { $aktmasterkey = 'masterkey3'; } elseif(strpos($aktvers, 'masterkey3') !== false) { $aktmasterkey = 'masterkey3'; } elseif(strpos($aktvers, 'masterkey4') !== false) { $aktmasterkey = 'masterkey4'; } else { $aktmasterkey = ''; } if($aktmasterkey === 'masterkey1' && !$masterkey1erlaubt) { $aktmasterkey = ''; } if($aktmasterkey === 'masterkey2' && !$masterkey2erlaubt) { $aktmasterkey = ''; } if($aktmasterkey === 'masterkey3' && !$masterkey3erlaubt) { $aktmasterkey = ''; } if($aktmasterkey === 'masterkey4' && !$masterkey4erlaubt) { $aktmasterkey = ''; } } if(strpos($versa[0],'masterkey')!== false) { if(!$ioncube_loader_version) { unset($resulta[$k]); }else{ if(strpos($versa[0],'masterkey2')!== false) { if($phpversion && $phpversion[0] == '5' && $phpversion[2] < 6) { unset($resulta[$k]); if(in_array($aktmasterkey, ['masterkey2','masterkey3','masterkey4'])) { $aktmasterkey = ''; } }else{ if(in_array($aktmasterkey, ['masterkey3','masterkey4']) && (int)$phpversion[0] < 7) { $aktmasterkey = ''; } if(in_array($aktmasterkey, ['masterkey3','masterkey4']) && ($phpversion[0] == '7' && $phpversion[2] == '0')) { $aktmasterkey = ''; } if($ioncube_loader_version[0]< 5 && $ioncube_loader_version[1] === '.') { unset($resulta[$k]); if(in_array($aktmasterkey, ['masterkey2','masterkey3','masterkey4'])) { $aktmasterkey = ""; } }elseif($phpversion && $phpversion[0] == '7' && (int)$phpversion[2] > 0) { unset($resulta[$k]); if($aktmasterkey === 'masterkey2')$aktmasterkey = ""; } } } elseif(strpos($versa[0],'masterkey1')!== false) { if($phpversion && (int)$phpversion[0] >= '7') { unset($resulta[$k]); if($aktmasterkey === 'masterkey1')$aktmasterkey = ""; } } elseif(strpos($versa[0],'masterkey3')!== false) { if($phpversion && $phpversion[0] == '5' && $phpversion[2] < 6) { unset($resulta[$k]); if(in_array($aktmasterkey, ['masterkey2','masterkey3','masterkey4'])) { $aktmasterkey = ''; } }else{ if((int)$phpversion[0] < 7) { unset($resulta[$k]); if($aktmasterkey === 'masterkey3')$aktmasterkey = ""; } if($phpversion[0] === '7' && $phpversion[2] === '0') { if(in_array($aktmasterkey, ['masterkey3','masterkey4'])) { $aktmasterkey = ''; } unset($resulta[$k]); } if($ioncube_loader_version[0]< 5 && $ioncube_loader_version[1] === '.') { unset($resulta[$k]); if(in_array($aktmasterkey, ['masterkey2','masterkey3','masterkey4'])) { $aktmasterkey = ''; } } } } elseif(strpos($versa[0],'masterkey4') !== false) { if(!$masterkey4erlaubt) { unset($resulta[$k]); } } } if(isset($resulta[$k])) { if($masterkey1erlaubt && strpos($versa[0],'masterkey1')!== false && $aktmasterkey == '') { $aktmasterkey = 'masterkey1'; } elseif($masterkey2erlaubt && strpos($versa[0],'masterkey2')!== false && $aktmasterkey == '') { $aktmasterkey = 'masterkey2'; } elseif($masterkey3erlaubt && strpos($versa[0],'masterkey3')!== false && $aktmasterkey == '') { $aktmasterkey = 'masterkey3'; } elseif($masterkey4erlaubt && strpos($versa[0],'masterkey4')!== false && $aktmasterkey == '') { $aktmasterkey = 'masterkey4'; } $nochioncubes[$versa[0]] = $k; } } } if(count($resulta) > 1) { foreach($resulta as $k => $v) { $versa = explode(':',$resulta[$k],2); if(strpos($versa[0], 'masterkey') !== false) { if(!isset($nochioncubes[$versa[0]])) { unset($resulta[$k]); } else{ $key1 = str_replace(['masterkey2','masterkey3','masterkey4',],'masterkey1', $versa[0]); $key2 = str_replace(['masterkey1','masterkey3','masterkey4',],'masterkey2', $versa[0]); $key3 = str_replace(['masterkey1','masterkey2','masterkey4',],'masterkey3', $versa[0]); $key4 = str_replace(['masterkey1','masterkey2','masterkey3',],'masterkey4', $versa[0]); switch($aktmasterkey) { case 'masterkey1': if(isset($nochioncubes[$key1]) && isset($nochioncubes[$key2])) { unset($nochioncubes[$key2]); } if(isset($nochioncubes[$key1]) && isset($nochioncubes[$key3])) { unset($nochioncubes[$key3]); } if(isset($nochioncubes[$key1]) && isset($nochioncubes[$key4])) { unset($nochioncubes[$key4]); } if(isset($nochioncubes[$key2]) && isset($nochioncubes[$key3])) { unset($nochioncubes[$key3]); } break; case 'masterkey2': if(isset($nochioncubes[$key2]) && isset($nochioncubes[$key1])) { unset($nochioncubes[$key1]); } if(isset($nochioncubes[$key2]) && isset($nochioncubes[$key3])) { unset($nochioncubes[$key3]); } if(isset($nochioncubes[$key2]) && isset($nochioncubes[$key4])) { unset($nochioncubes[$key4]); } if(isset($nochioncubes[$key1]) && isset($nochioncubes[$key3])) { unset($nochioncubes[$key3]); } break; case 'masterkey3': if(isset($nochioncubes[$key3]) && isset($nochioncubes[$key1])) { unset($nochioncubes[$key1]); } if(isset($nochioncubes[$key3]) && isset($nochioncubes[$key2])) { unset($nochioncubes[$key2]); } if(isset($nochioncubes[$key1]) && isset($nochioncubes[$key2])) { unset($nochioncubes[$key1]); } break; case 'masterkey4': if(isset($nochioncubes[$key4]) && isset($nochioncubes[$key1])) { unset($nochioncubes[$key1]); } if(isset($nochioncubes[$key4]) && isset($nochioncubes[$key2])) { unset($nochioncubes[$key2]); } if(isset($nochioncubes[$key4]) && isset($nochioncubes[$key3])) { unset($nochioncubes[$key3]); } if(isset($nochioncubes[$key1]) && isset($nochioncubes[$key2])) { unset($nochioncubes[$key1]); } break; } if(!isset($nochioncubes[$versa[0]])) { unset($resulta[$k]); } } } } } if(count($resulta) > 1) { $ret = '<select id="verssel" onchange="versel()">'; $i = 0; $isVersion211Exists = false; foreach($resulta as $resu) { $versa = explode(':',$resu,2); if($returnfirst) { $return['version'] = $versa[0]; return $return; } if($i === 0) { $this->app->Tpl->Set('AKTVERSION', $versa[0]); } $ret .= '<option value="'.$versa[0].'">'.$versa[1].'</option>'; if($versa[0] === 'ent_masterkey4_21.1') { $isVersion211Exists = true; } $i++; } $ret .= '</select>'; $ret .= '<input class="button2" type="button" value="Updaten" id="upgrade" onclick="upgrade()" />'; if($isVersion211Exists){ $ret .= '<div style="padding-top:3rem"> <b style="color:red;font-size:150%"> Um beim Versand von Versandbestätigungen (Trackingmails) an Ihre Kunden mehr Flexibilität zu bieten,<br /> kann der Versand sowohl pro Projekt als auch pro Versandart aktiviert werden.<br /> Einstellungen in einer einzelnen Versandart stechen die aus dem Projekt.<br /> Es empfiehlt sich daher, die Einstellungen gemäß der eigenen Anforderungen zu überprüfen.<br /> Für jede Versandart, für die Versandbestätigungen per E-Mail an die Kunden gesendet werden sollen,<br /> ist die Einstellung in der Versandart zu setzen.<br /> Eine genaue Erläuterung über das aktuelle Verhalten findet sich <a target="_blank" style="color:red;" href="https://community.xentral.com/hc/de/articles/360017571259-Logistikprozesse#toc-14" > hier</a> </b> </div>'; } } elseif(count($resulta) == 1) { $resu = reset($resulta); //foreach($resulta as $resu) //{ $versa = explode(':',$resu,2); if($returnfirst) { $return['version'] = $versa[0]; return $return; } $this->app->Tpl->Set('AKTVERSION', $versa[0]); $ret .= '<input type="button" class="button2" value="'.$versa[1].'" id="upgrade" onclick="upgrade()" />'; //} }else{ if($ioncube_loader_version !== '' && !$masterkey1erlaubt && !$masterkey2erlaubt && !$masterkey3erlaubt) { $message = 'Die Ioncubeversion ist zu alt'; $ret .= $message; }else{ $message = 'Ioncube nicht verfügbar'; $ret .= $message; } if($returnfirst) { return ['error' => $message, 'version' => '']; } } if($php73Warning && count($resulta) > 0) { $ret .= '<br />'.'<b style="color:red;font-size:150%"> Fehler: Ihre PHP-Version ' . $phpversion . ' ist nicht kompatibel mit xentral 21.1 (Es wird mindestens PHP 7.3 benötigt) </b>'; } } else{ $this->errormsg = substr($result, 6); if($returnfirst) { return ['error'=>$this->errormsg,'version'=>'']; } return $result; } return $ret; } function CheckMd5() { $parameter['version']=@$this->conf['version']; $parameter['withsize'] = 1; return $this->Request('md5list',$parameter); } function CopyFile($files, $maxtime = 10) { $parameter['versionname']=@$this->conf['versionname']; $startzeit = microtime(true); if(empty($files)) { return array('tocopy'=>null); } foreach($files as $k => $file) { $file = json_decode(json_encode($file),true); if(isset($file['typ'])) { switch($file['typ']) { case 'getfile': case 'getfilecustom': case 'getfilemodules': break; default: $file['typ'] = ''; break; } } else { $file['typ'] = ''; } if(!isset($file['file']) || !isset($file['md5sum']) || !$file['file'] || $file['typ'] === '') { unset($files[$k]); } else{ $parameter['file']=$file['file']; $parameter['md5sum']=$file['md5sum']; $ffile = $file['file']; $_file = dirname(__DIR__).'/download/'.$ffile; $_fileto = dirname(__DIR__).'/'.$ffile; $ffa = explode('/',$ffile); $_f = ''; $cffa = count($ffa)-1; for($i = 0; $i < $cffa; $i++) { $_f .= $ffa[$i]; if(is_file(dirname(__DIR__).'/'.$_f)) { $this->removeEmptyFile(dirname(__DIR__).'/'.$_f); } if(!is_dir(dirname(__DIR__).'/'.$_f) && !@mkdir(dirname(__DIR__).'/'.$_f) && !is_dir(dirname(__DIR__).'/'.$_f) ) { continue; } $_f .= '/'; } if(file_exists($_file)) { if(substr($file['md5sum'],0,3)=== 'DEL') { if($this->CheckVersandZahlungsweise($_file)) { @unlink($_file); } } elseif(md5_file($_file)==$file['md5sum']) { if(is_dir($_fileto) && is_file($_file)){ $this->removeEmptyFolder($_fileto); } if(@copy($_file,$_fileto)) { if(md5_file($_fileto)==$file['md5sum']){ unset($files[$k]); } } } } if(substr($file['md5sum'],0,3)=== 'DEL') { unset($files[$k]); } } if($maxtime > 0 && microtime(true) - $startzeit > $maxtime) { break; } } if(empty($files)) { return array('tocopy'=>null); } foreach($files as $k => $file) { $data[] = $file; } return array('tocopy'=>$data); } function CheckVersandZahlungsweise($datei){ if(strpos($datei, 'versandart') !== false) { $dateia = pathinfo($datei); $versandart = $dateia['filename']; if(strpos($versandart, 'versandarten_')) { $versandart = str_replace('versandarten_', '', $versandart); } if($this->app->DB->Select( "SELECT id FROM versandarten WHERE modul = '".$this->app->DB->real_escape_string($versandart)."' AND ifnull(geloescht,0) = 0 AND aktiv = 1 LIMIT 1" )) { return false; } return true; } if(strpos($datei, 'zahlungsweise') !== false) { $dateia = pathinfo($datei); $zahlungsweise = $dateia['filename']; if($this->app->DB->Select( "SELECT id FROM `zahlungsweisen` WHERE modul = '".$this->app->DB->real_escape_string($zahlungsweise)."' AND ifnull(geloescht,0) = 0 AND aktiv = 1 LIMIT 1" )) { return false; } return true; } if(strpos($datei, 'cronjobs') !== false) { $dateia = pathinfo($datei); $cronjob = $dateia['filename']; if($this->app->DB->Select( "SELECT id FROM `prozessstarter` WHERE parameter = '".$this->app->DB->real_escape_string($cronjob)."' AND aktiv = 1 LIMIT 1" )) { return false; } } return true; } function ChangeVersion() { $parameter['version']=@$this->conf['version']; $parameter['versionname']=@$this->conf['versionname']; if($parameter['versionname'] && $parameter['versionname'] != $parameter['version']) { $changeversion = $this->Request('changeversion',$parameter); } return $changeversion; } function removeEmptyFile($file) { if(is_file($file) && filesize($file) === 0) { @unlink($file); } } function removeEmptyFolder($folder) { if(empty($folder) || !is_dir($folder)){ return; } if(!($handle = opendir($folder))) { return; } while (false !== ($entry = readdir($handle))) { if($entry !== '.' && $entry !== '..') { closedir($handle); return; } } closedir($handle); rmdir($folder); } function DownloadFile($files, $maxtime = 15, $echo = false) { $startzeit = microtime(true); $parameter['version']=@$this->conf['version']; $parameter['versionname']=@$this->conf['versionname']; $parameter['version']=@$this->conf['version']; $parameter['versionname']=@$this->conf['versionname']; if($parameter['versionname'] && $parameter['versionname'] != $parameter['version']) { $changeversion = $this->Request('changeversion',$parameter); } if(empty($files)) { return array('todownload'=>null); } $countFiles = count($files); $batches = []; $batch = []; $keyToBatch = []; foreach($files as $k => $file) { $file = json_decode(json_encode($file), true); if(isset($file['typ'])){ switch ($file['typ']) { case 'getfile': case 'getfilecustom': case 'getfilemodules': break; default: $file['typ'] = ''; break; } }else{ $file['typ'] = ''; } if(!isset($file['file']) || !isset($file['md5sum']) || !$file['file'] || $file['typ'] === ''){ $files[$k]['error'] = $file['file']; unset($files[$k]); }else{ if(substr($file['md5sum'], 0, 3) === 'DEL'){ continue; } $parameter['file'] = $file['file']; $parameter['md5sum'] = $file['md5sum']; $ffile = $file['file']; $_file = dirname(__DIR__) . '/download/' . $ffile; $ffa = explode('/', $ffile); $_f = ''; for ($i = 0; $i < count($ffa) - 1; $i++) { $_f .= $ffa[$i]; if(is_file(dirname(__DIR__) . '/download/' . $_f)){ @unlink(dirname(__DIR__) . '/download/' . $_f); } if(!is_dir(dirname(__DIR__) . '/download/' . $_f) && !@mkdir(dirname(__DIR__) . '/download/' . $_f) && !is_dir(dirname(__DIR__) . '/download/' . $_f)){ continue; } $_f .= '/'; } } switch($file['typ']) { case 'getfile': $batch[] = $k; $keyToBatch[$k] = count($batches); if(count($batch) >= 10) { $batches[] = $batch; $batch = []; } break; } } if(!empty($batch)) { $batches[] = $batch; } foreach($files as $k => $file) { $file = json_decode(json_encode($file),true); if(isset($file['typ'])) { switch($file['typ']) { case 'getfile': case 'getfilecustom': case 'getfilemodules': break; default: $file['typ'] = ''; break; } } else { $file['typ'] = ''; } if(!isset($file['file']) || !isset($file['md5sum']) || !$file['file'] || $file['typ'] === '') { $files[$k]['error'] = $file['file']; unset($files[$k]); } else{ if(substr($file['md5sum'],0,3) === 'DEL') { continue; } $parameter['file']=$file['file']; $parameter['md5sum']=$file['md5sum']; $ffile = $file['file']; $_file = dirname(__DIR__).'/download/'.$ffile; $ffa = explode('/',$ffile); $_f = ''; for($i = 0; $i < count($ffa)-1; $i++) { $_f .= $ffa[$i]; if(is_file(dirname(__DIR__).'/download/'.$_f)) { @unlink(dirname(__DIR__).'/download/'.$_f); } if(!is_dir(dirname(__DIR__).'/download/'.$_f) && !@mkdir(dirname(__DIR__).'/download/'.$_f) && !is_dir(dirname(__DIR__).'/download/'.$_f)) { continue; } $_f .= '/'; } if($echo) { echo "\rDownload Files: ".($k < $countFiles?$k+1:$countFiles).' / '.$countFiles."... "; } if(isset($keyToBatch[$k]) && isset($batches[$keyToBatch[$k]])) { $batch = $batches[$keyToBatch[$k]]; if(count($batch) > 1) { $parameter2 = $parameter; $parameter2['parameters'] = []; foreach ($batch as $key2) { $file2 = $files[$key2]; $parameter2['parameters'][] = $parameter; $parameter2['parameters'][count($parameter2['parameters']) - 1]['file'] = $file2['file']; $parameter2['parameters'][count($parameter2['parameters']) - 1]['md5sum'] = $file2['md5sum']; } $result2 = explode('|', $this->Request('getfiles', $parameter2)); if(count($result2) === count($batch)) { foreach ($batch as $bachKey => $key2) { $file2 = $files[$key2]; if( @file_put_contents(dirname(__DIR__).'/download/'.$file2['file'], @base64_decode($result2[$bachKey])) ) { if(dirname(__DIR__).'/download/'.$file2['file'] === $file2['md5sum']){ unset($files[$key2]); } } } } unset($result2); } unset($batches[$keyToBatch[$k]]); } if(is_file($_file) && md5_file($_file)==$file['md5sum']) { unset($files[$k]); continue; } $result = $this->Request($file['typ'],$parameter); $output = @base64_decode($result); if(strlen($output) > 0 && is_dir($_file)) { $this->removeEmptyFolder($_file); } if(@file_put_contents($_file, $output)) { if(md5_file($_file)==$file['md5sum']) { unset($files[$k]); } else { $files[$k]['error'] = 'md5 failed'; } } else{ $files[$k]['error'] = 'file_put_contents ' .$_file. ' failed '.$file['typ'].' ' .json_encode($parameter); } } if($maxtime > 0 && microtime(true) - $startzeit > $maxtime) { break; } } if(empty($files)) { return array('todownload'=>null); } foreach($files as $k => $file) { if(substr($file['md5sum'],0,3) !== 'DEL'){ $data[] = $file; } } return array('todownload'=>$data); } /** * @return int[]|string|string[] */ public function downloadZips() { @clearstatcache(); if(!function_exists('system')) { return ['zip' => 'system not found']; } $this->app->erp->setMaintainance(true); $parameter['version']=@$this->conf['version']; $parameter['versionname']=@$this->conf['versionname']; if($parameter['versionname'] !== 'ent_masterkey4_20.3') { return ['zip' => 'not ent_masterkey4_20.3']; } $parameter['withsize'] = 1; if(!is_dir(dirname(__DIR__).'/download/')) { if(!@mkdir(dirname(__DIR__).'/download/') && !is_dir(dirname(__DIR__).'/download/')) { $this->app->erp->setMaintainance(false); return 'ERROR: Downloadverzeichnis konnte nicht erstellt werden'; } } $ret = ['zip' => 0]; foreach([ 'ent_masterkey4_20.3_4_wo_userdata.zip' => '', 'ent_masterkey4_20.3_4_vendor.zip' => '/vendor', 'ent_masterkey4_20.3_4_www.zip' => '/zip', ] as $file => $subfolder ) { $parameter['file'] = $file; if(file_put_contents( dirname(__DIR__) . '/download/' . $file, $this->Request('getversionzip', $parameter) )) { if( !is_dir(dirname(__DIR__).'/download' . $subfolder) && !@mkdir(dirname(__DIR__).'/download/' . $subfolder) && !is_dir(dirname(__DIR__).'/download/' . $subfolder) ) { continue; } system( 'cd '.dirname(__DIR__).'/download' .' && unzip '.$file.' -d ' .dirname(__DIR__).'/download'.$subfolder ); unlink(dirname(__DIR__).'/download/' . $subfolder); $ret['zip']++; } else { $ret['zip_error'][] = 'coudl not save '.$file; } } return $ret; } /** * @param bool $updatefiles * * @return array|mixed|string */ public function CheckFiles($updatefiles = false) { @clearstatcache(); $this->app->erp->setMaintainance(true); $parameter['version']=@$this->conf['version']; $parameter['versionname']=@$this->conf['versionname']; $parameter['withsize'] = 1; if(!is_dir(dirname(__DIR__).'/download/')) { if(!@mkdir(dirname(__DIR__).'/download/') && !is_dir(dirname(__DIR__).'/download/')) { $this->app->erp->setMaintainance(false); return 'ERROR: Downloadverzeichnis konnte nicht erstellt werden'; } } $tmpfile = md5(microtime(true)); if(!($fh = fopen(dirname(__DIR__).'/download/'.$tmpfile,'w'))) { $this->app->erp->setMaintainance(false); return 'ERROR: Downloadverzeichnis hat keine Schreibrechte'; } fclose($fh); $eigenguser = fileowner(dirname(__DIR__).'/download/'.$tmpfile); $eigengroup = filegroup(dirname(__DIR__).'/download/'.$tmpfile); @unlink(dirname(__DIR__).'/download/'.$tmpfile); $_result = $this->Request('md5list', $parameter); $maxRetries = 5; while(empty($_result) && $maxRetries > 0) { $maxRetries--; usleep(2000000); $_result = $this->Request('md5list', $parameter); } if(isset($this->errormsg) && $this->errormsg) { $this->app->erp->setMaintainance(false); return 'ERROR: '.$this->errormsg; } if($_result==='ERROR') { $this->app->erp->setMaintainance(false); return 'ERROR FROM SERVER (Perhaps a wrong license?)'; } $_result2 = ''; $_result3 = ''; if(!$updatefiles){ $_result2 = $this->Request('md5listmodules', $parameter); if(empty($_result2) && (!empty($this->http_code) && strpos($this->http_code,'5') === 0)){ usleep(1000000); $_result2 = $this->Request('md5listmodules', $parameter); } if($_result2 === 'ERROR'){ $this->app->erp->setMaintainance(false); return "ERROR FROM SERVER (Perhaps a wrong license?)"; } $_result3 = $this->Request('md5listcustom', $parameter); if(empty($_result3)){ usleep(2000000); $_result3 = $this->Request('md5listcustom', $parameter); } if($_result3 === 'ERROR'){ $this->app->erp->setMaintainance(false); return "ERROR FROM SERVER (Perhaps a wrong license?)"; } } $result = ''; $result2 = ''; $result3 = ''; $resulta = explode(';',$_result); $resulta2 = explode(';',$_result2); $resulta3 = explode(';',$_result3); unset($_result, $_result2, $_result3); if($resulta3) { foreach($resulta3 as $r) { if($r) { $result3.= 'getfilecustom:'.$r.';'; $ra = explode(':',$r); $dats[] = $ra[0]; } } unset($resulta3); } if($resulta2){ foreach($resulta2 as $r) { if($r) { $ra = explode(':',$r); if(!isset($dats) || !in_array($ra[0], $dats)) { $result2.= 'getfilemodules:'.$r.';'; $dats[] = $ra[0]; } } } unset($resulta2); } if($resulta) { foreach($resulta as $r) { if($r) { $ra = explode(':',$r); if(!isset($dats) || !in_array($ra[0], $dats)) { $result.= 'getfile:'.$r.';'; } } } unset($resulta); } $result .= $result2.$result3; unset($result2, $result3, $dats); //$rows = explode(";",$result); $rows = explode(';',$result); $res['result'] = $result; $res['parameter'] = $parameter; $downloadind = 0; $copyind = 0; if(count($rows)>0) { foreach($rows as $value) { unset($single_row); $single_row = explode(':',$value); if(!(count($single_row)>=3 && strlen($single_row[0])>4 && strlen($single_row[2])>3)) { continue; } $typ = $single_row[0]; $file = $single_row[1]; $file_lokal = dirname(__DIR__).'/'.($file); $md5sum = $single_row[2]; $size = isset($single_row[3])?$single_row[3]:false; $parameter['file']=$file; $parameter['md5sum']=$md5sum; if($file==='./upgradesystemclient.php') { continue; } if( (!$updatefiles && ($file==="./www/update.php" || $file==="./www/update.tpl" || $file==="./www/updatelogin.tpl" || $file === './www/jquery-update.js' || $file === './www/jquery-ui-update.js' || $file === 'jquery-ui.min.css')) || ($updatefiles && ($file!=="./www/update.php" && $file!=="./www/update.tpl" && $file!=="./www/updatelogin.tpl" && $file !== './www/jquery-update.js' && $file !== './www/jquery-ui-update.js' && $file !== 'jquery-ui.min.css')) ){ continue; } $bla[] = $file_lokal; if(is_file($file_lokal)){ if(substr($md5sum,0,3) === 'DEL'){ if($this->CheckVersandZahlungsweise($file_lokal)) { @unlink($file_lokal); } continue; } if(md5_file($file_lokal)==$md5sum){ continue; } $fileowner = fileowner($file_lokal); $filegroup = filegroup($file_lokal); $perms = fileperms($file_lokal); $o = ($perms & 0x0080); $g = ($perms & 0x0010); $a = ($perms & 0x0002); // pruefe ob datei angelegt werden kann, wenn das passt ist eh alles gut if(touch(dirname(__DIR__).'/download/chkrights') && file_exists(dirname(__DIR__).'/download/chkrights')) { @unlink(dirname(__DIR__).'/download/chkrights'); } else if($eigenguser && $eigengroup){ if($fileowner != $eigenguser){ if($filegroup != $eigengroup){ if(!$a){ return array('error'=>'ERROR Fehlende Schreibrechte in '.$file_lokal); } } else{ if(!$g) { return array('error'=>'ERROR Fehlende Schreibrechte in '.$file_lokal); } } } else { if(!$o) { return array('error'=>'ERROR Fehlende Schreibrechte in '.$file_lokal); } } } $bla[] = array( 'fileowner'=>$fileowner, 'filegroup'=>$filegroup, 'perms'=>$perms, 'o'=>$o, 'g'=>$g, 'a'=>$a, ); if(is_file(dirname(__DIR__).'/download/'.$file)){ if(md5_file(dirname(__DIR__).'/download/'.$file)!=$md5sum){ $res['download'][$downloadind] = array('typ'=>$typ,'file'=>$file,'md5sum'=>$md5sum,'size'=>$size); $downloadexists[$typ][$file] = $downloadind; $downloadind++; } else{ $res['copy'][$copyind] = array('typ'=>$typ,'file'=>$file,'md5sum'=>$md5sum,'size'=>$size); $copyexists[$typ][$file] = $copyind; $copyind++; } } else{ $res['download'][$downloadind] = array('typ'=>$typ,'file'=>$file,'md5sum'=>$md5sum,'size'=>$size); $downloadexists[$typ][$file] = $downloadind; $downloadind++; } } else if($file!='') { if(substr($md5sum,0,3) === 'DEL') { continue; } if(is_file(dirname(__DIR__).'/download/'.$file)) { if(md5_file(dirname(__DIR__).'/download/'.$file)!=$md5sum) { $fileowner = fileowner(dirname(__DIR__).'/download/'.ltrim($file,'.')); $filegroup = filegroup(dirname(__DIR__).'/download/'.ltrim($file,'.')); $perms = fileperms(dirname(__DIR__).'/download/'.ltrim($file,'.')); $o = ($perms & 0x0080); $g = ($perms & 0x0010); $a = ($perms & 0x0002); // pruefe ob datei angelegt werden kann, wenn das passt ist eh alles gut if(touch(dirname(__DIR__).'/download/chkrights')) { unlink(dirname(__DIR__).'/download/chkrights'); } else if($eigenguser && $eigengroup) { if($fileowner != $eigenguser) { if($filegroup != $eigengroup) { if(!$a) { return array('error'=>'ERROR Fehlende Schreibrechte im Downloadordner'); } } else{ if(!$g) { return array('error'=>'ERROR Fehlende Schreibrechte im Downloadordner'); } } } else{ if(!$o) { return array('error'=>'ERROR Fehlende Schreibrechte im Downloadordner'); } } } $res['download'][$downloadind] = array('typ'=>$typ,'file'=>$file,'md5sum'=>$md5sum,'size'=>$size); $downloadexists[$typ][$file] = $downloadind; $downloadind++; } else{ $res['copy'][$copyind] = array('typ'=>$typ,'file'=>$file,'md5sum'=>$md5sum,'size'=>$size); $copyexists[$typ][$file] = $copyind; $copyind++; } } else { $res['download'][$downloadind] = array('typ'=>$typ,'file'=>$file,'md5sum'=>$md5sum,'size'=>$size); $downloadexists[$typ][$file] = $downloadind; $downloadind++; } } } } if(!empty($res['download']) && count($res['download']) > 0) { foreach($res['download'] as $key => $val) { if(isset($val['md5sum']) && substr($val['md5sum'],0,3) === 'DEL') { unset($res['download'][$key]); } } } return $this->CheckRights($res, $eigenguser, $eigengroup); } protected function CheckFileFolder($file, $eigenguser, $eigengroup) { if(is_file($file)) { if($handle = @fopen($file,'a+')) { fclose($handle); return false; } $fileowner = fileowner($file); if($fileowner !== $eigenguser) { if(@chown($file,$eigenguser) && ($handle = @fopen($file,'a+'))) { fclose($handle); return false; } } $perms = fileperms($file); $filegroup = filegroup($file); if($fileowner === $eigenguser) { if(@chmod($file, $perms | 0600)) { return false; } } if($filegroup === $eigengroup) { if(@chmod($file, $perms | 0060)) { return false; } } if(@chown($file,$perms | 0006)) { return false; } return true; } if(!is_dir($file)) { return false; } if(is_file($file.'/chkrights')) { @unlink($file.'/chkrights'); } if(!is_file($file.'/chkrights') && @touch($file.'/chkrights')){ if(is_file($file.'/chkrights')){ @unlink($file . '/chkrights'); return false; } return true; } $fileowner = fileowner($file); if($fileowner !== $eigenguser) { if(chown($file,$eigenguser) && @touch($file.'/chkrights')) { @unlink($file.'/chkrights'); return false; } } $perms = fileperms($file); $filegroup = filegroup($file); if($fileowner === $eigenguser) { if(@chmod($file, $perms | 0700) && @touch($file.'/chkrights')) { @unlink($file.'/chkrights'); return false; } } if($filegroup === $eigengroup) { if(@chmod($file, $perms | 0070) && @touch($file.'/chkrights')) { @unlink($file.'/chkrights'); return false; } } if(@chown($file,$perms | 0007) && @touch($file.'/chkrights')) { @unlink($file.'/chkrights'); return false; } return true; } protected function CheckRights($res, $eigenguser, $eigengroup) { $foldertocheck = []; if(!empty($res['download'])) { foreach($res['download'] as $k => $v) { $file = ltrim(ltrim($v['file'],'.'),'/'); if($file === '.') { continue; } if($this->CheckFileFolder(dirname(__DIR__).'/'.$file, $eigenguser, $eigengroup)) { $res['FileError'][] = dirname(__DIR__).'/'.$file; } if($this->CheckFileFolder(dirname(__DIR__).'/download/'.$file, $eigenguser, $eigengroup)) { $res['FileError'][] = dirname(__DIR__).'/download/'.$file; } $dfile = dirname($file); if($dfile === '.') { $folder = dirname(__DIR__); } else{ $folder = dirname(__DIR__) . '/' . $dfile; } $foldertocheck[substr_count($folder,'/')][$folder] = true; if($dfile === '.') { $folder = dirname(__DIR__). '/download'; } else{ $folder = dirname(__DIR__) . '/download/' . $dfile; } $foldertocheck[substr_count($folder,'/')][$folder] = true; } } if(!empty($res['copy'])) { foreach($res['copy'] as $k => $v) { $file = ltrim(ltrim($v['file'],'.'),'/'); if($file === '.') { continue; } if($this->CheckFileFolder(dirname(__DIR__).'/'.$file, $eigenguser, $eigengroup)) { $res['FileError'][] = dirname(__DIR__).'/'.$file; } $dfile = dirname($file); if($dfile === '.') { $folder = dirname(__DIR__); } else { $folder = dirname(__DIR__) . '/' . $dfile; } $foldertocheck[substr_count($folder,'/')][$folder] = true; } } if(!empty($foldertocheck)) { foreach($foldertocheck as $lvl => $folderarr) { foreach($folderarr as $k => $v) { if($this->CheckFileFolder($k, $eigenguser, $eigengroup)) { $res['FolderError'][] = $k; } } } } return $res; } function CheckUpdate() { $parameter['version']=@$this->conf['version']; $result = $this->Request('md5list',$parameter); if($result==='ERROR') { echo "Updates: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return; } $rows = explode(";",$result); if(count($rows)>0) { foreach($rows as $value) { unset($single_row); $single_row = explode(":",$value); if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3) { $file = $single_row[0]; $md5sum = $single_row[1]; if(substr($md5sum,0,3) === 'DEL')continue; $parameter['file']=$file; $parameter['md5sum']=$md5sum; if($file==='./upgradesystemclient.php') { } else if(is_file($file)) { // pruefe md5sum if(md5_file($file)!=$md5sum) { // wenn update dann UPD_ echo "update <- $file\n"; $result = $this->Request("getfile",$parameter); $output = (base64_decode($result)); //$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output); file_put_contents($file."UPD", $output); /* $fp = fopen($file."UPD","wb+"); fwrite($fp,base64_decode($result)); fclose($fp); */ // pruefsuemme neu berechnen wenn passt umbenennen und ins archiv echo md5_file($file."UPD"); echo "-".$md5sum."\n"; if(md5_file($file."UPD")==$md5sum) { echo "update ok $file\n"; rename($file."UPD",$file); } } } else if($file!="") { echo "datei <- $file\n"; // pruefe ob es verzeichnis gibt $verzeichnis = dirname($file); if(!is_dir($verzeichnis)) { echo "verzeichnis <- $verzeichnis\n"; mkdir($verzeichnis,0777,true); } $result = $this->Request("getfile",$parameter); $output = base64_decode($result); //$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output); //$output = iconv("ISO-8859-1","UTF-8",$output); //$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output); file_put_contents($file."NEW", $output); /*$fp = fopen($file."NEW","wb+"); fwrite($fp,base64_decode($result)); fclose($fp); */ if(md5_file($file."NEW")==$md5sum) { echo "datei ok $file\n"; rename($file."NEW",$file); } } } } } } function CheckUpdateModules() { //$this->dir_rekursiv("./"); //$parameter['md5sums'] = $this->localmd5sums; //shell_exec('find ./ -exec md5sum "{}" \;'); $parameter['version']=@$this->conf['version']; $result = $this->Request('md5listmodules',$parameter); if($result==='ERROR') { echo "Modules: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return; } $rows = explode(";",$result); if(count($rows)>0) { foreach($rows as $value) { unset($single_row); $single_row = explode(":",$value); if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3) { $file = $single_row[0]; $md5sum = $single_row[1]; if(substr($md5sum,0,3) === 'DEL') { continue; } $parameter['file']=$file; $parameter['md5sum']=$md5sum; if($file==="./upgradesystemclient.php") { } else if(is_file($file)) { // pruefe md5sum if(md5_file($file)!=$md5sum) { // wenn update dann UPD_ echo "update (M) <- $file\n"; $result = $this->Request("getfilemodules",$parameter); $output = (base64_decode($result)); //$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output); file_put_contents($file."UPD", $output); /* $fp = fopen($file."UPD","wb+"); fwrite($fp,base64_decode($result)); fclose($fp); */ // pruefsuemme neu berechnen wenn passt umbenennen und ins archiv echo md5_file($file."UPD"); echo "-".$md5sum."\n"; if(md5_file($file."UPD")==$md5sum) { echo "update (M) ok $file\n"; rename($file."UPD",$file); } } } else if($file!='') { echo "datei (M) <- $file\n"; // pruefe ob es verzeichnis gibt $verzeichnis = dirname($file); if(!is_dir($verzeichnis)) { echo "verzeichnis (M) <- $verzeichnis\n"; mkdir($verzeichnis,0777,true); } $result = $this->Request("getfilemodules",$parameter); $output = base64_decode($result); //$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output); //$output = iconv("ISO-8859-1","UTF-8",$output); //$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output); file_put_contents($file."NEW", $output); /*$fp = fopen($file."NEW","wb+"); fwrite($fp,base64_decode($result)); fclose($fp); */ if(md5_file($file."NEW")==$md5sum) { echo "datei (M) ok $file\n"; rename($file."NEW",$file); } } } } } } function CheckUpdateCustom() { $parameter['version']=@$this->conf['version']; $result = $this->Request("md5listcustom",$parameter); if($result==='ERROR') { echo "Custom: ERROR FROM SERVER (Perhaps a wrong license?)\n"; return; } $rows = explode(";",$result); if(count($rows)>0) { foreach($rows as $value) { unset($single_row); $single_row = explode(":",$value); if(count($single_row)>=2 && strlen($single_row[0])>3 && strlen($single_row[1])>3) { $file = $single_row[0]; $md5sum = $single_row[1]; $parameter['file']=$file; $parameter['md5sum']=$md5sum; if(substr($md5sum,0,3) === 'DEL') { continue; } if($file==='./upgradesystemclient.php') { } else if(is_file($file)) { // pruefe md5sum if(md5_file($file)!=$md5sum) { // wenn update dann UPD_ echo "update (C) <- $file\n"; $result = $this->Request("getfilecustom",$parameter); $output = (base64_decode($result)); //$output = preg_replace('/[^(\x22-\x7F)\x0A]*/','', $output); file_put_contents($file."UPD", $output); /* $fp = fopen($file."UPD","wb+"); fwrite($fp,base64_decode($result)); fclose($fp); */ // pruefsuemme neu berechnen wenn passt umbenennen und ins archiv echo md5_file($file."UPD"); echo "-".$md5sum."\n"; if(md5_file($file."UPD")==$md5sum) { echo "update (C) ok $file\n"; rename($file."UPD",$file); } } } else if($file!="") { echo "datei (C) <- $file\n"; // pruefe ob es verzeichnis gibt $verzeichnis = dirname($file); if(!is_dir($verzeichnis)) { echo "verzeichnis (C) <- $verzeichnis\n"; mkdir($verzeichnis,0777,true); } $result = $this->Request("getfilecustom",$parameter); $output = base64_decode($result); //$output = iconv("UTF-8","ISO-8859-1//IGNORE",$output); //$output = iconv("ISO-8859-1","UTF-8",$output); //$output = preg_replace('/[^(\x20-\x7F)\x0A]*/','', $output); file_put_contents($file."NEW", $output); /*$fp = fopen($file."NEW","wb+"); fwrite($fp,base64_decode($result)); fclose($fp); */ if(md5_file($file."NEW")==$md5sum) { echo "datei (C) ok $file\n"; rename($file."NEW",$file); } } } } } } function DownloadUpdate() { } function CheckDownloadedUpdate() { } function ExecuteUpdate() { } function Request($command,$parameter) { $erp = $this->erp; $auth['serial']=trim($erp->Firmendaten('lizenz'));//$this->conf['serial']; $auth['authkey']=trim($erp->Firmendaten('schluessel'));//$this->conf['authkey']; if(empty($auth['serial']) || empty($auth['authkey'])) { $this->errormsg = 'Bitte tragen Sie die Lizenzdaten in den <a style="color:red;" target="_blank" href="index.php?module=firmendaten&action=edit#tabs-10">Grundeinstellungen</a> ein.'; return ''; } if(!empty($_SERVER['SERVER_NAME']) && $_SERVER['SERVER_NAME'] !== '') { $auth['SERVER_NAME'] = $_SERVER['SERVER_NAME']; } elseif(!empty($_SERVER['HTTP_HOST'])) { $auth['SERVER_NAME'] = $_SERVER['HTTP_HOST']; } else { $auth['SERVER_NAME'] = ''; } $auth = base64_encode(json_encode($auth)); $parameter = base64_encode(json_encode($parameter)); $client = new UpdateHttpClient($this->conf['host'],$this->conf['port']); $client->post('/upgradesystem.php', [ 'authjson' => $auth, 'parameterjson'=>$parameter, 'command'=>(String)$command , 'withdel' => 1 ] ); $pageContents = $client->getContent(); if(!empty($client->errormsg)){ $this->errormsg = $client->errormsg; } $this->http_code = (string)$client->getStatus(); return $pageContents; } function dir_rekursiv($verzeichnis) { $handle = opendir($verzeichnis); while ($datei = readdir($handle)) { if ($datei !== '.' && $datei !== '..') { if (is_dir($verzeichnis.$datei)) // Wenn Verzeichniseintrag ein Verzeichnis ist { // Erneuter Funktionsaufruf, um das aktuelle Verzeichnis auszulesen $this->dir_rekursiv($verzeichnis.$datei.'/'); } else { // Wenn Verzeichnis-Eintrag eine Datei ist, diese ausgeben $this->localmd5sums[$verzeichnis.$datei] = md5_file($verzeichnis.$datei); } } } closedir($handle); } } /* Version 0.9, 6th April 2003 - Simon Willison ( http://simon.incutio.com/ ) Manual: http://scripts.incutio.com/httpclient/ */ class UpdateHttpClient { // Request vars var $host; var $port; var $path; var $method; var $postdata = ''; var $cookies = array(); var $referer; var $accept = 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain,image/png,image/jpeg,image/gif,*/*'; var $accept_encoding = 'gzip'; var $accept_language = 'en-us'; var $user_agent = 'Incutio HttpClient v0.9'; // Options var $timeout = 20; var $use_gzip = true; var $persist_cookies = true; // If true, received cookies are placed in the $this->cookies array ready for the next request // Note: This currently ignores the cookie path (and time) completely. Time is not important, // but path could possibly lead to security problems. var $persist_referers = true; // For each request, sends path of last request as referer var $debug = false; var $handle_redirects = true; // Auaomtically redirect if Location or URI header is found var $max_redirects = 5; var $headers_only = false; // If true, stops receiving once headers have been read. // Basic authorization variables var $username; var $password; // Response vars var $status; var $headers = array(); var $content = ''; var $errormsg; // Tracker variables var $redirect_count = 0; var $cookie_host = ''; function __construct($host, $port=80) { $this->host = $host; $this->port = $port; } function get($path, $data = false) { $this->path = $path; $this->method = 'GET'; if ($data) { $this->path .= '?'.$this->buildQueryString($data); } return $this->doRequest(); } function post($path, $data) { $this->path = $path; $this->method = 'POST'; $this->postdata = $this->buildQueryString($data); return $this->doRequest(); } function buildQueryString($data) { $querystring = ''; if (is_array($data)) { // Change data in to postable data foreach ($data as $key => $val) { if (is_array($val)) { foreach ($val as $val2) { $querystring .= urlencode($key).'='.urlencode($val2).'&'; } } else { $querystring .= urlencode($key).'='.urlencode($val).'&'; } } $querystring = substr($querystring, 0, -1); // Eliminate unnecessary & } else { $querystring = $data; } return $querystring; } function doRequest() { // Performs the actual HTTP request, returning true or false depending on outcome if(!@fsockopen('ssl://'.$this->host, $this->port, $errno, $errstr, $this->timeout) && $this->port==443) { $this->port=80; } if($this->port==443){ $url = 'ssl://' . $this->host; } else{ $url = $this->host; } if (!$fp = @fsockopen($url, $this->port, $errno, $errstr, $this->timeout)) { // Set error message switch($errno) { case -3: $this->errormsg = 'Socket creation failed (-3)'; $this->errormsg .= ' '.$errstr; $this->debug($this->errormsg); break; case -4: $this->errormsg = 'DNS lookup failure (-4)'; $this->errormsg .= ' '.$errstr; $this->debug($this->errormsg); break; case -5: $this->errormsg = 'Connection refused or timed out (-5)'; $this->errormsg .= ' '.$errstr; $this->debug($this->errormsg); break; default: $this->errormsg = 'Connection failed ('.$errno.')'; $this->errormsg .= ' '.$errstr; $this->debug($this->errormsg); } return false; } stream_set_timeout($fp, $this->timeout); $request = $this->buildRequest(); $this->debug('Request', $request); fwrite($fp, $request); // Reset all the variables that should not persist between requests $this->headers = array(); $this->content = ''; $this->errormsg = ''; // Set a couple of flags $inHeaders = true; $atStart = true; // Now start reading back the response while (!feof($fp)) { $line = fgets($fp, 4096); if ($atStart) { // Deal with first line of returned data $atStart = false; if (!preg_match('/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $line, $m)) { $this->errormsg = "Status code line invalid: ".htmlentities($line); $this->debug($this->errormsg); //return false; } $http_version = $m[1]; // not used $this->status = $m[2]; $status_string = $m[3]; // not used $this->debug(trim($line)); continue; } if ($inHeaders) { if (trim($line) == '') { $inHeaders = false; $this->debug('Received Headers', $this->headers); if ($this->headers_only) { break; // Skip the rest of the input } continue; } if (!preg_match('/([^:]+):\\s*(.*)/', $line, $m)) { // Skip to the next header continue; } $key = strtolower(trim($m[1])); $val = trim($m[2]); // Deal with the possibility of multiple headers of same name if (isset($this->headers[$key])) { if (is_array($this->headers[$key])) { $this->headers[$key][] = $val; } else { $this->headers[$key] = array($this->headers[$key], $val); } } else { $this->headers[$key] = $val; } continue; } // We're not in the headers, so append the line to the contents $this->content .= $line; } fclose($fp); // If data is compressed, uncompress it if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] == 'gzip') { $this->debug('Content is gzip encoded, unzipping it'); $this->content = substr($this->content, 10); // See http://www.php.net/manual/en/function.gzencode.php $this->content = gzinflate($this->content); } // If $persist_cookies, deal with any cookies if ($this->persist_cookies && isset($this->headers['set-cookie']) && $this->host == $this->cookie_host) { $cookies = $this->headers['set-cookie']; if (!is_array($cookies)) { $cookies = array($cookies); } foreach ($cookies as $cookie) { if (preg_match('/([^=]+)=([^;]+);/', $cookie, $m)) { $this->cookies[$m[1]] = $m[2]; } } // Record domain of cookies for security reasons $this->cookie_host = $this->host; } // If $persist_referers, set the referer ready for the next request if ($this->persist_referers) { $this->debug('Persisting referer: '.$this->getRequestURL()); $this->referer = $this->getRequestURL(); } // Finally, if handle_redirects and a redirect is sent, do that if ($this->handle_redirects) { if (++$this->redirect_count >= $this->max_redirects) { $this->errormsg = 'Verbindung konnte nicht aufgebaut werden. Bitte wenden Sie sich an Ihre IT. Eventuell sind SSL-Zertifikate nicht vorhanden bzw. abgelaufen'; $this->debug($this->errormsg); $this->redirect_count = 0; return false; } $location = isset($this->headers['location']) ? $this->headers['location'] : ''; $uri = isset($this->headers['uri']) ? $this->headers['uri'] : ''; if ($location || $uri) { $url = parse_url($location.$uri); // This will FAIL if redirect is to a different site return $this->get($url['path']); } } return true; } function buildRequest() { $headers = array(); $headers[] = "{$this->method} {$this->path} HTTP/1.0"; // Using 1.1 leads to all manner of problems, such as "chunked" encoding $headers[] = "Host: {$this->host}"; $headers[] = "User-Agent: {$this->user_agent}"; $headers[] = "Accept: {$this->accept}"; if ($this->use_gzip) { $headers[] = "Accept-encoding: {$this->accept_encoding}"; } $headers[] = "Accept-language: {$this->accept_language}"; if ($this->referer) { $headers[] = "Referer: {$this->referer}"; } // Cookies if ($this->cookies) { $cookie = 'Cookie: '; foreach ($this->cookies as $key => $value) { $cookie .= "$key=$value; "; } $headers[] = $cookie; } // Basic authentication if ($this->username && $this->password) { $headers[] = 'Authorization: BASIC '.base64_encode($this->username.':'.$this->password); } // If this is a POST, set the content type and length if ($this->postdata) { $headers[] = 'Content-Type: application/x-www-form-urlencoded'; $headers[] = 'Content-Length: '.strlen($this->postdata); } $request = implode("\r\n", $headers)."\r\n\r\n".$this->postdata; return $request; } function getStatus() { return $this->status; } function getContent() { return $this->content; } function getHeaders() { return $this->headers; } function getHeader($header) { $header = strtolower($header); if (isset($this->headers[$header])) { return $this->headers[$header]; } return false; } function getError() { return $this->errormsg; } function getCookies() { return $this->cookies; } function getRequestURL() { $url = 'http://'.$this->host; if ($this->port != 80) { $url .= ':'.$this->port; } $url .= $this->path; return $url; } // Setter methods function setUserAgent($string) { $this->user_agent = $string; } function setAuthorization($username, $password) { $this->username = $username; $this->password = $password; } function setCookies($array) { $this->cookies = $array; } // Option setting methods function useGzip($boolean) { $this->use_gzip = $boolean; } function setPersistCookies($boolean) { $this->persist_cookies = $boolean; } function setPersistReferers($boolean) { $this->persist_referers = $boolean; } function setHandleRedirects($boolean) { $this->handle_redirects = $boolean; } function setMaxRedirects($num) { $this->max_redirects = $num; } function setHeadersOnly($boolean) { $this->headers_only = $boolean; } function setDebug($boolean) { $this->debug = $boolean; } // "Quick" static methods function quickGet($url) { $bits = parse_url($url); $host = $bits['host']; $port = isset($bits['port']) ? $bits['port'] : 80; $path = isset($bits['path']) ? $bits['path'] : '/'; if (isset($bits['query'])) { $path .= '?'.$bits['query']; } $client = new UpdateHttpClient($host, $port); if (!$client->get($path)) { return false; } return $client->getContent(); } function quickPost($url, $data) { $bits = parse_url($url); $host = $bits['host']; $port = isset($bits['port']) ? $bits['port'] : 80; $path = isset($bits['path']) ? $bits['path'] : '/'; $client = new UpdateHttpClient($host, $port); if (!$client->post($path, $data)) { return false; } return $client->getContent(); } function debug($msg, $object = false) { if ($this->debug) { print '<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong>HttpClient Debug:</strong> '.$msg; if ($object) { ob_start(); print_r($object); $content = htmlentities(ob_get_contents()); ob_end_clean(); print '<pre>'.$content.'</pre>'; } print '</div>'; } } } class UpdatePage { var $engine; function __construct(&$app) { $this->app = &$app; //$this->engine = &$engine; } /// load a themeset set function LoadTheme($theme) { //$this->app->Tpl->ReadTemplatesFromPath("themes/$theme/templates/"); $this->app->Tpl->ReadTemplatesFromPath("themes/$theme/templates/"); } /// show complete page function Show() { return $this->app->Tpl->FinalParse('update.tpl'); } } class UpdateSession { // set check to true when user have permissions private $check = false; public $module; public $action; // application object public $app; public $reason; function __construct() { } function Check($appObj) { $this->app = $appObj; $this->check = true; if(!$this->app->acl->CheckTimeOut()){ $this->check = false; $this->reason = 'PLEASE_LOGIN'; } else { //benutzer ist schon mal erfolgreich angemeldet if($this->app->User->GetType()==='admin'){ $this->check = true; } else { $this->reason = 'NO_PERMISSIONS'; $this->check = false; } } } function GetCheck() { return $this->check; } function UserSessionCheck() { $this->check=false; $this->reason='PLEASE_LOGIN'; //$this->reason="SESSION_TIMEOUT"; return true; } } class UpdateWawiString { function __construct() { } function Convert($value,$input,$output) { if($input==''){ return $value; } $array = $this->FindPercentValues($input); $regexp = $this->BuildRegExp($array); $elements = preg_split($regexp,$value,-1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); // input und elements stimmmen ueberein $newout = $output; $i = 0; foreach($array as $key=>$v) { $newout = str_replace($key,$elements[$i],$newout); $i++; } return $newout; } function BuildRegExp($array) { $regexp = '/^'; foreach($array as $value) { $value = str_replace('.','\.',$value); $value = str_replace('+','\+',$value); $value = str_replace('*','\*',$value); $value = str_replace('?','\?',$value); $regexp .= '(\S+)'.$value; } $regexp .= '/'; return $regexp; } function FindPercentValues($pattern) { $hash = ''; $collect = ''; preg_match_all('/(?:(%[0-9]+)|.)/i', $pattern, $matches); $hash = ''; $collect = ''; $start = true; foreach($matches[1] as $key=>$value) { if($value==''){ $collecting = true; } else { $collecting = false; $oldhash = $hash; $hash = $value; } if(!$collecting) { if(!$start){ $replace[$oldhash] = $collect; } $collect=''; } else{ $collect .= $matches[0][$key]; } $start = false; } $replace[$hash] = $collect; return $replace; } function encodeText($string) { $string = str_replace("\\r\\n","#BR#",$string); $string = str_replace("\n","#BR#",$string); $encoded = htmlspecialchars(stripslashes($string), ENT_QUOTES); return $encoded; } function decodeText($_str, $_form=true) { if ($_form) { $_str = str_replace("#BR#", "\r\n", $_str); } else { $_str = str_replace("#BR#", "<br>", $_str); } return($_str); } function valid_utf8( $string ) { return !((bool)preg_match('~\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF\xC0\xC1~ms',$string)); } } class UpdatephpWFAPI { function __construct(&$app) { $this->app=&$app; } function ReBuildPageFrame() { $this->app->Tpl->ResetParser(); $this->BuildPageFrame(); } function BuildPageFrame() { $this->app->Tpl->ReadTemplatesFromPath("phpwf/defaulttemplates/"); // build template tree $this->app->Page->LoadTheme($this->app->WFconf[defaulttheme]); // start acutally application instance $this->app->Tpl->ReadTemplatesFromPath("pages/content/_gen"); $this->app->Tpl->ReadTemplatesFromPath("pages/content/"); } function StartRequestedCommand() { $defaultpage = $this->app->WFconf['defaultpage']; $defaultpageaction = $this->app->WFconf['defaultpageaction']; $module = $this->app->Secure->GetGET('module','alpha'); $action = $this->app->Secure->GetGET('action','alpha'); if(!file_exists("pages/".$module.".php")) $module = $defaultpage; if($action=='') { $action = $defaultpageaction; } if(!$this->app->acl->Check($this->app->User->GetType(),$module,$action)) return; // start module if(file_exists("pages/".$module.".php")) { include("pages/".$module.".php"); //create dynamical an object $constr=strtoupper($module[0]).substr($module, 1); $myApp = new $constr($this->app); } else { echo $this->app->WFM->Error("Module <b>$module</b> doesn't exists in pages/"); } $this->app->acl->CheckTimeOut(); } /// mit dem "erstellen Formular" einfach bearbeiten liste + formular anzeigen function EasyTableList($tablename,$cols,$parsetarget,$pkname,$delmsg,$delmsgcol) { // show list // create html table $table = new HTMLTable("0","100%"); $table->AddRowAsHeading($cols); $all = $this->app->DB->SelectTable($tablename,$cols); $table->AddField($all); $action = $this->app->Secure->GetGET("action","alpha"); $module = $this->app->Secure->GetGET("module","alpha"); $table->AddCompleteCol(0, "<a href=\"index.php?module=$module&action=$action&id=%col%\">bearbeiten</a>"); $table->AddCompleteCol(0, "<a href=\"#\" onclick=\"str = confirm('{$delmsg}'); if(str!='' & str!=null) window.document.location.href='index.php?module=$module&action=$action&id=%col%&formaction=delete';\"> loeschen</a>",$delmsgcol); $table->ChangingRowColors('#ffffff','#dddddd'); $this->app->Tpl->Set($parsetarget,$table->Get()); } function Message($msg,$parsetarget='MSGBOX') { $this->app->Tpl->Add('MSGBOXTEXT',$msg); $this->app->Tpl->Parse($parsetarget,"messagebox.tpl"); } // emailvorlage aus db senden function EmailFromTemplate($template,$to,$values) { $betreff = $this->app->DB->Select("SELECT betreff FROM emailvorlagen WHERE name='$template' LIMIT 1"); $nachricht = $this->app->DB->Select("SELECT nachricht FROM emailvorlagen WHERE name='$template' LIMIT 1"); if(count($values) > 0) { foreach($values as $key=>$value) { $nachricht = str_replace("%".$key."%",$value,$nachricht); $betreff = str_replace("%".$key."%",$value,$betreff); } } $nachricht = str_replace('#BR#',"\n",$nachricht); mail($to,$betreff,$nachricht,"From: ActConnect Team <info@actconnect.de>"); } } class UpdateSecure { var $GET; var $POST; function __construct(&$app){ $this->app = &$app; // clear global variables, that everybody have to go over secure layer $this->GET = $_GET; // $_GET=""; $this->POST = $_POST; // $_POST=""; $this->AddRule('notempty','reg','.'); // at least one sign $this->AddRule('alpha','reg','[a-zA-Z]'); $this->AddRule('digit','reg','[0-9]'); $this->AddRule('space','reg','[ ]'); $this->AddRule('specialchars','reg','[_-]'); $this->AddRule('email','reg','^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$'); $this->AddRule('datum','reg','([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})'); $this->AddRule('username','glue','alpha+digit'); $this->AddRule('password','glue','alpha+digit+specialchars'); } function GetGET($name,$rule="",$maxlength="",$sqlcheckoff="") { return $this->Syntax(isset($this->GET[$name])?$this->GET[$name]:'',$rule,$maxlength,$sqlcheckoff); } function GetPOST($name,$rule="",$maxlength="",$sqlcheckoff="") { return $this->Syntax(isset($this->POST[$name])?$this->POST[$name]:'',$rule,$maxlength,$sqlcheckoff); } function GetPOSTForForms($name,$rule="",$maxlength="",$sqlcheckoff="") { return $this->SyntaxForForms($this->POST[$name],$rule,$maxlength,$sqlcheckoff); } function GetPOSTArray() { if(count($this->POST)>0) { foreach($this->POST as $key=>$value) { $key = $this->GetPOST($key,"alpha+digit+specialchars",20); $ret[$key]=$this->GetPOST($value); } } if(isset($ret))return $ret; } function GetGETArray() { if(count($this->GET)>0) { foreach($this->GET as $key=>$value) { $key = $this->GetGET($key,"alpha+digit+specialchars",20); $ret[$key]=$this->GetGET($value); } } if(isset($ret)) { return $ret; } } function stripallslashes($string) { while(strstr($string,'\\')) { $string = stripslashes($string); } return $string; } function smartstripslashes($str) { $cd1 = substr_count($str, "\""); $cd2 = substr_count($str, "\\\""); $cs1 = substr_count($str, "'"); $cs2 = substr_count($str, "\\'"); $tmp = strtr($str, array("\\\"" => "", "\\'" => "")); $cb1 = substr_count($tmp, "\\"); $cb2 = substr_count($tmp, "\\\\"); if ($cd1 == $cd2 && $cs1 == $cs2 && $cb1 == 2 * $cb2) { return strtr($str, array("\\\"" => "\"", "\\'" => "'", "\\\\" => "\\")); } return $str; } function SyntaxForForms($value,$rule,$maxlength="",$sqlcheckoff="") { return $value;//mysqli_real_escape_string($this->app->DB->connection,$value);//mysqli_real_escape_string($value); } // check actual value with given rule function Syntax($value,$rule,$maxlength="",$sqlcheckoff="") { $value = str_replace("\xef\xbb\xbf","NONBLOCKINGZERO",$value); if(is_array($value)) { return $value; } $value = $this->stripallslashes($value); $value = $this->smartstripslashes($value); $value = $this->app->erp->superentities($value); if($rule=='' && $sqlcheckoff == '') { return mysqli_real_escape_string($this->app->DB->connection,$value);//mysqli_real_escape_string($value); } if($rule=='' && $sqlcheckoff != '') { return $value; } // build complete regexp // check if rule exists if($this->GetRegexp($rule)!=""){ //$v = '/^['.$this->GetRegexp($rule).']+$/'; $v = $this->GetRegexp($rule); if (preg_match_all('/'.$v.'/i', $value, $teffer) ) { if($sqlcheckoff==""){ return mysqli_real_escape_string($this->app->DB->connection, $value);//mysqli_real_escape_string($value); } return $value; } return ''; } echo "<table border=\"1\" width=\"100%\" bgcolor=\"#FFB6C1\"> <tr><td>Rule <b>$rule</b> doesn't exists!</td></tr></table>"; return ''; } function RuleCheck($value,$rule) { $v = $this->GetRegexp($rule); if (preg_match_all('/'.$v.'/i', $value, $teffer) ){ return true; } return false; } function AddRule($name,$type,$rule) { // type: reg = regular expression // type: glue ( already exists rules copy to new e.g. number+digit) $this->rules[$name]=array('type'=>$type,'rule'=>$rule); } // get complete regexp by rule name function GetRegexp($rule) { $rules = explode("+",$rule); $ret = ''; foreach($rules as $key) { // check if rule is last in glue string if($this->rules[$key]['type']==="glue") { $subrules = explode("+",$this->rules[$key]['rule']); if(count($subrules)>0) { foreach($subrules as $subkey) { $ret .= $this->GetRegexp($subkey); } } } elseif($this->rules[$key]['type']==="reg") { $ret .= $this->rules[$key]['rule']; } } if($ret=="") $ret = "none"; return $ret; } } class UpdateAcl { /** @var UpdateApplication */ public $app; public function __construct($app) { $this->app = $app; if(!empty($_COOKIE['DBSELECTED'])) { $this->app->changeDbConf($_COOKIE['DBSELECTED']); } } function CheckTimeOut() { $this->session_id = session_id(); if(isset($_COOKIE['CH42SESSION']) && $_COOKIE['CH42SESSION']!='') { $this->session_id = $_COOKIE["CH42SESSION"]; $this->app->DB->Update("UPDATE useronline SET time=NOW(),login=1 WHERE sessionid='".$this->app->DB->real_escape_string($_COOKIE["CH42SESSION"])."' LIMIT 1"); } // check if user is applied // $this->app->DB->Delete("DELETE FROM useronline WHERE user_id='".$this->app->User->GetID()."' AND sessionid!='".$this->session_id."'"); $sessid = $this->app->DB->Select("SELECT sessionid FROM useronline,user WHERE login='1' AND sessionid='".$this->app->DB->real_escape_string($this->session_id)."' AND user.id=useronline.user_id AND user.activ='1' LIMIT 1"); if($this->session_id == $sessid) { // check if time is expired $time = $this->app->DB->Select("SELECT UNIX_TIMESTAMP(time) FROM useronline,user WHERE login='1' AND sessionid='".$this->app->DB->real_escape_string($this->session_id)."' AND user.id=useronline.user_id AND user.activ='1' LIMIT 1"); if((time()-$time) > $this->app->Conf->WFconf['logintimeout']) { if(!isset($_COOKIE['CH42SESSION']) || $_COOKIE['CH42SESSION']=='') { //$this->app->WF->ReBuildPageFrame(); $this->Logout("Ihre Zeit ist abgelaufen, bitte melden Sie sich erneut an.",true); return false; } } else { // update time $this->app->DB->Update("UPDATE useronline,user SET useronline.time=NOW() WHERE login='1' AND sessionid='".$this->app->DB->real_escape_string($this->session_id)."' AND user.id=useronline.user_id AND user.activ='1'"); session_write_close(); // Blockade wegnehmen return true; } } } function Check($usertype,$module='',$action='', $userid='') { return $usertype==='admin'; } function Login() { $multidbs = $this->app->getDbs(); if(count($multidbs) > 1) { $options = ''; foreach($multidbs as $k => $v) { $options .= '<option value="'.$k.'">'.$v.'</options>'; } $this->app->Tpl->Add('MULTIDB','<tr><td>Datenbank: <select name="db">'.$options.'</select><input type="hidden" name="dbselect" value="true"></td></tr>'); } $db = $this->app->Secure->GetPOST('db'); if(!empty($db)) { if($this->app->changeDbConf($db)) { setcookie('DBSELECTED', $db); } } $username = $this->app->DB->real_escape_string($this->app->Secure->GetPOST("username")); $password = $this->app->Secure->GetPOST('password'); $passwordunescaped = $this->app->Secure->GetPOST('password','','','noescape'); $stechuhrdevice = $this->app->Secure->GetPOST('stechuhrdevice'); $token = $this->app->Secure->GetPOST('token'); if($username=='' && ($password=='' || $token=='') && $stechuhrdevice == ''){ setcookie('nonavigation',false); $this->app->Tpl->Set('LOGINMSG',"Bitte geben Sie Benutzername und Passwort ein."); $this->app->Tpl->Parse('PAGE',"updatelogin.tpl"); } else { // Benutzer hat Daten angegeben $encrypted = $this->app->DB->Select("SELECT password FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); $encrypted_md5 = $this->app->DB->Select("SELECT passwordmd5 FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); $fehllogins= $this->app->DB->Select("SELECT fehllogins FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); $type= $this->app->DB->Select("SELECT type FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); $externlogin= $this->app->DB->Select("SELECT externlogin FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); $hwtoken = $this->app->DB->Select("SELECT hwtoken FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); $usesha512 = true; $salt = $this->app->DB->Select("SELECT salt FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); $passwordsha512 = $this->app->DB->Select("SELECT passwordsha512 FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); if($this->app->DB->error())$usesha512 = false; $usepasswordhash = true; $passwordhash = $this->app->DB->Select("SELECT passwordhash FROM `user` WHERE username='".$username."' AND activ='1' LIMIT 1"); if($this->app->DB->error())$usepasswordhash = false; $stechuhrdevicelogin = false; $code = $this->app->Secure->GetPOST('code'); $devices = $this->app->DB->SelectArr("SELECT * from stechuhrdevice where aktiv = 1 and code = '$code'"); if($devices) { $IP = $_SERVER['REMOTE_ADDR']; foreach($devices as $device) { $IP = ip2long($_SERVER['REMOTE_ADDR']); $devIP = ip2long($device['IP']); $submask = ip2long($device['submask']); $maskIP = $IP & $submask; $dbIP = $devIP & $submask; if($maskIP == $dbIP) { $stechuhrdevicelogin = true; } } } if($code && !$stechuhrdevicelogin) { setcookie('nonavigation',false); $this->app->Tpl->Set('RESETSTORAGE',' var devicecode = localStorage.getItem("devicecode"); if(devicecode) { localStorage.setItem("devicecode", ""); } '); } $user_id=""; $userip = $_SERVER['REMOTE_ADDR']; $ip_arr = explode('.',$userip); if($ip_arr[0]=="192" || $ip_arr[0]=="10" || $ip_arr[0]=="127") $localconnection = 1; else $localconnection = 0; //HACK intern immer Passwort //if($localconnection==1) // $hwtoken=0; if($stechuhrdevicelogin && $stechuhrdevice) { $nr = substr($stechuhrdevice,0,6); if(is_numeric($nr) && strlen($stechuhrdevice) > 200) { $user_id = $this->app->DB->Select("SELECT id FROM user WHERE username = '$nr' and hwtoken = 4 LIMIT 1"); if($user_id) { $encrypted = $this->app->DB->Select("SELECT password FROM user WHERE id='".$user_id."' AND activ='1' LIMIT 1"); $encrypted_md5 = $this->app->DB->Select("SELECT passwordmd5 FROM user WHERE id='".$user_id."' AND activ='1' LIMIT 1"); $fehllogins= $this->app->DB->Select("SELECT fehllogins FROM user WHERE id='".$user_id."' AND activ='1' LIMIT 1"); //$fehllogins=0; $type= $this->app->DB->Select("SELECT type FROM user WHERE id='".$user_id."' AND activ='1' LIMIT 1"); $externlogin= $this->app->DB->Select("SELECT externlogin FROM user WHERE id='".$user_id."' AND activ='1' LIMIT 1"); $hwtoken = $this->app->DB->Select("SELECT hwtoken FROM user WHERE id='".$user_id."' AND activ='1' LIMIT 1"); $usesha512 = true; $salt = $this->app->DB->Select("SELECT salt FROM user WHERE id='".$user_id."' AND activ='1' LIMIT 1"); $passwordsha512 = $this->app->DB->Select("SELECT passwordsha512 FROM user WHERE id='".$user_id."' AND activ='1' LIMIT 1"); if($this->app->DB->error()) { $usesha512 = false; } $usepasswordhash = true; $passwordhash = $this->app->DB->Select("SELECT passwordhash FROM `user` WHERE id='".$user_id."' AND activ='1' LIMIT 1"); if($this->app->DB->error())$usepasswordhash = false; $stechuhruser = $this->app->DB->Select("SELECT stechuhrdevice FROM user WHERE id = '$user_id'"); { if($stechuhrdevice == $stechuhruser) { setcookie('nonavigation',true); } elseif($stechuhruser == "") { $this->app->DB->Update("UPDATE user set stechuhrdevice = '$stechuhrdevice' where id = '$user_id' LIMIT 1"); setcookie('nonavigation',true); } else { $user_id = ""; setcookie('nonavigation',false); } } } } } elseif($hwtoken==1) //motp { setcookie('nonavigation',false); $pin = $this->app->DB->Select("SELECT motppin FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); $secret = $this->app->DB->Select("SELECT motpsecret FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); if($this->mOTP($pin,$token,$secret) && $fehllogins<8 && (md5($password ) == $encrypted_md5 || md5($passwordunescaped ) == $encrypted_md5)) { $user_id = $this->app->DB->Select("SELECT id FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); } else { $user_id = ""; } } //picosafe login else if ($hwtoken==2) { setcookie('nonavigation',false); //include("/var/www/wawision/trunk/phpwf/plugins/class.picosafelogin.php"); $myPicosafe = new PicosafeLogin(); $aes = $this->app->DB->Select("SELECT hwkey FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); $datablock = $this->app->DB->Select("SELECT hwdatablock FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); $counter = $this->app->DB->Select("SELECT hwcounter FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); $myPicosafe->SetUserAES($aes); $myPicosafe->SetUserDatablock($datablock); $myPicosafe->SetUserCounter($counter); if($encrypted_md5!="") { if ( $myPicosafe->LoginOTP($token) && (md5($password) == $encrypted_md5 || md5($passwordunescaped) == $encrypted_md5) && $fehllogins<8) { $user_id = $this->app->DB->Select("SELECT id FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); // Update counter $newcounter = $myPicosafe->GetLastValidCounter(); $this->app->DB->Update("UPDATE user SET hwcounter='$newcounter' WHERE id='$user_id' LIMIT 1"); } else { //echo $myPicosafe->error_message; $user_id = ""; } } else { if ( $myPicosafe->LoginOTP($token) && (crypt( $password, $encrypted ) == $encrypted || crypt( $passwordunescaped, $encrypted ) == $encrypted) && $fehllogins<8) { $user_id = $this->app->DB->Select("SELECT id FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); // Update counter $newcounter = $myPicosafe->GetLastValidCounter(); $this->app->DB->Update("UPDATE user SET hwcounter='$newcounter' WHERE id='$user_id' LIMIT 1"); } else { //echo $myPicosafe->error_message; $user_id = ''; } } } //wawision otp else if ($hwtoken==3) { setcookie('nonavigation',false); $wawi = new WaWisionOTP(); $hwkey = $this->app->DB->Select("SELECT hwkey FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); $hwcounter = $this->app->DB->Select("SELECT hwcounter FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); $hwdatablock = $this->app->DB->Select("SELECT hwdatablock FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); //$wawi->SetKey($hwkey); //$wawi->SetCounter($hwcounter); $serial =$hwdatablock; //$key = pack('V*', 0x01,0x02,0x03,0x04); $hwkey = trim(str_replace(' ','',$hwkey)); $hwkey_array = explode(",",$hwkey); $key = pack('V*', $hwkey_array[0], $hwkey_array[1], $hwkey_array[2], $hwkey_array[3]); $check = (int)$wawi->wawision_pad_verify($token,$key,$serial); // Fix fuer HW if($check >= 2147483647) $check = 0; if($encrypted_md5!="") { if ( $check > 0 && (md5($password) == $encrypted_md5 || md5($passwordunescaped) == $encrypted_md5) && $fehllogins<8 && $check > $hwcounter) { $user_id = $this->app->DB->Select("SELECT id FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); // Update counter $this->app->DB->Update("UPDATE user SET hwcounter='$check' WHERE id='$user_id' LIMIT 1"); $this->app->erp->SystemLog("xentral Login OTP Success User: $username Token: $token"); } else { if($check===false) { $this->app->erp->SystemLog("xentral Login OTP Falscher Key (Unkown Key) User: $username Token: $token"); } else if ($check < $hwcounter && $check > 0) { $this->app->erp->SystemLog("xentral Login OTP Counter Fehler (Replay Attacke) User: $username Token: $token"); } //echo $myPicosafe->error_message; $user_id = ""; } } else { /* if ( $wawi->LoginOTP($token) && crypt( $password, $encrypted ) == $encrypted && $fehllogins<8) { $user_id = $this->app->DB->Select("SELECT id FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); // Update counter $newcounter = $wawi->GetLastValidCounter(); $this->app->DB->Update("UPDATE user SET hwcounter='$newcounter' WHERE id='$user_id' LIMIT 1"); } else { */ //echo $myPicosafe->error_message; $user_id = ''; // } } } else { setcookie('nonavigation',false); if(isset($passwordhash) && $passwordhash != '' && $usepasswordhash) { $checkunescaped = password_verify ( $passwordunescaped , $passwordhash ); if(!$checkunescaped) { $checkescaped = password_verify ( $password , $passwordhash ); }else { $checkescaped = false; } if($checkunescaped || $checkescaped) { $user_id = $this->app->DB->Select("SELECT id FROM `user` WHERE username='".$username."' AND activ='1' LIMIT 1"); if($checkescaped && $user_id) { $options = array( 'cost' => 12, ); $passwordhash = @password_hash($passwordunescaped, PASSWORD_BCRYPT, $options); $this->app->DB->Update("UPDATE `user` SET passwordhash = '".$this->app->DB->real_escape_string($passwordhash)."', password='',passwordmd5='', salt = '', passwordsha512 = '' WHERE id = '".$user_id."' LIMIT 1"); } }else{ $user_id = ''; } }elseif(!empty($passwordsha512) && $usesha512) { if(hash('sha512',$passwordunescaped.$salt) === $passwordsha512 && $fehllogins<8) { $user_id = $this->app->DB->Select("SELECT id FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); }else{ $user_id = ''; } }elseif($encrypted_md5!=''){ if ((md5($password ) == $encrypted_md5 || md5($passwordunescaped) == $encrypted_md5) && $fehllogins<8) { if(isset($this->app->Conf->WFdbType) && $this->app->Conf->WFdbType=="postgre"){ $user_id = $this->app->DB->Select("SELECT id FROM \"user\" WHERE username='".$username."' AND activ='1' LIMIT 1"); } else { $user_id = $this->app->DB->Select("SELECT id FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); } if($user_id && $usesha512) { $salt = $this->app->DB->Select("SELECT salt FROM user WHERE id = '$user_id' LIMIT 1"); $sha512 = $this->app->DB->Select("SELECT passwordsha512 FROM user WHERE id = '$user_id' LIMIT 1"); if(empty($salt) && empty($sha512)) { $salt = hash('sha512',microtime(true)); $sha512 = hash('sha512',$passwordunescaped.$salt); $this->app->DB->Update("UPDATE user SET salt = '$salt', passwordsha512 = '$sha512' WHERE id = '$user_id' LIMIT 1"); } } } else { $user_id = ""; } } else { if (((crypt( $password, $encrypted ) == $encrypted) || (crypt( $passwordunescaped, $encrypted ) == $encrypted)) && $fehllogins<8) { if(isset($this->app->Conf->WFdbType) && $this->app->Conf->WFdbType=="postgre"){ $user_id = $this->app->DB->Select("SELECT id FROM \"user\" WHERE username='".$username."' AND activ='1' LIMIT 1"); } else { $user_id = $this->app->DB->Select("SELECT id FROM user WHERE username='".$username."' AND activ='1' LIMIT 1"); } if($user_id && $usesha512) { $salt = $this->app->DB->Select("SELECT salt FROM user WHERE id = '$user_id' LIMIT 1"); $sha512 = $this->app->DB->Select("SELECT passwordsha512 FROM user WHERE id = '$user_id' LIMIT 1"); if(empty($salt) && empty($sha512)) { $salt = hash('sha512',microtime(true)); $sha512 = hash('sha512',$passwordunescaped.$salt); $this->app->DB->Update("UPDATE user SET salt = '$salt', passwordsha512 = '$sha512' WHERE id = '$user_id' LIMIT 1"); } } } else { $user_id = ''; } } } //$password = substr($password, 0, 8); //TODO !!! besseres verfahren!! //pruefen ob extern login erlaubt ist!! // wenn keine externerlogin erlaubt ist und verbindung extern if($externlogin==0 && $localconnection==0) { $this->app->Tpl->Set('LOGINERRORMSG',"Es ist kein externer Login mit diesem Account erlaubt."); $this->app->Tpl->Parse('PAGE','updatelogin.tpl'); } else if(is_numeric($user_id)) { $this->app->DB->Delete("DELETE FROM useronline WHERE user_id='".$user_id."'"); if($this->session_id != ''){ $this->app->DB->Insert("INSERT INTO useronline (user_id, sessionid, ip, login, time) VALUES ('" . $user_id . "','" . $this->session_id . "','" . $_SERVER['REMOTE_ADDR'] . "','1',NOW())"); } else { $this->app->Tpl->Set('LOGINERRORMSG','Session ID can not be empty'); $this->app->Tpl->Parse('PAGE','updatelogin.tpl'); return; } $this->app->DB->Select("UPDATE user SET fehllogins=0 WHERE username='".$username."' LIMIT 1"); if(method_exists($this->app->User,'createCache')) { $this->app->User->createCache(); } header('Location: update.php?rand='.md5(mt_rand())); exit; } else if ($fehllogins>=8) { $this->app->Tpl->Set('LOGINERRORMSG',"Max. Anzahl an Fehllogins erreicht. Bitte wenden Sie sich an Ihren Administrator."); $this->app->Tpl->Parse('PAGE',"updatelogin.tpl"); } else { if(isset($this->app->Conf->WFdbType) && $this->app->Conf->WFdbType=="postgre") $this->app->DB->Select("UPDATE \"user\" SET fehllogins=fehllogins+1 WHERE username='".$username."'"); else $this->app->DB->Select("UPDATE user SET fehllogins=fehllogins+1 WHERE username='".$username."' LIMIT 1"); $this->app->Tpl->Set('LOGINERRORMSG',"Benutzername oder Passwort falsch."); $this->app->Tpl->Parse('PAGE',"updatelogin.tpl"); } } } function Logout($msg="",$logout=false) { setcookie('DBSELECTED',''); if($logout) $this->app->Tpl->Parse('PAGE',"sessiontimeout.tpl"); $username = $this->app->User->GetName(); $this->app->DB->Delete("DELETE FROM useronline WHERE user_id='".$this->app->User->GetID()."'"); if(method_exists($this->app->User,'createCache')) { $this->app->User->createCache(); } session_destroy(); session_start(); session_regenerate_id(true); $_SESSION['database']=""; if(!$logout) { header("Location: ".$this->app->http."://".$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['REQUEST_URI']),'/')); exit; } //$this->app->Tpl->Set(LOGINERRORMSG,$msg); //$this->app->Tpl->Parse(PAGE,"updatelogin.tpl"); } function CreateAclDB() { } function mOTP($pin,$otp,$initsecret) { $maxperiod = 3*60; // in seconds = +/- 3 minutes $time=gmdate("U"); for($i = $time - $maxperiod; $i <= $time + $maxperiod; $i++) { $md5 = substr(md5(substr($i,0,-1).$initsecret.$pin),0,6); if($otp == $md5) { return(true); } } return(false); } } class UpdateUser { var $cache; function __construct(&$app) { $this->app = &$app; } function GetID() { if(!empty($_COOKIE['CH42SESSION']) && $_COOKIE['CH42SESSION']!='') { $tmp = $_COOKIE['CH42SESSION']; } else { $tmp = session_id(); } if($tmp == '') { return 0; } if(!$this->cache || $this->cache['time'] +10 < microtime(true) || $this->cache['tmp'] != $tmp) { $this->cache = null; $user_id = $this->app->DB->Select("SELECT user_id FROM useronline WHERE sessionid='".$this->app->DB->real_escape_string($tmp)."' AND login ='1'"); if($user_id) { $this->cache['user_id'] = $user_id; $this->cache['tmp'] = $tmp; $this->cache['time'] = microtime(true); } return $user_id; } return $this->cache['user_id']; } function GetType() { if($this->GetID()<=0){ return $this->app->Conf->WFconf['defaultgroup']; } if(isset($this->cache['type'])) { return $this->cache['type']; } $type = $this->app->DB->Select("SELECT type FROM user WHERE id='".$this->GetID()."'"); $this->cache['type'] = $type; if($type=="") { $type = $this->app->Conf->WFconf['defaultgroup']; $this->cache['type'] = $type; } return $type; } function GetParameter($index) { $id = $this->GetID(); if($index!="") { $settings = $this->app->DB->Select("SELECT settings FROM user WHERE id='$id' LIMIT 1"); $settings = unserialize($settings); if(isset($settings[$index])) return $settings[$index]; } } // value koennen beliebige Datentypen aus php sein (serialisiert) function SetParameter($index,$value) { $id = $this->GetID(); if($index!="" && isset($value)) { $settings = $this->app->DB->Select("SELECT settings FROM user WHERE id='$id' LIMIT 1"); $settings = unserialize($settings); $settings[$index] = $value; $settings = serialize($settings); $this->app->DB->Update("UPDATE user SET settings='$settings' WHERE id='$id' LIMIT 1"); $this->cache = null; } } function GetUsername() { if(isset($this->cache['username'])) { return $this->cache['username']; } $username = $this->app->DB->Select("SELECT username FROM user WHERE id='".$this->GetID()."'"); $this->cache['username'] = $username; return $username; } function GetDescription() { return $this->GetName(); } function GetMail() { return $this->app->DB->Select("SELECT email FROM adresse WHERE id='".$this->GetAdresse()."'"); } function GetName() { if(isset($this->cache['name']))return $this->cache['name']; $name = $this->app->DB->Select("SELECT name FROM adresse WHERE id='".$this->GetAdresse()."'"); $this->cache['name'] = $name; return $name; } function GetSprachen() { $sprachen = $this->app->DB->Select("SELECT sprachen FROM user WHERE id = '".(int)$this->GetId()."' LIMIT 1"); if($sprachen) { $sprachena = explode(';',str_replace(',',';',$sprachen)); foreach($sprachena as $sprache) { $sprache = trim($sprache); if($sprache != '')$ret[] = $sprache; } if(isset($ret)) { return $ret; } } return array('german','english'); } function GetSprache() { $sprachen = $this->GetSprachen(); return $sprachen[0]; } function GetAdresse() { if(isset($this->cache['adresse'])) { return $this->cache['adresse']; } $adresse = $this->app->DB->Select("SELECT adresse FROM user WHERE id='".$this->GetID()."'"); $this->cache['adresse'] = $adresse; return $adresse; } function GetProjektleiter() { $result = $this->app->DB->SelectArr("SELECT parameter FROM adresse_rolle WHERE subjekt='Projektleiter' AND (bis='0000-00-00' OR bis < NOW()) AND adresse='".$this->app->User->GetAdresse()."'"); if(!empty($result)){ return true; } return false; } function DefaultProjekt() { $adresse = $this->GetAdresse(); $projekt = $this->app->DB->Select("SELECT projekt FROM adresse WHERE id='".$adresse."'"); if($projekt <=0) $projekt = $this->app->DB->Select("SELECT standardprojekt FROM firma WHERE id='".$this->app->User->GetFirma()."' LIMIT 1"); return $projekt; } function GetEmail() { $adresse = $this->GetAdresse(); return $this->app->DB->Select("SELECT email FROM adresse WHERE id='".$adresse."'"); } function GetFirma() { return 1; } function GetFirmaName() { if(isset($this->cache['firmaname']))return $this->cache['firmaname']; $name = $this->app->DB->Select("SELECT name FROM firma WHERE id='".$this->GetFirma()."'"); $this->cache['firmaname'] = $name; return $name; } function GetField($field) { return $this->app->DB->Select("SELECT $field FROM user WHERE id='".$this->GetID()."'"); } } class UpdateThemeTemplate { var $NAME; //Name des Templates var $PATH; //PFAD des Templates var $parsed; //Zustand var $ORIGINAL; //Parse - Text Vorlage var $VARS; //assoziatives Array mit Variablennamen als Index var $Elements; var $vararraycreated; function __construct($_path, $_file){ $this->vararraycreated = false; $this->PATH=$_path; $this->NAME=$_file; $this->readFile(); } function readFile() { $_path = $this->PATH; $_file = $this->NAME; $fp=@fopen($_path.$_file,"r"); if($fp){ if(filesize($_path.$_file)>0) $contents = fread ($fp, filesize($_path.$_file)); fclose($fp); }else die($_path.$_file.' not found'); $this->ORIGINAL=isset($contents)?$contents:''; //$this->CreateVarArray(); } function CreateVarArray(){ $this->vararraycreated = true; $this->SetVar('',''); $pattern = '/((\[[A-Z0-9_]+\]))/'; preg_match_all($pattern,$this->ORIGINAL,$matches, PREG_OFFSET_CAPTURE); //TODO Parser umbauen, damit Variablen nicht doppelt genommen werden. if(count($matches[0]) > 0) { $cmatches = count($matches[0]); for($i=0;$i<$cmatches;$i++) { $this->Elements[$i]['before'] = substr($this->ORIGINAL, $i==0?0:($matches[0][$i-1][1] +strlen($matches[0][$i-1][0]) ), $matches[0][$i][1] - ($i==0 ?0 : ($matches[0][$i-1][1]+strlen($matches[0][$i-1][0])) ) ); $this->Elements[$i]['el'] = $matches[0][$i][0]; $this->Elements[$i]['el'] = str_replace('[','',$this->Elements[$i]['el']); $this->Elements[$i]['el'] = str_replace(']','',$this->Elements[$i]['el']); if($i > 0)$this->Elements[$i-1]['nach'] = $this->Elements[$i]['before']; } $this->Elements[count($matches[0])-1]['nach'] = substr($this->ORIGINAL, $matches[0][count($matches[0])-1][1]+strlen($matches[0][count($matches[0])-1][0])); } $cmatches = count($matches[0]); for($i=0;$i<$cmatches;$i++) { $matches[0][$i][0] = str_replace('[','',$matches[0][$i][0]); $matches[0][$i][0] = str_replace(']','',$matches[0][$i][0]); if(!isset($this->VARS[$matches[0][$i][0]])) { $this->SetVar($matches[0][$i][0],''); } } } function Parsed() { return 1; } function AddVar($_var, $_value){ $this->VARS[$_var]=$this->VARS[$_var].$_value; } function SetVar($_var, $_value){ $this->VARS[$_var]=$_value; } } /*********************** Class PcmsTemplate ****************************/ /// Main Parser for building the html skin (gui) class UpdateTemplateParser { var $TEMPLATELIST; var $VARARRAY; var $VARVARARRAY; function __construct(&$app){ $this->app = &$app; $this->TEMPLATELIST=null; $this->VARVARARRAY = null; $this->ReadTemplatesFromPath(''); } function GetVars($tplfile) { $fp=@fopen($tplfile,"r"); if($fp){ $contents = fread ($fp, filesize($tplfile)); fclose($fp); } $suchmuster = '/[\[][A-Z_]+[\]]/'; preg_match_all($suchmuster, $contents, $treffer); return $treffer[0]; } function ResetParser() { unset($this->TEMPLATELIST); unset($this->VARARRAY); } function ReadTemplatesFromPath($_path){ if(is_file(__DIR__.'/update.tpl')) { $this->TEMPLATELIST['update.tpl'] = new UpdateThemeTemplate(__DIR__.'/','update.tpl'); }else die(__DIR__.'/update.tpl nicht gefunden'); if(is_file(__DIR__.'/updatelogin.tpl')) { $this->TEMPLATELIST['updatelogin.tpl'] = new UpdateThemeTemplate(__DIR__.'/','updatelogin.tpl'); }else die(__DIR__.'/updatelogin.tpl nicht gefunden'); } function CreateVarArray(){ foreach($this->TEMPLATELIST as $template=>$templatename){ if(count($this->TEMPLATELIST[$template]->VARS) > 0){ foreach($this->TEMPLATELIST[$template]->VARS as $key=>$value){ $this->VARARRAY[$key]=$value; } } } } function ShowVariables(){ foreach($this->VARARRAY as $key=>$value) echo "<b>$key =></b>".htmlspecialchars($value)."<br>"; } function ParseVariables($text){ foreach($this->VARARRAY as $key=>$value) { if($key=!"") $text = str_replace('['.$key.']',$value,$text); } // fill empty vars return $text; } function ShowTemplates(){ foreach ($this->TEMPLATELIST as $key=> $value){ foreach ($value as $key1=> $text){ if(!is_array($text))echo "$key ".htmlspecialchars($text)."<br>"; if(is_array($text))foreach($text as $key2=>$value2) echo $key2." ".$value2; } echo "<br><br>"; } } function Set($_var,$_value, $variable = false){ $this->VARARRAY[$_var]=$_value; if($variable)$this->VARVARARRAY[$_var] = $variable;} function Add($_var,$_value, $variable = false){ $this->VARARRAY[$_var]=isset($this->VARARRAY[$_var])?$this->VARARRAY[$_var].$_value:$_value; if($variable)$this->VARVARARRAY[$_var] = $variable; } function Get($_var){ return $this->VARARRAY[$_var]." "; } function Output($_template) { echo $this->app->erp->ClearDataBeforeOutput($this->Parse("",$_template,1)); } function OutputAsString($_template) { return $this->app->erp->ClearDataBeforeOutput($this->Parse("",$_template,1)); } function Parse($_var, $_template,$return=0){ //$this->AjaxParse(); //if($_var == 'PAGE')$this->app->erp->ParseMenu(); $this->ParseVarVars(); if($_template!=""){ if(isset($this->TEMPLATELIST[$_template]) && !($this->TEMPLATELIST[$_template]->vararraycreated)) { $this->TEMPLATELIST[$_template]->CreateVarArray(); } //alle template variablen aufuellen mit den werten aus VARARRAY if(isset($this->TEMPLATELIST[$_template]) && isset($this->TEMPLATELIST[$_template]->VARS) && count($this->TEMPLATELIST[$_template]->VARS)>0){ foreach ($this->TEMPLATELIST[$_template]->VARS as $key=> $value){ $this->TEMPLATELIST[$_template]->SetVar($key,isset($this->VARARRAY[$key])?$this->VARARRAY[$key]:''); } //ORIGINAL auffuellen $tmptpl = $this->TEMPLATELIST[$_template]->ORIGINAL; foreach ($this->TEMPLATELIST[$_template]->VARS as $key=>$value){ if(!is_numeric($key) && $key!="") $tmptpl = str_replace("[".$key."]",$value, $tmptpl); } } else $tmptpl = ''; //aufgefuelltes ORIGINAL in $t_var add($_var,ORIGINAL) if($return==1) return $tmptpl; else $this->Add($_var,$tmptpl); } } function AddAndParse($_var, $_value, $_varparse, $_templateparse){ $this->Set($_var, $_value); $this->Parse($_varparse,$_templateparse); } function ParseVarVars() { $pattern = '/((\[[A-Z0-9_]+\]))/'; if(!empty($this->VARVARARRAY) && is_array($this->VARVARARRAY)) { foreach($this->VARVARARRAY as $k => $el) { preg_match_all($pattern,$this->VARARRAY[$k],$matches, PREG_OFFSET_CAPTURE); $cmatches = $matches[0]?count($matches[0]):0; for($i=0;$i<$cmatches;$i++) { $matches[0][$i][0] = str_replace('[','',$matches[0][$i][0]); $matches[0][$i][0] = str_replace(']','',$matches[0][$i][0]); if(isset($this->VARARRAY[$matches[0][$i][0]])) { $this->VARARRAY[$k] = str_replace('['.$matches[0][$i][0].']',$this->VARARRAY[$matches[0][$i][0]],$this->VARARRAY[$k]); } } unset($matches); } } } function FinalParse($_template){ $this->ParseVarVars(); if(isset($this->TEMPLATELIST[$_template]) && !($this->TEMPLATELIST[$_template]->vararraycreated)) { $this->TEMPLATELIST[$_template]->CreateVarArray(); } $print = $this->app->Secure->GetGET("print"); $printcontent = $this->app->Secure->GetGET("printcontent"); if($printcontent=="") $printcontent="TAB1"; if($print=="true") { $out = str_replace("[PRINT]",$this->VARARRAY[$printcontent],$this->TEMPLATELIST['print.tpl']->ORIGINAL); echo $out; exit; } if($_template!="" && isset($this->TEMPLATELIST[$_template]) && isset($this->TEMPLATELIST[$_template]->VARS)){ //alle template variablen aufuellen mit den werten aus VARARRAY if(count($this->TEMPLATELIST[$_template]->VARS)>0){ foreach ($this->TEMPLATELIST[$_template]->VARS as $key=> $value) { $this->TEMPLATELIST[$_template]->SetVar($key,(isset($this->VARARRAY[$key])?$this->VARARRAY[$key]:'')); } } } //ORIGINAL auffuellen $new = false; if($new) { //macht Noch Probleme $tmptpl = ''; if(!empty($this->TEMPLATELIST[$_template]->Elements)) { foreach($this->TEMPLATELIST[$_template]->Elements as $k) { $tmptpl .= $k['before']; if(!empty($this->TEMPLATELIST[$_template]->VARS[$k['el']])) { $tmptpl .= $this->TEMPLATELIST[$_template]->VARS[$k['el']]; } } $tmptpl .= $this->TEMPLATELIST[$_template]->Elements[count($this->TEMPLATELIST[$_template]->Elements)-1]['nach']; }else $tmptpl = $this->TEMPLATELIST[$_template]->ORIGINAL; }else { $tmptpl = $this->TEMPLATELIST[$_template]->ORIGINAL; if(count($this->TEMPLATELIST[$_template]->VARS)>0){ foreach ($this->TEMPLATELIST[$_template]->VARS as $key=>$value) { if($key!="") $tmptpl = str_replace("[".$key."]",$value, $tmptpl); } } if(count($this->VARARRAY)>0) foreach($this->VARARRAY as $key=>$value) { if($key!="") $tmptpl = str_replace('['.$key.']',$value,$tmptpl); } } $tmptpl = $this->app->erp->ClearDataBeforeOutput($tmptpl); return $tmptpl; } function AjaxParse() { } function KeywordParse() { foreach($this->TEMPLATELIST as $key=>$value) { foreach ($this->TEMPLATELIST[$key]->VARS as $var=>$tmp) if(strstr($var,"AJAX")) { echo $var; } } } } class UpdateApplication { var $ActionHandlerList; var $ActionHandlerDefault; public $Conf; protected $multidb; public function __construct($config, $group='') { session_cache_limiter('private'); @session_start(); $this->Conf= $config; if(file_exists(dirname(__DIR__) .'/conf/multidb.conf.php')) { $multidb = include dirname(__DIR__) .'/conf/multidb.conf.php'; if(!empty($multidb)) { $this->Conf->origDB = $this->Conf->WFdbname; foreach($multidb as $key => $value) { if(is_array($value)) { if(is_numeric($key) && !empty($value['dbname'])) { $this->multidb[] = [ 'dbname'=>$value['dbname'], 'dbhost'=>!empty($value['dbhost'])?$value['dbhost']:$this->Conf->WFdbhost, 'dbport'=>!empty($value['dbport'])?$value['dbport']:$this->Conf->WFdbport, 'dbuser'=>!empty($value['dbuser'])?$value['dbuser']:$this->Conf->WFdbuser, 'dbpass'=>!empty($value['dbpass'])?$value['dbpass']:$this->Conf->WFdbpass, 'description'=>!empty($value['description'])?$value['description']:$value['dbname'], 'cronjob'=>!empty($value['cronjob'])?$value['cronjob']:0 ]; }elseif(!is_numeric($key)){ $this->multidb[] = [ 'dbname'=>!empty($value['dbname'])?$value['dbname']:$key, 'dbhost'=>!empty($value['dbhost'])?$value['dbhost']:$this->Conf->WFdbhost, 'dbport'=>!empty($value['dbport'])?$value['dbport']:$this->Conf->WFdbport, 'dbuser'=>!empty($value['dbuser'])?$value['dbuser']:$this->Conf->WFdbuser, 'dbpass'=>!empty($value['dbpass'])?$value['dbpass']:$this->Conf->WFdbpass, 'description'=>!empty($value['description'])?$value['description']:(!empty($value['dbname'])?$value['dbname']:$key), 'cronjob'=>!empty($value['cronjob'])?$value['cronjob']:0 ]; } }else{ if(is_numeric($key)) { $this->multidb[] = [ 'dbname'=>$value, 'dbhost'=>$this->Conf->WFdbhost, 'dbport'=>$this->Conf->WFdbport, 'dbuser'=>$this->Conf->WFdbuser, 'dbpass'=>$this->Conf->WFdbpass, 'description'=>$value, 'cronjob'=>0 ]; }else{ $this->multidb[] = [ 'dbname'=>$key, 'dbhost'=>$this->Conf->WFdbhost, 'dbport'=>$this->Conf->WFdbport, 'dbuser'=>$this->Conf->WFdbuser, 'dbpass'=>$this->Conf->WFdbpass, 'description'=>$key, 'cronjob'=>0 ]; } } } } } if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=="on") $this->http = "https"; else $this->http = "http"; $this->Secure = new UpdateSecure($this); // empty $_GET, and $_POST so you // have to need the secure layer always $this->Tpl = new UpdateTemplateParser($this); $this->User = new UpdateUser($this); $this->acl = new UpdateAcl($this); $this->WF = new UpdatephpWFAPI($this); $this->String = new UpdateWawiString(); $this->BuildNavigation = true; $this->DB = new UpdateDB($this->Conf->WFdbhost,$this->Conf->WFdbname,$this->Conf->WFdbuser,$this->Conf->WFdbpass,$this,$this->Conf->WFdbport); $this->Tpl->ReadTemplatesFromPath(''); } public function getDbs() { $ret = []; $ret[$this->Conf->WFdbname] = $this->Conf->WFdbname; if(!empty($this->multidb)) { foreach($this->multidb as $key => $value) { if($this->Conf->WFdbname !== $value['dbname']){ $ret[$value['dbname']] = $value['description']; }elseif(!empty($value['description']) && $value['description'] !== $this->Conf->WFdbname){ $ret[$this->Conf->WFdbname] = $value['description']; } } } return $ret; } public function getCronjobDbs() { $ret = []; if(!empty($this->multidb)) { $nocron = []; foreach($this->multidb as $key => $value) { if($value['cronjob']){ $ret[] = $value['dbname']; }else{ $nocron[] = $value['dbname']; } } if(empty($ret[$this->Conf->WFdbname]) && empty($nocron[$this->Conf->WFdbname])) { $ret[] = $this->Conf->WFdbname; } }else{ $ret[] = $this->Conf->WFdbname; } return $ret; } public function changeDbConf($dbname) { if(empty($dbname)) { return false; } if($this->Conf->WFdbname === $dbname) { return false; } if(!empty($this->multidb)) { foreach($this->multidb as $value) { if($value['dbname'] === $dbname) { $this->Conf->WFdbname = $dbname; $this->Conf->WFdbhost = $value['dbhost']; $this->Conf->WFdbport = $value['dbport']; $this->Conf->WFdbuser = $value['dbuser']; $this->Conf->WFdbpass = $value['dbpass']; $this->DB = new DB($this->Conf->WFdbhost,$this->Conf->WFdbname,$this->Conf->WFdbuser,$this->Conf->WFdbpass,$this,$this->Conf->WFdbport); return true; } } } return false; } function __destruct() { $this->DB->Close(); } function ActionHandlerInit(&$caller) { $this->caller = &$caller; } function ActionHandler($command,$function) { $this->ActionHandlerList[$command]=$function; } function DefaultActionHandler($command) { $this->ActionHandlerDefault=$command; } function ActionHandlerListen(&$app) { $fkt = ''; $action = $app->Secure->GetGET("action","alpha"); if($action!="") { if(isset($this->ActionHandlerList[$action]))$fkt = $this->ActionHandlerList[$action]; } else { if(empty($this->ActionHandlerDefault) && isset($this->ActionHandlerList['list'])) { if(empty($action))$app->Secure->GET['action'] = 'list'; $this->ActionHandlerDefault = 'list'; } if(isset($this->ActionHandlerDefault))$fkt = $this->ActionHandlerList[$this->ActionHandlerDefault]; } // check permissions if($fkt)@$this->caller->$fkt(); } } class UpdatePlayer { public $DefautTemplates; public $DefautTheme; /** @var UpdateApplication $app */ public $app; function __construct() { $this->DefautTemplates='defaulttemplates'; $this->DefautTheme='default'; } /** * @param UpdateSession $sessionObj */ function Run($sessionObj) { $this->app = $sessionObj->app; // play application only when layer 2 said that its ok if(!$sessionObj->GetCheck()) { if($sessionObj->reason==='PLEASE_LOGIN') { $action = 'login'; $this->app->Secure->GET['action']='login'; } else { $action = 'login'; } } else { $action = $this->app->Secure->GetGET('action','alpha'); } $this->app->Tpl->Set('YEAR',date('Y')); $this->app->Tpl->Set('BENUTZER',$this->app->User->GetName()); //$this->app->Tpl->Set('REVISION',$this->app->erp->Revision(). " (".$this->app->erp->Branch().")"); //$this->app->Tpl->Set('REVISIONID',$this->app->erp->RevisionPlain()); //$this->app->Tpl->Set('BRANCH',$this->app->erp->Branch()); $this->app->Tpl->Set( 'LIZENZHINWEIS',' <a href="https://xentral.com/lizenzhinweis" target="_blank">Lizenzhinweis</a>' ); switch($action) { case 'login': $this->app->Tpl->Set('UEBERSCHRIFT',"xentral · Enterprise Warehouse Management"); $this->app->acl->Login(); echo $this->app->Tpl->FinalParse('update.tpl'); break; case 'ajax': $data = null; $WAWISION['host']=XENTRAL_UPDATE_HOST; $WAWISION['port']="443"; $cmd = $this->app->Secure->GetGET('cmd'); switch($cmd){ case 'checkforupdate': $this->app->erp->setMaintainance(true); $myUpd = new UpgradeClient($WAWISION, $this->app); $_data = $myUpd->CheckFiles(true); if(empty($_data) || (is_string($_data) && strpos($_data, 'ERROR') === 0)) { $_data = $myUpd->CheckFiles(true); } if(is_string($_data) && strpos($_data, 'ERROR') === 0) { $this->app->erp->setMaintainance(false); $data['error'] = $_data; } else { if(isset($_data['download']) && count($_data['download']) > 0) { $files = $_data['download']; $myUpd->DownloadFile($files); $_data = $myUpd->CheckFiles(true); if(isset($_data['download']) && count($_data['download']) > 0) { $files = $_data['download']; $myUpd->DownloadFile($files); $_data = $myUpd->CheckFiles(true); } elseif(empty($_data['copy'])) { $_data = $myUpd->CheckFiles(true); } if(!isset($_data['download']) || count($_data['download']) == 0) { $data['reload'] = 1; } } if(isset($_data['copy']) && count($_data['copy']) > 0) { $files = $_data['copy']; $data3 = $myUpd->CopyFile($files); $_data = $myUpd->CheckFiles(true); if(!isset($_data['copy']) || count($_data['copy']) == 0) { $data['reload'] = 1; if(function_exists('opcache_invalidate')) { opcache_invalidate(__FILE__); opcache_invalidate(__DIR__ . '/update.tpl'); } } } } break; case 'changeversion': $version = $this->app->Secure->GetPOST('version'); if($version) { $WAWISION['versionname'] = $version; $myUpd = new UpgradeClient($WAWISION, $this->app); $data['version'] = $myUpd->ChangeVersion(); } else { $data['error']= 'Fehler: Keine Version'; } break; case 'checkfiles': $version = $this->app->Secure->GetPOST('version'); if($version) { $WAWISION['versionname'] = $version; $myUpd = new UpgradeClient($WAWISION, $this->app); $data = $myUpd->CheckFiles(); } else { $data['error'] = 'Fehler: Keine Version'; } break; case 'checkfileszip': $version = $this->app->Secure->GetPOST('version'); if($version){ $WAWISION['versionname'] = $version; $myUpd = new UpgradeClient($WAWISION, $this->app); $_data = $myUpd->CheckFiles(); $data['zip'] = 0; $data['copy'] = isset($_data['copy']) && isset($_data['copy'][0]) ? count($_data['copy']) : 0; $data['download'] = isset($_data['download']) && isset($_data['download'][0]) ? count($_data['download']) : 0; if($data['download'] > 500) { $WAWISION['versionname'] = $version; $myUpd = new UpgradeClient($WAWISION, $this->app); $zipResonse = $myUpd->downloadZips(); if(is_array($zipResonse)) { $data = array_merge($data, $zipResonse); } } } else { $data = 'Fehler: Keine Version'; } break; case 'checkfiles2': $version = $this->app->Secure->GetPOST('version'); if($version) { $WAWISION['versionname'] = $version; $myUpd = new UpgradeClient($WAWISION, $this->app); $_data = $myUpd->CheckFiles(); $data['copy'] = isset($_data['copy']) && isset($_data['copy'][0])?count($_data['copy']):0; $data['download'] = isset($_data['download']) && isset($_data['download'][0])?count($_data['download']):0; if(!empty($_data['FileError'])) { $data['FileError'] = $_data['FileError']; } if(!empty($_data['FolderError'])) { $data['FolderError'] = $_data['FolderError']; } if(isset($_data['error'])){ $data['error'] = $_data['error']; } //$data = 'download '.(isset($data['download']) && isset($data['download'][0])?count($data['download']).' :'.$data['download'][0]['file']:0).' copy '.(isset($data['copy']) && isset($data['copy'][0])?count($data['copy']).' :'.$data['copy'][0]['file']:0); } else { $data = 'Fehler: Keine Version'; } break; case 'downloadfiles2': $version = $this->app->Secure->GetPOST('version'); if($version) { $WAWISION['versionname'] = $version; $myUpd = new UpgradeClient($WAWISION, $this->app); $files = false; if($version) { $data2 = $myUpd->CheckFiles(); if(isset($data2['download']))$files = $data2['download']; } if($version && $files) { $data3 = $myUpd->DownloadFile($files); $data['todownload'] = (isset($data3['todownload']) && is_array($data3['todownload']))?count($data3['todownload']):0; } else { $data['todownload'] = null; } } else{ $data['error'] = 'Keine Version'; } break; case 'downloadfiles': $version = $this->app->Secure->GetPOST('version'); if($version) { $WAWISION['versionname'] = $version; $myUpd = new UpgradeClient($WAWISION, $this->app); $files = json_decode(json_encode($this->app->Secure->GetPOST('files')),true); if($version && !$files) { $data2 = $myUpd->CheckFiles(); if(isset($data2['todownload']))$files = $data2['todownload']; } if($version && $files) { $data = $myUpd->DownloadFile($files); } else { $data['todownload'] = null; } } else{ $data['error'] = 'Keine Version'; } break; case 'copyfiles': $version = $this->app->Secure->GetPOST('version'); $WAWISION['versionname'] = $version; $myUpd = new UpgradeClient($WAWISION, $this->app); $files = json_decode(json_encode($this->app->Secure->GetPOST('files')),true); if($version && !$files) { $data2 = $myUpd->CheckFiles(); if(isset($data2['todownload'])) { $myUpd->DownloadFile($data2['todownload']); } elseif(isset($data2['tocopy'])) { $files = $data2['tocopy']; } } if($version && $files) { $data = $myUpd->CopyFile($files); } elseif(!$version) { $data = array('error'=>'Keine Version'); } else{ $data = array('error'=>'Keine Version'); } break; case 'copyfiles2': $version = $this->app->Secure->GetPOST('version'); $WAWISION['versionname'] = $version; $myUpd = new UpgradeClient($WAWISION, $this->app); $files = false; if($version) { $data2 = $myUpd->CheckFiles(); if(isset($data2['download'])) { $myUpd->DownloadFile($data2['download']); $data2 = $myUpd->CheckFiles(); } if(isset($data2['copy'])) { $files = $data2['copy']; } } if($version && $files){ $data3 = $myUpd->CopyFile($files); $data['tocopy'] = (isset($data3['tocopy']) && is_array($data3['tocopy']))?count($data3['tocopy']) : 0; if($data['tocopy'] === 0 && function_exists('opcache_reset')) { echo json_encode($data); opcache_reset(); exit; } } elseif(!$version) { $data = array('error'=>'Keine Version'); } else{ $data['tocopy'] = 0; } break; case 'upgradedb': $nummer = $this->app->Secure->GetPOST('nummer'); $tmp = $this->app->Conf->WFuserdata . '/tmp/' . $this->app->Conf->WFdbname.'/'; if(!empty($tmp)) { $oldTmp = dirname($tmp).'/'; foreach(['cache_services.php','cache_javascript.php','cache_classmap.php'] as $file) { // Aktuelle Cache-Dateien (MultiDB) löschen if(file_exists($tmp.$file)) { if(function_exists('opcache_invalidate')) { opcache_invalidate($tmp . $file, true); } @unlink($tmp.$file); } // Cache-Dateien aus Zeiten vor MultiDB löschen if(file_exists($oldTmp.$file)) { if(function_exists('opcache_invalidate')) { opcache_invalidate($oldTmp . $file, true); } @unlink($oldTmp.$file); } } } $className = 'erpAPI'; if(class_exists('erpAPICustom')) { $className = 'erpAPICustom'; } $this->app = new ApplicationCore(); $methodName = 'UpgradeDatabase'; try { $r = new ReflectionMethod($className, $methodName); $params = $r->getParameters(); $anzargs = count($params); } catch(Exception $e) { $anzargs = 0; } $obj = new $className($this->app); if($obj) { $this->app->erp = $obj; if(method_exists($obj,'GetTMP')) { $tmp = $obj->GetTMP(); if(!empty($tmp)) { $oldTmp = dirname($tmp).'/'; foreach(['cache_services.php','cache_javascript.php','cache_classmap.php'] as $file) { // Aktuelle Cache-Dateien (MultiDB) löschen if(file_exists($tmp.$file)) { if(function_exists('opcache_invalidate')) { opcache_invalidate($tmp . $file, true); } @unlink($tmp.$file); } // Cache-Dateien aus Zeiten vor MultiDB löschen if(file_exists($oldTmp.$file)) { if(function_exists('opcache_invalidate')) { opcache_invalidate($oldTmp . $file, true); } @unlink($oldTmp.$file); } } } } } if($anzargs > 0) { ob_start(); $data['nr'] = $obj->$methodName($nummer); ob_end_clean(); } else{ ob_start(); $data['nr'] = $obj->$methodName(); ob_end_clean(); } echo json_encode($data); try { $multiDbConfs = ConfigLoader::loadAll(); $dbname = $this->app->Conf->WFdbname; //$cronjobDbs = $this->app->getDbs(); //if(!empty($cronjobDbs)){ if(!empty($multiDbConfs)){ //$first = true; foreach ($multiDbConfs as $multiDbKey => $multiDbConf) { if($multiDbConf->WFdbname === $dbname) { continue; } $tmp = $this->app->Conf->WFuserdata . '/tmp/' . $multiDbConf->WFdbname.'/'; if(!empty($tmp)) { foreach(['cache_services.php','cache_javascript.php','cache_classmap.php'] as $file) { // Aktuelle Cache-Dateien (MultiDB) löschen if(file_exists($tmp.$file)) { if(function_exists('opcache_invalidate')) { opcache_invalidate($tmp . $file, true); } @unlink($tmp.$file); } } } unset($this->app); $this->app = new ApplicationCore($multiDbConf); $this->app->DB = new DB( $multiDbConf->WFdbhost, $multiDbConf->WFdbname, $multiDbConf->WFdbuser, $multiDbConf->WFdbpass, $this->app, $multiDbConf->WFdbport ); $obj->app->DB = $this->app->DB; //foreach ($cronjobDbs as $cronjobDb => $cronjobValue) { //if($first) { // $first = false; // continue; //} //$this->app->changeDbConf($cronjobDb); if($anzargs > 0){ ob_start(); $obj->app->DatabaseUpgrade->emptyTableCache(); $obj->$methodName($nummer); ob_end_clean(); } else{ ob_start(); $obj->app->DatabaseUpgrade->emptyTableCache(); $obj->$methodName(); ob_end_clean(); } if($anzargs > 0 && $nummer < 12) { $this->app->erp->setMaintainance(true); } else { $this->app->erp->setMaintainance(false); } $this->app->erp->SetKonfigurationValue('welcome_changelog_last_save', ''); $obj->SetKonfigurationValue('welcome_changelog_last_save', ''); } } } catch (Exception $e) { } if($anzargs > 0 && $nummer < 12) { $this->app->erp->setMaintainance(true, 'updatedb'); } else { $this->app->erp->setMaintainance(false, 'updatedb'); } $this->app->erp->SetKonfigurationValue('welcome_changelog_last_save', ''); exit; break; } echo json_encode($data); exit; break; default: $this->KopiereOrdner(dirname(__DIR__).'/www',dirname(__DIR__).'/www_oss'); $this->KopiereOrdner(dirname(__DIR__).'/phpwf',dirname(__DIR__).'/phpwf_oss'); $this->KopiereOrdner(dirname(__DIR__).'/version.php',dirname(__DIR__).'/version_oss.php'); if(empty($_GET['rand'])) { $rand = md5(mt_rand()); header('Location: update.php?rand='.$rand); exit; } $WAWISION['host']=XENTRAL_UPDATE_HOST; $WAWISION['port']='443'; $myUpd = new UpgradeClient($WAWISION, $this->app); $dateien = new Md5Dateien(dirname(__DIR__).'/www/'); $dateien2 = new Md5Dateien(dirname(__DIR__).'/phpwf/'); if(isset($dateien2->Dateien)) { if($dateien->Dateien && is_array($dateien->Dateien)) { $dateien->Dateien = array_merge($dateien->Dateien, $dateien2->Dateien); } else{ $dateien = $dateien2; } } $lines = []; $request['dateien'] = $dateien->Dateien; $funktions_ind = []; $funktions = []; if(!empty($dateien->Dateien) && is_array($dateien->Dateien)) { foreach($dateien->Dateien as $k => $v) { if( strtolower(substr($k,-4)) !== '.php' || strpos($k, '_custom') === false || strpos($k,'/vendor/') !== false ) { continue; } $datei = __DIR__.'/..'.$k; if(!file_exists($datei)) { continue; } $fh = fopen($datei, 'r'); if(!$fh) { continue; } $f_ind = -1; $i = -1; while(($line = fgets($fh)) !== false) { $i++; $lines[$i] = $line; if(!empty($funktions_ind) && !empty($funktions_ind[$k])) { foreach($funktions_ind[$k] as $k2 => $v2) { if($v2 + 5 >= $i) { $funktions[$k][$k2][] = $line; } } } if(strpos($line, 'function') === false) { continue; } $f_ind++; $newBorder = 0; for($j = $i - 1; $j >= 0; $j--) { if(strpos($lines[$j],'*') !== false) { $newBorder = $i - $j; } else{ break; } } $border = 5; if($newBorder > 5) { $border = $newBorder; if($border > 25) { $border = 25; } } for($j = $i-$border; $j <= $i; $j++) { if($j > -1) { $funktions[$k][$f_ind][] = $lines[$j]; } } $funktions_ind[$k][$f_ind] = $i; } if(isset($lines)) { unset($lines); } fclose($fh); } } $res = $myUpd->CheckVersionen(!empty($funktions)?$funktions:null); if(!empty($myUpd->errormsg)) { if(is_string($myUpd->errormsg)) { if($myUpd->errormsg === 'ERROR') { $myUpd->errormsg = 'Fehler: Die Lizenzdaten sind fehlerhaft / Lizenz abgelaufen'; } $res = '<b style="color:red;font-size:150%">Fehler: '.$myUpd->errormsg.'</b>'; } else{ $res = json_encode($myUpd->errormsg); } } if($res === 'ERROR') { $res = '<b style="color:red;font-size:150%">Fehler: Die Lizenzdaten sind fehlerhaft / Lizenz abgelaufen</b>'; } $this->app->Tpl->Add('PAGE',"<br><center>".$res."</center>"); echo $this->app->Tpl->FinalParse('update.tpl'); break; } } /** * @param string $quelle * @param string $ziel */ public function KopiereOrdner($quelle, $ziel){ if(!file_exists($quelle)) { return; } if(is_dir($quelle)) { if(!is_dir($ziel)&& !@mkdir($ziel) && !is_dir($ziel)) { return; } $handle = opendir($quelle); if(!$handle) { return; } $entries = []; while (false !== ($entry = readdir($handle))) { if($entry === '.' || $entry === '..') { continue; } $entries[] = $entry; } closedir($handle); if(empty($entries)) { return; } foreach($entries as $entry) { $this->KopiereOrdner(rtrim($quelle,'/').'/'.$entry, rtrim($ziel,'/').'/'.$entry); } return; } if(file_exists($ziel)) { return; } @copy($quelle, $ziel); } } if(!empty($intern)){ if(is_file(dirname(__DIR__).'/conf/main.conf.php')){ error_reporting(0); include_once dirname(__DIR__) . '/conf/main.conf.php'; $config = new Config(); $tmp = $config->WFuserdata . '/tmp/' . $config->WFdbname.'/'; $app = new UpdateerpooSystem($config); $player = new UpdatePlayer(); $player->KopiereOrdner(dirname(__DIR__).'/www',dirname(__DIR__).'/www_oss'); $player->KopiereOrdner(dirname(__DIR__).'/phpwf',dirname(__DIR__).'/phpwf_oss'); $player->KopiereOrdner(dirname(__DIR__).'/version.php',dirname(__DIR__).'/version_oss.php'); $WAWISION['host']= XENTRAL_UPDATE_HOST; $WAWISION['port']='443'; if(!empty($createversion)) { $WAWISION['version'] = $createversion; } $myUpd = new UpgradeClient($WAWISION, $app); $dateien = new Md5Dateien(dirname(__DIR__).'/www/'); $dateien2 = new Md5Dateien(dirname(__DIR__).'/phpwf/'); if(isset($dateien2->Dateien)) { if($dateien->Dateien && is_array($dateien->Dateien)) { $dateien->Dateien = array_merge($dateien->Dateien, $dateien2->Dateien); } else{ $dateien = $dateien2; } } $request['dateien'] = $dateien->Dateien; $funktions_ind = []; if(!empty($dateien->Dateien) && is_array($dateien->Dateien)) { foreach($dateien->Dateien as $k => $v) { if(!(strtolower(substr($k,-4)) === '.php' && strpos($k, '_custom') !== false)) { continue; } $datei = __DIR__.'/..'.$k; if(!file_exists($datei)) { continue; } $fh = fopen($datei, 'r'); if(!$fh) { continue; } $f_ind = -1; $i = -1; while(($line = fgets($fh)) !== false) { $i++; $lines[$i] = $line; if(!empty($funktions_ind) && !empty($funktions_ind[$k])) { foreach($funktions_ind[$k] as $k2 => $v2) { if($v2 + 5 >= $i) { $funktions[$k][$k2][] = $line; } } } if(strpos($line, 'function') !== false) { $f_ind++; for($j = $i-5; $j <= $i; $j++) { if($j > -1) { $funktions[$k][$f_ind][] = $lines[$j]; } } $funktions_ind[$k][$f_ind] = $i; } } if(isset($lines)) { unset($lines); } fclose($fh); } } $res = $myUpd->CheckVersionen(null,true); if(empty($res) || (is_string($res) && stripos($res,'Error') === 0) || !empty($res['error'])) { usleep(1000000); $res = $myUpd->CheckVersionen(null,true); } if(!empty($res['current_version'])) { $WAWISION['version'] = $res['current_version']; $myUpd = new UpgradeClient($WAWISION, $app); } elseif(!empty($res['version'])) { $WAWISION['version'] = $res['version']; } $res = $myUpd->CheckVersionen(null,true); if(empty($res) || (is_string($res) && stripos($res,'Error') === 0) || !empty($res['error'])) { usleep(1000000); $res = $myUpd->CheckVersionen(null,true); } if(!empty($res['current_version'] && !empty($res['version']) && $res['current_version'] !== $res['version'])) { if(empty($allowChangeVersion)) { echo 'Version '.$res['version'].' ist nicht kompatibel zur eingestellten '.$res['current_version'].": abgebrochen\r\n"; echo "benutzen Sie\n"; echo "php upgradesystem changeversion\n"; echo "um die Version umsustellen\n"; return; } $parameter['version']=$res['current_version']; $parameter['versionname']=$res['version']; if($parameter['versionname'] && $parameter['versionname'] != $parameter['version']) { $changeversion = $myUpd->Request('changeversion',$parameter); if(empty($changeversion) || (is_string($changeversion) && stripos($changeversion,'Error') === 0)) { usleep(1000000); $changeversion = $myUpd->Request('changeversion',$parameter); } if(!empty($changeversion)) { $res['version'] = $changeversion; } } } $version = ''; if(!empty($res['version'])) { $version = $res['version']; } elseif(!empty($res['error'])) { print_r($res['error']); echo "\n"; return; } $files = false; if($version) { $data2 = $myUpd->CheckFiles(); $maxRetries = 3; while((is_string($data2) && stripos($data2,'Error') === 0) || !isset($data2['download'])){ usleep(1000000); $data2 = $myUpd->CheckFiles(); $maxRetries--; if($maxRetries <= 0) { break; } } if(isset($data2['download'])){ echo 'Download Files: ...'; $myUpd->DownloadFile($data2['download'], 0, true); if(!is_file(dirname(__DIR__) . '/key.php') && !is_file(dirname(__DIR__) . '/download/key.php')) { $myUpd->DownloadFile($data2['download'], 0, true); } $data2 = $myUpd->CheckFiles(); $maxRetries = 3; while(is_string($data2) && stripos($data2,'Error') === 0) { usleep(1000000); $data2 = $myUpd->CheckFiles(); $maxRetries--; if($maxRetries <= 0) { break; } } if(!empty($data2['download'])) { $myUpd->DownloadFile($data2['download'], 0, true); $data2 = $myUpd->CheckFiles(); } echo "done\n"; } if((is_string($data2) && stripos($data2,'Error') === 0) || !isset($data2['copy'])) { usleep(1000000); $data2 = $myUpd->CheckFiles(); } if(isset($data2['copy'])) { $files = $data2['copy']; } } if($version && $files) { echo 'Copy Files...'; $data3 = $myUpd->CopyFile($files, 0); $data2 = $myUpd->CheckFiles(); if(isset($data2['download'])){ $myUpd->DownloadFile($data2['download'], 0, true); $data2 = $myUpd->CheckFiles(); if(isset($data2['copy'])) { $files = $data2['copy']; $data3 = $myUpd->CopyFile($files, 0); } } $data['tocopy'] = (isset($data3['tocopy']) && is_array($data3['tocopy']))?count($data3['tocopy']):0; echo "done\n"; } elseif(!$version) { $data = array('error'=>'Keine Version'); } else{ $data['tocopy'] = 0; } if(!empty($tmp)) { $tmpOld = dirname($tmp).'/'; foreach(['cache_services.php','cache_javascript.php','cache_classmap.php'] as $file) { if(file_exists($tmp.$file)) { if(function_exists('opcache_invalidate')) { opcache_invalidate($tmp . $file, true); } @unlink($tmp.$file); } if(file_exists($tmpOld.$file)) { if(function_exists('opcache_invalidate')) { opcache_invalidate($tmpOld . $file, true); } @unlink($tmpOld.$file); } } } if(file_exists(dirname(__DIR__).'/xentral_autoloader.php')){ $app = new ApplicationCore($config); } $className = 'erpAPI'; if(class_exists('erpAPICustom')) { $className = 'erpAPICustom'; } $methodName = 'UpgradeDatabase'; $nummer = 0; $r = new ReflectionMethod($className, $methodName); $params = $r->getParameters(); $anzargs = count($params); $obj = new $className($app); if($obj) { $app->erp = $obj; if(method_exists($obj,'GetTMP')) { $tmp = $obj->GetTMP(); $tmpOld = dirname($tmp).'/'; if(!empty($tmp)) { foreach(['cache_services.php','cache_javascript.php','cache_classmap.php'] as $file) { if(file_exists($tmp.$file)) { if(function_exists('opcache_invalidate')) { opcache_invalidate($tmp . $file, true); } @unlink($tmp.$file); } if(file_exists($tmpOld.$file)) { if(function_exists('opcache_invalidate')) { opcache_invalidate($tmpOld . $file, true); } @unlink($tmpOld.$file); } } } } } echo 'Upgrade DB...'; if($anzargs > 0) { ob_start(); $data['nr'] = $obj->$methodName($nummer); ob_end_clean(); } else { ob_start(); $data['nr'] = $obj->$methodName(); ob_end_clean(); } echo "done\n"; } } elseif(!empty($testapp)) { $WAWISION['host']=XENTRAL_UPDATE_HOST; $WAWISION['port']='443'; $myUpd = new UpgradeClient($WAWISION, $this->app); $result = $myUpd->TestModul($testapp); if(empty($result) || (is_string($result) && stripos($result,'Error') === 0)) { usleep(1000000); $result = $myUpd->TestModul($testapp); } } else{ if(is_file(dirname(__DIR__).'/conf/main.conf.php')) { include_once dirname(__DIR__).'/conf/main.conf.php'; if(empty($_GET['action'])) { header('Expires: Thu, 19 Nov 1981 08:52:00 GMT'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Pragma: no-cache'); } if(isset($_GET['action']) && $_GET['action'] === 'ajax' && isset($_GET['cmd']) && 'upgradedb' === $_GET['cmd']){ $config = new Config(); $tmp = $config->WFuserdata.'/tmp/'; foreach(['cache_services.php','cache_javascript.php','cache_classmap.php'] as $file) { if(file_exists($tmp . $file)) { if(function_exists('opcache_invalidate')) { opcache_invalidate($tmp . $file, true); } @unlink($tmp.$file); } if(file_exists($tmp . $config->WFdbname . '/' . $file)) { if(function_exists('opcache_invalidate')) { opcache_invalidate($tmp . $config->WFdbname . '/' . $file, true); } @unlink($tmp . $config->WFdbname . '/' . $file); } } $config = ConfigLoader::load(); } else { $config = new Config(); } $app = new UpdateerpooSystem($config); $session = new UpdateSession(); $session->Check($app); $player = new UpdatePlayer(); $player->Run($session); } }