Skip to content

Commit 77b3358

Browse files
committed
Fix log sanitizer loading and cleanup
1 parent 1f316d2 commit 77b3358

6 files changed

Lines changed: 35 additions & 12 deletions

File tree

app/web/request/request_context_middleware.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
require 'rack/request'
44
require 'securerandom'
55
require 'time'
6+
require_relative '../security/log_sanitizer'
67

78
module Html2rss
89
module Web
Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
11
# frozen_string_literal: true
22

33
require 'digest'
4-
require 'uri'
4+
require 'html2rss/url'
55

66
module Html2rss
77
module Web
88
##
9-
# Sanitizes request and detail payloads before structured logging.
9+
# Sanitizes request paths and log payloads before they are emitted.
1010
module LogSanitizer
11-
FEED_TOKEN_ROUTE = %r{\A(/api/v1/feeds/)([^/.?]+)(\.(?:json|xml|rss))?\z}
11+
FEED_TOKEN_ROUTE = %r{\A(/api/v1/feeds/)([^/?]+)\z}
1212

1313
class << self
1414
# @param path [String, nil]
1515
# @return [String, nil]
1616
def sanitize_path(path)
1717
return if path.nil?
1818

19-
path.to_s.gsub(FEED_TOKEN_ROUTE, '\1[REDACTED]\3')
19+
path_string = path.to_s
20+
suffix = feed_suffix(path_string)
21+
token_path = suffix ? path_string.delete_suffix(suffix) : path_string
22+
23+
token_path.gsub(FEED_TOKEN_ROUTE, "\\1[REDACTED]#{suffix}")
2024
end
2125

2226
# @param details [Hash]
@@ -29,6 +33,16 @@ def sanitize_details(details)
2933

3034
private
3135

36+
# @param path [String]
37+
# @return [String, nil]
38+
def feed_suffix(path)
39+
return '.json' if path.end_with?('.json')
40+
return '.xml' if path.end_with?('.xml')
41+
return '.rss' if path.end_with?('.rss')
42+
43+
nil
44+
end
45+
3246
# @param key [Object]
3347
# @param value [Object]
3448
# @return [Object]
@@ -46,13 +60,13 @@ def sanitize_url(value)
4660
url = value.to_s
4761
return value if url.empty?
4862

49-
uri = URI.parse(url)
63+
normalized_url = Html2rss::Url.for_channel(url)
5064
{
51-
host: uri.host,
52-
scheme: uri.scheme,
65+
host: normalized_url.host,
66+
scheme: normalized_url.scheme,
5367
hash: Digest::SHA256.hexdigest(url)[0..11]
5468
}.compact
55-
rescue URI::InvalidURIError
69+
rescue StandardError
5670
{ hash: Digest::SHA256.hexdigest(url)[0..11] }
5771
end
5872
end

app/web/security/security_logger.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# frozen_string_literal: true
22

3-
require 'json'
43
require 'digest'
54
require 'time'
65
module Html2rss

app/web/telemetry/app_logger.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
require 'json'
44
require 'logger'
55
require 'time'
6-
require 'uri'
76

87
module Html2rss
98
module Web

spec/html2rss/web/log_sanitizer_spec.rb

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
require_relative '../../../app/web/security/security_logger'
88
require_relative '../../../app/web/telemetry/app_logger'
99
require_relative '../../../app/web/telemetry/log_event'
10-
require_relative '../../../app/web/telemetry/log_sanitizer'
10+
require_relative '../../../app/web/security/log_sanitizer'
1111
require_relative '../../../app/web/telemetry/observability'
1212

1313
RSpec.describe Html2rss::Web::LogSanitizer do
@@ -36,9 +36,12 @@
3636
Html2rss::Web::RequestContext.clear!
3737
end
3838

39-
it 'redacts feed tokens from token feed request paths' do
39+
it 'redacts feed tokens from token feed request paths', :aggregate_failures do
4040
expect(described_class.sanitize_path('/api/v1/feeds/token-value-123')).to eq('/api/v1/feeds/[REDACTED]')
4141
expect(described_class.sanitize_path('/api/v1/feeds/token-value-123.json')).to eq('/api/v1/feeds/[REDACTED].json')
42+
expect(
43+
described_class.sanitize_path('/api/v1/feeds/eyJwIjoiYS5iLmMifQ==.xml')
44+
).to eq('/api/v1/feeds/[REDACTED].xml')
4245
end
4346

4447
it 'replaces logged urls with hashed host metadata' do
@@ -51,6 +54,12 @@
5154
expect(described_class.sanitize_details(url: 'https://news.ycombinator.com')).to eq(url: expected_url)
5255
end
5356

57+
it 'falls back to a hash for malformed urls' do
58+
expect(described_class.sanitize_details(url: '://bad url')).to eq(
59+
url: { hash: Digest::SHA256.hexdigest('://bad url')[0..11] }
60+
)
61+
end
62+
5463
it 'sanitizes security logger token usage fields' do
5564
Html2rss::Web::SecurityLogger.log_token_usage('very-secret-token', 'https://news.ycombinator.com', true)
5665
payload = JSON.parse(io.string.lines.last, symbolize_names: true)

spec/html2rss/web/request_context_middleware_spec.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
require 'rack/mock'
55

66
require_relative '../../../app/web/request/request_context'
7+
require_relative '../../../app/web/security/log_sanitizer'
78
require_relative '../../../app/web/request/request_context_middleware'
89

910
RSpec.describe Html2rss::Web::RequestContextMiddleware do

0 commit comments

Comments
 (0)