diff --git a/Gemfile b/Gemfile
index 22020cab..a4ddb07c 100644
--- a/Gemfile
+++ b/Gemfile
@@ -30,7 +30,7 @@ gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 3.0'
# Use ActiveModel has_secure_password
-# gem 'bcrypt', '~> 3.1.7'
+gem 'bcrypt', '~> 3.1.7'
# Authentication.
gem 'omniauth'
diff --git a/Gemfile.lock b/Gemfile.lock
index 293528cb..ccf587c6 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -39,6 +39,7 @@ GEM
minitest (~> 5.1)
tzinfo (~> 1.1)
arel (7.1.4)
+ bcrypt (3.1.11)
bigbluebutton-api-ruby (1.6.0)
xml-simple (~> 1.1)
bindex (0.5.0)
@@ -201,6 +202,7 @@ PLATFORMS
ruby
DEPENDENCIES
+ bcrypt (~> 3.1.7)
bigbluebutton-api-ruby
bootstrap-sass (= 3.3.0.0)
bootstrap-social-rails (~> 4.12)
diff --git a/app/controllers/meetings_controller.rb b/app/controllers/meetings_controller.rb
index 3efc3137..312288f4 100644
--- a/app/controllers/meetings_controller.rb
+++ b/app/controllers/meetings_controller.rb
@@ -86,7 +86,8 @@ class MeetingsController < ApplicationController
private
def meeting_params(room)
- params.require(:meeting).permit(:name).merge!(room_id: room.id)
+ params.require(:meeting).permit(:name).merge!(room: room)
+ #params.require(:meeting).permit(:name).merge!(room_id: room.id)
end
def default_meeting_options
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
index ab0161dc..c602edbf 100644
--- a/app/controllers/sessions_controller.rb
+++ b/app/controllers/sessions_controller.rb
@@ -6,17 +6,35 @@ class SessionsController < ApplicationController
# GET /logout
def destroy
- logout
+ logout if current_user
+ end
+
+ # POST /login
+ def create
+ user = User.find_by(email: session_params[:email])
+ if user && user.authenticate(session_params[:password])
+ login(user)
+ else
+ # Login unsuccessful, display error message.
+
+ render :new
+ end
end
# GET/POST /auth/:provider/callback
- def create
+ def omniauth_session
user = User.from_omniauth(request.env['omniauth.auth'])
login(user)
end
# POST /auth/failure
def fail
+ redirect_to root_path
+ end
+ private
+
+ def session_params
+ params.require(:session).permit(:email, :password)
end
end
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 1c6eb415..98ae769e 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -1,2 +1,23 @@
class UsersController < ApplicationController
+
+ # GET /signup
+ def new
+ @user = User.new
+ end
+
+ # POST /signup
+ def create
+ user = User.new(user_params)
+ if user.save
+ login(user)
+ else
+ render :new
+ end
+ end
+
+ private
+
+ def user_params
+ params.require(:user).permit(:name, :email, :password, :password_confirmation)
+ end
end
\ No newline at end of file
diff --git a/app/helpers/big_blue_helper.rb b/app/helpers/big_blue_helper.rb
deleted file mode 100644
index e86c786d..00000000
--- a/app/helpers/big_blue_helper.rb
+++ /dev/null
@@ -1,149 +0,0 @@
-module BigBlueHelper
-
- META_LISTED = "gl-listed"
- META_TOKEN = "gl-token"
-
- def bbb_endpoint
- Rails.configuration.bigbluebutton_endpoint
- end
-
- def bbb_secret
- Rails.configuration.bigbluebutton_secret
- end
-
- def bbb
- @bbb ||= BigBlueButton::BigBlueButtonApi.new(bbb_endpoint + "api", bbb_secret, "0.8")
- end
-
- # Generates a BigBlueButton meeting id from a meeting token.
- def bbb_meeting_id(id)
- Digest::SHA1.hexdigest(Rails.application.secrets[:secret_key_base] + id).to_s
- end
-
- # Generates a random password for a meeting.
- def random_password(length)
- o = ([('a'..'z'), ('A'..'Z')].map do |i| i.to_a end).flatten
- ((0...length).map do o[rand(o.length)] end).join
- end
-
- # Checks if a meeting is running on the BigBlueButton server.
- def meeting_is_running?(id)
- begin
- bbb.get_meeting_info(id, nil)
- return true
- rescue BigBlueButton::BigBlueButtonException => exc
- return false
- end
- end
-
- def start_meeting(options)
- meeting_id = bbb_meeting_id(name)
-
- # Need to create the meeting on the BigBlueButton server.
- create_options = {
- record: options[:meeting_recorded].to_s,
- #logoutURL: options[:meeting_logout_url] || request.base_url,
- moderatorPW: random_password(12),
- attendeePW: random_password(12),
- moderatorOnlyMessage: options[:moderator_message],
- "meta_#{BigBlueHelper::META_LISTED}": false,
- "meta_#{BigBlueHelper::META_TOKEN}": name
- }
-
- #meeting_options.merge!(
- #{ "meta_room-id": options[:room_owner],
- # "meta_meeting-name": options[:meeting_name]}
- #) if options[:room_owner]
-
- # Send the create request.
- begin
- bbb.create_meeting(name, meeting_id, create_options)
- rescue BigBlueButton::BigBlueButtonException => exc
- puts "BigBlueButton failed on create: #{exc.key}: #{exc.message}"
- end
-
- # Get the meeting info.
- #bbb_meeting_info = bbb.get_meeting_info(meeting_id, nil)
-
- meeting_id
- end
-
- # Generates a URL to join a BigBlueButton session.
- def join_url(meeting_id, username, options = {})
- options[:meeting_recorded] ||= false
- options[:user_is_moderator] ||= false
- options[:wait_for_moderator] ||= false
- options[:meeting_logout_url] ||= nil
- options[:meeting_name] ||= name
- options[:room_owner] ||= nil
- options[:moderator_message] ||= ''
-
- return call_invalid_res if !bbb
-
- # Get the meeting info.
- meeting_info = bbb.get_meeting_info(meeting_id, nil)
-
- # Determine the password to use when joining.
- password = if options[:user_is_moderator]
- meeting_info[:moderatorPW]
- else
- meeting_info[:attendeePW]
- end
-
- # Generate the join URL.
- bbb.join_meeting_url(meeting_id, username, password)
- end
-
- # Generates a URL to join a BigBlueButton session.
- def join_url_old(meeting_token, full_name, options={})
- options[:meeting_recorded] ||= false
- options[:user_is_moderator] ||= false
- options[:wait_for_moderator] ||= false
- options[:meeting_logout_url] ||= nil
- options[:meeting_name] ||= meeting_token
- options[:room_owner] ||= nil
- options[:moderator_message] ||= ''
-
- return call_invalid_res if !bbb
-
- meeting_id = bbb_meeting_id(meeting_token)
-
- unless meeting_is_running?(meeting_id)
- # Need to create the meeting on the BigBlueButton server.
- create_options = {
- record: options[:meeting_recorded].to_s,
- logoutURL: options[:meeting_logout_url] || request.base_url,
- moderatorPW: random_password(12),
- attendeePW: random_password(12),
- moderatorOnlyMessage: options[:moderator_message],
- "meta_#{BigBlueHelper::META_LISTED}": false,
- "meta_#{BigBlueHelper::META_TOKEN}": meeting_token
- }
-
- #meeting_options.merge!(
- #{ "meta_room-id": options[:room_owner],
- # "meta_meeting-name": options[:meeting_name]}
- #) if options[:room_owner]
-
- # Send the create request.
- begin
- bbb.create_meeting(options[:meeting_name], meeting_id, create_options)
- rescue BigBlueButton::BigBlueButtonException => exc
- puts "BigBlueButton failed on create: #{exc.key}: #{exc.message}"
- end
-
- # Get the meeting info.
- bbb_meeting_info = bbb.get_meeting_info(meeting_id, nil)
- end
-
- # Determine the password to use when joining.
- password = if options[:user_is_moderator]
- bbb_meeting_info[:moderatorPW]
- else
- bbb_meeting_info[:attendeePW]
- end
-
- # Generate the join URL.
- bbb.join_meeting_url(meeting_id, full_name, password)
- end
-end
\ No newline at end of file
diff --git a/app/models/meeting.rb b/app/models/meeting.rb
index 20728330..6e3112e0 100644
--- a/app/models/meeting.rb
+++ b/app/models/meeting.rb
@@ -2,6 +2,8 @@ class Meeting < ApplicationRecord
before_create :generate_meeting_id
+ validates :name, presence: true
+
belongs_to :room
# Creates a meeting on the BigBlueButton server.
@@ -11,9 +13,7 @@ class Meeting < ApplicationRecord
logoutURL: options[:meeting_logout_url] || '',
moderatorPW: random_password(12),
attendeePW: random_password(12),
- moderatorOnlyMessage: options[:moderator_message],
- "meta_#{BigBlueHelper::META_LISTED}": false,
- "meta_#{BigBlueHelper::META_TOKEN}": name
+ moderatorOnlyMessage: options[:moderator_message]
}
#meeting_options.merge!(
diff --git a/app/models/room.rb b/app/models/room.rb
index 8f61c204..f27a4d35 100644
--- a/app/models/room.rb
+++ b/app/models/room.rb
@@ -11,7 +11,10 @@ class Room < ApplicationRecord
private
+ # Generates a uid for the room.
def set_uid
- self.uid = Digest::SHA1.hexdigest(user.uid + user.provider + user.username)[0..12]
+ digest = user.id.to_s + user.provider + user.username
+ digest += user.uid unless user.uid.nil?
+ self.uid = Digest::SHA1.hexdigest(digest)[0..12]
end
end
\ No newline at end of file
diff --git a/app/models/user.rb b/app/models/user.rb
index 97c737a9..febb7f62 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -1,7 +1,23 @@
class User < ApplicationRecord
+ after_create :initialize_room
+ before_save { email.downcase! }
+
has_one :room
+ validates :name, length: { maximum: 24 }, presence: true
+ validates :username, presence: true
+ validates :provider, presence: true
+ validates :email, length: { maximum: 60 }, presence: true,
+ uniqueness: { case_sensitive: false },
+ format: {with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }
+
+ validates :password, length: { minimum: 6 }, allow_nil: true
+
+ # We don't want to run the validations because they require a user
+ # to have a password. Users who authenticate via omniauth won't.
+ has_secure_password(validations: false)
+
class << self
# Generates a user from omniauth.
@@ -10,10 +26,6 @@ class User < ApplicationRecord
user.name = send("#{auth['provider']}_name", auth)
user.username = send("#{auth['provider']}_username", auth)
user.email = send("#{auth['provider']}_email", auth)
- #user.token = auth['credentials']['token']
-
- # Create a room for the user if they don't have one.
- user.room = Room.create unless user.room
user.save!
user
@@ -48,4 +60,11 @@ class User < ApplicationRecord
end
+ private
+
+ # Initializes a room for the user.
+ def initialize_room
+ self.room = Room.new
+ self.save!
+ end
end
diff --git a/app/views/rooms/index.html.erb b/app/views/rooms/index.html.erb
index 22002561..8ddb1fe1 100644
--- a/app/views/rooms/index.html.erb
+++ b/app/views/rooms/index.html.erb
@@ -19,4 +19,4 @@
<% end %>
-<%= link_to 'Logout', user_logout_path %>
\ No newline at end of file
+<%= link_to 'Logout', logout_path %>
\ No newline at end of file
diff --git a/app/views/sessions/new.html.erb b/app/views/sessions/new.html.erb
index 369999a5..7b867457 100644
--- a/app/views/sessions/new.html.erb
+++ b/app/views/sessions/new.html.erb
@@ -24,6 +24,21 @@
<% end %>
<% end %>
+
or...