bigbluebutton_rails 1.3.0.beta1 → 1.3.0.mweb1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Gemfile CHANGED
@@ -25,6 +25,7 @@ group :test do
25
25
  gem "capybara-mechanize" # for remote requests
26
26
  gem "launchy"
27
27
  gem "capybara-webkit" # best option found for js
28
+ gem "therubyracer"
28
29
  end
29
30
 
30
31
  # Gems used by the test application
data/Gemfile.lock CHANGED
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: .
9
9
  specs:
10
- bigbluebutton_rails (1.3.0.beta1)
10
+ bigbluebutton_rails (1.3.0.mweb1)
11
11
  bigbluebutton-api-ruby (~> 1.2.0)
12
12
  rails (>= 3.0.0)
13
13
 
@@ -115,6 +115,7 @@ GEM
115
115
  addressable (~> 2.3)
116
116
  ffi (~> 1.1.1)
117
117
  spoon (~> 0.0.1)
118
+ libv8 (3.16.14.7)
118
119
  libwebsocket (0.1.5)
119
120
  addressable
120
121
  mail (2.4.4)
@@ -171,6 +172,7 @@ GEM
171
172
  rake (10.0.1)
172
173
  rdoc (3.12)
173
174
  json (~> 1.4)
175
+ ref (1.0.5)
174
176
  rspec-core (2.12.0)
175
177
  rspec-expectations (2.12.0)
176
178
  diff-lcs (~> 1.1.3)
@@ -209,6 +211,9 @@ GEM
209
211
  sqlite3 (1.3.6)
210
212
  sqlite3-ruby (1.3.3)
211
213
  sqlite3 (>= 1.3.3)
214
+ therubyracer (0.12.1)
215
+ libv8 (~> 3.16.14.0)
216
+ ref
212
217
  thor (0.16.0)
213
218
  tilt (1.3.3)
214
219
  treetop (1.4.12)
@@ -254,5 +259,6 @@ DEPENDENCIES
254
259
  shoulda-matchers
255
260
  simplecov (>= 0.4.0)
256
261
  sqlite3-ruby
262
+ therubyracer
257
263
  uglifier (>= 1.0.3)
258
264
  whenever
data/README.rdoc CHANGED
@@ -186,10 +186,12 @@ check out the test application at <tt>spec/rails_app/</tt>!
186
186
  Fork this repository, clone your fork and start by installing the dependencies:
187
187
 
188
188
  bundle install
189
+
190
+ Note: if you're getting an error installing <tt>capybara-webkit</tt>, most likely you need to install QT, see: https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit
189
191
 
190
192
  Save <tt>spec/rails_app/features/config.yml.example</tt> as <tt>spec/rails_app/features/config.yml</tt> and edit it to set values for an existent BigBlueButton server. You will need it to run the integration tests. For more information see the page {Testing}[https://github.com/mconf/bigbluebutton_rails/wiki/Testing] in our wiki.
191
193
 
192
- Prepare the rails_app used for tests:
194
+ Prepare the <tt>rails_app</tt> used for tests:
193
195
 
194
196
  rake rails_app:install
195
197
  rake rails_app:db SERVER=my-server # select a server you defined in 'config.yml'
@@ -215,6 +217,8 @@ Develop. :)
215
217
 
216
218
  If you want your code to be integrated in this repository, please fork it, create a branch with your modifications and submit a pull request.
217
219
 
220
+ * See more about testing {in our wiki page}[https://github.com/mconf/bigbluebutton_rails/wiki/Testing].
221
+
218
222
  === Test Coverage
219
223
 
220
224
  Coverage is analyzed by default when you run:
@@ -250,7 +250,7 @@ class Bigbluebutton::RoomsController < ApplicationController
250
250
  else
251
251
  respond_with do |format|
252
252
  format.html {
253
- redirect_to(bigbluebutton_room_path(@room), :notice => message)
253
+ redirect_to(params[:redir_url] || bigbluebutton_room_path(@room), :notice => message)
254
254
  }
255
255
  format.json { render :json => message }
256
256
  end
@@ -330,7 +330,7 @@ class Bigbluebutton::RoomsController < ApplicationController
330
330
  @room.create_meeting(username, id, request)
331
331
  else
332
332
  flash[:error] = t('bigbluebutton_rails.rooms.errors.auth.cannot_create')
333
- render wait_action
333
+ render wait_action, :status => :unauthorized
334
334
  return
335
335
  end
336
336
  end
@@ -23,7 +23,6 @@ class BigbluebuttonRoom < ActiveRecord::Base
23
23
  :length => { :minimum => 1, :maximum => 150 }
24
24
  validates :welcome_msg, :length => { :maximum => 250 }
25
25
  validates :private, :inclusion => { :in => [true, false] }
26
- validates :voice_bridge, :presence => true, :uniqueness => true
27
26
  validates :record, :inclusion => { :in => [true, false] }
28
27
 
29
28
  validates :duration,
@@ -147,6 +146,7 @@ class BigbluebuttonRoom < ActiveRecord::Base
147
146
  unless response.nil?
148
147
  self.attendee_password = response[:attendeePW]
149
148
  self.moderator_password = response[:moderatorPW]
149
+ self.voice_bridge = response[:voiceBridge] if response.has_key?(:voiceBridge)
150
150
  self.save unless self.new_record?
151
151
  end
152
152
 
@@ -275,7 +275,6 @@ class BigbluebuttonRoom < ActiveRecord::Base
275
275
 
276
276
  def init
277
277
  self[:meetingid] ||= unique_meetingid
278
- self[:voice_bridge] ||= random_voice_bridge
279
278
 
280
279
  @request_headers = {}
281
280
 
@@ -289,16 +288,6 @@ class BigbluebuttonRoom < ActiveRecord::Base
289
288
  @attendees = []
290
289
  end
291
290
 
292
- def random_voice_bridge
293
- value = (70000 + SecureRandom.random_number(9999)).to_s
294
- count = 1
295
- while not BigbluebuttonRoom.find_by_voice_bridge(value).nil? and count < 10
296
- count += 1
297
- value = (70000 + SecureRandom.random_number(9999)).to_s
298
- end
299
- value
300
- end
301
-
302
291
  def do_create_meeting(username=nil, userid=nil)
303
292
  opts = {
304
293
  :record => self.record,
@@ -308,10 +297,15 @@ class BigbluebuttonRoom < ActiveRecord::Base
308
297
  :welcome => self.welcome_msg.blank? ? default_welcome_message : self.welcome_msg,
309
298
  :dialNumber => self.dial_number,
310
299
  :logoutURL => self.full_logout_url || self.logout_url,
311
- :maxParticipants => self.max_participants,
312
- :voiceBridge => self.voice_bridge
300
+ :maxParticipants => self.max_participants
313
301
  }.merge(self.get_metadata_for_create)
314
302
 
303
+ # Set the voice bridge only if the gem is configured to do so and the voice bridge
304
+ # is not blank.
305
+ if BigbluebuttonRails.use_local_voice_bridges && !self.voice_bridge.blank?
306
+ opts.merge!({ :voiceBridge => self.voice_bridge })
307
+ end
308
+
315
309
  # Add information about the user that is creating the meeting (if any)
316
310
  opts.merge!({ "meta_#{BigbluebuttonRails.metadata_user_id}" => userid }) unless userid.nil?
317
311
  opts.merge!({ "meta_#{BigbluebuttonRails.metadata_user_name}" => username }) unless username.nil?
@@ -50,6 +50,16 @@ module BigbluebuttonRails
50
50
  @@metadata_user_id,
51
51
  @@metadata_user_name ]
52
52
 
53
+ # Whether or not the gem should pass the voice bridges set in the rooms when making
54
+ # API calls. By default it is false, meaning that the voice bridge will never be
55
+ # passed, so it will be generated by the web conference server. Setting it to true
56
+ # will make the voice bridge set locally in the room to be used in the web conference
57
+ # server. Notice that the voice bridge has to be unique in a web conference server, so
58
+ # if you are setting the voice bridges manually, you will also have to make sure that
59
+ # the voice bridges are unique (there's nothing in the gem to guarantee this uniqueness).
60
+ mattr_accessor :use_local_voice_bridges
61
+ @@use_local_voice_bridges = false
62
+
53
63
  # Finds the BigbluebuttonRoom associated with the recording data in 'data', if any.
54
64
  # TODO: if not found, remove the association or keep the old one?
55
65
  def self.match_room_recording(data)
@@ -1,3 +1,3 @@
1
1
  module BigbluebuttonRails
2
- VERSION = "1.3.0.beta1".freeze
2
+ VERSION = "1.3.0.mweb1".freeze
3
3
  end
@@ -32,7 +32,6 @@ class CreateBigbluebuttonRails < ActiveRecord::Migration
32
32
  end
33
33
  add_index :bigbluebutton_rooms, :server_id
34
34
  add_index :bigbluebutton_rooms, :meetingid, :unique => true
35
- add_index :bigbluebutton_rooms, :voice_bridge, :unique => true
36
35
 
37
36
  create_table :bigbluebutton_recordings do |t|
38
37
  t.integer :server_id
@@ -0,0 +1,9 @@
1
+ class BigbluebuttonRailsTo130Mweb1 < ActiveRecord::Migration
2
+ def self.up
3
+ remove_index :bigbluebutton_rooms, :voice_bridge
4
+ end
5
+
6
+ def self.down
7
+ add_index :bigbluebutton_rooms, :voice_bridge, :unique => true
8
+ end
9
+ end
@@ -319,6 +319,29 @@ describe Bigbluebutton::RoomsController do
319
319
  it { should redirect_to(bigbluebutton_room_path(room)) }
320
320
  it { should assign_to(:room).with(room) }
321
321
  it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.notice.end.success')) }
322
+
323
+ end
324
+
325
+ context ":redir_url => '/'" do
326
+ before {
327
+ mocked_api.should_receive(:is_meeting_running?).and_return(true)
328
+ mocked_api.should_receive(:end_meeting).with(room.meetingid, room.moderator_password)
329
+ }
330
+
331
+ before(:each) { get :end, :id => room.to_param, :redir_url => '/' }
332
+ it { should respond_with(:redirect) }
333
+ it { should redirect_to('/') }
334
+ end
335
+
336
+ context ":redir_url => '/example'" do
337
+ before {
338
+ mocked_api.should_receive(:is_meeting_running?).and_return(true)
339
+ mocked_api.should_receive(:end_meeting).with(room.meetingid, room.moderator_password)
340
+ }
341
+
342
+ before { get :end, :id => room.to_param, :redir_url => '/example' }
343
+ it { should respond_with(:redirect) }
344
+ it { should redirect_to('/example') }
322
345
  end
323
346
 
324
347
  context "room is not running" do
@@ -806,7 +829,7 @@ describe Bigbluebutton::RoomsController do
806
829
  room.should_not_receive(:create_meeting)
807
830
  }
808
831
  before(:each) { get :join, :id => room.to_param }
809
- it { should respond_with(:success) }
832
+ it { should respond_with(:unauthorized) }
810
833
  it { should render_template(:join) }
811
834
  it { should set_the_flash.to(I18n.t('bigbluebutton_rails.rooms.errors.auth.cannot_create')) }
812
835
  end
@@ -23,9 +23,6 @@ describe BigbluebuttonRoom do
23
23
  it { should validate_uniqueness_of(:meetingid) }
24
24
  it { should ensure_length_of(:meetingid).is_at_least(1).is_at_most(100) }
25
25
 
26
- it { should validate_presence_of(:voice_bridge) }
27
- it { should validate_uniqueness_of(:voice_bridge) }
28
-
29
26
  it { should validate_presence_of(:name) }
30
27
  it { should validate_uniqueness_of(:name) }
31
28
  it { should ensure_length_of(:name).is_at_least(1).is_at_most(150) }
@@ -146,24 +143,6 @@ describe BigbluebuttonRoom do
146
143
  b.meetingid.should == "user defined"
147
144
  }
148
145
  end
149
-
150
- context "voice_bridge" do
151
- it {
152
- b = BigbluebuttonRoom.new(:voice_bridge => "user defined")
153
- b.voice_bridge.should == "user defined"
154
- }
155
- context "with a random value" do
156
- it { room.voice_bridge.should_not be_nil }
157
- it { room.voice_bridge.should =~ /7[0-9]{4}/ }
158
- it "tries to randomize 10 times if voice_bridge already exists" do
159
- room = FactoryGirl.create(:bigbluebutton_room, :voice_bridge => "70000")
160
- BigbluebuttonRoom.stub!(:find_by_voice_bridge).and_return(room)
161
- SecureRandom.should_receive(:random_number).exactly(10).and_return(0000)
162
- room2 = BigbluebuttonRoom.new # triggers the random_number calls
163
- room2.voice_bridge.should == "70000"
164
- end
165
- end
166
- end
167
146
  end
168
147
 
169
148
  context "#param format" do
@@ -334,11 +313,13 @@ describe BigbluebuttonRoom do
334
313
  describe "#send_create" do
335
314
  let(:attendee_password) { Forgery(:basic).password }
336
315
  let(:moderator_password) { Forgery(:basic).password }
316
+ let(:voice_bridge) { SecureRandom.random_number(99999) }
337
317
  let(:hash_create) {
338
318
  {
339
319
  :returncode => "SUCCESS", :meetingID => "test_id",
340
320
  :attendeePW => attendee_password, :moderatorPW => moderator_password,
341
- :hasBeenForciblyEnded => "false", :messageKey => {}, :message => {}
321
+ :voiceBridge => voice_bridge, :hasBeenForciblyEnded => "false",
322
+ :messageKey => {}, :message => {}
342
323
  }
343
324
  }
344
325
  before {
@@ -383,6 +364,7 @@ describe BigbluebuttonRoom do
383
364
  end
384
365
  it { room.attendee_password.should be(attendee_password) }
385
366
  it { room.moderator_password.should be(moderator_password) }
367
+ it { room.voice_bridge.should be(voice_bridge) }
386
368
  it { room.changed?.should be_false }
387
369
  end
388
370
 
@@ -398,6 +380,7 @@ describe BigbluebuttonRoom do
398
380
  end
399
381
  it { new_room.attendee_password.should be(attendee_password) }
400
382
  it { new_room.moderator_password.should be(moderator_password) }
383
+ it { new_room.voice_bridge.should be(voice_bridge) }
401
384
  it("and do not save the record") { new_room.new_record?.should be_true }
402
385
  end
403
386
 
@@ -415,6 +398,62 @@ describe BigbluebuttonRoom do
415
398
  it { room.moderator_password.should be(moderator_password) }
416
399
  it { room.changed?.should be_false }
417
400
  end
401
+
402
+ context "when the call to create doesn't return a voice bridge" do
403
+ before do
404
+ hash_create.delete(:voiceBridge)
405
+ mocked_api.should_receive(:create_meeting)
406
+ .with(room.name, room.meetingid, get_create_params(room))
407
+ .and_return(hash_create)
408
+ room.stub(:select_server).and_return(mocked_server)
409
+ room.server = mocked_server
410
+ room.send_create
411
+ end
412
+ it { room.voice_bridge.should be_nil }
413
+ it { room.changed?.should be_false }
414
+ end
415
+
416
+ context "when it's set to use local voice bridges" do
417
+ before {
418
+ @use_local_voice_bridges = BigbluebuttonRails.use_local_voice_bridges
419
+ BigbluebuttonRails.use_local_voice_bridges = true
420
+ }
421
+ after {
422
+ BigbluebuttonRails.use_local_voice_bridges = @use_local_voice_bridges
423
+ }
424
+
425
+ context "sets the voice bridge in the params if there's a voice bridge" do
426
+ let(:voice_bridge) { SecureRandom.random_number(99999) }
427
+ before do
428
+ room.update_attributes(:voice_bridge => voice_bridge)
429
+ create_params = get_create_params(room)
430
+ create_params.merge!({ :voiceBridge => voice_bridge })
431
+
432
+ mocked_api.should_receive(:create_meeting)
433
+ .with(room.name, room.meetingid, create_params)
434
+ .and_return(hash_create)
435
+ room.stub(:select_server).and_return(mocked_server)
436
+ room.server = mocked_server
437
+ room.send_create
438
+ end
439
+ it { room.changed?.should be_false }
440
+ end
441
+
442
+ context "doesn't set the voice bridge if it's blank" do
443
+ let(:voice_bridge) { SecureRandom.random_number(99999) }
444
+ before do
445
+ room.update_attributes(:voice_bridge => "")
446
+
447
+ mocked_api.should_receive(:create_meeting)
448
+ .with(room.name, room.meetingid, get_create_params(room))
449
+ .and_return(hash_create)
450
+ room.stub(:select_server).and_return(mocked_server)
451
+ room.server = mocked_server
452
+ room.send_create
453
+ end
454
+ it { room.changed?.should be_false }
455
+ end
456
+ end
418
457
  end
419
458
 
420
459
  context "generates a meetingid if nil" do
@@ -674,7 +713,7 @@ def get_create_params(room, username=nil, userid=nil)
674
713
  :dialNumber => room.dial_number,
675
714
  :logoutURL => room.logout_url,
676
715
  :maxParticipants => room.max_participants,
677
- :voiceBridge => room.voice_bridge,
716
+ #:voiceBridge => room.voice_bridge,
678
717
  :record => room.record,
679
718
  :duration => room.duration
680
719
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bigbluebutton_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0.beta1
4
+ version: 1.3.0.mweb1
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-05-16 00:00:00.000000000 Z
13
+ date: 2014-12-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
@@ -115,6 +115,7 @@ files:
115
115
  - lib/generators/bigbluebutton_rails/templates/migration_0_0_5.rb
116
116
  - lib/generators/bigbluebutton_rails/templates/migration_1_3_0.rb
117
117
  - lib/generators/bigbluebutton_rails/templates/migration_1_3_0_b.rb
118
+ - lib/generators/bigbluebutton_rails/templates/migration_1_3_0_mweb1.rb
118
119
  - lib/generators/bigbluebutton_rails/views_generator.rb
119
120
  - lib/tasks/bigbluebutton_rails/recordings.rake
120
121
  - spec/bigbluebutton_rails_spec.rb
@@ -258,7 +259,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
258
259
  version: '0'
259
260
  segments:
260
261
  - 0
261
- hash: 3831333201222851791
262
+ hash: 2534555688455246723
262
263
  required_rubygems_version: !ruby/object:Gem::Requirement
263
264
  none: false
264
265
  requirements: