Use a parser to read custom mount configuration instead of including the php files
This commit is contained in:
parent
425d41aaf9
commit
46626915ef
|
@ -279,13 +279,14 @@ class OC_Mount_Config {
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
private static function readData($isPersonal) {
|
private static function readData($isPersonal) {
|
||||||
|
$parser = new \OC\ArrayParser();
|
||||||
if ($isPersonal) {
|
if ($isPersonal) {
|
||||||
$file = OC_User::getHome(OCP\User::getUser()).'/mount.php';
|
$file = OC_User::getHome(OCP\User::getUser()).'/mount.php';
|
||||||
} else {
|
} else {
|
||||||
$file = OC::$SERVERROOT.'/config/mount.php';
|
$file = OC::$SERVERROOT.'/config/mount.php';
|
||||||
}
|
}
|
||||||
if (is_file($file)) {
|
if (is_file($file)) {
|
||||||
$mountPoints = include $file;
|
$mountPoints = $parser->parsePHP(file_get_contents($file));
|
||||||
if (is_array($mountPoints)) {
|
if (is_array($mountPoints)) {
|
||||||
return $mountPoints;
|
return $mountPoints;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -215,9 +215,11 @@ class Filesystem {
|
||||||
if ($user == '') {
|
if ($user == '') {
|
||||||
$user = \OC_User::getUser();
|
$user = \OC_User::getUser();
|
||||||
}
|
}
|
||||||
|
$parser = new \OC\ArrayParser();
|
||||||
|
|
||||||
// Load system mount points
|
// Load system mount points
|
||||||
if (is_file(\OC::$SERVERROOT . '/config/mount.php')) {
|
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'])) {
|
if (isset($mountConfig['global'])) {
|
||||||
foreach ($mountConfig['global'] as $mountPoint => $options) {
|
foreach ($mountConfig['global'] as $mountPoint => $options) {
|
||||||
self::mount($options['class'], $options['options'], $mountPoint);
|
self::mount($options['class'], $options['options'], $mountPoint);
|
||||||
|
@ -254,7 +256,7 @@ class Filesystem {
|
||||||
$root = \OC_User::getHome($user);
|
$root = \OC_User::getHome($user);
|
||||||
self::mount('\OC\Files\Storage\Local', array('datadir' => $root), $user);
|
self::mount('\OC\Files\Storage\Local', array('datadir' => $root), $user);
|
||||||
if (is_file($root . '/mount.php')) {
|
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])) {
|
if (isset($mountConfig['user'][$user])) {
|
||||||
foreach ($mountConfig['user'][$user] as $mountPoint => $options) {
|
foreach ($mountConfig['user'][$user] as $mountPoint => $options) {
|
||||||
self::mount($options['class'], $options['options'], $mountPoint);
|
self::mount($options['class'], $options['options'], $mountPoint);
|
||||||
|
@ -613,11 +615,11 @@ class Filesystem {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the owner for a file or folder
|
* Get the owner for a file or folder
|
||||||
*
|
*
|
||||||
* @param string $path
|
* @param string $path
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function getOwner($path) {
|
public static function getOwner($path) {
|
||||||
return self::$defaultInstance->getOwner($path);
|
return self::$defaultInstance->getOwner($path);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue