[shared_preferences] Fix possible clash of string with double entry (#3895)
diff --git a/packages/shared_preferences/shared_preferences/CHANGELOG.md b/packages/shared_preferences/shared_preferences/CHANGELOG.md
index 48abf9a..57b35a8 100644
--- a/packages/shared_preferences/shared_preferences/CHANGELOG.md
+++ b/packages/shared_preferences/shared_preferences/CHANGELOG.md
@@ -1,7 +1,8 @@
-## NEXT
+## 2.0.7
* Add iOS unit test target.
* Updated Android lint settings.
+* Fix string clash with double entries on Android
## 2.0.6
diff --git a/packages/shared_preferences/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/MethodCallHandlerImpl.java b/packages/shared_preferences/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/MethodCallHandlerImpl.java
index 71ec14e..cea3f34 100644
--- a/packages/shared_preferences/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/MethodCallHandlerImpl.java
+++ b/packages/shared_preferences/shared_preferences/android/src/main/java/io/flutter/plugins/sharedpreferences/MethodCallHandlerImpl.java
@@ -86,7 +86,9 @@
break;
case "setString":
String value = (String) call.argument("value");
- if (value.startsWith(LIST_IDENTIFIER) || value.startsWith(BIG_INTEGER_PREFIX)) {
+ if (value.startsWith(LIST_IDENTIFIER)
+ || value.startsWith(BIG_INTEGER_PREFIX)
+ || value.startsWith(DOUBLE_PREFIX)) {
result.error(
"StorageError",
"This string cannot be stored as it clashes with special identifier prefixes.",
diff --git a/packages/shared_preferences/shared_preferences/example/integration_test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences/example/integration_test/shared_preferences_test.dart
index 1d46ed5..e8498f4 100644
--- a/packages/shared_preferences/shared_preferences/example/integration_test/shared_preferences_test.dart
+++ b/packages/shared_preferences/shared_preferences/example/integration_test/shared_preferences_test.dart
@@ -3,6 +3,8 @@
// found in the LICENSE file.
import 'dart:async';
+import 'dart:io';
+import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:integration_test/integration_test.dart';
@@ -102,5 +104,39 @@
// The last write should win.
expect(preferences.getInt('int'), writeCount);
});
+
+ testWidgets(
+ 'string clash with lists, big integers and doubles (Android only)',
+ (WidgetTester _) async {
+ await preferences.clear();
+ // special prefixes plus a string value
+ expect(
+ // prefix for lists
+ preferences.setString(
+ 'String',
+ 'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBhIGxpc3Qu' +
+ kTestValues2['flutter.String']),
+ throwsA(isA<PlatformException>()));
+ await preferences.reload();
+ expect(preferences.getString('String'), null);
+ expect(
+ // prefix for big integers
+ preferences.setString(
+ 'String',
+ 'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBCaWdJbnRlZ2Vy' +
+ kTestValues2['flutter.String']),
+ throwsA(isA<PlatformException>()));
+ await preferences.reload();
+ expect(preferences.getString('String'), null);
+ expect(
+ // prefix for doubles
+ preferences.setString(
+ 'String',
+ 'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBEb3VibGUu' +
+ kTestValues2['flutter.String']),
+ throwsA(isA<PlatformException>()));
+ await preferences.reload();
+ expect(preferences.getString('String'), null);
+ }, skip: !Platform.isAndroid);
});
}
diff --git a/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart b/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart
index 3d2dd05..841d615 100644
--- a/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart
+++ b/packages/shared_preferences/shared_preferences/lib/shared_preferences.dart
@@ -128,6 +128,13 @@
_setValue('Double', key, value);
/// Saves a string [value] to persistent storage in the background.
+ ///
+ /// Note: Due to limitations in Android's SharedPreferences,
+ /// values cannot start with any one of the following:
+ ///
+ /// - 'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBhIGxpc3Qu'
+ /// - 'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBCaWdJbnRlZ2Vy'
+ /// - 'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBEb3VibGUu'
Future<bool> setString(String key, String value) =>
_setValue('String', key, value);
diff --git a/packages/shared_preferences/shared_preferences/pubspec.yaml b/packages/shared_preferences/shared_preferences/pubspec.yaml
index c3039a9..e3cdfe4 100644
--- a/packages/shared_preferences/shared_preferences/pubspec.yaml
+++ b/packages/shared_preferences/shared_preferences/pubspec.yaml
@@ -3,7 +3,7 @@
Wraps NSUserDefaults on iOS and SharedPreferences on Android.
repository: https://github.com/flutter/plugins/tree/master/packages/shared_preferences/shared_preferences
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+shared_preferences%22
-version: 2.0.6
+version: 2.0.7
environment:
sdk: ">=2.12.0 <3.0.0"