From f4452db58df8b55a306b8d4566dc04c20e545148 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Fri, 30 Sep 2016 11:58:27 +0200 Subject: [PATCH 01/41] Nodeslist columns metadata --- .../plugins/core.access/src/Model/NodesList.php | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/core/src/plugins/core.access/src/Model/NodesList.php b/core/src/plugins/core.access/src/Model/NodesList.php index 8a357a50f0..2b35955a36 100644 --- a/core/src/plugins/core.access/src/Model/NodesList.php +++ b/core/src/plugins/core.access/src/Model/NodesList.php @@ -135,9 +135,14 @@ public function toXML() $this->paginationData["dirs"], $this->paginationData["remoteSort"]); } + $messages = LocaleService::getMessages(); if(isSet($this->columnsDescription)){ $xmlChildren = []; foreach($this->columnsDescription['columns'] as $column){ + if(!isSet($messages[$column["messageId"]])){ + $column["messageString"] = $column["messageId"]; + unset($column["messageId"]); + } $xmlChildren[] = XMLHelper::toXmlElement("column", $column); } $xmlConfig = XMLHelper::toXmlElement("columns", $this->columnsDescription['description'], implode("", $xmlChildren)); @@ -174,15 +179,20 @@ public function initColumnsData($switchGridMode='', $switchDisplayMode='', $temp * @param string $attributeName * @param string $sortType * @param string $width + * @param array $additionalMeta * @return $this */ - public function appendColumn($messageId, $attributeName, $sortType='String', $width=''){ - $this->columnsDescription['columns'][] = [ + public function appendColumn($messageId, $attributeName, $sortType='String', $width='', $additionalMeta = []){ + $col = [ 'messageId' => $messageId, 'attributeName' => $attributeName, 'sortType' => $sortType, 'width' => $width ]; + foreach($additionalMeta as $k => $v){ + $col[$k] = $v; + } + $this->columnsDescription['columns'][] = $col; return $this; } @@ -252,7 +262,7 @@ public function render($output) if(isSet($this->columnsDescription["columns"])){ $messages = LocaleService::getMessages(); foreach($this->columnsDescription["columns"] as $column){ - $colTitle = $messages[$column["messageId"]]; + $colTitle = isSet($messages[$column["messageId"]]) ? $messages[$column["messageId"]] : $column["messageId"]; $collAttr = $column["attributeName"]; $headers[$collAttr] = $colTitle; } From c9c0ca360e8627ebd15e77d600c1425d8786534d Mon Sep 17 00:00:00 2001 From: cdujeu Date: Fri, 30 Sep 2016 12:30:49 +0200 Subject: [PATCH 02/41] start fixing mysql driver --- .../access.mysql/MysqlAccessDriver.php | 506 ++++++++++-------- .../src/plugins/access.mysql/mysqlActions.xml | 28 +- 2 files changed, 313 insertions(+), 221 deletions(-) diff --git a/core/src/plugins/access.mysql/MysqlAccessDriver.php b/core/src/plugins/access.mysql/MysqlAccessDriver.php index 380f475c31..10134fe8fc 100644 --- a/core/src/plugins/access.mysql/MysqlAccessDriver.php +++ b/core/src/plugins/access.mysql/MysqlAccessDriver.php @@ -20,18 +20,21 @@ */ namespace Pydio\Access\Driver\DataProvider; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; use Pydio\Access\Core\AbstractAccessDriver; +use Pydio\Access\Core\Model\AJXP_Node; +use Pydio\Access\Core\Model\NodesList; use Pydio\Access\Core\Model\UserSelection; use Pydio\Core\Exception\AuthRequiredException; use Pydio\Core\Http\Message\ReloadMessage; use Pydio\Core\Http\Message\UserMessage; +use Pydio\Core\Http\Response\SerializableResponseStream; use Pydio\Core\Model\ContextInterface; use Pydio\Core\Exception\PydioException; use Pydio\Core\Utils\Vars\InputFilter; use Pydio\Core\Utils\Vars\StatHelper; -use Pydio\Core\Utils\Vars\StringHelper; -use Pydio\Core\Utils\Vars\XMLFilter; defined('AJXP_EXEC') or die( 'Access not allowed'); @@ -46,6 +49,9 @@ class MysqlAccessDriver extends AbstractAccessDriver /** The user password */ public $password; + /** @var resource */ + private $link; + /** * @param ContextInterface $contextInterface * @throws PydioException @@ -59,55 +65,68 @@ protected function initRepository(ContextInterface $contextInterface) $this->closeDbLink($link); } - + /** + * @param ContextInterface $ctx + * @return bool|\mysqli + * @throws PydioException + */ public function createDbLink(ContextInterface $ctx) { - $link = FALSE; //Connects to the MySQL Database. $host = $ctx->getRepository()->getContextOption($ctx, "DB_HOST"); $dbname = $ctx->getRepository()->getContextOption($ctx, "DB_NAME"); - $link = @mysql_connect($host, $this->user, $this->password); + $link = @mysqli_connect($host, $this->user, $this->password); if (!$link) { throw new PydioException("Cannot connect to server!"); } - if (!@mysql_select_db($dbname, $link)) { + if (!@mysqli_select_db($link, $dbname)) { throw new PydioException("Cannot find database!"); } return $link; } + /** + * @param $link + * @throws PydioException + */ public function closeDbLink($link) { - if (!mysql_close($link)) { + if (!mysqli_close($link)) { throw new PydioException("Cannot close connection!"); } } /** - * @param $action - * @param $httpVars - * @param $fileVars - * @param ContextInterface $ctx - * @return null|string + * @param ServerRequestInterface $requestInterface + * @param ResponseInterface $responseInterface + * @return string + * @throws AuthRequiredException * @throws PydioException + * @throws \Pydio\Core\Exception\ForbiddenCharacterException */ - public function switchAction($action, $httpVars, $fileVars, ContextInterface $ctx) + public function switchAction(ServerRequestInterface $requestInterface, ResponseInterface &$responseInterface) { - $xmlBuffer = ""; - foreach ($httpVars as $getName=>$getValue) { - $$getName = InputFilter::securePath($getValue); - } + $httpVars = $requestInterface->getParsedBody(); + $action = $requestInterface->getAttribute("action"); + /** @var ContextInterface $ctx */ + $ctx = $requestInterface->getAttribute("ctx"); + $dir = $httpVars["dir"]; + $selection = UserSelection::fromContext($ctx, $httpVars); // FILTER DIR PAGINATION ANCHOR if (isSet($dir) && strstr($dir, "%23")!==false) { $parts = explode("%23", $dir); $dir = $parts[0]; $page = $parts[1]; + }else if(isSet($httpVars["page"])){ + $page = InputFilter::sanitize($httpVars["page"], InputFilter::SANITIZE_ALPHANUM); } // Sanitize all httpVars entries foreach($httpVars as $k=>&$value){ - $value = InputFilter::sanitize($value, InputFilter::SANITIZE_FILENAME); + if(is_string($value)){ + $value = InputFilter::sanitize($value, InputFilter::SANITIZE_FILENAME); + } } switch ($action) { @@ -116,13 +135,13 @@ public function switchAction($action, $httpVars, $fileVars, ContextInterface $ct // ONLINE EDIT //------------------------------------ case "edit_record"; + $isNew = false; if(isSet($record_is_new) && $record_is_new == "true") $isNew = true; - $tableName = $_POST["table_name"]; - $pkName = $_POST["pk_name"]; - $query = ""; + $tableName = $httpVars["table_name"]; + $pkName = $httpVars["pk_name"]; $arrValues = array(); - foreach ($_POST as $key=>$value) { + foreach ($httpVars as $key=>$value) { if (substr($key, 0, strlen("ajxp_mysql_")) == "ajxp_mysql_") { $newKey = substr($key, strlen("ajxp_mysql_")); $arrValues[$newKey] = $value; @@ -150,36 +169,25 @@ public function switchAction($action, $httpVars, $fileVars, ContextInterface $ct } $index++; } + if(!isSet($pkValue)) throw new PydioException("Cannot find PK Value"); $query = "UPDATE $tableName SET $string WHERE $pkName='$pkValue'"; } - $link = $this->createDbLink($ctx); - $res = $this->execQuery($query); - $this->closeDbLink($link); + $this->execQuery($ctx, $query); + $logMessage = $query; + $reload_file_list = true; - if (is_a($res, "Pydio\Core\Exception\PydioException")) { - $errorMessage = $res->messageId; - } else { - $logMessage = $query; - $reload_file_list = true; - } break; //------------------------------------ // CHANGE COLUMNS OR CREATE TABLE //------------------------------------ case "edit_table": - $link = $this->createDbLink($ctx); if (isSet($httpVars["current_table"])) { if (isSet($httpVars["delete_column"])) { $query = "ALTER TABLE ".$httpVars["current_table"]." DROP COLUMN ".$httpVars["delete_column"]; - $res = $this->execQuery($query); - if (is_a($res, "Pydio\Core\Exception\PydioException")) { - $errorMessage = $res->messageId; - } else { - $logMessage = $query; - $reload_file_list = true; - } - $this->closeDbLink($link); + $this->execQuery($ctx, $query); + $logMessage = $query; + $reload_file_list = true; break; } if (isSet($httpVars["add_column"])) { @@ -194,14 +202,9 @@ public function switchAction($action, $httpVars, $fileVars, ContextInterface $ct if (isSet($httpVars["add_field_uniq"]) && $httpVars["add_field_uniq"]=="1") { $query.= ", ADD UNIQUE (".$httpVars["add_field_name"].")"; } - $res = $this->execQuery($query); - if (is_a($res, "Pydio\Core\Exception\PydioException")) { - $errorMessage = $res->messageId; - } else { - $logMessage = $query; - $reload_file_list = true; - } - $this->closeDbLink($link); + $this->execQuery($ctx, $query); + $logMessage = $query; + $reload_file_list = true; break; } } @@ -224,15 +227,9 @@ public function switchAction($action, $httpVars, $fileVars, ContextInterface $ct $sizeString = ($row["size"]!=""?"(".$row["size"].")":""); $defString = ($row["default"]!=""?" DEFAULT ".$row["default"]."":""); $query = "ALTER TABLE $current_table CHANGE ".$row["origname"]." ".$row["name"]." ".$row["type"].$sizeString.$defString." ".$row["null"]; - $res = $this->execQuery(trim($query)); - if (is_a($res, "Pydio\Core\Exception\PydioException")) { - $errorMessage = $res->messageId; - $this->closeDbLink($link); - break; - } else { - $qMessage .= $query; - $reload_file_list = true; - } + $this->execQuery($ctx, trim($query)); + $qMessage .= $query; + $reload_file_list = true; } $logMessage = $qMessage; } else if (isSet($new_table)) { @@ -259,16 +256,11 @@ public function switchAction($action, $httpVars, $fileVars, ContextInterface $ct $fieldsDef.=",UNIQUE (".implode(",", $uniqs).")"; } $query = "CREATE TABLE $new_table ($fieldsDef)"; - $res = $this->execQuery((trim($query))); - if (is_a($res, "Pydio\Core\Exception\PydioException")) { - $errorMessage = $res->messageId; - } else { - $logMessage = $query; - $reload_file_list = true; - $reload_current_node = true; - } + $this->execQuery($ctx, (trim($query))); + $logMessage = $query; + $reload_file_list = true; + $reload_current_node = true; } - $this->closeDbLink($link); break; //------------------------------------ @@ -277,7 +269,6 @@ public function switchAction($action, $httpVars, $fileVars, ContextInterface $ct case "delete_table": case "delete_record": $dir = basename($dir); - $link = $this->createDbLink($ctx); if (trim($dir) == "") { // ROOT NODE => DROP TABLES $tables = $selection->getFiles(); @@ -286,7 +277,7 @@ public function switchAction($action, $httpVars, $fileVars, ContextInterface $ct $tables[$index] = basename($tableName); } $query.= " ".implode(",", $tables); - $res = $this->execQuery($query); + $this->execQuery($ctx, $query); $reload_current_node = true; } else { // TABLE NODE => DELETE RECORDS @@ -302,16 +293,11 @@ public function switchAction($action, $httpVars, $fileVars, ContextInterface $ct $pks[$key] = "(".implode(" AND ", $parts).")"; } $query = "DELETE FROM $tableName WHERE ". implode(" OR ", $pks); - $res = $this->execQuery($query); - } - //AJXP_Exception::errorToXml($res); - if (is_a($res, "Pydio\Core\Exception\PydioException")) { - $errorMessage = $res->messageId; - } else { - $logMessage = $query; - $reload_file_list = true; + $this->execQuery($ctx, $query); } - $this->closeDbLink($link); + $logMessage = $query; + $reload_file_list = true; + break; //------------------------------------ @@ -330,17 +316,23 @@ public function switchAction($action, $httpVars, $fileVars, ContextInterface $ct if(!isSet($dir) || $dir == "/") $dir = ""; $searchMode = $fileListMode = $completeMode = false; - if (isSet($mode)) { + if (isSet($httpVars["mode"])) { + $mode = $httpVars["mode"]; if($mode == "search") $searchMode = true; else if($mode == "file_list") $fileListMode = true; else if($mode == "complete") $completeMode = true; + }else{ + $mode = "file_list"; } - $link = $this->createDbLink($ctx); - //AJXP_Exception::errorToXml($link); if ($dir == "") { - XMLFilter::header(); + $nodesList = new NodesList("/"); + $tables = $this->listTables($ctx); - XMLFilter::sendFilesListComponentConfig(''); + $nodesList->initColumnsData("filelist", "list"); + $nodesList->appendColumn("Table Name", "ajxp_label"); + $nodesList->appendColumn("Byte Size", "bytesize", "Number"); + $nodesList->appendColumn("Count", "count", "Number"); + $icon = ($mode == "file_list"?"sql_images/mimes/ICON_SIZE/table_empty.png":"sql_images/mimes/ICON_SIZE/table_empty_tree.png"); foreach ($tables as $tableName) { if(InputFilter::detectXSS($tableName)) { @@ -349,25 +341,31 @@ public function switchAction($action, $httpVars, $fileVars, ContextInterface $ct $count = 'N/A'; }else{ $size = $this->getSize($ctx, $tableName); - $count = $this->getCount($tableName); + $count = $this->getCount($ctx, $tableName); } - print ""; + $node = new AJXP_Node("/$tableName", ["bytesize" => $size, "count" => $count, "icon" => $icon, "ajxp_mime" => "table"]); + $node->setLabel($tableName); + $node->setLeaf(false); + $nodesList->addBranch($node); } - print ""; - XMLFilter::close(); + $node = new AJXP_Node("/ajxpmysqldriver_searchresults", ["bytesize" => "-", "count" => "-", "icon" => "search.phng", "ajxp_node" => "true"]); + $node->setLabel("Search Results"); + $node->setLeaf(false); + $nodesList->addBranch($node); + } else { $tableName = basename($dir); + $nodesList = new NodesList("/$tableName"); + if(isSet($page))$currentPage = $page; else $currentPage = 1; - $query = "SELECT * FROM $tableName"; - $searchQuery = false; + $query = "SELECT * FROM `$tableName`"; if ($tableName == "ajxpmysqldriver_searchresults") { if (isSet($_SESSION["LAST_SQL_QUERY"])) { $query = $_SESSION["LAST_SQL_QUERY"]; $matches = array(); if (preg_match("/SELECT [\S, ]* FROM (\S*).*/i", $query, $matches)!==false) { $tableName = $matches[1]; - $searchQuery = true; } else { break; } @@ -395,35 +393,39 @@ public function switchAction($action, $httpVars, $fileVars, ContextInterface $ct unset($_SESSION["LAST_SQL_QUERY"]); throw $ex; } - XMLFilter::header(); + $blobCols = array(); - $columnsString = ''; + $nodesList->initColumnsData("grid", "list"); foreach ($result["COLUMNS"] as $col) { - $columnsString .= "cleanFlagString($col["FLAGS"])."\" field_pk=\"".(preg_match("/primary/", $col["FLAGS"])?"1":"0")."\" field_null=\"".(preg_match("/not_null/", $col["FLAGS"])?"NOT_NULL":"NULL")."\" sortType=\"".$this->sqlTypeToSortType($col["TYPE"])."\" field_default=\"".$col["DEFAULT"]."\"/>"; + $columMeta = [ + "field_name" => $col["NAME"], + "field_type" => $col["TYPE"], + "field_size" => $col["LENGTH"], + "field_flags" => $this->cleanFlagString($col["FLAGS"]), + "field_pk" => preg_match("/primary/", $col["FLAGS"])?"1":"0", + "field_null" => preg_match("/not_null/", $col["FLAGS"])?"NOT_NULL":"NULL", + "field_default" => $col["DEFAULT"] + ]; + $nodesList->appendColumn($col["NAME"], $col["NAME"], $this->sqlTypeToSortType($col["TYPE"]), '', $columMeta); if (stristr($col["TYPE"],"blob")!==false && ($col["FLAGS"]!="" && stristr($col["FLAGS"], "binary"))) { $blobCols[]=$col["NAME"]; } } - - $columnsString .= ''; - XMLFilter::sendFilesListComponentConfig($columnsString); - //print ''; if ($result["TOTAL_PAGES"] > 1) { - XMLFilter::renderPaginationData($count, $currentPage, $result["TOTAL_PAGES"]); + $nodesList->setPaginationData($count, $currentPage, $result["TOTAL_PAGES"]); } foreach ($result["ROWS"] as $arbitIndex => $row) { - print '$value) { if (in_array($key, $blobCols)) { $sizeStr = " - NULL"; if(strlen($value)) $sizeStr = " - ". StatHelper::roundSize(strlen($value)); - print "$key=\"BLOB$sizeStr\" "; + $nodeMeta[$key] = "BLOB$sizeStr"; } else { $value = str_replace("\"", "", $value); if(InputFilter::detectXSS($value)) $value = "Possible XSS Detected - Cannot display value!"; - $value = StringHelper::xmlEntities($value); - print $key.'="'.$value.'" '; + $nodeMeta[$key] = $value; if ($result["HAS_PK"]>0) { if (in_array($key, $result["PK_FIELDS"])) { $pkString .= $key."__".$value."."; @@ -432,56 +434,64 @@ public function switchAction($action, $httpVars, $fileVars, ContextInterface $ct } } if ($result["HAS_PK"] > 0) { - print 'filename="record.'.$pkString.'pk" '; - print 'is_file="1" ajxp_mime="pk"/>'; + $nodeMeta["ajxp_mime"] = "pk"; + $node = new AJXP_Node("/$tableName/record.".$pkString."pk", $nodeMeta); + $node->setLeaf(true); } else { - print 'filename="record_'.$arbitIndex.'.no_pk" '; - print 'is_file="1" ajxp_mime="row"/>'; + $nodeMeta["ajxp_mime"] = "no_pk"; + $node = new AJXP_Node("/$tableName/record.".$arbitIndex.".no_pk", $nodeMeta); + $node->setLeaf(true); } - + $nodesList->addBranch($node); } - XMLFilter::close(); } - $this->closeDbLink($link); + $responseInterface = $responseInterface->withBody(new SerializableResponseStream($nodesList)); return null; break; } - if (isset($logMessage) || isset($errorMessage)) { - if(InputFilter::detectXSS($logMessage) || InputFilter::detectXSS($errorMessage)){ - $errorMessage = "XSS detected!"; - } - } - $uMessage = new UserMessage(isSet($logMessage)?$logMessage:$errorMessage, isset($logMessage) ? LOG_LEVEL_ERROR: LOG_LEVEL_INFO); - $xmlBuffer = $uMessage->toXML(); - if (isset($requireAuth)) { throw new AuthRequiredException(); } + $serialStream = new SerializableResponseStream(); + + if(isSet($errorMessage)){ + $uMessage = new UserMessage($errorMessage, LOG_LEVEL_ERROR); + }else if(isSet($logMessage)){ + $uMessage = new UserMessage($logMessage, LOG_LEVEL_INFO); + } + if(isSet($uMessage)){ + $serialStream->addChunk($uMessage); + } + if (( isset($reload_current_node) && $reload_current_node == "true") || (isset($reload_file_list)) ) { - $relo = new ReloadMessage(); - $xmlBuffer .= $relo->toXML(); + $serialStream->addChunk(new ReloadMessage()); } - return $xmlBuffer; + $responseInterface = $responseInterface->withBody($serialStream); } + /** + * @param ContextInterface $ctx + * @param $tablename + * @return string + * @throws PydioException + */ public function getSize(ContextInterface $ctx, $tablename) { $dbname = $ctx->getRepository()->getContextOption($ctx, "DB_NAME"); $like=""; - $total=""; $t=0; if ($tablename !="") { $like=" like '$tablename'"; } $sql= "SHOW TABLE STATUS FROM `$dbname` $like"; - $result=$this->execQuery($sql); + $result=$this->execQuery($ctx, $sql); if ($result) { - while ($rec = mysql_fetch_array($result)) { + while ($rec = mysqli_fetch_array($result)) { $t+=($rec['Data_length'] + $rec['Index_length']); } $total = StatHelper::roundSize($t); @@ -491,30 +501,35 @@ public function getSize(ContextInterface $ctx, $tablename) return($total); } - public function getCount($tableName) + /** + * Get total rows count for a table + * @param $ctx + * @param $tableName + * @return int|string + */ + public function getCount($ctx, $tableName) { - $sql = "SELECT count(*) FROM $tableName"; - $result = $this->execQuery($sql); - $t = 0; - if ($result) { - while ($res = mysql_fetch_array($result)) { - $t+=$res[0]; + try{ + $sql = "SELECT count(*) FROM $tableName"; + $result = $this->execQuery($ctx, $sql); + $t = 0; + if ($result) { + while ($res = mysqli_fetch_array($result)) { + $t+=$res[0]; + } } + }catch (\Exception $e){ + $t = "-"; } return $t; } - public function getColumnData($tableName, $columnName) - { - $sql = "SHOW COLUMNS FROM $tableName LIKE '$columnName'"; - $res = $this->execQuery($sql); - if ($res) { - return mysql_fetch_array($res); - // ["Field", "Type", "Null", "Key", "Default", "Extra"] => Type is like "enum('a', 'b', 'c')" - } - return []; - } - + /** + * @param $row + * @param string $prefix + * @param string $suffix + * @return string + */ public function makeColumnDef($row, $prefix="", $suffix="") { $defString = ""; @@ -526,6 +541,10 @@ public function makeColumnDef($row, $prefix="", $suffix="") return trim($fieldsDef); } + /** + * @param $flagString + * @return string + */ public function cleanFlagString($flagString) { $arr = explode(" ", $flagString); @@ -539,6 +558,10 @@ public function cleanFlagString($flagString) return implode(" ", $newFlags); } + /** + * @param $fieldType + * @return string + */ public function sqlTypeToSortType($fieldType) { switch ($fieldType) { @@ -554,40 +577,40 @@ public function sqlTypeToSortType($fieldType) return "String"; } } - /* <--- add a slash at the beggining of this line to switch between the 2 functions - public function listTables() - { - $repo = ConfService::getRepository(); - $result = mysql_list_tables($repo->getOption("DB_NAME")); - $numtab = mysql_num_rows ($result); - $allTables = array(); - for ($i =0; $i < $numtab; $i++) { - $table = trim(mysql_tablename($result, $i)); - $allTables[] = $table; - } - return $allTables; - } - /*/ + + /** + * @param ContextInterface $ctx + * @return array + * @throws PydioException + */ public function listTables(ContextInterface $ctx) { - $result = mysql_query("SHOW TABLES FROM `".$ctx->getRepository()->getContextOption($ctx, "DB_NAME")."` LIKE '".$ctx->getRepository()->getContextOption($ctx, "DB_PTRN")."%'"); + $result = $this->execQuery($ctx, "SHOW TABLES FROM `".$ctx->getRepository()->getContextOption($ctx, "DB_NAME")."` LIKE '".$ctx->getRepository()->getContextOption($ctx, "DB_PTRN")."%'"); $allTables = array(); - while ($row = mysql_fetch_row($result)) { + while ($row = mysqli_fetch_row($result)) { $allTables[] = $row[0]; } return $allTables; } - //*/ + /** + * @param ContextInterface $ctx + * @param $query + * @param $tablename + * @param int $currentPage + * @param int $rpp + * @param string $searchval + * @return array + * @throws PydioException + */ public function showRecords(ContextInterface $ctx, $query, $tablename, $currentPage=1, $rpp=50, $searchval='' ) { - $dbname = $ctx->getRepository()->getContextOption($ctx, "DB_NAME"); - $result = $this->execQuery($query); + $totalCount = $this->getCount($ctx, $tablename); + $columns = array(); $rows = array(); - $num_rows = mysql_num_rows($result); $pg=$currentPage-1; if (isset($_POST['first'])) { $pg=0; @@ -596,51 +619,52 @@ public function showRecords(ContextInterface $ctx, $query, $tablename, $currentP } else if (isset($_POST['next'])) { $pg++; } else if (isset($_POST['last'])) { - $pgs = $num_rows/$rpp; + $pgs = $totalCount/$rpp; $pg=ceil($pgs)-1; } if ($pg < 0) { $pg=0; } - if ($pg > $num_rows/$rpp) { - $pg=ceil($num_rows/$rpp)-1; + if ($pg > $totalCount/$rpp) { + $pg=ceil($totalCount/$rpp)-1; } - $totalPages = ceil($num_rows/$rpp); + $totalPages = ceil($totalCount/$rpp); $beg = $pg * $rpp; - $flds = mysql_num_fields($result); - $fields = @mysql_list_fields( $dbname, $tablename); + $query .= " LIMIT $beg,$rpp"; + $result = $this->execQuery($ctx, $query); + + + $flds = mysqli_num_fields($result); + $fields = mysqli_fetch_fields($result); if (!$fields) { throw new PydioException("Non matching fields for table '$tablename'"); } $z=0; - $x=0; - $pkfield=array(); + $pk = []; + $pkfield= []; // MAKE COLUMNS HEADER for ($i = 0; $i < $flds; $i++) { - $c=$i+1; - $title=mysql_field_name($fields, $i); - $type=mysql_field_type($fields, $i); - $size=mysql_field_len($fields, $i); - $flagstring = mysql_field_flags ($fields, $i); - $colData = $this->getColumnData($tablename, $title); - $colDataType = $colData["Type"]; - if (preg_match("/(.*)\((.*)\)/", $colDataType, $matches)) { - $type = $matches[1]; - $size = $matches[2]; + $fieldMeta = $fields[$i]; + $title = $fieldMeta->name; + $type = $this->h_type2txt($fieldMeta->type); + $flagstring = $this->h_flags2txt($fieldMeta->flags); + $size = $fieldMeta->length; + $default = ""; + if(property_exists($fieldMeta, "default")){ + $default = $fieldMeta->default; } - $columns[] = array("NAME" => $title, "TYPE"=>$type, "LENGTH"=>$size, "FLAGS"=>$flagstring, "DEFAULT"=>$colData["Default"]); + + $columns[] = array("NAME" => $title, "TYPE"=>$type, "LENGTH"=>$size, "FLAGS"=>$flagstring, "DEFAULT"=> $default); //Find the primary key - $flagstring = mysql_field_flags ($result, $i); - if (preg_match("/primary/",$flagstring )) { + if ($fieldMeta->flags & MYSQLI_PRI_KEY_FLAG) { $pk[$z] = $i; - $pkfield[$z]= mysql_field_name($fields, $i); + $pkfield[$z]= $title; $z++; } } - $v=$flds+1; if ($z > 0) { $cpk=count($pk); @@ -649,44 +673,104 @@ public function showRecords(ContextInterface $ctx, $query, $tablename, $currentP } // MAKE ROWS RESULT - for ($s=$beg; $s < $beg + $rpp; $s++) { - if ($s < $num_rows) { - if (!mysql_data_seek ($result, $s)) { - continue; - } - $row=mysql_fetch_array($result); - if (!isset($pk)) { - $pk=' '; - $pkfield= array(); - } - $values = array(); - for ($col = 0; $col < $flds; $col ++) { - $values[mysql_field_name($fields, $col)] = stripslashes($row[$col]); - } - $rows[] = $values; + for ($s=0; $s < $rpp; $s++) { + $row=mysqli_fetch_array($result); + if (!isset($pk)) { + $pk=' '; + $pkfield= array(); + } + $values = array(); + for ($col = 0; $col < $flds; $col ++) { + $colMeta = $fields[$col]; + $values[$colMeta->name] = stripslashes($row[$col]); } + $rows[] = $values; } return array("COLUMNS" => $columns, "ROWS" => $rows, "HAS_PK"=>$cpk, "TOTAL_PAGES"=>$totalPages, "PK_FIELDS"=>$pkfield); } - - public function execQuery($sql ='') + /** + * Execute a query by creating a db link + * @param ContextInterface $ctx + * @param $sql + * @return bool|\mysqli_result + * @throws PydioException + */ + public function execQuery(ContextInterface $ctx, $sql) { - $output=''; - if ($sql !='') { - //$sql=mysql_real_escape_string($sql); - $result= @mysql_query(stripslashes($sql)); - if ($result) { - $this->logInfo("exec", array($sql)); - return $result; - } else { - throw new PydioException($sql.":".mysql_error()); - } - } else { + if(empty($sql)){ throw new PydioException('Empty Query'); } + if(!isSet($this->link) || !is_resource($this->link)){ + $link = $this->createDbLink($ctx); + $this->link = $link; + register_shutdown_function(function () use ($link){ + mysqli_close($link); + }); + } + $result= @mysqli_query($this->link, stripslashes($sql)); + if ($result) { + $this->logInfo("exec", array($sql)); + return $result; + } else { + throw new PydioException($sql.": ".mysqli_error($this->link)); + } } + /** + * Convert mysqli numeric types to text + * @param $type_id + * @return mixed|null + */ + private function h_type2txt($type_id) + { + static $types; + + if (!isset($types)) + { + $types = array(); + $constants = get_defined_constants(true); + foreach ($constants['mysqli'] as $c => $n) if (preg_match('/^MYSQLI_TYPE_(.*)/', $c, $m)) $types[$n] = $m[1]; + } + + $type = array_key_exists($type_id, $types)? strtolower($types[$type_id]) : NULL; + if($type === null) return null; + $convert = [ + "string" => "varchar", + "var_string" => "varchar" + ]; + return array_key_exists($type, $convert) ? $convert[$type] : $type; + } + + /** + * Convert mysqli numeric flags to text + * @param $flags_num + * @return string + */ + private function h_flags2txt($flags_num) + { + static $flags; + + if (!isset($flags)) + { + $flags = array(); + $constants = get_defined_constants(true); + foreach ($constants['mysqli'] as $c => $n) if (preg_match('/MYSQLI_(.*)_FLAG$/', $c, $m)) if (!array_key_exists($n, $flags)) $flags[$n] = $m[1]; + } + + $convert = [ + "pri_key" => "primary_key" + ]; + $result = array(); + foreach ($flags as $n => $t) { + if ($flags_num & $n) { + $t = strtolower($t); + if(isSet($convert[$t])) $t = $convert[$t]; + $result[] = $t; + } + } + return implode(' ', $result); + } } diff --git a/core/src/plugins/access.mysql/mysqlActions.xml b/core/src/plugins/access.mysql/mysqlActions.xml index 80a5a7d3c4..1b2eaf991b 100644 --- a/core/src/plugins/access.mysql/mysqlActions.xml +++ b/core/src/plugins/access.mysql/mysqlActions.xml @@ -59,8 +59,10 @@ @@ -77,8 +79,10 @@ @@ -202,7 +208,7 @@ + actionBarGroup="change_main" inZip="false" root="false"> @@ -210,8 +216,10 @@ + actionBarGroup="change_main" inZip="false"> From 697cc7ee67474922092b00a59e5acd0d21ffe388 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Fri, 30 Sep 2016 13:18:18 +0200 Subject: [PATCH 03/41] Fix Mysql access driver --- .../access.mysql/MysqlAccessDriver.php | 47 +++++++++++++++---- core/src/plugins/access.mysql/manifest.xml | 2 +- .../src/plugins/access.mysql/mysqlActions.xml | 14 +++--- .../resources/js/class.SQLEditor.js | 2 +- 4 files changed, 46 insertions(+), 19 deletions(-) diff --git a/core/src/plugins/access.mysql/MysqlAccessDriver.php b/core/src/plugins/access.mysql/MysqlAccessDriver.php index 10134fe8fc..4a9eb58f23 100644 --- a/core/src/plugins/access.mysql/MysqlAccessDriver.php +++ b/core/src/plugins/access.mysql/MysqlAccessDriver.php @@ -137,7 +137,9 @@ public function switchAction(ServerRequestInterface $requestInterface, ResponseI case "edit_record"; $isNew = false; - if(isSet($record_is_new) && $record_is_new == "true") $isNew = true; + if(isSet($httpVars['record_is_new']) && $httpVars['record_is_new'] == "true") { + $isNew = true; + } $tableName = $httpVars["table_name"]; $pkName = $httpVars["pk_name"]; $arrValues = array(); @@ -147,16 +149,19 @@ public function switchAction(ServerRequestInterface $requestInterface, ResponseI $arrValues[$newKey] = $value; } } + $autoKey = $this->findTableAutoIncrementKey($ctx, $tableName); if ($isNew) { - $string = ""; + $values = []; $index = 0; foreach ($arrValues as $k=>$v) { - // CHECK IF AUTO KEY!!! - $string .= "'".addslashes($v)."'"; - if($index < count($arrValues)-1) $string.=","; + if($autoKey !== false && $k === $autoKey){ + $values[] = 'NULL'; + }else{ + $values []= "'".addslashes($v)."'"; + } $index++; } - $query = "INSERT INTO $tableName VALUES ($string)"; + $query = "INSERT INTO `$tableName` VALUES (".implode(",", $values).")"; } else { $string = ""; $index = 0; @@ -170,7 +175,7 @@ public function switchAction(ServerRequestInterface $requestInterface, ResponseI $index++; } if(!isSet($pkValue)) throw new PydioException("Cannot find PK Value"); - $query = "UPDATE $tableName SET $string WHERE $pkName='$pkValue'"; + $query = "UPDATE `$tableName` SET $string WHERE $pkName='$pkValue'"; } $this->execQuery($ctx, $query); $logMessage = $query; @@ -183,6 +188,7 @@ public function switchAction(ServerRequestInterface $requestInterface, ResponseI //------------------------------------ case "edit_table": if (isSet($httpVars["current_table"])) { + $current_table = InputFilter::sanitize($httpVars["current_table"], InputFilter::SANITIZE_ALPHANUM); if (isSet($httpVars["delete_column"])) { $query = "ALTER TABLE ".$httpVars["current_table"]." DROP COLUMN ".$httpVars["delete_column"]; $this->execQuery($ctx, $query); @@ -192,7 +198,7 @@ public function switchAction(ServerRequestInterface $requestInterface, ResponseI } if (isSet($httpVars["add_column"])) { $defString = $this->makeColumnDef($httpVars, "add_field_"); - $query = "ALTER TABLE ".$httpVars["current_table"]." ADD COLUMN ($defString)"; + $query = "ALTER TABLE `".$current_table."` ADD COLUMN ($defString)"; if (isSet($httpVars["add_field_pk"]) && $httpVars["add_field_pk"]=="1") { $query.= ", ADD PRIMARY KEY (".$httpVars["add_field_name"].")"; } @@ -232,7 +238,8 @@ public function switchAction(ServerRequestInterface $requestInterface, ResponseI $reload_file_list = true; } $logMessage = $qMessage; - } else if (isSet($new_table)) { + } else if (isSet($httpVars["new_table"])) { + $new_table = InputFilter::sanitize($httpVars["new_table"], InputFilter::SANITIZE_ALPHANUM); $fieldsDef = array(); $pks = array(); $indexes = array(); @@ -261,6 +268,7 @@ public function switchAction(ServerRequestInterface $requestInterface, ResponseI $reload_file_list = true; $reload_current_node = true; } + break; //------------------------------------ @@ -593,6 +601,25 @@ public function listTables(ContextInterface $ctx) return $allTables; } + /** + * Find autoincrement key + * @param ContextInterface $ctx + * @param $tablename + * @return bool + * @throws PydioException + */ + public function findTableAutoIncrementKey(ContextInterface $ctx, $tablename){ + + $result = $this->execQuery($ctx, "SELECT * from `$tablename` LIMIT 0,1"); + $fields = mysqli_fetch_fields($result); + foreach($fields as $field){ + if($field->flags & MYSQLI_AUTO_INCREMENT_FLAG){ + return $field->name; + } + } + return false; + } + /** * @param ContextInterface $ctx * @param $query @@ -673,7 +700,7 @@ public function showRecords(ContextInterface $ctx, $query, $tablename, $currentP } // MAKE ROWS RESULT - for ($s=0; $s < $rpp; $s++) { + for ($s=0; $s < min($rpp, mysqli_num_rows($result)); $s++) { $row=mysqli_fetch_array($result); if (!isset($pk)) { $pk=' '; diff --git a/core/src/plugins/access.mysql/manifest.xml b/core/src/plugins/access.mysql/manifest.xml index 82d37dec45..99d5c436f5 100644 --- a/core/src/plugins/access.mysql/manifest.xml +++ b/core/src/plugins/access.mysql/manifest.xml @@ -45,7 +45,7 @@ #{text} -
#{files_string} : #{count}
+
#{files_string} : #{count}
]]> diff --git a/core/src/plugins/access.mysql/mysqlActions.xml b/core/src/plugins/access.mysql/mysqlActions.xml index 1b2eaf991b..ca6c759c44 100644 --- a/core/src/plugins/access.mysql/mysqlActions.xml +++ b/core/src/plugins/access.mysql/mysqlActions.xml @@ -50,8 +50,8 @@
- - + + @@ -70,10 +70,10 @@ - + + actionBarGroup="put" inZip="false" root="false"> @@ -97,7 +97,7 @@ + actionBarGroup="change_main" inZip="false" root="false"> @@ -235,10 +235,10 @@ - + + actionBarGroup="change_main" inZip="false"> diff --git a/core/src/plugins/access.mysql/resources/js/class.SQLEditor.js b/core/src/plugins/access.mysql/resources/js/class.SQLEditor.js index e676c6bd83..6820109bbe 100644 --- a/core/src/plugins/access.mysql/resources/js/class.SQLEditor.js +++ b/core/src/plugins/access.mysql/resources/js/class.SQLEditor.js @@ -198,7 +198,7 @@ Class.create("SQLEditor", { addTable.select('td[new="false"]')[0].setStyle({width:'40px'}); var addRow = addTable.select('tbody tr')[0]; var addButton = new Element('input', {type:'button', value:'Add', className:'dialogButton'}); - var submitDiv = new Element('div', {className:'dialogButtons'}).insert(addButton); + var submitDiv = new Element('div', {className:''}).insert(addButton); var submitRow = new Element('tr').insert(new Element('td', {colspan:"9"}).insert(submitDiv)); addRow.insert({after:submitRow}); addButton.observe('click', function(e){ From 2baa4b73e046f4302346a5b7c1c6ea09e19f042d Mon Sep 17 00:00:00 2001 From: tran Date: Fri, 30 Sep 2016 15:35:05 +0200 Subject: [PATCH 04/41] Add nginx config sample --- core/src/nginx.conf.sample | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 core/src/nginx.conf.sample diff --git a/core/src/nginx.conf.sample b/core/src/nginx.conf.sample new file mode 100644 index 0000000000..aa995d2993 --- /dev/null +++ b/core/src/nginx.conf.sample @@ -0,0 +1,26 @@ +# Debian 8 with default /etc/nginx/nginx.conf +# File name: /etc/nginx/sites-available/pydio.conf +server { + listen 80 default_server; + keepalive_requests 10; + keepalive_timeout 60 60; + + client_max_body_size 800M; + client_body_buffer_size 128k; + + # Document Root + root /usr/share/pydio; + + if (!-e $request_filename){ + rewrite ^(.*)$ /index.php break; + } + + # nginx configuration + location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_pass unix:/var/lib/php5-fpm/www.sock; + } +} +types { + application/font-woff2 woff2; +} \ No newline at end of file From d333730b1daeb6119afd3750e9bb165e1f4b4a91 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Fri, 30 Sep 2016 17:42:04 +0200 Subject: [PATCH 05/41] Tasks: Pass a specific className in the Task internals --- core/src/plugins/core.tasks/js/react/PydioTasks.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/src/plugins/core.tasks/js/react/PydioTasks.js b/core/src/plugins/core.tasks/js/react/PydioTasks.js index 69f018b1ee..1cb3a5d526 100644 --- a/core/src/plugins/core.tasks/js/react/PydioTasks.js +++ b/core/src/plugins/core.tasks/js/react/PydioTasks.js @@ -46,6 +46,10 @@ return this._internal['statusMessage']; } + getClassName(){ + return this._internal['className']; + } + getData(){ return this._internal; } @@ -293,11 +297,12 @@ } let click, clickStyle; if(this.props.task.hasOpenablePane()){ - click = this.props.task.openDetailPane.bind(this); + click = this.props.task.openDetailPane; clickStyle = {cursor:'pointer'}; } + let customClassName = this.props.task.getClassName() || ''; return ( -
+
{scopeInfo}{t.getLabel()}
{t.getStatusMessage()}
From b8449cbd772e08339c435a6b252f733dcf9746be Mon Sep 17 00:00:00 2001 From: cdujeu Date: Fri, 30 Sep 2016 21:42:51 +0200 Subject: [PATCH 06/41] Fix SqlMessageExchanger : make $channel property static as it is instanciated many times in the many registries. Filter message array to reduce duplication. --- .../plugins/mq.sql/SqlMessageExchanger.php | 100 ++++++++++++------ 1 file changed, 66 insertions(+), 34 deletions(-) diff --git a/core/src/plugins/mq.sql/SqlMessageExchanger.php b/core/src/plugins/mq.sql/SqlMessageExchanger.php index 821a8bec67..46a30e73c2 100644 --- a/core/src/plugins/mq.sql/SqlMessageExchanger.php +++ b/core/src/plugins/mq.sql/SqlMessageExchanger.php @@ -46,9 +46,9 @@ class SqlMessageExchanger extends Plugin implements IMessageExchanger */ public function init(ContextInterface $ctx, $options = []) { - parent::init($ctx, $options); - $this->sqlDriver = $this->sqlDriver = OptionsHelper::cleanDibiDriverParameters($options["SQL_DRIVER"]); - } + parent::init($ctx, $options); + $this->sqlDriver = OptionsHelper::cleanDibiDriverParameters($options["SQL_DRIVER"]); + } public function performChecks() { @@ -63,7 +63,7 @@ public function performChecks() /** * @var array */ - private $channels; + private static $channels; private $clientsGCTime = 10; private $sqlDriver; @@ -74,30 +74,30 @@ public function performChecks() */ public function loadChannel($channelName, $create = false) { - if (isSet($this->channels) && is_array($this->channels[$channelName])) { + if (isSet(self::$channels) && is_array(self::$channels[$channelName])) { return; } if (is_file($this->getPluginWorkDir()."/queues/channel-$channelName")) { - if(!isset($this->channels)) $this->channels = array(); + if(!isset(self::$channels)) self::$channels = array(); $data = FileHelper::loadSerialFile($this->getPluginWorkDir() . "/queues/channel-$channelName"); if (is_array($data)) { if(!is_array($data["MESSAGES"])) $data["MESSAGES"] = array(); if(!is_array($data["CLIENTS"])) $data["CLIENTS"] = array(); - $this->channels[$channelName] = $data; + self::$channels[$channelName] = $data; return; } } if ($create) { - if(!isSet($this->channels)) $this->channels = array(); - $this->channels[$channelName] = array("CLIENTS" => array(), + if(!isSet(self::$channels)) self::$channels = array(); + self::$channels[$channelName] = array("CLIENTS" => array(), "MESSAGES" => array()); } } public function __destruct() { - if (isSet($this->channels) && is_array($this->channels)) { - foreach ($this->channels as $channelName => $data) { + if (isSet(self::$channels) && is_array(self::$channels)) { + foreach (self::$channels as $channelName => $data) { if (is_array($data)) { FileHelper::saveSerialFile($this->getPluginWorkDir() . "/queues/channel-$channelName", $data); } @@ -128,13 +128,16 @@ public function suscribeToChannel(ContextInterface $ctx, $channelName, $clientId $USER_ID = "shared"; } if($GROUP_PATH == null) $GROUP_PATH = false; - $this->channels[$channelName]["CLIENTS"][$clientId] = array( + self::$channels[$channelName]["CLIENTS"][$clientId] = array( "ALIVE" => time(), "USER_ID" => $USER_ID, "GROUP_PATH" => $GROUP_PATH ); + if(strpos($channelName, "nodes:") === 0 && $channelName !== "nodes:*"){ + $this->suscribeToChannel($ctx, "nodes:*", $clientId); + } /* - foreach ($this->channels[$channelName]["MESSAGES"] as &$object) { + foreach (self::$channels[$channelName]["MESSAGES"] as &$object) { $object->messageRC[$clientId] = $clientId; } */ @@ -149,13 +152,13 @@ public function suscribeToChannel(ContextInterface $ctx, $channelName, $clientId public function unsuscribeFromChannel(ContextInterface $ctx, $channelName, $clientId) { $this->loadChannel($channelName); - if(!isSet($this->channels) || !isSet($this->channels[$channelName])) return; - if(!array_key_exists($clientId, $this->channels[$channelName]["CLIENTS"])) return; - unset($this->channels[$channelName]["CLIENTS"][$clientId]); - foreach ($this->channels[$channelName]["MESSAGES"] as $index => &$object) { + if(!isSet(self::$channels) || !isSet(self::$channels[$channelName])) return; + if(!array_key_exists($clientId, self::$channels[$channelName]["CLIENTS"])) return; + unset(self::$channels[$channelName]["CLIENTS"][$clientId]); + foreach (self::$channels[$channelName]["MESSAGES"] as $index => &$object) { unset($object->messageRC[$clientId]); if (count($object->messageRC)== 0) { - unset($this->channels[$channelName]["MESSAGES"][$index]); + unset(self::$channels[$channelName]["MESSAGES"][$index]); } } } @@ -168,12 +171,12 @@ public function unsuscribeFromChannel(ContextInterface $ctx, $channelName, $clie public function publishToChannel(ContextInterface $ctx, $channelName, $messageObject) { $this->loadChannel($channelName); - if(!isSet($this->channels) || !isSet($this->channels[$channelName])) return; - if(!count($this->channels[$channelName]["CLIENTS"])) return; - $clientIds = array_keys($this->channels[$channelName]["CLIENTS"]); + if(!isSet(self::$channels) || !isSet(self::$channels[$channelName])) return; + if(!count(self::$channels[$channelName]["CLIENTS"])) return; + $clientIds = array_keys(self::$channels[$channelName]["CLIENTS"]); $messageObject->messageRC = array_combine($clientIds, $clientIds); $messageObject->messageTS = microtime(); - $this->channels[$channelName]["MESSAGES"][] = $messageObject; + self::$channels[$channelName]["MESSAGES"][] = $messageObject; } /** @@ -188,13 +191,13 @@ public function publishToChannel(ContextInterface $ctx, $channelName, $messageOb public function consumeInstantChannel(ContextInterface $ctx, $channelName, $clientId, $userId, $userGroup) { $this->loadChannel($channelName); - if(!isSet($this->channels) || !isSet($this->channels[$channelName])) { + if(!isSet(self::$channels) || !isSet(self::$channels[$channelName])) { return null; } // Check dead clients - if (is_array($this->channels[$channelName]["CLIENTS"])) { + if (is_array(self::$channels[$channelName]["CLIENTS"])) { $toRemove = array(); - foreach ($this->channels[$channelName]["CLIENTS"] as $cId => $cData) { + foreach (self::$channels[$channelName]["CLIENTS"] as $cId => $cData) { $cAlive = $cData["ALIVE"]; if( $cId != $clientId && time() - $cAlive > $this->clientsGCTime * 60) $toRemove[] = $cId; } @@ -204,14 +207,14 @@ public function consumeInstantChannel(ContextInterface $ctx, $channelName, $clie } } } - if (!array_key_exists($clientId, $this->channels[$channelName]["CLIENTS"])) { + if (!array_key_exists($clientId, self::$channels[$channelName]["CLIENTS"])) { // Auto Suscribe $this->suscribeToChannel($ctx, $channelName, $clientId); } - $this->channels[$channelName]["CLIENTS"][$clientId]["ALIVE"] = time(); + self::$channels[$channelName]["CLIENTS"][$clientId]["ALIVE"] = time(); $result = array(); - foreach ($this->channels[$channelName]["MESSAGES"] as $index => $object) { + foreach (self::$channels[$channelName]["MESSAGES"] as $index => $object) { if (!isSet($object->messageRC[$clientId])) { continue; } @@ -226,11 +229,14 @@ public function consumeInstantChannel(ContextInterface $ctx, $channelName, $clie $result[] = $object; unset($object->messageRC[$clientId]); if (count($object->messageRC) <= 0) { - unset($this->channels[$channelName]["MESSAGES"][$index]); + unset(self::$channels[$channelName]["MESSAGES"][$index]); } else { - $this->channels[$channelName]["MESSAGES"][$index] = $object; + self::$channels[$channelName]["MESSAGES"][$index] = $object; } } + if(strpos($channelName, "nodes:")===0 && $channelName !== "nodes:*"){ + $result = $result + $this->consumeInstantChannel($ctx, "nodes:*", $clientId, $userId, $userGroup); + } return $result; } @@ -297,12 +303,38 @@ public function publishWorkerMessage(ContextInterface $ctx, $channel, $message) public function publishInstantMessage(ContextInterface $ctx, $channel, $message) { $this->loadChannel($channel); - if(!isSet($this->channels) || !isSet($this->channels[$channel])) return; - if(!count($this->channels[$channel]["CLIENTS"])) return; - $clientIds = array_keys($this->channels[$channel]["CLIENTS"]); + if(!isSet(self::$channels) || !isSet(self::$channels[$channel])) return; + if(!count(self::$channels[$channel]["CLIENTS"])) return; + $clientIds = array_keys(self::$channels[$channel]["CLIENTS"]); + + $compareStringNoRC = json_encode($message); $message->messageRC = array_combine($clientIds, $clientIds); + // Remove similar messages + $compareString = json_encode($message); + + $clean = array_values(array_filter(self::$channels[$channel]["MESSAGES"], function($stdClass) use ($compareString, $compareStringNoRC, $message){ + $classCopy = new \stdClass(); + $classCopyNoRC = new \stdClass(); + $vars = get_object_vars($stdClass); + foreach($vars as $key => $var){ + if($key === "messageTS") continue; + $classCopy->$key = $var; + if($key !== "messageRC") { + $classCopyNoRC->$key = $var; + } + } + if (json_encode($classCopy) === $compareString){ + return false; + } + if(json_encode($classCopyNoRC) === $compareStringNoRC && empty(array_diff($stdClass->messageRC, $message->messageRC))){ + // Existing copy has same content, and less RC than new one. + return false; + } + return true; + })); $message->messageTS = microtime(); - $this->channels[$channel]["MESSAGES"][] = $message; + $clean[] = $message; + self::$channels[$channel]["MESSAGES"] = $clean; } } From e3872abb3b5c2d3af76ad5c480d26dfcc4e573ed Mon Sep 17 00:00:00 2001 From: cdujeu Date: Fri, 30 Sep 2016 21:48:48 +0200 Subject: [PATCH 07/41] Sharing: pass original node down to the rightsManager, and send an event when updating/remove rights on user or roles. --- core/src/plugins/action.share/src/ShareCenter.php | 11 ++++++----- .../action.share/src/Store/ShareRightsManager.php | 11 ++++++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/core/src/plugins/action.share/src/ShareCenter.php b/core/src/plugins/action.share/src/ShareCenter.php index 2b23dff716..d5f3e090c2 100644 --- a/core/src/plugins/action.share/src/ShareCenter.php +++ b/core/src/plugins/action.share/src/ShareCenter.php @@ -648,7 +648,7 @@ public function switchAction(ServerRequestInterface &$requestInterface, Response $users = array(); $groups = array(); $this->getRightsManager()->createUsersFromParameters($httpVars, $users, $groups); - $result = $this->createSharedRepository($httpVars, $isUpdate, $users, $groups); + $result = $this->createSharedRepository($httpVars, $isUpdate, $users, $groups, $ajxpNode); if (is_object($result) && $result instanceof Repository) { @@ -1573,7 +1573,7 @@ public function createSharedMinisite($httpVars, &$update) $users = array(); $groups = array(); $users[$hiddenUserEntry["ID"]] = $hiddenUserEntry; - $newRepo = $this->createSharedRepository($httpVars, $repoUpdate, $users, $groups); + $newRepo = $this->createSharedRepository($httpVars, $repoUpdate, $users, $groups, $userSelection->getUniqueNode()); $shareObject->setParentRepositoryId($this->repository->getId()); $shareObject->attachToRepository($newRepo->getId()); @@ -1619,10 +1619,11 @@ public function createSharedMinisite($httpVars, &$update) * @param bool $update * @param array $users * @param array $groups + * @param AJXP_Node $originalNode * @return Repository * @throws \Exception */ - public function createSharedRepository($httpVars, &$update, $users=array(), $groups=array()) + public function createSharedRepository($httpVars, &$update, $users=array(), $groups=array(), $originalNode = null) { // ERRORS // 100 : missing args @@ -1642,7 +1643,7 @@ public function createSharedRepository($httpVars, &$update, $users=array(), $gro $newRepo = $this->createOrLoadSharedRepository($httpVars, $update); $selection = UserSelection::fromContext($this->currentContext, $httpVars); - $this->getRightsManager()->assignSharedRepositoryPermissions($currentRepo, $newRepo, $update, $users, $groups, $selection); + $this->getRightsManager()->assignSharedRepositoryPermissions($currentRepo, $newRepo, $update, $users, $groups, $selection, $originalNode); // HANDLE WATCHES ON CHILDREN AND PARENT foreach($users as $userName => $userEntry){ @@ -1773,7 +1774,7 @@ public function shareNode(ContextInterface $ctx, $ajxpNode, $httpVars, &$update) return null; } - $newRepo = $this->createSharedRepository($httpVars, $update, $users, $groups); + $newRepo = $this->createSharedRepository($httpVars, $update, $users, $groups, $ajxpNode); foreach($shareObjects as $shareObject){ diff --git a/core/src/plugins/action.share/src/Store/ShareRightsManager.php b/core/src/plugins/action.share/src/Store/ShareRightsManager.php index b02108e8d8..e5910537fd 100644 --- a/core/src/plugins/action.share/src/Store/ShareRightsManager.php +++ b/core/src/plugins/action.share/src/Store/ShareRightsManager.php @@ -409,9 +409,10 @@ public function computeSharedRepositoryAccessRights($repoId, $mixUsersAndGroups, * @param array $users * @param array $groups * @param \Pydio\Access\Core\Model\UserSelection $selection + * @param AJXP_Node $originalNode * @throws \Exception */ - public function assignSharedRepositoryPermissions($parentRepository, $childRepository, $isUpdate, $users, $groups, $selection){ + public function assignSharedRepositoryPermissions($parentRepository, $childRepository, $isUpdate, $users, $groups, $selection, $originalNode = null){ $childRepoId = $childRepository->getId(); if($isUpdate){ @@ -458,6 +459,9 @@ public function assignSharedRepositoryPermissions($parentRepository, $childRepos } $userObject->save("superuser"); + if(!empty($originalNode)){ + Controller::applyHook("node.share.assign_right", array($this->context, $userObject, $childRepository, $originalNode)); + } } foreach ($groups as $group => $groupEntry) { @@ -465,6 +469,9 @@ public function assignSharedRepositoryPermissions($parentRepository, $childRepos $grRole = RolesService::getOrCreateRole($group, $this->context->hasUser() ? $this->context->getUser()->getGroupPath() : "/"); $grRole->setAcl($childRepoId, $r); RolesService::updateRole($grRole); + if(!empty($originalNode)) { + Controller::applyHook("node.share.assign_right", array($this->context, $group, $childRepository, $originalNode)); + } } } @@ -491,6 +498,7 @@ public function unregisterRemovedUsers($repoId, $newUsers, $newGroups, $watcherN $userObject = UsersService::getUserById($user, false); $userObject->getPersonalRole()->setAcl($repoId, ""); $userObject->save("superuser"); + Controller::applyHook("node.share.remove_right", array($this->context, $userObject, $repoId)); } if($this->watcher !== false && $watcherNode !== null){ $this->watcher->removeWatchFromFolder( @@ -509,6 +517,7 @@ public function unregisterRemovedUsers($repoId, $newUsers, $newGroups, $watcherN if ($role !== false) { $role->setAcl($repoId, ""); RolesService::updateRole($role); + Controller::applyHook("node.share.remove_right", array($this->context, $groupId, $repoId)); } } } From ae5d6e27471118cad24d2401a7b25cd8e2aa6e1a Mon Sep 17 00:00:00 2001 From: cdujeu Date: Fri, 30 Sep 2016 21:49:31 +0200 Subject: [PATCH 08/41] LeftPanel : listen to the alerts widget and display a notification using the tasks when there is something new. --- .../res/js/ui/reactjs/jsx/LeftNavigation.js | 148 ++++++++++++++++-- .../gui.ajax/res/themes/orbit/css/pydio.css | 20 ++- .../res/themes/orbit/css/theme/widgets.less | 17 +- 3 files changed, 165 insertions(+), 20 deletions(-) diff --git a/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/LeftNavigation.js b/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/LeftNavigation.js index 4ce9b13d9b..df147e83c9 100644 --- a/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/LeftNavigation.js +++ b/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/LeftNavigation.js @@ -51,6 +51,7 @@ getInitialState:function(){ return { statusOpen:true, + blinkingBell: false, additionalContents:this.parseComponentConfigs(), workspaces: this.props.pydio.user.getRepositoriesList() }; @@ -107,6 +108,40 @@ this._timer = global.setTimeout(this.closeNavigation, 300); }, + onAlertPanelBadgeChange: function(paneData, newValue, oldValue, memoData){ + if(paneData.id !== 'navigation_alerts'){ + return; + } + if(newValue){ + this.setState({blinkingBell: newValue, blinkingBellClass:paneData.options['titleClassName']}); + }else{ + this.setState({blinkingBell: false}); + } + + if(newValue && newValue !== oldValue){ + if(Object.isNumber(newValue)){ + if(oldValue !== '' && newValue > oldValue){ + let notifText = 'Something happened!'; + if(memoData instanceof PydioDataModel){ + let node = memoData.getRootNode().getFirstChildIfExists(); + if(node){ + if(paneData.options['tipAttribute']){ + notifText = node.getMetadata().get(paneData.options['tipAttribute']); + }else{ + notifText = node.getLabel(); + } + } + } + AlertTask.setCloser(this.openNavigation.bind(this)); + let title = global.pydio.MessageHash[paneData.options.title] || paneData.options.title; + let alert = new AlertTask(title, notifText); + alert.show(); + } + } + } + + }, + render:function(){ const additional = this.state.additionalContents.map(function(paneData){ if(paneData.type == 'ListProvider'){ @@ -115,6 +150,7 @@ pydio={this.props.pydio} paneData={paneData} nodeClicked={this.listNodeClicked} + onBadgeChange={this.onAlertPanelBadgeChange} /> ); }else{ @@ -122,10 +158,15 @@ } }.bind(this)); + let badge; + if(this.state.blinkingBell){ + badge = ; + } + return (
- + {badge}
{additional} @@ -139,11 +180,63 @@ } }); + class AlertTask extends PydioTasks.Task{ + + constructor(label, statusMessage){ + super({ + id : 'local-alert-task-' + Math.random(), + userId : global.pydio.user.id, + wsId : global.pydio.user.activeRepository, + label : label, + status : PydioTasks.Task.STATUS_PENDING, + statusMessage : statusMessage, + className : 'alert-task' + }); + } + + show(){ + this._timer = global.setTimeout(function(){ + this.updateStatus(PydioTasks.Task.STATUS_COMPLETE); + }.bind(this), 7000); + PydioTasks.Store.getInstance().enqueueLocalTask(this); + } + + updateStatus(status, statusMessage = ''){ + this._internal['status'] = status; + this._internal['statusMessage'] = statusMessage; + this.notifyMainStore(); + } + + notifyMainStore(){ + PydioTasks.Store.getInstance().notify("tasks_updated"); + } + + hasOpenablePane(){ + return true; + } + openDetailPane(){ + AlertTask.close(); + } + + static setCloser(click){ + AlertTask.__CLOSER = click; + } + + static close(){ + AlertTask.__CLOSER(); + } + + } + + + var DataModelBadge = React.createClass({ propTypes:{ dataModel:React.PropTypes.instanceOf(PydioDataModel), - options:React.PropTypes.object + options:React.PropTypes.object, + onBadgeIncrease: React.PropTypes.func, + onBadgeChange: React.PropTypes.func }, getInitialState:function(){ @@ -151,33 +244,43 @@ }, componentDidMount:function(){ - var options = this.props.options; - var dm = this.props.dataModel; + let options = this.props.options; + let dm = this.props.dataModel; + let newValue = ''; this._observer = function(){ switch (options.property){ case "root_children": var l = dm.getRootNode().getChildren().size; - this.setState({value:l?l:''}); + newValue = l ? l : 0; break; case "root_label": - this.setState({value:dm.getRootNode().getLabel()}); + newValue = dm.getRootNode().getLabel(); break; case "root_children_empty": var cLength = dm.getRootNode().getChildren().size; - this.setState({value:!cLength?options['emptyMessage']:''}); + newValue = !cLength?options['emptyMessage']:''; break; case "metadata": if(options['metadata_sum']){ - var sum = 0; + newValue = 0; dm.getRootNode().getChildren().forEach(function(c){ - if(c.getMetadata().get(options['metadata_sum'])) sum += parseInt(c.getMetadata().get(options['metadata_sum'])); + if(c.getMetadata().get(options['metadata_sum'])) newValue += parseInt(c.getMetadata().get(options['metadata_sum'])); }); - this.setState({value:sum?sum:''}); } break; default: break; } + let prevValue = this.state.value; + if(newValue && newValue !== prevValue){ + if(Object.isNumber(newValue) && this.props.onBadgeIncrease){ + if(prevValue !== '' && newValue > prevValue) this.props.onBadgeIncrease(newValue, prevValue ? prevValue : 0, this.props.dataModel); + } + } + if(this.props.onBadgeChange){ + this.props.onBadgeChange(newValue, prevValue, this.props.dataModel); + } + this.setState({value: newValue}); }.bind(this); dm.getRootNode().observe("loaded", this._observer); }, @@ -202,7 +305,9 @@ paneData:React.PropTypes.object, pydio:React.PropTypes.instanceOf(Pydio), nodeClicked:React.PropTypes.func, - startOpen:React.PropTypes.bool + startOpen:React.PropTypes.bool, + onBadgeIncrease: React.PropTypes.func, + onBadgeChange: React.PropTypes.func }, getInitialState:function(){ @@ -225,6 +330,20 @@ this.setState({open:!this.state.open, componentLaunched:true}); }, + onBadgeIncrease: function(newValue, prevValue, memoData){ + if(this.props.onBadgeIncrease){ + this.props.onBadgeIncrease(this.props.paneData, newValue, prevValue, memoData); + if(!this.state.open) this.toggleOpen(); + } + }, + + onBadgeChange(newValue, prevValue, memoData){ + if(this.props.onBadgeChange){ + this.props.onBadgeChange(this.props.paneData, newValue, prevValue, memoData); + if(!this.state.open) this.toggleOpen(); + } + }, + render:function(){ var messages = this.props.pydio.MessageHash; @@ -236,7 +355,12 @@ var badge; if(paneData.options.dataModelBadge){ - badge = ; + badge = ; } var emptyMessage; if(paneData.options.emptyChildrenMessage){ diff --git a/core/src/plugins/gui.ajax/res/themes/orbit/css/pydio.css b/core/src/plugins/gui.ajax/res/themes/orbit/css/pydio.css index 037a017592..280bc9130e 100644 --- a/core/src/plugins/gui.ajax/res/themes/orbit/css/pydio.css +++ b/core/src/plugins/gui.ajax/res/themes/orbit/css/pydio.css @@ -6725,15 +6725,27 @@ div.dialogButtons.inlineEdition input { height: 20px; width: 15px; transition: all 550ms cubic-bezier(0.23, 1, 0.32, 1) 0ms; + position: relative; } -#repo_chooser:hover { - background-color: #353535; - color: white; +#repo_chooser span.badge-icon { + display: inline; + position: absolute; + font-size: 7px; + top: 32px; + left: 24px; + background-color: #222; + padding: 2px 2px; + border-radius: 7px; + color: #fff; + transition: all 550ms cubic-bezier(0.23, 1, 0.32, 1) 0ms; } #repo_chooser.disabled { display: none; } -#repo_chooser.open { +#repo_chooser:hover, +#repo_chooser:hover span.badge-icon, +#repo_chooser.open, +#repo_chooser.open span.badge-icon { background-color: #353535; } #repo_chooser span.icon-sitemap { diff --git a/core/src/plugins/gui.ajax/res/themes/orbit/css/theme/widgets.less b/core/src/plugins/gui.ajax/res/themes/orbit/css/theme/widgets.less index 68fe884ec9..a11cd741e3 100644 --- a/core/src/plugins/gui.ajax/res/themes/orbit/css/theme/widgets.less +++ b/core/src/plugins/gui.ajax/res/themes/orbit/css/theme/widgets.less @@ -14,14 +14,23 @@ height: 20px; width: 15px; transition: @bezier_transition; - &:hover{ - background-color: @leftpanel_background_color; - color: white; + position: relative; + span.badge-icon{ + display: inline; + position: absolute; + font-size: 7px; + top: 32px; + left: 24px; + background-color: #222; + padding: 2px 2px; + border-radius: 7px; + color: #fff; + transition: @bezier_transition; } &.disabled{ display:none; } - &.open{ + &:hover, &:hover span.badge-icon, &.open, &.open span.badge-icon{ background-color: @leftpanel_background_color; } span.icon-sitemap { From 339f543cfb6d3cfca1c4d85dd494b809cfb0d951 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Fri, 30 Sep 2016 21:51:56 +0200 Subject: [PATCH 09/41] Notifications: send alerts to a larger scope: repository "*" and/or full groupPath. Handle that in messageExchanger and in notification DB persistence. Use this new system to send an alert when sharing a file or folder with a user. --- .../plugins/core.notifications/IFeedStore.php | 9 +- .../core.notifications/NotificationCenter.php | 62 ++++++++++++- .../plugins/core.notifications/manifest.xml | 1 + .../core.notifications/templates/block/ca.php | 90 ++++++++++--------- .../core.notifications/templates/block/de.php | 90 ++++++++++--------- .../core.notifications/templates/block/en.php | 2 + .../core.notifications/templates/block/es.php | 90 ++++++++++--------- .../core.notifications/templates/block/fr.php | 90 ++++++++++--------- .../core.notifications/templates/block/pt.php | 4 +- .../core.notifications/templates/block/ru.php | 90 ++++++++++--------- .../core.notifications/templates/group/ca.php | 74 +++++++-------- .../core.notifications/templates/group/de.php | 74 +++++++-------- .../core.notifications/templates/group/en.php | 2 + .../core.notifications/templates/group/es.php | 74 +++++++-------- .../core.notifications/templates/group/fr.php | 74 +++++++-------- .../core.notifications/templates/group/pt.php | 74 +++++++-------- .../core.notifications/templates/group/ru.php | 74 +++++++-------- .../core.notifications/templates/long/ca.php | 90 ++++++++++--------- .../core.notifications/templates/long/de.php | 88 +++++++++--------- .../core.notifications/templates/long/en.php | 2 + .../core.notifications/templates/long/es.php | 90 ++++++++++--------- .../core.notifications/templates/long/fr.php | 88 +++++++++--------- .../core.notifications/templates/long/pt.php | 4 +- .../core.notifications/templates/long/ru.php | 88 +++++++++--------- .../core.notifications/templates/short/ca.php | 40 +++++---- .../core.notifications/templates/short/de.php | 40 +++++---- .../core.notifications/templates/short/en.php | 3 +- .../core.notifications/templates/short/es.php | 40 +++++---- .../core.notifications/templates/short/fr.php | 74 +++++++-------- .../core.notifications/templates/short/pt.php | 74 +++++++-------- .../core.notifications/templates/short/ru.php | 40 +++++---- core/src/plugins/feed.sql/SqlFeedStore.php | 37 +++++--- 32 files changed, 949 insertions(+), 823 deletions(-) diff --git a/core/src/plugins/core.notifications/IFeedStore.php b/core/src/plugins/core.notifications/IFeedStore.php index e0b2ce3007..c4785fe92e 100644 --- a/core/src/plugins/core.notifications/IFeedStore.php +++ b/core/src/plugins/core.notifications/IFeedStore.php @@ -21,6 +21,7 @@ namespace Pydio\Notification\Core; use Pydio\Core\Model\ContextInterface; +use Pydio\Core\Model\UserInterface; defined('AJXP_EXEC') or die('Access not allowed'); @@ -69,17 +70,19 @@ public function deleteFeed($types='event', $userId = null, $repositoryId = null, /** * @abstract * @param Notification $notif + * @param bool $repoScopeAll + * @param bool|string $groupScope * @return mixed */ - public function persistAlert(Notification $notif); + public function persistAlert(Notification $notif, $repoScopeAll = false, $groupScope = false); /** * @abstract - * @param $userId + * @param UserInterface $userObject * @param null $repositoryIdFilter * @return Notification[] */ - public function loadAlerts($userId, $repositoryIdFilter = null); + public function loadAlerts($userObject, $repositoryIdFilter = null); /** diff --git a/core/src/plugins/core.notifications/NotificationCenter.php b/core/src/plugins/core.notifications/NotificationCenter.php index 9502e56b1b..c4985cc221 100755 --- a/core/src/plugins/core.notifications/NotificationCenter.php +++ b/core/src/plugins/core.notifications/NotificationCenter.php @@ -25,6 +25,8 @@ use Pydio\Access\Core\Model\AJXP_Node; use Pydio\Core\Exception\PydioException; use Pydio\Core\Model\ContextInterface; +use Pydio\Core\Model\RepositoryInterface; +use Pydio\Core\Model\UserInterface; use Pydio\Core\PluginFramework\PluginsService; use Pydio\Core\Services\ConfService; use Pydio\Core\Controller\Controller; @@ -397,7 +399,7 @@ public function loadUserAlerts(\Psr\Http\Message\ServerRequestInterface $request if ($repositoryFilter == null) { $repositoryFilter = $ctx->getRepositoryId(); } - $res = $this->eventStore->loadAlerts($userId, $repositoryFilter); + $res = $this->eventStore->loadAlerts($u, $repositoryFilter); if(!count($res)) return; // Recompute children notifs @@ -436,7 +438,7 @@ public function loadUserAlerts(\Psr\Http\Message\ServerRequestInterface $request $path = $node->getPath(); $nodeRepo = $node->getRepository(); - if($nodeRepo != null && $nodeRepo->hasParent() && $nodeRepo->getParentId() == $repositoryFilter){ + if($notification->getAction() !== "share" && $nodeRepo != null && $nodeRepo->hasParent() && $nodeRepo->getParentId() == $repositoryFilter){ $newCtx = $node->getContext(); $currentRoot = $nodeRepo->getContextOption($newCtx, "PATH"); $contentFilter = $nodeRepo->getContentFilter(); @@ -575,6 +577,62 @@ public function generateNotificationFromChangeHook(AJXP_Node $oldNode = null, AJ return $notif; } + /** + * @param ContextInterface $context + * @param UserInterface|string $userOrRole + * @param RepositoryInterface $sharedRepository + * @param AJXP_Node $originalNode + */ + public function shareAssignRight($context, $userOrRole, $sharedRepository, $originalNode){ + + $notification = new Notification(); + $notification->setAction("share"); + $notification->setAuthor($context->getUser()->getId()); + + if($userOrRole instanceof UserInterface && !$userOrRole->isHidden()){ + + $targetIdentifier = $userOrRole->getId(); + $notification->setTarget($targetIdentifier); + if($originalNode->isLeaf()){ + $node = new AJXP_Node("pydio://".$targetIdentifier."@inbox/".$originalNode->getLabel()); + $node->setLeaf(true); + }else{ + $node = new AJXP_Node("pydio://".$targetIdentifier."@".$sharedRepository->getId()."/"); + $node->setLeaf(false); + } + $notification->setNode($node); + $this->eventStore->persistAlert($notification, true); + Controller::applyHook("msg.instant",array( + $context->withRepositoryId(null), + "", + $targetIdentifier + )); + + }else if(is_string($userOrRole) && strpos($userOrRole, "AJXP_GRP_/") === 0){ + + $groupPath = substr($userOrRole, strlen("AJXP_GRP_")); + $notification->setTarget("*"); + if($originalNode->isLeaf()){ + $node = new AJXP_Node("pydio://*@inbox/".$originalNode->getLabel()); + $node->setLeaf(true); + }else{ + $node = new AJXP_Node("pydio://*@".$sharedRepository->getId()."/"); + $node->setLeaf(false); + } + $notification->setNode($node); + $this->eventStore->persistAlert($notification, true, $groupPath); + Controller::applyHook("msg.instant",array( + $context->withRepositoryId(null), + "", + null, + $groupPath + )); + + + } + + } + /** * @param Notification $notif diff --git a/core/src/plugins/core.notifications/manifest.xml b/core/src/plugins/core.notifications/manifest.xml index fb547e8522..37a74597c8 100644 --- a/core/src/plugins/core.notifications/manifest.xml +++ b/core/src/plugins/core.notifications/manifest.xml @@ -128,6 +128,7 @@ + diff --git a/core/src/plugins/core.notifications/templates/block/ca.php b/core/src/plugins/core.notifications/templates/block/ca.php index 071e3fa35f..60d60d04af 100644 --- a/core/src/plugins/core.notifications/templates/block/ca.php +++ b/core/src/plugins/core.notifications/templates/block/ca.php @@ -1,47 +1,49 @@ - * 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 . - */ +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ // catalan translation: Salva Gómez , 2016 $mess=array( - "user_link" => "per", - "file.add" => "creat", - "file.delete" => "eliminat", - "file.change" => "modificat", - "file.rename" => "renombrat a AJXP_NODE_LABEL", - "file.view" => "consultat", - "file.copy" => "copiat a AJXP_PARENT_PATH", - "file.copy_to" => "copiat a AJXP_TARGET_FOLDER", - "file.copy_from" => "copiat des de AJXP_SOURCE_FOLDER", - "file.move" => "mogut a AJXP_PARENT_PATH", - "file.move_to" => "mogut a AJXP_TARGET_FOLDER", - "file.move_from" => "mogut des de AJXP_SOURCE_FOLDER", - "folder.add" => "creada", - "folder.delete" => "eliminada", - "folder.rename" => "renombrada a AJXP_NODE_LABEL", - "folder.change" => "contingut modificat modificado", - "folder.view" => "oberta", - "folder.copy" => "copiada des de AJXP_SOURCE_FOLDER", - "folder.copy_to" => "copiada a AJXP_TARGET_FOLDER", - "folder.copy_from" => "copiada des de AJXP_SOURCE_FOLDER", - "folder.move" => "moguda des de AJXP_SOURCE_FOLDER", - "folder.move_to" => "moguda a AJXP_TARGET_FOLDER", - "folder.move_from" => "moguda des de AJXP_SOURCE_FOLDER", - "ajxp_link" => "Faci click aquí per anar directament a AJXP_NODE_LABEL", -); +"user_link" => "per", +"file.add" => "creat", +"file.delete" => "eliminat", +"file.change" => "modificat", +"file.rename" => "renombrat a AJXP_NODE_LABEL", +"file.view" => "consultat", +"file.copy" => "copiat a AJXP_PARENT_PATH", +"file.copy_to" => "copiat a AJXP_TARGET_FOLDER", +"file.copy_from" => "copiat des de AJXP_SOURCE_FOLDER", +"file.move" => "mogut a AJXP_PARENT_PATH", +"file.move_to" => "mogut a AJXP_TARGET_FOLDER", +"file.move_from" => "mogut des de AJXP_SOURCE_FOLDER", +"folder.add" => "creada", +"folder.delete" => "eliminada", +"folder.rename" => "renombrada a AJXP_NODE_LABEL", +"folder.change" => "contingut modificat modificado", +"folder.view" => "oberta", +"folder.copy" => "copiada des de AJXP_SOURCE_FOLDER", +"folder.copy_to" => "copiada a AJXP_TARGET_FOLDER", +"folder.copy_from" => "copiada des de AJXP_SOURCE_FOLDER", +"folder.move" => "moguda des de AJXP_SOURCE_FOLDER", +"folder.move_to" => "moguda a AJXP_TARGET_FOLDER", +"folder.move_from" => "moguda des de AJXP_SOURCE_FOLDER", +"ajxp_link" => "Faci click aquí per anar directament a AJXP_NODE_LABEL", +"file.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/block/de.php b/core/src/plugins/core.notifications/templates/block/de.php index ac607a6825..87b2a2d1dc 100644 --- a/core/src/plugins/core.notifications/templates/block/de.php +++ b/core/src/plugins/core.notifications/templates/block/de.php @@ -1,46 +1,48 @@ - * 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 . - */ +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ $mess=array( - "user_link" => "von", - "file.add" => "erstellt", - "file.delete" => "gelöscht", - "file.change" => "bearbeitet", - "file.rename" => "zu AJXP_NODE_LABEL umbenannt", - "file.view" => "consulted", - "file.copy" => "nach AJXP_PARENT_PATH kopiert", - "file.copy_to" => "in AJXP_TARGET_FOLDER kopiert ", - "file.copy_from" => "von AJXP_SOURCE_FOLDER kopiert", - "file.move" => "nach AJXP_PARENT_PATH verschoben", - "file.move_to" => "nach AJXP_TARGET_FOLDER verschoben", - "file.move_from" => "aus AJXP_SOURCE_FOLDER verschoben", - "folder.add" => "erstellt", - "folder.delete" => "gelöscht", - "folder.rename" => "zu AJXP_NODE_LABEL umbenannt", - "folder.change" => "Inhalt modifiziert", - "folder.view" => "geöffnet", - "folder.copy" => "von AJXP_SOURCE_FOLDER kopiert", - "folder.copy_to" => "nach AJXP_TARGET_FOLDER kopiert", - "folder.copy_from" => "von AJXP_SOURCE_FOLDER kopiert", - "folder.move" => "von AJXP_SOURCE_FOLDER verschoben", - "folder.move_to" => "nach AJXP_TARGET_FOLDER verschoben", - "folder.move_from" => "von AJXP_SOURCE_FOLDER verschoben", - "ajxp_link" => "Hier klicken um direkt zu AJXP_NODE_LABEL gehen", -); +"user_link" => "von", +"file.add" => "erstellt", +"file.delete" => "gelöscht", +"file.change" => "bearbeitet", +"file.rename" => "zu AJXP_NODE_LABEL umbenannt", +"file.view" => "consulted", +"file.copy" => "nach AJXP_PARENT_PATH kopiert", +"file.copy_to" => "in AJXP_TARGET_FOLDER kopiert ", +"file.copy_from" => "von AJXP_SOURCE_FOLDER kopiert", +"file.move" => "nach AJXP_PARENT_PATH verschoben", +"file.move_to" => "nach AJXP_TARGET_FOLDER verschoben", +"file.move_from" => "aus AJXP_SOURCE_FOLDER verschoben", +"folder.add" => "erstellt", +"folder.delete" => "gelöscht", +"folder.rename" => "zu AJXP_NODE_LABEL umbenannt", +"folder.change" => "Inhalt modifiziert", +"folder.view" => "geöffnet", +"folder.copy" => "von AJXP_SOURCE_FOLDER kopiert", +"folder.copy_to" => "nach AJXP_TARGET_FOLDER kopiert", +"folder.copy_from" => "von AJXP_SOURCE_FOLDER kopiert", +"folder.move" => "von AJXP_SOURCE_FOLDER verschoben", +"folder.move_to" => "nach AJXP_TARGET_FOLDER verschoben", +"folder.move_from" => "von AJXP_SOURCE_FOLDER verschoben", +"ajxp_link" => "Hier klicken um direkt zu AJXP_NODE_LABEL gehen", +"file.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/block/en.php b/core/src/plugins/core.notifications/templates/block/en.php index 5e8ac9a062..e594f964ea 100644 --- a/core/src/plugins/core.notifications/templates/block/en.php +++ b/core/src/plugins/core.notifications/templates/block/en.php @@ -43,5 +43,7 @@ "folder.move" => "moved from AJXP_SOURCE_FOLDER", "folder.move_to" => "moved to AJXP_TARGET_FOLDER", "folder.move_from" => "moved from AJXP_SOURCE_FOLDER", + "file.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", + "folder.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", "ajxp_link" => "Click here to get go directly to AJXP_NODE_LABEL", ); diff --git a/core/src/plugins/core.notifications/templates/block/es.php b/core/src/plugins/core.notifications/templates/block/es.php index 5eaed4a438..f71fa2e1a5 100644 --- a/core/src/plugins/core.notifications/templates/block/es.php +++ b/core/src/plugins/core.notifications/templates/block/es.php @@ -1,47 +1,49 @@ - * 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 . - */ +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ // spanish translation: Salva Gómez , 2016 $mess=array( - "user_link" => "por", - "file.add" => "creado", - "file.delete" => "eliminado", - "file.change" => "modificado", - "file.rename" => "renombrado a AJXP_NODE_LABEL", - "file.view" => "consultado", - "file.copy" => "copiado a AJXP_PARENT_PATH", - "file.copy_to" => "copiado a AJXP_TARGET_FOLDER", - "file.copy_from" => "copiado desde AJXP_SOURCE_FOLDER", - "file.move" => "movido a AJXP_PARENT_PATH", - "file.move_to" => "movido a AJXP_TARGET_FOLDER", - "file.move_from" => "movido desde AJXP_SOURCE_FOLDER", - "folder.add" => "creada", - "folder.delete" => "eliminada", - "folder.rename" => "renombrada a AJXP_NODE_LABEL", - "folder.change" => "contenido modificado", - "folder.view" => "abierta", - "folder.copy" => "copiada desde AJXP_SOURCE_FOLDER", - "folder.copy_to" => "copiada a AJXP_TARGET_FOLDER", - "folder.copy_from" => "copiada desde AJXP_SOURCE_FOLDER", - "folder.move" => "movida desde AJXP_SOURCE_FOLDER", - "folder.move_to" => "movida a AJXP_TARGET_FOLDER", - "folder.move_from" => "movida desde AJXP_SOURCE_FOLDER", - "ajxp_link" => "Haga click aquí para ir directamente a AJXP_NODE_LABEL", -); +"user_link" => "por", +"file.add" => "creado", +"file.delete" => "eliminado", +"file.change" => "modificado", +"file.rename" => "renombrado a AJXP_NODE_LABEL", +"file.view" => "consultado", +"file.copy" => "copiado a AJXP_PARENT_PATH", +"file.copy_to" => "copiado a AJXP_TARGET_FOLDER", +"file.copy_from" => "copiado desde AJXP_SOURCE_FOLDER", +"file.move" => "movido a AJXP_PARENT_PATH", +"file.move_to" => "movido a AJXP_TARGET_FOLDER", +"file.move_from" => "movido desde AJXP_SOURCE_FOLDER", +"folder.add" => "creada", +"folder.delete" => "eliminada", +"folder.rename" => "renombrada a AJXP_NODE_LABEL", +"folder.change" => "contenido modificado", +"folder.view" => "abierta", +"folder.copy" => "copiada desde AJXP_SOURCE_FOLDER", +"folder.copy_to" => "copiada a AJXP_TARGET_FOLDER", +"folder.copy_from" => "copiada desde AJXP_SOURCE_FOLDER", +"folder.move" => "movida desde AJXP_SOURCE_FOLDER", +"folder.move_to" => "movida a AJXP_TARGET_FOLDER", +"folder.move_from" => "movida desde AJXP_SOURCE_FOLDER", +"ajxp_link" => "Haga click aquí para ir directamente a AJXP_NODE_LABEL", +"file.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/block/fr.php b/core/src/plugins/core.notifications/templates/block/fr.php index 718dcc1f4e..eedd4e66a3 100644 --- a/core/src/plugins/core.notifications/templates/block/fr.php +++ b/core/src/plugins/core.notifications/templates/block/fr.php @@ -1,46 +1,48 @@ - * 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 . - */ +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ $mess=array( - "user_link" => "par", - "file.add" => "créé", - "file.delete" => "supprimé", - "file.change" => "modifié", - "file.rename" => "renommé en AJXP_NODE_LABEL", - "file.view" => "consulté", - "file.copy" => "copié vers AJXP_PARENT_PATH", - "file.copy_to" => "copié vers AJXP_TARGET_FOLDER", - "file.copy_from" => "copié depuis AJXP_SOURCE_FOLDER", - "file.move" => "déplacé de AJXP_PARENT_PATH", - "file.move_to" => "déplacé vers AJXP_TARGET_FOLDER", - "file.move_from" => "déplacé depuis AJXP_SOURCE_FOLDER", - "folder.add" => "créé", - "folder.delete" => "supprimé", - "folder.rename" => "renommé en AJXP_NODE_LABEL", - "folder.change" => "contenu modifié", - "folder.view" => "ouvert", - "folder.copy" => "copié depuis AJXP_SOURCE_FOLDER", - "folder.copy_to" => "copié vers AJXP_TARGET_FOLDER", - "folder.copy_from" => "copié depuis AJXP_SOURCE_FOLDER", - "folder.move" => "déplacé depuis AJXP_SOURCE_FOLDER", - "folder.move_to" => "déplacé vers AJXP_TARGET_FOLDER", - "folder.move_from" => "déplacé depuis AJXP_SOURCE_FOLDER", - "ajxp_link" => "Cliquez ici pour ouvrir directement AJXP_NODE_LABEL", -); +"user_link" => "par", +"file.add" => "créé", +"file.delete" => "supprimé", +"file.change" => "modifié", +"file.rename" => "renommé en AJXP_NODE_LABEL", +"file.view" => "consulté", +"file.copy" => "copié vers AJXP_PARENT_PATH", +"file.copy_to" => "copié vers AJXP_TARGET_FOLDER", +"file.copy_from" => "copié depuis AJXP_SOURCE_FOLDER", +"file.move" => "déplacé de AJXP_PARENT_PATH", +"file.move_to" => "déplacé vers AJXP_TARGET_FOLDER", +"file.move_from" => "déplacé depuis AJXP_SOURCE_FOLDER", +"folder.add" => "créé", +"folder.delete" => "supprimé", +"folder.rename" => "renommé en AJXP_NODE_LABEL", +"folder.change" => "contenu modifié", +"folder.view" => "ouvert", +"folder.copy" => "copié depuis AJXP_SOURCE_FOLDER", +"folder.copy_to" => "copié vers AJXP_TARGET_FOLDER", +"folder.copy_from" => "copié depuis AJXP_SOURCE_FOLDER", +"folder.move" => "déplacé depuis AJXP_SOURCE_FOLDER", +"folder.move_to" => "déplacé vers AJXP_TARGET_FOLDER", +"folder.move_from" => "déplacé depuis AJXP_SOURCE_FOLDER", +"ajxp_link" => "Cliquez ici pour ouvrir directement AJXP_NODE_LABEL", +"file.share" => "AJXP_USER vous a partagé le fichier AJXP_NODE_LABEL", +"folder.share" => "AJXP_USER vous a partagé le répertoire AJXP_NODE_LABEL", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/block/pt.php b/core/src/plugins/core.notifications/templates/block/pt.php index 75c5bd2231..f0f9113b27 100644 --- a/core/src/plugins/core.notifications/templates/block/pt.php +++ b/core/src/plugins/core.notifications/templates/block/pt.php @@ -45,4 +45,6 @@ "ajxp_URL" => "Clique aqui para ir directamente para AJXP_NODE_LABEL", "user_link" => "by", "ajxp_link" => "Click here to get go directly to AJXP_NODE_LABEL", -); +"file.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/block/ru.php b/core/src/plugins/core.notifications/templates/block/ru.php index 1a4782685e..57c80d9cdb 100644 --- a/core/src/plugins/core.notifications/templates/block/ru.php +++ b/core/src/plugins/core.notifications/templates/block/ru.php @@ -1,46 +1,48 @@ - * 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 . - */ +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ $mess=array( - "user_link" => "пользователь", - "file.add" => "создан", - "file.delete" => "удалён", - "file.change" => "изменён", - "file.rename" => "переименован в AJXP_NODE_LABEL", - "file.view" => "просмотрен", - "file.copy" => "скопирован в AJXP_PARENT_PATH", - "file.copy_to" => "скопирован в AJXP_TARGET_FOLDER", - "file.copy_from" => "скопирован из AJXP_SOURCE_FOLDER", - "file.move" => "перенесён в AJXP_PARENT_PATH", - "file.move_to" => "перенесён в AJXP_TARGET_FOLDER", - "file.move_from" => "перенесён из AJXP_SOURCE_FOLDER", - "folder.add" => "создана", - "folder.delete" => "удалена", - "folder.rename" => "переименована в AJXP_NODE_LABEL", - "folder.change" => "содержимое изменено", - "folder.view" => "открыта", - "folder.copy" => "скопирована из AJXP_SOURCE_FOLDER", - "folder.copy_to" => "скопирована в AJXP_TARGET_FOLDER", - "folder.copy_from" => "скопирована из AJXP_SOURCE_FOLDER", - "folder.move" => "перенесена из AJXP_SOURCE_FOLDER", - "folder.move_to" => "перенесена в AJXP_TARGET_FOLDER", - "folder.move_from" => "перенесена из AJXP_SOURCE_FOLDER", - "ajxp_link" => "Нажмите для перехода к AJXP_NODE_LABEL", -); +"user_link" => "пользователь", +"file.add" => "создан", +"file.delete" => "удалён", +"file.change" => "изменён", +"file.rename" => "переименован в AJXP_NODE_LABEL", +"file.view" => "просмотрен", +"file.copy" => "скопирован в AJXP_PARENT_PATH", +"file.copy_to" => "скопирован в AJXP_TARGET_FOLDER", +"file.copy_from" => "скопирован из AJXP_SOURCE_FOLDER", +"file.move" => "перенесён в AJXP_PARENT_PATH", +"file.move_to" => "перенесён в AJXP_TARGET_FOLDER", +"file.move_from" => "перенесён из AJXP_SOURCE_FOLDER", +"folder.add" => "создана", +"folder.delete" => "удалена", +"folder.rename" => "переименована в AJXP_NODE_LABEL", +"folder.change" => "содержимое изменено", +"folder.view" => "открыта", +"folder.copy" => "скопирована из AJXP_SOURCE_FOLDER", +"folder.copy_to" => "скопирована в AJXP_TARGET_FOLDER", +"folder.copy_from" => "скопирована из AJXP_SOURCE_FOLDER", +"folder.move" => "перенесена из AJXP_SOURCE_FOLDER", +"folder.move_to" => "перенесена в AJXP_TARGET_FOLDER", +"folder.move_from" => "перенесена из AJXP_SOURCE_FOLDER", +"ajxp_link" => "Нажмите для перехода к AJXP_NODE_LABEL", +"file.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/group/ca.php b/core/src/plugins/core.notifications/templates/group/ca.php index f83682f322..89af566579 100644 --- a/core/src/plugins/core.notifications/templates/group/ca.php +++ b/core/src/plugins/core.notifications/templates/group/ca.php @@ -1,39 +1,41 @@ - * 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 . - */ +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ // catalan translation: Salva Gómez , 2016 $mess=array( - "file.add" => "Arxiu AJXP_NODE_LABEL afegit a AJXP_PARENT_PATH", - "file.delete" => "Arxiu AJXP_NODE_LABEL eliminat de AJXP_PARENT_PATH", - "file.change" => "Arxiu AJXP_NODE_LABEL modificat per AJXP_USER", - "file.view" => "Arxiu AJXP_NODE_LABEL va ser consultat per AJXP_USER", - "file.copy_to" => "AJXP_NODE_LABEL copiat a AJXP_TARGET_FOLDER", - "file.copy_from" => "AJXP_NODE_LABEL copiat des de AJXP_SOURCE_FOLDER", - "file.move_to" => "AJXP_NODE_LABEL mogut a AJXP_TARGET_FOLDER", - "file.move_from" => "AJXP_NODE_LABEL mogut des de AJXP_SOURCE_FOLDER", - "folder.add" => "Carpeta AJXP_NODE_LABEL creada", - "folder.delete" => "Carpeta AJXP_NODE_LABEL eliminada", - "folder.change" => "El contingut de AJXP_NODE_LABEL ha canviat", - "folder.view" => "La carpeta AJXP_NODE_LABEL va ser oberta", - "folder.copy_to" => "Carpeta AJXP_NODE_LABEL copiada a AJXP_TARGET_FOLDER", - "folder.copy_from" => "Carpeta AJXP_NODE_LABEL copiada des de AJXP_SOURCE_FOLDER", - "folder.move_to" => "Carpeta AJXP_NODE_LABEL moguda a AJXP_TARGET_FOLDER", - "folder.move_from" => "Carpeta AJXP_NODE_LABEL moguda des de AJXP_SOURCE_FOLDER", -); +"file.add" => "Arxiu AJXP_NODE_LABEL afegit a AJXP_PARENT_PATH", +"file.delete" => "Arxiu AJXP_NODE_LABEL eliminat de AJXP_PARENT_PATH", +"file.change" => "Arxiu AJXP_NODE_LABEL modificat per AJXP_USER", +"file.view" => "Arxiu AJXP_NODE_LABEL va ser consultat per AJXP_USER", +"file.copy_to" => "AJXP_NODE_LABEL copiat a AJXP_TARGET_FOLDER", +"file.copy_from" => "AJXP_NODE_LABEL copiat des de AJXP_SOURCE_FOLDER", +"file.move_to" => "AJXP_NODE_LABEL mogut a AJXP_TARGET_FOLDER", +"file.move_from" => "AJXP_NODE_LABEL mogut des de AJXP_SOURCE_FOLDER", +"folder.add" => "Carpeta AJXP_NODE_LABEL creada", +"folder.delete" => "Carpeta AJXP_NODE_LABEL eliminada", +"folder.change" => "El contingut de AJXP_NODE_LABEL ha canviat", +"folder.view" => "La carpeta AJXP_NODE_LABEL va ser oberta", +"folder.copy_to" => "Carpeta AJXP_NODE_LABEL copiada a AJXP_TARGET_FOLDER", +"folder.copy_from" => "Carpeta AJXP_NODE_LABEL copiada des de AJXP_SOURCE_FOLDER", +"folder.move_to" => "Carpeta AJXP_NODE_LABEL moguda a AJXP_TARGET_FOLDER", +"folder.move_from" => "Carpeta AJXP_NODE_LABEL moguda des de AJXP_SOURCE_FOLDER", +"file.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/group/de.php b/core/src/plugins/core.notifications/templates/group/de.php index 4aa7725fd1..0ed8aacb0b 100755 --- a/core/src/plugins/core.notifications/templates/group/de.php +++ b/core/src/plugins/core.notifications/templates/group/de.php @@ -1,38 +1,40 @@ - * 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 . - */ +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ $mess=array( - "file.add" => "Datei AJXP_NODE_LABEL zu AJXP_PARENT_PATH hinzugefügt", - "file.delete" => "Datei AJXP_NODE_LABEL aus AJXP_PARENT_PATH gelöscht", - "file.change" => "Datei AJXP_NODE_LABEL von AJXP_USER geändert", - "file.view" => "Datei AJXP_NODE_LABEL von AJXP_USER betrachtet", - "file.copy_to" => "Datei AJXP_NODE_LABEL nach AJXP_TARGET_FOLDER kopiert", - "file.copy_from" => "DateiAJXP_NODE_LABEL von AJXP_SOURCE_FOLDER kopiert", - "file.move_to" => "DateiAJXP_NODE_LABEL nach AJXP_TARGET_FOLDER verschoben", - "file.move_from" => "Datei AJXP_NODE_LABEL von AJXP_SOURCE_FOLDER verschoben", - "folder.add" => "Verzeichnis AJXP_NODE_LABEL erstellt", - "folder.delete" => "Verzeichnis AJXP_NODE_LABEL gelöscht", - "folder.change" => "Inhalt von AJXP_NODE_LABEL hat sich geändert.", - "folder.view" => "Verzeichnis AJXP_NODE_LABEL wurde geöffnet", - "folder.copy_to" => "Verzeichnis AJXP_NODE_LABEL nach AJXP_TARGET_FOLDER kopiert", - "folder.copy_from" => "Verzeichnis AJXP_NODE_LABEL von AJXP_SOURCE_FOLDER kopiert", - "folder.move_to" => "Verzeichnis AJXP_NODE_LABEL nach AJXP_TARGET_FOLDER verschoben", - "folder.move_from" => "Verzeichnis AJXP_NODE_LABEL von AJXP_SOURCE_FOLDER verschoben", -); +"file.add" => "Datei AJXP_NODE_LABEL zu AJXP_PARENT_PATH hinzugefügt", +"file.delete" => "Datei AJXP_NODE_LABEL aus AJXP_PARENT_PATH gelöscht", +"file.change" => "Datei AJXP_NODE_LABEL von AJXP_USER geändert", +"file.view" => "Datei AJXP_NODE_LABEL von AJXP_USER betrachtet", +"file.copy_to" => "Datei AJXP_NODE_LABEL nach AJXP_TARGET_FOLDER kopiert", +"file.copy_from" => "DateiAJXP_NODE_LABEL von AJXP_SOURCE_FOLDER kopiert", +"file.move_to" => "DateiAJXP_NODE_LABEL nach AJXP_TARGET_FOLDER verschoben", +"file.move_from" => "Datei AJXP_NODE_LABEL von AJXP_SOURCE_FOLDER verschoben", +"folder.add" => "Verzeichnis AJXP_NODE_LABEL erstellt", +"folder.delete" => "Verzeichnis AJXP_NODE_LABEL gelöscht", +"folder.change" => "Inhalt von AJXP_NODE_LABEL hat sich geändert.", +"folder.view" => "Verzeichnis AJXP_NODE_LABEL wurde geöffnet", +"folder.copy_to" => "Verzeichnis AJXP_NODE_LABEL nach AJXP_TARGET_FOLDER kopiert", +"folder.copy_from" => "Verzeichnis AJXP_NODE_LABEL von AJXP_SOURCE_FOLDER kopiert", +"folder.move_to" => "Verzeichnis AJXP_NODE_LABEL nach AJXP_TARGET_FOLDER verschoben", +"folder.move_from" => "Verzeichnis AJXP_NODE_LABEL von AJXP_SOURCE_FOLDER verschoben", +"file.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/group/en.php b/core/src/plugins/core.notifications/templates/group/en.php index 9fd89e957f..3ea462908a 100755 --- a/core/src/plugins/core.notifications/templates/group/en.php +++ b/core/src/plugins/core.notifications/templates/group/en.php @@ -36,4 +36,6 @@ "folder.copy_from" => "Folder AJXP_NODE_LABEL copied from AJXP_SOURCE_FOLDER", "folder.move_to" => "Folder AJXP_NODE_LABEL moved to AJXP_TARGET_FOLDER", "folder.move_from" => "Folder AJXP_NODE_LABEL moved from AJXP_SOURCE_FOLDER", + "file.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", + "folder.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", ); diff --git a/core/src/plugins/core.notifications/templates/group/es.php b/core/src/plugins/core.notifications/templates/group/es.php index 3119783827..59a7a4ce65 100644 --- a/core/src/plugins/core.notifications/templates/group/es.php +++ b/core/src/plugins/core.notifications/templates/group/es.php @@ -1,39 +1,41 @@ - * 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 . - */ +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ // spanish translation: Salva Gómez , 2016 $mess=array( - "file.add" => "Fichero AJXP_NODE_LABEL añadido a AJXP_PARENT_PATH", - "file.delete" => "Fichero AJXP_NODE_LABEL eliminado de AJXP_PARENT_PATH", - "file.change" => "Fichero AJXP_NODE_LABEL modificado por AJXP_USER", - "file.view" => "Fichero AJXP_NODE_LABEL fue consultado por AJXP_USER", - "file.copy_to" => "AJXP_NODE_LABEL copiado a AJXP_TARGET_FOLDER", - "file.copy_from" => "AJXP_NODE_LABEL copiado desde AJXP_SOURCE_FOLDER", - "file.move_to" => "AJXP_NODE_LABEL movido a AJXP_TARGET_FOLDER", - "file.move_from" => "AJXP_NODE_LABEL movido desde AJXP_SOURCE_FOLDER", - "folder.add" => "Carpeta AJXP_NODE_LABEL creada", - "folder.delete" => "Carpeta AJXP_NODE_LABEL eliminada", - "folder.change" => "El contenido de AJXP_NODE_LABEL ha cambiado", - "folder.view" => "La carpeta AJXP_NODE_LABEL fue abierta", - "folder.copy_to" => "Carpeta AJXP_NODE_LABEL copiada a AJXP_TARGET_FOLDER", - "folder.copy_from" => "Carpeta AJXP_NODE_LABEL copiada desde AJXP_SOURCE_FOLDER", - "folder.move_to" => "Carpeta AJXP_NODE_LABEL movida a AJXP_TARGET_FOLDER", - "folder.move_from" => "Carpeta AJXP_NODE_LABEL movida desde AJXP_SOURCE_FOLDER", -); +"file.add" => "Fichero AJXP_NODE_LABEL añadido a AJXP_PARENT_PATH", +"file.delete" => "Fichero AJXP_NODE_LABEL eliminado de AJXP_PARENT_PATH", +"file.change" => "Fichero AJXP_NODE_LABEL modificado por AJXP_USER", +"file.view" => "Fichero AJXP_NODE_LABEL fue consultado por AJXP_USER", +"file.copy_to" => "AJXP_NODE_LABEL copiado a AJXP_TARGET_FOLDER", +"file.copy_from" => "AJXP_NODE_LABEL copiado desde AJXP_SOURCE_FOLDER", +"file.move_to" => "AJXP_NODE_LABEL movido a AJXP_TARGET_FOLDER", +"file.move_from" => "AJXP_NODE_LABEL movido desde AJXP_SOURCE_FOLDER", +"folder.add" => "Carpeta AJXP_NODE_LABEL creada", +"folder.delete" => "Carpeta AJXP_NODE_LABEL eliminada", +"folder.change" => "El contenido de AJXP_NODE_LABEL ha cambiado", +"folder.view" => "La carpeta AJXP_NODE_LABEL fue abierta", +"folder.copy_to" => "Carpeta AJXP_NODE_LABEL copiada a AJXP_TARGET_FOLDER", +"folder.copy_from" => "Carpeta AJXP_NODE_LABEL copiada desde AJXP_SOURCE_FOLDER", +"folder.move_to" => "Carpeta AJXP_NODE_LABEL movida a AJXP_TARGET_FOLDER", +"folder.move_from" => "Carpeta AJXP_NODE_LABEL movida desde AJXP_SOURCE_FOLDER", +"file.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/group/fr.php b/core/src/plugins/core.notifications/templates/group/fr.php index a2f6a7018b..6864ccd289 100755 --- a/core/src/plugins/core.notifications/templates/group/fr.php +++ b/core/src/plugins/core.notifications/templates/group/fr.php @@ -1,38 +1,40 @@ - * 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 . - */ +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ $mess=array( - "file.add" => "Le fichier AJXP_NODE_LABEL a été ajouté dans AJXP_PARENT_PATH", - "file.delete" => "Le fichier AJXP_NODE_LABEL a été supprimé de AJXP_PARENT_PATH", - "file.change" => "Le fichier AJXP_NODE_LABEL a été modifié par AJXP_USER", - "file.view" => "Le fichier AJXP_NODE_LABEL a été consulté par AJXP_USER", - "file.copy_to" => "AJXP_NODE_LABEL a été copié vers AJXP_TARGET_FOLDER", - "file.copy_from" => "AJXP_NODE_LABEL a été copié depuis AJXP_SOURCE_FOLDER", - "file.move_to" => "AJXP_NODE_LABEL a été déplacé vers AJXP_TARGET_FOLDER", - "file.move_from" => "AJXP_NODE_LABEL a été déplacé depuis AJXP_SOURCE_FOLDER", - "folder.add" => "Le répertoire AJXP_NODE_LABEL a été créé", - "folder.delete" => "Le répertoire AJXP_NODE_LABEL a été effacé", - "folder.change" => "Le contenu de AJXP_NODE_LABEL a été modifié", - "folder.view" => "Le répertoire AJXP_NODE_LABEL a été ouvert", - "folder.copy_to" => "Le répertoire AJXP_NODE_LABEL a été copié vers AJXP_TARGET_FOLDER", - "folder.copy_from" => "Le répertoire AJXP_NODE_LABEL a été copié depuis AJXP_SOURCE_FOLDER", - "folder.move_to" => "Le répertoire AJXP_NODE_LABEL a été déplacé vers AJXP_TARGET_FOLDER", - "folder.move_from" => "Le répertoire AJXP_NODE_LABEL a été déplacé depuis AJXP_SOURCE_FOLDER", -); +"file.add" => "Le fichier AJXP_NODE_LABEL a été ajouté dans AJXP_PARENT_PATH", +"file.delete" => "Le fichier AJXP_NODE_LABEL a été supprimé de AJXP_PARENT_PATH", +"file.change" => "Le fichier AJXP_NODE_LABEL a été modifié par AJXP_USER", +"file.view" => "Le fichier AJXP_NODE_LABEL a été consulté par AJXP_USER", +"file.copy_to" => "AJXP_NODE_LABEL a été copié vers AJXP_TARGET_FOLDER", +"file.copy_from" => "AJXP_NODE_LABEL a été copié depuis AJXP_SOURCE_FOLDER", +"file.move_to" => "AJXP_NODE_LABEL a été déplacé vers AJXP_TARGET_FOLDER", +"file.move_from" => "AJXP_NODE_LABEL a été déplacé depuis AJXP_SOURCE_FOLDER", +"folder.add" => "Le répertoire AJXP_NODE_LABEL a été créé", +"folder.delete" => "Le répertoire AJXP_NODE_LABEL a été effacé", +"folder.change" => "Le contenu de AJXP_NODE_LABEL a été modifié", +"folder.view" => "Le répertoire AJXP_NODE_LABEL a été ouvert", +"folder.copy_to" => "Le répertoire AJXP_NODE_LABEL a été copié vers AJXP_TARGET_FOLDER", +"folder.copy_from" => "Le répertoire AJXP_NODE_LABEL a été copié depuis AJXP_SOURCE_FOLDER", +"folder.move_to" => "Le répertoire AJXP_NODE_LABEL a été déplacé vers AJXP_TARGET_FOLDER", +"folder.move_from" => "Le répertoire AJXP_NODE_LABEL a été déplacé depuis AJXP_SOURCE_FOLDER", +"file.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/group/pt.php b/core/src/plugins/core.notifications/templates/group/pt.php index ea789a0666..8503c33b8d 100644 --- a/core/src/plugins/core.notifications/templates/group/pt.php +++ b/core/src/plugins/core.notifications/templates/group/pt.php @@ -1,38 +1,40 @@ - * 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 . - */ +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ $mess=array( - "file.add" => "Ficheiro AJXP_NODE_LABEL adicionado a AJXP_PARENT_PATH", - "file.delete" => "Ficheiro AJXP_NODE_LABEL apagado de AJXP_PARENT_PATH", - "file.change" => "Ficheiro AJXP_NODE_LABEL modificado porAJXP_USER", - "file.view" => "Ficheiro AJXP_NODE_LABEL consultado por AJXP_USER", - "file.copy_to" => "AJXP_NODE_LABEL copiado para AJXP_TARGET_FOLDER", - "file.copy_from" => "AJXP_NODE_LABEL copiado de AJXP_SOURCE_FOLDER", - "file.move_to" => "AJXP_NODE_LABEL movido para AJXP_TARGET_FOLDER", - "file.move_from" => "AJXP_NODE_LABEL movido de AJXP_SOURCE_FOLDER", - "folder.add" => "Pasta AJXP_NODE_LABEL criada", - "folder.delete" => "Pasta AJXP_NODE_LABEL apagada", - "folder.change" => "Conteúdo de AJXP_NODE_LABEL foi modificado", - "folder.view" => "Pasta AJXP_NODE_LABEL foi aberta", - "folder.copy_to" => "Pasta AJXP_NODE_LABEL copiada para AJXP_TARGET_FOLDER", - "folder.copy_from" => "Pasta AJXP_NODE_LABEL copiada de AJXP_SOURCE_FOLDER", - "folder.move_to" => "Pasta AJXP_NODE_LABEL movida para AJXP_TARGET_FOLDER", - "folder.move_from" => "Pasta AJXP_NODE_LABEL movida de AJXP_SOURCE_FOLDER", -); +"file.add" => "Ficheiro AJXP_NODE_LABEL adicionado a AJXP_PARENT_PATH", +"file.delete" => "Ficheiro AJXP_NODE_LABEL apagado de AJXP_PARENT_PATH", +"file.change" => "Ficheiro AJXP_NODE_LABEL modificado porAJXP_USER", +"file.view" => "Ficheiro AJXP_NODE_LABEL consultado por AJXP_USER", +"file.copy_to" => "AJXP_NODE_LABEL copiado para AJXP_TARGET_FOLDER", +"file.copy_from" => "AJXP_NODE_LABEL copiado de AJXP_SOURCE_FOLDER", +"file.move_to" => "AJXP_NODE_LABEL movido para AJXP_TARGET_FOLDER", +"file.move_from" => "AJXP_NODE_LABEL movido de AJXP_SOURCE_FOLDER", +"folder.add" => "Pasta AJXP_NODE_LABEL criada", +"folder.delete" => "Pasta AJXP_NODE_LABEL apagada", +"folder.change" => "Conteúdo de AJXP_NODE_LABEL foi modificado", +"folder.view" => "Pasta AJXP_NODE_LABEL foi aberta", +"folder.copy_to" => "Pasta AJXP_NODE_LABEL copiada para AJXP_TARGET_FOLDER", +"folder.copy_from" => "Pasta AJXP_NODE_LABEL copiada de AJXP_SOURCE_FOLDER", +"folder.move_to" => "Pasta AJXP_NODE_LABEL movida para AJXP_TARGET_FOLDER", +"folder.move_from" => "Pasta AJXP_NODE_LABEL movida de AJXP_SOURCE_FOLDER", +"file.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/group/ru.php b/core/src/plugins/core.notifications/templates/group/ru.php index 8d647e8f0f..e83f91ce0c 100644 --- a/core/src/plugins/core.notifications/templates/group/ru.php +++ b/core/src/plugins/core.notifications/templates/group/ru.php @@ -1,38 +1,40 @@ - * 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 . - */ +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ $mess=array( - "file.add" => "Файл AJXP_NODE_LABEL добавлен к AJXP_PARENT_PATH", - "file.delete" => "Файл AJXP_NODE_LABEL удалён из AJXP_PARENT_PATH", - "file.change" => "Файл AJXP_NODE_LABEL изменён пользователем AJXP_USER", - "file.view" => "Файл AJXP_NODE_LABEL просмотрен пользователем AJXP_USER", - "file.copy_to" => "AJXP_NODE_LABEL скопирован в AJXP_TARGET_FOLDER", - "file.copy_from" => "AJXP_NODE_LABEL скопирован из AJXP_SOURCE_FOLDER", - "file.move_to" => "AJXP_NODE_LABEL перенесён в AJXP_TARGET_FOLDER", - "file.move_from" => "AJXP_NODE_LABEL перенесён из AJXP_SOURCE_FOLDER", - "folder.add" => "Папка AJXP_NODE_LABEL создана", - "folder.delete" => "Папка AJXP_NODE_LABEL удалена", - "folder.change" => "Содержимое of AJXP_NODE_LABEL изменено", - "folder.view" => "Папка AJXP_NODE_LABEL открыта", - "folder.copy_to" => "Папка AJXP_NODE_LABEL скопирована в AJXP_TARGET_FOLDER", - "folder.copy_from" => "Папка AJXP_NODE_LABEL скопирована из AJXP_SOURCE_FOLDER", - "folder.move_to" => "Папка AJXP_NODE_LABEL перенесена в AJXP_TARGET_FOLDER", - "folder.move_from" => "Папка AJXP_NODE_LABEL перенесена из AJXP_SOURCE_FOLDER", -); +"file.add" => "Файл AJXP_NODE_LABEL добавлен к AJXP_PARENT_PATH", +"file.delete" => "Файл AJXP_NODE_LABEL удалён из AJXP_PARENT_PATH", +"file.change" => "Файл AJXP_NODE_LABEL изменён пользователем AJXP_USER", +"file.view" => "Файл AJXP_NODE_LABEL просмотрен пользователем AJXP_USER", +"file.copy_to" => "AJXP_NODE_LABEL скопирован в AJXP_TARGET_FOLDER", +"file.copy_from" => "AJXP_NODE_LABEL скопирован из AJXP_SOURCE_FOLDER", +"file.move_to" => "AJXP_NODE_LABEL перенесён в AJXP_TARGET_FOLDER", +"file.move_from" => "AJXP_NODE_LABEL перенесён из AJXP_SOURCE_FOLDER", +"folder.add" => "Папка AJXP_NODE_LABEL создана", +"folder.delete" => "Папка AJXP_NODE_LABEL удалена", +"folder.change" => "Содержимое of AJXP_NODE_LABEL изменено", +"folder.view" => "Папка AJXP_NODE_LABEL открыта", +"folder.copy_to" => "Папка AJXP_NODE_LABEL скопирована в AJXP_TARGET_FOLDER", +"folder.copy_from" => "Папка AJXP_NODE_LABEL скопирована из AJXP_SOURCE_FOLDER", +"folder.move_to" => "Папка AJXP_NODE_LABEL перенесена в AJXP_TARGET_FOLDER", +"folder.move_from" => "Папка AJXP_NODE_LABEL перенесена из AJXP_SOURCE_FOLDER", +"file.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER shared AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/long/ca.php b/core/src/plugins/core.notifications/templates/long/ca.php index ec85338be9..a949623237 100644 --- a/core/src/plugins/core.notifications/templates/long/ca.php +++ b/core/src/plugins/core.notifications/templates/long/ca.php @@ -1,46 +1,48 @@ - * 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 . - */ - // catalan translation: Salva Gómez , 2016 +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ +// catalan translation: Salva Gómez , 2016 $mess=array( - "file.add" => "El fitxer AJXP_NODE_LABEL va ser creat a AJXP_PARENT_PATH el AJXP_DATE per AJXP_USER.", - "file.delete" => "El fitxer AJXP_NODE_LABEL va ser eliminat de AJXP_PARENT_PATH el AJXP_DATE, per AJXP_USER.", - "file.change" => "El fitxer AJXP_NODE_LABEL va ser modificat el AJXP_DATE, per AJXP_USER.", - "file.rename" => "El fitxer AJXP_SOURCE_LABEL va ser renombrat a AJXP_NODE_LABEL el AJXP_DATE, per AJXP_USER.", - "file.view" => "El fitxer AJXP_NODE_LABEL va ser consultat per AJXP_USER el AJXP_DATE.", - "file.copy" => "El fitxer AJXP_NODE_LABEL va ser copiat des de AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, per AJXP_USER.", - "file.copy_to" => "El fitxer AJXP_NODE_LABEL va ser copiat a AJXP_TARGET_FOLDER el AJXP_DATE, per AJXP_USER.", - "file.copy_from" => "El fitxer AJXP_NODE_LABEL va ser copiat des de AJXP_SOURCE_FOLDER el AJXP_DATE, per AJXP_USER.", - "file.move" => "El fitxer AJXP_NODE_LABEL va ser mogut des de AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, per AJXP_USER.", - "file.move_to" => "El fitxer AJXP_NODE_LABEL va ser mogut a AJXP_TARGET_FOLDER el AJXP_DATE, per AJXP_USER.", - "file.move_from" => "El fitxer AJXP_NODE_LABEL va ser mogut des de AJXP_SOURCE_FOLDER el AJXP_DATE, per AJXP_USER.", - "folder.add" => "La carpeta AJXP_NODE_LABEL va ser creada a AJXP_PARENT_PATH el AJXP_DATE, per AJXP_USER.", - "folder.delete" => "La carpeta AJXP_NODE_LABEL va ser eliminada de AJXP_PARENT_PATH el AJXP_DATE, per AJXP_USER.", - "folder.rename" => "La carpeta AJXP_SOURCE_LABEL va ser renombrada a AJXP_NODE_LABEL el AJXP_DATE, per AJXP_USER.", - "folder.change" => "El contingut de la carpeta AJXP_NODE_LABEL va ser modificat el AJXP_DATE per AJXP_USER.", - "folder.view" => "La carpeta AJXP_NODE_LABEL va ser oberta per AJXP_USER el AJXP_DATE, per AJXP_USER", - "folder.copy" => "La carpeta AJXP_NODE_LABEL va ser copiada des de AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, per AJXP_USER.", - "folder.copy_to" => "La carpeta AJXP_NODE_LABEL va ser copiada a AJXP_TARGET_FOLDER el AJXP_DATE, per AJXP_USER.", - "folder.copy_from" => "La carpeta AJXP_NODE_LABEL va ser copiada des de AJXP_SOURCE_FOLDER el AJXP_DATE, per AJXP_USER.", - "folder.move" => "La carpeta AJXP_NODE_LABEL va ser moguda des de AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, per AJXP_USER.", - "folder.move_to" => "La carpeta AJXP_NODE_LABEL va ser moguda a AJXP_TARGET_FOLDER el AJXP_DATE, per AJXP_USER.", - "folder.move_from" => "La carpeta AJXP_NODE_LABEL va ser moguda des de AJXP_SOURCE_FOLDER el AJXP_DATE, per AJXP_USER.", - "ajxp_link" => "Fer click aquí per anar directament a AJXP_NODE_LABEL", -); +"file.add" => "El fitxer AJXP_NODE_LABEL va ser creat a AJXP_PARENT_PATH el AJXP_DATE per AJXP_USER.", +"file.delete" => "El fitxer AJXP_NODE_LABEL va ser eliminat de AJXP_PARENT_PATH el AJXP_DATE, per AJXP_USER.", +"file.change" => "El fitxer AJXP_NODE_LABEL va ser modificat el AJXP_DATE, per AJXP_USER.", +"file.rename" => "El fitxer AJXP_SOURCE_LABEL va ser renombrat a AJXP_NODE_LABEL el AJXP_DATE, per AJXP_USER.", +"file.view" => "El fitxer AJXP_NODE_LABEL va ser consultat per AJXP_USER el AJXP_DATE.", +"file.copy" => "El fitxer AJXP_NODE_LABEL va ser copiat des de AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, per AJXP_USER.", +"file.copy_to" => "El fitxer AJXP_NODE_LABEL va ser copiat a AJXP_TARGET_FOLDER el AJXP_DATE, per AJXP_USER.", +"file.copy_from" => "El fitxer AJXP_NODE_LABEL va ser copiat des de AJXP_SOURCE_FOLDER el AJXP_DATE, per AJXP_USER.", +"file.move" => "El fitxer AJXP_NODE_LABEL va ser mogut des de AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, per AJXP_USER.", +"file.move_to" => "El fitxer AJXP_NODE_LABEL va ser mogut a AJXP_TARGET_FOLDER el AJXP_DATE, per AJXP_USER.", +"file.move_from" => "El fitxer AJXP_NODE_LABEL va ser mogut des de AJXP_SOURCE_FOLDER el AJXP_DATE, per AJXP_USER.", +"folder.add" => "La carpeta AJXP_NODE_LABEL va ser creada a AJXP_PARENT_PATH el AJXP_DATE, per AJXP_USER.", +"folder.delete" => "La carpeta AJXP_NODE_LABEL va ser eliminada de AJXP_PARENT_PATH el AJXP_DATE, per AJXP_USER.", +"folder.rename" => "La carpeta AJXP_SOURCE_LABEL va ser renombrada a AJXP_NODE_LABEL el AJXP_DATE, per AJXP_USER.", +"folder.change" => "El contingut de la carpeta AJXP_NODE_LABEL va ser modificat el AJXP_DATE per AJXP_USER.", +"folder.view" => "La carpeta AJXP_NODE_LABEL va ser oberta per AJXP_USER el AJXP_DATE, per AJXP_USER", +"folder.copy" => "La carpeta AJXP_NODE_LABEL va ser copiada des de AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, per AJXP_USER.", +"folder.copy_to" => "La carpeta AJXP_NODE_LABEL va ser copiada a AJXP_TARGET_FOLDER el AJXP_DATE, per AJXP_USER.", +"folder.copy_from" => "La carpeta AJXP_NODE_LABEL va ser copiada des de AJXP_SOURCE_FOLDER el AJXP_DATE, per AJXP_USER.", +"folder.move" => "La carpeta AJXP_NODE_LABEL va ser moguda des de AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, per AJXP_USER.", +"folder.move_to" => "La carpeta AJXP_NODE_LABEL va ser moguda a AJXP_TARGET_FOLDER el AJXP_DATE, per AJXP_USER.", +"folder.move_from" => "La carpeta AJXP_NODE_LABEL va ser moguda des de AJXP_SOURCE_FOLDER el AJXP_DATE, per AJXP_USER.", +"ajxp_link" => "Fer click aquí per anar directament a AJXP_NODE_LABEL", +"file.share" => "User AJXP_USER has shared the file AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER has shared the folder AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/long/de.php b/core/src/plugins/core.notifications/templates/long/de.php index 7bedd59899..172cb5591c 100755 --- a/core/src/plugins/core.notifications/templates/long/de.php +++ b/core/src/plugins/core.notifications/templates/long/de.php @@ -1,45 +1,47 @@ - * 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 . - */ +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ $mess=array( - "file.add" => "In den Repositorie AJXP_REPOSITORY_LABEL wurde, innerhalb des Ordners AJXP_PARENT_PATH, die Datei AJXP_NODE_LABEL erstellt. AJXP_DATE, von AJXP_USER", - "file.delete" => "Die Datei AJXP_NODE_LABEL wurde aus AJXP_PARENT_PATH gelöscht. AJXP_DATE, von AJXP_USER", - "file.change" => "Die Datei AJXP_NODE_LABEL wurde geändert. AJXP_DATE, von AJXP_USER", - "file.rename" => "Die Datei AJXP_SOURCE_LABEL wurde zu AJXP_NODE_LABEL umbenannt. AJXP_DATE, von AJXP_USER", - "file.view" => "Die Datei AJXP_NODE_LABEL wurde betrachtet. AJXP_DATE, von AJXP_USER", - "file.copy" => "Die Datei AJXP_NODE_LABEL wurde von AJXP_SOURCE_FOLDER nach AJXP_PARENT_PATH kopiert. AJXP_DATE, von AJXP_USER", - "file.copy_to" => "Die Datei AJXP_NODE_LABEL wurde nach AJXP_TARGET_FOLDER kopiert. AJXP_DATE, von AJXP_USER", - "file.copy_from" => "Die Datei AJXP_NODE_LABEL wurde von AJXP_SOURCE_FOLDER kopiert. AJXP_DATE, von AJXP_USER", - "file.move" => "Die Datei AJXP_NODE_LABEL wurde von AJXP_SOURCE_FOLDER nach AJXP_PARENT_PATH verschoben. AJXP_DATE, von AJXP_USER", - "file.move_to" => "Die Datei AJXP_NODE_LABEL wurde nach AJXP_TARGET_FOLDER verschoben. AJXP_DATE, von AJXP_USER", - "file.move_from" => "Die Datei AJXP_NODE_LABEL wurde von AJXP_SOURCE_FOLDER verschoben. AJXP_DATE, von AJXP_USER", - "folder.add" => "Das Verzeichnis AJXP_NODE_LABEL wurde in AJXP_PARENT_PATH erstellt. AJXP_DATE, von AJXP_USER", - "folder.delete" => "Das Verzeichnis AJXP_NODE_LABEL in AJXP_PARENT_PATH wurde gelöscht. AJXP_DATE, von AJXP_USER.", - "folder.rename" => "Der Ordner AJXP_SOURCE_LABEL wurde zu AJXP_NODE_LABEL umbenannt. AJXP_DATE, von AJXP_USER", - "folder.change" => "Innerhalb des Repositorie AJXP_REPOSITORY_LABEL wurde der Inhalt des Verzeichnisses AJXP_NODE_LABEL bearbeitet. AJXP_DATE, von AJXP_USER", - "folder.view" => "Das Verzeichniss AJXP_NODE_LABEL wurde von AJXP_USER geöffnet. AJXP_DATE", - "folder.copy" => "Der Ordner AJXP_NODE_LABEL wurde von AJXP_SOURCE_FOLDER nach AJXP_PARENT_PATH kopiert. AJXP_DATE, von AJXP_USER", - "folder.copy_to" => "Das Verzeichnis AJXP_NODE_LABEL wurde nach AJXP_TARGET_FOLDER kopiert. AJXP_DATE, von AJXP_USER", - "folder.copy_from" => "Das Verzeichnis AJXP_NODE_LABEL wurde von AJXP_SOURCE_FOLDER kopiert. AJXP_DATE, von AJXP_USER", - "folder.move" => "Der Ordner AJXP_NODE_LABEL wurder von AJXP_SOURCE_FOLDER nach AJXP_PARENT_PATH verschoben. AJXP_DATE, von AJXP_USER", - "folder.move_to" => "Das Verzeichnis AJXP_NODE_LABEL wurde nach AJXP_TARGET_FOLDER verschoben. AJXP_DATE, von AJXP_USER", - "folder.move_from" => "Das Verzeichnis AJXP_NODE_LABEL wurde von AJXP_SOURCE_FOLDER verschoben. AJXP_DATE, von AJXP_USER", - "ajxp_link" => "Hier klicken um direkt nach AJXP_NODE_LABEL zu wechseln.", -); +"file.add" => "In den Repositorie AJXP_REPOSITORY_LABEL wurde, innerhalb des Ordners AJXP_PARENT_PATH, die Datei AJXP_NODE_LABEL erstellt. AJXP_DATE, von AJXP_USER", +"file.delete" => "Die Datei AJXP_NODE_LABEL wurde aus AJXP_PARENT_PATH gelöscht. AJXP_DATE, von AJXP_USER", +"file.change" => "Die Datei AJXP_NODE_LABEL wurde geändert. AJXP_DATE, von AJXP_USER", +"file.rename" => "Die Datei AJXP_SOURCE_LABEL wurde zu AJXP_NODE_LABEL umbenannt. AJXP_DATE, von AJXP_USER", +"file.view" => "Die Datei AJXP_NODE_LABEL wurde betrachtet. AJXP_DATE, von AJXP_USER", +"file.copy" => "Die Datei AJXP_NODE_LABEL wurde von AJXP_SOURCE_FOLDER nach AJXP_PARENT_PATH kopiert. AJXP_DATE, von AJXP_USER", +"file.copy_to" => "Die Datei AJXP_NODE_LABEL wurde nach AJXP_TARGET_FOLDER kopiert. AJXP_DATE, von AJXP_USER", +"file.copy_from" => "Die Datei AJXP_NODE_LABEL wurde von AJXP_SOURCE_FOLDER kopiert. AJXP_DATE, von AJXP_USER", +"file.move" => "Die Datei AJXP_NODE_LABEL wurde von AJXP_SOURCE_FOLDER nach AJXP_PARENT_PATH verschoben. AJXP_DATE, von AJXP_USER", +"file.move_to" => "Die Datei AJXP_NODE_LABEL wurde nach AJXP_TARGET_FOLDER verschoben. AJXP_DATE, von AJXP_USER", +"file.move_from" => "Die Datei AJXP_NODE_LABEL wurde von AJXP_SOURCE_FOLDER verschoben. AJXP_DATE, von AJXP_USER", +"folder.add" => "Das Verzeichnis AJXP_NODE_LABEL wurde in AJXP_PARENT_PATH erstellt. AJXP_DATE, von AJXP_USER", +"folder.delete" => "Das Verzeichnis AJXP_NODE_LABEL in AJXP_PARENT_PATH wurde gelöscht. AJXP_DATE, von AJXP_USER.", +"folder.rename" => "Der Ordner AJXP_SOURCE_LABEL wurde zu AJXP_NODE_LABEL umbenannt. AJXP_DATE, von AJXP_USER", +"folder.change" => "Innerhalb des Repositorie AJXP_REPOSITORY_LABEL wurde der Inhalt des Verzeichnisses AJXP_NODE_LABEL bearbeitet. AJXP_DATE, von AJXP_USER", +"folder.view" => "Das Verzeichniss AJXP_NODE_LABEL wurde von AJXP_USER geöffnet. AJXP_DATE", +"folder.copy" => "Der Ordner AJXP_NODE_LABEL wurde von AJXP_SOURCE_FOLDER nach AJXP_PARENT_PATH kopiert. AJXP_DATE, von AJXP_USER", +"folder.copy_to" => "Das Verzeichnis AJXP_NODE_LABEL wurde nach AJXP_TARGET_FOLDER kopiert. AJXP_DATE, von AJXP_USER", +"folder.copy_from" => "Das Verzeichnis AJXP_NODE_LABEL wurde von AJXP_SOURCE_FOLDER kopiert. AJXP_DATE, von AJXP_USER", +"folder.move" => "Der Ordner AJXP_NODE_LABEL wurder von AJXP_SOURCE_FOLDER nach AJXP_PARENT_PATH verschoben. AJXP_DATE, von AJXP_USER", +"folder.move_to" => "Das Verzeichnis AJXP_NODE_LABEL wurde nach AJXP_TARGET_FOLDER verschoben. AJXP_DATE, von AJXP_USER", +"folder.move_from" => "Das Verzeichnis AJXP_NODE_LABEL wurde von AJXP_SOURCE_FOLDER verschoben. AJXP_DATE, von AJXP_USER", +"ajxp_link" => "Hier klicken um direkt nach AJXP_NODE_LABEL zu wechseln.", +"file.share" => "User AJXP_USER has shared the file AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER has shared the folder AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/long/en.php b/core/src/plugins/core.notifications/templates/long/en.php index 27fabbb90f..aeb2fb2bf0 100755 --- a/core/src/plugins/core.notifications/templates/long/en.php +++ b/core/src/plugins/core.notifications/templates/long/en.php @@ -41,5 +41,7 @@ "folder.move" => "The folder AJXP_NODE_LABEL was moved to from AJXP_SOURCE_FOLDER to AJXP_PARENT_PATH AJXP_DATE, by AJXP_USER.", "folder.move_to" => "The folder AJXP_NODE_LABEL was moved to AJXP_TARGET_FOLDER AJXP_DATE, by AJXP_USER.", "folder.move_from" => "The folder AJXP_NODE_LABEL was moved from AJXP_SOURCE_FOLDER AJXP_DATE, by AJXP_USER.", + "file.share" => "User AJXP_USER has shared the file AJXP_NODE_LABEL with you", + "folder.share" => "User AJXP_USER has shared the folder AJXP_NODE_LABEL with you", "ajxp_link" => "Click here to go directly to AJXP_NODE_LABEL", ); diff --git a/core/src/plugins/core.notifications/templates/long/es.php b/core/src/plugins/core.notifications/templates/long/es.php index b8c308d817..0868f45bcb 100644 --- a/core/src/plugins/core.notifications/templates/long/es.php +++ b/core/src/plugins/core.notifications/templates/long/es.php @@ -1,46 +1,48 @@ - * 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 . - */ - // spanish translation: Salva Gómez , 2016 +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ +// spanish translation: Salva Gómez , 2016 $mess=array( - "file.add" => "El fichero AJXP_NODE_LABEL fue creado en AJXP_PARENT_PATH el AJXP_DATE por AJXP_USER.", - "file.delete" => "El fichero AJXP_NODE_LABEL fue eliminado de AJXP_PARENT_PATH el AJXP_DATE, por AJXP_USER.", - "file.change" => "El fichero AJXP_NODE_LABEL fue modificado el AJXP_DATE, por AJXP_USER.", - "file.rename" => "El fichero AJXP_SOURCE_LABEL fue renombrado a AJXP_NODE_LABEL el AJXP_DATE, por AJXP_USER.", - "file.view" => "El fichero AJXP_NODE_LABEL fue consultado por AJXP_USER el AJXP_DATE.", - "file.copy" => "El fichero AJXP_NODE_LABEL fue copiado desde AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, por AJXP_USER.", - "file.copy_to" => "El fichero AJXP_NODE_LABEL fue copiado a AJXP_TARGET_FOLDER el AJXP_DATE, por AJXP_USER.", - "file.copy_from" => "El fichero AJXP_NODE_LABEL fue copiado desde AJXP_SOURCE_FOLDER el AJXP_DATE, por AJXP_USER.", - "file.move" => "El fichero AJXP_NODE_LABEL fue movido desde AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, por AJXP_USER.", - "file.move_to" => "El fichero AJXP_NODE_LABEL fue movido a AJXP_TARGET_FOLDER el AJXP_DATE, por AJXP_USER.", - "file.move_from" => "El fichero AJXP_NODE_LABEL fue movido desde AJXP_SOURCE_FOLDER el AJXP_DATE, por AJXP_USER.", - "folder.add" => "La carpeta AJXP_NODE_LABEL fue creada en AJXP_PARENT_PATH el AJXP_DATE, por AJXP_USER.", - "folder.delete" => "La carpeta AJXP_NODE_LABEL fue eliminada de AJXP_PARENT_PATH el AJXP_DATE, por AJXP_USER.", - "folder.rename" => "La carpeta AJXP_SOURCE_LABEL fue renombrada a AJXP_NODE_LABEL el AJXP_DATE, por AJXP_USER.", - "folder.change" => "El contenido de la carpeta AJXP_NODE_LABEL fue modificado el AJXP_DATE por AJXP_USER.", - "folder.view" => "La carpeta AJXP_NODE_LABEL fue abierta por AJXP_USER el AJXP_DATE, por AJXP_USER", - "folder.copy" => "La carpeta AJXP_NODE_LABEL fue copiada desde AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, por AJXP_USER.", - "folder.copy_to" => "La carpeta AJXP_NODE_LABEL fue copiada a AJXP_TARGET_FOLDER el AJXP_DATE, por AJXP_USER.", - "folder.copy_from" => "La carpeta AJXP_NODE_LABEL fue copiada desde AJXP_SOURCE_FOLDER el AJXP_DATE, por AJXP_USER.", - "folder.move" => "La carpeta AJXP_NODE_LABEL fue movida desde AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, por AJXP_USER.", - "folder.move_to" => "La carpeta AJXP_NODE_LABEL fue movida a AJXP_TARGET_FOLDER el AJXP_DATE, por AJXP_USER.", - "folder.move_from" => "La carpeta AJXP_NODE_LABEL fue movida desde AJXP_SOURCE_FOLDER el AJXP_DATE, por AJXP_USER.", - "ajxp_link" => "Hacer click aquí para ir directamente a AJXP_NODE_LABEL", -); +"file.add" => "El fichero AJXP_NODE_LABEL fue creado en AJXP_PARENT_PATH el AJXP_DATE por AJXP_USER.", +"file.delete" => "El fichero AJXP_NODE_LABEL fue eliminado de AJXP_PARENT_PATH el AJXP_DATE, por AJXP_USER.", +"file.change" => "El fichero AJXP_NODE_LABEL fue modificado el AJXP_DATE, por AJXP_USER.", +"file.rename" => "El fichero AJXP_SOURCE_LABEL fue renombrado a AJXP_NODE_LABEL el AJXP_DATE, por AJXP_USER.", +"file.view" => "El fichero AJXP_NODE_LABEL fue consultado por AJXP_USER el AJXP_DATE.", +"file.copy" => "El fichero AJXP_NODE_LABEL fue copiado desde AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, por AJXP_USER.", +"file.copy_to" => "El fichero AJXP_NODE_LABEL fue copiado a AJXP_TARGET_FOLDER el AJXP_DATE, por AJXP_USER.", +"file.copy_from" => "El fichero AJXP_NODE_LABEL fue copiado desde AJXP_SOURCE_FOLDER el AJXP_DATE, por AJXP_USER.", +"file.move" => "El fichero AJXP_NODE_LABEL fue movido desde AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, por AJXP_USER.", +"file.move_to" => "El fichero AJXP_NODE_LABEL fue movido a AJXP_TARGET_FOLDER el AJXP_DATE, por AJXP_USER.", +"file.move_from" => "El fichero AJXP_NODE_LABEL fue movido desde AJXP_SOURCE_FOLDER el AJXP_DATE, por AJXP_USER.", +"folder.add" => "La carpeta AJXP_NODE_LABEL fue creada en AJXP_PARENT_PATH el AJXP_DATE, por AJXP_USER.", +"folder.delete" => "La carpeta AJXP_NODE_LABEL fue eliminada de AJXP_PARENT_PATH el AJXP_DATE, por AJXP_USER.", +"folder.rename" => "La carpeta AJXP_SOURCE_LABEL fue renombrada a AJXP_NODE_LABEL el AJXP_DATE, por AJXP_USER.", +"folder.change" => "El contenido de la carpeta AJXP_NODE_LABEL fue modificado el AJXP_DATE por AJXP_USER.", +"folder.view" => "La carpeta AJXP_NODE_LABEL fue abierta por AJXP_USER el AJXP_DATE, por AJXP_USER", +"folder.copy" => "La carpeta AJXP_NODE_LABEL fue copiada desde AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, por AJXP_USER.", +"folder.copy_to" => "La carpeta AJXP_NODE_LABEL fue copiada a AJXP_TARGET_FOLDER el AJXP_DATE, por AJXP_USER.", +"folder.copy_from" => "La carpeta AJXP_NODE_LABEL fue copiada desde AJXP_SOURCE_FOLDER el AJXP_DATE, por AJXP_USER.", +"folder.move" => "La carpeta AJXP_NODE_LABEL fue movida desde AJXP_SOURCE_FOLDER a AJXP_PARENT_PATH el AJXP_DATE, por AJXP_USER.", +"folder.move_to" => "La carpeta AJXP_NODE_LABEL fue movida a AJXP_TARGET_FOLDER el AJXP_DATE, por AJXP_USER.", +"folder.move_from" => "La carpeta AJXP_NODE_LABEL fue movida desde AJXP_SOURCE_FOLDER el AJXP_DATE, por AJXP_USER.", +"ajxp_link" => "Hacer click aquí para ir directamente a AJXP_NODE_LABEL", +"file.share" => "User AJXP_USER has shared the file AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER has shared the folder AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/long/fr.php b/core/src/plugins/core.notifications/templates/long/fr.php index 85a42eb9e4..bebcaa0f30 100755 --- a/core/src/plugins/core.notifications/templates/long/fr.php +++ b/core/src/plugins/core.notifications/templates/long/fr.php @@ -1,45 +1,47 @@ - * 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 . - */ +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ $mess=array( - "file.add" => "Le fichier AJXP_NODE_LABEL a été créé dans le répertoire AJXP_PARENT_PATH, AJXP_DATE par AJXP_USER.", - "file.delete" => "Le fichier AJXP_NODE_LABEL a été supprimé du répertoire AJXP_PARENT_PATH AJXP_DATE, par AJXP_USER", - "file.change" => "Le fichier AJXP_NODE_LABEL a été modifié par AJXP_USER, AJXP_DATE", - "file.rename" => "Le fichier AJXP_SOURCE_LABEL a été renommé en AJXP_NODE_LABEL AJXP_DATE, par AJXP_USER.", - "file.view" => "Le fichier AJXP_NODE_LABEL a été consulté par AJXP_USER AJXP_DATE.", - "file.copy" => "Le fichier AJXP_NODE_LABEL a été copié de AJXP_SOURCE_FOLDER dans AJXP_PARENT_PATH AJXP_DATE, par AJXP_USER.", - "file.copy_to" => "Le fichier AJXP_NODE_LABEL a été copié vers AJXP_TARGET_FOLDER AJXP_DATE, par AJXP_USER.", - "file.copy_from" => "Le fichier AJXP_NODE_LABEL a été copié depuis AJXP_SOURCE_FOLDER AJXP_DATE, par AJXP_USER.", - "file.move" => "Le fichier AJXP_NODE_LABEL a été déplacé de AJXP_SOURCE_FOLDER dans AJXP_PARENT_PATH AJXP_DATE, par AJXP_USER.", - "file.move_to" => "Le fichier AJXP_NODE_LABEL a été déplacé vers AJXP_TARGET_FOLDER AJXP_DATE, par AJXP_USER.", - "file.move_from" => "Le fichier AJXP_NODE_LABEL a été déplacé depuis AJXP_SOURCE_FOLDER AJXP_DATE, par AJXP_USER.", - "folder.add" => "Le répertoire AJXP_NODE_LABEL a été créé dans AJXP_PARENT_PATH AJXP_DATE, par AJXP_USER.", - "folder.delete" => "Le répertoire AJXP_NODE_LABEL a été supprimé de AJXP_PARENT_PATH AJXP_DATE, par AJXP_USER.", - "folder.change" => "Dans le dépôt AJXP_REPOSITORY_LABEL, le contenu du répertoire AJXP_NODE_LABEL a été modifié AJXP_DATE par AJXP_USER.", - "folder.rename" => "Le répertoire AJXP_SOURCE_LABEL a été renommé en AJXP_NODE_LABEL AJXP_DATE, par AJXP_USER.", - "folder.view" => "Le répertoire AJXP_NODE_LABEL a été consulté AJXP_DATE par AJXP_USER", - "folder.copy" => "Le répertoire AJXP_NODE_LABEL a été copié de AJXP_SOURCE_FOLDER dans AJXP_PARENT_PATH AJXP_DATE, par AJXP_USER.", - "folder.copy_to" => "Le répertoire AJXP_NODE_LABEL a été copié vers AJXP_TARGET_FOLDER AJXP_DATE, par AJXP_USER.", - "folder.copy_from" => "Le répertoire AJXP_NODE_LABEL a été copié depuis AJXP_SOURCE_FOLDER AJXP_DATE, par AJXP_USER.", - "folder.move" => "Le répertoire AJXP_NODE_LABEL a été déplacé depuis AJXP_SOURCE_FOLDER dans AJXP_PARENT_PATH AJXP_DATE, par AJXP_USER.", - "folder.move_to" => "Le répertoire AJXP_NODE_LABEL a été déplacé vers AJXP_TARGET_FOLDER AJXP_DATE, par AJXP_USER.", - "folder.move_from" => "Le répertoire AJXP_NODE_LABEL a été copié depuis AJXP_SOURCE_FOLDER AJXP_DATE, par AJXP_USER.", - "ajxp_link" => "Cliquez ici pour ouvrir directement AJXP_NODE_LABEL", -); +"file.add" => "Le fichier AJXP_NODE_LABEL a été créé dans le répertoire AJXP_PARENT_PATH, AJXP_DATE par AJXP_USER.", +"file.delete" => "Le fichier AJXP_NODE_LABEL a été supprimé du répertoire AJXP_PARENT_PATH AJXP_DATE, par AJXP_USER", +"file.change" => "Le fichier AJXP_NODE_LABEL a été modifié par AJXP_USER, AJXP_DATE", +"file.rename" => "Le fichier AJXP_SOURCE_LABEL a été renommé en AJXP_NODE_LABEL AJXP_DATE, par AJXP_USER.", +"file.view" => "Le fichier AJXP_NODE_LABEL a été consulté par AJXP_USER AJXP_DATE.", +"file.copy" => "Le fichier AJXP_NODE_LABEL a été copié de AJXP_SOURCE_FOLDER dans AJXP_PARENT_PATH AJXP_DATE, par AJXP_USER.", +"file.copy_to" => "Le fichier AJXP_NODE_LABEL a été copié vers AJXP_TARGET_FOLDER AJXP_DATE, par AJXP_USER.", +"file.copy_from" => "Le fichier AJXP_NODE_LABEL a été copié depuis AJXP_SOURCE_FOLDER AJXP_DATE, par AJXP_USER.", +"file.move" => "Le fichier AJXP_NODE_LABEL a été déplacé de AJXP_SOURCE_FOLDER dans AJXP_PARENT_PATH AJXP_DATE, par AJXP_USER.", +"file.move_to" => "Le fichier AJXP_NODE_LABEL a été déplacé vers AJXP_TARGET_FOLDER AJXP_DATE, par AJXP_USER.", +"file.move_from" => "Le fichier AJXP_NODE_LABEL a été déplacé depuis AJXP_SOURCE_FOLDER AJXP_DATE, par AJXP_USER.", +"folder.add" => "Le répertoire AJXP_NODE_LABEL a été créé dans AJXP_PARENT_PATH AJXP_DATE, par AJXP_USER.", +"folder.delete" => "Le répertoire AJXP_NODE_LABEL a été supprimé de AJXP_PARENT_PATH AJXP_DATE, par AJXP_USER.", +"folder.change" => "Dans le dépôt AJXP_REPOSITORY_LABEL, le contenu du répertoire AJXP_NODE_LABEL a été modifié AJXP_DATE par AJXP_USER.", +"folder.rename" => "Le répertoire AJXP_SOURCE_LABEL a été renommé en AJXP_NODE_LABEL AJXP_DATE, par AJXP_USER.", +"folder.view" => "Le répertoire AJXP_NODE_LABEL a été consulté AJXP_DATE par AJXP_USER", +"folder.copy" => "Le répertoire AJXP_NODE_LABEL a été copié de AJXP_SOURCE_FOLDER dans AJXP_PARENT_PATH AJXP_DATE, par AJXP_USER.", +"folder.copy_to" => "Le répertoire AJXP_NODE_LABEL a été copié vers AJXP_TARGET_FOLDER AJXP_DATE, par AJXP_USER.", +"folder.copy_from" => "Le répertoire AJXP_NODE_LABEL a été copié depuis AJXP_SOURCE_FOLDER AJXP_DATE, par AJXP_USER.", +"folder.move" => "Le répertoire AJXP_NODE_LABEL a été déplacé depuis AJXP_SOURCE_FOLDER dans AJXP_PARENT_PATH AJXP_DATE, par AJXP_USER.", +"folder.move_to" => "Le répertoire AJXP_NODE_LABEL a été déplacé vers AJXP_TARGET_FOLDER AJXP_DATE, par AJXP_USER.", +"folder.move_from" => "Le répertoire AJXP_NODE_LABEL a été copié depuis AJXP_SOURCE_FOLDER AJXP_DATE, par AJXP_USER.", +"ajxp_link" => "Cliquez ici pour ouvrir directement AJXP_NODE_LABEL", +"file.share" => "AJXP_USER a partagé le fichier AJXP_NODE_LABEL avec vous AJXP_DATE", +"folder.share" => "AJXP_USER a partagé le répertoire AJXP_NODE_LABEL avec vous AJXP_DATE", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/long/pt.php b/core/src/plugins/core.notifications/templates/long/pt.php index 616094be84..28bb00ab0d 100644 --- a/core/src/plugins/core.notifications/templates/long/pt.php +++ b/core/src/plugins/core.notifications/templates/long/pt.php @@ -43,4 +43,6 @@ "folder.move_from" => "A pasta AJXP_NODE_LABEL foi movida de AJXP_SOURCE_FOLDER AJXP_DATE, por AJXP_USER.", "ajxp_URL" => "Clique aqui para ir directamente para AJXP_NODE_LABEL", "ajxp_link" => "Click here to get go directly to AJXP_NODE_LABEL", -); +"file.share" => "User AJXP_USER has shared the file AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER has shared the folder AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/long/ru.php b/core/src/plugins/core.notifications/templates/long/ru.php index 296abacfa9..b8d3ffefc3 100644 --- a/core/src/plugins/core.notifications/templates/long/ru.php +++ b/core/src/plugins/core.notifications/templates/long/ru.php @@ -1,45 +1,47 @@ - * 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 . - */ +/* +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . +*/ $mess=array( - "file.add" => "Файл AJXP_NODE_LABEL создан пользователем AJXP_USER AJXP_DATE в папке AJXP_PARENT_PATH в рабочем пространстве AJXP_REPOSITORY_LABEL.", - "file.delete" => "Файл AJXP_NODE_LABEL удалён из AJXP_PARENT_PATH AJXP_DATE пользователем AJXP_USER.", - "file.change" => "Файл AJXP_NODE_LABEL изменён AJXP_DATE пользователем AJXP_USER.", - "file.rename" => "Файл AJXP_SOURCE_LABEL переименован в AJXP_NODE_LABEL AJXP_DATE пользователем AJXP_USER.", - "file.view" => "Файл AJXP_NODE_LABEL просмотрен AJXP_USER AJXP_DATE пользователем AJXP_USER.", - "file.copy" => "Файл AJXP_NODE_LABEL скопирован из AJXP_SOURCE_FOLDER в AJXP_PARENT_PATH AJXP_DATE пользователем AJXP_USER.", - "file.copy_to" => "Файл AJXP_NODE_LABEL скопирован в AJXP_TARGET_FOLDER AJXP_DATE пользователем AJXP_USER.", - "file.copy_from" => "Файл AJXP_NODE_LABEL скопирован из AJXP_SOURCE_FOLDER AJXP_DATE пользователем AJXP_USER.", - "file.move" => "Файл AJXP_NODE_LABEL перенесён из AJXP_SOURCE_FOLDER в AJXP_PARENT_PATH AJXP_DATE пользователем AJXP_USER.", - "file.move_to" => "Файл AJXP_NODE_LABEL перенесён в AJXP_TARGET_FOLDER AJXP_DATE пользователем AJXP_USER.", - "file.move_from" => "Файл AJXP_NODE_LABEL перенесён из AJXP_SOURCE_FOLDER AJXP_DATE пользователем AJXP_USER.", - "folder.add" => "Папка AJXP_NODE_LABEL создана в AJXP_PARENT_PATH AJXP_DATE пользователем AJXP_USER.", - "folder.delete" => "Папка AJXP_NODE_LABEL удалена из AJXP_PARENT_PATH AJXP_DATE пользователем AJXP_USER.", - "folder.rename" => "Папка AJXP_SOURCE_LABEL переименована в AJXP_NODE_LABEL AJXP_DATE пользователем AJXP_USER.", - "folder.change" => "Содержимое папки AJXP_NODE_LABEL внутри рабочего пространства AJXP_REPOSITORY_LABEL изменено AJXP_DATE пользователем AJXP_USER.", - "folder.view" => "Папка AJXP_NODE_LABEL открыта пользователем AJXP_USER AJXP_DATE", - "folder.copy" => "Папка AJXP_NODE_LABEL скопирована из AJXP_SOURCE_FOLDER в AJXP_PARENT_PATH AJXP_DATE пользователем AJXP_USER.", - "folder.copy_to" => "Папка AJXP_NODE_LABEL скопирована в AJXP_TARGET_FOLDER AJXP_DATE пользователем AJXP_USER.", - "folder.copy_from" => "Папка AJXP_NODE_LABEL скопирована из AJXP_SOURCE_FOLDER AJXP_DATE пользователем AJXP_USER.", - "folder.move" => "Папка AJXP_NODE_LABEL перенесена из AJXP_SOURCE_FOLDER в AJXP_PARENT_PATH AJXP_DATE пользователем AJXP_USER.", - "folder.move_to" => "Папка AJXP_NODE_LABEL перенесена в AJXP_TARGET_FOLDER AJXP_DATE пользователем AJXP_USER.", - "folder.move_from" => "Папка AJXP_NODE_LABEL перенесена из AJXP_SOURCE_FOLDER AJXP_DATE пользователем AJXP_USER.", - "ajxp_link" => "Нажмите для перехода к AJXP_NODE_LABEL", -); +"file.add" => "Файл AJXP_NODE_LABEL создан пользователем AJXP_USER AJXP_DATE в папке AJXP_PARENT_PATH в рабочем пространстве AJXP_REPOSITORY_LABEL.", +"file.delete" => "Файл AJXP_NODE_LABEL удалён из AJXP_PARENT_PATH AJXP_DATE пользователем AJXP_USER.", +"file.change" => "Файл AJXP_NODE_LABEL изменён AJXP_DATE пользователем AJXP_USER.", +"file.rename" => "Файл AJXP_SOURCE_LABEL переименован в AJXP_NODE_LABEL AJXP_DATE пользователем AJXP_USER.", +"file.view" => "Файл AJXP_NODE_LABEL просмотрен AJXP_USER AJXP_DATE пользователем AJXP_USER.", +"file.copy" => "Файл AJXP_NODE_LABEL скопирован из AJXP_SOURCE_FOLDER в AJXP_PARENT_PATH AJXP_DATE пользователем AJXP_USER.", +"file.copy_to" => "Файл AJXP_NODE_LABEL скопирован в AJXP_TARGET_FOLDER AJXP_DATE пользователем AJXP_USER.", +"file.copy_from" => "Файл AJXP_NODE_LABEL скопирован из AJXP_SOURCE_FOLDER AJXP_DATE пользователем AJXP_USER.", +"file.move" => "Файл AJXP_NODE_LABEL перенесён из AJXP_SOURCE_FOLDER в AJXP_PARENT_PATH AJXP_DATE пользователем AJXP_USER.", +"file.move_to" => "Файл AJXP_NODE_LABEL перенесён в AJXP_TARGET_FOLDER AJXP_DATE пользователем AJXP_USER.", +"file.move_from" => "Файл AJXP_NODE_LABEL перенесён из AJXP_SOURCE_FOLDER AJXP_DATE пользователем AJXP_USER.", +"folder.add" => "Папка AJXP_NODE_LABEL создана в AJXP_PARENT_PATH AJXP_DATE пользователем AJXP_USER.", +"folder.delete" => "Папка AJXP_NODE_LABEL удалена из AJXP_PARENT_PATH AJXP_DATE пользователем AJXP_USER.", +"folder.rename" => "Папка AJXP_SOURCE_LABEL переименована в AJXP_NODE_LABEL AJXP_DATE пользователем AJXP_USER.", +"folder.change" => "Содержимое папки AJXP_NODE_LABEL внутри рабочего пространства AJXP_REPOSITORY_LABEL изменено AJXP_DATE пользователем AJXP_USER.", +"folder.view" => "Папка AJXP_NODE_LABEL открыта пользователем AJXP_USER AJXP_DATE", +"folder.copy" => "Папка AJXP_NODE_LABEL скопирована из AJXP_SOURCE_FOLDER в AJXP_PARENT_PATH AJXP_DATE пользователем AJXP_USER.", +"folder.copy_to" => "Папка AJXP_NODE_LABEL скопирована в AJXP_TARGET_FOLDER AJXP_DATE пользователем AJXP_USER.", +"folder.copy_from" => "Папка AJXP_NODE_LABEL скопирована из AJXP_SOURCE_FOLDER AJXP_DATE пользователем AJXP_USER.", +"folder.move" => "Папка AJXP_NODE_LABEL перенесена из AJXP_SOURCE_FOLDER в AJXP_PARENT_PATH AJXP_DATE пользователем AJXP_USER.", +"folder.move_to" => "Папка AJXP_NODE_LABEL перенесена в AJXP_TARGET_FOLDER AJXP_DATE пользователем AJXP_USER.", +"folder.move_from" => "Папка AJXP_NODE_LABEL перенесена из AJXP_SOURCE_FOLDER AJXP_DATE пользователем AJXP_USER.", +"ajxp_link" => "Нажмите для перехода к AJXP_NODE_LABEL", +"file.share" => "User AJXP_USER has shared the file AJXP_NODE_LABEL with you", +"folder.share" => "User AJXP_USER has shared the folder AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/short/ca.php b/core/src/plugins/core.notifications/templates/short/ca.php index 071b882585..a209029c3e 100644 --- a/core/src/plugins/core.notifications/templates/short/ca.php +++ b/core/src/plugins/core.notifications/templates/short/ca.php @@ -20,23 +20,25 @@ */ // catalan translation: Salva Gómez , 2016 $mess=array( - "file.add" => "Fitxer AJXP_NODE_LABEL creat a AJXP_PARENT_PATH", - "file.delete" => "Fitxer AJXP_NODE_LABEL eliminat de AJXP_PARENT_PATH", - "file.change" => "Fitxer AJXP_NODE_LABEL modificat per AJXP_USER", - "file.view" => "Fitxer AJXP_NODE_LABEL consultaT per AJXP_USER", - "file.copy_to" => "AJXP_NODE_LABEL copiat a AJXP_TARGET_FOLDER", - "file.copy_from" => "AJXP_NODE_LABEL copiat des de AJXP_SOURCE_FOLDER", - "file.move_to" => "AJXP_NODE_LABEL mogut a AJXP_TARGET_FOLDER", - "file.move_from" => "AJXP_NODE_LABEL mogut des de AJXP_SOURCE_FOLDER", - "folder.add" => "Carpeta AJXP_NODE_LABEL creada en AJXP_PARENT_PATH", - "folder.delete" => "Carpeta AJXP_NODE_LABEL eliminada de AJXP_PARENT_PATH", - "folder.change" => "Contingut de la carpeta AJXP_NODE_LABEL actualitzat per AJXP_USER", - "folder.view" => "Carpeta AJXP_NODE_LABEL oberta per AJXP_USER", - "folder.copy_to" => "Carpeta AJXP_NODE_LABEL copiada a AJXP_TARGET_FOLDER", - "folder.copy_from" => "Carpeta AJXP_NODE_LABEL copiada des de AJXP_SOURCE_FOLDER", - "folder.move_to" => "Carpeta AJXP_NODE_LABEL moguda a AJXP_TARGET_FOLDER", - "folder.move_from" => "Carpeta AJXP_NODE_LABEL moguda des de AJXP_SOURCE_FOLDER", - "file.rename" => "AJXP_SOURCE_LABEL va ser renombrat a AJXP_NODE_LABEL", - "folder.rename" => "AJXP_SOURCE_LABEL va ser renombrada a AJXP_NODE_LABEL", +"file.add" => "Fitxer AJXP_NODE_LABEL creat a AJXP_PARENT_PATH", +"file.delete" => "Fitxer AJXP_NODE_LABEL eliminat de AJXP_PARENT_PATH", +"file.change" => "Fitxer AJXP_NODE_LABEL modificat per AJXP_USER", +"file.view" => "Fitxer AJXP_NODE_LABEL consultaT per AJXP_USER", +"file.copy_to" => "AJXP_NODE_LABEL copiat a AJXP_TARGET_FOLDER", +"file.copy_from" => "AJXP_NODE_LABEL copiat des de AJXP_SOURCE_FOLDER", +"file.move_to" => "AJXP_NODE_LABEL mogut a AJXP_TARGET_FOLDER", +"file.move_from" => "AJXP_NODE_LABEL mogut des de AJXP_SOURCE_FOLDER", +"folder.add" => "Carpeta AJXP_NODE_LABEL creada en AJXP_PARENT_PATH", +"folder.delete" => "Carpeta AJXP_NODE_LABEL eliminada de AJXP_PARENT_PATH", +"folder.change" => "Contingut de la carpeta AJXP_NODE_LABEL actualitzat per AJXP_USER", +"folder.view" => "Carpeta AJXP_NODE_LABEL oberta per AJXP_USER", +"folder.copy_to" => "Carpeta AJXP_NODE_LABEL copiada a AJXP_TARGET_FOLDER", +"folder.copy_from" => "Carpeta AJXP_NODE_LABEL copiada des de AJXP_SOURCE_FOLDER", +"folder.move_to" => "Carpeta AJXP_NODE_LABEL moguda a AJXP_TARGET_FOLDER", +"folder.move_from" => "Carpeta AJXP_NODE_LABEL moguda des de AJXP_SOURCE_FOLDER", +"file.rename" => "AJXP_SOURCE_LABEL va ser renombrat a AJXP_NODE_LABEL", +"folder.rename" => "AJXP_SOURCE_LABEL va ser renombrada a AJXP_NODE_LABEL", +"share.file" => "User AJXP_USER has shared the file AJXP_NODE_LABEL with you", +"share.folder" => "User AJXP_USER has shared the folder AJXP_NODE_LABEL with you", -); +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/short/de.php b/core/src/plugins/core.notifications/templates/short/de.php index aab4c5b999..e2f86db885 100755 --- a/core/src/plugins/core.notifications/templates/short/de.php +++ b/core/src/plugins/core.notifications/templates/short/de.php @@ -19,22 +19,24 @@ * The latest code can be found at . */ $mess=array( - "file.add" => "Datei AJXP_NODE_LABEL in AJXP_PARENT_PATH erstellt", - "file.delete" => "Datei AJXP_NODE_LABEL aus AJXP_PARENT_PATH gelöscht", - "file.change" => "Datei AJXP_NODE_LABEL von AJXP_USER verändert", - "file.view" => "Datei AJXP_NODE_LABEL von AJXP_USER betrachtet", - "file.copy_to" => "AJXP_NODE_LABEL nach AJXP_TARGET_FOLDER kopiert", - "file.copy_from" => "AJXP_NODE_LABEL von AJXP_SOURCE_FOLDER kopiert", - "file.move_to" => "AJXP_NODE_LABEL nach AJXP_TARGET_FOLDER verschoben", - "file.move_from" => "AJXP_NODE_LABEL von AJXP_SOURCE_FOLDER verschoben", - "folder.add" => "Verzeichnis AJXP_NODE_LABEL in AJXP_PARENT_PATH erstellt", - "folder.delete" => "Verzeichnis AJXP_NODE_LABEL aus AJXP_PARENT_PATH gelöscht", - "folder.change" => "Inhalt des Verzeichnisses AJXP_NODE_LABEL von AJXP_USER aktualisiert", - "folder.view" => "Verzeichnis AJXP_NODE_LABEL von AJXP_USER geöffnet", - "folder.copy_to" => "Verzeichnis AJXP_NODE_LABEL nach AJXP_TARGET_FOLDER kopiert", - "folder.copy_from" => "Verzeichnis AJXP_NODE_LABEL von AJXP_SOURCE_FOLDER kopiert", - "folder.move_to" => "Verzeichnis AJXP_NODE_LABEL nach AJXP_TARGET_FOLDER verschoben", - "folder.move_from" => "Verzeichnis AJXP_NODE_LABEL von AJXP_SOURCE_FOLDER verschoben", - "file.rename" => "Datei AJXP_SOURCE_LABEL wurde nach AJXP_NODE_LABEL umbenannt", - "folder.rename" => "Verzeichnis AJXP_SOURCE_LABEL wurde nach AJXP_NODE_LABEL umbenannt", -); +"file.add" => "Datei AJXP_NODE_LABEL in AJXP_PARENT_PATH erstellt", +"file.delete" => "Datei AJXP_NODE_LABEL aus AJXP_PARENT_PATH gelöscht", +"file.change" => "Datei AJXP_NODE_LABEL von AJXP_USER verändert", +"file.view" => "Datei AJXP_NODE_LABEL von AJXP_USER betrachtet", +"file.copy_to" => "AJXP_NODE_LABEL nach AJXP_TARGET_FOLDER kopiert", +"file.copy_from" => "AJXP_NODE_LABEL von AJXP_SOURCE_FOLDER kopiert", +"file.move_to" => "AJXP_NODE_LABEL nach AJXP_TARGET_FOLDER verschoben", +"file.move_from" => "AJXP_NODE_LABEL von AJXP_SOURCE_FOLDER verschoben", +"folder.add" => "Verzeichnis AJXP_NODE_LABEL in AJXP_PARENT_PATH erstellt", +"folder.delete" => "Verzeichnis AJXP_NODE_LABEL aus AJXP_PARENT_PATH gelöscht", +"folder.change" => "Inhalt des Verzeichnisses AJXP_NODE_LABEL von AJXP_USER aktualisiert", +"folder.view" => "Verzeichnis AJXP_NODE_LABEL von AJXP_USER geöffnet", +"folder.copy_to" => "Verzeichnis AJXP_NODE_LABEL nach AJXP_TARGET_FOLDER kopiert", +"folder.copy_from" => "Verzeichnis AJXP_NODE_LABEL von AJXP_SOURCE_FOLDER kopiert", +"folder.move_to" => "Verzeichnis AJXP_NODE_LABEL nach AJXP_TARGET_FOLDER verschoben", +"folder.move_from" => "Verzeichnis AJXP_NODE_LABEL von AJXP_SOURCE_FOLDER verschoben", +"file.rename" => "Datei AJXP_SOURCE_LABEL wurde nach AJXP_NODE_LABEL umbenannt", +"folder.rename" => "Verzeichnis AJXP_SOURCE_LABEL wurde nach AJXP_NODE_LABEL umbenannt", +"share.file" => "User AJXP_USER has shared the file AJXP_NODE_LABEL with you", +"share.folder" => "User AJXP_USER has shared the folder AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/short/en.php b/core/src/plugins/core.notifications/templates/short/en.php index b76c7db0d5..6f8d3e640a 100755 --- a/core/src/plugins/core.notifications/templates/short/en.php +++ b/core/src/plugins/core.notifications/templates/short/en.php @@ -38,5 +38,6 @@ "folder.move_from" => "Folder AJXP_NODE_LABEL moved from AJXP_SOURCE_FOLDER", "file.rename" => "AJXP_SOURCE_LABEL was renamed to AJXP_NODE_LABEL", "folder.rename" => "AJXP_SOURCE_LABEL was renamed to AJXP_NODE_LABEL", - + "share.file" => "User AJXP_USER has shared the file AJXP_NODE_LABEL with you", + "share.folder" => "User AJXP_USER has shared the folder AJXP_NODE_LABEL with you", ); diff --git a/core/src/plugins/core.notifications/templates/short/es.php b/core/src/plugins/core.notifications/templates/short/es.php index 9369ea901b..a8e52194f5 100644 --- a/core/src/plugins/core.notifications/templates/short/es.php +++ b/core/src/plugins/core.notifications/templates/short/es.php @@ -20,23 +20,25 @@ */ // spanish translation: Salva Gómez , 2016 $mess=array( - "file.add" => "Fichero AJXP_NODE_LABEL creado en AJXP_PARENT_PATH", - "file.delete" => "Fichero AJXP_NODE_LABEL eliminado de AJXP_PARENT_PATH", - "file.change" => "Fichero AJXP_NODE_LABEL modificado por AJXP_USER", - "file.view" => "Fichero AJXP_NODE_LABEL consultado por AJXP_USER", - "file.copy_to" => "AJXP_NODE_LABEL copiado a AJXP_TARGET_FOLDER", - "file.copy_from" => "AJXP_NODE_LABEL copiado desde AJXP_SOURCE_FOLDER", - "file.move_to" => "AJXP_NODE_LABEL movido a AJXP_TARGET_FOLDER", - "file.move_from" => "AJXP_NODE_LABEL movido desde AJXP_SOURCE_FOLDER", - "folder.add" => "Carpeta AJXP_NODE_LABEL creada en AJXP_PARENT_PATH", - "folder.delete" => "Carpeta AJXP_NODE_LABEL eliminada de AJXP_PARENT_PATH", - "folder.change" => "Contenido de la carpeta AJXP_NODE_LABEL actualizado por AJXP_USER", - "folder.view" => "Carpeta AJXP_NODE_LABEL abierta por AJXP_USER", - "folder.copy_to" => "Carpeta AJXP_NODE_LABEL copiada a AJXP_TARGET_FOLDER", - "folder.copy_from" => "Carpeta AJXP_NODE_LABEL copiada desde AJXP_SOURCE_FOLDER", - "folder.move_to" => "Carpeta AJXP_NODE_LABEL movida a AJXP_TARGET_FOLDER", - "folder.move_from" => "Carpeta AJXP_NODE_LABEL movida desde AJXP_SOURCE_FOLDER", - "file.rename" => "AJXP_SOURCE_LABEL fue renombrado a AJXP_NODE_LABEL", - "folder.rename" => "AJXP_SOURCE_LABEL fue renombrada a AJXP_NODE_LABEL", +"file.add" => "Fichero AJXP_NODE_LABEL creado en AJXP_PARENT_PATH", +"file.delete" => "Fichero AJXP_NODE_LABEL eliminado de AJXP_PARENT_PATH", +"file.change" => "Fichero AJXP_NODE_LABEL modificado por AJXP_USER", +"file.view" => "Fichero AJXP_NODE_LABEL consultado por AJXP_USER", +"file.copy_to" => "AJXP_NODE_LABEL copiado a AJXP_TARGET_FOLDER", +"file.copy_from" => "AJXP_NODE_LABEL copiado desde AJXP_SOURCE_FOLDER", +"file.move_to" => "AJXP_NODE_LABEL movido a AJXP_TARGET_FOLDER", +"file.move_from" => "AJXP_NODE_LABEL movido desde AJXP_SOURCE_FOLDER", +"folder.add" => "Carpeta AJXP_NODE_LABEL creada en AJXP_PARENT_PATH", +"folder.delete" => "Carpeta AJXP_NODE_LABEL eliminada de AJXP_PARENT_PATH", +"folder.change" => "Contenido de la carpeta AJXP_NODE_LABEL actualizado por AJXP_USER", +"folder.view" => "Carpeta AJXP_NODE_LABEL abierta por AJXP_USER", +"folder.copy_to" => "Carpeta AJXP_NODE_LABEL copiada a AJXP_TARGET_FOLDER", +"folder.copy_from" => "Carpeta AJXP_NODE_LABEL copiada desde AJXP_SOURCE_FOLDER", +"folder.move_to" => "Carpeta AJXP_NODE_LABEL movida a AJXP_TARGET_FOLDER", +"folder.move_from" => "Carpeta AJXP_NODE_LABEL movida desde AJXP_SOURCE_FOLDER", +"file.rename" => "AJXP_SOURCE_LABEL fue renombrado a AJXP_NODE_LABEL", +"folder.rename" => "AJXP_SOURCE_LABEL fue renombrada a AJXP_NODE_LABEL", +"share.file" => "User AJXP_USER has shared the file AJXP_NODE_LABEL with you", +"share.folder" => "User AJXP_USER has shared the folder AJXP_NODE_LABEL with you", -); +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/short/fr.php b/core/src/plugins/core.notifications/templates/short/fr.php index 1c2038da73..a29b85f569 100755 --- a/core/src/plugins/core.notifications/templates/short/fr.php +++ b/core/src/plugins/core.notifications/templates/short/fr.php @@ -1,40 +1,42 @@ - * 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 . +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . */ $mess=array( - "file.add" => "Fichier AJXP_NODE_LABEL créé dans AJXP_PARENT_PATH", - "file.delete" => "Fichier AJXP_NODE_LABEL supprimé de AJXP_PARENT_PATH", - "file.change" => "Fichier AJXP_NODE_LABEL modifié par AJXP_USER", - "file.view" => "Fichier AJXP_NODE_LABEL consulté par AJXP_USER", - "file.copy_to" => "Fichier AJXP_NODE_LABEL copié vers AJXP_TARGET_FOLDER", - "file.copy_from" => "Fichier AJXP_NODE_LABEL copié depuis AJXP_SOURCE_FOLDER", - "file.move_to" => "Fichier AJXP_NODE_LABEL déplacé vers AJXP_TARGET_FOLDER", - "file.move_from" => "Fichier AJXP_NODE_LABEL déplacé depuis AJXP_SOURCE_FOLDER", - "folder.add" => "Répertoire AJXP_NODE_LABEL créé dans AJXP_PARENT_PATH", - "folder.delete" => "Répertoire AJXP_NODE_LABEL supprimé de AJXP_PARENT_PATH", - "folder.change" => "Répertoire AJXP_NODE_LABEL mis à jour par AJXP_USER", - "folder.view" => "Répertoire AJXP_NODE_LABEL consulté par AJXP_USER", - "folder.copy_to" => "Répertoire AJXP_NODE_LABEL copié vers AJXP_TARGET_FOLDER", - "folder.copy_from" => "Répertoire AJXP_NODE_LABEL copié depuis AJXP_SOURCE_FOLDER", - "folder.move_to" => "Répertoire AJXP_NODE_LABEL déplacé vers AJXP_TARGET_FOLDER", - "folder.move_from" => "Répertoire AJXP_NODE_LABEL déplacé depuis AJXP_SOURCE_FOLDER", - "file.rename" => "AJXP_SOURCE_LABEL a été renommé en AJXP_NODE_LABEL", - "folder.rename" => "AJXP_SOURCE_LABEL a été renommé en AJXP_NODE_LABEL", -); +"file.add" => "Fichier AJXP_NODE_LABEL créé dans AJXP_PARENT_PATH", +"file.delete" => "Fichier AJXP_NODE_LABEL supprimé de AJXP_PARENT_PATH", +"file.change" => "Fichier AJXP_NODE_LABEL modifié par AJXP_USER", +"file.view" => "Fichier AJXP_NODE_LABEL consulté par AJXP_USER", +"file.copy_to" => "Fichier AJXP_NODE_LABEL copié vers AJXP_TARGET_FOLDER", +"file.copy_from" => "Fichier AJXP_NODE_LABEL copié depuis AJXP_SOURCE_FOLDER", +"file.move_to" => "Fichier AJXP_NODE_LABEL déplacé vers AJXP_TARGET_FOLDER", +"file.move_from" => "Fichier AJXP_NODE_LABEL déplacé depuis AJXP_SOURCE_FOLDER", +"folder.add" => "Répertoire AJXP_NODE_LABEL créé dans AJXP_PARENT_PATH", +"folder.delete" => "Répertoire AJXP_NODE_LABEL supprimé de AJXP_PARENT_PATH", +"folder.change" => "Répertoire AJXP_NODE_LABEL mis à jour par AJXP_USER", +"folder.view" => "Répertoire AJXP_NODE_LABEL consulté par AJXP_USER", +"folder.copy_to" => "Répertoire AJXP_NODE_LABEL copié vers AJXP_TARGET_FOLDER", +"folder.copy_from" => "Répertoire AJXP_NODE_LABEL copié depuis AJXP_SOURCE_FOLDER", +"folder.move_to" => "Répertoire AJXP_NODE_LABEL déplacé vers AJXP_TARGET_FOLDER", +"folder.move_from" => "Répertoire AJXP_NODE_LABEL déplacé depuis AJXP_SOURCE_FOLDER", +"file.rename" => "AJXP_SOURCE_LABEL a été renommé en AJXP_NODE_LABEL", +"folder.rename" => "AJXP_SOURCE_LABEL a été renommé en AJXP_NODE_LABEL", +"file.share" => "AJXP_USER a partagé le fichier AJXP_NODE_LABEL avec vous", +"folder.share" => "AJXP_USER a partagé le répertoire AJXP_NODE_LABEL avec vous", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/short/pt.php b/core/src/plugins/core.notifications/templates/short/pt.php index a43e0520a7..d578f4251e 100644 --- a/core/src/plugins/core.notifications/templates/short/pt.php +++ b/core/src/plugins/core.notifications/templates/short/pt.php @@ -1,40 +1,42 @@ - * 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 . +* Copyright 2007-2013 Charles du Jeu - Abstrium SAS +* 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 . */ $mess=array( - "file.add" => "Ficheiro AJXP_NODE_LABEL criado em AJXP_PARENT_PATH", - "file.delete" => "Ficheiro AJXP_NODE_LABEL apagado de AJXP_PARENT_PATH", - "file.change" => "Ficheiro AJXP_NODE_LABEL modificado por AJXP_USER", - "file.view" => "Ficheiro AJXP_NODE_LABEL consultado por AJXP_USER", - "file.copy_to" => "AJXP_NODE_LABEL copiado para AJXP_TARGET_FOLDER", - "file.copy_from" => "AJXP_NODE_LABEL copiado de AJXP_SOURCE_FOLDER", - "file.move_to" => "AJXP_NODE_LABEL movido para AJXP_TARGET_FOLDER", - "file.move_from" => "AJXP_NODE_LABEL movido de AJXP_SOURCE_FOLDER", - "folder.add" => "Pasta AJXP_NODE_LABEL criado em AJXP_PARENT_PATH", - "folder.delete" => "Pasta AJXP_NODE_LABEL apagado de AJXP_PARENT_PATH", - "folder.change" => "Conteúdo da pasta AJXP_NODE_LABEL actualizado por AJXP_USER", - "folder.view" => "Pasta AJXP_NODE_LABEL aberto por AJXP_USER", - "folder.copy_to" => "Pasta AJXP_NODE_LABEL copiado para AJXP_TARGET_FOLDER", - "folder.copy_from" => "Pasta AJXP_NODE_LABEL copiado de AJXP_SOURCE_FOLDER", - "folder.move_to" => "Pasta AJXP_NODE_LABEL movido para AJXP_TARGET_FOLDER", - "folder.move_from" => "Pasta AJXP_NODE_LABEL movido de AJXP_SOURCE_FOLDER", - "file.rename" => "AJXP_SOURCE_LABEL was renamed to AJXP_NODE_LABEL", - "folder.rename" => "AJXP_SOURCE_LABEL was renamed to AJXP_NODE_LABEL", -); +"file.add" => "Ficheiro AJXP_NODE_LABEL criado em AJXP_PARENT_PATH", +"file.delete" => "Ficheiro AJXP_NODE_LABEL apagado de AJXP_PARENT_PATH", +"file.change" => "Ficheiro AJXP_NODE_LABEL modificado por AJXP_USER", +"file.view" => "Ficheiro AJXP_NODE_LABEL consultado por AJXP_USER", +"file.copy_to" => "AJXP_NODE_LABEL copiado para AJXP_TARGET_FOLDER", +"file.copy_from" => "AJXP_NODE_LABEL copiado de AJXP_SOURCE_FOLDER", +"file.move_to" => "AJXP_NODE_LABEL movido para AJXP_TARGET_FOLDER", +"file.move_from" => "AJXP_NODE_LABEL movido de AJXP_SOURCE_FOLDER", +"folder.add" => "Pasta AJXP_NODE_LABEL criado em AJXP_PARENT_PATH", +"folder.delete" => "Pasta AJXP_NODE_LABEL apagado de AJXP_PARENT_PATH", +"folder.change" => "Conteúdo da pasta AJXP_NODE_LABEL actualizado por AJXP_USER", +"folder.view" => "Pasta AJXP_NODE_LABEL aberto por AJXP_USER", +"folder.copy_to" => "Pasta AJXP_NODE_LABEL copiado para AJXP_TARGET_FOLDER", +"folder.copy_from" => "Pasta AJXP_NODE_LABEL copiado de AJXP_SOURCE_FOLDER", +"folder.move_to" => "Pasta AJXP_NODE_LABEL movido para AJXP_TARGET_FOLDER", +"folder.move_from" => "Pasta AJXP_NODE_LABEL movido de AJXP_SOURCE_FOLDER", +"file.rename" => "AJXP_SOURCE_LABEL was renamed to AJXP_NODE_LABEL", +"folder.rename" => "AJXP_SOURCE_LABEL was renamed to AJXP_NODE_LABEL", +"share.file" => "User AJXP_USER has shared the file AJXP_NODE_LABEL with you", +"share.folder" => "User AJXP_USER has shared the folder AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/core.notifications/templates/short/ru.php b/core/src/plugins/core.notifications/templates/short/ru.php index 3a1c2063a4..aa4321650b 100644 --- a/core/src/plugins/core.notifications/templates/short/ru.php +++ b/core/src/plugins/core.notifications/templates/short/ru.php @@ -19,22 +19,24 @@ * The latest code can be found at . */ $mess=array( - "file.add" => "Файл AJXP_NODE_LABEL создан в AJXP_PARENT_PATH", - "file.delete" => "Файл AJXP_NODE_LABEL удалён из AJXP_PARENT_PATH", - "file.change" => "Файл AJXP_NODE_LABEL изменён AJXP_USER", - "file.view" => "Файл AJXP_NODE_LABEL просмотрен AJXP_USER", - "file.copy_to" => "AJXP_NODE_LABEL скопировано в AJXP_TARGET_FOLDER", - "file.copy_from" => "AJXP_NODE_LABEL скопировано из AJXP_SOURCE_FOLDER", - "file.move_to" => "AJXP_NODE_LABEL перенесено в AJXP_TARGET_FOLDER", - "file.move_from" => "AJXP_NODE_LABEL перенесено из AJXP_SOURCE_FOLDER", - "folder.add" => "Папка AJXP_NODE_LABEL создана в AJXP_PARENT_PATH", - "folder.delete" => "Папка AJXP_NODE_LABEL удалена из AJXP_PARENT_PATH", - "folder.change" => "Содержимое папки AJXP_NODE_LABEL обновлено AJXP_USER", - "folder.view" => "Папка AJXP_NODE_LABEL открыта AJXP_USER", - "folder.copy_to" => "Папка AJXP_NODE_LABEL скопирована в AJXP_TARGET_FOLDER", - "folder.copy_from" => "Папка AJXP_NODE_LABEL скопировано из AJXP_SOURCE_FOLDER", - "folder.move_to" => "Папка AJXP_NODE_LABEL перенесена в AJXP_TARGET_FOLDER", - "folder.move_from" => "Папка AJXP_NODE_LABEL перенесена из AJXP_SOURCE_FOLDER", - "file.rename" => "Файл AJXP_SOURCE_LABEL переименован в AJXP_NODE_LABEL", - "folder.rename" => "Папка AJXP_SOURCE_LABEL переименована в AJXP_NODE_LABEL", -); +"file.add" => "Файл AJXP_NODE_LABEL создан в AJXP_PARENT_PATH", +"file.delete" => "Файл AJXP_NODE_LABEL удалён из AJXP_PARENT_PATH", +"file.change" => "Файл AJXP_NODE_LABEL изменён AJXP_USER", +"file.view" => "Файл AJXP_NODE_LABEL просмотрен AJXP_USER", +"file.copy_to" => "AJXP_NODE_LABEL скопировано в AJXP_TARGET_FOLDER", +"file.copy_from" => "AJXP_NODE_LABEL скопировано из AJXP_SOURCE_FOLDER", +"file.move_to" => "AJXP_NODE_LABEL перенесено в AJXP_TARGET_FOLDER", +"file.move_from" => "AJXP_NODE_LABEL перенесено из AJXP_SOURCE_FOLDER", +"folder.add" => "Папка AJXP_NODE_LABEL создана в AJXP_PARENT_PATH", +"folder.delete" => "Папка AJXP_NODE_LABEL удалена из AJXP_PARENT_PATH", +"folder.change" => "Содержимое папки AJXP_NODE_LABEL обновлено AJXP_USER", +"folder.view" => "Папка AJXP_NODE_LABEL открыта AJXP_USER", +"folder.copy_to" => "Папка AJXP_NODE_LABEL скопирована в AJXP_TARGET_FOLDER", +"folder.copy_from" => "Папка AJXP_NODE_LABEL скопировано из AJXP_SOURCE_FOLDER", +"folder.move_to" => "Папка AJXP_NODE_LABEL перенесена в AJXP_TARGET_FOLDER", +"folder.move_from" => "Папка AJXP_NODE_LABEL перенесена из AJXP_SOURCE_FOLDER", +"file.rename" => "Файл AJXP_SOURCE_LABEL переименован в AJXP_NODE_LABEL", +"folder.rename" => "Папка AJXP_SOURCE_LABEL переименована в AJXP_NODE_LABEL", +"share.file" => "User AJXP_USER has shared the file AJXP_NODE_LABEL with you", +"share.folder" => "User AJXP_USER has shared the folder AJXP_NODE_LABEL with you", +); \ No newline at end of file diff --git a/core/src/plugins/feed.sql/SqlFeedStore.php b/core/src/plugins/feed.sql/SqlFeedStore.php index 4d645511a5..fab20f8436 100755 --- a/core/src/plugins/feed.sql/SqlFeedStore.php +++ b/core/src/plugins/feed.sql/SqlFeedStore.php @@ -26,6 +26,7 @@ use Pydio\Core\Model\ContextInterface; use Pydio\Core\Controller\Controller; +use Pydio\Core\Model\UserInterface; use Pydio\Core\Utils\DBHelper; use Pydio\Core\Utils\Vars\OptionsHelper; @@ -205,19 +206,25 @@ public function loadEvents($filterByRepositories, $filterByPath, $userGroup, $of /** * @abstract * @param Notification $notif + * @param bool $repoScopeAll + * @param bool|string $groupScope * @return mixed */ - public function persistAlert(Notification $notif) + public function persistAlert(Notification $notif, $repoScopeAll = false, $groupScope = false) { if(!$notif->getNode()) return; - $repositoryId = $notif->getNode()->getRepositoryId(); + if($repoScopeAll){ + $repositoryId = "*"; + }else{ + $repositoryId = $notif->getNode()->getRepositoryId(); + } $userId = $notif->getTarget(); if($this->sqlDriver["password"] == "XXXX") return; if(!dibi::isConnected()) { dibi::connect($this->sqlDriver); } try { - dibi::query("INSERT INTO [ajxp_feed] ([edate],[etype],[htype],[user_id],[repository_id],[content], [index_path]) VALUES (%i,%s,%s,%s,%s,%bin,%s)", + dibi::query("INSERT INTO [ajxp_feed] ([edate],[etype],[htype],[user_id],[repository_id],[user_group],[content],[index_path]) VALUES (%i,%s,%s,%s,%s,".($groupScope?"'$groupScope'":"NULL").",%bin,%s)", time(), "alert", "notification", @@ -233,23 +240,24 @@ public function persistAlert(Notification $notif) /** * @abstract - * @param $userId + * @param UserInterface $userObject * @param null $repositoryIdFilter * @return mixed */ - public function loadAlerts($userId, $repositoryIdFilter = null) + public function loadAlerts($userObject, $repositoryIdFilter = null) { + $userId = $userObject->getId(); + $userGroup = $userObject->getGroupPath(); if($this->sqlDriver["password"] == "XXXX") return array(); if(!dibi::isConnected()) { dibi::connect($this->sqlDriver); } if ($repositoryIdFilter !== null) { $res = dibi::query("SELECT * FROM [ajxp_feed] WHERE [etype] = %s - AND ([repository_id] = %s OR [repository_id] IN (SELECT [uuid] FROM [ajxp_repo] WHERE [parent_uuid]=%s)) - AND [user_id] = %s ORDER BY [edate] DESC %lmt", "alert", $repositoryIdFilter, $repositoryIdFilter, $userId, 100); - //$res = dibi::query("SELECT * FROM [ajxp_feed] WHERE [etype] = %s AND [repository_id] = %s AND [user_id] = %s ORDER BY [edate] DESC %lmt", "alert", $repositoryIdFilter, $userId, 100); + AND ([repository_id] = %s OR [repository_id] IN (SELECT [uuid] FROM [ajxp_repo] WHERE [parent_uuid]=%s) OR [repository_id] = %s) + AND ([user_id] = %s OR [user_group] = %s ) ORDER BY [edate] DESC %lmt", "alert", $repositoryIdFilter, $repositoryIdFilter, '*', $userId, $userGroup, 100); } else { - $res = dibi::query("SELECT * FROM [ajxp_feed] WHERE [etype] = %s AND [user_id] = %s ORDER BY [edate] DESC %lmt", "alert", $userId, 100); + $res = dibi::query("SELECT * FROM [ajxp_feed] WHERE [etype] = %s AND ([user_id] = %s OR [user_group] = %s) ORDER BY [edate] DESC %lmt", "alert", $userId, $userGroup, 100); } $data = array(); foreach ($res as $n => $row) { @@ -271,13 +279,15 @@ public function dismissAlertById(ContextInterface $contextInterface, $alertId, $ dibi::connect($this->sqlDriver); } $userId = $contextInterface->getUser()->getId(); + $userGroup = $contextInterface->getUser()->getGroupPath(); if ($occurrences == 1) { - dibi::query("DELETE FROM [ajxp_feed] WHERE [id] = %i AND [user_id] = %s", $alertId, $userId); + dibi::query("DELETE FROM [ajxp_feed] WHERE [id] = %i AND ([user_id] = %s OR [user_group] = %s) AND [etype] = %s", $alertId, $userId, $userGroup, "alert"); } else { - $res = dibi::query("SELECT * FROM [ajxp_feed] WHERE [id] = %i AND [user_id] = %s", $alertId, $userId); + $res = dibi::query("SELECT * FROM [ajxp_feed] WHERE [id] = %i AND ([user_id] = %s OR [user_group] = %s) AND [etype] = %s", $alertId, $userId, $userGroup, "alert"); if(!count($res)){ return; } + $startEventRow = null; foreach ($res as $n => $row) { $startEventRow = $row; break; @@ -286,13 +296,12 @@ public function dismissAlertById(ContextInterface $contextInterface, $alertId, $ * @var $startEventNotif Notification */ $startEventNotif = unserialize($startEventRow->content); - if(empty($startEventNotif)) { - // Ignore, empty notif; + if(empty($startEventNotif) || ! $startEventNotif instanceof Notification) { return; } $url = $startEventNotif->getNode()->getUrl(); $date = $startEventRow->edate; - $newRes = dibi::query("SELECT [id] FROM [ajxp_feed] WHERE [etype] = %s AND [user_id] = %s AND [edate] <= %s AND [index_path] = %s ORDER BY [edate] DESC %lmt", "alert", $userId, $date, $url, $occurrences); + $newRes = dibi::query("SELECT [id] FROM [ajxp_feed] WHERE [etype] = %s AND ([user_id] = %s OR [user_group] = %s) AND [edate] <= %s AND [index_path] = %s ORDER BY [edate] DESC %lmt", "alert", $userId, $userGroup, $date, $url, $occurrences); $a = $newRes->fetchPairs(); if (!count($a)) { // Weird, probably not upgraded! From d69034f035566537d2751288159ae1ebc8c6f3b4 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Sat, 1 Oct 2016 09:29:04 +0200 Subject: [PATCH 10/41] Fix VarsFiltering issues: when PARENT_REPOSITORY_OPTION do not go further. Do not filter repository display anymore for sec reasons. --- .../src/pydio/Core/Utils/Vars/VarsFilter.php | 27 ++++++++++--------- .../core.access/src/Model/Repository.php | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/core/src/core/src/pydio/Core/Utils/Vars/VarsFilter.php b/core/src/core/src/pydio/Core/Utils/Vars/VarsFilter.php index 974e457a27..ebbde98753 100644 --- a/core/src/core/src/pydio/Core/Utils/Vars/VarsFilter.php +++ b/core/src/core/src/pydio/Core/Utils/Vars/VarsFilter.php @@ -51,6 +51,21 @@ class VarsFilter */ public static function filter($value, ContextInterface $ctx) { + // If AJXP_PARENT_OPTION, resolve and return directly, do not filter the real value. + if(is_string($value) && preg_match("/AJXP_PARENT_OPTION:([\w_-]*):/", $value, $matches)){ + $repoObject = $ctx->getRepository(); + $parentRepository = $repoObject->getParentRepository(); + if(empty($parentRepository)){ + throw new PydioException("Cannot resolve ".$matches[0]." without parent workspace"); + } + $parentOwner = $ctx->getRepository()->getOwner(); + $parentContext = Context::contextWithObjects(null, $parentRepository); + $parentContext->setUserId($parentOwner); + $parentPath = rtrim($parentRepository->getContextOption($parentContext, $matches[1]), "/"); + $value = str_replace($matches[0], $parentPath, $value); + return $value; + } + if (is_string($value) && strpos($value, "AJXP_USER")!==false) { if (UsersService::usersEnabled()) { if(!$ctx->hasUser()){ @@ -85,18 +100,6 @@ public static function filter($value, ContextInterface $ctx) if (is_string($value) && strstr($value, "AJXP_WORKSPACE_SLUG") !== false) { $value = rtrim(str_replace("AJXP_WORKSPACE_SLUG", $ctx->getRepository()->getSlug(), $value), "/"); } - if(is_string($value) && preg_match("/AJXP_PARENT_OPTION:([\w_-]*):/", $value, $matches)){ - $repoObject = $ctx->getRepository(); - $parentRepository = $repoObject->getParentRepository(); - if(empty($parentRepository)){ - throw new PydioException("Cannot resolve ".$matches[0]." without parent workspace"); - } - $parentOwner = $ctx->getRepository()->getOwner(); - $parentContext = Context::contextWithObjects(null, $parentRepository); - $parentContext->setUserId($parentOwner); - $parentPath = rtrim($parentRepository->getContextOption($parentContext, $matches[1]), "/"); - $value = str_replace($matches[0], $parentPath, $value); - } $tab = array(&$value, $ctx); Controller::applyIncludeHook("vars.filter", $tab); diff --git a/core/src/plugins/core.access/src/Model/Repository.php b/core/src/plugins/core.access/src/Model/Repository.php index c64bb2855f..3f466f93e8 100644 --- a/core/src/plugins/core.access/src/Model/Repository.php +++ b/core/src/plugins/core.access/src/Model/Repository.php @@ -425,7 +425,7 @@ public function getDisplay() return $mess[$this->displayStringId]; } } - return VarsFilter::filter($this->display, Context::emptyContext()); + return $this->display; } /** From 6d78cb2e749193113a89258c8cad8742512b55a8 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Sat, 1 Oct 2016 09:39:13 +0200 Subject: [PATCH 11/41] Add a WARNING in the legend of CASE_SENSITIVE to make sure to explain why it's always disabled. --- core/src/plugins/core.auth/i18n/conf/de.php | 2 +- core/src/plugins/core.auth/i18n/conf/en.php | 2 +- core/src/plugins/core.auth/i18n/conf/fr.php | 2 +- core/src/plugins/core.auth/i18n/conf/it.php | 2 +- core/src/plugins/core.auth/i18n/conf/pt.php | 2 +- core/src/plugins/core.auth/i18n/conf/ru.php | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/plugins/core.auth/i18n/conf/de.php b/core/src/plugins/core.auth/i18n/conf/de.php index 5491511354..24ea7777ca 100644 --- a/core/src/plugins/core.auth/i18n/conf/de.php +++ b/core/src/plugins/core.auth/i18n/conf/de.php @@ -28,7 +28,7 @@ "Options applied to all auth drivers" => "Einstellungen für alle Authentifizierung-Treiber", "Activate the users management system to protect your Pydio installation." => "Benutzerverwaltung aktivieren um die Pydio-Installation zu schützen.", "Case Sensitive" => "Groß- / Kleinschreibung beachten", -"Whether the users identifiers should be case sensitive or not" => "Bei der BenutzerId Groß- / Kleinschreibung beachten", +"Whether the users identifiers should be case sensitive or not" => "Bei der BenutzerId Groß- / Kleinschreibung beachten. WARNING, sql-based drivers will disable this by default, even if you check this.", "Enable the 'guest' user, who does not need to log in." => "Aktiviert den 'Gast' Benutzer ohne Login.", "Minimum number of characters required for passwords in the application" => "Minimale Passwortlänge", "Set the users credentials in the session after a successful login, this can be necessary when bridging specific auth and access plugins." => "Anmeldedaten nach erfolgreichem Login in der Sitzung merken. (möglicherweise beim Bridging von Auth-Erweiterungen nötig)", diff --git a/core/src/plugins/core.auth/i18n/conf/en.php b/core/src/plugins/core.auth/i18n/conf/en.php index b4ea4344ca..8421eaa9b0 100644 --- a/core/src/plugins/core.auth/i18n/conf/en.php +++ b/core/src/plugins/core.auth/i18n/conf/en.php @@ -28,7 +28,7 @@ "Options applied to all auth drivers" => "Options applied to all auth drivers", "Activate the users management system to protect your Pydio installation." => "Activate the users management system to protect your Pydio installation.", "Case Sensitive" => "Case Sensitive", -"Whether the users identifiers should be case sensitive or not" => "Whether the users identifiers should be case sensitive or not", +"Whether the users identifiers should be case sensitive or not" => "Whether the users identifiers should be case sensitive or not. WARNING, sql-based drivers will disable this by default, even if you check this.", "Enable the 'guest' user, who does not need to log in." => "Enable the 'guest' user, who does not need to log in.", "Minimum number of characters required for passwords in the application" => "Minimum number of characters required for passwords in the application", "Set the users credentials in the session after a successful login, this can be necessary when bridging specific auth and access plugins." => "Set the users credentials in the session after a successful login, this can be necessary when bridging specific auth and access plugins.", diff --git a/core/src/plugins/core.auth/i18n/conf/fr.php b/core/src/plugins/core.auth/i18n/conf/fr.php index b4f47b9cdc..a8c3b24a81 100644 --- a/core/src/plugins/core.auth/i18n/conf/fr.php +++ b/core/src/plugins/core.auth/i18n/conf/fr.php @@ -28,7 +28,7 @@ "Options applied to all auth drivers" => "Options appliquées à tous les drivers d'autentification", "Activate the users management system to protect your Pydio installation." => "Activer le système de gestion d'utilisateurs pour protéger votre installation Pydio.", "Case Sensitive" => "Sensible à la casse", -"Whether the users identifiers should be case sensitive or not" => "Définit si les identifiants des utilisateurs doivent-être sensibles à la casse", +"Whether the users identifiers should be case sensitive or not" => "Définit si les identifiants des utilisateurs doivent-être sensibles à la casse. Attention les drivers basés sur SQL vont toujours désactiver cette valeur.", "Enable the 'guest' user, who does not need to log in." => "Activer l'utilisateur 'Invité', qui n'a pas besoin de se connecter.", "Minimum number of characters required for passwords in the application" => "Longueur minimale (en caractères) des mots de passe pour l'application", "Set the users credentials in the session after a successful login, this can be necessary when bridging specific auth and access plugins." => "Stocker les identifiants de l'utilisateur dans la session après la connexion, peut-être requis lors de l'utilisation de plugins d'authentification et d'accès spécifiques.", diff --git a/core/src/plugins/core.auth/i18n/conf/it.php b/core/src/plugins/core.auth/i18n/conf/it.php index 73bbfe262e..b68614dbf5 100644 --- a/core/src/plugins/core.auth/i18n/conf/it.php +++ b/core/src/plugins/core.auth/i18n/conf/it.php @@ -28,7 +28,7 @@ "Options applied to all auth drivers" => "Opzioni applicate su tutti i driver di autenticazione", "Activate the users management system to protect your Pydio installation." => "Attiva il sistema di gestone utenti per proteggere l'installazione di Pydio.", "Case Sensitive" => "Case Sensitive", -"Whether the users identifiers should be case sensitive or not" => "Se attivo, l'identificatore dell'utente è case sensitive", +"Whether the users identifiers should be case sensitive or not" => "Se attivo, l'identificatore dell'utente è case sensitive. WARNING, sql-based drivers will disable this by default, even if you check this.", "Enable the 'guest' user, who does not need to log in." => "Abilita l'utente 'guest' (ospite), che non necessita di login.", "Minimum number of characters required for passwords in the application" => "Numero minimo di caratteri richiesti per la password", "Set the users credentials in the session after a successful login, this can be necessary when bridging specific auth and access plugins." => "Imposta le credenziali dell'utente nella session, dopo il buon esito del login. Può essere necessario quando si collegano specifici plugin di autenticazione o accesso.", diff --git a/core/src/plugins/core.auth/i18n/conf/pt.php b/core/src/plugins/core.auth/i18n/conf/pt.php index c03a12371c..bbe3ab9971 100644 --- a/core/src/plugins/core.auth/i18n/conf/pt.php +++ b/core/src/plugins/core.auth/i18n/conf/pt.php @@ -28,7 +28,7 @@ "Options applied to all auth drivers" => "Options applied to all auth drivers", "Activate the users management system to protect your Pydio installation." => "Activate the users management system to protect your Pydio installation.", "Case Sensitive" => "Case Sensitive", -"Whether the users identifiers should be case sensitive or not" => "Whether the users identifiers should be case sensitive or not", +"Whether the users identifiers should be case sensitive or not" => "Whether the users identifiers should be case sensitive or not. WARNING, sql-based drivers will disable this by default, even if you check this.", "Enable the 'guest' user, who does not need to log in." => "Enable the 'guest' user, who does not need to log in.", "Minimum number of characters required for passwords in the application" => "Minimum number of characters required for passwords in the application", "Set the users credentials in the session after a successful login, this can be necessary when bridging specific auth and access plugins." => "Set the users credentials in the session after a successful login, this can be necessary when bridging specific auth and access plugins.", diff --git a/core/src/plugins/core.auth/i18n/conf/ru.php b/core/src/plugins/core.auth/i18n/conf/ru.php index fdb271dc53..5019504320 100644 --- a/core/src/plugins/core.auth/i18n/conf/ru.php +++ b/core/src/plugins/core.auth/i18n/conf/ru.php @@ -28,7 +28,7 @@ "Options applied to all auth drivers" => "Options applied to all auth drivers", "Activate the users management system to protect your Pydio installation." => "Активировать управление пользователями для защиты вашей системы.", "Case Sensitive" => "Различать регистр букв", -"Whether the users identifiers should be case sensitive or not" => "Требуется ли в идентификаторах пользователей учитывать регистр букв", +"Whether the users identifiers should be case sensitive or not" => "Требуется ли в идентификаторах пользователей учитывать регистр букв. WARNING, sql-based drivers will disable this by default, even if you check this.", "Enable the 'guest' user, who does not need to log in." => "Включить ли гостевой доступ без пароля.", "Minimum number of characters required for passwords in the application" => "Минимальная длина пароля", "Set the users credentials in the session after a successful login, this can be necessary when bridging specific auth and access plugins." => "Не буду переводить :) Set the users credentials in the session after a successful login, this can be necessary when bridging specific auth and access plugins.", From f6b4e2f5b59792ce32256dc47982f5bc3a7bd0fa Mon Sep 17 00:00:00 2001 From: cdujeu Date: Sat, 1 Oct 2016 11:48:06 +0200 Subject: [PATCH 12/41] Removed unused anymore scripts --- dist/zip/upgrade/ajaxplorer_upgrade.php | 85 ------------------------- dist/zip/upgrade/parse_summarize.php | 53 --------------- dist/zip/upgrade/upgrade_builder.bat | 41 ------------ dist/zip/windows/README | 9 --- dist/zip/windows/build.bat | 45 ------------- 5 files changed, 233 deletions(-) delete mode 100644 dist/zip/upgrade/ajaxplorer_upgrade.php delete mode 100644 dist/zip/upgrade/parse_summarize.php delete mode 100644 dist/zip/upgrade/upgrade_builder.bat delete mode 100644 dist/zip/windows/README delete mode 100644 dist/zip/windows/build.bat diff --git a/dist/zip/upgrade/ajaxplorer_upgrade.php b/dist/zip/upgrade/ajaxplorer_upgrade.php deleted file mode 100644 index 09a0cb40a6..0000000000 --- a/dist/zip/upgrade/ajaxplorer_upgrade.php +++ /dev/null @@ -1,85 +0,0 @@ - 0 ) { - foreach ($objects as $file) { - if( $file == "." || $file == ".." ) - continue; - // go on - if ( is_dir( $path.DIRECTORY_SEPARATOR.$file ) ) { - copy_r( $path.DIRECTORY_SEPARATOR.$file, $dest.DIRECTORY_SEPARATOR.$file ); - } else { - copy( $path.DIRECTORY_SEPARATOR.$file, $dest.DIRECTORY_SEPARATOR.$file ); - } - } - } - return true; - } elseif ( is_file($path) ) { - return copy($path, $dest); - } else { - return false; - } -} diff --git a/dist/zip/upgrade/upgrade_builder.bat b/dist/zip/upgrade/upgrade_builder.bat deleted file mode 100644 index 9d51896b1d..0000000000 --- a/dist/zip/upgrade/upgrade_builder.bat +++ /dev/null @@ -1,41 +0,0 @@ -set src=ajaxplorer-src -set log_file=..\logs\upgrade.txt -set export=ajaxplorer-core-upgrade-%3-%4 - -rem --- SVN Checkout sources and grab revision number %2 -chdir tmp -svn co https://ajaxplorer.svn.sourceforge.net/svnroot/ajaxplorer/trunk/core/src %src% -r %2 > %log_file% - -chdir %src% -svn diff --summarize -r%1:%2 > ..\svn_summarize - -chdir ..\ -php ..\bin\parse_summarize.php svn_summarize %src% %export% - -rem --- Create ZIP -..\bin\7za.exe a %export%.zip %export% >> %log_file% - -rem --- Upload FTP -echo off -( -echo open %FTP_SERVER% -echo %FTP_LOGIN% -echo %FTP_PASSWORD% -echo cd www/update/stable -echo type binary -echo put %export%.zip -echo close -echo quit -) > ftp_commands.txt -ftp -s:ftp_commands.txt >> %log_file% - -rem --- Clear Variables and remove tmp folders -del ftp_commands.txt -del svn_summarize -move %export%.zip ..\ -rmdir /S /Q %src% -rmdir /S /Q %export% -set src= -set export= -chdir .. - diff --git a/dist/zip/windows/README b/dist/zip/windows/README deleted file mode 100644 index e42589a283..0000000000 --- a/dist/zip/windows/README +++ /dev/null @@ -1,9 +0,0 @@ -Builder for AjaXplorer core under windows (tested on XP). -Following Structure must be found - -+ EXECUTION FOLDER - + bin - + build.bat => the present script - + 7za.exe => 7zip command line version - + logs - + tmp \ No newline at end of file diff --git a/dist/zip/windows/build.bat b/dist/zip/windows/build.bat deleted file mode 100644 index 5b7e42ff1c..0000000000 --- a/dist/zip/windows/build.bat +++ /dev/null @@ -1,45 +0,0 @@ -rem --- Compute date and folder -for /f "tokens=1,2,3 delims=/ " %%a in ('DATE /T') do set date=%%c%%b%%a -chdir tmp -set src=ajaxplorer-sources -set log_file=..\logs\%date%-build.txt - -rem --- SVN Checkout sources and grab current revision -svn co https://ajaxplorer.svn.sourceforge.net/svnroot/ajaxplorer/trunk/core/src %src% > %log_file% -chdir %src% -for /f "tokens=*" %%a in ('svnversion') do set revision=%%a - -rem --- Export sources -set export=ajaxplorer-%date%-%revision% -svn export . ..\%export% - - -rem --- Create ZIP -chdir ..\ -..\bin\7za.exe a %export%.zip %export% >> %log_file% - -rem --- Upload FTP -echo off -( -echo open %FTP_SERVER% -echo %FTP_LOGIN% -echo %FTP_PASSWORD% -echo cd www/build -echo type binary -echo put %export%.zip -echo close -echo quit -) > ftp_commands.txt -ftp -s:ftp_commands.txt >> %log_file% - -rem --- Clear Variables and remove tmp folders -del ftp_commands.txt -del %export%.zip -rmdir /S /Q %src% -rmdir /S /Q %export% -set src= -set new= -set revision= -set export= -chdir .. - From 02fd5c8a9268e3b81c003951536f2084c40ed428 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Sat, 1 Oct 2016 19:59:55 +0200 Subject: [PATCH 13/41] SqlLogDriver: publish internal driver --- core/src/plugins/log.sql/SqlLogDriver.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/src/plugins/log.sql/SqlLogDriver.php b/core/src/plugins/log.sql/SqlLogDriver.php index a0075d83ff..aca67f7bb1 100644 --- a/core/src/plugins/log.sql/SqlLogDriver.php +++ b/core/src/plugins/log.sql/SqlLogDriver.php @@ -97,6 +97,13 @@ public function usersLastConnection($userIds) return $all; } + /** + * @return array + */ + public function getDriverConfig(){ + return $this->sqlDriver; + } + /** * @param $actionName * @param $httpVars From 350f6a35adc7bb37f01ccada41aa6a0e8a903233 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Sat, 1 Oct 2016 20:04:14 +0200 Subject: [PATCH 14/41] Rename getAjxpTmpDir to getTemporaryFolder --- core/src/core/src/lib/pclzip.lib.php | 2 +- .../src/core/src/pydio/Core/Services/ApplicationState.php | 2 +- .../core/src/pydio/Core/Utils/Http/BruteForceHelper.php | 4 ++-- core/src/core/src/pydio/Core/Utils/Vars/OptionsHelper.php | 4 ++-- core/src/plugins/access.fs/FsAccessDriver.php | 4 ++-- core/src/plugins/access.fs/FsAccessWrapper.php | 2 +- core/src/plugins/access.ftp/FtpAccessWrapper.php | 2 +- core/src/plugins/access.inbox/InboxAccessDriver.php | 8 ++++---- core/src/plugins/access.inbox/InboxAccessWrapper.php | 8 ++++---- core/src/plugins/access.s3/S3AccessWrapper.php | 2 +- core/src/plugins/access.sftp/SFTPAccessWrapper.php | 2 +- core/src/plugins/access.sftp_psl/SftpPSLAccessWrapper.php | 2 +- core/src/plugins/access.smb/SMBAccessWrapper.php | 2 +- core/src/plugins/access.swift/SwiftAccessWrapper.php | 2 +- core/src/plugins/action.compression/PluginCompression.php | 2 +- core/src/plugins/action.powerfs/PowerFSController.php | 4 ++-- core/src/plugins/core.access/src/Stream/StreamWrapper.php | 2 +- core/src/plugins/core.conf/AbstractConfDriver.php | 8 ++++---- .../plugins/core.index/AbstractSearchEngineIndexer.php | 2 +- core/src/plugins/editor.diaporama/PThumb.lib.php | 2 +- core/src/plugins/editor.imagick/IMagickPreviewer.php | 4 ++-- core/src/plugins/meta.filehasher/FileHasher.php | 2 +- core/src/plugins/uploader.jumploader/Jumploader.php | 6 +++--- core/src/plugins/uploader.plupload/Pluploader.php | 2 +- 24 files changed, 40 insertions(+), 40 deletions(-) diff --git a/core/src/core/src/lib/pclzip.lib.php b/core/src/core/src/lib/pclzip.lib.php index 035bc4ff99..7b33ec8d80 100644 --- a/core/src/core/src/lib/pclzip.lib.php +++ b/core/src/core/src/lib/pclzip.lib.php @@ -66,7 +66,7 @@ // define( 'PCLZIP_TEMPORARY_DIR', '/temp/' ); // define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' ); if (!defined('PCLZIP_TEMPORARY_DIR')) { - define( 'PCLZIP_TEMPORARY_DIR', ApplicationState::getAjxpTmpDir() .DIRECTORY_SEPARATOR ); + define( 'PCLZIP_TEMPORARY_DIR', ApplicationState::getTemporaryFolder() .DIRECTORY_SEPARATOR ); } // ----- Optional threshold ratio for use of temporary files diff --git a/core/src/core/src/pydio/Core/Services/ApplicationState.php b/core/src/core/src/pydio/Core/Services/ApplicationState.php index a881179d99..71b8ad6dbc 100644 --- a/core/src/core/src/pydio/Core/Services/ApplicationState.php +++ b/core/src/core/src/pydio/Core/Services/ApplicationState.php @@ -230,7 +230,7 @@ public static function getWorkspaceShortcutURL($repository) * @static * @return mixed|null|string */ - public static function getAjxpTmpDir() + public static function getTemporaryFolder() { $conf = ConfService::getGlobalConf("AJXP_TMP_DIR"); if (!empty($conf)) { diff --git a/core/src/core/src/pydio/Core/Utils/Http/BruteForceHelper.php b/core/src/core/src/pydio/Core/Utils/Http/BruteForceHelper.php index 5d2c4f27ef..a4dafd8bf6 100644 --- a/core/src/core/src/pydio/Core/Utils/Http/BruteForceHelper.php +++ b/core/src/core/src/pydio/Core/Utils/Http/BruteForceHelper.php @@ -41,7 +41,7 @@ class BruteForceHelper */ public static function getBruteForceLoginArray() { - $failedLog = ApplicationState::getAjxpTmpDir() . "/failedAJXP.log"; + $failedLog = ApplicationState::getTemporaryFolder() . "/failedAJXP.log"; $loginAttempt = @file_get_contents($failedLog); $loginArray = unserialize($loginAttempt); $ret = array(); @@ -66,7 +66,7 @@ public static function setBruteForceLoginArray($loginArray, $validCurrent = fals if($validCurrent && isSet($loginArray[$_SERVER["REMOTE_ADDR"]])){ unset($loginArray[$_SERVER["REMOTE_ADDR"]]); } - $failedLog = ApplicationState::getAjxpTmpDir() . "/failedAJXP.log"; + $failedLog = ApplicationState::getTemporaryFolder() . "/failedAJXP.log"; @file_put_contents($failedLog, serialize($loginArray)); } diff --git a/core/src/core/src/pydio/Core/Utils/Vars/OptionsHelper.php b/core/src/core/src/pydio/Core/Utils/Vars/OptionsHelper.php index 9f5ddc8390..d4044d94ac 100644 --- a/core/src/core/src/pydio/Core/Utils/Vars/OptionsHelper.php +++ b/core/src/core/src/pydio/Core/Utils/Vars/OptionsHelper.php @@ -75,7 +75,7 @@ public static function filterFormElementsFromMeta(ContextInterface $ctx, $metada } $value = ""; } else { - $file = ApplicationState::getAjxpTmpDir() . "/" . $value; + $file = ApplicationState::getTemporaryFolder() . "/" . $value; if (file_exists($file)) { $id = !empty($level["original_binary"]) ? $level["original_binary"] : null; $id = ConfService::getConfStorageImpl()->saveBinary($binariesContext, $file, $id); @@ -137,7 +137,7 @@ public static function parseStandardFormParameters(ContextInterface $ctx, &$repD } $value = ""; } else { - $file = ApplicationState::getAjxpTmpDir() . "/" . $value; + $file = ApplicationState::getTemporaryFolder() . "/" . $value; if (file_exists($file)) { $id = !empty($repDef[$key . "_original_binary"]) ? $repDef[$key . "_original_binary"] : null; $id = ConfService::getConfStorageImpl()->saveBinary($binariesContext, $file, $id); diff --git a/core/src/plugins/access.fs/FsAccessDriver.php b/core/src/plugins/access.fs/FsAccessDriver.php index 130c1f0311..02257d8b87 100644 --- a/core/src/plugins/access.fs/FsAccessDriver.php +++ b/core/src/plugins/access.fs/FsAccessDriver.php @@ -656,7 +656,7 @@ public function downloadAction(ServerRequestInterface &$request, ResponseInterfa if ($zip) { // Make a temp zip and send it as download $loggedUser = $ctx->getUser(); - $file = ApplicationState::getAjxpTmpDir() ."/".($loggedUser?$loggedUser->getId():"shared")."_".time()."tmpDownload.zip"; + $file = ApplicationState::getTemporaryFolder() ."/".($loggedUser?$loggedUser->getId():"shared")."_".time()."tmpDownload.zip"; $zipFile = $this->makeZip($selection, $file, empty($dir)?"/":$dir); if(!$zipFile) throw new PydioException("Error while compressing"); $localName = (empty($base)?"Files":$base).".zip"; @@ -804,7 +804,7 @@ public function switchAction(ServerRequestInterface &$request, ResponseInterface } else { $localName = (basename($dir)==""?"Files":basename($dir)).".zip"; } - $file = ApplicationState::getAjxpTmpDir() ."/".($loggedUser?$loggedUser->getId():"shared")."_".time()."tmpCompression.zip"; + $file = ApplicationState::getTemporaryFolder() ."/".($loggedUser?$loggedUser->getId():"shared")."_".time()."tmpCompression.zip"; if(isSet($httpVars["compress_flat"])) $baseDir = "__AJXP_ZIP_FLAT__/"; else $baseDir = $dir; $zipFile = $this->makeZip($selection, $file, $baseDir, $taskId); diff --git a/core/src/plugins/access.fs/FsAccessWrapper.php b/core/src/plugins/access.fs/FsAccessWrapper.php index 75463ad436..ffd6b23bc6 100644 --- a/core/src/plugins/access.fs/FsAccessWrapper.php +++ b/core/src/plugins/access.fs/FsAccessWrapper.php @@ -113,7 +113,7 @@ protected static function initPath($path, $streamType, $storeOpenContext = false //print($streamType.$path); if ($streamType == "file") { if (self::$crtZip == null || !is_array(self::$currentListingKeys)) { - $tmpDir = ApplicationState::getAjxpTmpDir() . DIRECTORY_SEPARATOR . md5(time()-rand()); + $tmpDir = ApplicationState::getTemporaryFolder() . DIRECTORY_SEPARATOR . md5(time()-rand()); mkdir($tmpDir); $tmpFileName = $tmpDir.DIRECTORY_SEPARATOR.basename($localPath); Logger::debug(__CLASS__,__FUNCTION__,"Tmp file $tmpFileName"); diff --git a/core/src/plugins/access.ftp/FtpAccessWrapper.php b/core/src/plugins/access.ftp/FtpAccessWrapper.php index 1bd2f2160b..6b575f2e78 100644 --- a/core/src/plugins/access.ftp/FtpAccessWrapper.php +++ b/core/src/plugins/access.ftp/FtpAccessWrapper.php @@ -79,7 +79,7 @@ class FtpAccessWrapper implements IAjxpWrapper */ public static function getRealFSReference($path, $persistent = false) { - $tmpFile = ApplicationState::getAjxpTmpDir() ."/".md5(time()); + $tmpFile = ApplicationState::getTemporaryFolder() ."/".md5(time()); $tmpHandle = fopen($tmpFile, "wb"); self::copyFileInStream($path, $tmpHandle); fclose($tmpHandle); diff --git a/core/src/plugins/access.inbox/InboxAccessDriver.php b/core/src/plugins/access.inbox/InboxAccessDriver.php index 523d3f05ba..433ac828af 100644 --- a/core/src/plugins/access.inbox/InboxAccessDriver.php +++ b/core/src/plugins/access.inbox/InboxAccessDriver.php @@ -103,13 +103,13 @@ public static function getNodeData($nodePath){ $nodeObject = new AJXP_Node($nodePath); $basename = $nodeObject->getLabel(); if($nodeObject->isRoot()){ - return ['stat' => stat(ApplicationState::getAjxpTmpDir())]; + return ['stat' => stat(ApplicationState::getTemporaryFolder())]; } $allNodes = self::getNodes($nodeObject->getContext(), false); $nodeData = $allNodes[$basename]; if(!isSet($nodeData["stat"])){ if(in_array(pathinfo($basename, PATHINFO_EXTENSION), ["error", "invitation"])){ - $stat = stat(ApplicationState::getAjxpTmpDir()); + $stat = stat(ApplicationState::getTemporaryFolder()); }else{ $url = $nodeData["url"]; $node = new AJXP_Node($url); @@ -121,7 +121,7 @@ public static function getNodeData($nodePath){ Controller::applyHook("node.read", [&$node]); $stat = stat($url); }catch (\Exception $e){ - $stat = stat(ApplicationState::getAjxpTmpDir()); + $stat = stat(ApplicationState::getTemporaryFolder()); } if(is_array($stat) && $nodeObject->getContext()->hasUser()){ $acl = $nodeObject->getContext()->getUser()->getMergedRole()->getAcl($nodeData["meta"]["shared_repository_id"]); @@ -217,7 +217,7 @@ public static function getNodes(ContextInterface $parentContext, $checkStats = f $remoteShare = $ocsStore->remoteShareById($linkId); $status = $remoteShare->getStatus(); if($status == OCS_INVITATION_STATUS_PENDING){ - $stat = stat(ApplicationState::getAjxpTmpDir()); + $stat = stat(ApplicationState::getTemporaryFolder()); $ext = "invitation"; $meta["ajxp_mime"] = "invitation"; $meta["share_meta_type"] = 0; diff --git a/core/src/plugins/access.inbox/InboxAccessWrapper.php b/core/src/plugins/access.inbox/InboxAccessWrapper.php index 213fa29b7d..c97a642492 100644 --- a/core/src/plugins/access.inbox/InboxAccessWrapper.php +++ b/core/src/plugins/access.inbox/InboxAccessWrapper.php @@ -136,7 +136,7 @@ public static function translateURL($path){ $node = $nodes[ltrim($nodePath, '/')]; if (empty($node) || ! isset($node['url'])) { - return ApplicationState::getAjxpTmpDir(); + return ApplicationState::getTemporaryFolder(); } $url = $node['url']; @@ -149,7 +149,7 @@ public static function translateURL($path){ } if(empty($nodePath)){ - return ApplicationState::getAjxpTmpDir(); + return ApplicationState::getTemporaryFolder(); } if($pydioScheme){ @@ -181,14 +181,14 @@ public static function getRealFSReference($path, $persistent = false) $realFilePointer = MetaStreamWrapper::getRealFSReference($url, true); if(!$isRemote){ $ext = pathinfo(parse_url($url, PHP_URL_PATH), PATHINFO_EXTENSION); - $tmpname = tempnam(ApplicationState::getAjxpTmpDir(), "real-file-inbox-pointer").".".$ext; + $tmpname = tempnam(ApplicationState::getTemporaryFolder(), "real-file-inbox-pointer").".".$ext; copy($realFilePointer, $tmpname); $realFilePointer = $tmpname; } self::$linkNode->getDriver(); return $realFilePointer; }else{ - $tmpname = tempnam(ApplicationState::getAjxpTmpDir(), "real-file-inbox-pointer"); + $tmpname = tempnam(ApplicationState::getTemporaryFolder(), "real-file-inbox-pointer"); $source = fopen($url, "r"); $dest = fopen($tmpname, "w"); stream_copy_to_stream($source, $dest); diff --git a/core/src/plugins/access.s3/S3AccessWrapper.php b/core/src/plugins/access.s3/S3AccessWrapper.php index 522314deff..74ce410c47 100644 --- a/core/src/plugins/access.s3/S3AccessWrapper.php +++ b/core/src/plugins/access.s3/S3AccessWrapper.php @@ -277,7 +277,7 @@ public static function removeTmpFile($tmpDir, $tmpFile) */ public static function getRealFSReference($path, $persistent = false) { - $tmpFile = ApplicationState::getAjxpTmpDir() . "/" . md5(time()) . "." . pathinfo($path, PATHINFO_EXTENSION); + $tmpFile = ApplicationState::getTemporaryFolder() . "/" . md5(time()) . "." . pathinfo($path, PATHINFO_EXTENSION); $tmpHandle = fopen($tmpFile, "wb"); self::copyFileInStream($path, $tmpHandle); fclose($tmpHandle); diff --git a/core/src/plugins/access.sftp/SFTPAccessWrapper.php b/core/src/plugins/access.sftp/SFTPAccessWrapper.php index 4f63dabefe..020a7fd62a 100644 --- a/core/src/plugins/access.sftp/SFTPAccessWrapper.php +++ b/core/src/plugins/access.sftp/SFTPAccessWrapper.php @@ -290,7 +290,7 @@ public static function removeTmpFile($tmpDir, $tmpFile) public static function getRealFSReference($path, $persistent = false) { if ($persistent) { - $tmpFile = ApplicationState::getAjxpTmpDir() ."/".md5(time()); + $tmpFile = ApplicationState::getTemporaryFolder() ."/".md5(time()); $tmpHandle = fopen($tmpFile, "wb"); self::copyFileInStream($path, $tmpHandle); fclose($tmpHandle); diff --git a/core/src/plugins/access.sftp_psl/SftpPSLAccessWrapper.php b/core/src/plugins/access.sftp_psl/SftpPSLAccessWrapper.php index 8b3144e6b2..2cdb3501a9 100644 --- a/core/src/plugins/access.sftp_psl/SftpPSLAccessWrapper.php +++ b/core/src/plugins/access.sftp_psl/SftpPSLAccessWrapper.php @@ -114,7 +114,7 @@ protected static function initPath($path, $streamType = '', $storeOpenContext = public static function getRealFSReference($path, $persistent = false) { if ($persistent) { - $tmpFile = ApplicationState::getAjxpTmpDir() ."/".md5(time()); + $tmpFile = ApplicationState::getTemporaryFolder() ."/".md5(time()); $tmpHandle = fopen($tmpFile, "wb"); self::copyFileInStream($path, $tmpHandle); fclose($tmpHandle); diff --git a/core/src/plugins/access.smb/SMBAccessWrapper.php b/core/src/plugins/access.smb/SMBAccessWrapper.php index 1f35f5ddc4..dd4d550f01 100644 --- a/core/src/plugins/access.smb/SMBAccessWrapper.php +++ b/core/src/plugins/access.smb/SMBAccessWrapper.php @@ -210,7 +210,7 @@ protected static function closeWrapper() public static function getRealFSReference($path, $persistent = false) { if ($persistent) { - $tmpFile = ApplicationState::getAjxpTmpDir() ."/".md5(time()); + $tmpFile = ApplicationState::getTemporaryFolder() ."/".md5(time()); $tmpHandle = fopen($tmpFile, "wb"); self::copyFileInStream($path, $tmpHandle); fclose($tmpHandle); diff --git a/core/src/plugins/access.swift/SwiftAccessWrapper.php b/core/src/plugins/access.swift/SwiftAccessWrapper.php index f8e09b80c9..7ee2b13b2b 100644 --- a/core/src/plugins/access.swift/SwiftAccessWrapper.php +++ b/core/src/plugins/access.swift/SwiftAccessWrapper.php @@ -255,7 +255,7 @@ protected static function closeWrapper() */ public static function getRealFSReference($path, $persistent = false) { - $tmpFile = ApplicationState::getAjxpTmpDir() ."/".md5(time()).".".pathinfo($path, PATHINFO_EXTENSION); + $tmpFile = ApplicationState::getTemporaryFolder() ."/".md5(time()).".".pathinfo($path, PATHINFO_EXTENSION); $tmpHandle = fopen($tmpFile, "wb", null, self::$cloudContext); self::copyFileInStream($path, $tmpHandle); fclose($tmpHandle); diff --git a/core/src/plugins/action.compression/PluginCompression.php b/core/src/plugins/action.compression/PluginCompression.php index 9baa973992..3b6278f28d 100644 --- a/core/src/plugins/action.compression/PluginCompression.php +++ b/core/src/plugins/action.compression/PluginCompression.php @@ -141,7 +141,7 @@ public function receiveAction(\Psr\Http\Message\ServerRequestInterface &$request throw new PydioException($messages["compression.17"]); } try { - $tmpArchiveName = tempnam(ApplicationState::getAjxpTmpDir(), "tar-compression") . ".tar"; + $tmpArchiveName = tempnam(ApplicationState::getTemporaryFolder(), "tar-compression") . ".tar"; $archive = new PharData($tmpArchiveName); } catch (Exception $e) { $postMessageStatus($e->getMessage(), Task::STATUS_FAILED); diff --git a/core/src/plugins/action.powerfs/PowerFSController.php b/core/src/plugins/action.powerfs/PowerFSController.php index afe312353b..28d2f1034d 100644 --- a/core/src/plugins/action.powerfs/PowerFSController.php +++ b/core/src/plugins/action.powerfs/PowerFSController.php @@ -83,7 +83,7 @@ public function switchAction(ServerRequestInterface &$request, ResponseInterface case "postcompress_download": - $archive = ApplicationState::getAjxpTmpDir() . DIRECTORY_SEPARATOR . $httpVars["ope_id"] . "_" . InputFilter::decodeSecureMagic($httpVars["archive_name"], InputFilter::SANITIZE_FILENAME); + $archive = ApplicationState::getTemporaryFolder() . DIRECTORY_SEPARATOR . $httpVars["ope_id"] . "_" . InputFilter::decodeSecureMagic($httpVars["archive_name"], InputFilter::SANITIZE_FILENAME); // This is a real filename on a local FS => toStorageEncoding $archive = TextEncoder::toStorageEncoding($archive); $archiveName = $httpVars["archive_name"]; @@ -143,7 +143,7 @@ public function switchAction(ServerRequestInterface &$request, ResponseInterface $opeId = substr(md5(time()), 0, 10); $originalArchiveParam = $archiveName; if ($request->getAttribute("action") == "precompress") { - $archiveName = ApplicationState::getAjxpTmpDir() . DIRECTORY_SEPARATOR . $opeId . "_" . $archiveName; + $archiveName = ApplicationState::getTemporaryFolder() . DIRECTORY_SEPARATOR . $opeId . "_" . $archiveName; } chdir($rootDir); $cmd = $this->getContextualOption($ctx, "ZIP_PATH") . " -r " . escapeshellarg($archiveName) . " " . implode(" ", $args); diff --git a/core/src/plugins/core.access/src/Stream/StreamWrapper.php b/core/src/plugins/core.access/src/Stream/StreamWrapper.php index 9ac4cf6f0e..0b8da65dfb 100755 --- a/core/src/plugins/core.access/src/Stream/StreamWrapper.php +++ b/core/src/plugins/core.access/src/Stream/StreamWrapper.php @@ -249,7 +249,7 @@ public static function getRealFSReference($path, $persistent = false) { $nodeStream = self::createStream($path); $nodeStream->getContents(); - $tmpFile = ApplicationState::getAjxpTmpDir() ."/".md5(time()).".".pathinfo($path, PATHINFO_EXTENSION); + $tmpFile = ApplicationState::getTemporaryFolder() ."/".md5(time()).".".pathinfo($path, PATHINFO_EXTENSION); $tmpHandle = fopen($tmpFile, "wb"); self::copyStreamInStream(PydioStreamWrapper::getResource($nodeStream), $tmpHandle); diff --git a/core/src/plugins/core.conf/AbstractConfDriver.php b/core/src/plugins/core.conf/AbstractConfDriver.php index 8df7e4086c..7d4b8aeeee 100644 --- a/core/src/plugins/core.conf/AbstractConfDriver.php +++ b/core/src/plugins/core.conf/AbstractConfDriver.php @@ -1293,7 +1293,7 @@ public function switchAction(ServerRequestInterface $requestInterface, ResponseI case "get_binary_param" : if (isSet($httpVars["tmp_file"])) { - $file = ApplicationState::getAjxpTmpDir() ."/". InputFilter::securePath($httpVars["tmp_file"]); + $file = ApplicationState::getTemporaryFolder() ."/". InputFilter::securePath($httpVars["tmp_file"]); if (isSet($file)) { session_write_close(); header("Content-Type:image/png"); @@ -1317,7 +1317,7 @@ public function switchAction(ServerRequestInterface $requestInterface, ResponseI session_write_close(); if (isSet($httpVars["tmp_file"])) { - $file = ApplicationState::getAjxpTmpDir() ."/". InputFilter::securePath($httpVars["tmp_file"]); + $file = ApplicationState::getTemporaryFolder() ."/". InputFilter::securePath($httpVars["tmp_file"]); if (isSet($file)) { header("Content-Type:image/png"); readfile($file); @@ -1341,10 +1341,10 @@ public function switchAction(ServerRequestInterface $requestInterface, ResponseI } else { $rand = substr(md5(time()), 0, 6); $tmp = $rand."-". $boxData->getClientFilename(); - $boxData->moveTo(ApplicationState::getAjxpTmpDir() . "/" . $tmp); + $boxData->moveTo(ApplicationState::getTemporaryFolder() . "/" . $tmp); } } - if (isSet($tmp) && file_exists(ApplicationState::getAjxpTmpDir() ."/".$tmp)) { + if (isSet($tmp) && file_exists(ApplicationState::getTemporaryFolder() ."/".$tmp)) { print(''); diff --git a/core/src/plugins/core.index/AbstractSearchEngineIndexer.php b/core/src/plugins/core.index/AbstractSearchEngineIndexer.php index 19aaaca75f..3a8a9e7385 100644 --- a/core/src/plugins/core.index/AbstractSearchEngineIndexer.php +++ b/core/src/plugins/core.index/AbstractSearchEngineIndexer.php @@ -74,7 +74,7 @@ protected function extractIndexableContent($ajxpNode) $pipe = true; } $realFile = call_user_func(array($ajxpNode->wrapperClassName, "getRealFSReference"), $ajxpNode->getUrl()); - $unoconv = "HOME=" . ApplicationState::getAjxpTmpDir() . " " . $unoconv . " --stdout -f $targetExt " . escapeshellarg($realFile); + $unoconv = "HOME=" . ApplicationState::getTemporaryFolder() . " " . $unoconv . " --stdout -f $targetExt " . escapeshellarg($realFile); if ($pipe) { $newTarget = str_replace(".$ext", ".pdf", $realFile); $unoconv .= " > $newTarget"; diff --git a/core/src/plugins/editor.diaporama/PThumb.lib.php b/core/src/plugins/editor.diaporama/PThumb.lib.php index 3c1ad0890f..abaa51b606 100644 --- a/core/src/plugins/editor.diaporama/PThumb.lib.php +++ b/core/src/plugins/editor.diaporama/PThumb.lib.php @@ -516,7 +516,7 @@ function print_thumbnail($image, $width, $height, $return_img = false, $display_ $isStream = (preg_match("!^$wrappers_re://!", $target_file) === 1); if ($isStream) { $backToStreamTarget = $target_file; - $target_file = tempnam(ApplicationState::getAjxpTmpDir(), "pthumb_"); + $target_file = tempnam(ApplicationState::getTemporaryFolder(), "pthumb_"); } switch ($format) { diff --git a/core/src/plugins/editor.imagick/IMagickPreviewer.php b/core/src/plugins/editor.imagick/IMagickPreviewer.php index c103335e11..afe968ef4d 100644 --- a/core/src/plugins/editor.imagick/IMagickPreviewer.php +++ b/core/src/plugins/editor.imagick/IMagickPreviewer.php @@ -328,7 +328,7 @@ public function generateJpegsCallback(ContextInterface $ctx, $masterFile, $targe $isStream = (preg_match( "!^$wrappers_re://!", $targetFile ) === 1); if ($isStream) { $backToStreamTarget = $targetFile; - $targetFile = tempnam(ApplicationState::getAjxpTmpDir(), "imagick_").".pdf"; + $targetFile = tempnam(ApplicationState::getTemporaryFolder(), "imagick_").".pdf"; }else{ $backToStreamTarget = null; } @@ -351,7 +351,7 @@ public function generateJpegsCallback(ContextInterface $ctx, $masterFile, $targe if (stripos(PHP_OS, "win") === 0) { $unoconv = $this->pluginConf["UNOCONV"]." -o ".escapeshellarg(basename($unoDoc))." -f pdf ".escapeshellarg($masterFile); } else { - $unoconv = "HOME=". ApplicationState::getAjxpTmpDir() ." ".$unoconv." --stdout -f pdf ".escapeshellarg($masterFile)." > ".escapeshellarg(basename($unoDoc)); + $unoconv = "HOME=". ApplicationState::getTemporaryFolder() ." ".$unoconv." --stdout -f pdf ".escapeshellarg($masterFile)." > ".escapeshellarg(basename($unoDoc)); } if(defined('AJXP_LOCALE')){ putenv('LC_CTYPE='.AJXP_LOCALE); diff --git a/core/src/plugins/meta.filehasher/FileHasher.php b/core/src/plugins/meta.filehasher/FileHasher.php index e1ab61edfd..3d147b3350 100644 --- a/core/src/plugins/meta.filehasher/FileHasher.php +++ b/core/src/plugins/meta.filehasher/FileHasher.php @@ -227,7 +227,7 @@ public function switchActions($actionName, $httpVars, $fileVars, ContextInterfac $fileUrl = $selection->getUniqueNode()->getUrl(); $file = MetaStreamWrapper::getRealFSReference($fileUrl, true); if ($actionName == "filehasher_delta") { - $deltaFile = tempnam(ApplicationState::getAjxpTmpDir(), $actionName."-delta"); + $deltaFile = tempnam(ApplicationState::getTemporaryFolder(), $actionName."-delta"); $this->logDebug("Received signature file, should compute delta now"); \rsync_generate_delta($signature_delta_file, $file, $deltaFile); $this->logDebug("Computed delta file, size is ".filesize($deltaFile)); diff --git a/core/src/plugins/uploader.jumploader/Jumploader.php b/core/src/plugins/uploader.jumploader/Jumploader.php index 90bd2dea25..71d74b8be6 100644 --- a/core/src/plugins/uploader.jumploader/Jumploader.php +++ b/core/src/plugins/uploader.jumploader/Jumploader.php @@ -436,8 +436,8 @@ public function postProcess(\Psr\Http\Message\ServerRequestInterface &$request, if ($httpVars["partitionCount"] > 1) { if (self::$remote) { - $test = ApplicationState::getAjxpTmpDir() ."/".$httpVars["partitionRealName"]; - $newDest = fopen(ApplicationState::getAjxpTmpDir() ."/".$httpVars["partitionRealName"], "w"); + $test = ApplicationState::getTemporaryFolder() ."/".$httpVars["partitionRealName"]; + $newDest = fopen(ApplicationState::getTemporaryFolder() ."/".$httpVars["partitionRealName"], "w"); $newFile = array(); $length = 0; for ($i = 0, $count = count($partitions); $i < $count; $i++) { @@ -456,7 +456,7 @@ public function postProcess(\Psr\Http\Message\ServerRequestInterface &$request, $newFile["name"] = $httpVars["partitionRealName"]; $newFile["error"] = 0; $newFile["size"] = $length; - $newFile["tmp_name"] = ApplicationState::getAjxpTmpDir() ."/".$httpVars["partitionRealName"]; + $newFile["tmp_name"] = ApplicationState::getTemporaryFolder() ."/".$httpVars["partitionRealName"]; $newFile["destination"] = $partitions[0]["destination"]; $newPartitions[] = $newFile; } else { diff --git a/core/src/plugins/uploader.plupload/Pluploader.php b/core/src/plugins/uploader.plupload/Pluploader.php index cd33e65ee8..8aff2dd6e8 100644 --- a/core/src/plugins/uploader.plupload/Pluploader.php +++ b/core/src/plugins/uploader.plupload/Pluploader.php @@ -131,7 +131,7 @@ public function unifyChunks($action, &$httpVars, &$fileVars, \Pydio\Core\Model\C $fileVars["file"]["destination"] = base64_encode($dir); }else if(MetaStreamWrapper::wrapperIsRemote($destStreamURL)){ $remote = true; - $tmpFolder = ApplicationState::getAjxpTmpDir() ."/".$httpVars["secure_token"]; + $tmpFolder = ApplicationState::getTemporaryFolder() ."/".$httpVars["secure_token"]; if(!is_dir($tmpFolder)){ @mkdir($tmpFolder, 0700, true); } From 317ccb65beda8ba86ec2f454534e3dc46e595514 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Sat, 1 Oct 2016 20:22:04 +0200 Subject: [PATCH 15/41] mkdir and mkfile action do not require "read" right, only "write", otherwise it's not possible to upload a folder in a write-only minisite/share. --- core/src/plugins/access.fs/fsActions.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/plugins/access.fs/fsActions.xml b/core/src/plugins/access.fs/fsActions.xml index 84534af0f4..0693ff1d70 100644 --- a/core/src/plugins/access.fs/fsActions.xml +++ b/core/src/plugins/access.fs/fsActions.xml @@ -57,7 +57,7 @@ - + - + Date: Mon, 3 Oct 2016 09:56:01 +0200 Subject: [PATCH 16/41] Pydio Booster device : ignore session_set_credentials setup --- core/src/core/src/pydio/Core/Utils/Http/UserAgent.php | 3 ++- core/src/plugins/authfront.keystore/KeystoreAuthFrontend.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/src/core/src/pydio/Core/Utils/Http/UserAgent.php b/core/src/core/src/pydio/Core/Utils/Http/UserAgent.php index fe6d5b8e65..afc0b567de 100644 --- a/core/src/core/src/pydio/Core/Utils/Http/UserAgent.php +++ b/core/src/core/src/pydio/Core/Utils/Http/UserAgent.php @@ -189,7 +189,8 @@ public static function osFromUserAgent($useragent = null) 'PydioPro iOS Native Application' => 'Pydio-Native-iOS', 'Pydio Android Native Application' => 'Apache-HttpClient', 'PydioPro Android Native Application' => 'Pydio-Native-Android', - 'Pydio Sync Client' => 'python-requests' + 'Pydio Sync Client' => 'python-requests', + 'Pydio Booster' => "Go-http-client" ); if ($useragent == null) { diff --git a/core/src/plugins/authfront.keystore/KeystoreAuthFrontend.php b/core/src/plugins/authfront.keystore/KeystoreAuthFrontend.php index 0e3f2426c4..72ca998eba 100644 --- a/core/src/plugins/authfront.keystore/KeystoreAuthFrontend.php +++ b/core/src/plugins/authfront.keystore/KeystoreAuthFrontend.php @@ -30,6 +30,7 @@ use Pydio\Auth\Frontend\Core\AbstractAuthFrontend; use Pydio\Core\Services\ConfService; use Pydio\Core\Services\LocaleService; +use Pydio\Core\Utils\Http\UserAgent; use Pydio\Core\Utils\Vars\InputFilter; use Pydio\Core\Controller\HTMLWriter; use Zend\Diactoros\Response\JsonResponse; @@ -141,7 +142,7 @@ function authTokenActions(ServerRequestInterface $requestInterface, ResponseInte case "keystore_generate_auth_token": - if (ConfService::getContextConf($ctx, "SESSION_SET_CREDENTIALS", "auth")) { + if (ConfService::getContextConf($ctx, "SESSION_SET_CREDENTIALS", "auth") && UserAgent::osFromUserAgent($requestInterface->getServerParams()['HTTP_USER_AGENT']) !== 'Pydio Booster') { $this->logDebug("Keystore Generate Tokens", "Session Credentials set: returning empty tokens to force basic authentication"); HTMLWriter::charsetHeader("text/plain"); echo ""; From 3a3685611607837e1439e096fc67777b2bca6af7 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Mon, 3 Oct 2016 10:03:54 +0200 Subject: [PATCH 17/41] Set preview_seed on parent node when file is modified, should fix #1213 --- core/src/plugins/editor.pixlr/class.PixlrEditor.js | 2 +- core/src/plugins/editor.zoho/class.ZohoEditor.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/plugins/editor.pixlr/class.PixlrEditor.js b/core/src/plugins/editor.pixlr/class.PixlrEditor.js index 6ddb8ff845..a8aaed54fe 100644 --- a/core/src/plugins/editor.pixlr/class.PixlrEditor.js +++ b/core/src/plugins/editor.pixlr/class.PixlrEditor.js @@ -58,7 +58,7 @@ Class.create("PixlrEditor", AbstractEditor, { }else if(this.editorOptions.context.__className == "AjxpTabulator"){ this.editorOptions.context.closeTab("editor.pixlr:/" + this.currentNode.getPath()); } - pydio.getController().fireAction('refresh'); + pydio.fireNodeRefresh(this.currentNode); }.bind(this); conn.sendAsync(); }, diff --git a/core/src/plugins/editor.zoho/class.ZohoEditor.js b/core/src/plugins/editor.zoho/class.ZohoEditor.js index e93e4e039c..483b7e13c0 100644 --- a/core/src/plugins/editor.zoho/class.ZohoEditor.js +++ b/core/src/plugins/editor.zoho/class.ZohoEditor.js @@ -41,7 +41,8 @@ Class.create("ZohoEditor", AbstractEditor, { conn.addParameter("get_action", "retrieve_from_zohoagent"); conn.onComplete = function(transport){ if(transport.responseText == "MODIFIED"){ - ajaxplorer.fireNodeRefresh(this.currentNode);// fireContextRefresh(); + this.currentNode.getParent().getMetadata().set('preview_seed', Math.round(date.getTime()*Math.random())); + pydio.fireNodeRefresh(this.currentNode); } }.bind(this); conn.sendAsync(); From b5883c1caab100a397671a6d67ee1fc72c583378 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Mon, 3 Oct 2016 10:08:34 +0200 Subject: [PATCH 18/41] Manual merge - close #1215 --- ext/joomla/3.0/user.pydio/pydio.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ext/joomla/3.0/user.pydio/pydio.php b/ext/joomla/3.0/user.pydio/pydio.php index 19af4cffe2..eef00f4b52 100644 --- a/ext/joomla/3.0/user.pydio/pydio.php +++ b/ext/joomla/3.0/user.pydio/pydio.php @@ -12,6 +12,7 @@ define('AJXP_EXEC', true); jimport('joomla.event.plugin'); jimport( 'joomla.registry.registry' ); +jimport( 'joomla.user.helper' ); /** @@ -133,13 +134,16 @@ public function onUserLogin($user, $options) $success = false; if(!$this->glueCodeFound) return false; + $juser = JFactory::getUser(); + $groups = JUserHelper::getUserGroups($juser->id); + global $AJXP_GLUE_GLOBALS; $AJXP_GLUE_GLOBALS = array(); //$plugInAction, $login, $result, $secret, $autoCreate; $AJXP_GLUE_GLOBALS["secret"] = $this->secret; $AJXP_GLUE_GLOBALS["autoCreate"] = $this->autoCreate; $AJXP_GLUE_GLOBALS["plugInAction"] = "login"; - $AJXP_GLUE_GLOBALS["login"] = array("name"=>$user["username"], "password"=>$user["password"]); + $AJXP_GLUE_GLOBALS["login"] = array("name"=>$user["username"], "password"=>$user["password"], "roles" => $groups); include($this->glueCode); new SessionSwitcher("previous", false, true); return true; From 0b3477b829074f0a918b5e47329a7ecb5bb1ec1f Mon Sep 17 00:00:00 2001 From: cdujeu Date: Mon, 3 Oct 2016 10:10:29 +0200 Subject: [PATCH 19/41] Rename web.config to web.config.sample to avoid overriding existing file. --- core/src/{web.config => web.config.sample} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core/src/{web.config => web.config.sample} (100%) diff --git a/core/src/web.config b/core/src/web.config.sample similarity index 100% rename from core/src/web.config rename to core/src/web.config.sample From c8331e0d67a712d87cc270073519040834a6064a Mon Sep 17 00:00:00 2001 From: cdujeu Date: Mon, 3 Oct 2016 10:52:14 +0200 Subject: [PATCH 20/41] Support host:/path/to/socket file in sql driver configuration. Fix #1160 --- core/src/core/src/pydio/Core/Utils/Vars/OptionsHelper.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/src/core/src/pydio/Core/Utils/Vars/OptionsHelper.php b/core/src/core/src/pydio/Core/Utils/Vars/OptionsHelper.php index d4044d94ac..8a23e01546 100644 --- a/core/src/core/src/pydio/Core/Utils/Vars/OptionsHelper.php +++ b/core/src/core/src/pydio/Core/Utils/Vars/OptionsHelper.php @@ -236,6 +236,13 @@ public static function cleanDibiDriverParameters($params) $params["formatDate"] = "'Y-m-d'"; break; } + if(strpos($params['host'], ':') !== false){ + list($h, $portOrSocket) = explode(":", $params['host']); + if(!is_numeric($portOrSocket) && file_exists($portOrSocket)){ + $params['host'] = $h; + $params['socket'] = $portOrSocket; + } + } if (isSet($value)) { self::$_dibiParamClean[$value] = $params; } From 5cc4f18470e38ac1abb6ac52ad48bf44603d490f Mon Sep 17 00:00:00 2001 From: cdujeu Date: Mon, 3 Oct 2016 11:56:05 +0200 Subject: [PATCH 21/41] Return empty array instead of null --- core/src/plugins/mq.sql/SqlMessageExchanger.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/plugins/mq.sql/SqlMessageExchanger.php b/core/src/plugins/mq.sql/SqlMessageExchanger.php index 46a30e73c2..fdec0d1765 100644 --- a/core/src/plugins/mq.sql/SqlMessageExchanger.php +++ b/core/src/plugins/mq.sql/SqlMessageExchanger.php @@ -192,7 +192,7 @@ public function consumeInstantChannel(ContextInterface $ctx, $channelName, $clie { $this->loadChannel($channelName); if(!isSet(self::$channels) || !isSet(self::$channels[$channelName])) { - return null; + return []; } // Check dead clients if (is_array(self::$channels[$channelName]["CLIENTS"])) { From 60ee9fd243207c7335d791837431ef1b199b3167 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Mon, 3 Oct 2016 16:28:13 +0200 Subject: [PATCH 22/41] Add a dedicated table for queues and stop using file-based queues --- .../plugins/mq.sql/SqlMessageExchanger.php | 49 +++++++++++++++++-- core/src/plugins/mq.sql/create.sql | 5 ++ 2 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 core/src/plugins/mq.sql/create.sql diff --git a/core/src/plugins/mq.sql/SqlMessageExchanger.php b/core/src/plugins/mq.sql/SqlMessageExchanger.php index fdec0d1765..5d3be8711f 100644 --- a/core/src/plugins/mq.sql/SqlMessageExchanger.php +++ b/core/src/plugins/mq.sql/SqlMessageExchanger.php @@ -22,6 +22,8 @@ use Pydio\Core\Model\ContextInterface; +use Pydio\Core\PluginFramework\SqlTableProvider; +use Pydio\Core\Utils\DBHelper; use Pydio\Core\Utils\FileHelper; use Pydio\Core\Utils\Vars\OptionsHelper; @@ -37,7 +39,7 @@ * @package AjaXplorer_Plugins * @subpackage Mq */ -class SqlMessageExchanger extends Plugin implements IMessageExchanger +class SqlMessageExchanger extends Plugin implements IMessageExchanger, SqlTableProvider { /** @@ -77,9 +79,11 @@ public function loadChannel($channelName, $create = false) if (isSet(self::$channels) && is_array(self::$channels[$channelName])) { return; } - if (is_file($this->getPluginWorkDir()."/queues/channel-$channelName")) { + $res = dibi::query('SELECT [content] FROM [ajxp_mq_queues] WHERE [channel_name] = %s', $channelName); + if($res->count()){ if(!isset(self::$channels)) self::$channels = array(); - $data = FileHelper::loadSerialFile($this->getPluginWorkDir() . "/queues/channel-$channelName"); + $single = $res->fetchSingle(); + $data = unserialize(base64_decode($single)); if (is_array($data)) { if(!is_array($data["MESSAGES"])) $data["MESSAGES"] = array(); if(!is_array($data["CLIENTS"])) $data["CLIENTS"] = array(); @@ -97,9 +101,36 @@ public function loadChannel($channelName, $create = false) public function __destruct() { if (isSet(self::$channels) && is_array(self::$channels)) { + $inserts = []; + $deletes = []; + $driver = $this->sqlDriver["driver"]; foreach (self::$channels as $channelName => $data) { if (is_array($data)) { - FileHelper::saveSerialFile($this->getPluginWorkDir() . "/queues/channel-$channelName", $data); + if(isSet($data["CLIENTS"]) && count($data["CLIENTS"])) { + $serialized = base64_encode(serialize($data)); + if($driver === "postgre"){ + dibi::query("DELETE FROM [ajxp_mq_queues] WHERE [channel_name] = %s", $channelName); + dibi::query('INSERT INTO [ajxp_mq_queues]', ["channel_name" => $channelName, "content" => $serialized]); + }else{ + $inserts[] = "('$channelName', '".$serialized."')"; + } + }else{ + $deletes[] = $channelName; + } + } + } + if(count($inserts)){ + try{ + dibi::query('REPLACE INTO [ajxp_mq_queues] ([channel_name],[content]) VALUES '.implode(",", $inserts)); + }catch(\DibiException $dE){ + $this->logError(__CLASS__, $dE->getMessage()); + } + } + if(count($deletes)){ + try{ + dibi::query('DELETE FROM [ajxp_mq_queues] WHERE [channel_name] IN %s', $deletes); + }catch(\DibiException $dE){ + $this->logError(__CLASS__, $dE->getMessage()); } } } @@ -337,4 +368,14 @@ public function publishInstantMessage(ContextInterface $ctx, $channel, $message) self::$channels[$channel]["MESSAGES"] = $clean; } + /** + * @param array $param + * @return string + * @throws \Exception + */ + public function installSQLTables($param) + { + $p = OptionsHelper::cleanDibiDriverParameters(isSet($param) && isSet($param["SQL_DRIVER"]) ? $param["SQL_DRIVER"] : $this->sqlDriver); + return DBHelper::runCreateTablesQuery($p, $this->getBaseDir() . "/create.sql"); + } } diff --git a/core/src/plugins/mq.sql/create.sql b/core/src/plugins/mq.sql/create.sql new file mode 100644 index 0000000000..97e40744c7 --- /dev/null +++ b/core/src/plugins/mq.sql/create.sql @@ -0,0 +1,5 @@ +CREATE TABLE IF NOT EXISTS `ajxp_mq_queues` ( + `channel_name` varchar(255) NOT NULL, + `content` text NOT NULL, + PRIMARY KEY (`channel_name`) +) DEFAULT CHARSET=utf8; \ No newline at end of file From 034bc4fdb5d7e85d702a494a873a9f609fe78377 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Mon, 3 Oct 2016 16:31:16 +0200 Subject: [PATCH 23/41] Avoid using : and * chars for queue files on windows --- .../mq.serial/SerialMessageExchanger.php | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/core/src/plugins/mq.serial/SerialMessageExchanger.php b/core/src/plugins/mq.serial/SerialMessageExchanger.php index d1e0accf54..4eaca3826b 100644 --- a/core/src/plugins/mq.serial/SerialMessageExchanger.php +++ b/core/src/plugins/mq.serial/SerialMessageExchanger.php @@ -42,6 +42,19 @@ class SerialMessageExchanger extends Plugin implements IMessageExchanger private $channels; private $clientsGCTime = 10; + /** + * Windows-ify channel name to avoid forbidden characters + * @param $channelName + * @return mixed + */ + protected function channelNameToFileName($channelName){ + if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'){ + return str_replace(array(":", "*"), array("---", "__ALL__"), $channelName); + }else{ + return $channelName; + } + } + /** * @param $channelName * @param bool $create @@ -54,7 +67,7 @@ public function loadChannel($channelName, $create = false) } if (is_file($this->getPluginWorkDir()."/queues/channel-$channelName")) { if(!isset($this->channels)) $this->channels = array(); - $data = FileHelper::loadSerialFile($this->getPluginWorkDir() . "/queues/channel-$channelName"); + $data = FileHelper::loadSerialFile($this->getPluginWorkDir() . "/queues/channel-".$this->channelNameToFileName($channelName)); if (is_array($data)) { if(!is_array($data["MESSAGES"])) $data["MESSAGES"] = array(); if(!is_array($data["CLIENTS"])) $data["CLIENTS"] = array(); @@ -74,7 +87,7 @@ public function __destruct() if (isSet($this->channels) && is_array($this->channels)) { foreach ($this->channels as $channelName => $data) { if (is_array($data)) { - FileHelper::saveSerialFile($this->getPluginWorkDir() . "/queues/channel-$channelName", $data); + FileHelper::saveSerialFile($this->getPluginWorkDir() . "/queues/channel-".$this->channelNameToFileName($channelName), $data); } } } From 0e890dc5921693ddf38c387fdc4d152a8a183e7e Mon Sep 17 00:00:00 2001 From: cdujeu Date: Mon, 3 Oct 2016 16:36:06 +0200 Subject: [PATCH 24/41] Init 6.5.3 files --- dist/php/6.5.3-extractArchive-post.php | 103 +++++++++++++++++++++++ dist/php/6.5.3.html | 13 +++ dist/php/6.5.3.mysql | 46 +++++++++++ dist/php/6.5.3.pgsql | 39 +++++++++ dist/php/6.5.3.php | 109 +++++++++++++++++++++++++ dist/php/6.5.3.sqlite | 38 +++++++++ 6 files changed, 348 insertions(+) create mode 100644 dist/php/6.5.3-extractArchive-post.php create mode 100644 dist/php/6.5.3.html create mode 100644 dist/php/6.5.3.mysql create mode 100644 dist/php/6.5.3.pgsql create mode 100644 dist/php/6.5.3.php create mode 100644 dist/php/6.5.3.sqlite diff --git a/dist/php/6.5.3-extractArchive-post.php b/dist/php/6.5.3-extractArchive-post.php new file mode 100644 index 0000000000..f279e6832a --- /dev/null +++ b/dist/php/6.5.3-extractArchive-post.php @@ -0,0 +1,103 @@ + + * 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 . + */ + +/** + * @param string $version + * @throws Exception + */ +function checkPhpVersion($version){ + if(version_compare(PHP_VERSION, $version) < 0){ + throw new Exception("For Pydio 7, PHP version must be greater or equal to $version, detected version is ".PHP_VERSION." - Upgrade aborted."); + }else{ + echo "Checking Php Version (".PHP_VERSION.") : OK\n"; + } +} + +/** + * @param string $type + * @param string $name + * @throws Exception + */ +function checkPluginUsed($type, $name){ + + if($type === "conf"){ + $p = ConfService::getConfStorageImpl(); + if($p->getName() === $name){ + throw new Exception("You are currently using $type.$name as configuration storage. This was deprecated in Pydio 6 and is now removed in Pydio7. Aborting upgrade"); + }else{ + echo "Checking plugin $type ($name) : OK\n"; + } + }else if($type === "auth") { + $p = ConfService::getAuthDriverImpl(); + if ($p->getName() === $name) { + throw new Exception("You are currently using $type.$name for authentication backend. This was deprecated in Pydio 6 and is now removed in Pydio7. Aborting upgrade"); + } else { + if ($p->getName() === "multi") { + $drivers = $p->drivers; + if (isSet($drivers[$name])) { + throw new Exception("You are currently using $type.$name for authentication backend. This was deprecated in Pydio 6 and is nowremoved in Pydio7. Aborting upgrade"); + } else { + echo "Checking plugin $type (" . implode(", ", array_keys($drivers)) . ") : OK\n"; + } + } + echo "Checking plugin $type ($name) : OK\n"; + } + }else if($type === "access"){ + + // Check if a workspace is currently using this plugin + echo "Should check usage of plugin $type ($name) in active workspaces : TODO\n"; + + + }else{ + $plugs = AJXP_PluginsService::getInstance()->getActivePluginsForType($type); + if(isSet($plugs[$name])){ + throw new Exception("You are currently using plugin $type.$name. This is removed in Pydio7. Please disable it before running upgrade. Aborting upgrade"); + } + echo "Checking plugin $type ($name) : OK\n"; + } + +} + +/** + * @param string $themeName + * @throws Exception + */ +function checkThemeUsed($themeName){ + + $p = AJXP_PluginsService::getInstance()->findPlugin("gui", "ajax"); + $options = $p->getConfigs(); + if(isSet($options["GUI_THEME"]) && $options["GUI_THEME"] === $themeName){ + throw new Exception("You are currently using theme ".$options["GUI_THEME"]." which was removed from Pydio 7. If you want to be able to upgrade, you have to switch to Orbit theme. Aborting upgrade."); + }else{ + echo "Checking usage of remove theme ($themeName): OK\n"; + } + +} + +checkPhpVersion('5.5.9'); +if(AJXP_VERSION === '6.4.2'){ + checkPluginUsed("conf", "serial"); + checkPluginUsed("auth", "serial"); + checkPluginUsed("auth", "cmsms"); + checkPluginUsed("access", "remote_fs"); + checkThemeUsed("vision"); + checkThemeUsed("umbra"); +} diff --git a/dist/php/6.5.3.html b/dist/php/6.5.3.html new file mode 100644 index 0000000000..bf738e76b3 --- /dev/null +++ b/dist/php/6.5.3.html @@ -0,0 +1,13 @@ +
+ +

Pydio Core 6.5.3 - Beta3 for Pydio 7

+ + This is the third beta for next major release. +

+ Please update at your own risks!! Do not update servers that are live in production! +

+ + If you want to participate to the beta program and get access to dedicated resources, please fill in this small form, we will be in contact soon. + +
\ No newline at end of file diff --git a/dist/php/6.5.3.mysql b/dist/php/6.5.3.mysql new file mode 100644 index 0000000000..01c494e686 --- /dev/null +++ b/dist/php/6.5.3.mysql @@ -0,0 +1,46 @@ +/* SEPARATOR */ +DROP TABLE IF EXISTS ajxp_tasks; +/* SEPARATOR */ +CREATE TABLE IF NOT EXISTS ajxp_tasks ( + uid VARCHAR(255) NOT NULL , + type INTEGER NOT NULL, + parent_uid VARCHAR(255) DEFAULT NULL, + flags INTEGER NOT NULL, + label VARCHAR(255) NOT NULL, + user_id VARCHAR(255) NOT NULL, + ws_id VARCHAR(32) NOT NULL, + status INTEGER NOT NULL, + status_msg VARCHAR(500) NOT NULL, + progress INTEGER NOT NULL, + schedule INTEGER NOT NULL, + schedule_value VARCHAR(255) DEFAULT NULL, + action VARCHAR(255) NOT NULL, + parameters VARCHAR(500) NOT NULL, + nodes VARCHAR(500) NOT NULL, + creation_date INTEGER NOT NULL DEFAULT 0, + status_update INTEGER NOT NULL DEFAULT 0, + + PRIMARY KEY (uid) +) DEFAULT CHARSET=utf8; +/* SEPARATOR */ +CREATE INDEX ajxp_task_usr_idx ON ajxp_tasks (user_id); +/* SEPARATOR */ +CREATE INDEX ajxp_task_status_idx ON ajxp_tasks (status); +/* SEPARATOR */ +CREATE INDEX ajxp_task_type ON ajxp_tasks (type); +/* SEPARATOR */ +CREATE INDEX ajxp_task_schedule ON ajxp_tasks (schedule); +/* SEPARATOR */ +CREATE INDEX ajxp_task_nodes_idx ON ajxp_tasks (nodes); +/* SEPARATOR */ +CREATE TABLE IF NOT EXISTS `ajxp_mq_queues` ( + `channel_name` varchar(255) NOT NULL, + `content` text NOT NULL, + PRIMARY KEY (`channel_name`) +) DEFAULT CHARSET=utf8; +/* 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 old.node_path COLLATE utf8_bin = new.node_path COLLATE utf8_bin WHEN true THEN 'content' ELSE 'path' END); \ No newline at end of file diff --git a/dist/php/6.5.3.pgsql b/dist/php/6.5.3.pgsql new file mode 100644 index 0000000000..af88b0c8ad --- /dev/null +++ b/dist/php/6.5.3.pgsql @@ -0,0 +1,39 @@ +/* SEPARATOR */ +DROP TABLE IF EXISTS ajxp_tasks; +/* SEPARATOR */ +CREATE TABLE IF NOT EXISTS ajxp_tasks ( + uid VARCHAR(255) NOT NULL , + type INTEGER NOT NULL, + parent_uid VARCHAR(255) DEFAULT NULL, + flags INTEGER NOT NULL, + label VARCHAR(255) NOT NULL, + user_id VARCHAR(255) NOT NULL, + ws_id VARCHAR(32) NOT NULL, + status INTEGER NOT NULL, + status_msg VARCHAR(500) NOT NULL, + progress INTEGER NOT NULL, + schedule INTEGER NOT NULL, + schedule_value VARCHAR(255) DEFAULT NULL, + action VARCHAR(255) NOT NULL, + parameters VARCHAR(500) NOT NULL, + nodes VARCHAR(500) NOT NULL, + creation_date INTEGER NOT NULL DEFAULT 0, + status_update INTEGER NOT NULL DEFAULT 0, + PRIMARY KEY (uid) +); +/* SEPARATOR */ +CREATE INDEX ajxp_task_usr_idx ON ajxp_tasks (user_id); +/* SEPARATOR */ +CREATE INDEX ajxp_task_status_idx ON ajxp_tasks (status); +/* SEPARATOR */ +CREATE INDEX ajxp_task_type ON ajxp_tasks (type); +/* SEPARATOR */ +CREATE INDEX ajxp_task_schedule ON ajxp_tasks (schedule); +/* SEPARATOR */ +CREATE INDEX ajxp_task_nodes_idx ON ajxp_tasks (nodes); +/* SEPARATOR */ +CREATE TABLE IF NOT EXISTS ajxp_mq_queues ( + channel_name varchar(255) NOT NULL, + content text NOT NULL, + PRIMARY KEY (channel_name) +); \ No newline at end of file diff --git a/dist/php/6.5.3.php b/dist/php/6.5.3.php new file mode 100644 index 0000000000..af63be1ec9 --- /dev/null +++ b/dist/php/6.5.3.php @@ -0,0 +1,109 @@ + + * 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 . + */ + +function updateSharePhpContent($installPath, $publicFolder){ + + $publicFolder = preg_replace("/^".str_replace(array("\\","/"), array("\\\\", "\/"), $installPath)."/", "", $publicFolder); + $sharePhpPath = $installPath."/".trim($publicFolder, "/")."/"."share.php"; + if(!is_file($sharePhpPath)){ + echo "No share.php file was found in public folder. If it does exist, you may have to manually upgrade its content.\n"; + return; + } + echo "Upgrading content of $sharePhpPath file\n"; + $folders = array_map(function($value){ + return ".."; + }, explode("/", trim($publicFolder, "/"))); + $baseConfPath = implode("/", $folders); + + $content = ' $_GET["hash"]]);'; + file_put_contents($sharePhpPath, $content); + +} + +function updateHtAccessContent($htAccessPath){ + + if(!is_file($htAccessPath)){ + echo "No htaccess file found. Skipping Htaccess update.\n"; + return; + } + echo "Upgrading content of Htaccess file\n"; + $lines = file($htAccessPath, FILE_IGNORE_NEW_LINES); + $removeFlag = false; + $newLines = []; + // Remove unnecessary lines + foreach($lines as $index => $line){ + if(!$removeFlag){ + $newLines[] = $line; + if(trim($line) === "RewriteCond %{REQUEST_FILENAME} !-d"){ + $removeFlag = true; + } + }else{ + if(trim($line) === 'RewriteRule (.*) index.php [L]'){ + $newLines[] = $line; + $removeFlag = false; + } + } + } + $contents = implode("\n", $newLines); + if(is_writable($htAccessPath)){ + file_put_contents($htAccessPath, $contents); + }else{ + echo "ERROR: Htaccess file could not be written. Update it manually to the following content:
$contents
"; + } + +} + +function awsSdkVersion(){ + + $s3Options = ConfService::getConfStorageImpl()->loadPluginConfig("access", "s3"); + if($s3Options["SDK_VERSION"] === "v2"){ + $s3Options["SDK_VERSION"] = "v3"; + ConfService::getConfStorageImpl()->savePluginConfig("access.s3", $s3Options); + } + +} + +function forceRenameConfFile($prefix){ + + // FORCE bootstrap_repositories copy + if (is_file(AJXP_INSTALL_PATH."/conf/$prefix.php".".new-".date("Ymd"))) { + rename(AJXP_INSTALL_PATH."/conf/$prefix.php", AJXP_INSTALL_PATH."/conf/$prefix.php.pre-update"); + rename(AJXP_INSTALL_PATH."/conf/$prefix.php".".new-".date("Ymd"), AJXP_INSTALL_PATH."/conf/$prefix.php"); + } + + +} + +if(AJXP_VERSION === '6.4.2'){ + awsSdkVersion(); + updateHtAccessContent(AJXP_INSTALL_PATH."/.htaccess"); + updateSharePhpContent(AJXP_INSTALL_PATH, ConfService::getCoreConf("PUBLIC_DOWNLOAD_FOLDER")); + forceRenameConfFile("bootstrap_conf"); + forceRenameConfFile("bootstrap_context"); + forceRenameConfFile("extensions.conf"); +}else if(AJXP_VERSION === '6.5.1' || AJXP_VERSION === '6.5.2'){ + forceRenameConfFile("bootstrap_context"); +} \ No newline at end of file diff --git a/dist/php/6.5.3.sqlite b/dist/php/6.5.3.sqlite new file mode 100644 index 0000000000..0bd6e30b41 --- /dev/null +++ b/dist/php/6.5.3.sqlite @@ -0,0 +1,38 @@ +DROP TABLE IF EXISTS ajxp_tasks; +/* SEPARATOR */ +CREATE TABLE IF NOT EXISTS ajxp_tasks ( + uid VARCHAR(255) NOT NULL , + type INTEGER NOT NULL, + parent_uid VARCHAR(255) DEFAULT NULL, + flags INTEGER NOT NULL, + label VARCHAR(255) NOT NULL, + user_id VARCHAR(255) NOT NULL, + ws_id VARCHAR(32) NOT NULL, + status INTEGER NOT NULL, + status_msg VARCHAR(500) NOT NULL, + progress INTEGER NOT NULL, + schedule INTEGER NOT NULL, + schedule_value VARCHAR(255) DEFAULT NULL, + action VARCHAR(255) NOT NULL, + parameters VARCHAR(500) NOT NULL, + nodes VARCHAR(500) NOT NULL, + creation_date INTEGER NOT NULL DEFAULT 0, + status_update INTEGER NOT NULL DEFAULT 0, + PRIMARY KEY (uid) +); +/* SEPARATOR */ +CREATE INDEX ajxp_task_usr_idx ON ajxp_tasks (user_id); +/* SEPARATOR */ +CREATE INDEX ajxp_task_status_idx ON ajxp_tasks (status); +/* SEPARATOR */ +CREATE INDEX ajxp_task_type ON ajxp_tasks (type); +/* SEPARATOR */ +CREATE INDEX ajxp_task_schedule ON ajxp_tasks (schedule); +/* SEPARATOR */ +CREATE INDEX ajxp_task_nodes_idx ON ajxp_tasks (nodes); +/* SEPARATOR */ +CREATE TABLE IF NOT EXISTS ajxp_mq_queues ( + channel_name varchar(255) NOT NULL, + content text NOT NULL, + PRIMARY KEY (`channel_name`) +); \ No newline at end of file From 6208ba02acd1e70630b11fa2f892a4f8a55cacfe Mon Sep 17 00:00:00 2001 From: cdujeu Date: Mon, 3 Oct 2016 17:31:53 +0200 Subject: [PATCH 25/41] Fix table creation for mq.sql --- core/src/plugins/mq.sql/SqlMessageExchanger.php | 14 ++++++++++++-- .../plugins/mq.sql/{create.sql => create.mysql} | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) rename core/src/plugins/mq.sql/{create.sql => create.mysql} (76%) diff --git a/core/src/plugins/mq.sql/SqlMessageExchanger.php b/core/src/plugins/mq.sql/SqlMessageExchanger.php index 5d3be8711f..6774f8e90c 100644 --- a/core/src/plugins/mq.sql/SqlMessageExchanger.php +++ b/core/src/plugins/mq.sql/SqlMessageExchanger.php @@ -61,7 +61,8 @@ public function performChecks() } } - + + /** * @var array */ @@ -79,6 +80,12 @@ public function loadChannel($channelName, $create = false) if (isSet(self::$channels) && is_array(self::$channels[$channelName])) { return; } + if(empty($this->sqlDriver)) { + return; + } + if(!dibi::isConnected()){ + dibi::connect($this->sqlDriver); + } $res = dibi::query('SELECT [content] FROM [ajxp_mq_queues] WHERE [channel_name] = %s', $channelName); if($res->count()){ if(!isset(self::$channels)) self::$channels = array(); @@ -100,10 +107,13 @@ public function loadChannel($channelName, $create = false) public function __destruct() { - if (isSet(self::$channels) && is_array(self::$channels)) { + if (isSet(self::$channels) && is_array(self::$channels) && !empty($this->sqlDriver)) { $inserts = []; $deletes = []; $driver = $this->sqlDriver["driver"]; + if(!dibi::isConnected()){ + dibi::connect($this->sqlDriver); + } foreach (self::$channels as $channelName => $data) { if (is_array($data)) { if(isSet($data["CLIENTS"]) && count($data["CLIENTS"])) { diff --git a/core/src/plugins/mq.sql/create.sql b/core/src/plugins/mq.sql/create.mysql similarity index 76% rename from core/src/plugins/mq.sql/create.sql rename to core/src/plugins/mq.sql/create.mysql index 97e40744c7..6fd7ef3392 100644 --- a/core/src/plugins/mq.sql/create.sql +++ b/core/src/plugins/mq.sql/create.mysql @@ -2,4 +2,4 @@ CREATE TABLE IF NOT EXISTS `ajxp_mq_queues` ( `channel_name` varchar(255) NOT NULL, `content` text NOT NULL, PRIMARY KEY (`channel_name`) -) DEFAULT CHARSET=utf8; \ No newline at end of file +) CHARACTER SET utf8 COLLATE utf8_unicode_ci; \ No newline at end of file From 06788bedaf152512642be7c1c9690420ef5166fa Mon Sep 17 00:00:00 2001 From: cdujeu Date: Mon, 3 Oct 2016 17:33:58 +0200 Subject: [PATCH 26/41] pg / sqlite versions --- core/src/plugins/mq.sql/create.pgsql | 5 +++++ core/src/plugins/mq.sql/create.sqlite | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 core/src/plugins/mq.sql/create.pgsql create mode 100644 core/src/plugins/mq.sql/create.sqlite diff --git a/core/src/plugins/mq.sql/create.pgsql b/core/src/plugins/mq.sql/create.pgsql new file mode 100644 index 0000000000..753d9293e2 --- /dev/null +++ b/core/src/plugins/mq.sql/create.pgsql @@ -0,0 +1,5 @@ +CREATE TABLE IF NOT EXISTS ajxp_mq_queues ( + channel_name varchar(255) NOT NULL, + content text NOT NULL, + constraint pk primary key(channel_name) +); \ No newline at end of file diff --git a/core/src/plugins/mq.sql/create.sqlite b/core/src/plugins/mq.sql/create.sqlite new file mode 100644 index 0000000000..906772133a --- /dev/null +++ b/core/src/plugins/mq.sql/create.sqlite @@ -0,0 +1,4 @@ +CREATE TABLE IF NOT EXISTS ajxp_mq_queues ( + channel_name TEXT NOT NULL PRIMARY KEY, + content text NOT NULL, +); \ No newline at end of file From 25e19b886af32d38867d3f166d5a8231e07eb8bf Mon Sep 17 00:00:00 2001 From: cdujeu Date: Tue, 4 Oct 2016 14:13:16 +0200 Subject: [PATCH 27/41] Switch to BLOB for ajxp_mq_queues --- core/src/plugins/mq.sql/SqlMessageExchanger.php | 13 +++++++++---- core/src/plugins/mq.sql/create.mysql | 2 +- core/src/plugins/mq.sql/create.pgsql | 2 +- core/src/plugins/mq.sql/create.sqlite | 2 +- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/core/src/plugins/mq.sql/SqlMessageExchanger.php b/core/src/plugins/mq.sql/SqlMessageExchanger.php index 6774f8e90c..2fe39872ed 100644 --- a/core/src/plugins/mq.sql/SqlMessageExchanger.php +++ b/core/src/plugins/mq.sql/SqlMessageExchanger.php @@ -90,7 +90,7 @@ public function loadChannel($channelName, $create = false) if($res->count()){ if(!isset(self::$channels)) self::$channels = array(); $single = $res->fetchSingle(); - $data = unserialize(base64_decode($single)); + $data = unserialize($single); if (is_array($data)) { if(!is_array($data["MESSAGES"])) $data["MESSAGES"] = array(); if(!is_array($data["CLIENTS"])) $data["CLIENTS"] = array(); @@ -109,6 +109,7 @@ public function __destruct() { if (isSet(self::$channels) && is_array(self::$channels) && !empty($this->sqlDriver)) { $inserts = []; + $insertValues = []; $deletes = []; $driver = $this->sqlDriver["driver"]; if(!dibi::isConnected()){ @@ -117,12 +118,14 @@ public function __destruct() foreach (self::$channels as $channelName => $data) { if (is_array($data)) { if(isSet($data["CLIENTS"]) && count($data["CLIENTS"])) { - $serialized = base64_encode(serialize($data)); + $serialized = serialize($data); if($driver === "postgre"){ dibi::query("DELETE FROM [ajxp_mq_queues] WHERE [channel_name] = %s", $channelName); dibi::query('INSERT INTO [ajxp_mq_queues]', ["channel_name" => $channelName, "content" => $serialized]); }else{ - $inserts[] = "('$channelName', '".$serialized."')"; + $inserts[] = "(%s, %bin)"; + $insertValues[] = $channelName; + $insertValues[] = $serialized; } }else{ $deletes[] = $channelName; @@ -131,7 +134,9 @@ public function __destruct() } if(count($inserts)){ try{ - dibi::query('REPLACE INTO [ajxp_mq_queues] ([channel_name],[content]) VALUES '.implode(",", $inserts)); + $args = ['REPLACE INTO [ajxp_mq_queues] ([channel_name],[content]) VALUES '.implode(",", $inserts)]; + $args = array_merge($args, $insertValues); + call_user_func_array(array("dibi", "query"), $args); }catch(\DibiException $dE){ $this->logError(__CLASS__, $dE->getMessage()); } diff --git a/core/src/plugins/mq.sql/create.mysql b/core/src/plugins/mq.sql/create.mysql index 6fd7ef3392..a049c2c29d 100644 --- a/core/src/plugins/mq.sql/create.mysql +++ b/core/src/plugins/mq.sql/create.mysql @@ -1,5 +1,5 @@ CREATE TABLE IF NOT EXISTS `ajxp_mq_queues` ( `channel_name` varchar(255) NOT NULL, - `content` text NOT NULL, + `content` BLOB NOT NULL, PRIMARY KEY (`channel_name`) ) CHARACTER SET utf8 COLLATE utf8_unicode_ci; \ No newline at end of file diff --git a/core/src/plugins/mq.sql/create.pgsql b/core/src/plugins/mq.sql/create.pgsql index 753d9293e2..9d6a77733c 100644 --- a/core/src/plugins/mq.sql/create.pgsql +++ b/core/src/plugins/mq.sql/create.pgsql @@ -1,5 +1,5 @@ CREATE TABLE IF NOT EXISTS ajxp_mq_queues ( channel_name varchar(255) NOT NULL, - content text NOT NULL, + content BLOB NOT NULL, constraint pk primary key(channel_name) ); \ No newline at end of file diff --git a/core/src/plugins/mq.sql/create.sqlite b/core/src/plugins/mq.sql/create.sqlite index 906772133a..6f0f780d5d 100644 --- a/core/src/plugins/mq.sql/create.sqlite +++ b/core/src/plugins/mq.sql/create.sqlite @@ -1,4 +1,4 @@ CREATE TABLE IF NOT EXISTS ajxp_mq_queues ( channel_name TEXT NOT NULL PRIMARY KEY, - content text NOT NULL, + content BLOB NOT NULL, ); \ No newline at end of file From d2a60295e7322b4de871f18237bceee9483d520f Mon Sep 17 00:00:00 2001 From: cdujeu Date: Tue, 4 Oct 2016 14:14:02 +0200 Subject: [PATCH 28/41] Switch to blob for ajxp_mq_queues --- dist/php/6.5.3.mysql | 2 +- dist/php/6.5.3.pgsql | 2 +- dist/php/6.5.3.sqlite | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/php/6.5.3.mysql b/dist/php/6.5.3.mysql index 01c494e686..b529e2f4ab 100644 --- a/dist/php/6.5.3.mysql +++ b/dist/php/6.5.3.mysql @@ -35,7 +35,7 @@ CREATE INDEX ajxp_task_nodes_idx ON ajxp_tasks (nodes); /* SEPARATOR */ CREATE TABLE IF NOT EXISTS `ajxp_mq_queues` ( `channel_name` varchar(255) NOT NULL, - `content` text NOT NULL, + `content` BLOB NOT NULL, PRIMARY KEY (`channel_name`) ) DEFAULT CHARSET=utf8; /* SEPARATOR */ diff --git a/dist/php/6.5.3.pgsql b/dist/php/6.5.3.pgsql index af88b0c8ad..383eb84edf 100644 --- a/dist/php/6.5.3.pgsql +++ b/dist/php/6.5.3.pgsql @@ -34,6 +34,6 @@ CREATE INDEX ajxp_task_nodes_idx ON ajxp_tasks (nodes); /* SEPARATOR */ CREATE TABLE IF NOT EXISTS ajxp_mq_queues ( channel_name varchar(255) NOT NULL, - content text NOT NULL, + content BLOB NOT NULL, PRIMARY KEY (channel_name) ); \ No newline at end of file diff --git a/dist/php/6.5.3.sqlite b/dist/php/6.5.3.sqlite index 0bd6e30b41..2d1b383b98 100644 --- a/dist/php/6.5.3.sqlite +++ b/dist/php/6.5.3.sqlite @@ -33,6 +33,6 @@ CREATE INDEX ajxp_task_nodes_idx ON ajxp_tasks (nodes); /* SEPARATOR */ CREATE TABLE IF NOT EXISTS ajxp_mq_queues ( channel_name varchar(255) NOT NULL, - content text NOT NULL, + content BLOB NOT NULL, PRIMARY KEY (`channel_name`) ); \ No newline at end of file From 1f002d7740847d7ca5806a8c003e583d03292c9e Mon Sep 17 00:00:00 2001 From: cdujeu Date: Tue, 4 Oct 2016 14:17:11 +0200 Subject: [PATCH 29/41] Index action: switch verbose parameter to verboz, as it conflicts with symfony command line. GUID: make it consistent with or without com extension on windows. --- core/src/core/src/pydio/Core/Utils/Vars/StringHelper.php | 2 +- core/src/plugins/core.index/CoreIndexer.php | 2 +- core/src/plugins/core.index/manifest.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/core/src/pydio/Core/Utils/Vars/StringHelper.php b/core/src/core/src/pydio/Core/Utils/Vars/StringHelper.php index c58bea851a..d5c3a4ea73 100644 --- a/core/src/core/src/pydio/Core/Utils/Vars/StringHelper.php +++ b/core/src/core/src/pydio/Core/Utils/Vars/StringHelper.php @@ -302,7 +302,7 @@ public static function regexpToLdap($regexp) public static function createGUID() { if (function_exists('com_create_guid')) { - return com_create_guid(); + return trim(com_create_guid(), "{}"); } else { mt_srand((double)microtime() * 10000);//optional for php 4.2.0 and up. $charid = strtoupper(md5(uniqid(rand(), true))); diff --git a/core/src/plugins/core.index/CoreIndexer.php b/core/src/plugins/core.index/CoreIndexer.php index 19b8f86fa1..53fd3eb47b 100644 --- a/core/src/plugins/core.index/CoreIndexer.php +++ b/core/src/plugins/core.index/CoreIndexer.php @@ -79,7 +79,7 @@ public function applyAction(\Psr\Http\Message\ServerRequestInterface $requestInt } $nodes = $userSelection->buildNodes(); - if (isSet($httpVars["verbose"]) && $httpVars["verbose"] == "true") { + if (isSet($httpVars["verboz"]) && $httpVars["verboz"] == "true") { $this->verboseIndexation = true; } $taskId = $requestInterface->getAttribute("pydio-task-id"); diff --git a/core/src/plugins/core.index/manifest.xml b/core/src/plugins/core.index/manifest.xml index 9827646175..64f58deaa6 100644 --- a/core/src/plugins/core.index/manifest.xml +++ b/core/src/plugins/core.index/manifest.xml @@ -29,7 +29,7 @@ ]]>
- +
From 5964a72f8313a4c816d6190aacf2a7904706908f Mon Sep 17 00:00:00 2001 From: cdujeu Date: Tue, 4 Oct 2016 15:43:54 +0200 Subject: [PATCH 30/41] Index action: switch verbose parameter to verboz, as it conflicts with symfony command line. GUID: make it consistent with or without com extension on windows. --- core/src/conf/RELEASE_NOTE | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/conf/RELEASE_NOTE b/core/src/conf/RELEASE_NOTE index e9e226041d..adb7712c28 100644 --- a/core/src/conf/RELEASE_NOTE +++ b/core/src/conf/RELEASE_NOTE @@ -2,6 +2,11 @@ Pydio ##VERSION_NUMBER## Release Note TODO : This is a temporary package for testing upgrade from v6 to v7 +Third Beta for Pydio 7 + +---- +Pydio Core 6.5.2 + Second beta for Pydio 7 ---- From b56a0e275db9e1996e861da8937e5b708305572f Mon Sep 17 00:00:00 2001 From: cdujeu Date: Tue, 4 Oct 2016 16:00:00 +0200 Subject: [PATCH 31/41] Fix deletion sql error --- core/src/plugins/mq.sql/SqlMessageExchanger.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/plugins/mq.sql/SqlMessageExchanger.php b/core/src/plugins/mq.sql/SqlMessageExchanger.php index 2fe39872ed..8edafc13be 100644 --- a/core/src/plugins/mq.sql/SqlMessageExchanger.php +++ b/core/src/plugins/mq.sql/SqlMessageExchanger.php @@ -138,14 +138,14 @@ public function __destruct() $args = array_merge($args, $insertValues); call_user_func_array(array("dibi", "query"), $args); }catch(\DibiException $dE){ - $this->logError(__CLASS__, $dE->getMessage()); + $this->logError(__CLASS__, $dE->getMessage().". SQL query was: ".$dE->getMessage()); } } if(count($deletes)){ try{ - dibi::query('DELETE FROM [ajxp_mq_queues] WHERE [channel_name] IN %s', $deletes); + dibi::query('DELETE FROM [ajxp_mq_queues] WHERE [channel_name] IN (%s)', $deletes); }catch(\DibiException $dE){ - $this->logError(__CLASS__, $dE->getMessage()); + $this->logError(__CLASS__, $dE->getMessage().". SQL query was: ".$dE->getMessage()); } } } From 18f6118953cb83dcbbc5906a27ef647387caef11 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Tue, 4 Oct 2016 18:55:37 +0200 Subject: [PATCH 32/41] Fix Unique DL template CSS positioning - Close #1222 --- core/src/plugins/action.share/res/minisite.css | 2 ++ core/src/plugins/action.share/res/minisite.less | 2 ++ 2 files changed, 4 insertions(+) diff --git a/core/src/plugins/action.share/res/minisite.css b/core/src/plugins/action.share/res/minisite.css index 1f82e9dc96..280115ac1b 100644 --- a/core/src/plugins/action.share/res/minisite.css +++ b/core/src/plugins/action.share/res/minisite.css @@ -380,6 +380,8 @@ div#overlay.form-login_form_dynamic { } #ajxp_unique_dl div.vertical-align { position: absolute; + top: 0; + left: 0; width: 100%; height: 100%; display: -webkit-flex; diff --git a/core/src/plugins/action.share/res/minisite.less b/core/src/plugins/action.share/res/minisite.less index 7ab9a14c5f..551f4368ad 100644 --- a/core/src/plugins/action.share/res/minisite.less +++ b/core/src/plugins/action.share/res/minisite.less @@ -343,6 +343,8 @@ div#overlay.form-login_form_dynamic { div.vertical-align{ position: absolute; + top: 0; + left: 0; width: 100%; height: 100%; display: flex; From dddf87ca4bff62ad1cd73fb87858cf122462d34a Mon Sep 17 00:00:00 2001 From: cdujeu Date: Tue, 4 Oct 2016 20:12:57 +0200 Subject: [PATCH 33/41] Correctly clear node.info as well as stat when deleting a folder cache by key. --- core/src/plugins/core.cache/CoreCacheLoader.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/plugins/core.cache/CoreCacheLoader.php b/core/src/plugins/core.cache/CoreCacheLoader.php index e2543da2ab..405d85d57a 100644 --- a/core/src/plugins/core.cache/CoreCacheLoader.php +++ b/core/src/plugins/core.cache/CoreCacheLoader.php @@ -126,10 +126,10 @@ public function clearNodeInfoCache($from=null, $to=null, $copy = false){ if(empty($cDriver) || !($cDriver->supportsPatternDelete(AJXP_CACHE_SERVICE_NS_NODES))){ return; } - if($from != null){ + if($from !== null){ $this->clearCacheForNode($from); } - if($to != null){ + if($to !== null && ($from === null || $from->getUrl() !== $to->getUrl())){ $this->clearCacheForNode($to); } } @@ -188,6 +188,7 @@ protected function clearCacheForNode($node){ }else { // Delete node data and all its children $cacheDriver->deleteKeyStartingWith(AJXP_CACHE_SERVICE_NS_NODES, AbstractCacheDriver::getOptionsForNode($node, "stat")["id"]); + $cacheDriver->deleteKeyStartingWith(AJXP_CACHE_SERVICE_NS_NODES, AbstractCacheDriver::getOptionsForNode($node, "node.info")["id"]); if($node->getParent() !== null){ $cacheDriver->deleteKeyStartingWith(AJXP_CACHE_SERVICE_NS_NODES, AbstractCacheDriver::getOptionsForNode($node->getParent(), "list")["id"]); }else{ From 866b3143f4ef252f4421e2a57f00b82844a7e7de Mon Sep 17 00:00:00 2001 From: cdujeu Date: Tue, 4 Oct 2016 20:13:42 +0200 Subject: [PATCH 34/41] ShareCenter : forward change event if node has a minisite on it, by forwarding to root node in shared repo. --- core/src/plugins/action.share/src/ShareCenter.php | 12 ++++++++++-- .../action.share/src/Store/ShareMetaManager.php | 7 +++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/core/src/plugins/action.share/src/ShareCenter.php b/core/src/plugins/action.share/src/ShareCenter.php index d5f3e090c2..50500c3593 100644 --- a/core/src/plugins/action.share/src/ShareCenter.php +++ b/core/src/plugins/action.share/src/ShareCenter.php @@ -48,6 +48,7 @@ use Pydio\Core\Services\UsersService; use Pydio\Core\Services\ApplicationState; use Pydio\Core\Utils\Vars\InputFilter; +use Pydio\Core\Utils\Vars\PathUtils; use Pydio\Core\Utils\Vars\XMLFilter; use Pydio\Core\PluginFramework\Plugin; use Pydio\Core\PluginFramework\PluginsService; @@ -1225,10 +1226,17 @@ private function findMirrorNodesInShares($node, $direction){ continue; } $sharedNode = $metadata["SOURCE_NODE"]; - $sharedPath = substr($node->getPath(), strlen($sharedNode->getPath())); + if($sharedNode === $node){ + // This is a minisite on one file, using a content filter, send a node.change on root to force clear cache + $sharedPath = "/"; + }else{ + $sharedPath = substr($node->getPath(), strlen($sharedNode->getPath())); + } $newContext = $crtContext->withRepositoryId($wsId); $sharedNodeUrl = $newContext->getUrlBase().$sharedPath; - $result[$wsId] = array(new AJXP_Node($sharedNodeUrl), "DOWN"); + $newNode = new AJXP_Node($sharedNodeUrl); + if($sharedPath === '/') $newNode->setLeaf(false); + $result[$wsId] = array($newNode, "DOWN"); $this->logDebug('MIRROR NODES', 'Found shared in parent - register node '.$sharedNodeUrl); } } diff --git a/core/src/plugins/action.share/src/Store/ShareMetaManager.php b/core/src/plugins/action.share/src/Store/ShareMetaManager.php index 7339ef7e15..b0df1f78d6 100644 --- a/core/src/plugins/action.share/src/Store/ShareMetaManager.php +++ b/core/src/plugins/action.share/src/Store/ShareMetaManager.php @@ -129,6 +129,13 @@ public function removeShareFromMeta($node, $shareId){ */ public function collectSharesInParent($node, &$metas){ $node->collectMetadataInParents(AJXP_SHARED_META_NAMESPACE, AJXP_METADATA_ALLUSERS, AJXP_METADATA_SCOPE_REPOSITORY, false, $metas); + if($node->isLeaf()){ + $metadata = $node->retrieveMetadata(AJXP_SHARED_META_NAMESPACE, AJXP_METADATA_ALLUSERS, AJXP_METADATA_SCOPE_REPOSITORY,false); + if($metadata != false){ + $metadata["SOURCE_NODE"] = $node; + $metas[] = $metadata; + } + } } /** From 788da1d3a28bb925c10e26055f24f5178ce53bfb Mon Sep 17 00:00:00 2001 From: cdujeu Date: Tue, 4 Oct 2016 20:31:28 +0200 Subject: [PATCH 35/41] Fix plugins loading, triggering a permanent delete/rewrite of plugins_queries.ser --- core/src/core/src/pydio/Core/PluginFramework/PluginsService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/core/src/pydio/Core/PluginFramework/PluginsService.php b/core/src/core/src/pydio/Core/PluginFramework/PluginsService.php index 3a6b658c0c..21ac1ebfb2 100644 --- a/core/src/core/src/pydio/Core/PluginFramework/PluginsService.php +++ b/core/src/core/src/pydio/Core/PluginFramework/PluginsService.php @@ -491,7 +491,7 @@ private function loadPluginsFromCache($cacheStorage) { if(!empty($this->detectedPlugins)){ return true; } - if(!empty($cacheStorage) && $this->_loadDetectedPluginsFromCache($cacheStorage)){ + if($this->_loadDetectedPluginsFromCache($cacheStorage)){ return true; } From d8135990de0a4db66003eab5e3e72f5bca8dedff Mon Sep 17 00:00:00 2001 From: cdujeu Date: Wed, 5 Oct 2016 14:31:34 +0200 Subject: [PATCH 36/41] Missing robots.txt --- core/src/robots.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 core/src/robots.txt diff --git a/core/src/robots.txt b/core/src/robots.txt new file mode 100644 index 0000000000..77470cb39f --- /dev/null +++ b/core/src/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / \ No newline at end of file From c38ca41c83ab6f70c39e13aca51a415ef11c202a Mon Sep 17 00:00:00 2001 From: Daniel Nauck Date: Wed, 5 Oct 2016 15:11:18 +0200 Subject: [PATCH 37/41] PostgreSQL's binary type is called bytea --- dist/php/6.5.3.pgsql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/php/6.5.3.pgsql b/dist/php/6.5.3.pgsql index 383eb84edf..eaefeefa1f 100644 --- a/dist/php/6.5.3.pgsql +++ b/dist/php/6.5.3.pgsql @@ -34,6 +34,6 @@ CREATE INDEX ajxp_task_nodes_idx ON ajxp_tasks (nodes); /* SEPARATOR */ CREATE TABLE IF NOT EXISTS ajxp_mq_queues ( channel_name varchar(255) NOT NULL, - content BLOB NOT NULL, + content bytea NOT NULL, PRIMARY KEY (channel_name) -); \ No newline at end of file +); From c934f01b34c9f982ba237ac78c95ec98f21d862e Mon Sep 17 00:00:00 2001 From: Daniel Nauck Date: Wed, 5 Oct 2016 15:12:23 +0200 Subject: [PATCH 38/41] PostgreSQL's binary type is called bytea --- core/src/plugins/mq.sql/create.pgsql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/plugins/mq.sql/create.pgsql b/core/src/plugins/mq.sql/create.pgsql index 9d6a77733c..a61a5563ed 100644 --- a/core/src/plugins/mq.sql/create.pgsql +++ b/core/src/plugins/mq.sql/create.pgsql @@ -1,5 +1,5 @@ CREATE TABLE IF NOT EXISTS ajxp_mq_queues ( channel_name varchar(255) NOT NULL, - content BLOB NOT NULL, + content bytea NOT NULL, constraint pk primary key(channel_name) -); \ No newline at end of file +); From 17ba1bf7c4f6376d805c22127006397e996c4c39 Mon Sep 17 00:00:00 2001 From: Daniel Nauck Date: Wed, 5 Oct 2016 15:12:50 +0200 Subject: [PATCH 39/41] fix primary key syntax --- core/src/plugins/mq.sql/create.pgsql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/plugins/mq.sql/create.pgsql b/core/src/plugins/mq.sql/create.pgsql index a61a5563ed..e26ab098dc 100644 --- a/core/src/plugins/mq.sql/create.pgsql +++ b/core/src/plugins/mq.sql/create.pgsql @@ -1,5 +1,5 @@ CREATE TABLE IF NOT EXISTS ajxp_mq_queues ( channel_name varchar(255) NOT NULL, content bytea NOT NULL, - constraint pk primary key(channel_name) + primary key(channel_name) ); From 4133abb559d47a7d318eaef3d64a98c966282802 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Wed, 5 Oct 2016 17:03:32 +0200 Subject: [PATCH 40/41] init 6.5.4 upgrade --- dist/php/6.5.4-extractArchive-post.php | 117 +++++++++++++++++++++++++ dist/php/6.5.4.html | 13 +++ dist/php/6.5.4.php | 109 +++++++++++++++++++++++ 3 files changed, 239 insertions(+) create mode 100644 dist/php/6.5.4-extractArchive-post.php create mode 100644 dist/php/6.5.4.html create mode 100644 dist/php/6.5.4.php diff --git a/dist/php/6.5.4-extractArchive-post.php b/dist/php/6.5.4-extractArchive-post.php new file mode 100644 index 0000000000..2671d30d6f --- /dev/null +++ b/dist/php/6.5.4-extractArchive-post.php @@ -0,0 +1,117 @@ + + * 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 . + */ + +/** + * @param string $version + * @throws Exception + */ +function checkPhpVersion($version){ + if(version_compare(PHP_VERSION, $version) < 0){ + throw new Exception("For Pydio 7, PHP version must be greater or equal to $version, detected version is ".PHP_VERSION." - Upgrade aborted."); + }else{ + echo "
- Checking Php Version (".PHP_VERSION.") : OK
"; + } +} + +/** + * @param string $type + * @param string $name + * @throws Exception + */ +function checkPluginUsed($type, $name){ + + if($type === "conf"){ + $p = ConfService::getConfStorageImpl(); + if($p->getName() === $name){ + throw new Exception("You are currently using $type.$name as configuration storage. This was deprecated in Pydio 6 and is now removed in Pydio7. Aborting upgrade"); + }else{ + echo "
- Checking plugin $type ($name) : OK
"; + } + }else if($type === "auth") { + $p = ConfService::getAuthDriverImpl(); + if ($p->getName() === $name) { + throw new Exception("You are currently using $type.$name for authentication backend. This was deprecated in Pydio 6 and is now removed in Pydio7. Aborting upgrade"); + } else { + if ($p->getName() === "multi") { + $drivers = $p->drivers; + if (isSet($drivers[$name])) { + throw new Exception("You are currently using $type.$name for authentication backend. This was deprecated in Pydio 6 and is nowremoved in Pydio7. Aborting upgrade"); + } else { + echo "
- Checking plugin $type (" . implode(", ", array_keys($drivers)) . ") : OK
"; + } + } + echo "
- Checking plugin $type ($name) : OK
"; + } + }else if($type === "access"){ + + // Check if a workspace is currently using this plugin + echo "
- Should check usage of plugin $type ($name) in active workspaces : TODO
"; + + + }else{ + $plugs = AJXP_PluginsService::getInstance()->getActivePluginsForType($type); + if(isSet($plugs[$name])){ + throw new Exception("You are currently using plugin $type.$name. This is removed in Pydio7. Please disable it before running upgrade. Aborting upgrade"); + } + echo "
- Checking plugin $type ($name) : OK
"; + } + +} + +/** + * @param string $themeName + * @throws Exception + */ +function checkThemeUsed($themeName){ + + $p = AJXP_PluginsService::getInstance()->findPlugin("gui", "ajax"); + $options = $p->getConfigs(); + if(isSet($options["GUI_THEME"]) && $options["GUI_THEME"] === $themeName){ + throw new Exception("You are currently using theme ".$options["GUI_THEME"]." which was removed from Pydio 7. If you want to be able to upgrade, you have to switch to Orbit theme. Aborting upgrade."); + }else{ + echo "
- Checking usage of remove theme ($themeName): OK
"; + } + +} + +function blockAllXHRInPage(){ + print ' + +
Blocking all XHR in page: OK
+ '; +} + +blockAllXHRInPage(); +checkPhpVersion('5.5.9'); +if(AJXP_VERSION === '6.4.2'){ + checkPluginUsed("conf", "serial"); + checkPluginUsed("auth", "serial"); + checkPluginUsed("auth", "cmsms"); + checkPluginUsed("access", "remote_fs"); + checkThemeUsed("vision"); + checkThemeUsed("umbra"); +} diff --git a/dist/php/6.5.4.html b/dist/php/6.5.4.html new file mode 100644 index 0000000000..bf738e76b3 --- /dev/null +++ b/dist/php/6.5.4.html @@ -0,0 +1,13 @@ +
+ +

Pydio Core 6.5.3 - Beta3 for Pydio 7

+ + This is the third beta for next major release. +

+ Please update at your own risks!! Do not update servers that are live in production! +

+ + If you want to participate to the beta program and get access to dedicated resources, please fill in this small form, we will be in contact soon. + +
\ No newline at end of file diff --git a/dist/php/6.5.4.php b/dist/php/6.5.4.php new file mode 100644 index 0000000000..af63be1ec9 --- /dev/null +++ b/dist/php/6.5.4.php @@ -0,0 +1,109 @@ + + * 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 . + */ + +function updateSharePhpContent($installPath, $publicFolder){ + + $publicFolder = preg_replace("/^".str_replace(array("\\","/"), array("\\\\", "\/"), $installPath)."/", "", $publicFolder); + $sharePhpPath = $installPath."/".trim($publicFolder, "/")."/"."share.php"; + if(!is_file($sharePhpPath)){ + echo "No share.php file was found in public folder. If it does exist, you may have to manually upgrade its content.\n"; + return; + } + echo "Upgrading content of $sharePhpPath file\n"; + $folders = array_map(function($value){ + return ".."; + }, explode("/", trim($publicFolder, "/"))); + $baseConfPath = implode("/", $folders); + + $content = ' $_GET["hash"]]);'; + file_put_contents($sharePhpPath, $content); + +} + +function updateHtAccessContent($htAccessPath){ + + if(!is_file($htAccessPath)){ + echo "No htaccess file found. Skipping Htaccess update.\n"; + return; + } + echo "Upgrading content of Htaccess file\n"; + $lines = file($htAccessPath, FILE_IGNORE_NEW_LINES); + $removeFlag = false; + $newLines = []; + // Remove unnecessary lines + foreach($lines as $index => $line){ + if(!$removeFlag){ + $newLines[] = $line; + if(trim($line) === "RewriteCond %{REQUEST_FILENAME} !-d"){ + $removeFlag = true; + } + }else{ + if(trim($line) === 'RewriteRule (.*) index.php [L]'){ + $newLines[] = $line; + $removeFlag = false; + } + } + } + $contents = implode("\n", $newLines); + if(is_writable($htAccessPath)){ + file_put_contents($htAccessPath, $contents); + }else{ + echo "ERROR: Htaccess file could not be written. Update it manually to the following content:
$contents
"; + } + +} + +function awsSdkVersion(){ + + $s3Options = ConfService::getConfStorageImpl()->loadPluginConfig("access", "s3"); + if($s3Options["SDK_VERSION"] === "v2"){ + $s3Options["SDK_VERSION"] = "v3"; + ConfService::getConfStorageImpl()->savePluginConfig("access.s3", $s3Options); + } + +} + +function forceRenameConfFile($prefix){ + + // FORCE bootstrap_repositories copy + if (is_file(AJXP_INSTALL_PATH."/conf/$prefix.php".".new-".date("Ymd"))) { + rename(AJXP_INSTALL_PATH."/conf/$prefix.php", AJXP_INSTALL_PATH."/conf/$prefix.php.pre-update"); + rename(AJXP_INSTALL_PATH."/conf/$prefix.php".".new-".date("Ymd"), AJXP_INSTALL_PATH."/conf/$prefix.php"); + } + + +} + +if(AJXP_VERSION === '6.4.2'){ + awsSdkVersion(); + updateHtAccessContent(AJXP_INSTALL_PATH."/.htaccess"); + updateSharePhpContent(AJXP_INSTALL_PATH, ConfService::getCoreConf("PUBLIC_DOWNLOAD_FOLDER")); + forceRenameConfFile("bootstrap_conf"); + forceRenameConfFile("bootstrap_context"); + forceRenameConfFile("extensions.conf"); +}else if(AJXP_VERSION === '6.5.1' || AJXP_VERSION === '6.5.2'){ + forceRenameConfFile("bootstrap_context"); +} \ No newline at end of file From b920b73c10c17bb79cb67be9d2a00db2d3951146 Mon Sep 17 00:00:00 2001 From: cdujeu Date: Wed, 5 Oct 2016 17:04:27 +0200 Subject: [PATCH 41/41] init 6.5.4 upgrade - sql scripts --- dist/php/6.5.4.mysql | 46 +++++++++++++++++++++++++++++++++++++++++++ dist/php/6.5.4.pgsql | 39 ++++++++++++++++++++++++++++++++++++ dist/php/6.5.4.sqlite | 38 +++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 dist/php/6.5.4.mysql create mode 100644 dist/php/6.5.4.pgsql create mode 100644 dist/php/6.5.4.sqlite diff --git a/dist/php/6.5.4.mysql b/dist/php/6.5.4.mysql new file mode 100644 index 0000000000..b529e2f4ab --- /dev/null +++ b/dist/php/6.5.4.mysql @@ -0,0 +1,46 @@ +/* SEPARATOR */ +DROP TABLE IF EXISTS ajxp_tasks; +/* SEPARATOR */ +CREATE TABLE IF NOT EXISTS ajxp_tasks ( + uid VARCHAR(255) NOT NULL , + type INTEGER NOT NULL, + parent_uid VARCHAR(255) DEFAULT NULL, + flags INTEGER NOT NULL, + label VARCHAR(255) NOT NULL, + user_id VARCHAR(255) NOT NULL, + ws_id VARCHAR(32) NOT NULL, + status INTEGER NOT NULL, + status_msg VARCHAR(500) NOT NULL, + progress INTEGER NOT NULL, + schedule INTEGER NOT NULL, + schedule_value VARCHAR(255) DEFAULT NULL, + action VARCHAR(255) NOT NULL, + parameters VARCHAR(500) NOT NULL, + nodes VARCHAR(500) NOT NULL, + creation_date INTEGER NOT NULL DEFAULT 0, + status_update INTEGER NOT NULL DEFAULT 0, + + PRIMARY KEY (uid) +) DEFAULT CHARSET=utf8; +/* SEPARATOR */ +CREATE INDEX ajxp_task_usr_idx ON ajxp_tasks (user_id); +/* SEPARATOR */ +CREATE INDEX ajxp_task_status_idx ON ajxp_tasks (status); +/* SEPARATOR */ +CREATE INDEX ajxp_task_type ON ajxp_tasks (type); +/* SEPARATOR */ +CREATE INDEX ajxp_task_schedule ON ajxp_tasks (schedule); +/* SEPARATOR */ +CREATE INDEX ajxp_task_nodes_idx ON ajxp_tasks (nodes); +/* SEPARATOR */ +CREATE TABLE IF NOT EXISTS `ajxp_mq_queues` ( + `channel_name` varchar(255) NOT NULL, + `content` BLOB NOT NULL, + PRIMARY KEY (`channel_name`) +) DEFAULT CHARSET=utf8; +/* 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 old.node_path COLLATE utf8_bin = new.node_path COLLATE utf8_bin WHEN true THEN 'content' ELSE 'path' END); \ No newline at end of file diff --git a/dist/php/6.5.4.pgsql b/dist/php/6.5.4.pgsql new file mode 100644 index 0000000000..eaefeefa1f --- /dev/null +++ b/dist/php/6.5.4.pgsql @@ -0,0 +1,39 @@ +/* SEPARATOR */ +DROP TABLE IF EXISTS ajxp_tasks; +/* SEPARATOR */ +CREATE TABLE IF NOT EXISTS ajxp_tasks ( + uid VARCHAR(255) NOT NULL , + type INTEGER NOT NULL, + parent_uid VARCHAR(255) DEFAULT NULL, + flags INTEGER NOT NULL, + label VARCHAR(255) NOT NULL, + user_id VARCHAR(255) NOT NULL, + ws_id VARCHAR(32) NOT NULL, + status INTEGER NOT NULL, + status_msg VARCHAR(500) NOT NULL, + progress INTEGER NOT NULL, + schedule INTEGER NOT NULL, + schedule_value VARCHAR(255) DEFAULT NULL, + action VARCHAR(255) NOT NULL, + parameters VARCHAR(500) NOT NULL, + nodes VARCHAR(500) NOT NULL, + creation_date INTEGER NOT NULL DEFAULT 0, + status_update INTEGER NOT NULL DEFAULT 0, + PRIMARY KEY (uid) +); +/* SEPARATOR */ +CREATE INDEX ajxp_task_usr_idx ON ajxp_tasks (user_id); +/* SEPARATOR */ +CREATE INDEX ajxp_task_status_idx ON ajxp_tasks (status); +/* SEPARATOR */ +CREATE INDEX ajxp_task_type ON ajxp_tasks (type); +/* SEPARATOR */ +CREATE INDEX ajxp_task_schedule ON ajxp_tasks (schedule); +/* SEPARATOR */ +CREATE INDEX ajxp_task_nodes_idx ON ajxp_tasks (nodes); +/* SEPARATOR */ +CREATE TABLE IF NOT EXISTS ajxp_mq_queues ( + channel_name varchar(255) NOT NULL, + content bytea NOT NULL, + PRIMARY KEY (channel_name) +); diff --git a/dist/php/6.5.4.sqlite b/dist/php/6.5.4.sqlite new file mode 100644 index 0000000000..2d1b383b98 --- /dev/null +++ b/dist/php/6.5.4.sqlite @@ -0,0 +1,38 @@ +DROP TABLE IF EXISTS ajxp_tasks; +/* SEPARATOR */ +CREATE TABLE IF NOT EXISTS ajxp_tasks ( + uid VARCHAR(255) NOT NULL , + type INTEGER NOT NULL, + parent_uid VARCHAR(255) DEFAULT NULL, + flags INTEGER NOT NULL, + label VARCHAR(255) NOT NULL, + user_id VARCHAR(255) NOT NULL, + ws_id VARCHAR(32) NOT NULL, + status INTEGER NOT NULL, + status_msg VARCHAR(500) NOT NULL, + progress INTEGER NOT NULL, + schedule INTEGER NOT NULL, + schedule_value VARCHAR(255) DEFAULT NULL, + action VARCHAR(255) NOT NULL, + parameters VARCHAR(500) NOT NULL, + nodes VARCHAR(500) NOT NULL, + creation_date INTEGER NOT NULL DEFAULT 0, + status_update INTEGER NOT NULL DEFAULT 0, + PRIMARY KEY (uid) +); +/* SEPARATOR */ +CREATE INDEX ajxp_task_usr_idx ON ajxp_tasks (user_id); +/* SEPARATOR */ +CREATE INDEX ajxp_task_status_idx ON ajxp_tasks (status); +/* SEPARATOR */ +CREATE INDEX ajxp_task_type ON ajxp_tasks (type); +/* SEPARATOR */ +CREATE INDEX ajxp_task_schedule ON ajxp_tasks (schedule); +/* SEPARATOR */ +CREATE INDEX ajxp_task_nodes_idx ON ajxp_tasks (nodes); +/* SEPARATOR */ +CREATE TABLE IF NOT EXISTS ajxp_mq_queues ( + channel_name varchar(255) NOT NULL, + content BLOB NOT NULL, + PRIMARY KEY (`channel_name`) +); \ No newline at end of file