GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

Rolify.update_permissions()   B
last analyzed

Complexity

Conditions 8

Size

Total Lines 36

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 8
c 1
b 0
f 0
dl 0
loc 36
rs 7.1493
1
# frozen_string_literal: true
2
3
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/.
4
#
5
# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below).
6
#
7
# This program is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU Lesser General Public License as published by the Free Software
9
# Foundation; either version 3.0 of the License, or (at your option) any later
10
# version.
11
#
12
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
15
#
16
# You should have received a copy of the GNU Lesser General Public License along
17
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
18
19
module Rolify
20
  extend ActiveSupport::Concern
21
22
  # Gets all roles
23
  def all_roles(selected_role)
24
    @roles = Role.editable_roles(@user_domain)
25
26
    if @roles.count.zero?
27
      Role.create_default_roles(@user_domain)
28
      @roles = Role.editable_roles(@user_domain)
29
    end
30
31
    @selected_role = if selected_role.nil?
32
      @roles.find_by(name: 'user')
33
    else
34
      @roles.find(selected_role)
35
    end
36
37
    @roles
38
  end
39
40
  # Creates a new role
41
  def create_role(new_role_name)
42
    # Make sure that the role name isn't a duplicate or a reserved name like super_admin or empty
43
    return nil if Role.duplicate_name(new_role_name, @user_domain) || new_role_name.strip.empty?
44
45
    Role.create_new_role(new_role_name, @user_domain)
46
  end
47
48
  # Updates a user's roles
49
  def update_roles(roles)
50
    # Check that the user can manage users
51
    return true unless current_user.highest_priority_role.get_permission("can_manage_users")
52
53
    new_roles = roles.split(' ').map(&:to_i)
54
    old_roles = @user.roles.pluck(:id)
55
56
    added_role_ids = new_roles - old_roles
57
    removed_role_ids = old_roles - new_roles
58
59
    added_roles = []
60
    removed_roles = []
61
    current_user_role = current_user.highest_priority_role
62
63
    # Check that the user has the permissions to add all the new roles
64
    added_role_ids.each do |id|
65
      role = Role.find(id)
66
67
      # Admins are able to add the admin role to other users. All other roles may only
68
      # add roles with a higher priority
69
      if (role.priority > current_user_role.priority || current_user_role.name == "admin") &&
70
         role.provider == @user_domain
71
        added_roles << role
72
      else
73
        return false
74
      end
75
    end
76
77
    # Check that the user has the permissions to remove all the deleted roles
78
    removed_role_ids.each do |id|
79
      role = Role.find(id)
80
81
      # Admins are able to remove the admin role from other users. All other roles may only
82
      # remove roles with a higher priority
83
      if (role.priority > current_user_role.priority || current_user_role.name == "admin") &&
84
         role.provider == @user_domain
85
        removed_roles << role
86
      else
87
        return false
88
      end
89
    end
90
91
    # Send promoted/demoted emails
92
    added_roles.each { |role| send_user_promoted_email(@user, role) if role.get_permission("send_promoted_email") }
93
    removed_roles.each { |role| send_user_demoted_email(@user, role) if role.get_permission("send_demoted_email") }
94
95
    # Update the roles
96
    @user.roles.delete(removed_roles)
97
    @user.roles << added_roles
98
99
    # Make sure each user always has at least the user role
100
    @user.roles = [Role.find_by(name: "user", provider: @user_domain)] if @user.roles.count.zero?
101
102
    @user.save!
103
  end
104
105
  # Updates a roles priority
106
  def update_priority(role_to_update)
107
    user_role = Role.find_by(name: "user", provider: @user_domain)
108
    admin_role = Role.find_by(name: "admin", provider: @user_domain)
109
110
    current_user_role = current_user.highest_priority_role
111
112
    # Users aren't allowed to update the priority of the admin or user roles
113
    return false if role_to_update.include?(user_role.id.to_s) || role_to_update.include?(admin_role.id.to_s)
114
115
    # Restrict users to only updating the priority for roles in their domain with a higher
116
    # priority
117
    role_to_update.each do |id|
118
      role = Role.find(id)
119
      return false if role.priority <= current_user_role.priority || role.provider != @user_domain
120
    end
121
122
    # Update the roles priority including the user role
123
    top_priority = 0
124
125
    role_to_update.each_with_index do |id, index|
126
      new_priority = index + [current_user_role.priority, 0].max + 1
127
      top_priority = new_priority
128
      Role.where(id: id).update_all(priority: new_priority)
129
    end
130
131
    user_role.priority = top_priority + 1
132
    user_role.save!
133
  end
134
135
  # Update Permissions
136
  def update_permissions(role)
137
    current_user_role = current_user.highest_priority_role
138
139
    # Checks that it is valid for the provider to update the role
140
    return false if role.priority <= current_user_role.priority || role.provider != @user_domain
141
142
    role_params = params.require(:role).permit(:name)
143
    permission_params = params.require(:role).permit(:can_create_rooms, :send_promoted_email,
144
      :send_demoted_email, :can_edit_site_settings, :can_edit_roles, :can_manage_users, :colour)
145
146
    permission_params.transform_values! do |v|
147
      if v == "0"
148
        "false"
149
      elsif v == "1"
150
        "true"
151
      else
152
        v
153
      end
154
    end
155
156
    # Role is a default role so users can't change the name
157
    role_params[:name] = role.name if Role::RESERVED_ROLE_NAMES.include?(role.name)
158
159
    # Make sure if the user is updating the role name that the role name is valid
160
    if role.name != role_params[:name] && !Role.duplicate_name(role_params[:name], @user_domain) &&
161
       !role_params[:name].strip.empty?
162
      role.name = role_params[:name]
163
    elsif role.name != role_params[:name]
164
      return false
165
    end
166
167
    role.update(colour: permission_params[:colour])
168
    role.update_all_role_permissions(permission_params)
169
170
    role.save!
171
  end
172
end
173