mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2024-12-25 22:20:29 +01:00
5421 lines
170 KiB
PHP
5421 lines
170 KiB
PHP
<?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);
|
|
}
|
|
}
|