diff --git a/core/src/conf/RELEASE_NOTE b/core/src/conf/RELEASE_NOTE index c406835036..fa9fc52445 100644 --- a/core/src/conf/RELEASE_NOTE +++ b/core/src/conf/RELEASE_NOTE @@ -13,6 +13,56 @@ Pydio 7.0.1 Fix main upgrade issues of 7.0 . Check php version: 5.6 is finally required for enterprise dist, because of ioncube loaders. . Fix case sensitive rename (details) +Pydio 7.0.2 Bugfix release for Pydio 7 +-- +. Fix command line automatic comma-split, let it enabled only for -i and -r options, otherwise it can break some commands. (details) +. Update current stable version (details) +. Use a dedicated mbParseUrl() function instead of parse_url that may fail with utf-8 on some specific installs (inc. macos) (details) +. Fix issue #1259: Zip on-the-fly option creates 0-sized empty files (apache compatibility) (details) +. Users and groups deletion: use UsersService and RolesService instead of deleting directly in db to fix caching issues. (details) +. Fix roles assignment when updating user groupPath (details) +. JS UI: handle Prompt exception and dialog. (details) +. New Middleware WorkspaceAuthRequired catches specific exception, sends JS prompt message and re-initialize request when form is submitted. (details) +. changed invalid link to developer guide to v7 developer guide (details) +. Reorganize MemorySafe. Add a context identifier to handle multiple credential sources. For storing when passed via ENV CLi. (details) +. Tplus / Tminus were moved to subfolder. Fix #1255 (details) +. Change docs editors orders. Fix #1264 (details) +. Fix ChainCache declaring PatternClearable although subacaches may not have this feature. Fix #1265 (details) +. Make sure to save repoId in session when loading minisite, can make some issues if shared user have other workspaces accesses. (details) +. Sets a default provider for TaskService otherwise top-level errors of command line are not visible to task status. (details) +. Fix slug issues - Fix #1273 (details) +. Prevent enabling cache at install if apc/apcu is not enabled. Should fix #1261 (details) +. Make sure to recompute readonly flag if current context has a permission mask, by using node.info.nocache hook. (details) +. Change icon for dwg files, use cube. Fix #1230 (details) +. Do not post "change" notifications or alerts when just copying a file to another workspace. Fix #1274 (details) +. Silently ignore register channel on non-readable repository. Avoid sending events on write-only repositories, see #1256 (details) +. Dav impl childExists function is highly inefficient, replace by a simple call to is_file on childnode. (details) +. And WorkspaceAuthRequired instead of simple exception (details) +. Fix meta.git download/preview. Fix #1275 (details). . +. Fix Shared Files download, the associated method is no more switchAction but downloadAction. Fix #1276 (details) +. Use file_exists instead of is_file (details) +. CLI and task_id passed : make sure to update status by default, for actions that do not implement specific tasks management. Otherwise scheduler will show "Starting action.... " and nothing more. (details) +. Missing context in cleanUserShares() could create an error on user deletion. Close #1279 (details) +. Fix mbParseUrl if preg_replace returns null. (details) +. Catch deleteById() exceptions in ElasticSearch (details) +. Remote download was broken. Fix #1281 (details) +. Auth.multi : when looking for shared users only, skip master driver. Auth.ldap : fix users count caching per baseGroup. (details) +. Fix CSS on share dialog title. (details) +. Add user if not in indexed URL. (details) +. Meta.git: make sure to apply node.change after revert operation. (details) +. Fix counting user on ldap (details) +. Missing curly brace (details) +. Fix Imap & EML plugins - Warning php7 requires Mail_mimeDecode 1.5.6 - Fix #1282 (details) +. Fix #1288 (details) +. Rewire ALLOWED_EXTENSIONS configs - Fix #1283 (details) +. Fix SMB access driver and custom smbclient path. Close #1290 (details) +. Fix zip operation when child drivers are remote (inc. smb) - Fix #1287 Fix base detection for archive (details) +. Auth.ldap: add starttsl support. See #1248, should fix it. (details) +. Manual merge of #1292 (put encoding call directly inside win-dedicated function. (details) +. Update trigger as mysql automatically pads varchars when comparing, creating a content instead of path in some case (trailing spaces). See #1253 (details) +. i18n new prompt exception mechanism (details) +. RolesManager loading role data : Make sure to remove invalid repos on error from shared repositories list. (details) + ************** New Features ************** diff --git a/core/src/core/src/pydio/Core/Exception/PydioPromptException.php b/core/src/core/src/pydio/Core/Exception/PydioPromptException.php index 63579a4ee5..c0f108b433 100644 --- a/core/src/core/src/pydio/Core/Exception/PydioPromptException.php +++ b/core/src/core/src/pydio/Core/Exception/PydioPromptException.php @@ -23,6 +23,7 @@ use Pydio\Core\Http\Middleware\WorkspaceAuthMiddleware; use Pydio\Core\Http\Response\JSONSerializableResponseChunk; use Pydio\Core\Http\Response\XMLSerializableResponseChunk; +use Pydio\Core\Services\LocaleService; defined('AJXP_EXEC') or die( 'Access not allowed'); @@ -83,12 +84,15 @@ public function __construct($promptType, $data, $messageString, $messageId = fal * @return PydioPromptException */ public static function promptForWorkspaceCredentials($parameters, $postSubmitCallback = ""){ + $mess = LocaleService::getMessages(); $inputs = []; foreach($parameters as $key => $value){ if($key === WorkspaceAuthMiddleware::FORM_RESUBMIT_LOGIN) { - $inputs[] = ""; + $loginString = str_replace("'","\'", $mess['181']); + $inputs[] = ""; }else if($key === WorkspaceAuthMiddleware::FORM_RESUBMIT_PASS){ - $inputs[] = ""; + $passString = str_replace("'","\'", $mess['182']); + $inputs[] = ""; }else{ $inputs[] = ""; } @@ -97,8 +101,8 @@ public static function promptForWorkspaceCredentials($parameters, $postSubmitCal "confirm", array( "DIALOG" => "
-

Credentials Required

-
Please provide a password to enter this workspace.
+

".$mess['557']."

+
".$mess['558']."
".implode("\n", $inputs)."
@@ -112,7 +116,7 @@ public static function promptForWorkspaceCredentials($parameters, $postSubmitCal "EVAL" => "" ) ), - "Credentials Needed"); + $mess['557']); } diff --git a/core/src/core/src/pydio/Core/Exception/WorkspaceAuthRequired.php b/core/src/core/src/pydio/Core/Exception/WorkspaceAuthRequired.php index 9b9f61656e..f1a02b35ce 100644 --- a/core/src/core/src/pydio/Core/Exception/WorkspaceAuthRequired.php +++ b/core/src/core/src/pydio/Core/Exception/WorkspaceAuthRequired.php @@ -24,6 +24,7 @@ use Pydio\Auth\Core\MemorySafe; use Pydio\Core\Model\Context; use Pydio\Core\Model\UserInterface; +use Pydio\Core\Services\LocaleService; defined('AJXP_EXEC') or die('Access not allowed'); @@ -43,10 +44,13 @@ class WorkspaceAuthRequired extends PydioException { * @param boolean $requireLogin * @param string $message */ - public function __construct($workspaceId, $requireLogin = false, $message = "Authentication required for this workspace") + public function __construct($workspaceId, $requireLogin = false, $message = "") { $this->workspaceId = $workspaceId; $this->requireLogin = $requireLogin; + if(empty($message)){ + $message = LocaleService::getMessages()['559']; + } parent::__construct($message, false, null); } diff --git a/core/src/core/src/pydio/Core/Utils/Vars/PathUtils.php b/core/src/core/src/pydio/Core/Utils/Vars/PathUtils.php index 92acea1103..2d6a3d9de3 100644 --- a/core/src/core/src/pydio/Core/Utils/Vars/PathUtils.php +++ b/core/src/core/src/pydio/Core/Utils/Vars/PathUtils.php @@ -73,5 +73,43 @@ public static function unPatchPathForBaseDir($dirPath) return str_replace("__ZIP_EXTENSION__", ".zip", $dirPath); } + /** + * Return highest common folder + * @param $items + * @return mixed + */ + public static function commonPath($items) + { + $arr = array(); + foreach($items as $i => $path) + { + $items[$i] = explode('/', $path); + unset($items[$i][0]); + + $arr[$i] = count($items[$i]); + } + + $min = min($arr); + + for($i = 0; $i < count($items); $i++) + { + while(count($items[$i]) > $min) + { + array_pop($items[$i]); + } + + $items[$i] = '/' . implode('/' , $items[$i]); + } + + $items = array_unique($items); + while(count($items) !== 1) + { + $items = array_map('dirname', $items); + $items = array_unique($items); + } + reset($items); + + return current($items); + } } \ No newline at end of file diff --git a/core/src/plugins/access.ajxp_conf/src/RolesManager.php b/core/src/plugins/access.ajxp_conf/src/RolesManager.php index bafbdeac82..bbc8f0df9e 100644 --- a/core/src/plugins/access.ajxp_conf/src/RolesManager.php +++ b/core/src/plugins/access.ajxp_conf/src/RolesManager.php @@ -233,10 +233,12 @@ public function rolesActions(ServerRequestInterface $requestInterface, ResponseI || ($repositoryObject->getUniqueUser() != null && $repositoryObject->getUniqueUser() != $userObject->getId()) ) ){ + if(isSet($sharedRepos[$repositoryId])) unset($sharedRepos[$repositoryId]); continue; }else if(empty($userObject) && ( (empty($currentMainUser) && !$currentMainUser->canAdministrate($repositoryObject)) || $repositoryObject->isTemplate() )){ + if(isSet($sharedRepos[$repositoryId])) unset($sharedRepos[$repositoryId]); continue; } $meta = array(); diff --git a/core/src/plugins/access.fs/FsAccessDriver.php b/core/src/plugins/access.fs/FsAccessDriver.php index 94949bfc35..c4826269f3 100644 --- a/core/src/plugins/access.fs/FsAccessDriver.php +++ b/core/src/plugins/access.fs/FsAccessDriver.php @@ -650,6 +650,8 @@ public function downloadAction(ServerRequestInterface &$request, ResponseInterfa } else { if(isset($httpVars["dir"])){ $dir = InputFilter::decodeSecureMagic($httpVars["dir"], InputFilter::SANITIZE_DIRNAME); + }else{ + $dir = $selection->commonDirFromSelection(); } $base = basename(PathUtils::forwardSlashDirname($selection->getUniqueFile())); $zip = true; @@ -2390,7 +2392,8 @@ public function makeZip (UserSelection $selection, $dest, $basedir, $taskId = nu $filePaths = []; $selectedNodes = $selection->buildNodes(); foreach ($selectedNodes as $node) { - $realFile = $node->getRealFile(); + //$realFile = $node->getRealFile(); + $realFile = MetaStreamWrapper::getRealFSReference($node->getUrl()); if (basename($node->getPath()) == "") { $filePaths[] = [PCLZIP_ATT_FILE_NAME => $realFile]; } else { @@ -2426,7 +2429,7 @@ public function makeZip (UserSelection $selection, $dest, $basedir, $taskId = nu if($basedir == "__AJXP_ZIP_FLAT__/"){ $vList = $archive->create($filePaths, PCLZIP_OPT_REMOVE_ALL_PATH, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_ADD_TEMP_FILE_ON, PCLZIP_CB_PRE_ADD, $preAddCallback); }else{ - $basedir = MetaStreamWrapper::getRealFSReference($selection->currentBaseUrl()).trim($basedir); + $basedir = rtrim(MetaStreamWrapper::getRealFSReference($selection->currentBaseUrl()), '/').trim($basedir); $this->logDebug("Basedir", [$basedir]); $vList = $archive->create($filePaths, PCLZIP_OPT_REMOVE_PATH, $basedir, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_ADD_TEMP_FILE_ON, PCLZIP_CB_PRE_ADD, $preAddCallback); } diff --git a/core/src/plugins/access.imap/ImapAccessDriver.php b/core/src/plugins/access.imap/ImapAccessDriver.php index fff0c6e9cc..7413ca0a2d 100644 --- a/core/src/plugins/access.imap/ImapAccessDriver.php +++ b/core/src/plugins/access.imap/ImapAccessDriver.php @@ -71,11 +71,21 @@ public function performChecks() } } + /** + * @param $st1 + * @param $st2 + * @return int + */ public static function inverseSort($st1, $st2) { return strnatcasecmp($st2, $st1); } + /** + * @param $st1 + * @param $st2 + * @return int + */ public static function sortInboxFirst($st1, $st2) { if($st1 == "INBOX") return -1; @@ -83,6 +93,13 @@ public static function sortInboxFirst($st1, $st2) return strcmp($st1, $st2); } + /** + * @param ServerRequestInterface $request + * @param ResponseInterface $response + * @throws PydioException + * @throws \Exception + * @throws \Pydio\Access\Core\Exception\FileNotWriteableException + */ public function switchAction(ServerRequestInterface &$request, ResponseInterface &$response) { if ($request->getAttribute("action") == "ls") { diff --git a/core/src/plugins/access.imap/ImapAccessWrapper.php b/core/src/plugins/access.imap/ImapAccessWrapper.php index 646ad77cc4..35e6dcfd8b 100644 --- a/core/src/plugins/access.imap/ImapAccessWrapper.php +++ b/core/src/plugins/access.imap/ImapAccessWrapper.php @@ -20,7 +20,7 @@ */ namespace Pydio\Access\Driver\StreamProvider\Imap; -use EmlParser; +use Pydio\Editor\EML\EmlParser; use Pydio\Access\Core\IAjxpWrapper; use Pydio\Access\Core\Model\AJXP_Node; @@ -133,7 +133,6 @@ public function stream_open($path, $mode, $options, &$opened_path) $attachmentId = array_pop($ar); $this->currentAttachmentData = array("realPath" => $mailPath, "attachmentId" => $attachmentId); // EXTRACT ATTACHMENT AND RETURN - require_once AJXP_INSTALL_PATH."/plugins/editor.eml/class.EmlParser.php"; $emlParser = new EmlParser("", ""); $attachMeta = array(); $this->data = $emlParser->getAttachmentBody( @@ -212,7 +211,6 @@ public function stream_read($count) if (empty($this->data)) { Logger::debug(__CLASS__,__FUNCTION__,"Attachement", $this->currentAttachmentData); // EXTRACT ATTACHMENT AND RETURN - require_once AJXP_INSTALL_PATH."/plugins/editor.eml/class.EmlParser.php"; $emlParser = new EmlParser("", ""); $attachMeta = array(); $this->data = $emlParser->getAttachmentBody( @@ -309,7 +307,6 @@ public function dir_opendir($path, $options) self::$currentCount = count($this->mailboxes); $this->pos = $this->dir - 1; } else if ($this->fragment == "attachments") { - require_once AJXP_INSTALL_PATH.'/plugins/editor.eml/class.EmlParser.php'; $parser = new EmlParser("", ""); $ar = explode("#", $path); $path = array_shift($ar);// remove fragment diff --git a/core/src/plugins/access.smb/SMBAccessDriver.php b/core/src/plugins/access.smb/SMBAccessDriver.php index 702523110f..1fbe06e8ee 100644 --- a/core/src/plugins/access.smb/SMBAccessDriver.php +++ b/core/src/plugins/access.smb/SMBAccessDriver.php @@ -22,12 +22,20 @@ namespace Pydio\Access\Driver\StreamProvider\SMB; use DOMNode; +use PclZip; +use Pydio\Access\Core\MetaStreamWrapper; use Pydio\Access\Core\Model\AJXP_Node; +use Pydio\Access\Core\Model\UserSelection; use Pydio\Access\Core\RecycleBinManager; use Pydio\Access\Core\Model\Repository; use Pydio\Access\Driver\StreamProvider\FS\FsAccessDriver; use Pydio\Core\Model\ContextInterface; use Pydio\Core\Exception\PydioException; +use Pydio\Core\Services\ConfService; +use Pydio\Core\Utils\TextEncoder; +use Pydio\Core\Utils\Vars\InputFilter; +use Pydio\Tasks\Task; +use Pydio\Tasks\TaskService; defined('AJXP_EXEC') or die( 'Access not allowed'); @@ -47,6 +55,16 @@ class SMBAccessDriver extends FsAccessDriver protected $wrapperClassName; protected $urlBase; + protected function loadExternalWrapper(){ + if(!empty($this->pluginConf['SMBCLIENT']) && !defined('SMB4PHP_SMBCLIENT')){ + define ('SMB4PHP_SMBCLIENT', $this->pluginConf["SMBCLIENT"]); + } + if(!empty($this->pluginConf['SMB_PATH_TMP']) && !defined('SMB_PATH_TMP')){ + define ('SMB4PHP_SMBTMP', $this->pluginConf["SMB_PATH_TMP"]); + } + require_once($this->getBaseDir()."/smb.php"); + } + /** * @param ContextInterface $contextInterface * @throws PydioException @@ -59,13 +77,7 @@ protected function initRepository(ContextInterface $contextInterface) } else { $this->driverConf = array(); } - $smbclientPath = $this->driverConf["SMBCLIENT"]; - define ('SMB4PHP_SMBCLIENT', $smbclientPath); - - $smbtmpPath = $this->driverConf["SMB_PATH_TMP"]; - define ('SMB4PHP_SMBTMP', $smbtmpPath); - - require_once($this->getBaseDir()."/smb.php"); + $this->loadExternalWrapper(); //$create = $this->repository->getOption("CREATE"); $recycle = $this->repository->getContextOption($contextInterface, "RECYCLE_BIN"); @@ -92,7 +104,7 @@ protected function initRepository(ContextInterface $contextInterface) public function detectStreamWrapper($register = false, ContextInterface $ctx = null) { if ($register) { - require_once($this->getBaseDir()."/smb.php"); + $this->loadExternalWrapper(); } return parent::detectStreamWrapper($register, $ctx); } diff --git a/core/src/plugins/access.smb/smb.php b/core/src/plugins/access.smb/smb.php index 06ebeabc52..cdc2fae2b9 100644 --- a/core/src/plugins/access.smb/smb.php +++ b/core/src/plugins/access.smb/smb.php @@ -22,6 +22,7 @@ ################################################################### namespace Pydio\Access\Driver\StreamProvider\SMB; +use Pydio\Core\Utils\TextEncoder; use Pydio\Log\Core\Logger; define ('SMB4PHP_VERSION', '0.8'); @@ -553,7 +554,7 @@ class smb_stream_wrapper extends smb { # variables - public $stream, $url, $parsed_url = array (), $mode, $tmpfile; + public $stream, $url, $parsed_url = array (), $mode, $tmpfile, $defer_stream_read; public $need_flush = FALSE; public $dir = array (), $dir_index = -1; @@ -648,7 +649,6 @@ public function stream_open ($url, $mode, $options, $opened_path) $url = smb::cleanUrl($url); $this->url = $url; $this->mode = $mode; - $this->defer_stream_read; $this->parsed_url = $pu = smb::parse_url($url); if ($pu['type'] <> 'path') trigger_error('stream_open(): error in URL', E_USER_ERROR); switch ($mode) { @@ -745,38 +745,36 @@ function ConvSmbParameterToWinOs($params) { $paramstemp = explode(" ", $params); - - // first command '-d' or '-L' ? - if ($paramstemp[0] == "-d") { - $count_params = count($paramstemp); + // first command '-d' or '-L' ? + if ($paramstemp[0] === '-d') { + + $count_params = count($paramstemp); // index command = 4; // index start path = 6; $paramstemp[6] = '""'.$paramstemp[6]; $type_cmd = substr($paramstemp[4], 1); switch ($type_cmd) { - case get: - case put: - case rename: - $index_end_path = $count_params - 2; - $paramstemp[$index_end_path] = $paramstemp[$index_end_path].'""'; - $new_params = implode(" ", $paramstemp); - $new_params = str_replace(' ', '"" ""', $new_params); - break; - - //Cmd: dir, del, rmdir, mkdir - default: - $index_end_path = $count_params - 2; - $paramstemp[$index_end_path] = $paramstemp[$index_end_path].'""'; - $new_params = implode(" ", $paramstemp); - } + case 'get': + case 'put': + case 'rename': + $index_end_path = $count_params - 2; + $paramstemp[$index_end_path] = $paramstemp[$index_end_path].'""'; + $new_params = implode(" ", $paramstemp); + $new_params = str_replace(' ', '"" ""', $new_params); + break; - return $new_params; - } - else { - return $params; + //Cmd: dir, del, rmdir, mkdir + default: + $index_end_path = $count_params - 2; + $paramstemp[$index_end_path] = $paramstemp[$index_end_path].'""'; + $new_params = implode(" ", $paramstemp); + } + $params = $new_params; } + + return TextEncoder::toStorageEncoding($params); } ################################################################### diff --git a/core/src/plugins/action.scheduler/src/Scheduler.php b/core/src/plugins/action.scheduler/src/Scheduler.php index 91a7e562de..c347870ece 100644 --- a/core/src/plugins/action.scheduler/src/Scheduler.php +++ b/core/src/plugins/action.scheduler/src/Scheduler.php @@ -326,8 +326,11 @@ public function handleTasks(ServerRequestInterface $requestInterface, ResponseIn $task = TaskService::getInstance()->getTaskById(InputFilter::sanitize($httpVars["task_id"], InputFilter::SANITIZE_ALPHANUM)); if($task !== null){ $children = $task->getChildrenTasks(); - if(!empty($children)){ - throw new PydioException("This task has currently jobs running, please wait that they are finished"); + foreach ($children as $child){ + if($child->getStatus() === Task::STATUS_RUNNING){ + throw new PydioException("This task has currently jobs running, please wait that they are finished"); + } + TaskService::getInstance()->deleteTask($child->getId()); } TaskService::getInstance()->deleteTask($task->getId()); } diff --git a/core/src/plugins/auth.ldap/LdapAuthDriver.php b/core/src/plugins/auth.ldap/LdapAuthDriver.php index d8b8a90a7a..dd410a289b 100644 --- a/core/src/plugins/auth.ldap/LdapAuthDriver.php +++ b/core/src/plugins/auth.ldap/LdapAuthDriver.php @@ -214,8 +214,10 @@ public function startConnexion() if ($this->ldapconn == null) { $this->logError(__FUNCTION__, 'LDAP Server connexion could NOT be established'); } + if ($this->ldapconn !== null && isSet($this->options["LDAP_PROTOCOL"]) && $this->options["LDAP_PROTOCOL"] === 'starttls') { + ldap_start_tls($this->ldapconn); + } } - //return $this->ldapconn; } public function __deconstruct() diff --git a/core/src/plugins/auth.ldap/manifest.xml b/core/src/plugins/auth.ldap/manifest.xml index 4b1c49ce66..13e833f969 100644 --- a/core/src/plugins/auth.ldap/manifest.xml +++ b/core/src/plugins/auth.ldap/manifest.xml @@ -12,7 +12,7 @@ - + diff --git a/core/src/plugins/core.access/src/Model/UserSelection.php b/core/src/plugins/core.access/src/Model/UserSelection.php index 979d33b917..e32210d789 100644 --- a/core/src/plugins/core.access/src/Model/UserSelection.php +++ b/core/src/plugins/core.access/src/Model/UserSelection.php @@ -330,6 +330,15 @@ public function buildNodes() } + /** + * Find common base path for current selection + * @return mixed + */ + public function commonDirFromSelection(){ + $items = array_values($this->files); + return PathUtils::commonPath($items); + } + /** * @return string * @throws \Exception diff --git a/core/src/plugins/core.ajaxplorer/i18n/ca.php b/core/src/plugins/core.ajaxplorer/i18n/ca.php index 7690491ac4..6ba2d5cafd 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/ca.php +++ b/core/src/plugins/core.ajaxplorer/i18n/ca.php @@ -654,5 +654,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/cs.php b/core/src/plugins/core.ajaxplorer/i18n/cs.php index 63148cd1b7..754424c028 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/cs.php +++ b/core/src/plugins/core.ajaxplorer/i18n/cs.php @@ -651,4 +651,7 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/da.php b/core/src/plugins/core.ajaxplorer/i18n/da.php index 680ce1301a..1118b4ed5c 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/da.php +++ b/core/src/plugins/core.ajaxplorer/i18n/da.php @@ -656,5 +656,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/de.php b/core/src/plugins/core.ajaxplorer/i18n/de.php index 1c11c70db5..3f4d8cb3c1 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/de.php +++ b/core/src/plugins/core.ajaxplorer/i18n/de.php @@ -658,6 +658,9 @@ "553" => "Ungültiges Passwort. Bitte stellen Sie sicher, dass die Feststelltaste nicht gedrückt ist und geben Sie das Kennwort erneut ein.", "554" => "%s Ergebnis(se) im Papierkorb", "556" => "Starte Aufgabe %s im Hintergrund", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ /* password strength tester */ -); +); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/en.php b/core/src/plugins/core.ajaxplorer/i18n/en.php index 7a062937de..a66adffc79 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/en.php +++ b/core/src/plugins/core.ajaxplorer/i18n/en.php @@ -653,4 +653,7 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", ); diff --git a/core/src/plugins/core.ajaxplorer/i18n/es.php b/core/src/plugins/core.ajaxplorer/i18n/es.php index 8d896597de..6bb2939560 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/es.php +++ b/core/src/plugins/core.ajaxplorer/i18n/es.php @@ -658,4 +658,7 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/et.php b/core/src/plugins/core.ajaxplorer/i18n/et.php index e3fccc7318..9e7f17d563 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/et.php +++ b/core/src/plugins/core.ajaxplorer/i18n/et.php @@ -654,5 +654,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/eus.php b/core/src/plugins/core.ajaxplorer/i18n/eus.php index 7dbb2e54a7..3437a59e1f 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/eus.php +++ b/core/src/plugins/core.ajaxplorer/i18n/eus.php @@ -652,5 +652,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/fi.php b/core/src/plugins/core.ajaxplorer/i18n/fi.php index f3a69d478a..05117637ca 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/fi.php +++ b/core/src/plugins/core.ajaxplorer/i18n/fi.php @@ -654,5 +654,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/fr.php b/core/src/plugins/core.ajaxplorer/i18n/fr.php index 4c50227b1f..93ce5412a1 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/fr.php +++ b/core/src/plugins/core.ajaxplorer/i18n/fr.php @@ -653,5 +653,8 @@ "553" => "Mot de passe invalide, veuillez réessayer. \\n Attention à ce que votre touche Majuscule ne soit pas activée.", "554" => "%s résultat(s) dans la Corbeille", "556" => "Lancement de %s en tâche de fond", +"557" => "Identification requise", +"558" => "Veuillez entrer votre mot de passe pour accéder à ce workspace.", +"559" => "L'authentification pour accéder au workspace a échoué.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/gr.php b/core/src/plugins/core.ajaxplorer/i18n/gr.php index f20ae6777a..de454e293b 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/gr.php +++ b/core/src/plugins/core.ajaxplorer/i18n/gr.php @@ -651,5 +651,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/he.php b/core/src/plugins/core.ajaxplorer/i18n/he.php index 0c97f68102..c606d2d0cd 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/he.php +++ b/core/src/plugins/core.ajaxplorer/i18n/he.php @@ -651,5 +651,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/hu.php b/core/src/plugins/core.ajaxplorer/i18n/hu.php index 2c1ce573df..dd0c2d63c1 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/hu.php +++ b/core/src/plugins/core.ajaxplorer/i18n/hu.php @@ -656,5 +656,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/it.php b/core/src/plugins/core.ajaxplorer/i18n/it.php index b10856c495..9ade2fbb6b 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/it.php +++ b/core/src/plugins/core.ajaxplorer/i18n/it.php @@ -671,5 +671,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/ja.php b/core/src/plugins/core.ajaxplorer/i18n/ja.php index 2a3deeaefd..2d875f6342 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/ja.php +++ b/core/src/plugins/core.ajaxplorer/i18n/ja.php @@ -656,6 +656,9 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* 文章はここまで */ /* 文章終了 */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/kr.php b/core/src/plugins/core.ajaxplorer/i18n/kr.php index 13e5598d2f..eb159446d2 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/kr.php +++ b/core/src/plugins/core.ajaxplorer/i18n/kr.php @@ -660,5 +660,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/nl.php b/core/src/plugins/core.ajaxplorer/i18n/nl.php index 0dc42bfd64..f9093bfd69 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/nl.php +++ b/core/src/plugins/core.ajaxplorer/i18n/nl.php @@ -657,5 +657,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/no.php b/core/src/plugins/core.ajaxplorer/i18n/no.php index 25d1ecb8d2..16ccd93e2d 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/no.php +++ b/core/src/plugins/core.ajaxplorer/i18n/no.php @@ -655,5 +655,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/pl.php b/core/src/plugins/core.ajaxplorer/i18n/pl.php index 8a4f34d3df..dbecdfe59b 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/pl.php +++ b/core/src/plugins/core.ajaxplorer/i18n/pl.php @@ -651,5 +651,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/pt-br.php b/core/src/plugins/core.ajaxplorer/i18n/pt-br.php index f5d09a76ec..afffdcc032 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/pt-br.php +++ b/core/src/plugins/core.ajaxplorer/i18n/pt-br.php @@ -257,7 +257,6 @@ "204" => "O arquivo \"", "205" => "\" excede o limite de tamanho (", "206" => "Mb).\\nNão será enviado.", -/* END SENTENCE */ "207" => "Você não tem permissão de escrita neste diretório", "208" => "Você não tem permissão de leitura neste diretório", "209" => "Erro interno no servidor, contate o administrador do sistema!", @@ -433,7 +432,6 @@ "375" => "Aviso, você esteve inativo mais do que __IDLE__, você será desconectado em __LOGOUT__", "376" => "Clique em qualquer lugar para reativar", "378" => "Aviso, senha vazia ou muito curta!", -/* testador de força de senha */ "379" => "Palavra não-segura!", "380" => "Muito curto", "381" => "Muito fraco", @@ -653,4 +651,9 @@ "553" => "Senha inválida, favor tentar novamente. \\n Verifique se a função Caps Lock não está ativada!", "554" => "%s resultado(s) na Lixeira", "556" => "Executando tarefa %s em segundo plano", -); +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", +/* END SENTENCE */ +/* testador de força de senha */ +); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/pt.php b/core/src/plugins/core.ajaxplorer/i18n/pt.php index f1690382d5..87d5a02187 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/pt.php +++ b/core/src/plugins/core.ajaxplorer/i18n/pt.php @@ -651,6 +651,9 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ /* password strength tester */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/ru.php b/core/src/plugins/core.ajaxplorer/i18n/ru.php index 4dd4359187..f8476fc567 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/ru.php +++ b/core/src/plugins/core.ajaxplorer/i18n/ru.php @@ -651,6 +651,9 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ /* password strength tester */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/si.php b/core/src/plugins/core.ajaxplorer/i18n/si.php index c9a3bc1cd7..a92e5d8986 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/si.php +++ b/core/src/plugins/core.ajaxplorer/i18n/si.php @@ -652,5 +652,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/sv.php b/core/src/plugins/core.ajaxplorer/i18n/sv.php index 38f77f3774..9b720d76ad 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/sv.php +++ b/core/src/plugins/core.ajaxplorer/i18n/sv.php @@ -651,5 +651,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/tr.php b/core/src/plugins/core.ajaxplorer/i18n/tr.php index d60b0fb6fc..73af423b8f 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/tr.php +++ b/core/src/plugins/core.ajaxplorer/i18n/tr.php @@ -654,5 +654,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/zh-tw.php b/core/src/plugins/core.ajaxplorer/i18n/zh-tw.php index bfd2000d21..6892901038 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/zh-tw.php +++ b/core/src/plugins/core.ajaxplorer/i18n/zh-tw.php @@ -654,5 +654,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/core.ajaxplorer/i18n/zh.php b/core/src/plugins/core.ajaxplorer/i18n/zh.php index a96d5f06eb..fe2714095e 100644 --- a/core/src/plugins/core.ajaxplorer/i18n/zh.php +++ b/core/src/plugins/core.ajaxplorer/i18n/zh.php @@ -663,5 +663,8 @@ "553" => "Invalid password, please try again. \\n Make sure your Caps Lock is not engaged!", "554" => "%s result(s) in Recycle Bin", "556" => "Launching task %s in background", +"557" => "Credentials required", +"558" => "Please provide a password to enter this workspace.", +"559" => "Authentication failed for this workspace.", /* END SENTENCE */ ); \ No newline at end of file diff --git a/core/src/plugins/editor.eml/EmlParser.php b/core/src/plugins/editor.eml/EmlParser.php index 70add2e789..a2f57ac893 100644 --- a/core/src/plugins/editor.eml/EmlParser.php +++ b/core/src/plugins/editor.eml/EmlParser.php @@ -23,6 +23,7 @@ use Pydio\Access\Core\MetaStreamWrapper; use Pydio\Access\Core\Model\AJXP_Node; use Pydio\Access\Core\Model\UserSelection; +use Pydio\Core\Http\Message\UserMessage; use Pydio\Core\Model\ContextInterface; use Pydio\Core\Services\LocalCache; @@ -78,7 +79,7 @@ public function switchAction(\Psr\Http\Message\ServerRequestInterface $requestIn $file = $node->getUrl(); Controller::applyHook("node.read", array($node)); - $wrapperClassName = MetaStreamWrapper::actualRepositoryWrapperClass($node); + $wrapperIsImap = $this->wrapperIsImap($node); $mess = LocaleService::getMessages(); switch ($action) { @@ -88,7 +89,7 @@ public function switchAction(\Psr\Http\Message\ServerRequestInterface $requestIn 'decode_bodies' => false, 'decode_headers' => 'UTF-8' ); - $decoder = $this->getStructureDecoder($file, ($wrapperClassName == "imapAccessWrapper")); + $decoder = $this->getStructureDecoder($file, $wrapperIsImap); $xml = $decoder->getXML($decoder->decode($params)); $doc = new \Pydio\Core\Http\Message\XMLDocMessage($xml); if (function_exists("imap_mime_header_decode")) { @@ -122,8 +123,8 @@ public function switchAction(\Psr\Http\Message\ServerRequestInterface $requestIn 'decode_bodies' => true, 'decode_headers' => false ); - if ($wrapperClassName == "imapAccessWrapper") { - $cache = LocalCache::getItem("eml_remote", $file, null, array("EmlParser", "computeCacheId")); + if ($wrapperIsImap) { + $cache = LocalCache::getItem("eml_remote", $file, null, array($this, "computeCacheId")); $content = $cache->getData(); } else { $content = file_get_contents($file); @@ -153,8 +154,8 @@ public function switchAction(\Psr\Http\Message\ServerRequestInterface $requestIn 'decode_bodies' => true, 'decode_headers' => false ); - if ($wrapperClassName == "imapAccessWrapper") { - $cache = LocalCache::getItem("eml_remote", $file, null, array("EmlParser", "computeCacheId")); + if ($wrapperIsImap) { + $cache = LocalCache::getItem("eml_remote", $file, null, array($this, "computeCacheId")); $content = $cache->getData(); } else { $content = file_get_contents($file); @@ -183,8 +184,8 @@ public function switchAction(\Psr\Http\Message\ServerRequestInterface $requestIn 'decode_bodies' => true, 'decode_headers' => false ); - if ($wrapperClassName == "imapAccessWrapper") { - $cache = LocalCache::getItem("eml_remote", $file, null, array("EmlParser", "computeCacheId")); + if ($wrapperIsImap) { + $cache = LocalCache::getItem("eml_remote", $file, null, array($this, "computeCacheId")); $content = $cache->getData(); } else { $content = file_get_contents($file); @@ -210,12 +211,12 @@ public function switchAction(\Psr\Http\Message\ServerRequestInterface $requestIn if ($fp !== false) { fwrite($fp, $part->body, strlen($part->body)); fclose($fp); - $x->addChunk(new \Pydio\Core\Http\Message\UserMessage(sprintf($mess["editor.eml.7"], $part->d_parameters["filename"], $destRep))); + $x->addChunk(new UserMessage(sprintf($mess["editor.eml.7"], $part->d_parameters["filename"], $destRep))); } else { - $x->addChunk(new \Pydio\Core\Http\Message\UserMessage($mess["editor.eml.8"], LOG_LEVEL_ERROR)); + $x->addChunk(new UserMessage($mess["editor.eml.8"], LOG_LEVEL_ERROR)); } } else { - $x->addChunk(new \Pydio\Core\Http\Message\UserMessage($mess["editor.eml.9"], LOG_LEVEL_ERROR)); + $x->addChunk(new UserMessage($mess["editor.eml.9"], LOG_LEVEL_ERROR)); } break; @@ -233,13 +234,13 @@ public function extractMimeHeaders(&$ajxpNode, $isParent = false) if($isParent) return; $currentNode = $ajxpNode->getUrl(); $metadata = $ajxpNode->metadata; - $wrapperClassName = MetaStreamWrapper::actualRepositoryWrapperClass($ajxpNode); + $wrapperIsImap = $this->wrapperIsImap($ajxpNode); $noMail = true; - if ($metadata["is_file"] && ($wrapperClassName == "imapAccessWrapper" || preg_match("/\.eml$/i",$currentNode))) { + if ($metadata["is_file"] && ($wrapperIsImap || preg_match("/\.eml$/i",$currentNode))) { $noMail = false; } - if ($wrapperClassName == "imapAccessWrapper" && !$metadata["is_file"]) { + if ($wrapperIsImap && !$metadata["is_file"]) { $metadata["mimestring"] = "Mailbox"; } $parsed = UrlUtils::mbParseUrl($currentNode); @@ -250,8 +251,8 @@ public function extractMimeHeaders(&$ajxpNode, $isParent = false) if (EmlParser::$currentListingOnlyEmails === NULL) { EmlParser::$currentListingOnlyEmails = true; } - if ($wrapperClassName == "imapAccessWrapper") { - $cachedFile = LocalCache::getItem("eml_remote", $currentNode, null, array("EmlParser", "computeCacheId")); + if ($wrapperIsImap) { + $cachedFile = LocalCache::getItem("eml_remote", $currentNode, null, array($this, "computeCacheId")); $realFile = $cachedFile->getId(); if (!is_file($realFile)) { $cachedFile->getData();// trigger loading! @@ -264,13 +265,23 @@ public function extractMimeHeaders(&$ajxpNode, $isParent = false) $data["ajxp_mime"] = "eml"; $data["mimestring"] = "Email"; $metadata = array_merge($metadata, $data); - if ($wrapperClassName == "imapAccessWrapper" && $metadata["eml_attachments"]!= "0" && (strpos($_SERVER["HTTP_USER_AGENT"], "ajaxplorer-ios") !== false)) { + if ($wrapperIsImap && $metadata["eml_attachments"]!= "0" && (strpos($_SERVER["HTTP_USER_AGENT"], "ajaxplorer-ios") !== false)) { $metadata["is_file"] = false; $metadata["nodeName"] = basename($currentNode)."#attachments"; } $ajxpNode->metadata = $metadata; } + /** + * @param AJXP_Node $node + * @return bool + */ + protected function wrapperIsImap($node){ + $refClassName = "Pydio\\Access\\Driver\\StreamProvider\\Imap\\ImapAccessWrapper"; + $wrapperClassName = MetaStreamWrapper::actualRepositoryWrapperClass($node); + return $wrapperClassName === $refClassName; + } + /** * @param $masterFile * @param $targetFile @@ -328,15 +339,13 @@ public function mimeExtractorCallback($masterFile, $targetFile) public function lsPostProcess(\Psr\Http\Message\ServerRequestInterface $requestInterface, \Psr\Http\Message\ResponseInterface &$responseInterface) { if (!EmlParser::$currentListingOnlyEmails) { - header('Content-Type: text/xml; charset=UTF-8'); - header('Cache-Control: no-cache'); return $responseInterface; } $config = ' - + + - @@ -363,7 +372,7 @@ public function lsPostProcess(\Psr\Http\Message\ServerRequestInterface $requestI } $index ++; } else { - $text = $child->getAttribute("eml_from"); + $text = $child->getAttribute("eml_subject"); } $child->setAttribute("text", $text); $child->setAttribute("ajxp_modiftime", $child->getAttribute("eml_time")); @@ -377,7 +386,7 @@ public function lsPostProcess(\Psr\Http\Message\ServerRequestInterface $requestI $imported = $dom->importNode($insert->documentElement, true); $dom->documentElement->appendChild($imported); $responseInterface = new \Zend\Diactoros\Response(); - $responseInterface = $responseInterface->withHeader("ContentType", "text/xml"); + $responseInterface = $responseInterface->withHeader("Content-Type", "text/xml"); $responseInterface = $responseInterface->withHeader("Cache-Control", "no-cache"); $responseInterface->getBody()->write($dom->saveXML()); return $responseInterface; @@ -394,7 +403,7 @@ public function getStructureDecoder($file, $cacheRemoteContent = false) { require_once ("Mail/mimeDecode.php"); if ($cacheRemoteContent) { - $cache = LocalCache::getItem ( "eml_remote", $file , null, array("EmlParser", "computeCacheId")); + $cache = LocalCache::getItem ( "eml_remote", $file , null, array($this, "computeCacheId")); $content = $cache->getData (); } else { $content = file_get_contents ( $file ); @@ -522,7 +531,7 @@ protected function _findAttachmentById($structure, $attachId) * @param $mailPath * @return string */ - public static function computeCacheId($mailPath) + public function computeCacheId($mailPath) { $header = file_get_contents($mailPath."#header"); //$this->logDebug("Headers ", $header); diff --git a/core/src/plugins/meta.syncable/create.mysql b/core/src/plugins/meta.syncable/create.mysql index 26ad0403a0..62556af8ff 100644 --- a/core/src/plugins/meta.syncable/create.mysql +++ b/core/src/plugins/meta.syncable/create.mysql @@ -35,4 +35,4 @@ DROP TRIGGER IF EXISTS `LOG_UPDATE`; CREATE TRIGGER `LOG_UPDATE` AFTER UPDATE ON `ajxp_index` FOR EACH ROW INSERT INTO ajxp_changes (repository_identifier, node_id,source,target,type) - VALUES (new.repository_identifier, new.node_id, old.node_path, new.node_path, CASE old.node_path COLLATE utf8_bin = new.node_path COLLATE utf8_bin WHEN true THEN 'content' ELSE 'path' END); + VALUES (new.repository_identifier, new.node_id, old.node_path, new.node_path, CASE LENGTH(new.node_path) = LENGTH(old.node_path) AND old.node_path COLLATE utf8_bin = new.node_path COLLATE utf8_bin WHEN true THEN 'content' ELSE 'path' END); diff --git a/core/src/plugins/uploader.html/js/react/UploaderModel.js b/core/src/plugins/uploader.html/js/react/UploaderModel.js index 507547b212..7dfd0d429f 100644 --- a/core/src/plugins/uploader.html/js/react/UploaderModel.js +++ b/core/src/plugins/uploader.html/js/react/UploaderModel.js @@ -143,12 +143,14 @@ let bytesLoaded = computableEvent.loaded; this.setProgress(percentage, bytesLoaded); }.bind(this); + this.setStatus('loading'); let maxUpload = parseFloat(UploaderConfigs.getInstance().getOption('UPLOAD_MAX_SIZE')); let queryString; try{ + UploaderConfigs.getInstance().extensionAllowed(this); queryString = this.buildQueryString(); }catch(e){ this.onError(e.message); @@ -589,6 +591,17 @@ } } + extensionAllowed(uploadItem){ + let extString = this.getOption("ALLOWED_EXTENSIONS", '', ''); + if(!extString) return true; + let extDescription = this.getOption("ALLOWED_EXTENSIONS_READABLE", '', ''); + if(extDescription) extDescription = ' (' + extDescription + ')'; + let itemExt = PathUtils.getFileExtension(uploadItem.getLabel()); + if(extString.split(',').indexOf(itemExt) === -1){ + throw new Error(global.pydio.MessageHash[367] + extString + extDescription); + } + } + getOptionAsBool(name, userPref = '', defaultValue = undefined){ let o = this.getOption(name, userPref, defaultValue); return (o === true || o === 'true'); diff --git a/dist/php/7.0.2.html b/dist/php/7.0.2.html new file mode 100644 index 0000000000..2ba027471a --- /dev/null +++ b/dist/php/7.0.2.html @@ -0,0 +1,99 @@ +
+ +

Pydio 7.0.2 successfully installed

+ +

+ Pydio 7.0.2 is a bugfix release for Pydio 7. Main changes/fixes are +

    +
  • Encoding, zip operation, installation issues
  • +
  • Some plugins needed upgrade for v7 compatibility (imap, eml)
  • +
  • New uploader did not take into account the 'allowed extensions' parameter
  • +
  • See detailed changelog below
  • +
+ This version also introduce a new feature for dynamically providing a password for a workspace relying on session-based authentication. +

+ +

Pydio 7 Important Features

+ +

Pydio Booster

+ +

Pydio Go is a complement to Pydio that runs as a Server. It is based on GO, a performant language developed by Google. It will improve overall software performances, by delegating CPU-consuming task to this new tool. In this first version, it will handle uploads, scheduler triggers, and best of all, one-click install websocket server, which will especially improve scalability and performances by pushing events from server instead of polling all the time.
+ Pydio Go is available for Pydio Community and Pydio Enterprise.

+ +

File Gateway improves your server security

+ Pydio offers a brand new SaaS-based service called FileGateway, a host proxy to send public links without disclosing your server URL. + Choose your domain name (filesend.cc / yoursha.re) and your region (US / EU). + +

Online Documents Edition

+ + By hosting your own instance of Libreoffice Online from Collabora and using our new connector, you can now edit any office documents directly online, without the need to use third-party services like Zoho. + +

API, Performances

+ - Full rewrite of Pydio API, especially regarding provisioning, following Open API standards; there is now an extensive, accurate API REST documentation. +
- Increased caching, especially files list, whick makes it mindblasting in terms of performances, especially for remote workspaces like S3 or FTP +
- Search for files or information across several storages / workspaces at the same time, and get quicker search results with the upgrade of our Elastic Search plugin +
- New Admin parameter to easily allow or prevent user to re-share files + +

Under the Hood

+ - Code refactoring, with PSR-7 pattern, Composer, Guzzle +
- New Messaging Server based on NSQ, a language originally developed by Bitly +
- Auto-complete command line makes it easier for Admins to look for specific actions with Pydio (thanks to @symfony) +
- End of some unmaintained plugins (e.g. auth.serial, conf.serial) +
- Internal router embeded solves deployment issues, simplifying RewriteRules at maximum +
- New way of storing shares that will facilitate Pydio migrations +
And many more... !! + + +

7.0.2 detailed changelog

+
    +
  • Fix command line automatic comma-split, let it enabled only for -i and -r options, otherwise it can break some commands. (details)
  • +
  • Update current stable version (details)
  • +
  • Use a dedicated mbParseUrl() function instead of parse_url that may fail with utf-8 on some specific installs (inc. macos) (details)
  • +
  • Fix issue #1259: Zip on-the-fly option creates 0-sized empty files (apache compatibility) (details)
  • +
  • Users and groups deletion: use UsersService and RolesService instead of deleting directly in db to fix caching issues. (details)
  • +
  • Fix roles assignment when updating user groupPath (details)
  • +
  • JS UI: handle Prompt exception and dialog. (details)
  • +
  • New Middleware WorkspaceAuthRequired catches specific exception, sends JS prompt message and re-initialize request when form is submitted. (details)
  • +
  • changed invalid link to developer guide to v7 developer guide (details)
  • +
  • Reorganize MemorySafe. Add a context identifier to handle multiple credential sources. For storing when passed via ENV CLi. (details)
  • +
  • Tplus / Tminus were moved to subfolder. Fix #1255 (details)
  • +
  • Change docs editors orders. Fix #1264 (details)
  • +
  • Fix ChainCache declaring PatternClearable although subacaches may not have this feature. Fix #1265 (details)
  • +
  • Make sure to save repoId in session when loading minisite, can make some issues if shared user have other workspaces accesses. (details)
  • +
  • Sets a default provider for TaskService otherwise top-level errors of command line are not visible to task status. (details)
  • +
  • Fix slug issues - Fix #1273 (details)
  • +
  • Prevent enabling cache at install if apc/apcu is not enabled. Should fix #1261 (details)
  • +
  • Make sure to recompute readonly flag if current context has a permission mask, by using node.info.nocache hook. (details)
  • +
  • Change icon for dwg files, use cube. Fix #1230 (details)
  • +
  • Do not post "change" notifications or alerts when just copying a file to another workspace. Fix #1274 (details)
  • +
  • Silently ignore register channel on non-readable repository. Avoid sending events on write-only repositories, see #1256 (details)
  • +
  • Dav impl childExists function is highly inefficient, replace by a simple call to is_file on childnode. (details)
  • +
  • And WorkspaceAuthRequired instead of simple exception (details)
  • +
  • Fix meta.git download/preview. Fix #1275 (details)
  • +
  • Fix Shared Files download, the associated method is no more switchAction but downloadAction. Fix #1276 (details)
  • +
  • Use file_exists instead of is_file (details)
  • +
  • CLI and task_id passed : make sure to update status by default, for actions that do not implement specific tasks management. Otherwise scheduler will show "Starting action.... " and nothing more. (details)
  • +
  • Missing context in cleanUserShares() could create an error on user deletion. Close #1279 (details)
  • +
  • Fix mbParseUrl if preg_replace returns null. (details)
  • +
  • Catch deleteById() exceptions in ElasticSearch (details)
  • +
  • Remote download was broken. Fix #1281 (details)
  • +
  • Auth.multi : when looking for shared users only, skip master driver. Auth.ldap : fix users count caching per baseGroup. (details)
  • +
  • Fix CSS on share dialog title. (details)
  • +
  • Add user if not in indexed URL. (details)
  • +
  • Meta.git: make sure to apply node.change after revert operation. (details)
  • +
  • Fix counting user on ldap (details)
  • +
  • Missing curly brace (details)
  • +
  • Fix Imap & EML plugins - Warning php7 requires Mail_mimeDecode 1.5.6 - Fix #1282 (details)
  • +
  • Fix #1288 (details)
  • +
  • Rewire ALLOWED_EXTENSIONS configs - Fix #1283 (details)
  • +
  • Fix SMB access driver and custom smbclient path. Close #1290 (details)
  • +
  • Fix zip operation when child drivers are remote (inc. smb) - Fix #1287 Fix base detection for archive (details)
  • +
  • Auth.ldap: add starttsl support. See #1248, should fix it. (details)
  • +
  • Manual merge of #1292 (put encoding call directly inside win-dedicated function. (details)
  • +
  • Update trigger as mysql automatically pads varchars when comparing, creating a content instead of path in some case (trailing spaces). See #1253 (details)
  • +
  • i18n new prompt exception mechanism (details)
  • +
  • RolesManager loading role data : Make sure to remove invalid repos on error from shared repositories list. (details)
  • +
+ +
\ No newline at end of file diff --git a/dist/php/7.0.2.mysql b/dist/php/7.0.2.mysql new file mode 100644 index 0000000000..9c9f8e2070 --- /dev/null +++ b/dist/php/7.0.2.mysql @@ -0,0 +1,6 @@ +/* SEPARATOR */ +DROP TRIGGER IF EXISTS `LOG_UPDATE`; +/* SEPARATOR */ +CREATE TRIGGER `LOG_UPDATE` AFTER UPDATE ON `ajxp_index` +FOR EACH ROW INSERT INTO ajxp_changes (repository_identifier, node_id,source,target,type) +VALUES (new.repository_identifier, new.node_id, old.node_path, new.node_path, CASE LENGTH(new.node_path) = LENGTH(old.node_path) AND old.node_path COLLATE utf8_bin = new.node_path COLLATE utf8_bin WHEN true THEN 'content' ELSE 'path' END);