Yeh
This commit is contained in:
@@ -46,8 +46,23 @@ class Api::EventsController < ApplicationController
|
||||
rules = Rule.active.sync_order
|
||||
end
|
||||
|
||||
response_data[:rules] = rules.map(&:to_agent_format)
|
||||
agent_rules = rules.map(&:to_agent_format)
|
||||
response_data[:rules] = agent_rules
|
||||
response_data[:rules_changed] = true
|
||||
|
||||
# Include path segments dictionary for path_pattern rules
|
||||
path_segment_ids = agent_rules
|
||||
.select { |r| r[:waf_rule_type] == 'path_pattern' }
|
||||
.flat_map { |r| r.dig(:conditions, :segment_ids) }
|
||||
.compact
|
||||
.uniq
|
||||
|
||||
if path_segment_ids.any?
|
||||
response_data[:path_segments] = PathSegment
|
||||
.where(id: path_segment_ids)
|
||||
.pluck(:id, :segment)
|
||||
.to_h
|
||||
end
|
||||
else
|
||||
response_data[:rules_changed] = false
|
||||
end
|
||||
|
||||
@@ -189,6 +189,38 @@ end
|
||||
def process_quick_create_parameters
|
||||
return unless @rule
|
||||
|
||||
# Handle path pattern parameters
|
||||
if @rule.path_pattern_rule? && params[:path_pattern].present? && params[:match_type].present?
|
||||
begin
|
||||
pattern = params[:path_pattern]
|
||||
match_type = params[:match_type]
|
||||
|
||||
# Parse pattern to segments
|
||||
segments = pattern.split('/').reject(&:blank?).map(&:downcase)
|
||||
|
||||
# Find or create PathSegment entries
|
||||
segment_ids = segments.map do |seg|
|
||||
PathSegment.find_or_create_segment(seg).id
|
||||
end
|
||||
|
||||
# Set conditions with segment IDs and match type
|
||||
@rule.conditions = {
|
||||
segment_ids: segment_ids,
|
||||
match_type: match_type,
|
||||
original_pattern: pattern
|
||||
}
|
||||
|
||||
# Add to metadata for display
|
||||
@rule.metadata ||= {}
|
||||
@rule.metadata.merge!({
|
||||
segments: segments,
|
||||
pattern_display: "/" + segments.join("/")
|
||||
})
|
||||
rescue => e
|
||||
@rule.errors.add(:base, "Failed to create path pattern: #{e.message}")
|
||||
end
|
||||
end
|
||||
|
||||
# Handle rate limiting parameters
|
||||
if @rule.rate_limit_rule? && params[:rate_limit].present? && params[:rate_window].present?
|
||||
rate_limit_data = {
|
||||
@@ -322,55 +354,4 @@ end
|
||||
@rule.priority = 50 # Default priority
|
||||
end
|
||||
end
|
||||
|
||||
def process_quick_create_parameters
|
||||
return unless @rule
|
||||
|
||||
# Handle rate limiting parameters
|
||||
if @rule.rate_limit_rule? && params[:rate_limit].present? && params[:rate_window].present?
|
||||
rate_limit_data = {
|
||||
limit: params[:rate_limit].to_i,
|
||||
window_seconds: params[:rate_window].to_i,
|
||||
scope: 'per_ip'
|
||||
}
|
||||
|
||||
# Update conditions with rate limit data
|
||||
@rule.conditions ||= {}
|
||||
@rule.conditions.merge!(rate_limit_data)
|
||||
end
|
||||
|
||||
# Handle redirect URL
|
||||
if @rule.redirect_action? && params[:redirect_url].present?
|
||||
@rule.metadata ||= {}
|
||||
if @rule.metadata.is_a?(String)
|
||||
begin
|
||||
@rule.metadata = JSON.parse(@rule.metadata)
|
||||
rescue JSON::ParserError
|
||||
@rule.metadata = {}
|
||||
end
|
||||
end
|
||||
@rule.metadata.merge!({
|
||||
redirect_url: params[:redirect_url],
|
||||
redirect_status: 302
|
||||
})
|
||||
end
|
||||
|
||||
# Parse metadata if it's a string that looks like JSON
|
||||
if @rule.metadata.is_a?(String) && @rule.metadata.starts_with?('{')
|
||||
begin
|
||||
@rule.metadata = JSON.parse(@rule.metadata)
|
||||
rescue JSON::ParserError
|
||||
# Keep as string if not valid JSON
|
||||
end
|
||||
end
|
||||
|
||||
# Add reason to metadata if provided
|
||||
if params.dig(:rule, :metadata).present?
|
||||
if @rule.metadata.is_a?(Hash)
|
||||
@rule.metadata['reason'] = params[:rule][:metadata]
|
||||
else
|
||||
@rule.metadata = { 'reason' => params[:rule][:metadata] }
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user