/package/app/app/alpha/lib/model/PermissionPeer.php

https://github.com/richhl/kalturaCE · PHP · 280 lines · 226 code · 35 blank · 19 comment · 31 complexity · 9cb0da75a851922b1697e76c55f55e22 MD5 · raw file

  1. <?php
  2. /**
  3. * Skeleton subclass for performing query and update operations on the 'permission' table.
  4. *
  5. *
  6. *
  7. * You should add additional methods to this class to meet the
  8. * application requirements. This class will only be generated as
  9. * long as it does not already exist in the output directory.
  10. *
  11. * @package Core
  12. * @subpackage model
  13. */
  14. class PermissionPeer extends BasePermissionPeer
  15. {
  16. public static function checkValidPermissionsForRole($permissionsStr, $partnerId)
  17. {
  18. if ($permissionsStr == UserRole::ALL_PARTNER_PERMISSIONS_WILDCARD) {
  19. return true;
  20. }
  21. $permissions = array_map('trim', explode(',', $permissionsStr));
  22. foreach ($permissions as $permission)
  23. {
  24. if (!$permission)
  25. continue;
  26. $c = new Criteria();
  27. $c->addAnd(PermissionPeer::NAME, $permission, Criteria::EQUAL);
  28. $c->addAnd(PermissionPeer::PARTNER_ID, array($partnerId, PartnerPeer::GLOBAL_PARTNER), Criteria::IN);
  29. // a user role can only contain NORMAL permission types - TODO should be changed to perPartner / perUser permissions
  30. $c->addAnd(PermissionPeer::TYPE, PermissionType::NORMAL, Criteria::EQUAL);
  31. $c->addAnd(PermissionPeer::STATUS, PermissionStatus::ACTIVE, Criteria::EQUAL);
  32. PermissionPeer::setUseCriteriaFilter(false);
  33. $hasPermission = PermissionPeer::doSelectOne($c);
  34. PermissionPeer::setUseCriteriaFilter(true);
  35. if (!$hasPermission || $hasPermission->getStatus() == PermissionStatus::DELETED) {
  36. throw new kPermissionException('Permission ['.$permission.'] was not found for partner ['.$partnerId.']', kPermissionException::PERMISSION_NOT_FOUND);
  37. }
  38. }
  39. }
  40. public static function addToPartner($permission, $partnerId)
  41. {
  42. $permission->setPartnerId($partnerId);
  43. $c = new Criteria();
  44. $c->addAnd(PermissionPeer::PARTNER_ID, array($partnerId, PartnerPeer::GLOBAL_PARTNER), Criteria::IN);
  45. $c->addAnd(PermissionPeer::NAME, $permission->getName(), Criteria::EQUAL);
  46. $existingPermission = PermissionPeer::doSelectOne($c);
  47. if (!$existingPermission) {
  48. $permission->save();
  49. KalturaLog::log('Adding permission ['.$permission->getName().'] to partner ['.$partnerId.'].');
  50. return $permission;
  51. }
  52. else {
  53. throw new kPermissionException('Permission ['.$permission->getName().'] already exists for partner ['.$partnerId.']', kPermissionException::PERMISSION_ALREADY_EXISTS);
  54. }
  55. }
  56. public static function removePermissionFromPartner($permissionName, $partnerId)
  57. {
  58. $c = new Criteria();
  59. $c->addAnd(PermissionPeer::PARTNER_ID, $partnerId, Criteria::EQUAL);
  60. $c->addAnd(PermissionPeer::NAME, $permissionName, Criteria::EQUAL);
  61. $existingPermission = PermissionPeer::doSelectOne($c);
  62. if (!$existingPermission) {
  63. throw new kPermissionException('Permission ['.$permissionName.'] does not exist for partner ['.$partnerId.']', kPermissionException::PERMISSION_NOT_FOUND);
  64. }
  65. KalturaLog::log('Removing permission ['.$permissionName.'] from partner ['.$partnerId.'].');
  66. $existingPermission->setStatus(PermissionStatus::DELETED);
  67. }
  68. public static function enableForPartner($permissionName, $permissionType, $partnerId, $friendlyName = null, $description = null)
  69. {
  70. $permission = new Permission();
  71. $permission->setName($permissionName);
  72. $permission->setFriendlyName($friendlyName ? $friendlyName : $permissionName);
  73. $permission->setDescription($description);
  74. $permission->setType($permissionType);
  75. $permission->setStatus(PermissionStatus::ACTIVE);
  76. try {
  77. // try to add permission
  78. self::addToPartner($permission, $partnerId);
  79. return true;
  80. }
  81. catch (kPermissionException $e) {
  82. $code = $e->getCode();
  83. if ($code == kPermissionException::PERMISSION_ALREADY_EXISTS) {
  84. // permission already exists - set status to active
  85. $permission = self::getByNameAndPartner($permissionName, array($partnerId));
  86. if(!$permission)
  87. throw new kCoreException("Permission [$permissionName] not found for partner [$partnerId]", kCoreException::INTERNAL_SERVER_ERROR);
  88. $permission->setStatus(PermissionStatus::ACTIVE);
  89. $permission->save();
  90. return true;
  91. }
  92. throw $e;
  93. }
  94. throw new kCoreException('Unknown error occured', kCoreException::INTERNAL_SERVER_ERROR);
  95. }
  96. public static function disableForPartner($permissionName, $partnerId)
  97. {
  98. $permission = self::getByNameAndPartner($permissionName, array($partnerId));
  99. if (!$permission) {
  100. return true; // permission not found - already disabled
  101. }
  102. if ($permission->getStatus() != PermissionStatus::ACTIVE) {
  103. return true; // non active status - already disabled
  104. }
  105. $permission->setStatus(PermissionStatus::BLOCKED);
  106. $permission->save();
  107. }
  108. public static function isValidForPartner($permissionName, $partnerId, $checkDependency = true)
  109. {
  110. $permission = self::getByNameAndPartner($permissionName, array($partnerId, PartnerPeer::GLOBAL_PARTNER));
  111. if (!$permission) {
  112. return false;
  113. }
  114. if ($permission->getStatus() != PermissionStatus::ACTIVE) {
  115. return false;
  116. }
  117. // check if permissions depends on another permission which is not valid for partner
  118. if ($checkDependency)
  119. {
  120. $dependsOn = trim($permission->getDependsOnPermissionNames());
  121. $dependsOn = explode(',', $dependsOn);
  122. $valid = true;
  123. if ($dependsOn) {
  124. foreach($dependsOn as $dependPermission) {
  125. $dependPermission = trim($dependPermission);
  126. if (!$dependPermission) {
  127. continue;
  128. }
  129. $valid = $valid && self::isValidForPartner($dependPermission, $partnerId);
  130. }
  131. }
  132. if (!$valid) {
  133. return false;
  134. }
  135. }
  136. return $permission;
  137. }
  138. public static function getByNameAndPartner($permissionName, $partnerIdsArray)
  139. {
  140. $c = new Criteria();
  141. if (!in_array('*', $partnerIdsArray, true)) {
  142. $c->addAnd(PermissionPeer::PARTNER_ID, $partnerIdsArray, Criteria::IN);
  143. }
  144. $c->addAnd(PermissionPeer::NAME, $permissionName, Criteria::EQUAL);
  145. PermissionPeer::setUseCriteriaFilter(false);
  146. $permission = PermissionPeer::doSelectOne($c);
  147. PermissionPeer::setUseCriteriaFilter(true);
  148. return $permission;
  149. }
  150. public static function isAllowedPlugin($pluginName, $partnerId)
  151. {
  152. $permissionName = self::getPermissionNameFromPluginName($pluginName);
  153. return self::isValidForPartner($permissionName, $partnerId);
  154. }
  155. public static function enablePlugin($pluginName, $partnerId)
  156. {
  157. $permissionName = self::getPermissionNameFromPluginName($pluginName);
  158. $friendlyName = $pluginName .' plugin permission';
  159. $description = 'Permission to use '.$pluginName.' plugin';
  160. return self::enableForPartner($permissionName, PermissionType::PLUGIN, $partnerId, $friendlyName, $description);
  161. }
  162. public static function disablePlugin($pluginName, $partnerId)
  163. {
  164. $permissionName = self::getPermissionNameFromPluginName($pluginName);
  165. return self::disableForPartner($permissionName, $partnerId);
  166. }
  167. public static function getPermissionNameFromPluginName($pluginName)
  168. {
  169. return strtoupper($pluginName).'_PLUGIN_PERMISSION';
  170. }
  171. public static function getAllValidForPartner($partnerId, $checkDependency = true)
  172. {
  173. $c = new Criteria();
  174. $c->addAnd(PermissionPeer::PARTNER_ID, array($partnerId, PartnerPeer::GLOBAL_PARTNER), Criteria::IN);
  175. $c->addAnd(PermissionPeer::STATUS, PermissionStatus::ACTIVE, Criteria::EQUAL);
  176. PermissionPeer::setUseCriteriaFilter(false);
  177. $allPermissions = PermissionPeer::doSelect($c);
  178. PermissionPeer::setUseCriteriaFilter(true);
  179. if ($checkDependency) {
  180. $allPermissions = self::filterDependencies($allPermissions, $partnerId);
  181. }
  182. return $allPermissions;
  183. }
  184. public static function filterDependenciesByNames($permissionNames, $partnerId)
  185. {
  186. $c = new Criteria();
  187. $c->addAnd(PermissionPeer::NAME, explode(',', $permissionNames), Criteria::IN);
  188. $c->addAnd(PermissionPeer::PARTNER_ID, array($partnerId, PartnerPeer::GLOBAL_PARTNER), Criteria::IN);
  189. PermissionPeer::setUseCriteriaFilter(false);
  190. $permissionObjects = PermissionPeer::doSelect($c);
  191. PermissionPeer::setUseCriteriaFilter(true);
  192. $permissionObjects = PermissionPeer::filterDependencies($permissionObjects, $partnerId);
  193. $permissionNames = array();
  194. foreach ($permissionObjects as $object)
  195. {
  196. $permissionNames[] = $object->getName();
  197. }
  198. $permissionNames = implode(',', $permissionNames);
  199. return $permissionNames;
  200. }
  201. public static function filterDependencies($permissions, $partnerId)
  202. {
  203. $c = new Criteria();
  204. $c->addAnd(PermissionPeer::PARTNER_ID, $partnerId, Criteria::EQUAL);
  205. $c->addAnd(PermissionPeer::TYPE, array(PermissionType::PLUGIN, PermissionType::SPECIAL_FEATURE), Criteria::IN);
  206. $c->addAnd(PermissionPeer::STATUS, PermissionStatus::ACTIVE, Criteria::EQUAL);
  207. $c->addSelectColumn(PermissionPeer::NAME);
  208. $stmt = PermissionPeer::doSelectStmt($c);
  209. $additionalPartnerPermissionNames = $stmt->fetchAll(PDO::FETCH_COLUMN);
  210. $checkDependency = true;
  211. while ($checkDependency)
  212. {
  213. $checkDependency = false;
  214. $permissionNames = array();
  215. foreach ($permissions as $permission)
  216. {
  217. // create an array of permission names to assist the check
  218. $permissionNames[$permission->getId()] = $permission->getName();
  219. }
  220. foreach ($permissions as $key => $permission)
  221. {
  222. $dependsOn = trim($permission->getDependsOnPermissionNames());
  223. $dependsOn = explode(',', $dependsOn);
  224. if ($dependsOn)
  225. {
  226. foreach($dependsOn as $dependPermission)
  227. {
  228. $dependPermission = trim($dependPermission);
  229. if (!$dependPermission) {
  230. // invalid text
  231. continue;
  232. }
  233. if (!in_array($dependPermission, $permissionNames, true) && !in_array($dependPermission, $additionalPartnerPermissionNames, true)) {
  234. // current permission depends on a non existing permission
  235. unset($permissions[$key]);
  236. $checkDependency = true; // need to recheck because we have delete a permission
  237. break;
  238. }
  239. }
  240. }
  241. }
  242. }
  243. return $permissions;
  244. }
  245. } // PermissionPeer