Class: Bigbluebutton::RoomsController

Inherits:
ApplicationController
  • Object
show all
Defined in:
app/controllers/bigbluebutton/rooms_controller.rb

Instance Method Summary collapse

Instance Method Details

#authObject

Authenticates an user using name and password passed in the params from #invite Uses params to get the target room



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 150

def auth
  @room = BigbluebuttonRoom.find_by_param(params[:id]) unless params[:id].blank?
  if @room.nil?
    message = t('bigbluebutton_rails.rooms.errors.auth.wrong_params')
    redirect_to request.referer, :notice => message
    return
  end

  name = bigbluebutton_user.nil? ? params[:user][:name] : bigbluebutton_user.name
  role = bigbluebutton_role(@room)
  if role.nil?
    raise BigbluebuttonRails::RoomAccessDenied.new
  elsif role == :password
    role = @room.user_role(params[:user])
  end

  unless role.nil? or name.nil? or name.empty?
    join_internal(name, role, :invite)
  else
    flash[:error] = t('bigbluebutton_rails.rooms.errors.auth.failure')
    render :invite, :status => :unauthorized
  end
end

#createObject



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 26

def create
  @room = BigbluebuttonRoom.new(params[:bigbluebutton_room])

  if !params[:bigbluebutton_room].has_key?(:meetingid) or
      params[:bigbluebutton_room][:meetingid].blank?
    @room.meetingid = @room.name
  end

  respond_with @room do |format|
    if @room.save
      message = t('bigbluebutton_rails.rooms.notice.create.success')
      format.html {
        params[:redir_url] ||= bigbluebutton_room_path(@room)
        redirect_to params[:redir_url], :notice => message
      }
      format.json { render :json => { :message => message }, :status => :created }
    else
      format.html {
        unless params[:redir_url].blank?
          message = t('bigbluebutton_rails.rooms.notice.create.failure')
          redirect_to params[:redir_url], :error => message
        else
          render :new
        end
      }
      format.json { render :json => @room.errors.full_messages, :status => :unprocessable_entity }
    end
  end
end

#destroyObject



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 84

def destroy
  # TODO Destroy the room record even if end_meeting failed?

  error = false
  begin
    @room.fetch_is_running?
    @room.send_end if @room.is_running?
  rescue BigBlueButton::BigBlueButtonException => e
    error = true
    message = e.to_s
    # TODO Better error message: "Room destroyed in DB, but not in BBB..."
  end

  @room.destroy

  respond_with do |format|
    format.html {
      flash[:error] = message if error
      params[:redir_url] ||= bigbluebutton_rooms_url
      redirect_to params[:redir_url]
    }
    if error
      format.json { render :json => { :message => message }, :status => :error }
    else
      message = t('bigbluebutton_rails.rooms.notice.destroy.success')
      format.json { render :json => { :message => message } }
    end
  end
end

#editObject



22
23
24
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 22

def edit
  respond_with(@room)
end

#endObject



236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 236

def end
  error = false
  begin
    @room.fetch_is_running?
    if @room.is_running?
      @room.send_end
      message = t('bigbluebutton_rails.rooms.notice.end.success')
    else
      error = true
      message = t('bigbluebutton_rails.rooms.notice.end.not_running')
    end
  rescue BigBlueButton::BigBlueButtonException => e
    error = true
    message = e.to_s
  end

  if error
    respond_with do |format|
      format.html {
        flash[:error] = message
        redirect_to request.referer
      }
      format.json { render :json => message, :status => :error }
    end
  else
    respond_with do |format|
      format.html {
        redirect_to(bigbluebutton_room_path(@room), :notice => message)
      }
      format.json { render :json => message }
    end
  end

end

#externalObject

receives :server_id to indicate the server and :meeting to indicate the MeetingID of the meeting that should be joined



176
177
178
179
180
181
182
183
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 176

def external
  if params[:meeting].blank?
    message = t('bigbluebutton_rails.rooms.errors.external.blank_meetingid')
    params[:redir_url] ||= bigbluebutton_rooms_path
    redirect_to params[:redir_url], :notice => message
  end
  @room = BigbluebuttonRoom.new(:server => @server, :meetingid => params[:meeting])
end

#external_authObject

Authenticates an user using name and password passed in the params from #external Uses params to get the meetingID of the target room



187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 187

def external_auth
  # check :meeting and :user
  if !params[:meeting].blank? && !params[:user].blank?
    @server.fetch_meetings
    @room = @server.meetings.select{ |r| r.meetingid == params[:meeting] }.first
    message = t('bigbluebutton_rails.rooms.errors.external.inexistent_meeting') if @room.nil?
  else
    message = t('bigbluebutton_rails.rooms.errors.external.wrong_params')
  end

  unless message.nil?
    @room = nil
    redirect_to request.referer, :notice => message
    return
  end

  # This is just to check if the room is not blocked, not to get the actual role
  raise BigbluebuttonRails::RoomAccessDenied.new if bigbluebutton_role(@room).nil?

  # if there's a user logged, use his name instead of the name in the params
  name = bigbluebutton_user.nil? ? params[:user][:name] : bigbluebutton_user.name
  role = @room.user_role(params[:user])

  # FIXME: use internal_join ?
  unless role.nil? or name.nil? or name.empty?
    url = @room.perform_join(name, role, request)
    unless url.nil?
      redirect_to(url)
    else
      flash[:error] = t('bigbluebutton_rails.rooms.errors.auth.not_running')
      render :external
    end
  else
    flash[:error] = t('bigbluebutton_rails.rooms.errors.auth.failure')
    render :external, :status => :unauthorized
  end
end

#indexObject



10
11
12
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 10

def index
  respond_with(@rooms = BigbluebuttonRoom.all)
end

#inviteObject

Used to join private rooms or to invited anonymous users (not logged)



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 130

def invite
  respond_with @room do |format|

    role = bigbluebutton_role(@room)
    if role.nil?
      raise BigbluebuttonRails::RoomAccessDenied.new

    # if there's already a logged user with a role in the room, join through #join
    elsif !bigbluebutton_user.nil? and role != :password
      format.html { redirect_to :action => :join }

    else
      format.html
    end

  end
end

#joinObject

Used by logged users to join public rooms.



115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 115

def join
  role = bigbluebutton_role(@room)
  if role.nil?
    raise BigbluebuttonRails::RoomAccessDenied.new

  # anonymous users or users with the role :password join through #invite
  elsif bigbluebutton_user.nil? or role == :password
    redirect_to :action => :invite

  else
    join_internal(bigbluebutton_user.name, role, :join)
  end
end

#join_mobileObject



271
272
273
274
275
276
277
278
279
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 271

def join_mobile
  @join_url = join_bigbluebutton_room_url(@room, :mobile => '1')
  @join_url.gsub!(/http:\/\//i, "bigbluebutton://")

  # TODO: we can't use the mconf url because the mobile client scanning the qrcode is not
  # logged. so we are using the full BBB url for now.
  @qrcode_url = @room.join_url(bigbluebutton_user.name, bigbluebutton_role(@room))
  @qrcode_url.gsub!(/http:\/\//i, "bigbluebutton://")
end

#newObject



18
19
20
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 18

def new
  respond_with(@room = BigbluebuttonRoom.new)
end

#runningObject



225
226
227
228
229
230
231
232
233
234
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 225

def running
  begin
    @room.fetch_is_running?
  rescue BigBlueButton::BigBlueButtonException => e
    flash[:error] = e.to_s
    render :json => { :running => "false", :error => "#{e.to_s}" }
  else
    render :json => { :running => "#{@room.is_running?}" }
  end
end

#showObject



14
15
16
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 14

def show
  respond_with(@room)
end

#updateObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'app/controllers/bigbluebutton/rooms_controller.rb', line 56

def update
  if !params[:bigbluebutton_room].has_key?(:meetingid) or
      params[:bigbluebutton_room][:meetingid].blank?
    params[:bigbluebutton_room][:meetingid] = params[:bigbluebutton_room][:name]
  end

  respond_with @room do |format|
    if @room.update_attributes(params[:bigbluebutton_room])
      message = t('bigbluebutton_rails.rooms.notice.update.success')
      format.html {
        params[:redir_url] ||= bigbluebutton_room_path(@room)
        redirect_to params[:redir_url], :notice => message
      }
      format.json { render :json => { :message => message } }
    else
      format.html {
        unless params[:redir_url].blank?
          message = t('bigbluebutton_rails.rooms.notice.update.failure')
          redirect_to params[:redir_url], :error => message
        else
          render :edit
        end
      }
      format.json { render :json => @room.errors.full_messages, :status => :unprocessable_entity }
    end
  end
end