From f3ec9ba0a6441cdaa87a7d90eb307bb1a15e42b7 Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Wed, 10 Jul 2024 14:48:33 +0200 Subject: [PATCH 1/6] Add report view hierarchy identifier option --- flutter/lib/src/sentry_flutter_options.dart | 4 +++ .../view_hierarchy/sentry_tree_walker.dart | 15 +++++++--- .../view_hierarchy_event_processor.dart | 2 +- .../view_hierarchy_event_processor_test.dart | 29 +++++++++++++++++-- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/flutter/lib/src/sentry_flutter_options.dart b/flutter/lib/src/sentry_flutter_options.dart index 913070e9ca..061487a2b5 100644 --- a/flutter/lib/src/sentry_flutter_options.dart +++ b/flutter/lib/src/sentry_flutter_options.dart @@ -213,6 +213,10 @@ class SentryFlutterOptions extends SentryOptions { @experimental bool attachViewHierarchy = false; + /// Enables reporting information of identifiers of the view hierarchy. + /// This might contain sensitive information. + bool reportViewHierarchyIdentifiers = true; + /// When enabled, the SDK tracks when the application stops responding for a /// specific amount of time, See [appHangTimeoutInterval]. /// Only available on iOS and macOS. diff --git a/flutter/lib/src/view_hierarchy/sentry_tree_walker.dart b/flutter/lib/src/view_hierarchy/sentry_tree_walker.dart index 41b03f4808..b2e759b2c9 100644 --- a/flutter/lib/src/view_hierarchy/sentry_tree_walker.dart +++ b/flutter/lib/src/view_hierarchy/sentry_tree_walker.dart @@ -209,9 +209,10 @@ import '../widget_utils.dart'; class _TreeWalker { static const _privateDelimiter = '_'; - _TreeWalker(this.rootElement); + _TreeWalker(this.rootElement, this.options); final Element rootElement; + final SentryFlutterOptions options; ValueChanged _visitor( SentryViewHierarchyElement parentSentryElement) { @@ -278,10 +279,15 @@ class _TreeWalker { alpha = widget.opacity; } + String? identifier; + if (options.reportViewHierarchyIdentifiers) { + identifier = WidgetUtils.toStringValue(widget.key); + } + return SentryViewHierarchyElement( element.widget.runtimeType.toString(), depth: element.depth, - identifier: WidgetUtils.toStringValue(element.widget.key), + identifier: identifier, width: width, height: height, x: x, @@ -292,7 +298,8 @@ class _TreeWalker { } } -SentryViewHierarchy? walkWidgetTree(WidgetsBinding instance) { +SentryViewHierarchy? walkWidgetTree( + WidgetsBinding instance, SentryFlutterOptions options) { // to keep compatibility with older versions // ignore: deprecated_member_use final rootElement = instance.renderViewElement; @@ -300,7 +307,7 @@ SentryViewHierarchy? walkWidgetTree(WidgetsBinding instance) { return null; } - final walker = _TreeWalker(rootElement); + final walker = _TreeWalker(rootElement, options); return walker.toSentryViewHierarchy(); } diff --git a/flutter/lib/src/view_hierarchy/view_hierarchy_event_processor.dart b/flutter/lib/src/view_hierarchy/view_hierarchy_event_processor.dart index c3fefe52f5..cf9ae008ec 100644 --- a/flutter/lib/src/view_hierarchy/view_hierarchy_event_processor.dart +++ b/flutter/lib/src/view_hierarchy/view_hierarchy_event_processor.dart @@ -23,7 +23,7 @@ class SentryViewHierarchyEventProcessor implements EventProcessor { if (instance == null) { return event; } - final sentryViewHierarchy = walkWidgetTree(instance); + final sentryViewHierarchy = walkWidgetTree(instance, _options); if (sentryViewHierarchy == null) { return event; diff --git a/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart b/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart index 7743e8ebc6..98487ab3a2 100644 --- a/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart +++ b/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:sentry/sentry.dart'; @@ -79,6 +81,27 @@ void main() { expect(hint.viewHierarchy, isNull); }); }); + + testWidgets('does not add view hierarchy identifiers if opt out in options', + (tester) async { + await tester.runAsync(() async { + final sut = + fixture.getSut(instance, reportViewHierarchyIdentifiers: false); + + await tester.pumpWidget(MyApp()); + + final event = SentryEvent( + exceptions: [SentryException(type: 'type', value: 'value')]); + final hint = Hint(); + + sut.apply(event, hint); + + expect(hint.viewHierarchy, isNotNull); + final bytes = await hint.viewHierarchy!.bytes; + final jsonString = utf8.decode(bytes); + expect(jsonString, isNot(contains('identifier'))); + }); + }); }); } @@ -99,9 +122,11 @@ class TestBindingWrapper implements BindingWrapper { } class Fixture { - SentryViewHierarchyEventProcessor getSut(WidgetsBinding instance) { + SentryViewHierarchyEventProcessor getSut(WidgetsBinding instance, + {bool reportViewHierarchyIdentifiers = true}) { final options = SentryFlutterOptions() - ..bindingUtils = TestBindingWrapper(instance); + ..bindingUtils = TestBindingWrapper(instance) + ..reportViewHierarchyIdentifiers = reportViewHierarchyIdentifiers; return SentryViewHierarchyEventProcessor(options); } } From ccd2b32e3b4dcd3bec98a69c4c99bf7744e13d51 Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Wed, 10 Jul 2024 14:55:55 +0200 Subject: [PATCH 2/6] Update docs --- flutter/lib/src/sentry_flutter_options.dart | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/flutter/lib/src/sentry_flutter_options.dart b/flutter/lib/src/sentry_flutter_options.dart index 061487a2b5..347da9ada3 100644 --- a/flutter/lib/src/sentry_flutter_options.dart +++ b/flutter/lib/src/sentry_flutter_options.dart @@ -213,8 +213,12 @@ class SentryFlutterOptions extends SentryOptions { @experimental bool attachViewHierarchy = false; - /// Enables reporting information of identifiers of the view hierarchy. - /// This might contain sensitive information. + /// Enables collection of view hierarchy element identifiers. + /// + /// Identifiers are extracted from widget keys. + /// Disable this flag if your widget keys contain sensitive data. + /// + /// Default: `true` bool reportViewHierarchyIdentifiers = true; /// When enabled, the SDK tracks when the application stops responding for a From c0a2496f343cbe38efaf1d12e55ce0927c4b6c65 Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Wed, 10 Jul 2024 16:37:38 +0200 Subject: [PATCH 3/6] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88967b15dc..1de57f049d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Features +- Add flag to disable reporting of view hierarchy identifiers which may contain sensitive information ([#2158](https://github.com/getsentry/sentry-dart/pull/2158)) - Add memory usage to contexts ([#2133](https://github.com/getsentry/sentry-dart/pull/2133)) - Only for Linux/Windows applications, as iOS/Android/macOS use native SDKs From a1e8592126b26c0906083c907149c1a22a27bc6c Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Wed, 10 Jul 2024 16:38:08 +0200 Subject: [PATCH 4/6] Fix test --- flutter/test/view_hierarchy/sentry_tree_walker_test.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/flutter/test/view_hierarchy/sentry_tree_walker_test.dart b/flutter/test/view_hierarchy/sentry_tree_walker_test.dart index 52d775529b..1377867c19 100644 --- a/flutter/test/view_hierarchy/sentry_tree_walker_test.dart +++ b/flutter/test/view_hierarchy/sentry_tree_walker_test.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:sentry/sentry.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:sentry_flutter/src/view_hierarchy/sentry_tree_walker.dart'; void main() { @@ -16,7 +16,7 @@ void main() { await tester.runAsync(() async { await tester.pumpWidget(MyApp()); - final sentryViewHierarchy = walkWidgetTree(instance); + final sentryViewHierarchy = walkWidgetTree(instance, SentryFlutterOptions()); expect(sentryViewHierarchy!.renderingSystem, 'flutter'); }); @@ -147,7 +147,8 @@ void main() { SentryViewHierarchyElement _getFirstSentryViewHierarchy( WidgetsBinding instance) { - final sentryViewHierarchy = walkWidgetTree(instance); + final options = SentryFlutterOptions(); + final sentryViewHierarchy = walkWidgetTree(instance, options); return sentryViewHierarchy!.windows.first; } From 534a73113a21efd6769eaf86f7ed731ff3551786 Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Wed, 10 Jul 2024 16:50:02 +0200 Subject: [PATCH 5/6] Formatting --- flutter/test/view_hierarchy/sentry_tree_walker_test.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flutter/test/view_hierarchy/sentry_tree_walker_test.dart b/flutter/test/view_hierarchy/sentry_tree_walker_test.dart index 1377867c19..9fd41fc522 100644 --- a/flutter/test/view_hierarchy/sentry_tree_walker_test.dart +++ b/flutter/test/view_hierarchy/sentry_tree_walker_test.dart @@ -16,7 +16,8 @@ void main() { await tester.runAsync(() async { await tester.pumpWidget(MyApp()); - final sentryViewHierarchy = walkWidgetTree(instance, SentryFlutterOptions()); + final sentryViewHierarchy = + walkWidgetTree(instance, SentryFlutterOptions()); expect(sentryViewHierarchy!.renderingSystem, 'flutter'); }); From 06171cf03eeb6d63350c8d8e36122565d228d839 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Mon, 15 Jul 2024 14:21:23 +0200 Subject: [PATCH 6/6] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49e8d3a253..b5f38eb431 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,8 @@ ### Features -- Add flag to disable reporting of view hierarchy identifiers which may contain sensitive information ([#2158](https://github.com/getsentry/sentry-dart/pull/2158)) +- Add flag to disable reporting of view hierarchy identifiers ([#2158](https://github.com/getsentry/sentry-dart/pull/2158)) + - Use `reportViewHierarchyIdentifiers` to enable or disable the option - Record dropped spans in client reports ([#2154](https://github.com/getsentry/sentry-dart/pull/2154)) - Add memory usage to contexts ([#2133](https://github.com/getsentry/sentry-dart/pull/2133)) - Only for Linux/Windows applications, as iOS/Android/macOS use native SDKs