]> source.dussan.org Git - nextcloud-server.git/commitdiff
Use a parser to read custom mount configuration instead of including the php files
authorRobin Appelman <icewind@owncloud.com>
Sat, 16 Feb 2013 00:30:44 +0000 (01:30 +0100)
committerRobin Appelman <icewind@owncloud.com>
Sat, 16 Feb 2013 00:30:44 +0000 (01:30 +0100)
apps/files_external/lib/config.php
lib/arrayparser.php [new file with mode: 0644]
lib/files/filesystem.php

index 44e668a09c012adb52ec65046bec26210f282902..6ef7f37f58b0ac1ce10bd1999b38d4802b9ed0d6 100755 (executable)
@@ -279,13 +279,14 @@ class OC_Mount_Config {
        * @return array
        */
        private static function readData($isPersonal) {
+               $parser = new \OC\ArrayParser();
                if ($isPersonal) {
                        $file = OC_User::getHome(OCP\User::getUser()).'/mount.php';
                } else {
                        $file = OC::$SERVERROOT.'/config/mount.php';
                }
                if (is_file($file)) {
-                       $mountPoints = include $file;
+                       $mountPoints = $parser->parsePHP(file_get_contents($file));
                        if (is_array($mountPoints)) {
                                return $mountPoints;
                        }
diff --git a/lib/arrayparser.php b/lib/arrayparser.php
new file mode 100644 (file)
index 0000000..3bb394a
--- /dev/null
@@ -0,0 +1,189 @@
+<?php
+
+/**
+ * @author Robin Appelman
+ * @copyright 2013 Robin Appelman icewind@owncloud.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC;
+
+class SyntaxException extends \Exception {
+}
+
+class ArrayParser {
+       const TYPE_NUM = 1;
+       const TYPE_BOOL = 2;
+       const TYPE_STRING = 3;
+       const TYPE_ARRAY = 4;
+
+       function parsePHP($string) {
+               $string = $this->stripPHPTags($string);
+               $string = $this->stripAssignAndReturn($string);
+               return $this->parse($string);
+       }
+
+       function stripPHPTags($string) {
+               $string = trim($string);
+               if (substr($string, 0, 5) === '<?php') {
+                       $string = substr($string, 5);
+               }
+               if (substr($string, -2) === '?>') {
+                       $string = substr($string, 0, -2);
+               }
+               return $string;
+       }
+
+       function stripAssignAndReturn($string) {
+               $string = trim($string);
+               if (substr($string, 0, 6) === 'return') {
+                       $string = substr($string, 6);
+               }
+               if (substr($string, 0, 1) === '$') {
+                       list(, $string) = explode('=', $string, 2);
+               }
+               return $string;
+       }
+
+       function parse($string) {
+               $string = trim($string);
+               $string = trim($string, ';');
+               switch ($this->getType($string)) {
+                       case self::TYPE_NUM:
+                               return $this->parseNum($string);
+                       case self::TYPE_BOOL:
+                               return $this->parseBool($string);
+                       case self::TYPE_STRING:
+                               return $this->parseString($string);
+                       case self::TYPE_ARRAY:
+                               return $this->parseArray($string);
+               }
+               return null;
+       }
+
+       function getType($string) {
+               $string = strtolower($string);
+               $first = substr($string, 0, 1);
+               $last = substr($string, -1, 1);
+               $arrayFirst = substr($string, 0, 5);
+               if (($first === '"' or $first === "'") and ($last === '"' or $last === "'")) {
+                       return self::TYPE_STRING;
+               } elseif ($string === 'false' or $string === 'true') {
+                       return self::TYPE_BOOL;
+               } elseif ($arrayFirst === 'array' and $last === ')') {
+                       return self::TYPE_ARRAY;
+               } else {
+                       return self::TYPE_NUM;
+               }
+       }
+
+       function parseString($string) {
+               return substr($string, 1, -1);
+       }
+
+       function parseNum($string) {
+               return intval($string);
+       }
+
+       function parseBool($string) {
+               $string = strtolower($string);
+               return $string === 'true';
+       }
+
+       function parseArray($string) {
+               $body = substr($string, 5);
+               $body = trim($body);
+               $body = substr($body, 1, -1);
+               $items = $this->splitArray($body);
+               $result = array();
+               $lastKey = -1;
+               foreach ($items as $item) {
+                       $item = trim($item);
+                       if ($item) {
+                               if (strpos($item, '=>')) {
+                                       list($key, $value) = explode('=>', $item, 2);
+                                       $key = $this->parse($key);
+                                       $value = $this->parse($value);
+                               } else {
+                                       $key = ++$lastKey;
+                                       $value = $item;
+                               }
+
+                               if (is_numeric($key)) {
+                                       $lastKey = $key;
+                               }
+                               $result[$key] = $value;
+                       }
+               }
+               return $result;
+       }
+
+       function splitArray($body) {
+               $inSingleQuote = false;//keep track if we are inside quotes
+               $inDoubleQuote = false;
+               $bracketDepth = 0;//keep track if we are inside brackets
+               $parts = array();
+               $start = 0;
+               $escaped = false;//keep track if we are after an escape character
+               $skips = array();//keep track of the escape characters we need to remove from the result
+               if (substr($body, -1, 1) !== ',') {
+                       $body .= ',';
+               }
+               for ($i = 0; $i < strlen($body); $i++) {
+                       $char = substr($body, $i, 1);
+                       if ($char === '\\') {
+                               if ($escaped) {
+                                       array_unshift($skips, $i - 1);
+                               }
+                               $escaped = !$escaped;
+                       } else {
+                               if ($char === '"' and !$inSingleQuote) {
+                                       if ($escaped) {
+                                               array_unshift($skips, $i - 1);
+                                       } else {
+                                               $inDoubleQuote = !$inDoubleQuote;
+                                       }
+                               } elseif ($char === "'" and !$inDoubleQuote) {
+                                       if ($escaped) {
+                                               array_unshift($skips, $i - 1);
+                                       } else {
+                                               $inSingleQuote = !$inSingleQuote;
+                                       }
+                               } elseif (!$inDoubleQuote and !$inSingleQuote) {
+                                       if ($char === '(') {
+                                               $bracketDepth++;
+                                       } elseif ($char === ')') {
+                                               if ($bracketDepth <= 0) {
+                                                       throw new SyntaxException;
+                                               } else {
+                                                       $bracketDepth--;
+                                               }
+                                       } elseif ($bracketDepth === 0 and $char === ',') {
+                                               $part = substr($body, $start, $i - $start);
+                                               foreach ($skips as $skip) {
+                                                       $part = substr($part, 0, $skip - $start) . substr($part, $skip - $start + 1);
+                                               }
+                                               $parts[] = $part;
+                                               $start = $i + 1;
+                                               $skips = array();
+                                       }
+                               }
+                               $escaped = false;
+                       }
+               }
+               return $parts;
+       }
+}
index f45308680777d81fc39676f77cbb28806d1fa7ce..89a9ab2921208b3b6bab04c1c89d6477b98f2adf 100644 (file)
@@ -215,9 +215,11 @@ class Filesystem {
                if ($user == '') {
                        $user = \OC_User::getUser();
                }
+               $parser = new \OC\ArrayParser();
+
                // Load system mount points
                if (is_file(\OC::$SERVERROOT . '/config/mount.php')) {
-                       $mountConfig = include 'config/mount.php';
+                       $mountConfig = $parser->parsePHP(file_get_contents(\OC::$SERVERROOT . '/config/mount.php'));
                        if (isset($mountConfig['global'])) {
                                foreach ($mountConfig['global'] as $mountPoint => $options) {
                                        self::mount($options['class'], $options['options'], $mountPoint);
@@ -254,7 +256,7 @@ class Filesystem {
                $root = \OC_User::getHome($user);
                self::mount('\OC\Files\Storage\Local', array('datadir' => $root), $user);
                if (is_file($root . '/mount.php')) {
-                       $mountConfig = include $root . '/mount.php';
+                       $mountConfig = $parser->parsePHP(file_get_contents($root . '/mount.php'));
                        if (isset($mountConfig['user'][$user])) {
                                foreach ($mountConfig['user'][$user] as $mountPoint => $options) {
                                        self::mount($options['class'], $options['options'], $mountPoint);
@@ -613,11 +615,11 @@ class Filesystem {
        }
 
        /**
-       * Get the owner for a file or folder
-       *
-       * @param string $path
-       * @return string
-       */
+        * Get the owner for a file or folder
+        *
+        * @param string $path
+        * @return string
+        */
        public static function getOwner($path) {
                return self::$defaultInstance->getOwner($path);
        }