From 2499c24b8b31845488adcdae76a0ababa737cf27 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= <schiessle@owncloud.com>
Date: Thu, 18 Oct 2012 17:08:25 +0200
Subject: [PATCH] load system wide configured mount points before accessing
 shared files

---
 lib/filesystem.php | 101 ++++++++++++++++++++++++---------------------
 lib/util.php       |   4 +-
 2 files changed, 57 insertions(+), 48 deletions(-)

diff --git a/lib/filesystem.php b/lib/filesystem.php
index 5dc4b2f89e5..e4e63cee486 100644
--- a/lib/filesystem.php
+++ b/lib/filesystem.php
@@ -187,7 +187,8 @@ class OC_Filesystem{
 		$user = ltrim(substr($path, 0, strpos($path, '/', 1)), '/');
 		// check mount points if file was shared from a different user
 		if ($user != OC_User::getUser()) {
-			OC_Util::loadMountPoints($user);
+			OC_Util::loadUserMountPoints($user);
+			self::loadSystemMountPoints($user);
 		}
 
 		$mountpoint=self::getMountPoint($path);
@@ -200,6 +201,52 @@ class OC_Filesystem{
 		}
 	}
 
+	static private function loadSystemMountPoints($user) {
+		if(is_file(OC::$SERVERROOT.'/config/mount.php')) {
+			$mountConfig=include(OC::$SERVERROOT.'/config/mount.php');
+			if(isset($mountConfig['global'])) {
+				foreach($mountConfig['global'] as $mountPoint=>$options) {
+					self::mount($options['class'],$options['options'],$mountPoint);
+				}
+			}
+		
+			if(isset($mountConfig['group'])) {
+				foreach($mountConfig['group'] as $group=>$mounts) {
+					if(OC_Group::inGroup($user,$group)) {
+						foreach($mounts as $mountPoint=>$options) {
+							$mountPoint=self::($mountPoint, $user);
+							foreach($options as &$option) {
+								$option=self::setUserVars($option, $user);
+							}
+							self::mount($options['class'],$options['options'],$mountPoint);
+						}
+					}
+				}
+			}
+		
+			if(isset($mountConfig['user'])) {
+				foreach($mountConfig['user'] as $user=>$mounts) {
+					if($user==='all' or strtolower($user)===strtolower($user)) {
+						foreach($mounts as $mountPoint=>$options) {
+							$mountPoint=self::setUserVars($mountPoint, $user);
+							foreach($options as &$option) {
+								$option=self::setUserVars($option, $user);
+							}
+							self::mount($options['class'],$options['options'],$mountPoint);
+						}
+					}
+				}
+			}
+		
+			$mtime=filemtime(OC::$SERVERROOT.'/config/mount.php');
+			$previousMTime=OC_Appconfig::getValue('files','mountconfigmtime',0);
+			if($mtime>$previousMTime) {//mount config has changed, filecache needs to be updated
+				OC_FileCache::triggerUpdate();
+				OC_Appconfig::setValue('files','mountconfigmtime',$mtime);
+			}
+		}		
+	}
+	
 	static public function init($root) {
 		if(self::$defaultInstance) {
 			return false;
@@ -207,49 +254,7 @@ class OC_Filesystem{
 		self::$defaultInstance=new OC_FilesystemView($root);
 
 		//load custom mount config
-		if(is_file(OC::$SERVERROOT.'/config/mount.php')) {
-			$mountConfig=include(OC::$SERVERROOT.'/config/mount.php');
-			if(isset($mountConfig['global'])) {
-				foreach($mountConfig['global'] as $mountPoint=>$options) {
-					self::mount($options['class'],$options['options'],$mountPoint);
-				}
-			}
-
-			if(isset($mountConfig['group'])) {
-				foreach($mountConfig['group'] as $group=>$mounts) {
-					if(OC_Group::inGroup(OC_User::getUser(),$group)) {
-						foreach($mounts as $mountPoint=>$options) {
-							$mountPoint=self::setUserVars($mountPoint);
-							foreach($options as &$option) {
-								$option=self::setUserVars($option);
-							}
-							self::mount($options['class'],$options['options'],$mountPoint);
-						}
-					}
-				}
-			}
-
-			if(isset($mountConfig['user'])) {
-				foreach($mountConfig['user'] as $user=>$mounts) {
-					if($user==='all' or strtolower($user)===strtolower(OC_User::getUser())) {
-						foreach($mounts as $mountPoint=>$options) {
-							$mountPoint=self::setUserVars($mountPoint);
-							foreach($options as &$option) {
-								$option=self::setUserVars($option);
-							}
-							self::mount($options['class'],$options['options'],$mountPoint);
-						}
-					}
-				}
-			}
-
-			$mtime=filemtime(OC::$SERVERROOT.'/config/mount.php');
-			$previousMTime=OC_Appconfig::getValue('files','mountconfigmtime',0);
-			if($mtime>$previousMTime) {//mount config has changed, filecache needs to be updated
-				OC_FileCache::triggerUpdate();
-				OC_Appconfig::setValue('files','mountconfigmtime',$mtime);
-			}
-		}
+		self::loadSystemMountPoints(OC_User::getUser());
 
 		self::$loaded=true;
 	}
@@ -259,8 +264,12 @@ class OC_Filesystem{
 	 * @param string intput
 	 * @return string
 	 */
-	private static function setUserVars($input) {
-		return str_replace('$user',OC_User::getUser(),$input);
+	private static function setUserVars($input, $user) {
+		if (isset($user)) {
+			return str_replace('$user', $user,$input);
+		} else {
+			return str_replace('$user',OC_User::getUser(),$input);
+		}
 	}
 
 	/**
diff --git a/lib/util.php b/lib/util.php
index 29f2c56b0b2..eb0e5e8ec40 100755
--- a/lib/util.php
+++ b/lib/util.php
@@ -53,7 +53,7 @@ class OC_Util {
 			OC_FileProxy::register($quotaProxy);
 			OC_FileProxy::register($fileOperationProxy);
 			// Load personal mount config
-			self::loadMountPoints($user);
+			self::loadUserMountPoints($user);
 			OC_Hook::emit('OC_Filesystem', 'setup', array('user' => $user, 'user_dir' => $user_dir));
 		}
 	}
@@ -63,7 +63,7 @@ class OC_Util {
 		self::$fsSetup=false;
 	}
 	
-	public static function loadMountPoints($user) {
+	public static function loadUserMountPoints($user) {
 		$user_dir = '/'.$user.'/files';
 		$user_root = OC_User::getHome($user);
 		$userdirectory = $user_root . '/files';
-- 
GitLab