Exemple #1
0
 public function Permissions()
 {
     // Check the token
     if (!Kit::CheckToken()) {
         trigger_error(__('Sorry the form has expired. Please refresh.'), E_USER_ERROR);
     }
     $db =& $this->db;
     $user =& $this->user;
     $response = new ResponseManager();
     $campaignId = Kit::GetParam('campaignId', _POST, _INT);
     $groupIds = Kit::GetParam('groupids', _POST, _ARRAY);
     $ownerId = Kit::GetParam('ownerId', _POST, _INT);
     $auth = $this->user->CampaignAuth($campaignId, true);
     if (!$auth->modifyPermissions) {
         trigger_error(__('You do not have permissions to edit this campaign'), E_USER_ERROR);
     }
     // Change the owner?
     if ($ownerId > 0) {
         // Update this Campaign with a new owner
         Campaign::setOwner($campaignId, $ownerId);
     }
     // Unlink all
     Kit::ClassLoader('campaignsecurity');
     $security = new CampaignSecurity($db);
     if (!$security->UnlinkAll($campaignId)) {
         trigger_error(__('Unable to set permissions'));
     }
     // Some assignments for the loop
     $lastGroupId = 0;
     $first = true;
     $view = 0;
     $edit = 0;
     $del = 0;
     $permissions = array();
     // 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 (!$security->Link($campaignId, $lastGroupId, $view, $edit, $del)) {
                 trigger_error(__('Unable to set permissions'));
             }
             // Store
             $permissions[] = array('groupId' => $lastGroupId, 'view' => $view, 'edit' => $edit, 'del' => $del);
             // 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 (!$security->Link($campaignId, $lastGroupId, $view, $edit, $del)) {
             trigger_error(__('Unable to set permissions'));
         }
         $permissions[] = array('groupId' => $lastGroupId, 'view' => $view, 'edit' => $edit, 'del' => $del);
     }
     $replaceInLayouts = Kit::GetParam('replaceInLayouts', _POST, _CHECKBOX);
     if ($replaceInLayouts) {
         Debug::LogEntry('audit', 'Permissions to push down: ' . json_encode($permissions), get_class(), __FUNCTION__);
         // Layout object to deal with layout information
         Kit::ClassLoader('layout');
         $layoutObject = new Layout($db);
         // Get all layouts for this Campaign
         foreach ($this->user->LayoutList(NULL, array('campaignId' => $campaignId)) as $layout) {
             // Set for ease of use
             $layoutId = $layout['layoutid'];
             Debug::LogEntry('audit', 'Processing permissions for layout id' . $layoutId, get_class(), __FUNCTION__);
             // Set the permissions on this layout (if its not the same one!)
             if ($layout['campaignid'] != $campaignId) {
                 // Set permissions on this Layout
                 $auth = $this->user->CampaignAuth($layout['campaignid'], true);
                 if ($auth->modifyPermissions) {
                     if (!$security->UnlinkAll($layout['campaignid'])) {
                         continue;
                     }
                     foreach ($permissions as $permission) {
                         $security->Link($layout['campaignid'], $permission['groupId'], $permission['view'], $permission['edit'], $permission['del']);
                     }
                 }
             }
             // Get all regions and media and set permissions on those too
             $layoutInformation = $layoutObject->LayoutInformation($layoutId);
             // Region and Media Security Class
             Kit::ClassLoader('layoutregiongroupsecurity');
             Kit::ClassLoader('layoutmediagroupsecurity');
             $layoutSecurity = new LayoutRegionGroupSecurity($this->db);
             $layoutMediaSecurity = new LayoutMediaGroupSecurity($this->db);
             foreach ($layoutInformation['regions'] as $region) {
                 // Make sure we have permission
                 $regionAuth = $this->user->RegionAssignmentAuth($region['ownerid'], $layoutId, $region['regionid'], true);
                 if (!$regionAuth->modifyPermissions) {
                     continue;
                 }
                 // Set the permissions on the region
                 // Unlink all
                 if (!$layoutSecurity->UnlinkAll($layoutId, $region['regionid'])) {
                     continue;
                 }
                 foreach ($permissions as $permission) {
                     if (!$layoutSecurity->Link($layoutId, $region['regionid'], $permission['groupId'], $permission['view'], $permission['edit'], $permission['del'])) {
                         trigger_error($layoutSecurity->GetErrorMessage(), E_USER_ERROR);
                     }
                 }
                 // Find all media nodes
                 foreach ($region['media'] as $media) {
                     $originalUserId = $media['userid'] == '' ? $layout['ownerid'] : $media['userid'];
                     // Make sure we have permission
                     $mediaAuth = $this->user->MediaAssignmentAuth($originalUserId, $layoutId, $region['regionid'], $media['mediaid'], true);
                     if (!$mediaAuth->modifyPermissions) {
                         continue;
                     }
                     // Set the permissions on the media node
                     if (!$layoutMediaSecurity->UnlinkAll($layoutId, $region['regionid'], $media['mediaid'])) {
                         continue;
                     }
                     foreach ($permissions as $permission) {
                         if (!$layoutMediaSecurity->Link($layoutId, $region['regionid'], $media['mediaid'], $permission['groupId'], $permission['view'], $permission['edit'], $permission['del'])) {
                             trigger_error($layoutMediaSecurity->GetErrorMessage(), E_USER_ERROR);
                         }
                     }
                 }
             }
         }
     }
     $response->SetFormSubmitResponse(__('Permissions Changed'));
     $response->Respond();
 }
 /**
  * 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;
     }
 }
Exemple #3
0
 /**
  * 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;
 }
 /**
  * Add Existing Media from the Library
  * @param [int] $user [A user object for the currently logged in user]
  * @param [int] $layoutId  [The LayoutID to Add on]
  * @param [int] $regionId  [The RegionID to Add on]
  * @param [array] $mediaList [A list of media ids from the library that should be added to to supplied layout/region]
  */
 public function AddFromLibrary($user, $layoutId, $regionId, $mediaList)
 {
     Debug::LogEntry('audit', 'IN', 'Region', 'AddFromLibrary');
     try {
         $dbh = PDOConnect::init();
         // Check that some media assignments have been made
         if (count($mediaList) == 0) {
             return $this->SetError(25006, __('No media to assign'));
         }
         // Loop through all the media
         foreach ($mediaList as $mediaId) {
             Debug::LogEntry('audit', 'Assigning MediaID: ' . $mediaId);
             $mediaId = Kit::ValidateParam($mediaId, _INT);
             // Get the type from this media
             $sth = $dbh->prepare('SELECT type FROM media WHERE mediaID = :mediaid');
             $sth->execute(array('mediaid' => $mediaId));
             if (!($row = $sth->fetch())) {
                 $this->ThrowError(__('Error getting type from a media item.'));
             }
             $mod = Kit::ValidateParam($row['type'], _WORD);
             try {
                 // Create the media object without any region and layout information
                 $module = ModuleFactory::createForMedia($mod, $mediaId, null, $user);
             } catch (Exception $e) {
                 return $this->SetError($e->getMessage());
             }
             // Check we have permissions to use this media (we will use this to copy the media later)
             if (!$module->auth->view) {
                 return $this->SetError(__('You have selected media that you no longer have permission to use. Please reload Library form.'));
             }
             if (!$module->SetRegionInformation($layoutId, $regionId)) {
                 return $this->SetError($module->GetErrorMessage());
             }
             if (!$module->UpdateRegion()) {
                 return $this->SetError($module->GetErrorMessage());
             }
             // Need to copy over the permissions from this media item & also the delete permission
             $security = new LayoutMediaGroupSecurity($this->db);
             $security->Link($layoutId, $regionId, $mediaId, $user->getGroupFromID($user->userid, true), $module->auth->view, $module->auth->edit, 1);
         }
         // Update layout status
         $layout = new Layout($this->db);
         $layout->SetValid($layoutId, true);
         return true;
     } catch (Exception $e) {
         Debug::LogEntry('error', $e->getMessage());
         if (!$this->IsError()) {
             $this->SetError(1, __('Unknown Error'));
         }
         return false;
     }
 }