diff --git a/core/src/plugins/meta.mount/class.FilesystemMounter.php b/core/src/plugins/meta.mount/class.FilesystemMounter.php index a7f25dc94e..fe8ea556e0 100644 --- a/core/src/plugins/meta.mount/class.FilesystemMounter.php +++ b/core/src/plugins/meta.mount/class.FilesystemMounter.php @@ -1,146 +1,152 @@ - - * This file is part of Pydio. - * - * Pydio is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Pydio 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 Pydio. If not, see . - * - * The latest code can be found at . - */ - -defined('AJXP_EXEC') or die('Access not allowed'); - -/** - * Dynamically mount a remote folder when switching to the repository - * @package AjaXplorer_Plugins - * @subpackage Meta - * - */ -class FilesystemMounter extends AJXP_Plugin -{ - protected $accessDriver; - - public function beforeInitMeta($accessDriver){ - $this->accessDriver = $accessDriver; - if($this->isAlreadyMounted()) return; - $this->mountFS(); - } - - public function initMeta($accessDriver){ - $this->accessDriver = $accessDriver; - /* - if($this->isAlreadyMounted()) return; - $this->mountFS(); - */ - } - - protected function getCredentials(){ - // 1. Try from plugin config - $user = $this->options["USER"]; - $password = $this->options["PASS"]; - // 1BIS : encoded? - if($user == "" && isSet($this->options["ENCODED_CREDENTIALS"])){ - list($user,$password) = AJXP_Safe::getCredentialsFromEncodedString($this->options["ENCODED_CREDENTIALS"]); - } - // 2. Try from session - if($user=="" && isSet($this->options["USE_SESSION_CREDENTIALS"]) ){ - $safeCred = AJXP_Safe::loadCredentials(); - if($safeCred !== false){ - $user = $safeCred["user"]; - $password = $safeCred["password"]; - }else{ - throw new Exception("Session credential are empty! Did you forget to check the Set Session Credential in the Authentication configuration panel?"); - } - } - return array($user, $password); - } - - protected function getOption($name, $user="", $pass=""){ - $opt = $this->options[$name]; - $opt = str_replace("AJXP_USER", $user, $opt); - $opt = str_replace("AJXP_PASS", "'$pass'", $opt); - $opt = str_replace("AJXP_SERVER_UID", posix_getuid(), $opt); - $opt = str_replace("AJXP_SERVER_GID", posix_getgid(), $opt); - if(stristr($opt, "AJXP_REPOSITORY_PATH") !== false){ - $repo = ConfService::getRepository(); - $path = $repo->getOption("PATH"); - $opt = str_replace("AJXP_REPOSITORY_PATH", $path, $opt); - } - $opt = AJXP_VarsFilter::filter($opt); - return $opt; - } - - protected function isAlreadyMounted(){ - list($user, $password) = $this->getCredentials(); - $MOUNT_POINT = $this->getOption("MOUNT_POINT", $user, $password); - return is_file($MOUNT_POINT."/.ajxp_mount"); - } - - public function mountFS(){ - - list($user, $password) = $this->getCredentials(); - AJXP_Logger::debug("FSMounter::mountFS Should mount" . $user); - $repo = ConfService::getRepository(); - - $MOUNT_TYPE = $this->options["FILESYSTEM_TYPE"]; - $MOUNT_SUDO = $this->options["MOUNT_SUDO"]; - $MOUNT_POINT = $this->getOption("MOUNT_POINT", $user, $password); - $MOUNT_POINT_ROOT = $this->getOption("MOUNT_POINT", "", ""); - $create = $repo->getOption("CREATE"); - if( $MOUNT_POINT != $MOUNT_POINT_ROOT && !is_dir($MOUNT_POINT_ROOT) && $create){ - @mkdir($MOUNT_POINT_ROOT, 0755); - } - $recycle = false; - if(!is_dir($MOUNT_POINT) && $create){ - @mkdir($MOUNT_POINT, 0755); - }else{ - if($repo->getOption("RECYCLE_BIN") != ""){ - // Make sure the recycle bin was not mounted inside the mount point! - $recycle = $repo->getOption("PATH")."/".$repo->getOption("RECYCLE_BIN"); - if(@is_dir($recycle)){ - @rmdir($recycle); - } - } - } - $UNC_PATH = $this->getOption("UNC_PATH", $user, $password); - $MOUNT_OPTIONS = $this->getOption("MOUNT_OPTIONS", $user, $password); - - $cmd = ($MOUNT_SUDO?"sudo":"")." mount -t ".$MOUNT_TYPE." ".$UNC_PATH." ".$MOUNT_POINT." -o ".$MOUNT_OPTIONS; - shell_exec($cmd); - // Check it is correctly mounted now! - $cmd = ($MOUNT_SUDO?"sudo":"")." mount | grep ".escapeshellarg($MOUNT_POINT); - $output = shell_exec($cmd); - if($output == null || trim($output) == "") { - throw new Exception("Error while mounting file system - Test was ".$cmd); - }else{ - if(!is_file($MOUNT_POINT."/.ajxp_mount")){ - @file_put_contents($MOUNT_POINT."/.ajxp_mount", ""); - } - if($recycle !== false && !is_dir($recycle)){ - @mkdir($recycle, 0755); - } - } - } - - public function umountFS(){ - AJXP_Logger::debug("FSMounter::unmountFS"); - list($user, $password) = $this->getCredentials(); - $MOUNT_POINT = $this->getOption("MOUNT_POINT", $user, $password); - $MOUNT_SUDO = $this->options["MOUNT_SUDO"]; - - system(($MOUNT_SUDO?"sudo":"")." umount ".$MOUNT_POINT); - return true; - } - -} + + * This file is part of Pydio. + * + * Pydio is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pydio 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 Pydio. If not, see . + * + * The latest code can be found at . + */ + +defined('AJXP_EXEC') or die('Access not allowed'); + +/** + * Dynamically mount a remote folder when switching to the repository + * @package AjaXplorer_Plugins + * @subpackage Meta + * + */ +class FilesystemMounter extends AJXP_Plugin +{ + protected $accessDriver; + + public function beforeInitMeta($accessDriver) + { + $this->accessDriver = $accessDriver; + if($this->isAlreadyMounted()) return; + $this->mountFS(); + } + + public function initMeta($accessDriver) + { + $this->accessDriver = $accessDriver; + /* + if($this->isAlreadyMounted()) return; + $this->mountFS(); + */ + } + + protected function getCredentials() + { + // 1. Try from plugin config + $user = $this->options["USER"]; + $password = $this->options["PASS"]; + // 1BIS : encoded? + if ($user == "" && isSet($this->options["ENCODED_CREDENTIALS"])) { + list($user,$password) = AJXP_Safe::getCredentialsFromEncodedString($this->options["ENCODED_CREDENTIALS"]); + } + // 2. Try from session + if ($user=="" && isSet($this->options["USE_SESSION_CREDENTIALS"]) ) { + $safeCred = AJXP_Safe::loadCredentials(); + if ($safeCred !== false) { + $user = $safeCred["user"]; + $password = $safeCred["password"]; + } else { + throw new Exception("Session credential are empty! Did you forget to check the Set Session Credential in the Authentication configuration panel?"); + } + } + return array($user, $password); + } + + protected function getOption($name, $user="", $pass="") + { + $opt = $this->options[$name]; + $opt = str_replace("AJXP_USER", $user, $opt); + $opt = str_replace("AJXP_PASS", "'$pass'", $opt); + $opt = str_replace("AJXP_SERVER_UID", posix_getuid(), $opt); + $opt = str_replace("AJXP_SERVER_GID", posix_getgid(), $opt); + if (stristr($opt, "AJXP_REPOSITORY_PATH") !== false) { + $repo = ConfService::getRepository(); + $path = $repo->getOption("PATH"); + $opt = str_replace("AJXP_REPOSITORY_PATH", $path, $opt); + } + $opt = AJXP_VarsFilter::filter($opt); + return $opt; + } + + protected function isAlreadyMounted() + { + list($user, $password) = $this->getCredentials(); + $MOUNT_POINT = $this->getOption("MOUNT_POINT", $user, $password); + return is_file($MOUNT_POINT."/.ajxp_mount"); + } + + public function mountFS() + { + list($user, $password) = $this->getCredentials(); + AJXP_Logger::debug("FSMounter::mountFS Should mount" . $user); + $repo = ConfService::getRepository(); + + $MOUNT_TYPE = $this->options["FILESYSTEM_TYPE"]; + $MOUNT_SUDO = $this->options["MOUNT_SUDO"]; + $MOUNT_POINT = $this->getOption("MOUNT_POINT", $user, $password); + $MOUNT_POINT_ROOT = $this->getOption("MOUNT_POINT", "", ""); + $create = $repo->getOption("CREATE"); + if ( $MOUNT_POINT != $MOUNT_POINT_ROOT && !is_dir($MOUNT_POINT_ROOT) && $create) { + @mkdir($MOUNT_POINT_ROOT, 0755); + } + $recycle = false; + if (!is_dir($MOUNT_POINT) && $create) { + @mkdir($MOUNT_POINT, 0755); + } else { + if ($repo->getOption("RECYCLE_BIN") != "") { + // Make sure the recycle bin was not mounted inside the mount point! + $recycle = $repo->getOption("PATH")."/".$repo->getOption("RECYCLE_BIN"); + if (@is_dir($recycle)) { + @rmdir($recycle); + } + } + } + $UNC_PATH = $this->getOption("UNC_PATH", $user, $password); + $MOUNT_OPTIONS = $this->getOption("MOUNT_OPTIONS", $user, $password); + + $cmd = ($MOUNT_SUDO? "sudo ": ""). "mount -t " .$MOUNT_TYPE. (empty( $MOUNT_OPTIONS )? " " : " -o " .$MOUNT_OPTIONS. " " ) .$UNC_PATH. " " .$MOUNT_POINT; + shell_exec($cmd); + // Check it is correctly mounted now! + $cmd = ($MOUNT_SUDO?"sudo":"")." mount | grep ".escapeshellarg($MOUNT_POINT); + $output = shell_exec($cmd); + if ($output == null || trim($output) == "") { + throw new Exception("Error while mounting file system - Test was ".$cmd); + } else { + if (!is_file($MOUNT_POINT."/.ajxp_mount")) { + @file_put_contents($MOUNT_POINT."/.ajxp_mount", ""); + } + if ($recycle !== false && !is_dir($recycle)) { + @mkdir($recycle, 0755); + } + } + } + + public function umountFS() + { + AJXP_Logger::debug("FSMounter::unmountFS"); + list($user, $password) = $this->getCredentials(); + $MOUNT_POINT = $this->getOption("MOUNT_POINT", $user, $password); + $MOUNT_SUDO = $this->options["MOUNT_SUDO"]; + + system(($MOUNT_SUDO?"sudo":"")." umount ".$MOUNT_POINT); + return true; + } + +}