GRN2-180: First stages of refactoring code for v2.4 (#748)
* Email rescues and authenticator concern * Application controller and helper clean up * Moved controller code out of helpers * More helper and email clean up * Cleaned up remaining helpers and create omniauth_options * Controller code clean up * restructured views structure * Restructured role code * Restructured profile and code clean up * Master merge * Added bbb server concern to deal with bbb calls * Bug fixes and changes after changes * rspec * More rubocop fixesv2
parent
194b5ddfa0
commit
fd6077696d
@ -0,0 +1,109 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. |
||||
# |
||||
# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). |
||||
# |
||||
# This program is free software; you can redistribute it and/or modify it under the |
||||
# terms of the GNU Lesser General Public License as published by the Free Software |
||||
# Foundation; either version 3.0 of the License, or (at your option) any later |
||||
# version. |
||||
# |
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY |
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A |
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU Lesser General Public License along |
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. |
||||
|
||||
require 'bigbluebutton_api' |
||||
|
||||
module BbbServer |
||||
extend ActiveSupport::Concern |
||||
include BbbApi |
||||
|
||||
META_LISTED = "gl-listed" |
||||
|
||||
# Checks if a room is running on the BigBlueButton server. |
||||
def room_running?(bbb_id) |
||||
bbb_server.is_meeting_running?(bbb_id) |
||||
end |
||||
|
||||
def get_recordings(meeting_id) |
||||
bbb_server.get_recordings(meetingID: meeting_id) |
||||
end |
||||
|
||||
def get_multiple_recordings(meeting_ids) |
||||
bbb_server.get_recordings(meetingID: meeting_ids) |
||||
end |
||||
|
||||
# Returns a URL to join a user into a meeting. |
||||
def join_path(room, name, options = {}, uid = nil) |
||||
# Create the meeting, even if it's running |
||||
start_session(room, options) |
||||
|
||||
# Determine the password to use when joining. |
||||
password = options[:user_is_moderator] ? room.moderator_pw : room.attendee_pw |
||||
|
||||
# Generate the join URL. |
||||
join_opts = {} |
||||
join_opts[:userID] = uid if uid |
||||
join_opts[:join_via_html5] = true |
||||
join_opts[:guest] = true if options[:require_moderator_approval] && !options[:user_is_moderator] |
||||
|
||||
bbb_server.join_meeting_url(room.bbb_id, name, password, join_opts) |
||||
end |
||||
|
||||
# Creates a meeting on the BigBlueButton server. |
||||
def start_session(room, options = {}) |
||||
create_options = { |
||||
record: options[:meeting_recorded].to_s, |
||||
logoutURL: options[:meeting_logout_url] || '', |
||||
moderatorPW: room.moderator_pw, |
||||
attendeePW: room.attendee_pw, |
||||
moderatorOnlyMessage: options[:moderator_message], |
||||
muteOnStart: options[:mute_on_start] || false, |
||||
"meta_#{META_LISTED}": options[:recording_default_visibility] || false, |
||||
"meta_bbb-origin-version": Greenlight::Application::VERSION, |
||||
"meta_bbb-origin": "Greenlight", |
||||
"meta_bbb-origin-server-name": options[:host] |
||||
} |
||||
|
||||
create_options[:guestPolicy] = "ASK_MODERATOR" if options[:require_moderator_approval] |
||||
|
||||
# Send the create request. |
||||
begin |
||||
meeting = bbb_server.create_meeting(room.name, room.bbb_id, create_options) |
||||
# Update session info. |
||||
unless meeting[:messageKey] == 'duplicateWarning' |
||||
room.update_attributes(sessions: room.sessions + 1, |
||||
last_session: DateTime.now) |
||||
end |
||||
rescue BigBlueButton::BigBlueButtonException => e |
||||
puts "BigBlueButton failed on create: #{e.key}: #{e.message}" |
||||
raise e |
||||
end |
||||
end |
||||
|
||||
# Gets the number of recordings for this room |
||||
def recording_count(bbb_id) |
||||
bbb_server.get_recordings(meetingID: bbb_id)[:recordings].length |
||||
end |
||||
|
||||
# Update a recording from a room |
||||
def update_recording(record_id, meta) |
||||
meta[:recordID] = record_id |
||||
bbb_server.send_api_request("updateRecordings", meta) |
||||
end |
||||
|
||||
# Deletes a recording from a room. |
||||
def delete_recording(record_id) |
||||
bbb_server.delete_recordings(record_id) |
||||
end |
||||
|
||||
# Deletes all recordings associated with the room. |
||||
def delete_all_recordings(bbb_id) |
||||
record_ids = bbb_server.get_recordings(meetingID: bbb_id)[:recordings].pluck(:recordID) |
||||
bbb_server.delete_recordings(record_ids) unless record_ids.empty? |
||||
end |
||||
end |
@ -0,0 +1,161 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/. |
||||
# |
||||
# Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below). |
||||
# |
||||
# This program is free software; you can redistribute it and/or modify it under the |
||||
# terms of the GNU Lesser General Public License as published by the Free Software |
||||
# Foundation; either version 3.0 of the License, or (at your option) any later |
||||
# version. |
||||
# |
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY |
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A |
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU Lesser General Public License along |
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. |
||||
|
||||
module Rolify |
||||
extend ActiveSupport::Concern |
||||
|
||||
# Gets all roles |
||||
def all_roles(selected_role) |
||||
@roles = Role.editable_roles(@user_domain) |
||||
|
||||
if @roles.count.zero? |
||||
Role.create_default_roles(@user_domain) |
||||
@roles = Role.editable_roles(@user_domain) |
||||
end |
||||
|
||||
@selected_role = if selected_role.nil? |
||||
@roles.find_by(name: 'user') |
||||
else |
||||
@roles.find(selected_role) |
||||
end |
||||
|
||||
@roles |
||||
end |
||||
|
||||
# Creates a new role |
||||
def create_role(new_role_name) |
||||
# Make sure that the role name isn't a duplicate or a reserved name like super_admin or empty |
||||
return nil if Role.duplicate_name(new_role_name, @user_domain) || new_role_name.strip.empty? |
||||
|
||||
Role.create_new_role(new_role_name, @user_domain) |
||||
end |
||||
|
||||
# Updates a user's roles |
||||
def update_roles(roles) |
||||
# Check that the user can manage users |
||||
return true unless current_user.highest_priority_role.can_manage_users |
||||
|
||||
new_roles = roles.split(' ').map(&:to_i) |
||||
old_roles = @user.roles.pluck(:id) |
||||
|
||||
added_role_ids = new_roles - old_roles |
||||
removed_role_ids = old_roles - new_roles |
||||
|
||||
added_roles = [] |
||||
removed_roles = [] |
||||
current_user_role = current_user.highest_priority_role |
||||
|
||||
# Check that the user has the permissions to add all the new roles |
||||
added_role_ids.each do |id| |
||||
role = Role.find(id) |
||||
|
||||
# Admins are able to add the admin role to other users. All other roles may only |
||||
# add roles with a higher priority |
||||
if (role.priority > current_user_role.priority || current_user_role.name == "admin") && |
||||
role.provider == @user_domain |
||||
added_roles << role |
||||
else |
||||
return false |
||||
end |
||||
end |
||||
|
||||
# Check that the user has the permissions to remove all the deleted roles |
||||
removed_role_ids.each do |id| |
||||
role = Role.find(id) |
||||
|
||||
# Admins are able to remove the admin role from other users. All other roles may only |
||||
# remove roles with a higher priority |
||||
if (role.priority > current_user_role.priority || current_user_role.name == "admin") && |
||||
role.provider == @user_domain |
||||
removed_roles << role |
||||
else |
||||
return false |
||||
end |
||||
end |
||||
|
||||
# Send promoted/demoted emails |
||||
added_roles.each { |role| send_user_promoted_email(@user, role) if role.send_promoted_email } |
||||
removed_roles.each { |role| send_user_demoted_email(@user, role) if role.send_demoted_email } |
||||
|
||||
# Update the roles |
||||
@user.roles.delete(removed_roles) |
||||
@user.roles << added_roles |
||||
|
||||
# Make sure each user always has at least the user role |
||||
@user.roles = [Role.find_by(name: "user", provider: @user_domain)] if @user.roles.count.zero? |
||||
|
||||
@user.save! |
||||
end |
||||
|
||||
# Updates a roles priority |
||||
def update_priority(role_to_update) |
||||
user_role = Role.find_by(name: "user", provider: @user_domain) |
||||
admin_role = Role.find_by(name: "admin", provider: @user_domain) |
||||
|
||||
current_user_role = current_user.highest_priority_role |
||||
|
||||
# Users aren't allowed to update the priority of the admin or user roles |
||||
return false if role_to_update.include?(user_role.id.to_s) || role_to_update.include?(admin_role.id.to_s) |
||||
|
||||
# Restrict users to only updating the priority for roles in their domain with a higher |
||||
# priority |
||||
role_to_update.each do |id| |
||||
role = Role.find(id) |
||||
return false if role.priority <= current_user_role.priority || role.provider != @user_domain |
||||
end |
||||
|
||||
# Update the roles priority including the user role |
||||
top_priority = 0 |
||||
|
||||
role_to_update.each_with_index do |id, index| |
||||
new_priority = index + [current_user_role.priority, 0].max + 1 |
||||
top_priority = new_priority |
||||
Role.where(id: id).update_all(priority: new_priority) |
||||
end |
||||
|
||||
user_role.priority = top_priority + 1 |
||||
user_role.save! |
||||
end |
||||
|
||||
# Update Permissions |
||||
def update_permissions(role) |
||||
current_user_role = current_user.highest_priority_role |
||||
|
||||
# Checks that it is valid for the provider to update the role |
||||
return false if role.priority <= current_user_role.priority || role.provider != @user_domain |
||||
|
||||
role_params = params.require(:role).permit(:name) |
||||
permission_params = params.require(:role).permit(:can_create_rooms, :send_promoted_email, |
||||
:send_demoted_email, :can_edit_site_settings, :can_edit_roles, :can_manage_users, :colour) |
||||
|
||||
# Role is a default role so users can't change the name |
||||
role_params[:name] = role.name if Role::RESERVED_ROLE_NAMES.include?(role.name) |
||||
|
||||
# Make sure if the user is updating the role name that the role name is valid |
||||
if role.name != role_params[:name] && !Role.duplicate_name(role_params[:name], @user_domain) && |
||||
!role_params[:name].strip.empty? |
||||
role.name = role_params[:name] |
||||
elsif role.name != role_params[:name] |
||||
return false |
||||
end |
||||
|
||||
role.update(permission_params) |
||||
|
||||
role.save! |