diff --git a/docs/platforms/flutter/session-replay/index.mdx b/docs/platforms/flutter/session-replay/index.mdx index 7c751db1533b2..d7a2594414f74 100644 --- a/docs/platforms/flutter/session-replay/index.mdx +++ b/docs/platforms/flutter/session-replay/index.mdx @@ -57,50 +57,17 @@ Sampling allows you to control how much of your website's traffic will result in Sampling starts as soon as a session begins. The `sessionSampleRate` is then evaluated. If the session is sampled, replay recording will start immediately. If not, `onErrorSampleRate` will be evaluated. If the session is sampled at this point, the replay will be buffered and will only be uploaded to Sentry if an error occurs. -## Privacy +## Redact Session Replay via `masking` -The SDK is recording and aggressively redacting (masking) all `Text`, `EditableText`, and `Image` widgets. -Masking in the Sentry Flutter SDK is based on Widget *types*, e.g. `Image`, not the string representation of the type (i.e. we check whether -a `widgetInstance` should be masked by checking `if (widgetInstance is Image)` instead of `if (widgetInstance.runtimeType == 'Image')`). -This means we can ensure masking works regardless of obfuscation in release builds and also works for subclasses. -However, it also means we can only automatically mask widgets that are part of the Flutter SDK itself. +By default, the SDK is recording and aggressively redacting (masking) all `Text`, `EditableText`, and `Image` widgets for `Session Replay`. To modify or disable this behavior, use the `options.experimental.privacy` parameter. -We cannot mask widgets defined in various 3rd-party packages (because the type is not known in the Sentry Flutter SDK), -even though many should be masked. - -Therefore, you need to consider the widgets your application uses and ensure they're masked correctly with custom masking rules. -Examples of widgets that usually should be masked include (but are not limited to): VideoPlayer, WebView, Chart, etc. + Modifying this parameter will also affect `masking` for + `Screenshots` + . -You can tune this and add custom masking rules to fit your needs by adjusting the configuration in `options.experimental.replay`. -For example, you can explicitly mask or unmask widgets by type, -or you can even have a callback to decide whether a specific widget instance should be masked: - -```dart - options.experimental.replay.mask(); - options.experimental.replay.unmask(); - options.experimental.replay.maskCallback( - (Element element, Text widget) => - (widget.data?.contains('secret') ?? false) - ? SentryMaskingDecision.mask - : SentryMaskingDecision.continueProcessing); -``` - -You can find more details in the documentation for each method. - - - -If you find that data isn't being redacted with the default settings, please let us know by creating a [GitHub issue](https://github.com/getsentry/sentry-dart/issues/new?template=BUG_REPORT.yml). - - - -To disable redaction altogether (not to be used on applications with sensitive data): - -```dart - options.experimental.replay.maskAllText = false; - options.experimental.replay.maskAllImages = false; -``` + ## Error Linking diff --git a/platform-includes/enriching-events/attach-screenshots/flutter.mdx b/platform-includes/enriching-events/attach-screenshots/flutter.mdx index c17ce7d836ddf..33d9c37ccd1b0 100644 --- a/platform-includes/enriching-events/attach-screenshots/flutter.mdx +++ b/platform-includes/enriching-events/attach-screenshots/flutter.mdx @@ -13,6 +13,17 @@ await SentryFlutter.init( ); ``` +## Redact Screenshots via `masking` + +The masking feature is by default disabled for Screenshots. To enable masking, use the `options.experimental.privacy` parameter. + + + Modifying this parameter will also affect `masking` for{" "} + `Session Replay`. + + + + ## Filtering Screenshots You can filter your screenshots by using the `beforeScreenshot` callback, which is called before attaching a screenshot to an event. By default, the callback returns `true` which means that all screenshots are attached. diff --git a/platform-includes/replay/privacy-configuration/flutter.mdx b/platform-includes/replay/privacy-configuration/flutter.mdx new file mode 100644 index 0000000000000..472a97f2ca825 --- /dev/null +++ b/platform-includes/replay/privacy-configuration/flutter.mdx @@ -0,0 +1,58 @@ +Masking in the Sentry Flutter SDK is based on Widget _types_, e.g. `Image`, not the string representation of the type (i.e. we check whether +a `widgetInstance` should be masked by checking `if (widgetInstance is Image)` instead of `if (widgetInstance.runtimeType == 'Image')`). +This means we can ensure masking works regardless of obfuscation in release builds and also works for subclasses. +However, it also means we can only automatically mask widgets that are part of the Flutter SDK itself. + + +We cannot mask widgets defined in various 3rd-party packages (because the type is not known in the Sentry Flutter SDK), +even though many should be masked. + +Therefore, you need to consider the widgets your application uses and ensure they're masked correctly with custom masking rules. +Examples of widgets that usually should be masked include (but are not limited to): VideoPlayer, WebView, Chart, etc. + + + +You can tune this and add custom masking rules to fit your needs by adjusting the configuration in `options.experimental.privacy`. +For example, you can explicitly mask or unmask widgets by type, +or you can even have a callback to decide whether a specific widget instance should be masked: + +```dart + options.privacy.mask(); + options.privacy.unmask(); + options.privacy.maskCallback( + (Element element, Text widget) => + (widget.data?.contains('secret') ?? false) + ? SentryMaskingDecision.mask + : SentryMaskingDecision.continueProcessing); +``` + +### `maskAllText` + +Mask all text content. Draws a rectangle of text bounds with text color on top. Currently, only `Text` and `EditableText` Widgets are masked. + +### `maskAllImages` + +Mask content of all images. Draws a rectangle of image bounds with image's dominant color on top. Currently, only `Image` widgets are masked. + +### `maskAssetImages` + +Mask asset images coming from the root asset bundle. + +### `mask()` + +Mask given widget type `T` (or subclasses of `T`) in the screenshot. Note: masking rules are called in the order they're added so if a previous rule already makes a decision, this rule won't be called. + +You can find more details in the documentation for each method. + + + +If you find that data isn't being masked with the default settings, please let us know by creating a [GitHub issue](https://github.com/getsentry/sentry-dart/issues/new?template=BUG_REPORT.yml). + + + +To disable masking for `Screenshots` and `Session Replay` (not to be used on applications with sensitive data): + +```dart + options.experimental.privacy.maskAllText = false; + options.experimental.privacy.maskAllImages = false; +```