parentid = remositoryRepository::getParam($_REQUEST, 'parentid', 0); $_REQUEST['act'] = 'containers'; } public function listTask () { // Get the search string that will constrain the list of containers displayed $search = trim( strtolower( remositoryRepository::getParam( $_POST, 'search', '' ) ) ); // Get the flag that tells us whether to continue to nested containers right down to the bottom $descendants = intval(remositoryRepository::getParam($_POST, 'descendants', 0)); // Create the container above our present position - might be degenerate $container = new remositoryContainer($this->parentid); // Get all the containers that are to be displayed if ($descendants) { $folders = $container->getDescendants($this->admin->limitstart, $this->admin->limit, $search); $total = $container->countDescendants($search); } else { $folders = $container->getSelectedChildren($this->admin->limitstart, $this->admin->limit, $search); $total = $container->countChildren($search); } clearstatcache(); foreach ($folders as $key=>$folder) { if ($folder->filepath) { if ('/' != $folder->filepath[0] AND !preg_match('#^[a-z]:/#i', $folder->filepath)) $pathstatus = ''._DOWN_NOT_ABSOLUTE.''; elseif (file_exists($folder->filepath)) { if (is_writeable($folder->filepath)) $pathstatus = _DOWN_FILE_SYSTEM_OK; else $pathstatus = ''._DOWN_NOT_WRITEABLE.''; } else $pathstatus = ''._DOWN_DIRECTORY_NON_EXISTENT.''; } else $pathstatus = _DOWN_DATABASE; $folders[$key]->pathstatus = $pathstatus; } // Generate a container list for user to select where to be $manager = remositoryContainerManager::getInstance(); if ($manager->count() < 100) $clist = $container->getSelectList('parentid', 'class="inputbox" size="1" onchange="document.adminForm.submit();"', $this->remUser); else { $clist = _DOWN_MANY_CONTAINERS; $clist .= << HIDDEN_PARENT; } // Create and activate a View object $view = $this->admin->newHTMLClassCheck ('listContainersHTML', $this, $total, $clist); $view->view($container, $folders, $descendants, $search); } public function addTask () { // This is the parent container for our current location to generate clist $currparent = remositoryRepository::getParam($_REQUEST, 'currparent', 0); $container = new remositoryContainer($currparent); $interface = remositoryInterface::getInstance(); $subsinfo = $interface->triggerMambots('querySubscriptionCount', array('com_remository', 0, 0)); // Generate a container list so the user can change the parent $clist = $container->getSelectList('parentid', 'class="inputbox"', $this->remUser); // Now create empty container $container = new remositoryContainer(); // Create and activate a View object $view = $this->admin->newHTMLClassCheck ('editContainersHTML', $this, 0, $clist); foreach (self::$actions as $action) $selector[$action] = $this->getRoleSelect(null, $action); $view->view($container, $selector, count($subsinfo)); } public function editTask () { // Create a container object that will be filled with data from the DB using currid as key $container = new remositoryContainer($this->admin->currid); $parent = new remositoryContainer($container->parentid); if (0 == $container->id) { } $interface = remositoryInterface::getInstance(); $subsinfo = $interface->triggerMambots('querySubscriptionCount', array('com_remository', 0, 0)); // Generate a container list so the user can change the parent $clist = $parent->getSelectList('parentid', 'class="inputbox"', $this->remUser, $container->id); // Create and activate a View object $view = $this->admin->newHTMLClassCheck ('editContainersHTML', $this, 0, $clist); foreach (self::$actions as $action) $selector[$action] = $this->getRoleSelect($container, $action); $view->view($container, $selector, count($subsinfo)); } // This is a private function private function getRoleSelect ($container, $action) { $defaults = array( 'upload' => 'Registered', 'download' => 'Visitor', 'edit' => 'Nobody' ); $defaults['selfApprove'] = $this->repository->Enable_User_Autoapp ? 'Registered' : 'Nobody'; $authoriser = aliroAuthorisationAdmin::getInstance(); $roles = $authoriser->getAllRoles(true); if ($container) $selected = $authoriser->permittedRoles ($action, 'remosFolder', $container->id); elseif (isset($defaults[$action])) $selected = array($defaults[$action] => 1); else $selected = array(); foreach ($roles as $role=>$translated) $selector[] = $this->repository->makeOption($role, $translated); if (isset($selector)) return $this->repository->selectList ($selector, 'permit_'.$action.'[]', 'multiple="multiple"', array_keys($selected)); else return 'This is the role selector'; } public function saveTask () { $container = $this->commonSave(); // Next we locate ourselves where this container has finished up and list containers $this->parentid = $container->parentid; $this->listTask(); } public function applyTask () { $this->commonSave(); $this->editTask(); } private function commonSave () { // Create a container object that will be filled with data from the DB using currid as key $container = new remositoryContainer($this->admin->currid); // Clear tick box fields as nothing will be received if they are unticked $container->published = $container->plaintext = 0; // Add the new information from the form just submitted $container->addPostData(); if ($container->plaintext) $container->filepath = ''; // By default, a new container is automatically published if ($this->admin->currid == 0) $container->published = 1; // Check for anomalies in the file path specified, if any $container->checkFilePath(); // If fields are to be inherited by descendants, do it $inheritpath = empty($_POST['inheritpath']) ? false : true; if ($inheritpath) $container->makeDescendantsInherit(); $inherit = empty($_POST['inherit']) ? false : true; // Save the new information about the container to the database $container->saveValues (); // Handle the permissions $this->savePermissions($container, $inherit); // Update the memorandum fields held in any files within this container remositoryFile::storeMemoFields($container, $inheritpath); // Move files as necessary $this->relocateFilesCorrectly(); // Remove any orphan entries in the blob table remositoryRepository::doSQL("DELETE LOW_PRIORITY #__downloads_blob FROM #__downloads_blob LEFT JOIN #__downloads_files ON #__downloads_blob.fileid = #__downloads_files.id WHERE #__downloads_files.id IS NULL"); // The changes may well have altered the file/folder counts, so recalculate $this->repository->resetCounts(); return $container; } // Private function for tidiness private function savePermissions ($container, $inherit) { $authoriser = aliroAuthorisationAdmin::getInstance(); $interface = remositoryInterface::getInstance(); foreach (self::$actions as $action) { $this->dropPermissions($authoriser, $action, $container, $inherit); $roles = remositoryRepository::getParam($_POST, 'permit_'.$action, array()); if (in_array('Visitor', $roles)) continue; if (in_array('Registered', $roles)) { $this->grantPermissions($authoriser, 'Registered', $action, $container, $inherit); continue; } $extra = remositoryRepository::getParam($_POST, 'new_role_'.$action); if ($extra) $roles[] = $extra; foreach ($roles as $role) { $role = $interface->getEscaped($role); if ('none' != $role) $this->grantPermissions($authoriser, $role, $action, $container, $inherit); } } } private function dropPermissions ($authoriser, $action, $container, $inherit) { $authoriser->dropPermissions($action, 'remosFolder', $container->id); if ($inherit) { $descendants = $container->getDescendants(); foreach ($descendants as $descendant) $authoriser->dropPermissions($action, 'remosFolder', $descendant->id); } } private function grantPermissions ($authoriser, $role, $action, $container, $inherit) { $authoriser->permit ($role, 2, $action, 'remosFolder', $container->id); if ($inherit) { $descendants = $container->getDescendants(); foreach ($descendants as $descendant) $authoriser->permit ($role, 2, $action, 'remosFolder', $descendant->id); } } public function deleteTask (){ // In case the Javascript cannot do the check, ensure at least one item selected $this->admin->check_selection(_DOWN_SEL_FILE_DEL); // For each selected container, create an object then delete (will delete from DB) $authoriser = aliroAuthorisationAdmin::getInstance(); foreach ($this->admin->cfid as $id) { $container = new remositoryContainer($id); foreach (self::$actions as $action) $this->dropPermissions($authoriser, $action, $container, false); $this->parentid = $container->parentid; $container->deleteAll(); } // The file/folder counts will have been upset, so recalculate $this->repository->resetCounts(); // Now show the list of containers again $this->listTask(); } public function publishTask () { $this->publishToggle(1); } public function unpublishTask () { $this->publishToggle(0); } private function publishToggle ($publish) { // Check that one or more items have been selected (Javascript may not have run) $this->admin->check_selection(_DOWN_PUB_PROMPT.($publish ? 'publish' : 'unpublish')); remositoryContainer::togglePublished($this->admin->cfid,$publish); // The file/folder counts only include published items, so recalculate $this->repository->resetCounts(); // List out the containers again if (isset($this->admin->cfid[0])) { $container = new remositoryContainer($this->admin->cfid[0]); $this->parentid = $container->parentid; } $this->listTask(); } }