public function Delete($mediaId, $newRevisionMediaId = NULL) { Debug::LogEntry('audit', 'IN', 'Media', 'Delete'); try { $dbh = PDOConnect::init(); // Check for links $sth = $dbh->prepare('SELECT * FROM lklayoutmedia WHERE MediaID = :mediaid'); $sth->execute(array('mediaid' => $mediaId)); if ($sth->fetch()) { $this->ThrowError(21, __('This media is in use, please retire it instead.')); } // Get the file name $sth = $dbh->prepare('SELECT StoredAs FROM media WHERE mediaID = :mediaid'); $sth->execute(array('mediaid' => $mediaId)); if (!($row = $sth->fetch())) { $this->ThrowError(22, __('Cannot locate the files for this media. Unable to delete.')); } // This will be used to delete the actual file (stored on disk) $fileName = Kit::ValidateParam($row['StoredAs'], _STRING); // Remove permission assignments $security = new MediaGroupSecurity($this->db); if (!$security->UnlinkAll($mediaId)) { throw new Exception("Error Processing Request", 1); } // Delete any assignments $link = new LkMediaDisplayGroup($this->db); if (!$link->UnlinkAllFromDisplayGroup($mediaId)) { $this->ThrowError(__('Unable to drop file assignments during display delete.')); } // Delete the media $sth = $dbh->prepare('DELETE FROM media WHERE MediaID = :mediaid'); $sth->execute(array('mediaid' => $mediaId)); // Delete the file itself (and any thumbs, etc) if (!$this->DeleteMediaFile($fileName)) { throw new Exception("Error Processing Request", 1); } // Bring back the previous revision of this media (if there is one) $sth = $dbh->prepare('SELECT IFNULL(MediaID, 0) AS MediaID FROM media WHERE EditedMediaID = :mediaid'); $sth->execute(array('mediaid' => $mediaId)); if ($editedMediaRow = $sth->fetch()) { // Unretire this edited record $editedMediaId = Kit::ValidateParam($editedMediaRow['MediaID'], _INT); if ($newRevisionMediaId == null) { // Bring back the old one $sth = $dbh->prepare('UPDATE media SET IsEdited = 0, EditedMediaID = NULL WHERE mediaid = :mediaid'); $sth->execute(array('mediaid' => $editedMediaId)); } else { // Link up the old one $sth = $dbh->prepare('UPDATE media SET EditedMediaID = :newRevisionMediaId WHERE mediaid = :mediaid'); $sth->execute(array('mediaid' => $editedMediaId, 'newRevisionMediaId' => $newRevisionMediaId)); } } return true; } catch (Exception $e) { Debug::LogEntry('error', $e->getMessage()); if (!$this->IsError()) { $this->SetError(23, __('Error deleting media.')); } return false; } }
/** * Permissions Edit */ public function Permissions() { $db =& $this->db; $user =& $this->user; $response = new ResponseManager(); Kit::ClassLoader('mediagroupsecurity'); Kit::ClassLoader('layoutmediagroupsecurity'); $layoutId = Kit::GetParam('layoutid', _POST, _INT); $regionId = Kit::GetParam('regionid', _POST, _STRING); $mediaId = Kit::GetParam('mediaid', _POST, _STRING); $groupIds = Kit::GetParam('groupids', _POST, _ARRAY); if (!$this->auth->modifyPermissions) { trigger_error(__('You do not have permissions to edit this layout'), E_USER_ERROR); } // Unlink all if ($this->assignedMedia) { $layoutMediaSecurity = new LayoutMediaGroupSecurity($db); if (!$layoutMediaSecurity->UnlinkAll($layoutId, $regionId, $mediaId)) { trigger_error(__('Unable to set permissions')); } } else { $mediaSecurity = new MediaGroupSecurity($db); if (!$mediaSecurity->UnlinkAll($mediaId)) { trigger_error(__('Unable to set permissions')); } } // Some assignments for the loop $lastGroupId = 0; $first = true; $view = 0; $edit = 0; $del = 0; // List of groupIds with view, edit and del assignments foreach ($groupIds as $groupPermission) { $groupPermission = explode('_', $groupPermission); $groupId = $groupPermission[0]; if ($first) { // First time through $first = false; $lastGroupId = $groupId; } if ($groupId != $lastGroupId) { // The groupId has changed, so we need to write the current settings to the db. // Link new permissions if ($this->assignedMedia) { if (!$layoutMediaSecurity->Link($layoutId, $regionId, $mediaId, $lastGroupId, $view, $edit, $del)) { trigger_error(__('Unable to set permissions')); } } else { if (!$mediaSecurity->Link($mediaId, $lastGroupId, $view, $edit, $del)) { trigger_error(__('Unable to set permissions')); } } // Reset $lastGroupId = $groupId; $view = 0; $edit = 0; $del = 0; } switch ($groupPermission[1]) { case 'view': $view = 1; break; case 'edit': $edit = 1; break; case 'del': $del = 1; break; } } // Need to do the last one if (!$first) { if ($this->assignedMedia) { if (!$layoutMediaSecurity->Link($layoutId, $regionId, $mediaId, $lastGroupId, $view, $edit, $del)) { trigger_error(__('Unable to set permissions')); } } else { if (!$mediaSecurity->Link($mediaId, $lastGroupId, $view, $edit, $del)) { trigger_error(__('Unable to set permissions')); } } } $response->SetFormSubmitResponse(__('Permissions Changed')); return $response; }
/** * Copys a Layout * @param <int> $oldLayoutId * @param <string> $newLayoutName * @param <int> $userId * @param <bool> $copyMedia Make copies of this layouts media * @return <int> */ public function Copy($oldLayoutId, $newLayoutName, $newDescription, $userId, $copyMedia = false) { try { $dbh = PDOConnect::init(); $currentdate = date("Y-m-d H:i:s"); $campaign = new Campaign($this->db); // Include to media data class? if ($copyMedia) { $mediaObject = new Media($this->db); $mediaSecurity = new MediaGroupSecurity($this->db); } // We need the old campaignid $oldCampaignId = $campaign->GetCampaignId($oldLayoutId); // The Layout ID is the old layout $SQL = ""; $SQL .= " INSERT INTO layout (layout, xml, userID, description, retired, duration, backgroundImageId, createdDT, modifiedDT, status) "; $SQL .= " SELECT :layout, xml, :userid, :description, retired, duration, backgroundImageId, :createddt, :modifieddt, status "; $SQL .= " FROM layout "; $SQL .= " WHERE layoutid = :layoutid"; $sth = $dbh->prepare($SQL); $sth->execute(array('layout' => $newLayoutName, 'description' => $newDescription, 'userid' => $userId, 'createddt' => $currentdate, 'modifieddt' => $currentdate, 'layoutid' => $oldLayoutId)); $newLayoutId = $dbh->lastInsertId(); // Create a campaign $newCampaignId = $campaign->Add($newLayoutName, 1, $userId); // Link them $campaign->Link($newCampaignId, $newLayoutId, 0); // Open the layout XML and parse for media nodes if (!$this->SetDomXml($newLayoutId)) { $this->ThrowError(25000, __('Unable to copy layout')); } // Handle the Background $sth = $dbh->prepare('SELECT mediaId FROM lklayoutmedia WHERE layoutId = :layoutId AND regionId = :regionId'); $sth->execute(array('layoutId' => $oldLayoutId, 'regionId' => 'background')); if ($row = $sth->fetch()) { // This layout does have a background image // Link it to the new one if (!($newLkId = $this->AddLk($newLayoutId, 'background', $row['mediaId']))) { throw new Exception(__('Unable to link background')); } } // Get all media nodes $xpath = new DOMXpath($this->DomXml); // Create an XPath to get all media nodes $mediaNodes = $xpath->query("//media"); Debug::LogEntry('audit', 'About to loop through media nodes', 'layout', 'Copy'); $copiesMade = array(); // On each media node, take the existing LKID and MediaID and create a new LK record in the database $sth = $dbh->prepare('SELECT StoredAs FROM media WHERE MediaID = :mediaid'); foreach ($mediaNodes as $mediaNode) { $mediaId = $mediaNode->getAttribute('id'); $type = $mediaNode->getAttribute('type'); // Store the old media id $oldMediaId = $mediaId; Debug::LogEntry('audit', sprintf('Media %s node found with id %d', $type, $mediaId), 'layout', 'Copy'); // If this is a non region specific type, then move on if ($this->IsRegionSpecific($type)) { // Generate a new media id $newMediaId = md5(Kit::uniqueId()); $mediaNode->setAttribute('id', $newMediaId); // Copy media security $security = new LayoutMediaGroupSecurity($this->db); $security->CopyAllForMedia($oldLayoutId, $newLayoutId, $mediaId, $newMediaId); continue; } // Library media assigned to the layout, it will have a lkid $lkId = $mediaNode->getAttribute('lkid'); // Get the regionId $regionNode = $mediaNode->parentNode; $regionId = $regionNode->getAttribute('id'); // Do we need to copy this media record? if ($copyMedia) { // Take this media item and make a hard copy of it. if (!($mediaId = $mediaObject->Copy($mediaId, $newLayoutName))) { throw new Exception("Error Processing Request", 1); } // Update the permissions for the new media record $mediaSecurity->Copy($oldMediaId, $mediaId); // Copied the media node, so set the ID $mediaNode->setAttribute('id', $mediaId); // Also need to set the options node // Get the stored as value of the new node $sth->execute(array('mediaid' => $mediaId)); if (!($row = $sth->fetch())) { $this->ThrowError(25000, __('Unable to find stored value of newly copied media')); } $fileName = Kit::ValidateParam($row['StoredAs'], _STRING); $newNode = $this->DomXml->createElement('uri', $fileName); // Find the old node $uriNodes = $mediaNode->getElementsByTagName('uri'); $uriNode = $uriNodes->item(0); // Replace it $uriNode->parentNode->replaceChild($newNode, $uriNode); // Update the permissions for this media on this layout $security = new LayoutMediaGroupSecurity($this->db); $security->CopyAllForMedia($oldLayoutId, $newLayoutId, $oldMediaId, $mediaId); } else { // We haven't copied the media file, therefore we only want to copy permissions once per region // this is due to https://github.com/xibosignage/xibo/issues/487 if (!isset($copiesMade[$regionId]) || !in_array($mediaId, $copiesMade[$regionId])) { // Update the permissions for this media on this layout $security = new LayoutMediaGroupSecurity($this->db); $security->CopyAllForMedia($oldLayoutId, $newLayoutId, $oldMediaId, $mediaId); $copiesMade[$regionId][] = $mediaId; } } // Add the database link for this media record if (!($newLkId = $this->AddLk($newLayoutId, $regionId, $mediaId))) { throw new Exception("Error Processing Request", 1); } // Set this LKID on the media node $mediaNode->setAttribute('lkid', $newLkId); } Debug::LogEntry('audit', 'Finished looping through media nodes', 'layout', 'Copy'); // Set the XML $this->SetLayoutXml($newLayoutId, $this->DomXml->saveXML()); // Layout permissions $security = new CampaignSecurity($this->db); $security->CopyAll($oldCampaignId, $newCampaignId); $security = new LayoutRegionGroupSecurity($this->db); $security->CopyAll($oldLayoutId, $newLayoutId); // Return the new layout id return $newLayoutId; } catch (Exception $e) { Debug::LogEntry('error', $e->getMessage()); if (!$this->IsError()) { $this->SetError(25000, __('Unable to Copy this Layout')); } return false; } }