GRN2-128: Added the ability to manage rooms (#848)
* Added the ability to manage rooms * Small fixes * Fixed travis complaints * Fixed issues with role permissions * Fixed issue with delete room * Fixed rubocop and added testcases
This commit is contained in:
parent
984e5cc085
commit
09de6b6739
|
@ -49,7 +49,9 @@ $(document).on('turbolinks:load', function(){
|
|||
$("#create-room-block").click(function(){
|
||||
showCreateRoom(this)
|
||||
})
|
||||
}
|
||||
|
||||
if (controller == "rooms" && action == "show" || controller == "admins" && action == "server_rooms"){
|
||||
// Display and update all fields related to creating a room in the createRoomModal
|
||||
$(".update-room").click(function(){
|
||||
showUpdateRoom(this)
|
||||
|
@ -88,9 +90,9 @@ function showCreateRoom(target) {
|
|||
|
||||
function showUpdateRoom(target) {
|
||||
var modal = $(target)
|
||||
var room_block_uid = modal.closest("#room-block").data("room-uid")
|
||||
$("#create-room-name").val(modal.closest("tbody").find("#room-name h4").text())
|
||||
$("#createRoomModal form").attr("action", room_block_uid + "/update_settings")
|
||||
var update_path = modal.closest("#room-block").data("path")
|
||||
$("#create-room-name").val(modal.closest("#room-block").find("#room-name-text").text())
|
||||
$("#createRoomModal form").attr("action", update_path)
|
||||
|
||||
//show all elements & their children with a update-only class
|
||||
$(".update-only").each(function() {
|
||||
|
|
|
@ -23,7 +23,8 @@ $(document).on('turbolinks:load', function(){
|
|||
(controller == "rooms" && action == "update") ||
|
||||
(controller == "rooms" && action == "join") ||
|
||||
(controller == "users" && action == "recordings") ||
|
||||
(controller == "admins" && action == "server_recordings")) {
|
||||
(controller == "admins" && action == "server_recordings") ||
|
||||
(controller == "admins" && action == "server_rooms")) {
|
||||
// Submit search if the user hits enter
|
||||
$("#search-input").keypress(function(key) {
|
||||
if (key.which == 13) {
|
||||
|
|
|
@ -52,15 +52,12 @@ $(document).on('turbolinks:load', function(){
|
|||
// Modify the ui for the tables
|
||||
var configure_order = function(header_elem){
|
||||
if(header_elem.data('order') === 'asc'){ // asc
|
||||
header_elem.text(header_elem.data("header") + " ↓");
|
||||
header_elem.data('order', 'desc');
|
||||
}
|
||||
else if(header_elem.data('order') === 'desc'){ // desc
|
||||
header_elem.text(header_elem.data("header"));
|
||||
header_elem.data('order', 'none');
|
||||
}
|
||||
else{ // none
|
||||
header_elem.text(header_elem.data("header") + " ↑");
|
||||
header_elem.data('order', 'asc');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,6 +61,23 @@ class AdminsController < ApplicationController
|
|||
@pagy, @recordings = pagy_array(recs)
|
||||
end
|
||||
|
||||
# GET /admins/rooms
|
||||
def server_rooms
|
||||
@search = params[:search] || ""
|
||||
@order_column = params[:column] && params[:direction] != "none" ? params[:column] : "created_at"
|
||||
@order_direction = params[:direction] && params[:direction] != "none" ? params[:direction] : "DESC"
|
||||
|
||||
server_rooms = if Rails.configuration.loadbalanced_configuration
|
||||
Room.includes(:owner).where(users: { provider: @user_domain })
|
||||
.admins_search(@search)
|
||||
.admins_order(@order_column, @order_direction)
|
||||
else
|
||||
Room.all.admins_search(@search).admins_order(@order_column, @order_direction)
|
||||
end
|
||||
|
||||
@pagy, @rooms = pagy_array(server_rooms)
|
||||
end
|
||||
|
||||
# MANAGE USERS
|
||||
|
||||
# GET /admins/edit/:user_uid
|
||||
|
@ -283,4 +300,10 @@ class AdminsController < ApplicationController
|
|||
|
||||
invite
|
||||
end
|
||||
|
||||
# Get the room status to display in the Server Rooms table
|
||||
def room_is_running(id)
|
||||
room_running?(id)
|
||||
end
|
||||
helper_method :room_is_running
|
||||
end
|
||||
|
|
|
@ -141,7 +141,8 @@ module Rolify
|
|||
|
||||
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)
|
||||
:send_demoted_email, :can_edit_site_settings, :can_edit_roles, :can_manage_users,
|
||||
:can_manage_rooms_recordings, :colour)
|
||||
|
||||
permission_params.transform_values! do |v|
|
||||
if v == "0"
|
||||
|
|
|
@ -25,7 +25,7 @@ class RoomsController < ApplicationController
|
|||
before_action :validate_verified_email, except: [:show, :join],
|
||||
unless: -> { !Rails.configuration.enable_email_verification }
|
||||
before_action :find_room, except: [:create, :join_specific_room]
|
||||
before_action :verify_room_ownership, only: [:destroy, :start, :update_settings]
|
||||
before_action :verify_room_ownership_or_admin, only: [:start, :update_settings, :destroy]
|
||||
before_action :verify_room_owner_verified, only: [:show, :join],
|
||||
unless: -> { !Rails.configuration.enable_email_verification }
|
||||
before_action :verify_user_not_admin, only: [:show]
|
||||
|
@ -112,10 +112,16 @@ class RoomsController < ApplicationController
|
|||
|
||||
# DELETE /:room_uid
|
||||
def destroy
|
||||
# Don't delete the users home room.
|
||||
@room.destroy if @room.owned_by?(current_user) && @room != current_user.main_room
|
||||
|
||||
redirect_to current_user.main_room
|
||||
begin
|
||||
# Don't delete the users home room.
|
||||
raise I18n.t("room.delete.home_room") if @room == @room.owner.main_room
|
||||
@room.destroy
|
||||
rescue => e
|
||||
flash[:alert] = I18n.t("room.delete.fail", error: e)
|
||||
else
|
||||
flash[:success] = I18n.t("room.delete.success")
|
||||
end
|
||||
redirect_back fallback_location: current_user.main_room
|
||||
end
|
||||
|
||||
# POST /room/join
|
||||
|
@ -162,7 +168,7 @@ class RoomsController < ApplicationController
|
|||
begin
|
||||
options = params[:room].nil? ? params : params[:room]
|
||||
raise "Room name can't be blank" if options[:name].blank?
|
||||
raise "Unauthorized Request" if !@room.owned_by?(current_user) || @room == current_user.main_room
|
||||
raise "Unauthorized Request" if @room == current_user.main_room
|
||||
|
||||
# Update the rooms values
|
||||
room_settings_string = create_room_settings_string(options)
|
||||
|
@ -179,7 +185,7 @@ class RoomsController < ApplicationController
|
|||
flash[:alert] = I18n.t("room.update_settings_error")
|
||||
end
|
||||
|
||||
redirect_to room_path
|
||||
redirect_back fallback_location: room_path(@room)
|
||||
end
|
||||
|
||||
# GET /:room_uid/logout
|
||||
|
@ -222,9 +228,9 @@ class RoomsController < ApplicationController
|
|||
@room = Room.find_by!(uid: params[:room_uid])
|
||||
end
|
||||
|
||||
# Ensure the user is logged into the room they are accessing.
|
||||
def verify_room_ownership
|
||||
return redirect_to root_path unless @room.owned_by?(current_user)
|
||||
# Ensure the user either owns the room or is an admin of the room owner
|
||||
def verify_room_ownership_or_admin
|
||||
return redirect_to root_path if !@room.owned_by?(current_user) && !current_user&.admin_of?(@room.owner)
|
||||
end
|
||||
|
||||
def validate_accepted_terms
|
||||
|
|
|
@ -27,7 +27,7 @@ class Ability
|
|||
else
|
||||
highest_role = user.highest_priority_role
|
||||
if highest_role.get_permission("can_edit_site_settings")
|
||||
can [:index, :site_settings, :server_recordings, :update_settings, :coloring, :registration_method], :admin
|
||||
can [:index, :site_settings, :update_settings, :coloring, :registration_method], :admin
|
||||
end
|
||||
|
||||
if highest_role.get_permission("can_edit_roles")
|
||||
|
@ -39,8 +39,12 @@ class Ability
|
|||
:approve, :invite, :reset, :undelete], :admin
|
||||
end
|
||||
|
||||
if highest_role.get_permission("can_manage_rooms_recordings")
|
||||
can [:index, :server_recordings, :server_rooms], :admin
|
||||
end
|
||||
|
||||
if !highest_role.get_permission("can_edit_site_settings") && !highest_role.get_permission("can_edit_roles") &&
|
||||
!highest_role.get_permission("can_manage_users")
|
||||
!highest_role.get_permission("can_manage_users") && !highest_role.get_permission("can_manage_rooms_recordings")
|
||||
cannot :manage, AdminsController
|
||||
end
|
||||
end
|
||||
|
|
|
@ -68,6 +68,7 @@ class Role < ApplicationRecord
|
|||
update_permission("can_edit_site_settings", permissions[:can_edit_site_settings].to_s)
|
||||
update_permission("can_edit_roles", permissions[:can_edit_roles].to_s)
|
||||
update_permission("can_manage_users", permissions[:can_manage_users].to_s)
|
||||
update_permission("can_manage_rooms_recordings", permissions[:can_manage_rooms_recordings].to_s)
|
||||
end
|
||||
|
||||
# Updates the value of the permission and enables it
|
||||
|
|
|
@ -27,6 +27,34 @@ class Room < ApplicationRecord
|
|||
|
||||
belongs_to :owner, class_name: 'User', foreign_key: :user_id
|
||||
|
||||
def self.admins_search(string)
|
||||
active_database = Rails.configuration.database_configuration[Rails.env]["adapter"]
|
||||
# Postgres requires created_at to be cast to a string
|
||||
created_at_query = if active_database == "postgresql"
|
||||
"created_at::text"
|
||||
else
|
||||
"created_at"
|
||||
end
|
||||
|
||||
search_query = "rooms.name LIKE :search OR rooms.uid LIKE :search OR users.email LIKE :search" \
|
||||
" OR users.#{created_at_query} LIKE :search"
|
||||
|
||||
search_param = "%#{string}%"
|
||||
|
||||
joins(:owner).where(search_query, search: search_param)
|
||||
end
|
||||
|
||||
def self.admins_order(column, direction)
|
||||
# Include the owner of the table
|
||||
table = joins(:owner)
|
||||
|
||||
if table.column_names.include?(column) || column == "users.name"
|
||||
return table.order(Arel.sql("#{column} #{direction}"))
|
||||
end
|
||||
|
||||
table
|
||||
end
|
||||
|
||||
# Determines if a user owns a room.
|
||||
def owned_by?(user)
|
||||
return false if user.nil?
|
||||
|
|
|
@ -22,8 +22,11 @@
|
|||
<% end %>
|
||||
<% end %>
|
||||
<% if highest_role.get_permission("can_edit_site_settings") || highest_role.name == "super_admin" %>
|
||||
<%= link_to admin_rooms_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if active_page == "server_rooms"}" do %>
|
||||
<span class="icon mr-4"><i class="fas fa-binoculars"></i></span><%= t("administrator.rooms.title") %>
|
||||
<% end %>
|
||||
<%= link_to admin_recordings_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if active_page == "server_recordings"}" do %>
|
||||
<span class="icon mr-4"><i class="fas fa-video"></i></i></span><%= t("administrator.recordings.title") %>
|
||||
<span class="icon mr-4"><i class="fas fa-video"></i></span><%= t("administrator.recordings.title") %>
|
||||
<% end %>
|
||||
<%= link_to admin_site_settings_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if active_page == "site_settings"}" do %>
|
||||
<span class="icon mr-4"><i class="fas fa-cogs"></i></span><%= t("administrator.site_settings.title") %>
|
||||
|
@ -31,7 +34,7 @@
|
|||
<% end %>
|
||||
<% if highest_role.get_permission("can_edit_roles") || highest_role.name == "super_admin" %>
|
||||
<%= link_to admin_roles_path, class: "list-group-item list-group-item-action dropdown-item #{"active" if active_page == "roles"}" do %>
|
||||
<span class="icon mr-4"><i class="fas fa-user-tag"></i></i></span><%= t("administrator.roles.title") %>
|
||||
<span class="icon mr-4"><i class="fas fa-user-tag"></i></span><%= t("administrator.roles.title") %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
|
@ -53,14 +53,14 @@
|
|||
<%= f.check_box :can_create_rooms, checked: @selected_role.get_permission("can_create_rooms"), class: "custom-switch-input", disabled: edit_disabled || !current_role.get_permission("can_create_rooms") %>
|
||||
<span class="custom-switch-indicator float-right"></span>
|
||||
</label>
|
||||
<label class="custom-switch pl-0 mt-3 mb-3 w-100 text-left d-inline-block <%="form-disable" if !current_role.get_permission("send_promoted_email") %>">
|
||||
<span class="ml-0 custom-switch-description"><%= t("administrator.roles.promote_email")%></span>
|
||||
<%= f.check_box :send_promoted_email, checked: @selected_role.get_permission("send_promoted_email"), class: "custom-switch-input", disabled: edit_disabled || !current_role.get_permission("send_promoted_email") %>
|
||||
<label class="custom-switch pl-0 mt-3 mb-3 w-100 text-left d-inline-block <%="form-disable" if !current_role.get_permission("can_manage_users") %>">
|
||||
<span class="ml-0 custom-switch-description"><%= t("administrator.roles.manage_users")%></span>
|
||||
<%= f.check_box :can_manage_users, checked: @selected_role.get_permission("can_manage_users"), class: "custom-switch-input", disabled: edit_disabled || !current_role.get_permission("can_manage_users") %>
|
||||
<span class="custom-switch-indicator float-right"></span>
|
||||
</label>
|
||||
<label class="custom-switch pl-0 mt-3 mb-3 w-100 text-left d-inline-block <%="form-disable" if !current_role.get_permission("send_demoted_email") %>">
|
||||
<span class="ml-0 custom-switch-description"><%= t("administrator.roles.demote_email")%></span>
|
||||
<%= f.check_box :send_demoted_email, checked: @selected_role.get_permission("send_demoted_email"), class: "custom-switch-input", disabled: edit_disabled || !current_role.get_permission("send_demoted_email") %>
|
||||
<label class="custom-switch pl-0 mt-3 mb-3 w-100 text-left d-inline-block <%="form-disable" if !current_role.get_permission("can_manage_rooms_recordings") %>">
|
||||
<span class="ml-0 custom-switch-description"><%= t("administrator.roles.manage_rooms_recordings")%></span>
|
||||
<%= f.check_box :can_manage_rooms_recordings, checked: @selected_role.get_permission("can_manage_rooms_recordings"), class: "custom-switch-input", disabled: edit_disabled || !current_role.get_permission("can_manage_rooms_recordings") %>
|
||||
<span class="custom-switch-indicator float-right"></span>
|
||||
</label>
|
||||
<label class="custom-switch pl-0 mt-3 mb-3 w-100 text-left d-inline-block <%="form-disable" if !current_role.get_permission("can_edit_site_settings") %>">
|
||||
|
@ -73,9 +73,14 @@
|
|||
<%= f.check_box :can_edit_roles, checked: @selected_role.get_permission("can_edit_roles"), class: "custom-switch-input", disabled: edit_disabled || !current_role.get_permission("can_edit_roles") %>
|
||||
<span class="custom-switch-indicator float-right"></span>
|
||||
</label>
|
||||
<label class="custom-switch pl-0 mt-3 mb-3 w-100 text-left d-inline-block <%="form-disable" if !current_role.get_permission("can_manage_users") %>">
|
||||
<span class="ml-0 custom-switch-description"><%= t("administrator.roles.manage_users")%></span>
|
||||
<%= f.check_box :can_manage_users, checked: @selected_role.get_permission("can_manage_users"), class: "custom-switch-input", disabled: edit_disabled || !current_role.get_permission("can_manage_users") %>
|
||||
<label class="custom-switch pl-0 mt-3 mb-3 w-100 text-left d-inline-block <%="form-disable" if !current_role.get_permission("send_promoted_email") %>">
|
||||
<span class="ml-0 custom-switch-description"><%= t("administrator.roles.promote_email")%></span>
|
||||
<%= f.check_box :send_promoted_email, checked: @selected_role.get_permission("send_promoted_email"), class: "custom-switch-input", disabled: edit_disabled || !current_role.get_permission("send_promoted_email") %>
|
||||
<span class="custom-switch-indicator float-right"></span>
|
||||
</label>
|
||||
<label class="custom-switch pl-0 mt-3 mb-3 w-100 text-left d-inline-block <%="form-disable" if !current_role.get_permission("send_demoted_email") %>">
|
||||
<span class="ml-0 custom-switch-description"><%= t("administrator.roles.demote_email")%></span>
|
||||
<%= f.check_box :send_demoted_email, checked: @selected_role.get_permission("send_demoted_email"), class: "custom-switch-input", disabled: edit_disabled || !current_role.get_permission("send_demoted_email") %>
|
||||
<span class="custom-switch-indicator float-right"></span>
|
||||
</label>
|
||||
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
<%
|
||||
# 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/>.
|
||||
%>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="table-responsive">
|
||||
<table id="rooms-table" class="table table-hover table-outline table-vcenter text-nowrap card-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th data-header="name" data-order="<%= @order_column == "name" ? @order_direction : "none" %>">
|
||||
<%= t("administrator.users.table.name") %>
|
||||
<% if @order_column == "name" && @order_direction == "desc" %>
|
||||
↓
|
||||
<% elsif @order_column == "name" && @order_direction == "asc" %>
|
||||
↑
|
||||
<% end %>
|
||||
</th>
|
||||
<th data-header="users.name" data-order="<%= @order_column == "users.name" ? @order_direction : "none" %>">
|
||||
<%= t("room.owner") %>
|
||||
<% if @order_column == "users.name" && @order_direction == "desc" %>
|
||||
↓
|
||||
<% elsif @order_column == "users.name" && @order_direction == "asc" %>
|
||||
↑
|
||||
<% end %>
|
||||
</th>
|
||||
<th data-header="uid" data-order="<%= @order_column == "uid" ? @order_direction : "none" %>">
|
||||
<%= t("administrator.rooms.table.id") %>
|
||||
<% if @order_column == "uid" && @order_direction == "desc" %>
|
||||
↓
|
||||
<% elsif @order_column == "uid" && @order_direction == "asc" %>
|
||||
↑
|
||||
<% end %>
|
||||
</th>
|
||||
<th>
|
||||
<%= t("administrator.rooms.table.status") %>
|
||||
</th>
|
||||
<th class="text-center"><i class="icon-settings"></i></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="rooms-table">
|
||||
<% @rooms.each do |room| %>
|
||||
<%= render "admins/components/server_room_row", room: room %>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% if !@rooms.empty?%>
|
||||
<div class="float-right mr-4 mt-4">
|
||||
<%== pagy_bootstrap_nav(@pagy) %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,62 @@
|
|||
<%
|
||||
# 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/>.
|
||||
%>
|
||||
|
||||
<tr id="room-block" data-path="<%= update_settings_path(room) %>" data-room-settings=<%= room.room_settings %> data-room-access-code="<%= room.access_code %>">
|
||||
<td>
|
||||
<div id="room-title" class="form-inline edit_hover_class">
|
||||
<text id="room-name-text">
|
||||
<%= room.name %>
|
||||
</text>
|
||||
</div>
|
||||
<div class="small text-muted">
|
||||
<%= [t("administrator.users.table.created"), ": ", room.created_at].join %>
|
||||
</div>
|
||||
</td>
|
||||
<td class="text-left">
|
||||
<%= room.owner.name %>
|
||||
</td>
|
||||
<td class="text-left">
|
||||
<%= room.uid %>
|
||||
</td>
|
||||
<td class="text-left">
|
||||
<% running = room_is_running(room.bbb_id) %>
|
||||
<% if running %>
|
||||
<%= t("administrator.rooms.running") %>
|
||||
<% else %>
|
||||
<%= t("administrator.rooms.not_running") %>
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<div class="item-action dropdown">
|
||||
<a href="javascript:void(0)" data-toggle="dropdown" class="icon">
|
||||
<i class="fas fa-ellipsis-v px-4"></i>
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-right">
|
||||
<%= link_to room_path(room), class: "dropdown-item" do %>
|
||||
<i class="dropdown-icon far fa-eye"></i> <%= t("administrator.rooms.view") %>
|
||||
<% end %>
|
||||
<%= button_to start_room_path(room), class: "dropdown-item" do %>
|
||||
<i class="dropdown-icon fas fa-door-open"></i> <%= running ? t("room.join") : t("room.start") %>
|
||||
<% end %>
|
||||
<a href="" data-toggle="modal" data-target="#createRoomModal" class="update-room dropdown-item">
|
||||
<i class="dropdown-icon fas fa-cog"></i> <%= t("room.settings") %>
|
||||
</a>
|
||||
<a href="" data-toggle="modal" data-target="#deleteRoomModal" data-path="<%= room_path(room) %>" data-name="<%= room.name %>" class="delete-room dropdown-item">
|
||||
<i class="dropdown-icon far fa-trash-alt"></i> <%= t("delete") %>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
|
@ -0,0 +1,30 @@
|
|||
<%
|
||||
# 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/>.
|
||||
%>
|
||||
|
||||
<div class="container pt-6">
|
||||
<%= render "shared/components/subtitle", subtitle: t("administrator.title"), search: false %>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-3 mb-4">
|
||||
<%= render "admins/components/menu_buttons" %>
|
||||
</div>
|
||||
<div id="server_recordings" class="col-lg-9">
|
||||
<%= render "admins/components/setting_view", setting_id: "rooms", setting_title: t("administrator.rooms.title"), search: true %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%= render "shared/modals/delete_room_modal" %>
|
||||
<%= render "shared/modals/create_room_modal" %>
|
|
@ -13,7 +13,7 @@
|
|||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
%>
|
||||
|
||||
<div id="<%= if room == current_user.main_room then 'home_room_block' else 'room-block' end %>" data-room-uid="<%= room.uid %>" data-room-settings=<%= room.room_settings %> data-room-access-code="<%= room.access_code %>" class="card">
|
||||
<div id="<%= if room == current_user.main_room then 'home_room_block' else 'room-block' end %>" data-path="<%= update_settings_path(room) %>" data-room-settings=<%= room.room_settings %> data-room-access-code="<%= room.access_code %>" class="card">
|
||||
<div class="card-body p-1">
|
||||
<table class="table table-hover table-vcenter text-wrap table-no-border">
|
||||
<tbody class="no-border-top">
|
||||
|
@ -29,9 +29,9 @@
|
|||
<td>
|
||||
<div id="room-name">
|
||||
<% if room == current_user.main_room %>
|
||||
<h4 contenteditable="false" class="m-0 force-text-normal" ><%= t("home_room") %></h4>
|
||||
<h4 id="room-name-text" contenteditable="false" class="m-0 force-text-normal" ><%= t("home_room") %></h4>
|
||||
<% else %>
|
||||
<h4 contenteditable="false" class="m-0 force-text-normal" ><%= room.name %></h4>
|
||||
<h4 id="room-name-text" contenteditable="false" class="m-0 force-text-normal" ><%= room.name %></h4>
|
||||
<% end %>
|
||||
</div>
|
||||
<div id="room-name-editable" style="display: none">
|
||||
|
|
|
@ -93,6 +93,7 @@ en:
|
|||
invalid_create: There was a problem creating a new role. Please check the role values and try again
|
||||
invalid_order: There was a problem updating the priority of the role. Please check the values and try again
|
||||
invalid_update: There was a problem updating the permissions of the role. Please check the values and try again
|
||||
manage_rooms_recordings: Allow users with this role to manage server rooms and recordings
|
||||
name: Role Name
|
||||
new_role: Create a new role
|
||||
role_has_users: This role is assigned to %{user_count} accounts. Please remove all accounts from this role before deleting it.
|
||||
|
@ -106,6 +107,14 @@ en:
|
|||
colour:
|
||||
title: Role Colour
|
||||
info: Set the colour that will be associated with the role
|
||||
rooms:
|
||||
title: Server Rooms
|
||||
table:
|
||||
id: ID
|
||||
not_running: Not Running
|
||||
running: Running
|
||||
status: Status
|
||||
view: View
|
||||
title: Organization Settings
|
||||
users:
|
||||
invite: Invite User
|
||||
|
@ -418,6 +427,10 @@ en:
|
|||
create_room: Create a Room
|
||||
create_room_error: There was an error creating the room
|
||||
create_room_success: Room created successfully
|
||||
delete:
|
||||
home_room: Can't delete user's Home Room
|
||||
success: Room deleted successfully
|
||||
fail: Failed to delete room (%{error})
|
||||
enter_the_access_code: Enter the room's access code
|
||||
invalid_provider: You have entered an invalid url. Please check the url and try again.
|
||||
invited: You have been invited to join
|
||||
|
|
|
@ -38,6 +38,7 @@ Rails.application.routes.draw do
|
|||
|
||||
scope '/admins' do
|
||||
# Panel Tabs
|
||||
get '/rooms', to: 'admins#server_rooms', as: :admin_rooms
|
||||
get '/recordings', to: 'admins#server_recordings', as: :admin_recordings
|
||||
get '/site_settings', to: 'admins#site_settings', as: :admin_site_settings
|
||||
get '/roles', to: 'admins#roles', as: :admin_roles
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class MigrationProduct < ActiveRecord::Base
|
||||
self.table_name = :roles
|
||||
end
|
||||
|
||||
class SubMigrationProduct < ActiveRecord::Base
|
||||
self.table_name = :role_permissions
|
||||
end
|
||||
|
||||
class AddManageRoomRecordingsToPermissions < ActiveRecord::Migration[5.2]
|
||||
def change
|
||||
reversible do |dir|
|
||||
dir.up do
|
||||
MigrationProduct.all.each do |role|
|
||||
SubMigrationProduct.create(role_id: role.id, name: "can_manage_rooms_recordings",
|
||||
value: SubMigrationProduct.find_by(role_id: role.id, name: "can_manage_users").value, enabled: true)
|
||||
end
|
||||
end
|
||||
|
||||
dir.down do
|
||||
MigrationProduct.all.each do |role|
|
||||
SubMigrationProduct.find_by(role_id: role.id, name: "can_manage_rooms_recordings").destroy
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -10,7 +10,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 2019_08_28_153347) do
|
||||
ActiveRecord::Schema.define(version: 2019_10_23_172511) do
|
||||
|
||||
create_table "features", force: :cascade do |t|
|
||||
t.integer "setting_id"
|
||||
|
|
|
@ -342,6 +342,45 @@ describe RoomsController, type: :controller do
|
|||
delete :destroy, params: { room_uid: @user.main_room }
|
||||
end.to change { Room.count }.by(0)
|
||||
end
|
||||
|
||||
it "allows admin to delete room" do
|
||||
@admin = create(:user)
|
||||
@admin.add_role :admin
|
||||
@request.session[:user_id] = @admin.id
|
||||
|
||||
expect do
|
||||
delete :destroy, params: { room_uid: @secondary_room }
|
||||
end.to change { Room.count }.by(-1)
|
||||
|
||||
expect(response).to redirect_to(@admin.main_room)
|
||||
end
|
||||
|
||||
it "does not allow admin to delete a users home room" do
|
||||
@admin = create(:user)
|
||||
@admin.add_role :admin
|
||||
@request.session[:user_id] = @admin.id
|
||||
|
||||
expect do
|
||||
delete :destroy, params: { room_uid: @user.main_room }
|
||||
end.to change { Room.count }.by(0)
|
||||
|
||||
expect(flash[:alert]).to be_present
|
||||
expect(response).to redirect_to(@admin.main_room)
|
||||
end
|
||||
|
||||
it "does not allow an admin from a different context to delete room" do
|
||||
allow_any_instance_of(User).to receive(:admin_of?).and_return(false)
|
||||
|
||||
@admin = create(:user)
|
||||
@admin.add_role :admin
|
||||
@request.session[:user_id] = @admin.id
|
||||
|
||||
expect do
|
||||
delete :destroy, params: { room_uid: @secondary_room }
|
||||
end.to change { Room.count }.by(0)
|
||||
|
||||
expect(response).to redirect_to(root_path)
|
||||
end
|
||||
end
|
||||
|
||||
describe "POST #start" do
|
||||
|
@ -374,6 +413,27 @@ describe RoomsController, type: :controller do
|
|||
|
||||
expect(response).to redirect_to(root_path)
|
||||
end
|
||||
|
||||
it "redirects to join path if admin" do
|
||||
@admin = create(:user)
|
||||
@admin.add_role :admin
|
||||
@request.session[:user_id] = @admin.id
|
||||
|
||||
post :start, params: { room_uid: @user.main_room }
|
||||
|
||||
expect(response).to redirect_to(join_path(@user.main_room, @admin.name, { user_is_moderator: true }, @admin.uid))
|
||||
end
|
||||
|
||||
it "redirects to root path if not admin of current user" do
|
||||
allow_any_instance_of(User).to receive(:admin_of?).and_return(false)
|
||||
@admin = create(:user)
|
||||
@admin.add_role :admin
|
||||
@request.session[:user_id] = @admin.id
|
||||
|
||||
post :start, params: { room_uid: @user.main_room }
|
||||
|
||||
expect(response).to redirect_to(root_path)
|
||||
end
|
||||
end
|
||||
|
||||
describe "POST #update_settings" do
|
||||
|
@ -413,6 +473,35 @@ describe RoomsController, type: :controller do
|
|||
|
||||
expect(response).to redirect_to(@secondary_room)
|
||||
end
|
||||
|
||||
it "allows admin to update room settings" do
|
||||
@admin = create(:user)
|
||||
@admin.add_role :admin
|
||||
@request.session[:user_id] = @admin.id
|
||||
|
||||
room_params = { "mute_on_join": "1", "name": @secondary_room.name }
|
||||
formatted_room_params = "{\"muteOnStart\":true,\"requireModeratorApproval\":false," \
|
||||
"\"anyoneCanStart\":false,\"joinModerator\":false}" # JSON string format
|
||||
|
||||
expect { post :update_settings, params: { room_uid: @secondary_room.uid, room: room_params } }
|
||||
.to change { @secondary_room.reload.room_settings }
|
||||
.from(@secondary_room.room_settings).to(formatted_room_params)
|
||||
expect(response).to redirect_to(@secondary_room)
|
||||
end
|
||||
|
||||
it "does not allow admins from a different context to update room settings" do
|
||||
allow_any_instance_of(User).to receive(:admin_of?).and_return(false)
|
||||
@admin = create(:user)
|
||||
@admin.add_role :admin
|
||||
@request.session[:user_id] = @admin.id
|
||||
|
||||
room_params = { "mute_on_join": "1", "name": @secondary_room.name }
|
||||
|
||||
expect { post :update_settings, params: { room_uid: @secondary_room.uid, room: room_params } }
|
||||
.not_to change { @secondary_room.reload.room_settings }
|
||||
|
||||
expect(response).to redirect_to(root_path)
|
||||
end
|
||||
end
|
||||
|
||||
describe "GET #logout" do
|
||||
|
|
Reference in New Issue