Class: ConvertSdk::Redactor
- Inherits:
-
Object
- Object
- ConvertSdk::Redactor
- Defined in:
- lib/convert_sdk/redactor.rb
Overview
Masks secrets and strips URL query strings out of log messages.
Redactor is the structural guarantee behind security NFR5: it is wired
inside LogManager so that no call path can emit a message without first
passing through #redact. Redaction is by construction, not by discipline.
Two transforms are applied to every message:
- Secret masking — each known secret (e.g. an
sdk_key/sdk_key_secretvalue) is replaced wherever it occurs with its first four characters followed by a single-character ellipsis (+abcd…+). Secrets shorter than four characters are replaced entirely (+…+). - URL query stripping — any
http(s)URL has its?query=stringremoved (+https://host/path?x=1+ becomeshttps://host/path), since query strings frequently carry tokens.
Secrets become known at different times: some at construction, some at
ConvertSdk.create time. #register_secret allows late registration so
the same redactor instance can be wired before all secrets are known.
Redaction operates on strings — structured objects must already have
passed the loggable conversion boundary (see LogManager) before
reaching here.
Constant Summary collapse
- MASK_PREFIX_LENGTH =
Number of leading characters kept unmasked for a secret long enough to retain a prefix. JS-parity disclosure budget.
4- MASK_GLYPH =
The single-character ellipsis appended after the unmasked prefix (or used as the whole replacement for short secrets).
"…"- URL_QUERY_PATTERN =
Matches an
http(s)URL's query string: a?and everything up to the next whitespace. The query is stripped; the path is kept. %r{(https?://\S*?)\?\S*}
Instance Method Summary collapse
-
#initialize(secrets = []) ⇒ Redactor
constructor
A new instance of Redactor.
-
#redact(message) ⇒ String
Apply secret masking and URL query stripping to
message. -
#register_secret(secret) ⇒ void
Register an additional secret to mask.
Constructor Details
#initialize(secrets = []) ⇒ Redactor
Returns a new instance of Redactor.
40 41 42 43 |
# File 'lib/convert_sdk/redactor.rb', line 40 def initialize(secrets = []) @secrets = [] Array(secrets).each { |secret| register_secret(secret) } end |
Instance Method Details
#redact(message) ⇒ String
Apply secret masking and URL query stripping to message.
64 65 66 67 |
# File 'lib/convert_sdk/redactor.rb', line 64 def redact() result = strip_url_queries(.to_s) mask_secrets(result) end |
#register_secret(secret) ⇒ void
This method returns an undefined value.
Register an additional secret to mask. Safe to call after construction
(e.g. once the SDK key is known at ConvertSdk.create time).
50 51 52 53 54 55 56 57 |
# File 'lib/convert_sdk/redactor.rb', line 50 def register_secret(secret) return if secret.nil? value = secret.to_s return if value.strip.empty? @secrets << value unless @secrets.include?(value) end |