PageRenderTime 58ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/app/Model/Permission.php

https://bitbucket.org/FuscaSoftware/candycane
PHP | 248 lines | 181 code | 27 blank | 40 comment | 21 complexity | 9391f5e82aa59287705d32a68fd388b3 MD5 | raw file
  1. <?php
  2. /* vim: fenc=utf8 ff=unix
  3. *
  4. *
  5. */
  6. class Permission extends AppModel
  7. {
  8. var $name = "Permission";
  9. var $useTable = false;
  10. var $permissions = array();
  11. function Permission()
  12. {
  13. $this->set('view_project', array('projects' => array('show', 'activity')), array('public' => true));
  14. $this->set('search_project', array('search' => 'index'), array('public' => true));
  15. $this->set('edit_project', array('projects' => array('settings', 'edit')), array('require' => 'member'));
  16. $this->set('select_project_modules', array('projects' => 'modules'), array('require' => 'member'));
  17. $this->set('manage_members', array('projects' => 'settings', 'members' => array('new', 'edit', 'destroy')), array('require' => 'member'));
  18. $this->set('manage_versions', array('projects' => array('settings', 'add_version'),'versions' => array('edit', 'destroy')), array('require' => 'member'));
  19. // map.project_module 'issue'_tracking do |map|);
  20. # Issue categories);
  21. $this->set('manage_categories', array('projects' => array('settings', 'add_issue_category'),
  22. 'issue_categories' => array('edit', 'destroy')), array('require' => 'member'), 'issue_tracking');
  23. # Issues);
  24. $this->set('view_issues', array('projects' => array('changelog', 'roadmap'),
  25. 'issues' => array('index', 'changes', 'show', 'context_menu'),
  26. 'versions' => array('show', 'status_by'),
  27. 'queries' => 'index',
  28. 'reports' => 'issue_report'), array('public' => true), 'issue_tracking');
  29. $this->set('add_issues', array('issues' => 'new'), array(), 'issue_tracking');
  30. $this->set('edit_issues', array('issues' => array('edit', 'reply', 'bulk_edit')), array(), 'issue_tracking');
  31. $this->set('manage_issue_relations', array('issue_relations' => array('new', 'destroy')), array(), 'issue_tracking');
  32. $this->set('add_issue_notes', array('issues' => array('edit', 'reply')), array(), 'issue_tracking');
  33. $this->set('edit_issue_notes', array('journals' => 'edit'), array('require' => 'loggedin'), 'issue_tracking');
  34. $this->set('edit_own_issue_notes', array('journals' => 'edit'), array('require' => 'loggedin'), 'issue_tracking');
  35. $this->set('move_issues', array('issues' => 'move'), array('require' => 'loggedin'), 'issue_tracking');
  36. $this->set('delete_issues', array('issues' => 'destroy'), array('require' => 'member'), 'issue_tracking');
  37. # Queries
  38. $this->set('manage_public_queries', array('queries' => array('new', 'edit', 'destroy')), array('require' => 'member'), 'issue_tracking');
  39. $this->set('save_queries', array('queries' => array('new', 'edit', 'destroy')), array('require' => 'loggedin'), 'issue_tracking');
  40. # Gantt & calendar
  41. $this->set('view_gantt', array('issues' => 'gantt'), array(), 'issue_tracking');
  42. $this->set('view_calendar', array('issues' => 'calendar'), array(), 'issue_tracking');
  43. # Watchers
  44. $this->set('view_issue_watchers', array(), array(), 'issue_tracking');
  45. $this->set('add_issue_watchers', array('watchers' => 'new'), array(), 'issue_tracking');
  46. // end
  47. // map.project_module 'time'_tracking do |map|);
  48. $this->set('log_time', array('timelog' => 'edit'), array('require' => 'loggedin'), 'time_tracking');
  49. $this->set('view_time_entries', array('timelog' => array('details', 'report')), array(), 'time_tracking');
  50. $this->set('edit_time_entries', array('timelog' => array('edit', 'destroy')), array('require' => 'member'), 'time_tracking');
  51. $this->set('edit_own_time_entries', array('timelog' => array('edit', 'destroy')), array('require' => 'loggedin'), 'time_tracking');
  52. // end);
  53. // map.project_module 'news' do |map|);
  54. $this->set('manage_news', array('news' => array('new', 'edit', 'destroy', 'destroy_comment')), array('require' => 'member'), 'news');
  55. $this->set('view_news', array('news' => array('index', 'show')), array('public' => true), 'news');
  56. $this->set('comment_news', array('news' => 'add_comment'), array(), 'news');
  57. // end);
  58. // map.project_module 'documents' do |map|);
  59. $this->set('manage_documents', array('documents' => array('new', 'edit', 'destroy', 'add_attachment')), array('require' => 'loggedin'), 'documents');
  60. $this->set('view_documents', array('documents' => array('index', 'show', 'download')), array(), 'documents');
  61. // end
  62. // map.project_module 'files' do |map|);
  63. $this->set('manage_files', array('projects' => 'add_file'), array('require' => 'loggedin'), 'files');
  64. $this->set('view_files', array('projects' => 'list_files', 'versions' => 'download'), array(), 'files');
  65. // end
  66. // map.project_module 'wiki' do |map|);
  67. $this->set('manage_wiki', array('wikis' => array('edit', 'destroy')), array('require' => 'member'), 'wiki');
  68. $this->set('rename_wiki_pages', array('wiki' => 'rename'), array('require' => 'member'), 'wiki');
  69. $this->set('delete_wiki_pages', array('wiki' => 'destroy'), array('require' => 'member'), 'wiki');
  70. $this->set('view_wiki_pages', array('wiki' => array('index', 'special')), array(), 'wiki');
  71. $this->set('view_wiki_edits', array('wiki' => array('history', 'diff', 'annotate')), array(), 'wiki');
  72. $this->set('edit_wiki_pages', array('wiki' => array('edit', 'preview', 'add_attachment')), array(), 'wiki');
  73. $this->set('delete_wiki_pages_attachments', array(), array(), 'wiki');
  74. $this->set('protect_wiki_pages', array('wiki' => 'protect'), array('require' => 'member'), 'wiki');
  75. // end);
  76. // map.project_module 'repository' do |map|);
  77. $this->set('manage_repository', array('repositories' => array('edit', 'committers', 'destroy')), array('require' => 'member'), 'repository');
  78. $this->set('browse_repository', array('repositories' => array('show', 'browse', 'entry', 'annotate', 'changes', 'diff', 'stats', 'graph')), array(), 'repository');
  79. $this->set('view_changesets', array('repositories' => array('show', 'revisions', 'revision')), array(), 'repository');
  80. $this->set('commit_access', array(), array(), 'repository');
  81. // end);
  82. // map.project_module 'boards' do |map|);
  83. // $this->set('manage_boards', array('boards' => array('new', 'edit', 'destroy')), array('require' => 'member'), 'boards');
  84. // $this->set('view_messages', array('boards' => array('index', 'show'), array('messages' => array('show'))), array('public' => true), 'boards');
  85. // $this->set('add_messages', array('messages' => array('new', 'reply', 'quote')), array(), 'boards');
  86. // $this->set('edit_messages', array('messages' => 'edit'), array('require' => 'member'), 'boards');
  87. // $this->set('edit_own_messages', array('messages' => 'edit'), array('require' => 'loggedin'), 'boards');
  88. // $this->set('delete_messages', array('messages' => 'destroy'), array('require' => 'member'), 'boards');
  89. // $this->set('delete_own_messages', array('messages' => 'destroy'), array('require' => 'loggedin'), 'boards');
  90. // end)
  91. }
  92. function set($name, $hash, $options = array(), $module = null)
  93. {
  94. $permission = array('name'=>$name);
  95. $actions = array();
  96. foreach($hash as $controller=>$value) {
  97. if (is_array($value)) {
  98. foreach($value as $action) {
  99. $actions[] = $controller.'/'.$action;
  100. }
  101. } else {
  102. $actions[] = $controller.'/'.$value;
  103. }
  104. }
  105. $permission['actions'] = $actions;
  106. $permission['require'] = isset($options['require']) ? $options['require'] : null;
  107. $permission['public'] = isset($options['public']) ? $options['public'] : false;
  108. $permission['project_module'] = $module;
  109. $permission['project_module'] = isset($options['project_module']) ? $options['project_module'] : $permission['project_module'];
  110. $this->permissions[$module][$name] = $permission;
  111. }
  112. /**
  113. * Returns the permission of given name or nil if it wasn't found
  114. * Argument should be a symbol
  115. * name of redmine is permission(name)
  116. */
  117. function findByName($name) {
  118. foreach($this->permissions as $permission) {
  119. if (!empty($permission[$name])) {
  120. return $permission[$name];
  121. }
  122. }
  123. return array();
  124. }
  125. function available_project_modules()
  126. {
  127. $modules = array();
  128. foreach($this->permissions as $module=>$permission) {
  129. if ($module != null) {
  130. $modules[$module] = $module;
  131. }
  132. }
  133. return $modules;
  134. }
  135. // from role.php
  136. function setable_permissions_name($builtin = null)
  137. {
  138. return $this->get_setable_permissions($builtin, 'name');
  139. }
  140. // from role.php
  141. function setable_permissions($builtin = null)
  142. {
  143. return $this->get_setable_permissions($builtin);
  144. }
  145. public function get_setable_permissions($builtin = null, $get_type = 'all'){
  146. $tmp = array();
  147. foreach ($this->permissions as $module => $perms) {
  148. foreach ($perms as $p) {
  149. $_add_flag = false;
  150. if ($p['public'] != true) {
  151. switch ($builtin) {
  152. case 1:
  153. if ($p['require'] != 'member') {
  154. $_add_flag = true;
  155. }
  156. break;
  157. case 2:
  158. if (($p['require'] != 'loggedin')&&($p['require'] != 'member')) {
  159. $_add_flag = true;
  160. }
  161. break;
  162. default:
  163. $_add_flag = true;
  164. }
  165. }
  166. if($_add_flag){
  167. switch($get_type){
  168. case 'name':
  169. $tmp[] = ':' . $p['name'];
  170. break;
  171. default:
  172. $tmp[$module][ $p['name'] ] = $this->permissions[$module][ $p['name'] ];
  173. break;
  174. }
  175. }
  176. }
  177. }
  178. return $tmp;
  179. }
  180. function non_public_permissions() {
  181. $tmp = array();
  182. foreach ($this->permissions as $module => $perms) {
  183. foreach ($perms as $p) {
  184. if ($p['public'] != true) {
  185. $tmp[$module][ $p['name'] ] = $this->permissions[$module][ $p['name'] ];
  186. }
  187. }
  188. }
  189. return $tmp;
  190. }
  191. function public_permissions() {
  192. $tmp = array();
  193. foreach ($this->permissions as $module => $perms) {
  194. foreach ($perms as $name => $p) {
  195. if ($p['public']) {
  196. $tmp[$module][$name] = $this->permissions[$module][$name];
  197. }
  198. }
  199. }
  200. return $tmp;
  201. }
  202. # Returns the actions that are allowed by the permission of given name
  203. function allowed_actions($permission_name) {
  204. $perm = $this->findByName($permission_name);
  205. return $perm ? $perm['actions'] : array();
  206. }
  207. public function modules_permissions($modules) {
  208. $tmp = array();
  209. foreach ($this->permissions as $module => $perms) {
  210. foreach ($perms as $name => $p) {
  211. if (
  212. ($p['project_module'] == null) ||
  213. ( is_array($modules) && in_array($p['project_module'], $modules))
  214. ) {
  215. $tmp[$module][$name] = $this->permissions[$module][$name];
  216. }
  217. }
  218. }
  219. return $tmp;
  220. }
  221. }