diff --git a/actions/admin/settings/200.aps.php b/actions/admin/settings/200.aps.php index 2fa444dd..3e2ff344 100644 --- a/actions/admin/settings/200.aps.php +++ b/actions/admin/settings/200.aps.php @@ -59,7 +59,7 @@ return array( 'type' => 'option', 'default' => '', 'option_mode' => 'multiple', - 'option_options' => array('gd' => 'GD Library', 'pcre' => 'PCRE', 'ioncube' => 'ionCube', 'ioncube loader' => 'ionCube Loader', 'curl' => 'curl', 'mcrypt' => 'mcrypt', 'imap' => 'imap'), + 'option_options' => array('gd' => 'GD Library', 'pcre' => 'PCRE', 'ioncube' => 'ionCube', 'ioncube loader' => 'ionCube Loader', 'curl' => 'curl', 'mcrypt' => 'mcrypt', 'imap' => 'imap', 'json' => 'json', 'ldap' => 'LDAP', 'hash' => 'hash', 'mbstring' => 'mbstring'), 'save_method' => 'storeSettingApsPhpExtensions', ), 'aps_php-function' => array( diff --git a/lib/classes/aps/class.ApsInstaller.php b/lib/classes/aps/class.ApsInstaller.php index 25979c9f..e9536cc2 100644 --- a/lib/classes/aps/class.ApsInstaller.php +++ b/lib/classes/aps/class.ApsInstaller.php @@ -32,6 +32,7 @@ class ApsInstaller extends ApsParser private $RealPath = ''; private $RootDir = ''; private $Hosts = ''; + private $aps_version = '1.0'; /** * constructor of class. setup some basic variables @@ -72,6 +73,8 @@ class ApsInstaller extends ApsParser $XmlContent = file_get_contents($this->RootDir . 'packages/' . $Row['Path'] . '/APP-META.xml'); $Xml = new SimpleXMLElement($XmlContent); + + $this->aps_version = isset($Xml->attributes()->version) ? (string)$Xml->attributes()->version : '1.0'; //check for unparseable xml data @@ -146,9 +149,16 @@ class ApsInstaller extends ApsParser $ReturnStatus = 0; // make configure-script executable - chmod($this->RealPath . $this->DomainPath . '/install_scripts/configure', 0755); + if($this->aps_version != '1.0') + { + $scriptname = (string)$Xml->service->provision->{'configuration-script'}['name']; + } else { + $scriptname = 'configure'; + } - $Return = safe_exec('php ' . escapeshellarg($this->RealPath . $this->DomainPath . '/install_scripts/configure') . ' install', $ReturnStatus); + chmod($this->RealPath . $this->DomainPath . '/install_scripts/'.$scriptname, 0755); + + $Return = safe_exec('php ' . escapeshellarg($this->RealPath . $this->DomainPath . '/install_scripts/'.$scriptname) . ' install', $ReturnStatus); if($ReturnStatus != 0) { @@ -214,7 +224,19 @@ class ApsInstaller extends ApsParser //remove permissions //drop database - $XmlDb = $Xml->requirements->children('http://apstandard.com/ns/1/db'); + if ($this->aps_version == '1.0') + { + // the good ole way + $XmlDb = $Xml->requirements->children('http://apstandard.com/ns/1/db'); + } + else + { + // since 1.1 + $Xml->registerXPathNamespace('db', 'http://apstandard.com/ns/1/db'); + + $XmlDb = new DynamicProperties; + $XmlDb->db->id = getXPathValue($Xml, '//db:id'); + } if($XmlDb->db->id) { @@ -278,6 +300,19 @@ class ApsInstaller extends ApsParser private function PrepareFiles($Xml, $Row, $Task) { + if($this->aps_version != '1.0') + { + $mapping = $Xml->service->provision->{'url-mapping'}->mapping; + $mapping_path = $Xml->service->provision->{'url-mapping'}->mapping['path']; + $mapping_url = $Xml->service->provision->{'url-mapping'}->mapping['url']; + } + else + { + $mapping = $Xml->mapping; + $mapping_path = $Xml->mapping['path']; + $mapping_url = $Xml->mapping['url']; + } + if($Task == TASK_INSTALL) { //FIXME truncate customer directory @@ -287,7 +322,7 @@ class ApsInstaller extends ApsParser //extract all files and chown them to the customer guid - if(self::ExtractZip($this->RootDir . 'packages/' . $Row['Path'] . '/' . $Row['Path'], $Xml->mapping['path'], $this->RealPath . $this->DomainPath . '/') == false + if(self::ExtractZip($this->RootDir . 'packages/' . $Row['Path'] . '/' . $Row['Path'], $mapping_path, $this->RealPath . $this->DomainPath . '/') == false || self::ExtractZip($this->RootDir . 'packages/' . $Row['Path'] . '/' . $Row['Path'], 'scripts', $this->RealPath . $this->DomainPath . '/install_scripts/') == false) { $this->db->query('UPDATE `' . TABLE_APS_INSTANCES . '` SET `Status` = ' . INSTANCE_ERROR . ' WHERE `ID` = ' . $this->db->escape($Row['InstanceID'])); @@ -319,7 +354,7 @@ class ApsInstaller extends ApsParser //recursive mappings - self::PrepareMappings($Xml->mapping, $Xml->mapping['url'], $this->RealPath . $this->DomainPath . '/'); + self::PrepareMappings($mapping, $mapping_url, $this->RealPath . $this->DomainPath . '/'); return true; } @@ -336,34 +371,37 @@ class ApsInstaller extends ApsParser //check for special PHP permissions //must be done with xpath otherwise check not possible (XML parser problem with attributes) - $ParentMapping->registerXPathNamespace('p', 'http://apstandard.com/ns/1/php'); - $Result = $ParentMapping->xpath('p:permissions'); - - if($Result[0]['writable'] == 'true') + if($ParentMapping && $ParentMapping !== null) { - //fixing file permissions to writeable - - if(is_dir($Path)) + $ParentMapping->registerXPathNamespace('p', 'http://apstandard.com/ns/1/php'); + $Result = $ParentMapping->xpath('p:permissions'); + + if($Result[0]['writable'] == 'true') { - chmod($Path, 0775); + //fixing file permissions to writeable + + if(is_dir($Path)) + { + chmod($Path, 0775); + } + else + { + chmod($Path, 0664); + } } - else + + if($Result[0]['readable'] == 'false') { - chmod($Path, 0664); - } - } - - if($Result[0]['readable'] == 'false') - { - //fixing file permissions to non readable - - if(is_dir($Path)) - { - chmod($Path, 0333); - } - else - { - chmod($Path, 0222); + //fixing file permissions to non readable + + if(is_dir($Path)) + { + chmod($Path, 0333); + } + else + { + chmod($Path, 0222); + } } } @@ -373,18 +411,20 @@ class ApsInstaller extends ApsParser putenv('WEB_' . $EnvVariable . '_DIR=' . $Path); //resolve deeper mappings - - foreach($ParentMapping->mapping as $Mapping) + if($ParentMapping && $ParentMapping !== null) { - //recursive check of other mappings - - if($Url == '/') + foreach($ParentMapping->mapping as $Mapping) { - self::PrepareMappings($Mapping, $Url . $Mapping['url'], $Path . $Mapping['url']); - } - else - { - self::PrepareMappings($Mapping, $Url . '/' . $Mapping['url'], $Path . '/' . $Mapping['url']); + //recursive check of other mappings + + if($Url == '/') + { + self::PrepareMappings($Mapping, $Url . $Mapping['url'], $Path . $Mapping['url']); + } + else + { + self::PrepareMappings($Mapping, $Url . '/' . $Mapping['url'], $Path . '/' . $Mapping['url']); + } } } } @@ -434,8 +474,23 @@ class ApsInstaller extends ApsParser private function PrepareDatabase($Xml, $Row, $Task) { global $db_root; + $XmlDb = $Xml->requirements->children('http://apstandard.com/ns/1/db'); + if ($this->aps_version == '1.0') + { + // the good ole way + $XmlDb = $Xml->requirements->children('http://apstandard.com/ns/1/db'); + } + else + { + // since 1.1 + $Xml->registerXPathNamespace('db', 'http://apstandard.com/ns/1/db'); + + $XmlDb = new DynamicProperties; + $XmlDb->db->id = getXPathValue($Xml, '//db:id'); + } + if($XmlDb->db->id) { //database management diff --git a/lib/classes/aps/class.ApsParser.php b/lib/classes/aps/class.ApsParser.php index bf7f0969..989ac2e5 100644 --- a/lib/classes/aps/class.ApsParser.php +++ b/lib/classes/aps/class.ApsParser.php @@ -38,6 +38,7 @@ class ApsParser private $settings = array(); private $db = false; private $RootDir = ''; + private $aps_version = '1.0'; /** * Constructor of class, setup basic variables needed by the class @@ -988,14 +989,26 @@ class ApsParser if($Xml == false)continue; $Icon = './images/default.png'; + $this->aps_version = isset($Xml->attributes()->version) ? (string)$Xml->attributes()->version : '1.0'; + //show data and status of package - if($Xml->icon['path']) + if($this->aps_version != '1.0') { - $Icon = './packages/' . $Row2['Path'] . '/' . basename($Xml->icon['path']); + $iconpath = $Xml->presentation->icon['path']; + $Summary = htmlspecialchars($Xml->presentation->summary); + } + else + { + $iconpath = $Xml->icon['path']; + $Summary = htmlspecialchars($Xml->summary); + } + + if($iconpath) + { + $Icon = './packages/' . $Row2['Path'] . '/' . basename($iconpath); } - $Summary = $Xml->summary; $Fieldname = $lng['aps']['version']; $Fieldvalue = $Xml->version . ' (Release ' . $Xml->release . ')'; eval("\$Data.=\"" . getTemplate("aps/data") . "\";"); @@ -1345,16 +1358,36 @@ class ApsParser { $Error = array(); + $this->aps_version = isset($Xml->attributes()->version) ? (string)$Xml->attributes()->version : '1.0'; + //check alot of stuff if package is supported //php modules - $XmlPhp = $Xml->requirements->children('http://apstandard.com/ns/1/php'); + if ($this->aps_version == '1.0') + { + // the good ole way + $XmlPhp = $Xml->requirements->children('http://apstandard.com/ns/1/php'); + } + else + { + // since 1.1 + $Xml->registerXPathNamespace('php', 'http://apstandard.com/ns/1/php'); + + $XmlPhp = new DynamicProperties; + $XmlPhp->extension = getXPathValue($Xml, '//php:extension', false); + $XmlPhp->function = getXPathValue($Xml, '//php:function', false); + } if($XmlPhp->extension) { $ExtensionsLoaded = get_loaded_extensions(); foreach($XmlPhp->extension as $Extension) { + if(strtolower($Extension) == 'php') + { + continue; + } + if(!in_array($Extension, $ExtensionsLoaded) && !self::CheckException('php', 'extension', $Extension)) { @@ -1389,6 +1422,11 @@ class ApsParser ); foreach($PhpValues as $Value) { + if ($this->aps_version != '1.0') + { + $XmlPhp->{$Value} = getXPathValue($Xml, '//php:'.$Value); + } + if($XmlPhp->{$Value}) { if(self::TrueFalseIniGet($Value) != $XmlPhp->{$Value} @@ -1399,6 +1437,11 @@ class ApsParser } } + if ($this->aps_version != '1.0') + { + $XmlPhp->{'post-max-size'} = getXPathValue($Xml, '//php:post-max-size'); + } + if($XmlPhp->{'post-max-size'}) { if(self::PhpMemorySizeToBytes(ini_get('post_max_size')) < intval($XmlPhp->{'post-max-size'}) @@ -1408,6 +1451,11 @@ class ApsParser } } + if ($this->aps_version != '1.0') + { + $XmlPhp->{'memory-limit'} = getXPathValue($Xml, '//php:memory-limit'); + } + if($XmlPhp->{'memory-limit'}) { if(self::PhpMemorySizeToBytes(ini_get('memory_limit')) < intval($XmlPhp->{'memory-limit'}) @@ -1417,6 +1465,11 @@ class ApsParser } } + if ($this->aps_version != '1.0') + { + $XmlPhp->{'max-execution-time'} = getXPathValue($Xml, '//php:max-execution-time'); + } + if($XmlPhp->{'max-execution-time'}) { if(ini_get('max_execution_time') < intval($XmlPhp->{'max-execution-time'}) @@ -1450,7 +1503,21 @@ class ApsParser //database - $XmlDb = $Xml->requirements->children('http://apstandard.com/ns/1/db'); + if ($this->aps_version == '1.0') + { + // the good ole way + $XmlDb = $Xml->requirements->children('http://apstandard.com/ns/1/db'); + } + else + { + // since 1.1 + $Xml->registerXPathNamespace('db', 'http://apstandard.com/ns/1/db'); + + $XmlDb = new DynamicProperties; + $XmlDb->db->id = getXPathValue($Xml, '//db:id'); + $XmlDb->db->{'server-type'} = getXPathValue($Xml, '//db:server-type'); + $XmlDb->db->{'server-min-version'} = getXPathValue($Xml, '//db:server-min-version'); + } if($XmlDb->db->id) { @@ -1467,7 +1534,21 @@ class ApsParser //ASP.NET - $XmlAsp = $Xml->requirements->children('http://apstandard.com/ns/1/aspnet'); + if ($this->aps_version == '1.0') + { + // the good ole way + $XmlAsp = $Xml->requirements->children('http://apstandard.com/ns/1/aspnet'); + } + else + { + // since 1.1 + $Xml->registerXPathNamespace('aspnet', 'http://apstandard.com/ns/1/aspnet'); + + $XmlAsp = new DynamicProperties; + $XmlAsp->handler = getXPathValue($Xml, '//aspnet:handler'); + $XmlAsp->permissions = getXPathValue($Xml, '//aspnet:permissions'); + $XmlAsp->version = getXPathValue($Xml, '//aspnet:version'); + } if($XmlAsp->handler || $XmlAsp->permissions @@ -1478,7 +1559,19 @@ class ApsParser //CGI - $XmlCgi = $Xml->requirements->children('http://apstandard.com/ns/1/cgi'); + if ($this->aps_version == '1.0') + { + // the good ole way + $XmlCgi = $Xml->requirements->children('http://apstandard.com/ns/1/cgi'); + } + else + { + // since 1.1 + $Xml->registerXPathNamespace('cgi', 'http://apstandard.com/ns/1/cgi'); + + $XmlCgi = new DynamicProperties; + $XmlCgi->handler = getXPathValue($Xml, '//cgi:handler'); + } if($XmlCgi->handler) { @@ -1487,7 +1580,20 @@ class ApsParser //webserver modules - $XmlWebserver = $Xml->requirements->children('http://apstandard.com/ns/1/apache'); + if ($this->aps_version == '1.0') + { + // the good ole way + $XmlWebserver = $Xml->requirements->children('http://apstandard.com/ns/1/apache'); + } + else + { + // since 1.1 + $Xml->registerXPathNamespace('apache', 'http://apstandard.com/ns/1/apache'); + + $XmlWebserver = new DynamicProperties; + $XmlWebserver->{'required-module'} = getXPathValue($Xml, '//apache:required-module'); + $XmlWebserver->htaccess = getXPathValue($Xml, '//apache:htaccess'); + } if($XmlWebserver->{'required-module'}) { @@ -1527,7 +1633,21 @@ class ApsParser //validation against a charset not possible in current version - foreach($Xml->settings->group as $Group) + if ($this->aps_version == '1.0') + { + // the good ole way + $aps_settings_array = $Xml->settings->group; + } + else + { + // since 1.1 + $aps_settings_array = $Xml->{'global-settings'}->setting; + if(!is_array($aps_settings_array)) { + $aps_settings_array = $Xml->service->settings->group; + } + } + + foreach($aps_settings_array as $Group) { foreach($Group->setting as $Setting) { @@ -1544,13 +1664,16 @@ class ApsParser //check different errors/features in submappings - $Return = self::CheckSubmappings($Xml->mapping, $Xml->mapping['url']); + if ($this->aps_version == '1.0') + { + $Return = self::CheckSubmappings($Xml->mapping, $Xml->mapping['url']); - if(count($Return) != 0) - { - foreach($Return as $Value) + if(count($Return) != 0) { - if(!in_array($Value, $Error))$Error[] = $Value; + foreach($Return as $Value) + { + if(!in_array($Value, $Error))$Error[] = $Value; + } } } @@ -1616,28 +1739,57 @@ class ApsParser self::GetContentFromZip($Filename, 'APP-META.xml', $Destination . 'APP-META.xml'); //copy screenshots - - if($Xml->screenshot) + + if ($this->aps_version != '1.0') { - foreach($Xml->screenshot as $Screenshot) + $xml_screenshots = $Xml->presentation->screenshot;; + } + else + { + $xml_screenshots = $Xml->screenshot; + } + + + if($xml_screenshots) + { + foreach($xml_screenshots as $Screenshot) { self::GetContentFromZip($Filename, $Screenshot['path'], $Destination . basename($Screenshot['path'])); } } //copy icon - - if($Xml->icon['path']) + + if ($this->aps_version != '1.0') { - self::GetContentFromZip($Filename, $Xml->icon['path'], $Destination . basename($Xml->icon['path'])); + $xml_iconpath = $Xml->presentation->icon['path']; + } + else + { + $xml_iconpath = $Xml->icon['path']; + } + + if($xml_iconpath) + { + self::GetContentFromZip($Filename, $xml_iconpath, $Destination . basename($xml_iconpath)); } //copy license - - if($Xml->license - && $Xml->license->text->file) + + if ($this->aps_version != '1.0') { - self::GetContentFromZip($Filename, $Xml->license->text->file, $Destination . 'license.txt'); + $xml_license = $Xml->service->license; + } + else + { + $xml_license = $Xml->license; + } + + + if($xml_license + && $xml_license->text->file) + { + self::GetContentFromZip($Filename, $xml_license->text->file, $Destination . 'license.txt'); } //insert package to database @@ -2363,10 +2515,26 @@ class ApsParser if($Xml == false)return false; + $this->aps_version = isset($Xml->attributes()->version) ? (string)$Xml->attributes()->version : '1.0'; + //check all data fields of xml file against inut of customer + if ($this->aps_version == '1.0') + { + // the good ole way + $aps_settings_array = $Xml->settings->group; + } + else + { + // since 1.1 + $aps_settings_array = $Xml->{'global-settings'}->setting; + if(!is_array($aps_settings_array)) { + $aps_settings_array = $Xml->service->settings->group; + } + } + $Error = array(); - foreach($Xml->settings->group as $Group) + foreach($aps_settings_array as $Group) { foreach($Group->setting as $Setting) { @@ -2542,7 +2710,19 @@ class ApsParser //database required? - $XmlDb = $Xml->requirements->children('http://apstandard.com/ns/1/db'); + if ($this->aps_version == '1.0') + { + // the good ole way + $XmlDb = $Xml->requirements->children('http://apstandard.com/ns/1/db'); + } + else + { + // since 1.1 + $Xml->registerXPathNamespace('db', 'http://apstandard.com/ns/1/db'); + + $XmlDb = new DynamicProperties; + $XmlDb->db->id = getXPathValue($Xml, '//db:id'); + } if($XmlDb->db->id) { @@ -2664,10 +2844,19 @@ class ApsParser self::SetInstallationValue($PackageId, $CustomerId, 'main_location', ''); } - if($Xml->license) + if ($this->aps_version != '1.0') { - if($Xml->license['must-accept'] - && $Xml->license['must-accept'] == 'true') + $xml_license = $Xml->service->license; + } + else + { + $xml_license = $Xml->license; + } + + if($xml_license) + { + if($xml_license['must-accept'] + && $xml_license['must-accept'] == 'true') { if(isset($_POST['license']) && $_POST['license'] == 'true') @@ -2712,6 +2901,8 @@ class ApsParser if($Xml == false)return false; + $this->aps_version = isset($Xml->attributes()->version) ? (string)$Xml->attributes()->version : '1.0'; + //show notifcation if customer has reached his installation limit if($this->userinfo['aps_packages'] != '-1' @@ -2724,10 +2915,19 @@ class ApsParser //icon for package $Icon = './images/default.png'; - - if($Xml->icon['path']) + + if($this->aps_version != '1.0') { - $Icon = './packages/' . $Row['Path'] . '/' . basename($Xml->icon['path']); + $iconpath = $Xml->presentation->icon['path']; + } + else + { + $iconpath = $Xml->icon['path']; + } + + if($iconpath) + { + $Icon = './packages/' . $Row['Path'] . '/' . basename($iconpath); } //show error message if some input was wrong @@ -2761,7 +2961,7 @@ class ApsParser { if($Value) { - if($Row3['ID'] == $Value) + if($Row3['id'] == $Value) { $Temp.= ''; } @@ -2813,7 +3013,19 @@ class ApsParser //database required? - $XmlDb = $Xml->requirements->children('http://apstandard.com/ns/1/db'); + if ($this->aps_version == '1.0') + { + // the good ole way + $XmlDb = $Xml->requirements->children('http://apstandard.com/ns/1/db'); + } + else + { + // since 1.1 + $Xml->registerXPathNamespace('db', 'http://apstandard.com/ns/1/db'); + + $XmlDb = new DynamicProperties; + $XmlDb->db->id = getXPathValue($Xml, '//db:id'); + } if($XmlDb->db->id) { @@ -2831,8 +3043,22 @@ class ApsParser $Fieldvalue = $Temp; eval("\$Data.=\"" . getTemplate("aps/data") . "\";"); } + + if ($this->aps_version == '1.0') + { + // the good ole way + $aps_settings_array = $Xml->settings->group; + } + else + { + // since 1.1 + $aps_settings_array = $Xml->{'global-settings'}->setting; + if(!is_array($aps_settings_array)) { + $aps_settings_array = $Xml->service->settings->group; + } + } - foreach($Xml->settings->group as $Group) + foreach($aps_settings_array as $Group) { $GroupPrinted = false; foreach($Group->setting as $Setting) @@ -3015,16 +3241,25 @@ class ApsParser } } - if($Xml->license) + if ($this->aps_version != '1.0') + { + $xml_license = $Xml->service->license; + } + else + { + $xml_license = $Xml->license; + } + + if($xml_license) { $Temp = ''; - if($Xml->license['must-accept'] - && $Xml->license['must-accept'] == 'true') + if($xml_license['must-accept'] + && $xml_license['must-accept'] == 'true') { - if($Xml->license->text->name)$Temp.= $Xml->license->text->name . '
'; + if($xml_license->text->name)$Temp.= $xml_license->text->name . '
'; - if($Xml->license->text->file) + if($xml_license->text->file) { $Temp.= '