diff --git a/Gemfile.lock b/Gemfile.lock index db0e6de5..82a33983 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -4,7 +4,7 @@ PATH bigbluebutton_rails (3.0.1) activerecord-import (~> 1.0) bigbluebutton-api-ruby (~> 1.6) - browser (~> 0.8.0) + browser (~> 2.0.0) rails (>= 4.0.0) resque (~> 1.25.1) resque-scheduler (~> 3.0) @@ -45,7 +45,7 @@ GEM awesome_print (1.2.0) bigbluebutton-api-ruby (1.7.0) xml-simple (~> 1.1) - browser (0.8.0) + browser (2.0.3) builder (3.2.2) capybara (2.2.1) mime-types (>= 1.16) diff --git a/app/controllers/bigbluebutton/api/rooms_controller.rb b/app/controllers/bigbluebutton/api/rooms_controller.rb index 0e7f4d14..4cdd54ae 100644 --- a/app/controllers/bigbluebutton/api/rooms_controller.rb +++ b/app/controllers/bigbluebutton/api/rooms_controller.rb @@ -57,7 +57,7 @@ def join options = options.map{ |k,v| { k.gsub(/^meta[-_]/, 'userdata-') => v } }.reduce(:merge) end - @url = @room.parameterized_join_url(@user_name, @user_role, nil, options) + @url = @room.parameterized_join_url(@user_name, @user_role, nil, options, request) end protected diff --git a/app/controllers/bigbluebutton/rooms_controller.rb b/app/controllers/bigbluebutton/rooms_controller.rb index 2c18fbae..73a4442b 100644 --- a/app/controllers/bigbluebutton/rooms_controller.rb +++ b/app/controllers/bigbluebutton/rooms_controller.rb @@ -331,7 +331,7 @@ def join_internal(username, role, id) end # room created and running, try to join it - url = @room.parameterized_join_url(username, role, id, {}, bigbluebutton_user) + url = @room.parameterized_join_url(username, role, id, {}, bigbluebutton_user, request) unless url.nil? diff --git a/app/models/bigbluebutton_room.rb b/app/models/bigbluebutton_room.rb index f0d83b65..664698d1 100644 --- a/app/models/bigbluebutton_room.rb +++ b/app/models/bigbluebutton_room.rb @@ -203,14 +203,14 @@ def send_end # * moderator_api_password # # Triggers API call: create. - def send_create(user=nil) + def send_create(user = nil, request = nil) self.meetingid = unique_meetingid() if self.meetingid.blank? self.moderator_api_password = internal_password() if self.moderator_api_password.blank? self.attendee_api_password = internal_password() if self.attendee_api_password.blank? self.save unless self.new_record? # Get the user options to use when creating the meeting - user_opts = BigbluebuttonRails.configuration.get_create_options.call(self, user) + user_opts = BigbluebuttonRails.configuration.get_create_options.call(self, user, request) user_opts = {} if user_opts.blank? server, response = internal_create_meeting(user, user_opts) @@ -264,7 +264,7 @@ def join_url(username, role, key=nil, options={}) r end - def parameterized_join_url(username, role, id, options={}, user=nil) + def parameterized_join_url(username, role, id, options = {}, user = nil, request = nil) opts = options.clone # gets the token with the configurations for this user/room @@ -278,7 +278,9 @@ def parameterized_join_url(username, role, id, options={}, user=nil) opts.merge!({ userID: id }) unless id.blank? || options[:userID].present? # Get options passed by the application, if any - user_opts = BigbluebuttonRails.configuration.get_join_options.call(self, user, { username: username, role: role }) + user_opts = BigbluebuttonRails.configuration.get_join_options.call( + self, user || { username: username, role: role }, request + ) user_opts = {} if user_opts.blank? opts.merge!(user_opts) @@ -330,11 +332,11 @@ def to_param # The create logic. # Will create the meeting in this room unless it is already running. # Returns true if the meeting was created. - def create_meeting(user=nil, request=nil) + def create_meeting(user = nil, request = nil) fetch_is_running? unless is_running? add_domain_to_logout_url(request.protocol, request.host_with_port) unless request.nil? - send_create(user) + send_create(user, request) true else false diff --git a/bigbluebutton_rails.gemspec b/bigbluebutton_rails.gemspec index 83cef660..2d3097d6 100644 --- a/bigbluebutton_rails.gemspec +++ b/bigbluebutton_rails.gemspec @@ -21,6 +21,6 @@ Gem::Specification.new do |s| s.add_dependency("bigbluebutton-api-ruby", "~> 1.6") s.add_dependency("resque", "~> 1.25.1") s.add_dependency("resque-scheduler", "~> 3.0") - s.add_dependency("browser", "~> 0.8.0") + s.add_dependency("browser", "~> 2.0.0") s.add_dependency("activerecord-import", "~> 1.0") end diff --git a/lib/bigbluebutton_rails/configuration.rb b/lib/bigbluebutton_rails/configuration.rb index 877937dd..3f26f4b4 100644 --- a/lib/bigbluebutton_rails/configuration.rb +++ b/lib/bigbluebutton_rails/configuration.rb @@ -71,11 +71,12 @@ def initialize # Define this method to return extra parameters to be passed to a `create` call. # `user` is the user creating the meeting, if any. - @get_create_options = Proc.new{ |room, user| nil } + @get_create_options = Proc.new{ |room, user, request = nil| nil } # Define this method to return extra parameters to be passed to a `join` call. - # `user` is the user joining the meeting, if any. - @get_join_options = Proc.new{ |room, user| nil } + # `user` is the user joining the meeting. If there's no user signed in, it will + # be a hash with the name and role set for the user joining. + @get_join_options = Proc.new{ |room, user, request = nil| nil } # Selects a server to be used by `room` whenever it needs to make API calls. # By default, if no servers are available an exception is raised. diff --git a/lib/bigbluebutton_rails/utils.rb b/lib/bigbluebutton_rails/utils.rb index 689d3770..4676f812 100644 --- a/lib/bigbluebutton_rails/utils.rb +++ b/lib/bigbluebutton_rails/utils.rb @@ -5,7 +5,7 @@ module BigbluebuttonRails # Returns whether the current client should use the mobile client # or the desktop client. def self.use_mobile_client?(browser) - browser.mobile? || browser.tablet? + browser.device.mobile? || browser.device.tablet? end # Just a wrapper around the Rails method to convert values to boolean diff --git a/spec/controllers/bigbluebutton/api/rooms_controller_spec.rb b/spec/controllers/bigbluebutton/api/rooms_controller_spec.rb index 23e8e3c7..c459132d 100644 --- a/spec/controllers/bigbluebutton/api/rooms_controller_spec.rb +++ b/spec/controllers/bigbluebutton/api/rooms_controller_spec.rb @@ -370,7 +370,8 @@ context "attendee in a public room" do before { - room.should_receive(:parameterized_join_url).with('User 1', :attendee, nil, {}).and_return(expected_url) + room.should_receive(:parameterized_join_url) + .with('User 1', :attendee, nil, {}, controller.request).and_return(expected_url) } before(:each) { post :join, id: room.to_param, format: :json, name: 'User 1' } it { JSON.parse(response.body)['data']['id'].should eql(expected_url) } @@ -379,7 +380,9 @@ context "attendee in a private room" do before { room.update_attributes(private: true) - room.should_receive(:parameterized_join_url).with('User 1', :attendee, nil, {}).and_return(expected_url) + room.should_receive(:parameterized_join_url).with( + 'User 1', :attendee, nil, {}, controller.request + ).and_return(expected_url) } before(:each) { post :join, id: room.to_param, format: :json, name: 'User 1', key: room.attendee_key } it { JSON.parse(response.body)['data']['id'].should eql(expected_url) } @@ -388,7 +391,9 @@ context "moderator in a private room" do before { room.update_attributes(private: true) - room.should_receive(:parameterized_join_url).with('User 1', :moderator, nil, {}).and_return(expected_url) + room.should_receive(:parameterized_join_url).with( + 'User 1', :moderator, nil, {}, controller.request + ).and_return(expected_url) } before(:each) { post :join, id: room.to_param, format: :json, name: 'User 1', key: room.moderator_key } it { JSON.parse(response.body)['data']['id'].should eql(expected_url) } @@ -399,7 +404,9 @@ { 'userdata-param-1' => 1, 'userdata-param_2' => 'string-2' } } before { - room.should_receive(:parameterized_join_url).with('User 1', :attendee, nil, expected_meta).and_return(expected_url) + room.should_receive(:parameterized_join_url).with( + 'User 1', :attendee, nil, expected_meta, controller.request + ).and_return(expected_url) } before(:each) { post :join, id: room.to_param, format: :json, name: 'User 1', key: room.moderator_key, @@ -489,7 +496,9 @@ } before { - room.should_receive(:parameterized_join_url).with('User 1', :guest, nil, {}).and_return(expected_url) + room.should_receive(:parameterized_join_url).with( + 'User 1', :guest, nil, {}, controller.request + ).and_return(expected_url) } before(:each) { post :join, id: room.to_param, format: :json, name: 'User 1' } it { JSON.parse(response.body)['data']['id'].should eql(expected_url) } diff --git a/spec/lib/bigbluebutton_rails/utils_spec.rb b/spec/lib/bigbluebutton_rails/utils_spec.rb index de092fe1..b5584957 100644 --- a/spec/lib/bigbluebutton_rails/utils_spec.rb +++ b/spec/lib/bigbluebutton_rails/utils_spec.rb @@ -10,24 +10,24 @@ context 'for a mobile device' do before do - @browser.stub(:mobile?).and_return(true) - @browser.stub(:tablet?).and_return(false) + @browser.stub_chain(:device, :mobile?).and_return(true) + @browser.stub_chain(:device, :tablet?).and_return(false) end it { BigbluebuttonRails.use_mobile_client?(@browser).should be(true) } end context 'for a tablet' do before do - @browser.stub(:mobile?).and_return(false) - @browser.stub(:tablet?).and_return(true) + @browser.stub_chain(:device, :mobile?).and_return(false) + @browser.stub_chain(:device, :tablet?).and_return(true) end it { BigbluebuttonRails.use_mobile_client?(@browser).should be(true) } end context 'not a mobile device nor tablet' do before do - @browser.stub(:mobile?).and_return(false) - @browser.stub(:tablet?).and_return(false) + @browser.stub_chain(:device, :mobile?).and_return(false) + @browser.stub_chain(:device, :tablet?).and_return(false) end it { BigbluebuttonRails.use_mobile_client?(@browser).should be(false) } end @@ -35,7 +35,7 @@ # some user-agents where errors happened in the past context 'user-agents' do it { - browser = Browser.new(ua: 'Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4', accept_language: 'en-us') + browser = Browser.new('Mozilla/5.0 (iPad; CPU OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4') BigbluebuttonRails.use_mobile_client?(browser).should be(true) } end diff --git a/spec/models/bigbluebutton_room_spec.rb b/spec/models/bigbluebutton_room_spec.rb index f58a7c30..ea767289 100644 --- a/spec/models/bigbluebutton_room_spec.rb +++ b/spec/models/bigbluebutton_room_spec.rb @@ -1021,6 +1021,7 @@ let(:username) { Forgery(:name).full_name } let(:role) { :attendee } let(:id) { 'fake-user-id' } + let(:request) { double(ActionDispatch::Request) } context "sets a config token" do context "when it exists" do @@ -1139,23 +1140,23 @@ let(:user) { 'any user' } before { proc = double(Proc) - proc.should_receive(:call).with(room, user, {username: username, role: role} ) + proc.should_receive(:call).with(room, user, request) BigbluebuttonRails.configuration.should_receive(:get_join_options).and_return(proc) room.stub(:fetch_new_token).and_return(nil) room.stub(:join_url) } - it { room.parameterized_join_url(username, role, nil, {}, user) } + it { room.parameterized_join_url(username, role, nil, {}, user, request) } end context "if the user is not passed in the arguments" do before { proc = double(Proc) - proc.should_receive(:call).with(room, nil, {username: username, role: role} ) + proc.should_receive(:call).with(room, {username: username, role: role}, request) BigbluebuttonRails.configuration.should_receive(:get_join_options).and_return(proc) room.stub(:fetch_new_token).and_return(nil) room.stub(:join_url) } - it { room.parameterized_join_url(username, role, nil, {}, nil) } + it { room.parameterized_join_url(username, role, nil, {}, nil, request) } end end end @@ -1408,7 +1409,12 @@ describe "#create_meeting" do let(:room) { FactoryGirl.create(:bigbluebutton_room) } let(:user) { FactoryGirl.build(:user) } - before { room.should_receive(:fetch_is_running?) } + let(:request) { double(ActionDispatch::Request) } + before { + request.stub(:protocol).and_return("HTTP://") + request.stub(:host_with_port).and_return("test.com:80") + room.should_receive(:fetch_is_running?) + } context "when the conference is running" do before { @@ -1421,9 +1427,9 @@ context "when the conference is not running" do before { room.should_receive(:is_running?).and_return(false) - room.should_receive(:send_create).with(user) + room.should_receive(:send_create).with(user, request) } - subject { room.create_meeting(user) } + subject { room.create_meeting(user, request) } it { should be(true) } end @@ -1431,18 +1437,15 @@ context "when the conference is not running doesn't call end" do before { room.should_receive(:is_running?).and_return(false) - room.should_receive(:send_create).with(user) + room.should_receive(:send_create).with(user, request) room.should_not_receive(:send_end) } - subject { room.create_meeting(user) } + subject { room.create_meeting(user, request) } it { should be(true) } end context "when the parameter 'request' is informed" do - let(:request) { double(ActionDispatch::Request) } before { - request.stub(:protocol).and_return("HTTP://") - request.stub(:host_with_port).and_return("test.com:80") room.should_receive(:add_domain_to_logout_url).with("HTTP://", "test.com:80") room.should_receive(:is_running?).and_return(false) room.should_receive(:send_create)