Skip to content
This repository was archived by the owner on Sep 10, 2021. It is now read-only.

Commit 222c83e

Browse files
author
Michael Grauer
committed
ENH: refs #953. Added item.list.permissions and tests.
1 parent 2b0f454 commit 222c83e

File tree

2 files changed

+115
-0
lines changed

2 files changed

+115
-0
lines changed

modules/api/controllers/components/ApiComponent.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2210,6 +2210,36 @@ function itemShare($args)
22102210
return $itemArray;
22112211
}
22122212

2213+
/**
2214+
* List the permissions on an item, requires Admin access to the item.
2215+
* @param item_id The id of the item
2216+
* @return A list with three keys: privacy, user, group; privacy will be the
2217+
item's privacy string [Public|Private]; user will be a list of
2218+
(user_id, policy, email); group will be a list of (group_id, policy, name).
2219+
policy for user and group will be a policy string [Admin|Write|Read].
2220+
*/
2221+
public function itemListPermissions($args)
2222+
{
2223+
$this->_validateParams($args, array('item_id'));
2224+
$userDao = $this->_getUser($args);
2225+
2226+
$itempolicygroupModel = MidasLoader::loadModel('Itempolicygroup');
2227+
$itemModel = MidasLoader::loadModel('Item');
2228+
$itemId = $args['item_id'];
2229+
$item = $itemModel->load($itemId);
2230+
2231+
if($itemId === false)
2232+
{
2233+
throw new Exception("This item doesn't exist.", MIDAS_INVALID_PARAMETER);
2234+
}
2235+
if(!$itemModel->policyCheck($item, $userDao, MIDAS_POLICY_ADMIN))
2236+
{
2237+
throw new Exception("Admin privileges required on the item to list permissions.", MIDAS_INVALID_POLICY);
2238+
}
2239+
2240+
return $this->_listResourcePermissions($itempolicygroupModel->computePolicyStatus($item), $item->getItempolicyuser(), $item->getItempolicygroup());
2241+
}
2242+
22132243
/**
22142244
* Move an item from the source folder to the desination folder
22152245
* @param token Authentication token

modules/api/tests/controllers/ApiCallItemMethodsTest.php

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1840,5 +1840,90 @@ public function testItemAddRemovePolicyuser()
18401840
$this->assertPolicyuserNonexistence(array(), array($adminItem), $targetUser);
18411841
}
18421842

1843+
/** Test the item.list.permissions method */
1844+
public function testItemListPermissions()
1845+
{
1846+
$userModel = MidasLoader::loadModel('User');
1847+
$userDao = $userModel->load('1');
1848+
1849+
$userDao = $userModel->load('1');
1850+
$itemModel = MidasLoader::loadModel('Item');
1851+
$readItem = $itemModel->load('1004');
1852+
$writeItem = $itemModel->load('1005');
1853+
$adminItem = $itemModel->load('1006');
1854+
$nonAdmins = array($readItem, $writeItem);
1855+
1856+
$params = array('method' => 'midas.item.list.permissions',
1857+
'token' => $this->_loginAsUser($userDao));
18431858

1859+
// try to list permissions without admin, should fail
1860+
foreach($nonAdmins as $item)
1861+
{
1862+
$this->resetAll();
1863+
$params['item_id'] = $item->getItemId();
1864+
$this->params = $params;
1865+
$resp = $this->_callJsonApi();
1866+
$this->_assertStatusFail($resp, MIDAS_INVALID_POLICY);
1867+
}
1868+
1869+
// now with admin perms
1870+
1871+
// first check both privacy statuses
1872+
$privacyCodes = array("Public" => MIDAS_PRIVACY_PUBLIC, "Private" => MIDAS_PRIVACY_PRIVATE);
1873+
$privacyStatuses = array(MIDAS_PRIVACY_PUBLIC, MIDAS_PRIVACY_PRIVATE);
1874+
$privacyStrings = array(MIDAS_PRIVACY_PUBLIC => "Public", MIDAS_PRIVACY_PRIVATE => "Private");
1875+
1876+
foreach($privacyStatuses as $privacyStatus)
1877+
{
1878+
$this->initializePrivacyStatus(array(), array($adminItem), $privacyStatus);
1879+
1880+
$this->resetAll();
1881+
$params['item_id'] = $adminItem->getItemId();
1882+
$this->params = $params;
1883+
$resp = $this->_callJsonApi();
1884+
$this->_assertStatusOk($resp);
1885+
1886+
$this->assertPrivacyStatus(array(), array($adminItem), $privacyStatus);
1887+
}
1888+
1889+
// ensure user perms are correct from the most recent call
1890+
$privilegeCodes = array("Admin" => MIDAS_POLICY_ADMIN, "Write" => MIDAS_POLICY_WRITE, "Read" => MIDAS_POLICY_READ);
1891+
$userPolicies = $adminItem->getItempolicyuser();
1892+
$apiUserPolicies = $resp->data->user;
1893+
foreach($userPolicies as $userPolicy)
1894+
{
1895+
$user = $userPolicy->getUser();
1896+
$userId = (string)$user->getUserId();
1897+
$userFound = false;
1898+
foreach($apiUserPolicies as $apiUserPolicy)
1899+
{
1900+
if($apiUserPolicy->user_id == $userId)
1901+
{
1902+
$userFound = true;
1903+
$apiPolicyCode = $privilegeCodes[$apiUserPolicy->policy];
1904+
$this->assertEquals($apiPolicyCode, $userPolicy->getPolicy());
1905+
}
1906+
}
1907+
$this->assertTrue($userFound, 'API call missing user '. $userId);
1908+
}
1909+
// ensure group perms are correct
1910+
$groupPolicies = $adminItem->getItempolicygroup();
1911+
$apiGroupPolicies = $resp->data->group;
1912+
foreach($groupPolicies as $groupPolicy)
1913+
{
1914+
$group = $groupPolicy->getGroup();
1915+
$groupId = (string)$group->getGroupId();
1916+
$groupFound = false;
1917+
foreach($apiGroupPolicies as $apiGroupPolicy)
1918+
{
1919+
if($apiGroupPolicy->group_id == $groupId)
1920+
{
1921+
$groupFound = true;
1922+
$apiPolicyCode = $privilegeCodes[$apiGroupPolicy->policy];
1923+
$this->assertEquals($apiPolicyCode, $groupPolicy->getPolicy());
1924+
}
1925+
}
1926+
$this->assertTrue($groupFound, 'API call missing group '. $groupId);
1927+
}
1928+
}
18441929
}

0 commit comments

Comments
 (0)