diff --git a/app/assets/javascripts/room.js b/app/assets/javascripts/room.js index 7da6580e..88ec4cee 100644 --- a/app/assets/javascripts/room.js +++ b/app/assets/javascripts/room.js @@ -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() { diff --git a/app/assets/javascripts/search.js b/app/assets/javascripts/search.js index f0da579c..b4ecbe47 100644 --- a/app/assets/javascripts/search.js +++ b/app/assets/javascripts/search.js @@ -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) { diff --git a/app/assets/javascripts/sort.js b/app/assets/javascripts/sort.js index effa8ea6..12486814 100644 --- a/app/assets/javascripts/sort.js +++ b/app/assets/javascripts/sort.js @@ -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'); } } diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb index 32dcb8fa..3ae5e28c 100644 --- a/app/controllers/admins_controller.rb +++ b/app/controllers/admins_controller.rb @@ -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 diff --git a/app/controllers/concerns/rolify.rb b/app/controllers/concerns/rolify.rb index 1fab4bc5..c7bf63fd 100644 --- a/app/controllers/concerns/rolify.rb +++ b/app/controllers/concerns/rolify.rb @@ -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" diff --git a/app/controllers/rooms_controller.rb b/app/controllers/rooms_controller.rb index f4322537..25f8c7de 100644 --- a/app/controllers/rooms_controller.rb +++ b/app/controllers/rooms_controller.rb @@ -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 diff --git a/app/models/ability.rb b/app/models/ability.rb index 649bf02e..f53b7383 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -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 diff --git a/app/models/role.rb b/app/models/role.rb index a4b1331f..eb2ff585 100644 --- a/app/models/role.rb +++ b/app/models/role.rb @@ -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 diff --git a/app/models/room.rb b/app/models/room.rb index 0e61fa7e..a00a23f6 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -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? diff --git a/app/views/admins/components/_menu_buttons.html.erb b/app/views/admins/components/_menu_buttons.html.erb index 17bbc460..6e4944bb 100644 --- a/app/views/admins/components/_menu_buttons.html.erb +++ b/app/views/admins/components/_menu_buttons.html.erb @@ -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 %> + <%= 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 %> - <%= t("administrator.recordings.title") %> + <%= 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 %> <%= 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 %> - <%= t("administrator.roles.title") %> + <%= t("administrator.roles.title") %> <% end %> <% end %> \ No newline at end of file diff --git a/app/views/admins/components/_roles.html.erb b/app/views/admins/components/_roles.html.erb index 51f5cf14..ee4d0edf 100644 --- a/app/views/admins/components/_roles.html.erb +++ b/app/views/admins/components/_roles.html.erb @@ -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") %> -