diff --git a/app/controllers/bbb_controller.rb b/app/controllers/bbb_controller.rb index bc65542e..65e73542 100644 --- a/app/controllers/bbb_controller.rb +++ b/app/controllers/bbb_controller.rb @@ -1,7 +1,8 @@ class BbbController < ApplicationController include BbbApi - before_action :authorize_owner_recording, only: [:update_recordings, :delete_recordings] + before_action :authorize_recording_owner!, only: [:update_recordings, :delete_recordings] + before_action :load_and_authorize_room_owner!, only: [:end] # GET /:resource/:id/join def join @@ -36,12 +37,17 @@ class BbbController < ApplicationController end end + # DELETE /rooms/:id/end + def end + load_and_authorize_room_owner! + + bbb_res = bbb_end_meeting @user.username + render_bbb_response bbb_res + end + # GET /rooms/:id/recordings def recordings - @user = User.find_by username: params[:id] - if !@user - render head(:not_found) && return - end + load_room! bbb_res = bbb_get_recordings @user.username render_bbb_response bbb_res, bbb_res[:recordings] @@ -64,18 +70,27 @@ class BbbController < ApplicationController private - def authorize_owner_recording - user = User.find_by username: params[:id] - if !user + def load_room! + @user = User.find_by username: params[:id] + if !@user render head(:not_found) && return - elsif !current_user || current_user != user + end + end + + def load_and_authorize_room_owner! + load_room! + + if !current_user || current_user != @user render head(:unauthorized) && return end + end + + def authorize_recording_owner! + load_and_authorize_room_owner! recordings = bbb_get_recordings(params[:id])[:recordings] recordings.each do |recording| if recording[:recordID] == params[:record_id] - @user = user return true end end @@ -87,6 +102,6 @@ class BbbController < ApplicationController @message = bbb_res[:message] @status = bbb_res[:status] @response = response - render status: @status && return + render status: @status end end diff --git a/app/lib/bbb_api.rb b/app/lib/bbb_api.rb index a6ba019e..ba20755e 100644 --- a/app/lib/bbb_api.rb +++ b/app/lib/bbb_api.rb @@ -11,6 +11,10 @@ module BbbApi @bbb ||= BigBlueButton::BigBlueButtonApi.new(bbb_endpoint + "api", bbb_secret, "0.8", true) end + def bbb_meeting_id(id) + Digest::SHA1.hexdigest(Rails.application.secrets[:secret_key_base]+id).to_s + end + def random_password(length) o = [('a'..'z'), ('A'..'Z')].map { |i| i.to_a }.flatten password = (0...length).map { o[rand(o.length)] }.join @@ -26,7 +30,7 @@ module BbbApi if !bbb return call_invalid_res else - meeting_id = (Digest::SHA1.hexdigest(Rails.application.secrets[:secret_key_base]+meeting_token)).to_s + meeting_id = bbb_meeting_id(meeting_token) # See if the meeting is running begin @@ -63,7 +67,7 @@ module BbbApi password = bbb_meeting_info[:attendeePW] end join_url = bbb.join_meeting_url(meeting_id, full_name, password ) - return success_res(join_url) + return success_join_res(join_url) end end @@ -124,6 +128,22 @@ module BbbApi res end + def bbb_end_meeting(id) + # get meeting info for moderator password + meeting_id = bbb_meeting_id(id) + bbb_meeting_info = bbb.get_meeting_info(meeting_id, nil) + + response_data = if bbb_meeting_info.is_a?(Hash) && bbb_meeting_info[:moderatorPW] + bbb.end_meeting(meeting_id, bbb_meeting_info[:moderatorPW]) + else + {} + end + response_data[:status] = :ok + response_data + rescue BigBlueButton::BigBlueButtonException => exc + response_data = bbb_exception_res exc + end + def bbb_update_recordings(id, published) bbb_safe_execute :publish_recordings, id, published end @@ -147,7 +167,7 @@ module BbbApi response_data end - def success_res(join_url) + def success_join_res(join_url) { returncode: true, messageKey: "ok", @@ -178,11 +198,15 @@ module BbbApi end def bbb_exception_res(exc) - { + res = { returncode: false, messageKey: 'BBB'+exc.key.capitalize.underscore, message: exc.message, - status: :internal_server_error + status: :unprocessable_entity } + if res[:messageKey] == 'BBBnotfound' + res[:status] = :not_found + end + res end end diff --git a/app/views/bbb/end.jbuilder b/app/views/bbb/end.jbuilder new file mode 100644 index 00000000..0f12a451 --- /dev/null +++ b/app/views/bbb/end.jbuilder @@ -0,0 +1 @@ +json.partial! 'bbb', messageKey: @messageKey, message: @message, status: @status diff --git a/config/routes.rb b/config/routes.rb index 30280265..8595b1f3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -13,6 +13,7 @@ Rails.application.routes.draw do get '/:resource/:id', to: 'landing#index', as: :resource get '/:resource/:id/join', to: 'bbb#join', as: :bbb_join, defaults: {format: 'json'} get '/:resource/:id/wait', to: 'landing#wait_for_moderator' + delete '/rooms/:id/end', to: 'bbb#end', defaults: {format: 'json'} get '/rooms/:id/recordings', to: 'bbb#recordings', defaults: {format: 'json'} patch '/rooms/:id/recordings/:record_id', to: 'bbb#update_recordings', defaults: {format: 'json'} delete '/rooms/:id/recordings/:record_id', to: 'bbb#delete_recordings', defaults: {format: 'json'}