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.

RoomsController   C
last analyzed

Complexity

Total Complexity 56

Size/Duplication

Total Lines 245
Duplicated Lines 0 %

Importance

Changes 4
Bugs 2 Features 0
Metric Value
c 4
b 2
f 0
dl 0
loc 245
rs 5.5199
wmc 56

9 Methods

Rating   Name   Duplication   Size   Complexity  
A login() 0 7 2
A room_limit_exceeded() 0 9 3
A verify_user_not_admin() 0 3 2
A auth_required() 0 3 1
A join_specific_room() 0 11 2
B show() 0 23 5
A room_params() 0 4 1
B create() 0 24 5
A destroy() 0 6 3

How to fix   Complexity   

Complex Class

Complex classes like RoomsController often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

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
class RoomsController < ApplicationController
20
  include Pagy::Backend
21
  include Recorder
22
  include Joiner
23
24
  before_action :validate_accepted_terms, unless: -> { !Rails.configuration.terms }
25
  before_action :validate_verified_email, except: [:show, :join],
26
                unless: -> { !Rails.configuration.enable_email_verification }
27
  before_action :find_room, except: [:create, :join_specific_room]
28
  before_action :verify_room_ownership, only: [:destroy, :start, :update_settings]
29
  before_action :verify_room_owner_verified, only: [:show, :join],
30
                unless: -> { !Rails.configuration.enable_email_verification }
31
  before_action :verify_user_not_admin, only: [:show]
32
33
  # POST /
34
  def create
35
    # Return to root if user is not signed in
36
    return redirect_to root_path unless current_user
37
38
    # Check if the user has not exceeded the room limit
39
    return redirect_to current_user.main_room, flash: { alert: I18n.t("room.room_limit") } if room_limit_exceeded
40
41
    # Create room
42
    @room = Room.new(name: room_params[:name], access_code: room_params[:access_code])
43
    @room.owner = current_user
44
    @room.room_settings = create_room_settings_string(room_params)
45
46
    # Save the room and redirect if it fails
47
    return redirect_to current_user.main_room, flash: { alert: I18n.t("room.create_room_error") } unless @room.save
48
49
    logger.info "Support: #{current_user.email} has created a new room #{@room.uid}."
50
51
    # Redirect to room is auto join was not turned on
52
    return redirect_to @room,
53
      flash: { success: I18n.t("room.create_room_success") } unless room_params[:auto_join] == "1"
54
55
    # Start the room if auto join was turned on
56
    start
57
  end
58
59
  # GET /:room_uid
60
  def show
61
    @anyone_can_start = JSON.parse(@room[:room_settings])["anyoneCanStart"]
62
    @room_running = room_running?(@room.bbb_id)
63
64
    # If its the current user's room
65
    if current_user && @room.owned_by?(current_user)
66
      if current_user.highest_priority_role.get_permission("can_create_rooms")
67
        # User is allowed to have rooms
68
        @search, @order_column, @order_direction, recs =
69
          recordings(@room.bbb_id, params.permit(:search, :column, :direction), true)
70
71
        @pagy, @recordings = pagy_array(recs)
72
      else
73
        # Render view for users that cant create rooms
74
        @recent_rooms = Room.where(id: cookies.encrypted["#{current_user.uid}_recently_joined_rooms"])
75
        render :cant_create_rooms
76
      end
77
    else
78
      return redirect_to root_path, flash: { alert: I18n.t("room.invalid_provider") } if incorrect_user_domain
79
80
      show_user_join
81
    end
82
  end
83
84
  # POST /:room_uid
85
  def join
86
    return redirect_to root_path,
87
      flash: { alert: I18n.t("administrator.site_settings.authentication.user-info") } if auth_required
88
89
    unless @room.owned_by?(current_user)
90
      # Don't allow users to join unless they have a valid access code or the room doesn't have an access code
91
      if @room.access_code && [email protected]_code.empty? && @room.access_code != session[:access_code]
92
        return redirect_to room_path(room_uid: params[:room_uid]), flash: { alert: I18n.t("room.access_code_required") }
93
      end
94
95
      # Assign join name if passed.
96
      if params[@room.invite_path]
97
        @join_name = params[@room.invite_path][:join_name]
98
      elsif !params[:join_name]
99
        # Join name not passed.
100
        return redirect_to root_path
101
      end
102
    end
103
104
    # create or update cookie with join name
105
    cookies.encrypted[:greenlight_name] = @join_name unless cookies.encrypted[:greenlight_name] == @join_name
106
107
    save_recent_rooms
108
109
    logger.info "Support: #{current_user.present? ? current_user.email : @join_name} is joining room #{@room.uid}"
110
    join_room(default_meeting_options)
111
  end
112
113
  # DELETE /:room_uid
114
  def destroy
115
    # Don't delete the users home room.
116
    @room.destroy if @room.owned_by?(current_user) && @room != current_user.main_room
117
118
    redirect_to current_user.main_room
119
  end
120
121
  # POST /room/join
122
  def join_specific_room
123
    room_uid = params[:join_room][:url].split('/').last
124
125
    begin
126
      @room = Room.find_by!(uid: room_uid)
127
    rescue ActiveRecord::RecordNotFound
128
      return redirect_to current_user.main_room, alert: I18n.t("room.no_room.invalid_room_uid")
129
    end
130
131
    redirect_to room_path(@room)
132
  end
133
134
  # POST /:room_uid/start
135
  def start
136
    logger.info "Support: #{current_user.email} is starting room #{@room.uid}"
137
138
    # Join the user in and start the meeting.
139
    opts = default_meeting_options
140
    opts[:user_is_moderator] = true
141
142
    # Include the user's choices for the room settings
143
    room_settings = JSON.parse(@room[:room_settings])
144
    opts[:mute_on_start] = room_settings["muteOnStart"]
145
    opts[:require_moderator_approval] = room_settings["requireModeratorApproval"]
146
147
    begin
148
      redirect_to join_path(@room, current_user.name, opts, current_user.uid)
149
    rescue BigBlueButton::BigBlueButtonException => e
150
      logger.error("Support: #{@room.uid} start failed: #{e}")
151
152
      redirect_to room_path, alert: I18n.t(e.key.to_s.underscore, default: I18n.t("bigbluebutton_exception"))
153
    end
154
155
    # Notify users that the room has started.
156
    # Delay 5 seconds to allow for server start, although the request will retry until it succeeds.
157
    NotifyUserWaitingJob.set(wait: 5.seconds).perform_later(@room)
158
  end
159
160
  # POST /:room_uid/update_settings
161
  def update_settings
162
    begin
163
      options = params[:room].nil? ? params : params[:room]
164
      raise "Room name can't be blank" if options[:name].blank?
165
      raise "Unauthorized Request" if [email protected]_by?(current_user) || @room == current_user.main_room
166
167
      # Update the rooms values
168
      room_settings_string = create_room_settings_string(options)
169
170
      @room.update_attributes(
171
        name: options[:name],
172
        room_settings: room_settings_string,
173
        access_code: options[:access_code]
174
      )
175
176
      flash[:success] = I18n.t("room.update_settings_success")
177
    rescue => e
178
      logger.error "Support: Error in updating room settings: #{e}"
179
      flash[:alert] = I18n.t("room.update_settings_error")
180
    end
181
182
    redirect_to room_path
183
  end
184
185
  # GET /:room_uid/logout
186
  def logout
187
    logger.info "Support: #{current_user.present? ? current_user.email : 'Guest'} has left room #{@room.uid}"
188
189
    # Redirect the correct page.
190
    redirect_to @room
191
  end
192
193
  # POST /:room_uid/login
194
  def login
195
    session[:access_code] = room_params[:access_code]
196
197
    flash[:alert] = I18n.t("room.access_code_required") if session[:access_code] != @room.access_code
198
199
    redirect_to room_path(@room.uid)
200
  end
201
202
  private
203
204
  def create_room_settings_string(options)
205
    room_settings = {
206
      "muteOnStart": options[:mute_on_join] == "1",
207
      "requireModeratorApproval": options[:require_moderator_approval] == "1",
208
      "anyoneCanStart": options[:anyone_can_start] == "1",
209
      "joinModerator": options[:all_join_moderator] == "1",
210
    }
211
212
    room_settings.to_json
213
  end
214
215
  def room_params
216
    params.require(:room).permit(:name, :auto_join, :mute_on_join, :access_code,
217
      :require_moderator_approval, :anyone_can_start, :all_join_moderator)
218
  end
219
220
  # Find the room from the uid.
221
  def find_room
222
    @room = Room.find_by!(uid: params[:room_uid])
223
  end
224
225
  # Ensure the user is logged into the room they are accessing.
226
  def verify_room_ownership
227
    return redirect_to root_path unless @room.owned_by?(current_user)
228
  end
229
230
  def validate_accepted_terms
231
    redirect_to terms_path if current_user && !current_user&.accepted_terms
232
  end
233
234
  def validate_verified_email
235
    redirect_to account_activation_path(current_user) if current_user && !current_user&.activated?
236
  end
237
238
  def verify_room_owner_verified
239
    unless @room.owner.activated?
240
      flash[:alert] = t("room.unavailable")
241
      redirect_to root_path
242
    end
243
  end
244
245
  def verify_user_not_admin
246
    redirect_to admins_path if current_user&.has_role?(:super_admin)
247
  end
248
249
  def auth_required
250
    @settings.get_value("Room Authentication") == "true" && current_user.nil?
251
  end
252
253
  def room_limit_exceeded
254
    limit = @settings.get_value("Room Limit").to_i
255
256
    # Does not apply to admin or users that aren't signed in
257
    # 15+ option is used as unlimited
258
    return false if current_user&.has_role?(:admin) || limit == 15
259
260
    current_user.rooms.length >= limit
261
  end
262
  helper_method :room_limit_exceeded
263
end
264