/**
* {@inheritdoc}
* @see Scalr\Tests.WebTestCase::getRequest()
*/
protected function getRequest($requestType, $requestClass, $uri, array $parameters = array(), $method = 'GET', array $server = array(), array $files = array())
{
$mock = $this->getMock('Scalr_UI_Request', array('restrictAccess', 'isAllowed'), array(), '', false);
$me = $this;
$user = $this->getUser();
//Sets an ID of the environment.
$user->getPermissions()->setEnvironmentId($this->getEnvironment()->id);
$mock = parent::getRequest($requestType, $mock, $uri, $parameters, $method, $server, $files);
$lfGetMessage = function ($prefix, $resourceId, $permissionId = null) {
$rm = Acl::getResourcesMnemonic();
return sprintf($prefix . '("%s", %s)', isset($rm[$resourceId]) ? $rm[$resourceId] : $resourceId, $permissionId ? '"' . $permissionId . '"' : 'null');
};
$mock->expects($this->any())->method('restrictAccess')->will($this->returnCallback(function ($resourceId, $permissionId = null) use($mock, $me, $lfGetMessage) {
if (is_string($resourceId)) {
$sName = 'Scalr\\Acl\\Acl::RESOURCE_' . strtoupper($resourceId);
if (defined($sName)) {
$resourceId = constant($sName);
} else {
throw new \InvalidArgumentException(sprintf('Cannot find ACL resource %s by specified symbolic name %s.', $sName, $resourceId));
}
}
if (!$mock->isAllowed($resourceId, $permissionId)) {
throw new Exception\AclAccessDeniedException($lfGetMessage('request->restrictAccess', $resourceId, $permissionId));
}
if (($catch = $me->getCatchOnlyPermission()) === null || $catch[0] == $resourceId && (isset($catch[1]) ? $catch[1] : null) == $permissionId) {
throw new Exception\AclAccessGrantedException($lfGetMessage('request->restrictAccess', $resourceId, $permissionId));
}
}));
$mock->expects($this->any())->method('isAllowed')->will($this->returnCallback(function ($resourceId, $permissionId = null) use($mock, $me, $lfGetMessage) {
//Owner is allowed for everything
if ($mock->getUser()->getType() == \Scalr_Account_User::TYPE_ACCOUNT_OWNER) {
$ret = true;
} else {
if (is_string($resourceId)) {
$sName = 'Scalr\\Acl\\Acl::RESOURCE_' . strtoupper($resourceId);
if (defined($sName)) {
$resourceId = constant($sName);
} else {
throw new \InvalidArgumentException(sprintf('Cannot find ACL resource %s by specified symbolic name %s.', $sName, $resourceId));
}
}
$ret = (bool) $mock->getAclRoles()->isAllowed($resourceId, $permissionId);
}
if (($catch = $me->getCatchOnlyPermission()) === null || $catch[0] == $resourceId && (isset($catch[1]) ? $catch[1] : null) == $permissionId) {
if ($ret) {
throw new Exception\AclAccessGrantedException($lfGetMessage('request->isAllowed', $resourceId, $permissionId));
} else {
throw new Exception\AclAccessDeniedException($lfGetMessage('request->isAllowed', $resourceId, $permissionId));
}
}
return $ret;
}));
if (($catch = $this->getCatchOnlyPermission()) !== null && count($catch) > 1 && $catch[0] == Acl::RESOURCE_FARMS && $catch[1] == Acl::PERM_FARMS_NOT_OWNED_FARMS) {
//Mocking the user object of the request to catch hasAccessFarm calls
/* @var $usermock \Scalr_Account_User */
$usermock = $this->getMock('Scalr_Account_User', null);
$usermock->loadById($this->getUser()->id);
//Creates permissions mock
$permissions = $this->getMock('Scalr_Permissions', array('hasAccessFarm'), array($usermock));
//Injects permissions object to user mock.
$refPerm = new \ReflectionProperty('Scalr_Account_User', 'permissions');
$refPerm->setAccessible(true);
$refPerm->setValue($usermock, $permissions);
//Preparing stub for the method
$permissions->expects($this->any())->method('hasAccessFarm')->will($this->returnCallback(function ($dbFarm) use($user) {
$ret = $user->getPermissions()->hasAccessFarm($dbFarm);
if ($ret) {
throw new Exception\AclAccessGrantedException(sprintf('user->permissions->hasAccessFarm(%d)', $dbFarm->ID));
} else {
throw new Exception\AclAccessDeniedException(sprintf('user->permissions->hasAccessFarm(%d)', $dbFarm->ID));
}
}));
//Injecting user mock to request mock.
$refUser = new \ReflectionProperty('Scalr_UI_Request', 'user');
$refUser->setAccessible(true);
$refUser->setValue($mock, $usermock);
}
return $mock;
}