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)