Skip to content
This repository was archived by the owner on Nov 25, 2020. It is now read-only.

Commit 3e8328d

Browse files
committed
Add node_repository_id to metadata when sending NodesDiff, to avoid events on the wrong repo.
Remove legacy calls to XMLWriter::nodesDiff() and use message object instead.
1 parent fedc7fb commit 3e8328d

File tree

7 files changed

+40
-67
lines changed

7 files changed

+40
-67
lines changed

core/src/core/src/pydio/Core/Controller/XMLWriter.php

Lines changed: 1 addition & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ public static function renderAjxpNode($ajxpNode, $close = true, $print = true)
239239
$ajxpNode->getPath(),
240240
$ajxpNode->getLabel(),
241241
$ajxpNode->isLeaf(),
242-
$ajxpNode->metadata,
242+
$ajxpNode->getNodeInfoMeta(),
243243
$close,
244244
$print);
245245
}
@@ -321,57 +321,6 @@ public static function reloadDataNode($nodePath="", $pendingSelection="", $print
321321
return XMLWriter::write("<reload_instruction object=\"data\" node=\"$nodePath\" file=\"$pendingSelection\"/>", $print);
322322
}
323323

324-
325-
/**
326-
* Send a <reload> XML instruction for refreshing the list
327-
* @static
328-
* @param $diffNodes
329-
* @param bool $print
330-
* @return string
331-
*/
332-
public static function writeNodesDiff($diffNodes, $print = false)
333-
{
334-
/**
335-
* @var $ajxpNode \Pydio\Access\Core\Model\AJXP_Node
336-
*/
337-
$mess = LocaleService::getMessages();
338-
$buffer = "<nodes_diff>";
339-
if (isSet($diffNodes["REMOVE"]) && count($diffNodes["REMOVE"])) {
340-
$buffer .= "<remove>";
341-
foreach ($diffNodes["REMOVE"] as $nodePath) {
342-
$nodePath = StringHelper::xmlEntities($nodePath, true);
343-
$buffer .= "<tree filename=\"$nodePath\" ajxp_im_time=\"".time()."\"/>";
344-
}
345-
$buffer .= "</remove>";
346-
}
347-
if (isSet($diffNodes["ADD"]) && count($diffNodes["ADD"])) {
348-
$buffer .= "<add>";
349-
foreach ($diffNodes["ADD"] as $ajxpNode) {
350-
$ajxpNode->loadNodeInfo(false, false, "all");
351-
if (!empty($ajxpNode->metaData["mimestring_id"]) && array_key_exists($ajxpNode->metaData["mimestring_id"], $mess)) {
352-
$ajxpNode->mergeMetadata(array("mimestring" => $mess[$ajxpNode->metaData["mimestring_id"]]));
353-
}
354-
$buffer .= self::renderAjxpNode($ajxpNode, true, false);
355-
}
356-
$buffer .= "</add>";
357-
}
358-
if (isSet($diffNodes["UPDATE"]) && count($diffNodes["UPDATE"])) {
359-
$buffer .= "<update>";
360-
foreach ($diffNodes["UPDATE"] as $originalPath => $ajxpNode) {
361-
$ajxpNode->loadNodeInfo(false, false, "all");
362-
if (!empty($ajxpNode->metaData["mimestring_id"]) && array_key_exists($ajxpNode->metaData["mimestring_id"], $mess)) {
363-
$ajxpNode->mergeMetadata(array("mimestring" => $mess[$ajxpNode->metaData["mimestring_id"]]));
364-
}
365-
$ajxpNode->original_path = $originalPath;
366-
$buffer .= self::renderAjxpNode($ajxpNode, true, false);
367-
}
368-
$buffer .= "</update>";
369-
}
370-
$buffer .= "</nodes_diff>";
371-
return XMLWriter::write($buffer, $print);
372-
}
373-
374-
375324
/**
376325
* Send a <reload> XML instruction for refreshing the repositories list
377326
* @static

core/src/plugins/action.share/src/ShareCenter.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
use Pydio\Access\Core\AbstractAccessDriver;
2929
use Pydio\Access\Core\Model\AJXP_Node;
3030
use Pydio\Access\Core\Filter\ContentFilter;
31+
use Pydio\Access\Core\Model\NodesDiff;
3132
use Pydio\Access\Core\Model\NodesList;
3233
use Pydio\Access\Core\Model\Repository;
3334
use Pydio\Access\Core\Model\UserSelection;
@@ -751,7 +752,9 @@ public function switchAction(ServerRequestInterface &$requestInterface, Response
751752
*/
752753
if($shareScope == "public"){
753754
$ajxpNode->loadNodeInfo();
754-
$content = XMLWriter::writeNodesDiff(["UPDATE" => array($ajxpNode->getPath() => $ajxpNode)]);
755+
$diff = new NodesDiff();
756+
$diff->update($ajxpNode);
757+
$content = $diff->toXML();
755758
Controller::applyHook("msg.instant", array($ajxpNode->getContext(), $content, null, null, [$ajxpNode->getPath()]));
756759
}
757760

@@ -930,7 +933,9 @@ public function switchAction(ServerRequestInterface &$requestInterface, Response
930933

931934
if(isSet($httpVars["share_scope"]) && $httpVars["share_scope"] == "public"){
932935
$ajxpNode->loadNodeInfo();
933-
$content = XMLWriter::writeNodesDiff(["UPDATE" => [$ajxpNode->getPath() => $ajxpNode]]);
936+
$diff = new NodesDiff();
937+
$diff->update($ajxpNode);
938+
$content = $diff->toXML();
934939
Controller::applyHook("msg.instant", array($ajxpNode->getContext(), $content, null, null, [$ajxpNode->getPath()]));
935940
}
936941

core/src/plugins/core.access/src/Model/NodesDiff.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ protected function forceLoadNodeInfo(&$ajxpNode){
113113
if (!empty($ajxpNode->metaData["mimestring_id"]) && array_key_exists($ajxpNode->metaData["mimestring_id"], $mess)) {
114114
$ajxpNode->mergeMetadata(array("mimestring" => $mess[$ajxpNode->metaData["mimestring_id"]]));
115115
}
116+
// Add Repository to the metadata
117+
$ajxpNode->mergeMetadata(array("node_repository_id" => $ajxpNode->getRepositoryId()));
116118
}
117119

118120
/**

core/src/plugins/core.mq/src/MqManager.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use Psr\Http\Message\ServerRequestInterface;
2727
use Pydio\Access\Core\Model\AJXP_Node;
2828
use Pydio\Access\Core\Filter\AJXP_Permission;
29+
use Pydio\Access\Core\Model\NodesDiff;
2930
use Pydio\Core\Controller\Controller;
3031
use Pydio\Core\Exception\AuthRequiredException;
3132
use Pydio\Core\Exception\PydioException;
@@ -168,28 +169,29 @@ public function publishNodeChange($origNode = null, $newNode = null, $copy = fal
168169
$content = "";$targetUserId=null; $nodePaths = array();
169170
$update = false;
170171
$ctx = null;
172+
$diff = new NodesDiff();
171173
if ($newNode != null) {
172174
$ctx = $newNode->getContext();
173175
//$targetUserId = $newNode->getUserId();
174176
$targetUserId = null;
175177
$nodePaths[] = $newNode->getPath();
176178
$update = false;
177-
$data = array();
178179
if ($origNode != null && !$copy) {
179180
$update = true;
180-
$data[$origNode->getPath()] = $newNode;
181+
$diff->update($newNode, $origNode->getPath());
181182
} else {
182-
$data[] = $newNode;
183+
$diff->add($newNode);
183184
}
184-
$content = XMLWriter::writeNodesDiff(array(($update?"UPDATE":"ADD") => $data));
185+
$content = $diff->toXML();
185186
}
186187
if ($origNode != null && ! $update && !$copy) {
187188

188189
$ctx = $origNode->getContext();
189190
//$targetUserId = $origNode->getUserId();
190191
$targetUserId = null;
191192
$nodePaths[] = $origNode->getPath();
192-
$content = XMLWriter::writeNodesDiff(array("REMOVE" => array($origNode->getPath())));
193+
$diff->remove([$origNode->getPath()]);
194+
$content = $diff->toXML();
193195

194196
}
195197
if (!empty($content) && !empty($ctx)) {

core/src/plugins/gui.ajax/res/js/es6/http/PydioApi.es6

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ class PydioApi{
456456
} else if(childs[i].nodeName == 'nodes_diff') {
457457
var dm = this._pydioObject.getContextHolder();
458458
if(dm.getAjxpNodeProvider().parseAjxpNodesDiffs){
459-
dm.getAjxpNodeProvider().parseAjxpNodesDiffs(childs[i], dm, !window.currentLightBox);
459+
dm.getAjxpNodeProvider().parseAjxpNodesDiffs(childs[i], dm, this._pydioObject.user.activeRepository, !window.currentLightBox);
460460
}
461461
}
462462
else if(childs[i].tagName == "logging_result")

core/src/plugins/gui.ajax/res/js/es6/model/RemoteNodeProvider.es6

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,28 +261,37 @@ class RemoteNodeProvider{
261261
}
262262
}
263263

264-
parseAjxpNodesDiffs(xmlElement, targetDataModel, setContextChildrenSelected=false){
264+
parseAjxpNodesDiffs(xmlElement, targetDataModel, targetRepositoryId, setContextChildrenSelected=false){
265265
let removes = XMLUtils.XPathSelectNodes(xmlElement, "remove/tree");
266266
let adds = XMLUtils.XPathSelectNodes(xmlElement, "add/tree");
267267
let updates = XMLUtils.XPathSelectNodes(xmlElement, "update/tree");
268268
let notifyServerChange = [];
269269
if(removes && removes.length){
270270
removes.forEach(function(r){
271271
var p = r.getAttribute("filename");
272+
if(r.getAttribute("node_repository_id") && r.getAttribute("node_repository_id") !== targetRepositoryId){
273+
return;
274+
}
272275
var imTime = parseInt(r.getAttribute("ajxp_im_time"));
273276
targetDataModel.removeNodeByPath(p, imTime);
274277
notifyServerChange.push(p);
275278
});
276279
}
277280
if(adds && adds.length && targetDataModel.getAjxpNodeProvider().parseAjxpNode){
278281
adds.forEach(function(tree){
282+
if(tree.getAttribute("node_repository_id") && tree.getAttribute("node_repository_id") !== targetRepositoryId){
283+
return;
284+
}
279285
var newNode = targetDataModel.getAjxpNodeProvider().parseAjxpNode(tree);
280286
targetDataModel.addNode(newNode, setContextChildrenSelected);
281287
notifyServerChange.push(newNode.getPath());
282288
});
283289
}
284290
if(updates && updates.length && targetDataModel.getAjxpNodeProvider().parseAjxpNode){
285291
updates.forEach(function(tree){
292+
if(tree.getAttribute("node_repository_id") && tree.getAttribute("node_repository_id") !== targetRepositoryId){
293+
return;
294+
}
286295
var newNode = targetDataModel.getAjxpNodeProvider().parseAjxpNode(tree);
287296
let original = newNode.getMetadata().get("original_path");
288297
targetDataModel.updateNode(newNode, setContextChildrenSelected);

core/src/plugins/uploader.html/SimpleUpload.php

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
namespace Pydio\Uploader\Processor;
2222

2323
use Pydio\Access\Core\Model\AJXP_Node;
24+
use Pydio\Access\Core\Model\NodesDiff;
2425
use Pydio\Access\Core\Model\UserSelection;
2526
use Pydio\Core\Controller\Controller;
2627
use Pydio\Core\Exception\AuthRequiredException;
@@ -197,6 +198,13 @@ public function postProcess(\Psr\Http\Message\ServerRequestInterface &$request,
197198
// Ignore
198199
return;
199200
}
201+
$nodesDiff = new NodesDiff();
202+
if(isSet($result["CREATED_NODE"])){
203+
$nodesDiff->add($result["CREATED_NODE"]);
204+
}
205+
if(isSet($result["UPDATED_NODE"])){
206+
$nodesDiff->update($result["UPDATED_NODE"]);
207+
}
200208

201209
if (isSet($httpVars["simple_uploader"])) {
202210
$response = $response->withHeader("Content-type", "text/html; charset=UTF-8");
@@ -207,9 +215,7 @@ public function postProcess(\Psr\Http\Message\ServerRequestInterface &$request,
207215
} else {
208216
print("\n if(parent.pydio.getController().multi_selector) parent.pydio.getController().multi_selector.submitNext();");
209217
if (isSet($result["CREATED_NODE"]) || isSet($result["UPDATED_NODE"])) {
210-
$s = '<tree>';
211-
$s .= XMLWriter::writeNodesDiff(array((isSet($result["UPDATED_NODE"])?"UPDATE":"ADD")=> array($result[(isSet($result["UPDATED_NODE"])?"UPDATED":"CREATED")."_NODE"])), false);
212-
$s.= '</tree>';
218+
$s = '<tree>' . $nodesDiff->toXML() . '</tree>';
213219
$response->getBody()->write("\n var resultString = '".str_replace("'", "\'", $s)."'; var resultXML = parent.parseXml(resultString);");
214220
$response->getBody()->write("\n parent.PydioApi.getClient().parseXmlMessage(resultXML);");
215221
}
@@ -222,12 +228,12 @@ public function postProcess(\Psr\Http\Message\ServerRequestInterface &$request,
222228
$response->getBody()->write($message);
223229
} else {
224230

225-
$nodesDiff = "";
231+
$nodesDiffXML = "";
226232
if (isSet($result["CREATED_NODE"]) || isSet($result["UPDATED_NODE"])) {
227-
$nodesDiff = XMLWriter::writeNodesDiff(array((isSet($result["UPDATED_NODE"])?"UPDATE":"ADD") => array($result[(isSet($result["UPDATED_NODE"])?"UPDATED":"CREATED")."_NODE"])), false);
233+
$nodesDiffXML = $nodesDiff->toXML();
228234
}
229235
$response = $response->withHeader("Content-type", "text/xml; charset=UTF-8");
230-
$response->getBody()->write(XMLWriter::wrapDocument($nodesDiff));
236+
$response->getBody()->write(XMLWriter::wrapDocument($nodesDiffXML));
231237

232238
/* for further implementation */
233239
if (!isSet($result["PREVENT_NOTIF"])) {

0 commit comments

Comments
 (0)