diff --git a/app/assets/javascripts/audit_logs.js b/app/assets/javascripts/audit_logs.js
index c64246c28..6f6b41fc0 100644
--- a/app/assets/javascripts/audit_logs.js
+++ b/app/assets/javascripts/audit_logs.js
@@ -1,5 +1,7 @@
document.addEventListener('DOMContentLoaded', () => {
- document.querySelectorAll('.js-log-type-select, .js-event-type-select').forEach((el) => {
- $(el).select2();
- });
+ document
+ .querySelectorAll(['.js-log-type-select', '.js-event-type-select', '.js-community-select'].join(', '))
+ .forEach((el) => {
+ $(el).select2();
+ });
});
diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb
index 80880fcd7..27a513fd7 100644
--- a/app/controllers/admin_controller.rb
+++ b/app/controllers/admin_controller.rb
@@ -4,6 +4,7 @@ class AdminController < ApplicationController
before_action :verify_global_admin, only: [:admin_email, :send_admin_email, :new_site, :create_site, :setup,
:setup_save, :failban, :all_email, :send_all_email]
before_action :verify_developer, only: [:change_users, :impersonate]
+ before_action :set_communities, only: [:audit_logs]
before_action :set_user, only: [:change_users, :failban, :impersonate]
skip_before_action :check_if_warning_or_suspension_pending, only: [:change_back, :verify_elevation]
@@ -122,6 +123,10 @@ def audit_logs
end
end
+ if params[:community].present?
+ @logs = @logs.where(community_id: params[:community])
+ end
+
if params[:from].present?
@logs = @logs.where('date(created_at) >= ?', params[:from])
end
@@ -274,6 +279,14 @@ def do_email_query
private
+ def set_communities
+ @communities = if current_user&.global_admin?
+ Community.unscoped.order(name: :asc)
+ else
+ Community.none
+ end
+ end
+
def set_user
@user = User.find(params[:id])
end
diff --git a/app/helpers/uri_helper.rb b/app/helpers/uri_helper.rb
index 9792da174..a98e6e712 100644
--- a/app/helpers/uri_helper.rb
+++ b/app/helpers/uri_helper.rb
@@ -1,23 +1,33 @@
module UriHelper
[:http, :https].each do |method|
# Does a given URI have the relevant scheme?
- # @param {String} uri URI to check
- # @return {Boolean} check result
+ # @param uri [String] URI to check
+ # @return [Boolean] check result
define_method "#{method}_uri?" do |uri|
URI(uri).scheme.casecmp(method.to_s).zero?
end
end
+ # Forces a given URI to be a safe one
+ # @para uri [String] URI to fixup
+ # @param scheme [Symbol] scheme to use if the URI is unsafe
+ # @return [String] safe URI
+ def force_safe_uri(uri, scheme = :http)
+ return uri if safe_uri?(uri)
+
+ safe_uri?(uri) ? uri : "#{scheme}://#{uri}"
+ end
+
# Is a given URI a relative one?
- # @param {String} uri URI to check
- # @return {Boolean} check result
+ # @param uri [String] URI to check
+ # @return [Boolean] check result
def relative_uri?(uri)
URI(uri).relative?
end
# Is a given URI a safe one (absolute http://, https://, or relative)?
- # @param {String} uri URI to check
- # @return {Boolean} check result
+ # @param uri [String] URI to check
+ # @return [Boolean] check result
def safe_uri?(uri)
relative_uri?(uri) || http_uri?(uri) || https_uri?(uri)
end
diff --git a/app/views/admin/_audit_log.html.erb b/app/views/admin/_audit_log.html.erb
index 0e80e78ee..aab94ae3d 100644
--- a/app/views/admin/_audit_log.html.erb
+++ b/app/views/admin/_audit_log.html.erb
@@ -26,6 +26,9 @@
<%= t('g.type').capitalize %>:
<%= log.log_type.humanize %>
+ <%= t('g.community').capitalize %>
+ <%= link_to log.community.name, force_safe_uri(log.community.host) %>
+
<%= t('g.user').capitalize %>:
<%= user_link(log.user) %>
diff --git a/app/views/admin/audit_logs.html.erb b/app/views/admin/audit_logs.html.erb
index 1b18ccd68..623965ac5 100644
--- a/app/views/admin/audit_logs.html.erb
+++ b/app/views/admin/audit_logs.html.erb
@@ -10,16 +10,33 @@
<%= form_tag audit_logs_path, method: :get, class: 'form-inline audit-log-filters' do %>
Administrators can edit site settings and user roles.