TF-4136 security(sentry): scrub sensitive headers without mutating HTTP payloads
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
import 'package:core/utils/app_logger.dart';
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||||
|
|
||||||
class EnvLoader {
|
class EnvLoader {
|
||||||
@@ -21,7 +20,7 @@ class EnvLoader {
|
|||||||
|
|
||||||
static Future<void> loadFcmConfigFileToEnv({
|
static Future<void> loadFcmConfigFileToEnv({
|
||||||
Map<String, String>? currentMapEnvData,
|
Map<String, String>? currentMapEnvData,
|
||||||
VoidCallback? onCallBack,
|
Future<void> Function()? onCallBack,
|
||||||
}) async {
|
}) async {
|
||||||
try {
|
try {
|
||||||
await dotenv.load(
|
await dotenv.load(
|
||||||
@@ -30,7 +29,7 @@ class EnvLoader {
|
|||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logWarning('EnvLoader::loadFcmConfigFileToEnv: Exception = $e');
|
logWarning('EnvLoader::loadFcmConfigFileToEnv: Exception = $e');
|
||||||
onCallBack?.call();
|
await onCallBack?.call();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,14 @@ import 'package:core/utils/sentry/sentry_config.dart';
|
|||||||
import 'package:sentry_flutter/sentry_flutter.dart';
|
import 'package:sentry_flutter/sentry_flutter.dart';
|
||||||
|
|
||||||
class SentryInitializer {
|
class SentryInitializer {
|
||||||
|
static const _blockedHeaderPatterns = [
|
||||||
|
'authorization',
|
||||||
|
'cookie',
|
||||||
|
'set-cookie',
|
||||||
|
'x-auth',
|
||||||
|
'x-token',
|
||||||
|
];
|
||||||
|
|
||||||
static Future<bool> init(FutureOr<void> Function() appRunner) async {
|
static Future<bool> init(FutureOr<void> Function() appRunner) async {
|
||||||
final config = await SentryConfig.load();
|
final config = await SentryConfig.load();
|
||||||
|
|
||||||
@@ -36,10 +44,37 @@ class SentryInitializer {
|
|||||||
SentryEvent event,
|
SentryEvent event,
|
||||||
Hint? hint,
|
Hint? hint,
|
||||||
) async {
|
) async {
|
||||||
// Ignore AssertionError events
|
final req = event.request;
|
||||||
if (event.throwable is AssertionError) {
|
if (req == null) return event;
|
||||||
return null;
|
|
||||||
}
|
final sanitizedHeaders = Map<String, String>.from(req.headers)
|
||||||
return event;
|
..removeWhere(
|
||||||
|
(k, _) => _blockedHeaderPatterns.any(
|
||||||
|
(p) => k.toLowerCase().contains(p),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final sanitizedRequest = SentryRequest(
|
||||||
|
url: req.url,
|
||||||
|
method: req.method,
|
||||||
|
headers: sanitizedHeaders,
|
||||||
|
queryString: req.queryString,
|
||||||
|
cookies: null,
|
||||||
|
data: null,
|
||||||
|
);
|
||||||
|
|
||||||
|
return SentryEvent(
|
||||||
|
eventId: event.eventId,
|
||||||
|
contexts: event.contexts,
|
||||||
|
throwable: event.throwable,
|
||||||
|
timestamp: event.timestamp,
|
||||||
|
level: event.level,
|
||||||
|
logger: event.logger,
|
||||||
|
request: sanitizedRequest,
|
||||||
|
tags: event.tags,
|
||||||
|
breadcrumbs: event.breadcrumbs,
|
||||||
|
user: event.user,
|
||||||
|
fingerprint: event.fingerprint,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ class SentryManager {
|
|||||||
Breadcrumb(
|
Breadcrumb(
|
||||||
message: message,
|
message: message,
|
||||||
data: extras,
|
data: extras,
|
||||||
level: SentryLevel.info,
|
level: level,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -21,8 +21,18 @@ SENTRY_ENVIRONMENT=<environment_name>
|
|||||||
### 2. Activate Sentry in environment file
|
### 2. Activate Sentry in environment file
|
||||||
In [`env.file`](https://github.com/linagora/tmail-flutter/blob/master/env.file), ensure the following line is present:
|
In [`env.file`](https://github.com/linagora/tmail-flutter/blob/master/env.file), ensure the following line is present:
|
||||||
|
|
||||||
|
- If you want to use Sentry:
|
||||||
```bash
|
```bash
|
||||||
SENTRY_ENABLED=true | false
|
SENTRY_ENABLED=true
|
||||||
|
```
|
||||||
|
|
||||||
|
- If you don't want to use Sentry:
|
||||||
|
```bash
|
||||||
|
SENTRY_ENABLED=false
|
||||||
|
```
|
||||||
|
or
|
||||||
|
```bash
|
||||||
|
SENTRY_ENABLED=
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. Verification
|
### 3. Verification
|
||||||
|
|||||||
@@ -30,5 +30,7 @@ Future<void> runTmailPreload() async {
|
|||||||
await CozyIntegration.integrateCozy();
|
await CozyIntegration.integrateCozy();
|
||||||
await HiveCacheConfig.instance.initializeEncryptionKey();
|
await HiveCacheConfig.instance.initializeEncryptionKey();
|
||||||
|
|
||||||
setPathUrlStrategy();
|
if (PlatformInfo.isWeb) {
|
||||||
|
setPathUrlStrategy();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user