role.rb 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class Role < ApplicationModel
  3. has_and_belongs_to_many :users, after_add: :cache_update, after_remove: :cache_update
  4. has_and_belongs_to_many :permissions, after_add: :cache_update, after_remove: :cache_update
  5. validates :name, presence: true
  6. store :preferences
  7. before_create :validate_permissions
  8. before_update :validate_permissions
  9. attributes_with_associations_support ignore: { user_ids: true }
  10. activity_stream_support permission: 'admin.role'
  11. notify_clients_support
  12. latest_change_support
  13. =begin
  14. grand permission to role
  15. role.permission_grand('permission.key')
  16. =end
  17. def permission_grand(key)
  18. permission = Permission.lookup(name: key)
  19. raise "Invalid permission #{key}" if !permission
  20. return true if permission_ids.include?(permission.id)
  21. self.permission_ids = permission_ids.push permission.id
  22. true
  23. end
  24. =begin
  25. revoke permission of role
  26. role.permission_revoke('permission.key')
  27. =end
  28. def permission_revoke(key)
  29. permission = Permission.lookup(name: key)
  30. raise "Invalid permission #{key}" if !permission
  31. return true if !permission_ids.include?(permission.id)
  32. self.permission_ids = self.permission_ids -= [permission.id]
  33. true
  34. end
  35. =begin
  36. get signup roles
  37. Role.signup_roles
  38. returns
  39. [role1, role2, ...]
  40. =end
  41. def self.signup_roles
  42. Role.where(active: true, default_at_signup: true)
  43. end
  44. =begin
  45. get signup role ids
  46. Role.signup_role_ids
  47. returns
  48. [role1, role2, ...]
  49. =end
  50. def self.signup_role_ids
  51. Role.where(active: true, default_at_signup: true).map(&:id)
  52. end
  53. =begin
  54. get all roles with permission
  55. roles = Role.with_permissions('admin.session')
  56. get all roles with permission "admin.session" or "ticket.agent"
  57. roles = Role.with_permissions(['admin.session', 'ticket.agent'])
  58. returns
  59. [user1, user2, ...]
  60. =end
  61. def self.with_permissions(keys)
  62. if keys.class != Array
  63. keys = [keys]
  64. end
  65. roles = []
  66. permission_ids = []
  67. keys.each { |key|
  68. Object.const_get('Permission').with_parents(key).each { |local_key|
  69. permission = Object.const_get('Permission').lookup(name: local_key)
  70. next if !permission
  71. permission_ids.push permission.id
  72. }
  73. next if permission_ids.empty?
  74. Role.joins(:roles_permissions).joins(:permissions).where('permissions_roles.permission_id IN (?) AND roles.active = ? AND permissions.active = ?', permission_ids, true, true).uniq().each { |role|
  75. roles.push role
  76. }
  77. }
  78. return [] if roles.empty?
  79. roles
  80. end
  81. private
  82. def validate_permissions
  83. return if !self.permission_ids
  84. permission_ids.each { |permission_id|
  85. permission = Permission.lookup(id: permission_id)
  86. raise "Unable to find permission for id #{permission_id}" if !permission
  87. raise "Permission #{permission.name} is disabled" if permission.preferences[:disabled] == true
  88. next unless permission.preferences[:not]
  89. permission.preferences[:not].each { |local_permission_name|
  90. local_permission = Permission.lookup(name: local_permission_name)
  91. next if !local_permission
  92. raise "Permission #{permission.name} conflicts with #{local_permission.name}" if permission_ids.include?(local_permission.id)
  93. }
  94. }
  95. end
  96. end