summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2014-12-02 11:03:25 +0100
committerThomas Müller <thomas.mueller@tmit.eu>2014-12-04 11:40:33 +0100
commitc80ec91f281419e59b3fd2ce2668278e440d6768 (patch)
tree4200c178705818e9a61dc9141e5f6683c54ef840
parentba52c996cf81781d752748986c761667f59691a3 (diff)
downloadnextcloud-server-c80ec91f281419e59b3fd2ce2668278e440d6768.tar.gz
nextcloud-server-c80ec91f281419e59b3fd2ce2668278e440d6768.zip
switch to different parsing implementation to get xml attributes properly handled
-rw-r--r--lib/private/app/infoparser.php57
-rw-r--r--tests/data/app/expected-info.json16
-rw-r--r--tests/data/app/strange-types-info.json24
-rw-r--r--tests/data/app/strange-types-info.xml23
-rw-r--r--tests/data/app/valid-info.xml10
-rw-r--r--tests/lib/app/infoparser.php1
6 files changed, 75 insertions, 56 deletions
diff --git a/lib/private/app/infoparser.php b/lib/private/app/infoparser.php
index e220fb40df6..3d2b42765aa 100644
--- a/lib/private/app/infoparser.php
+++ b/lib/private/app/infoparser.php
@@ -47,7 +47,7 @@ class InfoParser {
if ($xml == false) {
return null;
}
- $array = json_decode(json_encode((array)$xml), TRUE);
+ $array = $this->xmlToArray($xml, false);
if (is_null($array)) {
return null;
}
@@ -86,4 +86,59 @@ class InfoParser {
return $array;
}
+
+ /**
+ * @param \SimpleXMLElement $xml
+ * @return array
+ */
+ function xmlToArray($xml) {
+ if (!$xml->children()) {
+ return (string)$xml;
+ }
+
+ $array = array();
+ foreach ($xml->children() as $element => $node) {
+ $totalElement = count($xml->{$element});
+
+ if (!isset($array[$element])) {
+ $array[$element] = "";
+ }
+ /**
+ * @var \SimpleXMLElement $node
+ */
+
+ // Has attributes
+ if ($attributes = $node->attributes()) {
+ $data = array(
+ '@attributes' => array(),
+ );
+ if (!count($node->children())){
+ $value = (string)$node;
+ if (!empty($value)) {
+ $data['@value'] = (string)$node;
+ }
+ } else {
+ $data = array_merge($data, $this->xmlToArray($node));
+ }
+ foreach ($attributes as $attr => $value) {
+ $data['@attributes'][$attr] = (string)$value;
+ }
+
+ if ($totalElement > 1) {
+ $array[$element][] = $data;
+ } else {
+ $array[$element] = $data;
+ }
+ // Just a value
+ } else {
+ if ($totalElement > 1) {
+ $array[$element][] = $this->xmlToArray($node);
+ } else {
+ $array[$element] = $this->xmlToArray($node);
+ }
+ }
+ }
+
+ return $array;
+ }
}
diff --git a/tests/data/app/expected-info.json b/tests/data/app/expected-info.json
index 9be6062220f..6da69fb9ad7 100644
--- a/tests/data/app/expected-info.json
+++ b/tests/data/app/expected-info.json
@@ -18,8 +18,20 @@
"ocsid": "166047",
"dependencies": {
"php": {
- "min-version": 5.4
+ "@attributes" : {
+ "min-version": "5.4",
+ "max-version": "5.5"
+ }
},
- "database":["sqlite", "mysql"]
+ "databases": {
+ "database": [
+ {
+ "@attributes" : {
+ "min-version": "3.0"
+ },
+ "@value": "sqlite"},
+ "mysql"
+ ]
+ }
}
}
diff --git a/tests/data/app/strange-types-info.json b/tests/data/app/strange-types-info.json
deleted file mode 100644
index eedf8bd0518..00000000000
--- a/tests/data/app/strange-types-info.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "info": [],
- "remote": [],
- "public": [],
- "id": "files_encryption",
- "name": "Server-side Encryption",
- "description": "\n\tThis application encrypts all files accessed by ownCloud at rest, wherever they are stored. As an example, with this application enabled, external cloud based Amazon S3 storage will be encrypted, protecting this data on storage outside of the control of the Admin. When this application is enabled for the first time, all files are encrypted as users log in and are prompted for their password. The recommended recovery key option enables recovery of files in case the key is lost. \n\tNote that this app encrypts all files that are touched by ownCloud, so external storage providers and applications such as SharePoint will see new files encrypted when they are accessed. Encryption is based on AES 128 or 256 bit keys. More information is available in the Encryption documentation \n\t",
- "licence": "AGPL",
- "author": "Sam Tuke, Bjoern Schiessle, Florin Peter",
- "requiremin": "4",
- "shipped": "true",
- "documentation": {
- "user": "https://docs.example.com/server/go.php?to=user-encryption",
- "admin": "https://docs.example.com/server/go.php?to=admin-encryption"
- },
- "rememberlogin": "false",
- "types": [],
- "ocsid": "166047",
- "dependencies": {
- "php": {
- "min-version": 5.4
- }
- }
-}
diff --git a/tests/data/app/strange-types-info.xml b/tests/data/app/strange-types-info.xml
deleted file mode 100644
index e7e8f0d0281..00000000000
--- a/tests/data/app/strange-types-info.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0"?>
-<info>
- <id>files_encryption</id>
- <name>Server-side Encryption</name>
- <description>
- This application encrypts all files accessed by ownCloud at rest, wherever they are stored. As an example, with this application enabled, external cloud based Amazon S3 storage will be encrypted, protecting this data on storage outside of the control of the Admin. When this application is enabled for the first time, all files are encrypted as users log in and are prompted for their password. The recommended recovery key option enables recovery of files in case the key is lost.
- Note that this app encrypts all files that are touched by ownCloud, so external storage providers and applications such as SharePoint will see new files encrypted when they are accessed. Encryption is based on AES 128 or 256 bit keys. More information is available in the Encryption documentation
- </description>
- <licence>AGPL</licence>
- <author>Sam Tuke, Bjoern Schiessle, Florin Peter</author>
- <requiremin>4</requiremin>
- <shipped>true</shipped>
- <documentation>
- <user>user-encryption</user>
- <admin>admin-encryption</admin>
- </documentation>
- <rememberlogin>false</rememberlogin>
- <types><base/></types>
- <ocsid>166047</ocsid>
- <dependencies>
- <php><min-version>5.4</min-version></php>
- </dependencies>
-</info>
diff --git a/tests/data/app/valid-info.xml b/tests/data/app/valid-info.xml
index 3a40e62d147..cdb688c6b3f 100644
--- a/tests/data/app/valid-info.xml
+++ b/tests/data/app/valid-info.xml
@@ -20,10 +20,10 @@
</types>
<ocsid>166047</ocsid>
<dependencies>
- <php>
- <min-version>5.4</min-version>
- </php>
- <database>sqlite</database>
- <database>mysql</database>
+ <php min-version="5.4" max-version="5.5"/>
+ <databases>
+ <database min-version="3.0">sqlite</database>
+ <database>mysql</database>
+ </databases>
</dependencies>
</info>
diff --git a/tests/lib/app/infoparser.php b/tests/lib/app/infoparser.php
index 20668c05086..13c0b51e117 100644
--- a/tests/lib/app/infoparser.php
+++ b/tests/lib/app/infoparser.php
@@ -55,7 +55,6 @@ class InfoParser extends \PHPUnit_Framework_TestCase {
function providesInfoXml() {
return array(
array('expected-info.json', 'valid-info.xml'),
- array('strange-types-info.json', 'strange-types-info.xml'),
array(null, 'invalid-info.xml'),
);
}