/core/model/modx/processors/security/group/create.class.php

https://github.com/enigmatic-user/revolution · PHP · 367 lines · 249 code · 38 blank · 80 comment · 31 complexity · 19396418b3c7960888a0619f2c3cad02 MD5 · raw file

  1. <?php
  2. /**
  3. * Create a user group
  4. *
  5. * @param string $name (optional) The name of the new user group. Defaults to
  6. * Untitled User Group.
  7. * @param integer $parent (optional) The ID of the parent user group. Defaults
  8. * to 0.
  9. *
  10. * @package modx
  11. * @subpackage processors.security.group
  12. */
  13. class modUserGroupCreateProcessor extends modObjectCreateProcessor {
  14. public $classKey = 'modUserGroup';
  15. public $languageTopics = array('user');
  16. public $permission = 'usergroup_new';
  17. public $objectType = 'user_group';
  18. public $beforeSaveEvent = 'OnUserGroupBeforeFormSave';
  19. public $afterSaveEvent = 'OnUserGroupFormSave';
  20. public function initialize() {
  21. $this->setDefaultProperties(array(
  22. 'parent' => 0,
  23. ));
  24. return parent::initialize();
  25. }
  26. public function beforeSave() {
  27. $this->setUsersIn();
  28. $name = $this->getProperty('name');
  29. if (empty($name)) {
  30. $this->addFieldError('name',$this->modx->lexicon('user_group_err_ns_name'));
  31. }
  32. $parent = $this->getProperty('parent');
  33. if (empty($parent)) {
  34. $this->setProperty('parent',0);
  35. }
  36. if ($this->doesAlreadyExist(array('name' => $name))) {
  37. $this->addFieldError('name',$this->modx->lexicon('user_group_err_already_exists'));
  38. }
  39. return parent::beforeSave();
  40. }
  41. public function afterSave() {
  42. $this->setContexts();
  43. if ($this->modx->hasPermission('usergroup_user_edit')) {
  44. $this->setResourceGroups();
  45. }
  46. /* access wizard stuff */
  47. $flush = false;
  48. $users = $this->getProperty('aw_users','');
  49. if (!empty($users)) {
  50. $this->addUsersViaWizard($users);
  51. }
  52. $contexts = $this->getProperty('aw_contexts','');
  53. if (!empty($contexts)) {
  54. $contexts = is_array($contexts) ? $contexts : explode(',',$contexts);
  55. $contexts = array_unique($contexts);
  56. $adminPolicy = trim($this->getProperty('aw_manager_policy',0));
  57. if (!empty($adminPolicy)) {
  58. $this->addManagerContextAccessViaWizard($adminPolicy);
  59. }
  60. $policy = trim($this->getProperty('aw_contexts_policy',0));
  61. if ($this->addContextAccessViaWizard($contexts,$policy)) {
  62. $flush = true;
  63. }
  64. $resourceGroups = $this->getProperty('aw_resource_groups','');
  65. if (!empty($resourceGroups)) {
  66. $this->addResourceGroupsViaWizard($resourceGroups,$contexts);
  67. }
  68. $categories = $this->getProperty('aw_categories','');
  69. if (!empty($categories)) {
  70. $this->addElementCategoriesViaWizard($categories,$contexts);
  71. }
  72. $parallel = $this->getProperty('aw_parallel',false);
  73. if ($parallel) {
  74. $this->addParallelResourceGroup($contexts);
  75. }
  76. }
  77. if ($flush) {
  78. $this->modx->cacheManager->flushPermissions();
  79. }
  80. return parent::afterSave();
  81. }
  82. /**
  83. * Add user groups via a wizard property, which is a comma-separated list of username:role key pairs, ie:
  84. * jimbob:Member,johndoe:Administrator,marksmith
  85. *
  86. * If the Role is left off, it will default to the Member role.
  87. *
  88. * @param string|array $users
  89. * @return bool
  90. */
  91. public function addUsersViaWizard($users) {
  92. $users = is_array($users) ? $users : explode(',',$users);
  93. $users = array_unique($users);
  94. foreach ($users as $userKey) {
  95. $userKey = explode(':',$userKey);
  96. $c = intval($userKey[0]) > 0 ? trim($userKey[0]) : array('username' => trim($userKey[0]));
  97. /** @var modUser $user */
  98. $user = $this->modx->getObject('modUser',$c);
  99. if (empty($user)) continue;
  100. /** @var modUserGroupRole $role */
  101. if (empty($userKey[1])) $userKey[1] = 'Member';
  102. $c = intval($userKey[1]) > 0 ? trim($userKey[1]) : array('name' => trim($userKey[1]));
  103. $role = $this->modx->getObject('modUserGroupRole',$c);
  104. if (empty($role)) continue;
  105. /** @var modUserGroupMember $membership */
  106. $membership = $this->modx->newObject('modUserGroupMember');
  107. $membership->set('user_group',$this->object->get('id'));
  108. $membership->set('member',$user->get('id'));
  109. $membership->set('role',$role->get('id'));
  110. $membership->save();
  111. }
  112. return true;
  113. }
  114. /**
  115. * Add Manager Access via wizard property with a specified policy.
  116. *
  117. * @param int|string $adminPolicy
  118. * @return bool
  119. */
  120. public function addManagerContextAccessViaWizard($adminPolicy) {
  121. $c = intval($adminPolicy) > 0 ? $adminPolicy : array('name' => $adminPolicy);
  122. /** @var modAccessPolicy $policy */
  123. $policy = $this->modx->getObject('modAccessPolicy',$c);
  124. if (!$policy) return false;
  125. /** @var modAccessResourceGroup $acl */
  126. $acl = $this->modx->newObject('modAccessContext');
  127. $acl->fromArray(array(
  128. 'target' => 'mgr',
  129. 'principal_class' => 'modUserGroup',
  130. 'principal' => $this->object->get('id'),
  131. 'authority' => 9999,
  132. 'policy' => $policy->get('id'),
  133. ));
  134. $acl->save();
  135. return true;
  136. }
  137. /**
  138. * Add Context Access via wizard property.
  139. *
  140. * @param array $contexts
  141. * @return boolean
  142. */
  143. public function addContextAccessViaWizard(array $contexts) {
  144. /** @var modAccessPolicy $policy */
  145. $policy = $this->modx->getObject('modAccessPolicy',array(
  146. 'name' => 'Context',
  147. ));
  148. if (!$policy) return false;
  149. foreach ($contexts as $context) {
  150. /** @var modAccessResourceGroup $acl */
  151. $acl = $this->modx->newObject('modAccessContext');
  152. $acl->fromArray(array(
  153. 'target' => trim($context),
  154. 'principal_class' => 'modUserGroup',
  155. 'principal' => $this->object->get('id'),
  156. 'authority' => 9999,
  157. 'policy' => $policy->get('id'),
  158. ));
  159. $acl->save();
  160. }
  161. return true;
  162. }
  163. /**
  164. * @param string|array $resourceGroupNames
  165. * @param array $contexts
  166. * @return boolean
  167. */
  168. public function addResourceGroupsViaWizard($resourceGroupNames,array $contexts) {
  169. $resourceGroupNames = is_array($resourceGroupNames) ? $resourceGroupNames : explode(',',$resourceGroupNames);
  170. $resourceGroupNames = array_unique($resourceGroupNames);
  171. /** @var modAccessPolicy $policy */
  172. $policy = $this->modx->getObject('modAccessPolicy',array('name' => 'Resource'));
  173. if (!$policy) return false;
  174. foreach ($resourceGroupNames as $resourceGroupName) {
  175. /** @var modResourceGroup $resourceGroup */
  176. $resourceGroup = $this->modx->getObject('modResourceGroup',array('name' => trim($resourceGroupName)));
  177. if (!$resourceGroup) return false;
  178. foreach ($contexts as $context) {
  179. /** @var modAccessResourceGroup $acl */
  180. $acl = $this->modx->newObject('modAccessResourceGroup');
  181. $acl->fromArray(array(
  182. 'target' => $resourceGroup->get('id'),
  183. 'principal_class' => 'modUserGroup',
  184. 'principal' => $this->object->get('id'),
  185. 'authority' => 9999,
  186. 'policy' => $policy->get('id'),
  187. 'context_key' => trim($context),
  188. ));
  189. $acl->save();
  190. }
  191. }
  192. return true;
  193. }
  194. /**
  195. * Adds a Resource Group with the same name and grants access for the specified Contexts
  196. *
  197. * @param array $contexts
  198. * @return boolean
  199. */
  200. public function addParallelResourceGroup(array $contexts) {
  201. /** @var modResourceGroup $resourceGroup */
  202. $resourceGroup = $this->modx->getObject('modResourceGroup',array(
  203. 'name' => $this->object->get('name'),
  204. ));
  205. if (!$resourceGroup) {
  206. $resourceGroup = $this->modx->newObject('modResourceGroup');
  207. $resourceGroup->set('name',$this->object->get('name'));
  208. if (!$resourceGroup->save()) {
  209. return false;
  210. }
  211. }
  212. /** @var modAccessPolicy $policy */
  213. $policy = $this->modx->getObject('modAccessPolicy',array('name' => 'Resource'));
  214. if (!$policy) return false;
  215. foreach ($contexts as $context) {
  216. /** @var modAccessResourceGroup $acl */
  217. $acl = $this->modx->newObject('modAccessResourceGroup');
  218. $acl->fromArray(array(
  219. 'target' => $resourceGroup->get('id'),
  220. 'principal_class' => 'modUserGroup',
  221. 'principal' => $this->object->get('id'),
  222. 'authority' => 9999,
  223. 'policy' => $policy->get('id'),
  224. 'context_key' => trim($context),
  225. ));
  226. $acl->save();
  227. }
  228. return true;
  229. }
  230. /**
  231. * @param string|array $categoryNames
  232. * @param array $contexts
  233. * @return boolean
  234. */
  235. public function addElementCategoriesViaWizard($categoryNames,array $contexts) {
  236. $categoryNames = is_array($categoryNames) ? $categoryNames : explode(',',$categoryNames);
  237. $categoryNames = array_unique($categoryNames);
  238. /** @var modAccessPolicy $policy */
  239. $policy = $this->modx->getObject('modAccessPolicy',array('name' => 'Element'));
  240. if (!$policy) return false;
  241. foreach ($categoryNames as $categoryName) {
  242. /** @var modCategory $category */
  243. $category = $this->modx->getObject('modCategory',array('category' => trim($categoryName)));
  244. if (!$category) return false;
  245. foreach ($contexts as $context) {
  246. /** @var modAccessCategory $acl */
  247. $acl = $this->modx->newObject('modAccessCategory');
  248. $acl->fromArray(array(
  249. 'target' => $category->get('id'),
  250. 'principal_class' => 'modUserGroup',
  251. 'principal' => $this->object->get('id'),
  252. 'authority' => 9999,
  253. 'policy' => $policy->get('id'),
  254. 'context_key' => trim($context),
  255. ));
  256. $acl->save();
  257. }
  258. }
  259. return true;
  260. }
  261. /**
  262. * Set the users in the group
  263. * @return array
  264. */
  265. public function setUsersIn() {
  266. $users = $this->getProperty('users');
  267. $memberships = array();
  268. if (!empty($users)) {
  269. $users = is_array($users) ? $users : $this->modx->fromJSON($users);
  270. $memberships = array();
  271. foreach ($users as $userArray) {
  272. if (empty($userArray['id']) || empty($userArray['role'])) continue;
  273. /** @var modUserGroupMember $membership */
  274. $membership = $this->modx->newObject('modUserGroupMember');
  275. $membership->set('user_group',$this->object->get('id'));
  276. $membership->set('member',$userArray['id']);
  277. $membership->set('role',$userArray['role']);
  278. $memberships[] = $membership;
  279. }
  280. $this->object->addMany($memberships);
  281. }
  282. return $memberships;
  283. }
  284. /**
  285. * Set the Context ACLs for the Group
  286. * @return array
  287. */
  288. public function setContexts() {
  289. $contexts = $this->getProperty('contexts');
  290. $access = array();
  291. if (!empty($contexts)) {
  292. $contexts = is_array($contexts) ? $contexts : $this->modx->fromJSON($contexts);
  293. foreach ($contexts as $context) {
  294. /** @var modAccessContext $acl */
  295. $acl = $this->modx->newObject('modAccessContext');
  296. $acl->fromArray($context);
  297. $acl->set('principal',$this->object->get('id'));
  298. $acl->set('principal_class','modUserGroup');
  299. if ($acl->save()) {
  300. $access[] = $acl;
  301. }
  302. }
  303. }
  304. return $access;
  305. }
  306. /**
  307. * Set the Resource Group ACLs for the Group
  308. * @return array
  309. */
  310. public function setResourceGroups() {
  311. $resourceGroups = $this->getProperty('resource_groups');
  312. $access = array();
  313. if (!empty($resourceGroups)) {
  314. $resourceGroups = is_array($resourceGroups) ? $resourceGroups : $this->modx->fromJSON($resourceGroups);
  315. foreach ($resourceGroups as $resourceGroup) {
  316. /** @var modAccessResourceGroup $acl */
  317. $acl = $this->modx->newObject('modAccessResourceGroup');
  318. $acl->fromArray($resourceGroup);
  319. $acl->set('principal',$this->object->get('id'));
  320. $acl->set('principal_class','modUserGroup');
  321. if ($acl->save()) {
  322. $access[] = $acl;
  323. }
  324. }
  325. }
  326. return $access;
  327. }
  328. }
  329. return 'modUserGroupCreateProcessor';