protected function replaceVars($tplString, $mess, $rich = true) { $tplString = SystemTextEncoding::fromUTF8($tplString); $repoId = $this->getNode()->getRepositoryId(); if (ConfService::getRepositoryById($repoId) != null) { $repoLabel = ConfService::getRepositoryById($repoId)->getDisplay(); } else { $repoLabel = "Repository"; } $uLabel = ""; if (array_key_exists($this->getAuthor(), self::$usersCaches)) { if (self::$usersCaches[$this->getAuthor()] != 'AJXP_USER_DONT_EXISTS') { $uLabel = self::$usersCaches[$this->getAuthor()]; } } else { if (strstr($tplString, "AJXP_USER") !== false) { if (AuthService::userExists($this->getAuthor())) { $obj = ConfService::getConfStorageImpl()->createUserObject($this->getAuthor()); $uLabel = $obj->personalRole->filterParameterValue("core.conf", "USER_DISPLAY_NAME", AJXP_REPO_SCOPE_ALL, ""); self::$usersCaches[$this->getAuthor()] = $uLabel; } else { self::$usersCaches[$this->getAuthor()] = 'AJXP_USER_DONT_EXISTS'; } } } if (empty($uLabel)) { $uLabel = $this->getAuthor(); } $em = $rich ? "<em>" : ""; $me = $rich ? "</em>" : ""; $replaces = array("AJXP_NODE_PATH" => $em . $this->getRoot($this->getNode()->getPath()) . $me, "AJXP_NODE_LABEL" => $em . $this->getNode()->getLabel() . $me, "AJXP_PARENT_PATH" => $em . $this->getRoot(dirname($this->getNode()->getPath())) . $me, "AJXP_PARENT_LABEL" => $em . $this->getRoot(basename(dirname($this->getNode()->getPath()))) . $me, "AJXP_REPOSITORY_ID" => $em . $repoId . $me, "AJXP_REPOSITORY_LABEL" => $em . $repoLabel . $me, "AJXP_LINK" => $this->getMainLink(), "AJXP_USER" => $uLabel, "AJXP_DATE" => SystemTextEncoding::fromUTF8(AJXP_Utils::relativeDate($this->getDate(), $mess))); if ($replaces["AJXP_NODE_LABEL"] == $em . $me) { $replaces["AJXP_NODE_LABEL"] = $em . "[" . $replaces["AJXP_REPOSITORY_LABEL"] . "]" . $me; } if ($replaces["AJXP_PARENT_LABEL"] == $em . $me) { $replaces["AJXP_PARENT_LABEL"] = $em . "[" . $replaces["AJXP_REPOSITORY_LABEL"] . "]" . $me; } if ((strstr($tplString, "AJXP_TARGET_FOLDER") !== false || strstr($tplString, "AJXP_SOURCE_FOLDER")) && isset($this->secondaryNode)) { $p = $this->secondaryNode->getPath(); if ($this->secondaryNode->isLeaf()) { $p = $this->getRoot(dirname($p)); } $replaces["AJXP_TARGET_FOLDER"] = $replaces["AJXP_SOURCE_FOLDER"] = $em . $p . $me; } if ((strstr($tplString, "AJXP_TARGET_LABEL") !== false || strstr($tplString, "AJXP_SOURCE_LABEL") !== false) && isset($this->secondaryNode)) { $replaces["AJXP_TARGET_LABEL"] = $replaces["AJXP_SOURCE_LABEL"] = $em . $this->secondaryNode->getLabel() . $me; } return str_replace(array_keys($replaces), array_values($replaces), $tplString); }
/** * @param bool $public * @return String */ public function getDescription($public = false, $ownerLabel = null) { $m = ConfService::getMessages(); if (isset($this->options["USER_DESCRIPTION"]) && !empty($this->options["USER_DESCRIPTION"])) { if (isset($m[$this->options["USER_DESCRIPTION"]])) { return $m[$this->options["USER_DESCRIPTION"]]; } else { return $this->options["USER_DESCRIPTION"]; } } if (isset($this->parentId) && isset($this->owner)) { if (isset($this->options["CREATION_TIME"])) { $date = AJXP_Utils::relativeDate($this->options["CREATION_TIME"], $m); return str_replace(array("%date", "%user"), array($date, $ownerLabel != null ? $ownerLabel : $this->owner), $public ? $m["470"] : $m["473"]); } else { if ($public) { return $m["474"]; } else { return str_replace(array("%user"), array($ownerLabel != null ? $ownerLabel : $this->owner), $m["472"]); } } } else { if ($this->isWriteable() && isset($this->options["CREATION_TIME"])) { $date = AJXP_Utils::relativeDate($this->options["CREATION_TIME"], $m); if (isset($this->options["CREATION_USER"])) { return str_replace(array("%date", "%user"), array($date, $this->options["CREATION_USER"]), $m["471"]); } else { return str_replace(array("%date"), array($date), $m["470"]); } } else { return $m["474"]; } } }
/** * @param String $actionName * @param Array $httpVars * @param Array $fileVars */ public function switchActions($actionName, $httpVars, $fileVars) { $userSelection = new UserSelection($this->accessDriver->repository, $httpVars); $uniqNode = $userSelection->getUniqueNode(); $feedStore = AJXP_PluginsService::getInstance()->getUniqueActivePluginForType("feed"); $existingFeed = $uniqNode->retrieveMetadata(AJXP_META_SPACE_COMMENTS, false); if ($existingFeed == null) { $existingFeed = array(); } $mess = ConfService::getMessages(); switch ($actionName) { case "post_comment": $uId = AuthService::getLoggedUser()->getId(); $limit = $this->getFilteredOption("COMMENT_SIZE_LIMIT"); if (!empty($limit)) { $content = substr(AJXP_Utils::decodeSecureMagic($httpVars["content"]), 0, $limit); } else { $content = AJXP_Utils::decodeSecureMagic($httpVars["content"]); } $com = array("date" => time(), "author" => $uId, "content" => $content); $existingFeed[] = $com; if ($feedStore !== false) { $feedStore->persistMetaObject($uniqNode->getPath(), base64_encode($content), $uniqNode->getRepositoryId(), $uniqNode->getRepository()->securityScope(), $uniqNode->getRepository()->getOwner(), AuthService::getLoggedUser()->getId(), AuthService::getLoggedUser()->getGroupPath()); } else { $uniqNode->removeMetadata(AJXP_META_SPACE_COMMENTS, false); $uniqNode->setMetadata(AJXP_META_SPACE_COMMENTS, $existingFeed, false); } HTMLWriter::charsetHeader("application/json"); $com["hdate"] = AJXP_Utils::relativeDate($com["date"], $mess); $com["path"] = $uniqNode->getPath(); echo json_encode($com); break; case "load_comments_feed": HTMLWriter::charsetHeader("application/json"); if ($feedStore !== false) { $sortBy = isset($httpVars["sort_by"]) ? AJXP_Utils::decodeSecureMagic($httpVars["sort_by"]) : "date"; $sortDir = isset($httpVars["sort_dir"]) ? AJXP_Utils::decodeSecureMagic($httpVars["sort_dir"]) : "asc"; $offset = isset($httpVars["offset"]) ? intval($httpVars["offset"]) : 0; $limit = isset($httpVars["limit"]) ? intval($httpVars["limit"]) : 100; $uniqNode->loadNodeInfo(); $data = $feedStore->findMetaObjectsByIndexPath($this->accessDriver->repository->getId(), $uniqNode->getPath(), AuthService::getLoggedUser()->getId(), AuthService::getLoggedUser()->getGroupPath(), $offset, $limit, $sortBy, $sortDir, !$uniqNode->isLeaf()); $theFeed = array(); foreach ($data as $stdObject) { $rPath = substr($stdObject->path, strlen($uniqNode->getPath())); if ($rPath == false && $stdObject->path == $uniqNode->getPath()) { $rPath = ""; } $rPath = ltrim($rPath, "/"); $newItem = array("date" => $stdObject->date, "hdate" => AJXP_Utils::relativeDate($stdObject->date, $mess), "author" => $stdObject->author, "content" => base64_decode($stdObject->content), "path" => $stdObject->path, "rpath" => $rPath, "uuid" => $stdObject->uuid); if (isset($previous) && $previous["author"] == $newItem["author"] && $previous["path"] == $newItem["path"] && $previous["hdate"] == $newItem["hdate"]) { $theFeed[count($theFeed) - 1]["content"] .= '<br>' . $newItem["content"]; } else { $theFeed[] = $newItem; } $previous = $newItem; } echo json_encode($theFeed); } else { foreach ($existingFeed as &$item) { $item["hdate"] = AJXP_Utils::relativeDate($item["date"], $mess); } echo json_encode($existingFeed); } break; case "delete_comment": $data = json_decode($httpVars["comment_data"], true); if ($feedStore === false) { $reFeed = array(); if ($data["author"] != AuthService::getLoggedUser()->getId()) { break; } foreach ($existingFeed as $fElement) { if ($fElement["date"] == $data["date"] && $fElement["author"] == $data["author"] && $fElement["content"] == $data["content"]) { continue; } $fElement["hdate"] = AJXP_Utils::relativeDate($fElement["date"], $mess); $reFeed[] = $fElement; } $uniqNode->removeMetadata(AJXP_META_SPACE_COMMENTS, false); $uniqNode->setMetadata(AJXP_META_SPACE_COMMENTS, $reFeed, false); HTMLWriter::charsetHeader("application/json"); echo json_encode($reFeed); } else { $feedStore->dismissAlertById($data["uuid"], 1); } break; default: break; } }
public function applyAction($actionName, $httpVars, $fileVars) { $messages = ConfService::getMessages(); $repoId = $this->accessDriver->repository->getId(); if ($actionName == "search") { // TMP if (strpos($httpVars["query"], "keyword:") === 0) { $parts = explode(":", $httpVars["query"]); $this->applyAction("search_by_keyword", array("field" => $parts[1]), array()); return null; } require_once "Zend/Search/Lucene.php"; try { $index = $this->loadIndex($repoId, false); } catch (Exception $ex) { AJXP_XMLWriter::header(); if ($this->seemsCurrentlyIndexing($repoId, 3)) { AJXP_XMLWriter::sendMessage($messages["index.lucene.11"], null); } else { if (ConfService::backgroundActionsSupported() && !ConfService::currentContextIsCommandLine()) { AJXP_Controller::applyActionInBackground($repoId, "index", array()); sleep(2); AJXP_XMLWriter::triggerBgAction("check_index_status", array("repository_id" => $repoId), sprintf($messages["index.lucene.8"], "/"), true, 5); AJXP_XMLWriter::sendMessage($messages["index.lucene.7"], null); } else { AJXP_XMLWriter::sendMessage($messages["index.lucene.12"], null); } } AJXP_XMLWriter::close(); return null; } $textQuery = $httpVars["query"]; if ($this->getFilteredOption("AUTO_WILDCARD") === true && strlen($textQuery) > 0 && ctype_alnum($textQuery)) { if ($textQuery[0] == '"' && $textQuery[strlen($textQuery) - 1] == '"') { $textQuery = substr($textQuery, 1, -1); } else { if ($textQuery[strlen($textQuery) - 1] != "*") { $textQuery .= "*"; } } } if (strpos($textQuery, ":") !== false) { $textQuery = str_replace("ajxp_meta_ajxp_document_content:", "body:", $textQuery); $textQuery = $this->filterSearchRangesKeywords($textQuery); $query = "ajxp_scope:shared AND ({$textQuery})"; } else { if ((isset($this->metaFields) || $this->indexContent) && isset($httpVars["fields"])) { $sParts = array(); foreach (explode(",", $httpVars["fields"]) as $searchField) { if ($searchField == "filename") { $sParts[] = "basename:" . $textQuery; } else { if ($searchField == "ajxp_document_content") { $sParts[] = $textQuery; } else { if (in_array($searchField, $this->metaFields)) { $sParts[] = "ajxp_meta_" . $searchField . ":" . $textQuery; } else { if ($searchField == "ajxp_document_content") { $sParts[] = "title:" . $textQuery; $sParts[] = "body:" . $textQuery; $sParts[] = "keywords:" . $textQuery; } } } } } $query = implode(" OR ", $sParts); $query = "ajxp_scope:shared AND ({$query})"; $this->logDebug("Query : {$query}"); } else { $index->setDefaultSearchField("basename"); $query = $this->filterSearchRangesKeywords($textQuery); } } $this->setDefaultAnalyzer(); if ($query == "*") { $index->setDefaultSearchField("ajxp_node"); $query = "yes"; $hits = $index->find($query, "node_url", SORT_STRING); } else { $hits = $index->find($query); } $commitIndex = false; if (isset($httpVars['return_selection'])) { $returnNodes = array(); } else { AJXP_XMLWriter::header(); } $cursor = 0; if (isset($httpVars['limit'])) { $limit = intval($httpVars['limit']); } foreach ($hits as $hit) { // Backward compatibility $hit->node_url = preg_replace("#ajxp\\.[a-z_]+://#", "pydio://", $hit->node_url); if ($hit->serialized_metadata != null) { $meta = unserialize(base64_decode($hit->serialized_metadata)); if (isset($meta["ajxp_modiftime"])) { $meta["ajxp_relativetime"] = $meta["ajxp_description"] = $messages[4] . " " . AJXP_Utils::relativeDate($meta["ajxp_modiftime"], $messages); } $tmpNode = new AJXP_Node(SystemTextEncoding::fromUTF8($hit->node_url), $meta); } else { $tmpNode = new AJXP_Node(SystemTextEncoding::fromUTF8($hit->node_url), array()); $tmpNode->loadNodeInfo(); } if ($tmpNode->getRepositoryId() != $repoId) { $this->logDebug(__CLASS__, "Strange case, search retrieves a node from wrong repository!"); $index->delete($hit->id); $commitIndex = true; continue; } if (!file_exists($tmpNode->getUrl())) { $index->delete($hit->id); $commitIndex = true; continue; } if (!is_readable($tmpNode->getUrl())) { continue; } $basename = basename($tmpNode->getPath()); $isLeaf = $tmpNode->isLeaf(); if (!$this->accessDriver->filterNodeName($tmpNode->getPath(), $basename, $isLeaf, array("d" => true, "f" => true))) { continue; } $tmpNode->search_score = sprintf("%0.2f", $hit->score); if (isset($returnNodes)) { $returnNodes[] = $tmpNode; } else { AJXP_XMLWriter::renderAjxpNode($tmpNode); } $cursor++; if (isset($limit) && $cursor > $limit) { break; } } if (!isset($returnNodes)) { AJXP_XMLWriter::close(); } if ($commitIndex) { $index->commit(); } } else { if ($actionName == "search_by_keyword") { require_once "Zend/Search/Lucene.php"; $scope = "user"; try { $index = $this->loadIndex($repoId, false); } catch (Exception $ex) { AJXP_XMLWriter::header(); if (ConfService::backgroundActionsSupported() && !ConfService::currentContextIsCommandLine()) { AJXP_Controller::applyActionInBackground($repoId, "index", array()); AJXP_XMLWriter::triggerBgAction("check_index_status", array("repository_id" => $repoId), sprintf($messages["index.lucene.8"], "/"), true, 2); } AJXP_XMLWriter::sendMessage($messages["index.lucene.7"], null); AJXP_XMLWriter::close(); return null; } $sParts = array(); $searchField = $httpVars["field"]; if ($searchField == "ajxp_node") { $sParts[] = "{$searchField}:yes"; } else { $sParts[] = "{$searchField}:true"; } if ($scope == "user" && AuthService::usersEnabled()) { if (AuthService::getLoggedUser() == null) { throw new Exception("Cannot find current user"); } $sParts[] = "ajxp_scope:user"; $sParts[] = "ajxp_user:"******"ajxp_scope:shared"; } $query = implode(" AND ", $sParts); $this->logDebug("Query : {$query}"); $hits = $index->find($query); $commitIndex = false; if (isset($httpVars['return_selection'])) { $returnNodes = array(); } else { AJXP_XMLWriter::header(); } foreach ($hits as $hit) { // Backward compat with old protocols $hit->node_url = preg_replace("#ajxp\\.[a-z_]+://#", "pydio://", $hit->node_url); if ($hit->serialized_metadata != null) { $meta = unserialize(base64_decode($hit->serialized_metadata)); $tmpNode = new AJXP_Node(SystemTextEncoding::fromUTF8($hit->node_url), $meta); } else { $tmpNode = new AJXP_Node(SystemTextEncoding::fromUTF8($hit->node_url), array()); $tmpNode->loadNodeInfo(); } if (!file_exists($tmpNode->getUrl())) { $index->delete($hit->id); $commitIndex = true; continue; } if (!is_readable($tmpNode->getUrl())) { continue; } $basename = basename($tmpNode->getPath()); $isLeaf = $tmpNode->isLeaf(); if (!$this->accessDriver->filterNodeName($tmpNode->getPath(), $basename, $isLeaf, array("d" => true, "f" => true))) { continue; } $tmpNode->search_score = sprintf("%0.2f", $hit->score); if (isset($returnNodes)) { $returnNodes[] = $tmpNode; } else { AJXP_XMLWriter::renderAjxpNode($tmpNode); } } if (!isset($returnNodes)) { AJXP_XMLWriter::close(); } if ($commitIndex) { $index->commit(); } } } if (isset($returnNodes)) { return $returnNodes; } else { return null; } }
public static function getNodes($checkStats = false, $touch = true) { if (isset(self::$output)) { return self::$output; } $mess = ConfService::getMessages(); $repos = ConfService::getAccessibleRepositories(); $output = array(); $touchReposIds = array(); foreach ($repos as $repo) { if (!$repo->hasOwner() || !$repo->hasContentFilter()) { continue; } $repoId = $repo->getId(); if (strpos("ocs_remote_share_", $repoId) !== 0) { $touchReposIds[] = $repoId; } $url = "pydio://" . $repoId . "/"; $meta = array("shared_repository_id" => $repoId, "ajxp_description" => "File shared by " . $repo->getOwner() . " " . AJXP_Utils::relativeDate($repo->getOption("CREATION_TIME"), $mess), "share_meta_type" => 1); $cFilter = $repo->getContentFilter(); $filter = $cFilter instanceof ContentFilter ? array_keys($cFilter->filters)[0] : $cFilter; if (!is_array($filter)) { $label = basename($filter); } else { $label = $repo->getDisplay(); } if (strpos($repoId, "ocs_remote_share") !== 0) { // FOR REMOTE SHARES, DO NOT APPEND THE DOCUMENTNAME, WE STAT THE ROOT DIRECTLY $url .= $label; } $status = null; $remoteShare = null; $name = pathinfo($label, PATHINFO_FILENAME); $ext = pathinfo($label, PATHINFO_EXTENSION); $node = new AJXP_Node($url); $node->setLabel($label); if ($checkStats) { $node->getRepository()->driverInstance = null; try { ConfService::loadDriverForRepository($node->getRepository()); } catch (Exception $e) { $ext = "error"; $meta["ajxp_mime"] = "error"; } $node->getRepository()->detectStreamWrapper(true); $stat = @stat($url); if ($stat === false) { $ext = "error"; $meta["ajxp_mime"] = "error"; $meta["share_meta_type"] = 2; } else { if (strpos($repoId, "ocs_remote_share_") === 0) { // Check Status $linkId = str_replace("ocs_remote_share_", "", $repoId); $ocsStore = new \Pydio\OCS\Model\SQLStore(); $remoteShare = $ocsStore->remoteShareById($linkId); $status = $remoteShare->getStatus(); if ($status == OCS_INVITATION_STATUS_PENDING) { $stat = stat(AJXP_Utils::getAjxpTmpDir()); $ext = "invitation"; $meta["ajxp_mime"] = "invitation"; $meta["share_meta_type"] = 0; } else { $meta["remote_share_accepted"] = "true"; } $meta["remote_share_id"] = $remoteShare->getId(); } } if ($ext == "invitation") { $label .= " (" . $mess["inbox_driver.4"] . ")"; } else { if ($ext == "error") { $label .= " (" . $mess["inbox_driver.5"] . ")"; } } if (is_array($stat) && AuthService::getLoggedUser() != null) { $acl = AuthService::getLoggedUser()->mergedRole->getAcl($repoId); if ($acl == "r") { self::disableWriteInStat($stat); } } } $index = 0; $suffix = ""; while (isset($output[$name . $suffix . "." . $ext])) { $index++; $suffix = " ({$index})"; } $output[$name . $suffix . "." . $ext] = ["label" => $label, "url" => $url, "remote_share" => $remoteShare, "meta" => $meta]; if (isset($stat)) { $output[$name . $suffix . "." . $ext]['stat'] = $stat; } } ConfService::loadDriverForRepository(ConfService::getRepository()); self::$output = $output; if ($touch) { if (count($touchReposIds) && AuthService::getLoggedUser() != null) { $uPref = AuthService::getLoggedUser()->getPref("repository_last_connected"); if (empty($uPref)) { $uPref = array(); } foreach ($touchReposIds as $rId) { $uPref[$rId] = time(); } AuthService::getLoggedUser()->setPref("repository_last_connected", $uPref); } } return $output; }
public function loadUserAlerts($actionName, $httpVars, $fileVars) { if (!$this->eventStore) { return; } $u = AuthService::getLoggedUser(); $userId = $u->getId(); $repositoryFilter = null; if (isset($httpVars["repository_id"]) && $u->mergedRole->canRead($httpVars["repository_id"])) { $repositoryFilter = $httpVars["repository_id"]; } if ($repositoryFilter == null) { $repositoryFilter = ConfService::getRepository()->getId(); } $res = $this->eventStore->loadAlerts($userId, $repositoryFilter); if (!count($res)) { return; } // Recompute children notifs $format = $httpVars["format"]; $skipContainingTags = isset($httpVars["skip_container_tags"]); $mess = ConfService::getMessages(); if (!$skipContainingTags) { if ($format == "html") { echo "<h2>" . $mess["notification_center.3"] . "</h2>"; echo "<ul class='notification_list'>"; } else { AJXP_XMLWriter::header(); } } $parentRepository = ConfService::getRepositoryById($repositoryFilter); $parentRoot = $parentRepository->getOption("PATH"); $cumulated = array(); foreach ($res as $notification) { if ($format == "html") { echo "<li>"; echo $notification->getDescriptionLong(true); echo "</li>"; } else { $node = $notification->getNode(); $path = $node->getPath(); $nodeRepo = $node->getRepository(); if ($nodeRepo != null && $nodeRepo->hasParent() && $nodeRepo->getParentId() == $repositoryFilter) { $currentRoot = $nodeRepo->getOption("PATH"); $contentFilter = $nodeRepo->getContentFilter(); if (isset($contentFilter)) { $nodePath = $contentFilter->filterExternalPath($node->getPath()); if ($nodePath == "/") { $k = array_keys($contentFilter->filters); $nodePath = $k[0]; } } else { $nodePath = $node->getPath(); } $relative = rtrim(substr($currentRoot, strlen($parentRoot)), "/") . rtrim($nodePath, "/"); $parentNodeURL = $node->getScheme() . "://" . $repositoryFilter . $relative; $this->logDebug("action.share", "Recompute alert to " . $parentNodeURL); $node = new AJXP_Node($parentNodeURL); } if (isset($cumulated[$path])) { $cumulated[$path]->event_occurence++; continue; } try { $node->loadNodeInfo(); } catch (Exception $e) { if ($notification->alert_id) { $this->eventStore->dismissAlertById($notification->alert_id); } continue; } $node->event_is_alert = true; $node->event_description = ucfirst($notification->getDescriptionBlock()) . " " . $mess["notification.tpl.block.user_link"] . " " . $notification->getAuthorLabel(); $node->event_description_long = $notification->getDescriptionLong(true); $node->event_date = SystemTextEncoding::fromUTF8(AJXP_Utils::relativeDate($notification->getDate(), $mess)); $node->event_type = "alert"; $node->alert_id = $notification->alert_id; if ($node->getRepository() != null) { $node->repository_id = '' . $node->getRepository()->getId(); if ($node->repository_id != $repositoryFilter && $node->getRepository()->getDisplay() != null) { $node->event_repository_label = "[" . $node->getRepository()->getDisplay() . "]"; } } else { $node->event_repository_label = "[N/A]"; } $node->event_author = $notification->getAuthor(); $node->event_occurence = 1; $cumulated[$path] = $node; } } $index = 1; foreach ($cumulated as $nodeToSend) { $nodeOcc = $nodeToSend->event_occurence > 1 ? "(" . $nodeToSend->event_occurence . ")" : ""; if (isset($httpVars["merge_description"]) && $httpVars["merge_description"] == "true") { if (isset($httpVars["description_as_label"]) && $httpVars["description_as_label"] == "true") { $nodeToSend->setLabel($nodeToSend->event_description . " " . $nodeOcc . " " . $nodeToSend->event_date); } else { $nodeToSend->setLabel(basename($nodeToSend->getPath()) . " " . $nodeOcc . " " . " <small class='notif_desc'>" . $nodeToSend->event_description . " " . $nodeToSend->event_date . "</small>"); } } else { $nodeToSend->setLabel(basename($nodeToSend->getPath()) . $nodeOcc); } // Replace PATH $nodeToSend->real_path = $path; //$url = parse_url($nodeToSend->getUrl()); //$nodeToSend->setUrl($url["scheme"]."://".$url["host"]."/alert_".$index); $index++; AJXP_XMLWriter::renderAjxpNode($nodeToSend); } if (!$skipContainingTags) { if ($format == "html") { echo "</ul>"; } else { AJXP_XMLWriter::close(); } } }
public function loadUserAlerts($actionName, $httpVars, $fileVars) { if (!$this->eventStore) { return; } $u = AuthService::getLoggedUser(); $userId = $u->getId(); $repositoryFilter = null; if (isset($httpVars["repository_id"]) && $u->mergedRole->canRead($httpVars["repository_id"])) { $repositoryFilter = $httpVars["repository_id"]; } $res = $this->eventStore->loadAlerts($userId, $repositoryFilter); if ($repositoryFilter == null) { $repositoryFilter = ConfService::getRepository()->getId(); } if (!count($res)) { return; } $format = $httpVars["format"]; $skipContainingTags = isset($httpVars["skip_container_tags"]); $mess = ConfService::getMessages(); if (!$skipContainingTags) { if ($format == "html") { echo "<h2>" . $mess["notification_center.3"] . "</h2>"; echo "<ul class='notification_list'>"; } else { AJXP_XMLWriter::header(); } } $cumulated = array(); foreach ($res as $notification) { if ($format == "html") { echo "<li>"; echo $notification->getDescriptionLong(true); echo "</li>"; } else { $node = $notification->getNode(); $path = $node->getPath(); if (isset($cumulated[$path])) { $cumulated[$path]->event_occurence++; continue; } try { $node->loadNodeInfo(); } catch (Exception $e) { continue; } $node->event_is_alert = true; $node->event_description = ucfirst($notification->getDescriptionBlock()) . " " . $mess["notification.tpl.block.user_link"] . " " . $notification->getAuthor(); $node->event_description_long = $notification->getDescriptionLong(true); $node->event_date = AJXP_Utils::relativeDate($notification->getDate(), $mess); $node->event_type = "alert"; $node->alert_id = $notification->alert_id; if ($node->getRepository() != null) { $node->repository_id = '' . $node->getRepository()->getId(); if ($node->repository_id != $repositoryFilter && $node->getRepository()->getDisplay() != null) { $node->event_repository_label = "[" . $node->getRepository()->getDisplay() . "]"; } } else { $node->event_repository_label = "[N/A]"; } $node->event_author = $notification->getAuthor(); $node->event_occurence = 1; $cumulated[$path] = $node; } } $index = 1; foreach ($cumulated as $nodeToSend) { if ($nodeToSend->event_occurence > 1) { $nodeToSend->setLabel(basename($nodeToSend->getPath()) . " (" . $nodeToSend->event_occurence . ")"); } else { $nodeToSend->setLabel(basename($nodeToSend->getPath())); } // Replace PATH $nodeToSend->real_path = $path; $url = parse_url($nodeToSend->getUrl()); $nodeToSend->setUrl($url["scheme"] . "://" . $url["host"] . "/alert_" . $index); $index++; AJXP_XMLWriter::renderAjxpNode($nodeToSend); } if (!$skipContainingTags) { if ($format == "html") { echo "</ul>"; } else { AJXP_XMLWriter::close(); } } }
/** * @param AJXP_Node $ajxpNode * @param bool $parentNode * @param bool $details * @return void */ public function loadNodeInfo(&$ajxpNode, $parentNode = false, $details = false) { $mess = ConfService::getMessages(); $nodeName = basename($ajxpNode->getPath()); $metaData = $ajxpNode->metadata; if (!isset($metaData["is_file"])) { $isLeaf = is_file($ajxpNode->getUrl()) || AJXP_Utils::isBrowsableArchive($nodeName); $metaData["is_file"] = $isLeaf ? "1" : "0"; } else { $isLeaf = $metaData["is_file"] == "1" ? true : false; } $metaData["filename"] = $ajxpNode->getPath(); if (RecycleBinManager::recycleEnabled() && $ajxpNode->getPath() == RecycleBinManager::getRelativeRecycle()) { $recycleIcon = $this->countFiles($ajxpNode->getUrl(), false, true) > 0 ? "trashcan_full.png" : "trashcan.png"; $metaData["icon"] = $recycleIcon; $metaData["mimestring"] = $mess[122]; $ajxpNode->setLabel($mess[122]); $metaData["ajxp_mime"] = "ajxp_recycle"; } else { $mimeData = AJXP_Utils::mimeData($ajxpNode->getUrl(), !$isLeaf); $metaData["mimestring_id"] = $mimeData[0]; //AJXP_Utils::mimetype($ajxpNode->getUrl(), "type", !$isLeaf); $metaData["icon"] = $mimeData[1]; //AJXP_Utils::mimetype($nodeName, "image", !$isLeaf); if ($metaData["icon"] == "folder.png") { $metaData["openicon"] = "folder_open.png"; } if (!$isLeaf) { $metaData["ajxp_mime"] = "ajxp_folder"; } } //if ($lsOptions["l"]) { $metaData["file_group"] = @filegroup($ajxpNode->getUrl()) || "unknown"; $metaData["file_owner"] = @fileowner($ajxpNode->getUrl()) || "unknown"; $crtPath = $ajxpNode->getPath(); $vRoots = $this->repository->listVirtualRoots(); $metaData["ajxp_readonly"] = "false"; if (!@$this->isWriteable($ajxpNode->getUrl())) { $metaData["ajxp_readonly"] = "true"; } if (!empty($crtPath)) { if (isset($vRoots[ltrim($crtPath, "/")])) { $metaData["ajxp_readonly"] = $vRoots[ltrim($crtPath, "/")]["right"] == "r" ? "true" : "false"; } } else { if (count($vRoots)) { $metaData["ajxp_readonly"] = "true"; } } $fPerms = @fileperms($ajxpNode->getUrl()); if ($fPerms !== false) { $fPerms = substr(decoct($fPerms), $isLeaf ? 2 : 1); } else { $fPerms = '0000'; } $metaData["file_perms"] = $fPerms; $datemodif = $this->date_modif($ajxpNode->getUrl()); $metaData["ajxp_modiftime"] = $datemodif ? $datemodif : "0"; $metaData["ajxp_description"] = $metaData["ajxp_relativetime"] = $mess[4] . " " . AJXP_Utils::relativeDate($datemodif, $mess); $metaData["bytesize"] = 0; if ($isLeaf) { $metaData["bytesize"] = filesize($ajxpNode->getUrl()); } $metaData["filesize"] = AJXP_Utils::roundSize($metaData["bytesize"]); if (AJXP_Utils::isBrowsableArchive($nodeName)) { $metaData["ajxp_mime"] = "ajxp_browsable_archive"; } if ($details == "minimal") { $miniMeta = array("is_file" => $metaData["is_file"], "filename" => $metaData["filename"], "bytesize" => $metaData["bytesize"], "ajxp_modiftime" => $metaData["ajxp_modiftime"]); $ajxpNode->mergeMetadata($miniMeta); } else { $ajxpNode->mergeMetadata($metaData); } }
public function listUsers($root, $child, $hashValue = null, $returnNodes = false, $findNodePosition = null) { $USER_PER_PAGE = 50; if ($root == "users") { $baseGroup = "/"; } else { $baseGroup = substr($root, strlen("users")); } if ($findNodePosition != null && $hashValue == null) { // Add groups offset $groups = AuthService::listChildrenGroups($baseGroup); $offset = 0; if (count($groups)) { $offset = count($groups); } $position = AuthService::findUserPage($baseGroup, $findNodePosition, $USER_PER_PAGE); if ($position != -1) { $key = "/data/" . $root . "/" . $findNodePosition; $data = array($key => AJXP_XMLWriter::renderNode($key, $findNodePosition, true, array("page_position" => $position), true, false)); return $data; } else { // Loop on each page to find the correct page. $count = AuthService::authCountUsers($baseGroup); $pages = ceil($count / $USER_PER_PAGE); for ($i = 0; $i < $pages; $i++) { $tests = $this->listUsers($root, $child, $i + 1, true, $findNodePosition); if (is_array($tests) && isset($tests["/data/" . $root . "/" . $findNodePosition])) { return array("/data/" . $root . "/" . $findNodePosition => str_replace("ajxp_mime", "page_position='" . ($i + 1) . "' ajxp_mime", $tests["/data/" . $root . "/" . $findNodePosition])); } } } return array(); } $allNodes = array(); $columns = '<columns switchDisplayMode="list" switchGridMode="filelist" template_name="ajxp_conf.users"> <column messageId="ajxp_conf.6" attributeName="ajxp_label" sortType="String" defaultWidth="40%"/> <column messageId="ajxp_conf.102" attributeName="object_id" sortType="String" defaultWidth="10%"/> <column messageId="ajxp_conf.7" attributeName="isAdmin" sortType="String" defaultWidth="10%"/> <column messageId="ajxp_conf.70" attributeName="ajxp_roles" sortType="String" defaultWidth="15%"/> <column messageId="ajxp_conf.62" attributeName="rights_summary" sortType="String" defaultWidth="15%"/> </columns>'; if (AuthService::driverSupportsAuthSchemes()) { $columns = '<columns switchDisplayMode="list" switchGridMode="filelist" template_name="ajxp_conf.users_authscheme"> <column messageId="ajxp_conf.6" attributeName="ajxp_label" sortType="String" defaultWidth="40%"/> <column messageId="ajxp_conf.102" attributeName="object_id" sortType="String" defaultWidth="10%"/> <column messageId="ajxp_conf.115" attributeName="auth_scheme" sortType="String" defaultWidth="5%"/> <column messageId="ajxp_conf.7" attributeName="isAdmin" sortType="String" defaultWidth="5%"/> <column messageId="ajxp_conf.70" attributeName="ajxp_roles" sortType="String" defaultWidth="15%"/> <column messageId="ajxp_conf.62" attributeName="rights_summary" sortType="String" defaultWidth="15%"/> </columns>'; } if (!$returnNodes) { AJXP_XMLWriter::sendFilesListComponentConfig($columns); } if (!AuthService::usersEnabled()) { return array(); } if (empty($hashValue)) { $hashValue = 1; } $count = AuthService::authCountUsers($baseGroup, "", null, null, false); if (AuthService::authSupportsPagination() && $count >= $USER_PER_PAGE) { $offset = ($hashValue - 1) * $USER_PER_PAGE; if (!$returnNodes) { AJXP_XMLWriter::renderPaginationData($count, $hashValue, ceil($count / $USER_PER_PAGE)); } $users = AuthService::listUsers($baseGroup, "", $offset, $USER_PER_PAGE, true, false); if ($hashValue == 1) { $groups = AuthService::listChildrenGroups($baseGroup); } else { $groups = array(); } } else { $users = AuthService::listUsers($baseGroup, "", -1, -1, true, false); $groups = AuthService::listChildrenGroups($baseGroup); } $groupAdmin = AuthService::getLoggedUser() != null && AuthService::getLoggedUser()->getGroupPath() != "/"; if ($this->getName() == "ajxp_admin" && $baseGroup == "/" && $hashValue == 1 && !$groupAdmin) { $nodeKey = "/data/" . $root . "/"; $meta = array("icon" => "users-folder.png", "icon_class" => "icon-home", "ajxp_mime" => "group", "object_id" => "/"); $mess = ConfService::getMessages(); $xml = AJXP_XMLWriter::renderNode($nodeKey, $mess["ajxp_conf.151"], true, $meta, true, false); if (!$returnNodes) { print $xml; } else { $allNodes[$nodeKey] = $xml; } } foreach ($groups as $groupId => $groupLabel) { $nodeKey = "/data/" . $root . "/" . ltrim($groupId, "/"); $meta = array("icon" => "users-folder.png", "icon_class" => "icon-folder-close", "ajxp_mime" => "group", "object_id" => $groupId); if (in_array($nodeKey, $this->currentBookmarks)) { $meta = array_merge($meta, array("ajxp_bookmarked" => "true", "overlay_icon" => "bookmark.png")); } $xml = AJXP_XMLWriter::renderNode($nodeKey, $groupLabel, false, $meta, true, false); if (!$returnNodes) { print $xml; } else { $allNodes[$nodeKey] = $xml; } } $mess = ConfService::getMessages(); $loggedUser = AuthService::getLoggedUser(); $userArray = array(); $logger = AJXP_Logger::getInstance(); if (method_exists($logger, "usersLastConnection")) { $allUserIds = array(); } foreach ($users as $userObject) { $label = $userObject->getId(); if (isset($allUserIds)) { $allUserIds[] = $label; } if ($userObject->hasParent()) { $label = $userObject->getParent() . "000" . $label; } else { $children = ConfService::getConfStorageImpl()->getUserChildren($label); foreach ($children as $addChild) { $userArray[$label . "000" . $addChild->getId()] = $addChild; } } $userArray[$label] = $userObject; } if (isset($allUserIds) && count($allUserIds)) { $connections = $logger->usersLastConnection($allUserIds); } ksort($userArray); foreach ($userArray as $userObject) { $repos = ConfService::getConfStorageImpl()->listRepositories($userObject); $isAdmin = $userObject->isAdmin(); $userId = $userObject->getId(); $icon = "user" . ($userId == "guest" ? "_guest" : ($isAdmin ? "_admin" : "")); $iconClass = "icon-user"; if ($userObject->hasParent()) { $icon = "user_child"; $iconClass = "icon-angle-right"; } if ($isAdmin) { $rightsString = $mess["ajxp_conf.63"]; } else { $r = array(); foreach ($repos as $repoId => $repository) { if ($repository->getAccessType() == "ajxp_shared") { continue; } if (!$userObject->canRead($repoId) && !$userObject->canWrite($repoId)) { continue; } $rs = $userObject->canRead($repoId) ? "r" : ""; $rs .= $userObject->canWrite($repoId) ? "w" : ""; $r[] = $repository->getDisplay() . " (" . $rs . ")"; } $rightsString = implode(", ", $r); } $nodeLabel = $userId; $test = $userObject->personalRole->filterParameterValue("core.conf", "USER_DISPLAY_NAME", AJXP_REPO_SCOPE_ALL, ""); if (!empty($test)) { $nodeLabel = $test; } $scheme = AuthService::getAuthScheme($userId); $nodeKey = "/data/{$root}/" . $userId; $roles = array_filter(array_keys($userObject->getRoles()), array($this, "filterReservedRoles")); $meta = array("isAdmin" => $mess[$isAdmin ? "ajxp_conf.14" : "ajxp_conf.15"], "icon" => $icon . ".png", "icon_class" => $iconClass, "object_id" => $userId, "auth_scheme" => $scheme != null ? $scheme : "", "rights_summary" => $rightsString, "ajxp_roles" => implode(", ", $roles), "ajxp_mime" => "user" . ($userId != "guest" && $userId != $loggedUser->getId() ? "_editable" : ""), "json_merged_role" => json_encode($userObject->mergedRole->getDataArray(true))); if ($userObject->hasParent()) { $meta["shared_user"] = "******"; } if (isset($connections) && isset($connections[$userObject->getId()]) && !empty($connections[$userObject->getId()])) { $meta["last_connection"] = strtotime($connections[$userObject->getId()]); $meta["last_connection_readable"] = AJXP_Utils::relativeDate($meta["last_connection"], $mess); } if (in_array($nodeKey, $this->currentBookmarks)) { $meta = array_merge($meta, array("ajxp_bookmarked" => "true", "overlay_icon" => "bookmark.png")); } $xml = AJXP_XMLWriter::renderNode($nodeKey, $nodeLabel, true, $meta, true, false); if (!$returnNodes) { print $xml; } else { $allNodes[$nodeKey] = $xml; } } return $allNodes; }
protected function replaceVars($tplString, $mess, $rich = true) { $tplString = SystemTextEncoding::fromUTF8($tplString); $repoId = $this->getNode()->getRepositoryId(); $repoObject = ConfService::getRepositoryById($repoId); if ($repoObject != null) { $repoLabel = $repoObject->getDisplay(); } else { $repoLabel = "Repository"; } $uLabel = ""; if (strstr($tplString, "AJXP_USER") !== false) { $uLabel = $this->getAuthorLabel(); } $em = $rich ? "<em>" : ""; $me = $rich ? "</em>" : ""; $replaces = array("AJXP_NODE_PATH" => $em . $this->getRoot($this->getNode()->getPath()) . $me, "AJXP_NODE_LABEL" => $em . $this->getNode()->getLabel() . $me, "AJXP_PARENT_PATH" => $em . $this->getRoot(dirname($this->getNode()->getPath())) . $me, "AJXP_PARENT_LABEL" => $em . $this->getRoot(basename(dirname($this->getNode()->getPath()))) . $me, "AJXP_REPOSITORY_ID" => $em . $repoId . $me, "AJXP_REPOSITORY_LABEL" => $em . $repoLabel . $me, "AJXP_LINK" => $this->getMainLink(), "AJXP_USER" => $uLabel, "AJXP_DATE" => SystemTextEncoding::fromUTF8(AJXP_Utils::relativeDate($this->getDate(), $mess))); if ($replaces["AJXP_NODE_LABEL"] == $em . $me || $replaces["AJXP_NODE_LABEL"] == $em . "/" . $me) { $replaces["AJXP_NODE_LABEL"] = $replaces["AJXP_REPOSITORY_LABEL"]; } if ($replaces["AJXP_PARENT_LABEL"] == $em . $me || $replaces["AJXP_PARENT_LABEL"] == $em . "/" . $me) { $replaces["AJXP_PARENT_LABEL"] = $replaces["AJXP_REPOSITORY_LABEL"]; } if ((strstr($tplString, "AJXP_TARGET_FOLDER") !== false || strstr($tplString, "AJXP_SOURCE_FOLDER")) && isset($this->secondaryNode)) { $p = $this->secondaryNode->getPath(); if ($this->secondaryNode->isLeaf()) { $p = $this->getRoot(dirname($p)); } $replaces["AJXP_TARGET_FOLDER"] = $replaces["AJXP_SOURCE_FOLDER"] = $em . $p . $me; } if ((strstr($tplString, "AJXP_TARGET_LABEL") !== false || strstr($tplString, "AJXP_SOURCE_LABEL") !== false) && isset($this->secondaryNode)) { $replaces["AJXP_TARGET_LABEL"] = $replaces["AJXP_SOURCE_LABEL"] = $em . $this->secondaryNode->getLabel() . $me; } return str_replace(array_keys($replaces), array_values($replaces), $tplString); }