role.rb 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class Role < ApplicationModel
  3. include LogsActivityStream
  4. include NotifiesClients
  5. include LatestChangeObserved
  6. has_and_belongs_to_many :users, after_add: :cache_update, after_remove: :cache_update
  7. has_and_belongs_to_many :permissions, after_add: :cache_update, after_remove: :cache_update, before_add: :validate_agent_limit
  8. validates :name, presence: true
  9. store :preferences
  10. before_create :validate_permissions
  11. before_update :validate_permissions
  12. association_attributes_ignored :user_ids
  13. activity_stream_permission 'admin.role'
  14. =begin
  15. grant permission to role
  16. role.permission_grant('permission.key')
  17. =end
  18. def permission_grant(key)
  19. permission = Permission.lookup(name: key)
  20. raise "Invalid permission #{key}" if !permission
  21. return true if permission_ids.include?(permission.id)
  22. self.permission_ids = permission_ids.push permission.id
  23. true
  24. end
  25. =begin
  26. revoke permission of role
  27. role.permission_revoke('permission.key')
  28. =end
  29. def permission_revoke(key)
  30. permission = Permission.lookup(name: key)
  31. raise "Invalid permission #{key}" if !permission
  32. return true if !permission_ids.include?(permission.id)
  33. self.permission_ids = self.permission_ids -= [permission.id]
  34. true
  35. end
  36. =begin
  37. get signup roles
  38. Role.signup_roles
  39. returns
  40. [role1, role2, ...]
  41. =end
  42. def self.signup_roles
  43. Role.where(active: true, default_at_signup: true)
  44. end
  45. =begin
  46. get signup role ids
  47. Role.signup_role_ids
  48. returns
  49. [role1, role2, ...]
  50. =end
  51. def self.signup_role_ids
  52. Role.where(active: true, default_at_signup: true).map(&:id)
  53. end
  54. =begin
  55. get all roles with permission
  56. roles = Role.with_permissions('admin.session')
  57. get all roles with permission "admin.session" or "ticket.agent"
  58. roles = Role.with_permissions(['admin.session', 'ticket.agent'])
  59. returns
  60. [role1, role2, ...]
  61. =end
  62. def self.with_permissions(keys)
  63. if keys.class != Array
  64. keys = [keys]
  65. end
  66. roles = []
  67. permission_ids = []
  68. keys.each { |key|
  69. Object.const_get('Permission').with_parents(key).each { |local_key|
  70. permission = Object.const_get('Permission').lookup(name: local_key)
  71. next if !permission
  72. permission_ids.push permission.id
  73. }
  74. next if permission_ids.empty?
  75. 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|
  76. roles.push role
  77. }
  78. }
  79. return [] if roles.empty?
  80. roles
  81. end
  82. private
  83. def validate_permissions
  84. return if !self.permission_ids
  85. permission_ids.each { |permission_id|
  86. permission = Permission.lookup(id: permission_id)
  87. raise "Unable to find permission for id #{permission_id}" if !permission
  88. raise "Permission #{permission.name} is disabled" if permission.preferences[:disabled] == true
  89. next unless permission.preferences[:not]
  90. permission.preferences[:not].each { |local_permission_name|
  91. local_permission = Permission.lookup(name: local_permission_name)
  92. next if !local_permission
  93. raise "Permission #{permission.name} conflicts with #{local_permission.name}" if permission_ids.include?(local_permission.id)
  94. }
  95. }
  96. end
  97. def validate_agent_limit(permission)
  98. return if !Setting.get('system_agent_limit')
  99. return if permission.name != 'ticket.agent'
  100. ticket_agent_role_ids = Role.joins(:permissions).where(permissions: { name: 'ticket.agent' }).pluck(:id)
  101. ticket_agent_role_ids.push(id)
  102. count = User.joins(:roles).where(roles: { id: ticket_agent_role_ids }, users: { active: true }).count
  103. raise Exceptions::UnprocessableEntity, 'Agent limit exceeded, please check your account settings.' if count > Setting.get('system_agent_limit')
  104. end
  105. end