relay_pii/
legacy.rs

1//! Legacy datascrubbing coniguration
2//!
3//! All these configuration options are ignored by the new data scrubbers which operate
4//! solely from the [PiiConfig] rules for the project.
5
6use std::sync::OnceLock;
7
8use serde::{Deserialize, Serialize};
9
10use crate::config::{PiiConfig, PiiConfigError};
11use crate::convert;
12
13/// Configuration for Sentry's datascrubbing
14#[derive(Debug, Default, Clone, Serialize, Deserialize)]
15#[serde(default, rename_all = "camelCase")]
16pub struct DataScrubbingConfig {
17    /// List with the fields to be excluded.
18    pub exclude_fields: Vec<String>,
19    /// Toggles all data scrubbing on or off.
20    #[serde(skip_serializing_if = "crate::is_flag_default")]
21    pub scrub_data: bool,
22    /// Should ip addresses be scrubbed from messages?
23    #[serde(skip_serializing_if = "crate::is_flag_default")]
24    pub scrub_ip_addresses: bool,
25    /// List of sensitive fields to be scrubbed from the messages.
26    pub sensitive_fields: Vec<String>,
27    /// Controls whether default fields will be scrubbed.
28    #[serde(skip_serializing_if = "crate::is_flag_default")]
29    pub scrub_defaults: bool,
30
31    /// PII config derived from datascrubbing settings.
32    ///
33    /// Cached because the conversion process is expensive.
34    ///
35    /// NOTE: We discarded the idea of making the conversion to PiiConfig part of deserialization,
36    /// because we want the conversion to run on the processing sync arbiter, so that it does not
37    /// slow down or even crash other parts of the system.
38    #[serde(skip)]
39    pub(super) pii_config: OnceLock<Result<Option<PiiConfig>, PiiConfigError>>,
40}
41
42impl DataScrubbingConfig {
43    /// Creates a new data scrubbing configuration that does nothing on the event.
44    pub fn new_disabled() -> Self {
45        let pii_config = OnceLock::new();
46        let _ = pii_config.set(Ok(None));
47
48        DataScrubbingConfig {
49            exclude_fields: vec![],
50            scrub_data: false,
51            scrub_ip_addresses: false,
52            sensitive_fields: vec![],
53            scrub_defaults: false,
54            pii_config,
55        }
56    }
57
58    /// Returns true if datascrubbing is disabled.
59    pub fn is_disabled(&self) -> bool {
60        !self.scrub_data && !self.scrub_ip_addresses
61    }
62
63    /// Get the PII config derived from datascrubbing settings.
64    ///
65    /// This can be computationally expensive when called for the first time. The result is cached
66    /// internally and reused on the second call.
67    pub fn pii_config(&self) -> Result<&'_ Option<PiiConfig>, &PiiConfigError> {
68        self.pii_config
69            .get_or_init(|| self.pii_config_uncached())
70            .as_ref()
71    }
72
73    /// Like [`pii_config`](Self::pii_config) but without internal caching.
74    #[inline]
75    pub fn pii_config_uncached(&self) -> Result<Option<PiiConfig>, PiiConfigError> {
76        convert::to_pii_config(self).inspect_err(|e| {
77            relay_log::error!(
78                error = e as &dyn std::error::Error,
79                "failed to convert datascrubbing config"
80            );
81        })
82    }
83}