From e11098c7a936954d8e44292b8a3e752baecd70b6 Mon Sep 17 00:00:00 2001 From: Zachary Chai Date: Fri, 4 Nov 2016 16:32:10 -0400 Subject: [PATCH 1/4] add end meeting to bbb controller --- app/controllers/bbb_controller.rb | 37 ++++++++++++++++++++++--------- app/lib/bbb_api.rb | 34 +++++++++++++++++++++++----- app/views/bbb/end.jbuilder | 1 + config/routes.rb | 1 + 4 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 app/views/bbb/end.jbuilder 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'} From b8c876443f936317ee67c7093f02472a0c43af54 Mon Sep 17 00:00:00 2001 From: Zachary Chai Date: Fri, 4 Nov 2016 18:28:52 -0400 Subject: [PATCH 2/4] add end button to views --- app/assets/javascripts/landing.js | 12 ++++++++++++ app/assets/javascripts/shared.js | 7 +++++++ app/controllers/landing_controller.rb | 5 +++++ app/lib/bbb_api.rb | 12 ++++++++++++ app/views/shared/_join_form.html.erb | 19 ++++++++++++++++--- config/locales/en-us.yml | 1 + 6 files changed, 53 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/landing.js b/app/assets/javascripts/landing.js index 32a2b18f..74c09a95 100644 --- a/app/assets/javascripts/landing.js +++ b/app/assets/javascripts/landing.js @@ -34,6 +34,18 @@ }); }); + $('.meeting-end').click (function (event) { + var jqxhr = Meeting.getInstance().endMeeting(); + var btn = $(this); + btn.prop("disabled", true); + jqxhr.done(function(data) { + + }); + jqxhr.fail(function(xhr, status, error) { + console.info("meeting end failed"); + }); + }); + $('.meeting-url-copy').click (function (e) { meetingURL = $('.meeting-url'); meetingURL.select(); diff --git a/app/assets/javascripts/shared.js b/app/assets/javascripts/shared.js index b7d369a4..82e585d8 100644 --- a/app/assets/javascripts/shared.js +++ b/app/assets/javascripts/shared.js @@ -36,6 +36,13 @@ class Meeting { }); }; + endMeeting() { + return $.ajax({ + url: this.url + "/end", + type: 'DELETE' + }); + } + setURL(url) { this.url = url; } diff --git a/app/controllers/landing_controller.rb b/app/controllers/landing_controller.rb index 80601fa9..5bae7175 100644 --- a/app/controllers/landing_controller.rb +++ b/app/controllers/landing_controller.rb @@ -1,4 +1,5 @@ class LandingController < ApplicationController + include BbbApi def index if params[:resource] == 'meetings' @@ -29,11 +30,15 @@ class LandingController < ApplicationController def render_room params[:action] = 'rooms' + @user = User.find_by(username: params[:id]) if @user.nil? redirect_to root_path return end + + @meeting_running = bbb_get_meeting_info(@user.username)[:returncode] + render :action => 'rooms' end diff --git a/app/lib/bbb_api.rb b/app/lib/bbb_api.rb index ba20755e..890605de 100644 --- a/app/lib/bbb_api.rb +++ b/app/lib/bbb_api.rb @@ -71,6 +71,13 @@ module BbbApi end end + def bbb_get_meeting_info(id) + meeting_id = bbb_meeting_id(id) + response_data = bbb.get_meeting_info(meeting_id, nil) + rescue BigBlueButton::BigBlueButtonException => exc + response_data = bbb_exception_res exc + end + def bbb_get_recordings(meeting_id, record_id=nil) options={} if record_id @@ -208,5 +215,10 @@ module BbbApi res[:status] = :not_found end res + rescue + { + returncode: false, + status: :internal_server_error + } end end diff --git a/app/views/shared/_join_form.html.erb b/app/views/shared/_join_form.html.erb index 0fc1aa8f..45088889 100644 --- a/app/views/shared/_join_form.html.erb +++ b/app/views/shared/_join_form.html.erb @@ -6,9 +6,22 @@ <%= text_field :nil, :nil, class: 'form-control meeting-user-name', placeholder: t('enter_name') %> <% end %> <% if admin? %> - + <% if @meeting_running %> +
+ +
+
+ +
+ <% else %> + + <% end %> <% elsif current_user %>