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.= '