. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AnonSec Shell
AnonSec Shell
Server IP : 94.23.64.18  /  Your IP : 216.73.216.185   [ Reverse IP ]
Web Server : Apache
System : Linux webm005.cluster107.gra.hosting.ovh.net 5.15.167-ovh-vps-grsec-zfs-classid #1 SMP Tue Sep 17 08:14:20 UTC 2024 x86_64
User : villadal ( 6036)
PHP Version : 7.4.33
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
Domains : 2 Domains
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/villadal/www/old/booked/Presenters/Admin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     [ BACKUP SHELL ]     [ JUMPING ]     [ MASS DEFACE ]     [ SCAN ROOT ]     [ SYMLINK ]     

Current File : /home/villadal/www/old/booked/Presenters/Admin/ManageResourcesPresenter.php
<?php
/**
Copyright 2011-2014 Nick Korbel

This file is part of Booked Scheduler.

Booked Scheduler is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Booked Scheduler is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Booked Scheduler.  If not, see <http://www.gnu.org/licenses/>.
 */

require_once(ROOT_DIR . 'Domain/namespace.php');
require_once(ROOT_DIR . 'Domain/Access/namespace.php');
require_once(ROOT_DIR . 'lib/Graphics/namespace.php');
require_once(ROOT_DIR . 'Presenters/ActionPresenter.php');

class ManageResourcesActions
{
	const ActionAdd = 'add';
	const ActionChangeAdmin = 'changeAdmin';
	const ActionChangeConfiguration = 'configuration';
	const ActionChangeDescription = 'description';
	const ActionChangeImage = 'image';
	const ActionChangeLocation = 'location';
	const ActionChangeNotes = 'notes';
	const ActionChangeSchedule = 'schedule';
	const ActionRemoveImage = 'removeImage';
	const ActionRename = 'rename';
	const ActionDelete = 'delete';
	const ActionChangeStatus = 'changeStatus';
	const ActionEnableSubscription = 'enableSubscription';
	const ActionDisableSubscription = 'disableSubscription';
	const ActionChangeAttributes = 'changeAttributes';
	const ActionChangeSort = 'changeSort';
	const ActionChangeResourceType = 'changeResourceType';
	const ActionBulkUpdate = 'bulkUpdate';
}

class ManageResourcesPresenter extends ActionPresenter
{
	/**
	 * @var IManageResourcesPage
	 */
	private $page;

	/**
	 * @var IResourceRepository
	 */
	private $resourceRepository;

	/**
	 * @var IScheduleRepository
	 */
	private $scheduleRepository;

	/**
	 * @var IImageFactory
	 */
	private $imageFactory;

	/**
	 * @var IGroupViewRepository
	 */
	private $groupRepository;

	/**
	 * @var IAttributeService
	 */
	private $attributeService;

	/**
	 * @var IUserPreferenceRepository
	 */
	private $userPreferenceRepository;

	public function __construct(
		IManageResourcesPage $page,
		IResourceRepository $resourceRepository,
		IScheduleRepository $scheduleRepository,
		IImageFactory $imageFactory,
		IGroupViewRepository $groupRepository,
		IAttributeService $attributeService,
		IUserPreferenceRepository $userPreferenceRepository)
	{
		parent::__construct($page);

		$this->page = $page;
		$this->resourceRepository = $resourceRepository;
		$this->scheduleRepository = $scheduleRepository;
		$this->imageFactory = $imageFactory;
		$this->groupRepository = $groupRepository;
		$this->attributeService = $attributeService;
		$this->userPreferenceRepository = $userPreferenceRepository;

		$this->AddAction(ManageResourcesActions::ActionAdd, 'Add');
		$this->AddAction(ManageResourcesActions::ActionChangeAdmin, 'ChangeAdmin');
		$this->AddAction(ManageResourcesActions::ActionChangeConfiguration, 'ChangeConfiguration');
		$this->AddAction(ManageResourcesActions::ActionChangeDescription, 'ChangeDescription');
		$this->AddAction(ManageResourcesActions::ActionChangeImage, 'ChangeImage');
		$this->AddAction(ManageResourcesActions::ActionChangeLocation, 'ChangeLocation');
		$this->AddAction(ManageResourcesActions::ActionChangeNotes, 'ChangeNotes');
		$this->AddAction(ManageResourcesActions::ActionChangeSchedule, 'ChangeSchedule');
		$this->AddAction(ManageResourcesActions::ActionRemoveImage, 'RemoveImage');
		$this->AddAction(ManageResourcesActions::ActionRename, 'Rename');
		$this->AddAction(ManageResourcesActions::ActionDelete, 'Delete');
		$this->AddAction(ManageResourcesActions::ActionChangeStatus, 'ChangeStatus');
		$this->AddAction(ManageResourcesActions::ActionEnableSubscription, 'EnableSubscription');
		$this->AddAction(ManageResourcesActions::ActionDisableSubscription, 'DisableSubscription');
		$this->AddAction(ManageResourcesActions::ActionChangeAttributes, 'ChangeAttributes');
		$this->AddAction(ManageResourcesActions::ActionChangeSort, 'ChangeSortOrder');
		$this->AddAction(ManageResourcesActions::ActionChangeResourceType, 'ChangeResourceType');
		$this->AddAction(ManageResourcesActions::ActionBulkUpdate, 'BulkUpdate');
	}

	public function PageLoad()
	{
		$resourceAttributes = $this->attributeService->GetByCategory(CustomAttributeCategory::RESOURCE);

		$filterValues = $this->page->GetFilterValues();

		$results = $this->resourceRepository->GetList($this->page->GetPageNumber(), $this->page->GetPageSize(), null, null, $filterValues->AsFilter($resourceAttributes));
		$resources = $results->Results();
		$this->page->BindResources($resources);
		$this->page->BindPageInfo($results->PageInfo());

		$schedules = $this->scheduleRepository->GetAll();
		$scheduleList = array();

		/* @var $schedule Schedule */
		foreach ($schedules as $schedule)
		{
			$scheduleList[$schedule->GetId()] = $schedule->GetName();
		}
		$this->page->BindSchedules($scheduleList);
		$this->page->AllSchedules($schedules);

		$resourceTypes = $this->resourceRepository->GetResourceTypes();
		$resourceTypeList = array();

		/* @var $resourceType ResourceType */
		foreach ($resourceTypes as $resourceType)
		{
			$resourceTypeList[$resourceType->Id()] = $resourceType;
		}
		$this->page->BindResourceTypes($resourceTypeList);

		$statusReasons = $this->resourceRepository->GetStatusReasons();
		$statusReasonList = array();

		foreach ($statusReasons as $reason)
		{
			$statusReasonList[$reason->Id()] = $reason;
		}
		$this->page->BindResourceStatusReasons($statusReasonList);

		$groups = $this->groupRepository->GetGroupsByRole(RoleLevel::RESOURCE_ADMIN);
		$this->page->BindAdminGroups($groups);

		$resourceIds = array();
		foreach ($resources as $resource)
		{
			$resourceIds[] = $resource->GetId();
		}

		$attributeList = $this->attributeService->GetAttributes(CustomAttributeCategory::RESOURCE, $resourceIds);
		$this->page->BindAttributeList($attributeList);


		$this->InitializeFilter($filterValues, $resourceAttributes);
	}

	public function Add()
	{
		$name = $this->page->GetResourceName();
		$scheduleId = $this->page->GetScheduleId();
		$autoAssign = $this->page->GetAutoAssign();
		$resourceAdminGroupId = $this->page->GetAdminGroupId();

		Log::Debug("Adding new resource with name: %s, scheduleId: %s, autoAssign: %s, resourceAdminGroupId %s", $name, $scheduleId, $autoAssign, $resourceAdminGroupId);

		$resource = BookableResource::CreateNew($name, $scheduleId, $autoAssign);
		$resource->SetAdminGroupId($resourceAdminGroupId);
		$this->resourceRepository->Add($resource);
	}

	public function ChangeConfiguration()
	{
		$resourceId = $this->page->GetResourceId();
		$minDuration = $this->page->GetMinimumDuration();
		$maxDuration = $this->page->GetMaximumDuration();
		$allowMultiDay = $this->page->GetAllowMultiday();
		$requiresApproval = $this->page->GetRequiresApproval();
		$autoAssign = $this->page->GetAutoAssign();
		$minNotice = $this->page->GetStartNoticeMinutes();
		$maxNotice = $this->page->GetEndNoticeMinutes();
		$maxParticipants = $this->page->GetMaxParticipants();
		$bufferTime = $this->page->GetBufferTime();

		Log::Debug('Updating resource id %s', $resourceId);

		$resource = $this->resourceRepository->LoadById($resourceId);

		$resource->SetMinLength($minDuration);
		$resource->SetMaxLength($maxDuration);
		$resource->SetAllowMultiday($allowMultiDay);
		$resource->SetRequiresApproval($requiresApproval);
		$resource->SetAutoAssign($autoAssign);
		$resource->SetMinNotice($minNotice);
		$resource->SetMaxNotice($maxNotice);
		$resource->SetMaxParticipants($maxParticipants);
		$resource->SetBufferTime($bufferTime);

		$this->resourceRepository->Update($resource);
	}

	public function Delete()
	{
		$resource = $this->resourceRepository->LoadById($this->page->GetResourceId());
		$this->resourceRepository->Delete($resource);
	}

	public function ChangeDescription()
	{
		$resource = $this->resourceRepository->LoadById($this->page->GetResourceId());

		$resource->SetDescription($this->page->GetDescription());

		$this->resourceRepository->Update($resource);
	}

	public function ChangeNotes()
	{
		$resource = $this->resourceRepository->LoadById($this->page->GetResourceId());

		$resource->SetNotes($this->page->GetNotes());

		$this->resourceRepository->Update($resource);
	}

	public function Rename()
	{
		$resource = $this->resourceRepository->LoadById($this->page->GetResourceId());

		$resource->SetName($this->page->GetResourceName());

		$this->resourceRepository->Update($resource);
	}

	public function ChangeLocation()
	{
		$resource = $this->resourceRepository->LoadById($this->page->GetResourceId());

		$resource->SetLocation($this->page->GetLocation());
		$resource->SetContact($this->page->GetContact());

		$this->resourceRepository->Update($resource);
	}

	public function ChangeImage()
	{
		Log::Debug("Changing resource image for resource id %s", $this->page->GetResourceId());

		$uploadedImage = $this->page->GetUploadedImage();

		if ($uploadedImage->IsError())
		{
			die("Image error: " . $uploadedImage->Error());
		}

		$fileType = strtolower($uploadedImage->Extension());

		$supportedTypes = array('jpeg', 'gif', 'png', 'jpg');

		if (!in_array($fileType, $supportedTypes))
		{
			die("Invalid image type: $fileType");
		}

		$image = $this->imageFactory->Load($uploadedImage->TemporaryName());
		$image->ResizeToWidth(300);

		$fileName = "resource{$this->page->GetResourceId()}.$fileType";
		$imageUploadDirectory = Configuration::Instance()->GetKey(ConfigKeys::IMAGE_UPLOAD_DIRECTORY);

		$path = '';

		if (is_dir($imageUploadDirectory))
		{
			$path = $imageUploadDirectory;
		}
		else if (is_dir(ROOT_DIR . $imageUploadDirectory))
		{
			$path = ROOT_DIR . $imageUploadDirectory ;
		}

		$path = "$path/$fileName";
		Log::Debug("Saving resource image $path");

		$image->Save($path);

		$this->SaveResourceImage($fileName);
	}

	public function RemoveImage()
	{
		$this->SaveResourceImage(null);
	}

	public function ChangeStatus()
	{
		$resourceId = $this->page->GetResourceId();
		$statusId = $this->page->GetStatusId();
		$statusReasonId = $this->page->GetStatusReasonId();
		$statusReason = $this->page->GetNewStatusReason();

		Log::Debug('Changing resource status. ResourceId: %s', $resourceId);

		$resource = $this->resourceRepository->LoadById($resourceId);

		if (empty($statusReasonId) && !empty($statusReason))
		{
			$statusReasonId = $this->resourceRepository->AddStatusReason($statusId, $statusReason);
		}

		$resource->ChangeStatus($statusId, $statusReasonId);
		$this->resourceRepository->Update($resource);
	}

	public function ChangeSchedule()
	{
		$resourceId = $this->page->GetResourceId();
		Log::Debug('Changing schedule for resource %s', $resourceId);

		$resource = $this->resourceRepository->LoadById($resourceId);

		$scheduleId = $this->page->GetScheduleId();
		$resource->SetScheduleId($scheduleId);
		$this->resourceRepository->Update($resource);
	}

	public function ChangeAdmin()
	{
		$resourceId = $this->page->GetResourceId();
		Log::Debug('Changing resource admin for resource %s', $resourceId);

		$resource = $this->resourceRepository->LoadById($resourceId);
		$adminGroupId = $this->page->GetAdminGroupId();
		$resource->SetAdminGroupId($adminGroupId);
		$this->resourceRepository->Update($resource);
	}

	public function EnableSubscription()
	{
		$resourceId = $this->page->GetResourceId();
		Log::Debug('Enable calendar subscription for resource %s', $resourceId);

		$resource = $this->resourceRepository->LoadById($resourceId);
		$resource->EnableSubscription();
		$this->resourceRepository->Update($resource);
	}

	public function DisableSubscription()
	{
		$resourceId = $this->page->GetResourceId();
		Log::Debug('Disable calendar subscription for resource %s', $resourceId);

		$resource = $this->resourceRepository->LoadById($resourceId);
		$resource->DisableSubscription();
		$this->resourceRepository->Update($resource);
	}

	public function ChangeAttributes()
	{
		$resourceId = $this->page->GetResourceId();
		Log::Debug('Changing attributes for resource %s', $resourceId);

		$resource = $this->resourceRepository->LoadById($resourceId);

		$attributes = $this->GetAttributeValues();

		$resource->ChangeAttributes($attributes);
		$this->resourceRepository->Update($resource);
	}

	public function ChangeSortOrder()
	{
		$resourceId = $this->page->GetResourceId();
		$sortOrder = $this->page->GetSortOrder();
		Log::Debug('Changing sort order for resource %s', $resourceId);

		$resource = $this->resourceRepository->LoadById($resourceId);
		$resource->SetSortOrder($sortOrder);
		$this->resourceRepository->Update($resource);
	}

	public function ChangeResourceType()
	{
		$resourceId = $this->page->GetResourceId();
		$resourceTypeId = $this->page->GetResourceTypeId();
		Log::Debug('Changing resource type for resource %s', $resourceId);

		$resource = $this->resourceRepository->LoadById($resourceId);
		$resource->SetResourceTypeId($resourceTypeId);
		$this->resourceRepository->Update($resource);
	}

	private function GetAttributeValues()
	{
		$attributes = array();
		foreach ($this->page->GetAttributes() as $attribute)
		{
			$attributes[] = new AttributeValue($attribute->Id, $attribute->Value);
		}
		return $attributes;
	}

	private function SaveResourceImage($fileName)
	{
		$resource = $this->resourceRepository->LoadById($this->page->GetResourceId());

		$resource->SetImage($fileName);

		$this->resourceRepository->Update($resource);
	}

	/**
	 * @param ResourceFilterValues $filterValues
	 * @param CustomAttribute[] $resourceAttributes
	 */
	public function InitializeFilter($filterValues, $resourceAttributes)
	{
		$filters = $filterValues->Attributes;
		$attributeFilters = array();
		foreach ($resourceAttributes as $attribute)
		{
			$attributeValue = null;
			if (array_key_exists($attribute->Id(), $filters))
			{
				$attributeValue = $filters[$attribute->Id()];
			}
			$attributeFilters[] = new Attribute($attribute, $attributeValue);
		}

		$this->page->BindAttributeFilters($attributeFilters);
		$this->page->SetFilterValues($filterValues);
	}

	public function BulkUpdate()
	{
		$scheduleId = $this->page->GetScheduleId();
		$resourceTypeId = $this->page->GetResourceTypeId();
		$location = $this->page->GetLocation();
		$contact = $this->page->GetContact();
		$description = $this->page->GetDescription();
		$notes = $this->page->GetNotes();
		$adminGroupId = $this->page->GetAdminGroupId();

		$statusId = $this->page->GetStatusId();
		$reasonId = $this->page->GetStatusReasonId();

		// need to figure out difference between empty and unchanged
		$minDuration = $this->page->GetMinimumDuration();
		$minDurationNone = $this->page->GetMinimumDurationNone();
		$maxDuration = $this->page->GetMaximumDuration();
		$maxDurationNone = $this->page->GetMaximumDurationNone();
		$bufferTime = $this->page->GetBufferTime();
		$bufferTimeNone = $this->page->GetBufferTimeNone();
		$minNotice = $this->page->GetStartNoticeMinutes();
		$minNoticeNone = $this->page->GetStartNoticeNone();
		$maxNotice = $this->page->GetEndNoticeMinutes();
		$maxNoticeNone = $this->page->GetEndNoticeNone();
		$allowMultiDay = $this->page->GetAllowMultiday();
		$requiresApproval = $this->page->GetRequiresApproval();
		$autoAssign = $this->page->GetAutoAssign();
		$allowSubscription = $this->page->GetAllowSubscriptions();
		$attributes = $this->page->GetAttributes();

		$resourceIds = $this->page->GetBulkUpdateResourceIds();

		foreach ($resourceIds as $resourceId)
		{
			try
			{
				$resource = $this->resourceRepository->LoadById($resourceId);

				if ($this->ChangingDropDown($scheduleId))
				{
					$resource->SetScheduleId($scheduleId);
				}
				if ($this->ChangingDropDown($resourceTypeId))
				{
					$resource->SetResourceTypeId($resourceTypeId);
				}
				if ($this->ChangingValue($location))
				{
					$resource->SetLocation($location);
				}
				if ($this->ChangingValue($contact))
				{
					$resource->SetContact($contact);
				}
				if ($this->ChangingValue($description))
				{
					$resource->SetDescription($description);
				}
				if ($this->ChangingValue($notes))
				{
					$resource->SetNotes($notes);
				}
				if ($this->ChangingDropDown($adminGroupId))
				{
					$resource->SetAdminGroupId($adminGroupId);
				}
				if ($this->ChangingDropDown($statusId))
				{
					$resource->ChangeStatus($statusId, $reasonId);
				}
				if (!$minDurationNone)
				{
					$resource->SetMinLength($minDuration);
				}
				if (!$maxDurationNone)
				{
					$resource->SetMaxLength($maxDuration);
				}
				if (!$bufferTimeNone)
				{
					$resource->SetBufferTime($bufferTime);
				}
				if (!$minNoticeNone)
				{
					$resource->SetMinNotice($minNotice);
				}
				if (!$maxNoticeNone)
				{
					$resource->SetMaxNotice($maxNotice);
				}
				if ($this->ChangingDropDown($allowMultiDay))
				{
					$resource->SetAllowMultiday($allowMultiDay);
				}
				if ($this->ChangingDropDown($requiresApproval))
				{
					$resource->SetRequiresApproval($requiresApproval);
				}
				if ($this->ChangingDropDown($autoAssign))
				{
					$resource->SetAutoAssign($autoAssign);
				}
				if ($this->ChangingDropDown($allowSubscription))
				{
					if ($allowSubscription)
					{
						$resource->EnableSubscription();
					}
					else
					{
						$resource->DisableSubscription();
					}
				}

				/** @var AttributeValue $attribute */
				foreach ($this->GetAttributeValues() as $attribute)
				{
					if (!empty($attribute->Value))
					{
						$resource->ChangeAttribute($attribute);
					}
				}

				$this->resourceRepository->Update($resource);
			}
			catch(Exception $ex)
			{
				Log::Error('Error bulk updating resource. Id=%s. Error=%s', $resourceId, $ex);
			}
		}
	}

	protected function LoadValidators($action)
	{
		if ($action == ManageResourcesActions::ActionChangeAttributes)
		{
			$attributes = $this->GetAttributeValues();
			$this->page->RegisterValidator('attributeValidator', new AttributeValidator($this->attributeService, CustomAttributeCategory::RESOURCE, $attributes, $this->page->GetResourceId()));
		}
		if ($action == ManageResourcesActions::ActionBulkUpdate)
		{
			$attributes = $this->GetAttributeValues();
			$this->page->RegisterValidator('bulkAttributeValidator', new AttributeValidator($this->attributeService, CustomAttributeCategory::RESOURCE, $attributes, null, true));
		}
	}

	public function ProcessDataRequest($dataRequest)
	{
		if ($dataRequest == 'all')
		{
			$this->page->SetResourcesJson(array_map(array('AdminResourceJson', 'FromBookable'), $this->resourceRepository->GetResourceList()));
		}
	}

	private function ChangingDropDown($value)
	{
		return $value != "-1";
	}

	private function ChangingValue($value)
	{
		return !empty($value);
	}
}

class AdminResourceJson
{
	public $Id;
	public $Name;

	public function __construct($id, $name)
	{
		$this->Id = $id;
		$this->Name = $name;
	}

	public static function FromBookable(BookableResource $resource)
	{
		return new AdminResourceJson($resource->GetId(), $resource->GetName());
	}
}

Anon7 - 2022
AnonSec Team