mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-06-28 20:39:51 +00:00
CW-423 Use SensitiveClipboard for sensitive Stings (#1013)
* CW-423 Use SensitiveClipboard for sensitive Stings * CW-423 Bump Android Target and Min SDK * CW-423 Use Helper function for sensitive Clipboard
This commit is contained in:
parent
cfaa89d165
commit
c68baf7244
8 changed files with 67 additions and 47 deletions
|
@ -45,8 +45,8 @@ android {
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId appProperties['id']
|
applicationId appProperties['id']
|
||||||
minSdkVersion 21
|
minSdkVersion 24
|
||||||
targetSdkVersion 31
|
targetSdkVersion 33
|
||||||
versionCode flutterVersionCode.toInteger()
|
versionCode flutterVersionCode.toInteger()
|
||||||
versionName flutterVersionName
|
versionName flutterVersionName
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
|
@ -1,21 +1,22 @@
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
import 'package:cake_wallet/core/execution_state.dart';
|
||||||
|
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||||
|
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
|
||||||
|
import 'package:cake_wallet/src/widgets/primary_button.dart';
|
||||||
|
import 'package:cake_wallet/src/widgets/trail_button.dart';
|
||||||
|
import 'package:cake_wallet/generated/i18n.dart';
|
||||||
import 'package:cake_wallet/palette.dart';
|
import 'package:cake_wallet/palette.dart';
|
||||||
|
import 'package:cake_wallet/routes.dart';
|
||||||
|
import 'package:cake_wallet/utils/clipboard_util.dart';
|
||||||
import 'package:cake_wallet/utils/exception_handler.dart';
|
import 'package:cake_wallet/utils/exception_handler.dart';
|
||||||
import 'package:cake_wallet/utils/share_util.dart';
|
import 'package:cake_wallet/utils/share_util.dart';
|
||||||
|
import 'package:cake_wallet/utils/show_bar.dart';
|
||||||
|
import 'package:cake_wallet/utils/show_pop_up.dart';
|
||||||
|
import 'package:cake_wallet/view_model/backup_view_model.dart';
|
||||||
import 'package:file_picker/file_picker.dart';
|
import 'package:file_picker/file_picker.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||||
import 'package:cake_wallet/utils/show_bar.dart';
|
|
||||||
import 'package:cake_wallet/routes.dart';
|
|
||||||
import 'package:cake_wallet/generated/i18n.dart';
|
|
||||||
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
|
|
||||||
import 'package:cake_wallet/src/widgets/primary_button.dart';
|
|
||||||
import 'package:cake_wallet/src/widgets/trail_button.dart';
|
|
||||||
import 'package:cake_wallet/utils/show_pop_up.dart';
|
|
||||||
import 'package:cake_wallet/view_model/backup_view_model.dart';
|
|
||||||
import 'package:cake_wallet/core/execution_state.dart';
|
|
||||||
import 'package:cake_wallet/src/screens/base_page.dart';
|
|
||||||
import 'package:permission_handler/permission_handler.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
|
||||||
class BackupPage extends BasePage {
|
class BackupPage extends BasePage {
|
||||||
|
@ -52,7 +53,7 @@ class BackupPage extends BasePage {
|
||||||
child: Observer(
|
child: Observer(
|
||||||
builder: (_) => GestureDetector(
|
builder: (_) => GestureDetector(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Clipboard.setData(
|
ClipboardUtil.setSensitiveDataToClipboard(
|
||||||
ClipboardData(text: backupViewModelBase.backupPassword));
|
ClipboardData(text: backupViewModelBase.backupPassword));
|
||||||
showBar<void>(
|
showBar<void>(
|
||||||
context,
|
context,
|
||||||
|
@ -75,15 +76,14 @@ class BackupPage extends BasePage {
|
||||||
]))),
|
]))),
|
||||||
Positioned(
|
Positioned(
|
||||||
child: Observer(
|
child: Observer(
|
||||||
builder: (_) => LoadingPrimaryButton(
|
builder: (_) => LoadingPrimaryButton(
|
||||||
isLoading: backupViewModelBase.state is IsExecutingState,
|
isLoading: backupViewModelBase.state is IsExecutingState,
|
||||||
onPressed: () => onExportBackup(context),
|
onPressed: () => onExportBackup(context),
|
||||||
text: S.of(context).export_backup,
|
text: S.of(context).export_backup,
|
||||||
color: Theme.of(context)
|
color: Theme.of(context).accentTextTheme.bodyLarge!.color!,
|
||||||
.accentTextTheme!
|
textColor: Colors.white,
|
||||||
.bodyLarge!
|
),
|
||||||
.color!,
|
),
|
||||||
textColor: Colors.white)),
|
|
||||||
bottom: 24,
|
bottom: 24,
|
||||||
left: 24,
|
left: 24,
|
||||||
right: 24,
|
right: 24,
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import 'package:cake_wallet/utils/responsive_layout_util.dart';
|
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||||
import 'package:cw_core/wallet_type.dart';
|
import 'package:cake_wallet/src/widgets/primary_button.dart';
|
||||||
|
import 'package:cake_wallet/generated/i18n.dart';
|
||||||
import 'package:cake_wallet/routes.dart';
|
import 'package:cake_wallet/routes.dart';
|
||||||
import 'package:cake_wallet/themes/theme_base.dart';
|
import 'package:cake_wallet/themes/theme_base.dart';
|
||||||
|
import 'package:cake_wallet/utils/responsive_layout_util.dart';
|
||||||
|
import 'package:cw_core/wallet_type.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:cake_wallet/generated/i18n.dart';
|
|
||||||
import 'package:cake_wallet/src/widgets/primary_button.dart';
|
|
||||||
import 'package:cake_wallet/src/screens/base_page.dart';
|
|
||||||
|
|
||||||
class PreSeedPage extends BasePage {
|
class PreSeedPage extends BasePage {
|
||||||
PreSeedPage(this.type)
|
PreSeedPage(this.type)
|
||||||
|
@ -61,7 +61,7 @@ class PreSeedPage extends BasePage {
|
||||||
onPressed: () =>
|
onPressed: () =>
|
||||||
Navigator.of(context).popAndPushNamed(Routes.seed, arguments: true),
|
Navigator.of(context).popAndPushNamed(Routes.seed, arguments: true),
|
||||||
text: S.of(context).pre_seed_button_text,
|
text: S.of(context).pre_seed_button_text,
|
||||||
color: Theme.of(context).accentTextTheme!.bodyLarge!.color!,
|
color: Theme.of(context).accentTextTheme.bodyLarge!.color!,
|
||||||
textColor: Colors.white)
|
textColor: Colors.white)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import 'package:cake_wallet/palette.dart';
|
import 'package:cake_wallet/palette.dart';
|
||||||
import 'package:cake_wallet/themes/theme_base.dart';
|
import 'package:cake_wallet/themes/theme_base.dart';
|
||||||
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
|
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
|
||||||
|
import 'package:cake_wallet/utils/clipboard_util.dart';
|
||||||
import 'package:cake_wallet/utils/share_util.dart';
|
import 'package:cake_wallet/utils/share_util.dart';
|
||||||
import 'package:cake_wallet/utils/responsive_layout_util.dart';
|
import 'package:cake_wallet/utils/responsive_layout_util.dart';
|
||||||
import 'package:cake_wallet/utils/show_bar.dart';
|
import 'package:cake_wallet/utils/show_bar.dart';
|
||||||
|
@ -92,8 +93,7 @@ class WalletSeedPage extends BasePage {
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
ConstrainedBox(
|
ConstrainedBox(
|
||||||
constraints:
|
constraints: BoxConstraints(maxHeight: MediaQuery.of(context).size.height * 0.3),
|
||||||
BoxConstraints(maxHeight: MediaQuery.of(context).size.height * 0.3),
|
|
||||||
child: AspectRatio(aspectRatio: 1, child: image),
|
child: AspectRatio(aspectRatio: 1, child: image),
|
||||||
),
|
),
|
||||||
Observer(builder: (_) {
|
Observer(builder: (_) {
|
||||||
|
@ -159,7 +159,7 @@ class WalletSeedPage extends BasePage {
|
||||||
child: Builder(
|
child: Builder(
|
||||||
builder: (context) => PrimaryButton(
|
builder: (context) => PrimaryButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
Clipboard.setData(
|
ClipboardUtil.setSensitiveDataToClipboard(
|
||||||
ClipboardData(text: walletSeedViewModel.seed));
|
ClipboardData(text: walletSeedViewModel.seed));
|
||||||
showBar<void>(context, S.of(context).copied_to_clipboard);
|
showBar<void>(context, S.of(context).copied_to_clipboard);
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,16 +1,18 @@
|
||||||
import 'package:cake_wallet/core/totp_request_details.dart';
|
import 'package:cake_wallet/core/totp_request_details.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
import 'package:cake_wallet/generated/i18n.dart';
|
|
||||||
import 'package:cake_wallet/routes.dart';
|
|
||||||
import 'package:cake_wallet/src/screens/base_page.dart';
|
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||||
import 'package:cake_wallet/src/screens/receive/widgets/qr_image.dart';
|
import 'package:cake_wallet/src/screens/receive/widgets/qr_image.dart';
|
||||||
|
import 'package:cake_wallet/src/widgets/primary_button.dart';
|
||||||
|
import 'package:cake_wallet/src/widgets/standard_list.dart';
|
||||||
|
import 'package:cake_wallet/generated/i18n.dart';
|
||||||
|
import 'package:cake_wallet/palette.dart';
|
||||||
|
import 'package:cake_wallet/routes.dart';
|
||||||
|
import 'package:cake_wallet/utils/clipboard_util.dart';
|
||||||
import 'package:cake_wallet/utils/show_bar.dart';
|
import 'package:cake_wallet/utils/show_bar.dart';
|
||||||
import 'package:cake_wallet/view_model/set_up_2fa_viewmodel.dart';
|
import 'package:cake_wallet/view_model/set_up_2fa_viewmodel.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
import 'package:qr_flutter/qr_flutter.dart' as qr;
|
import 'package:qr_flutter/qr_flutter.dart' as qr;
|
||||||
import '../../../palette.dart';
|
|
||||||
import '../../widgets/primary_button.dart';
|
|
||||||
import '../../widgets/standard_list.dart';
|
|
||||||
|
|
||||||
class Setup2FAQRPage extends BasePage {
|
class Setup2FAQRPage extends BasePage {
|
||||||
Setup2FAQRPage({required this.setup2FAViewModel});
|
Setup2FAQRPage({required this.setup2FAViewModel});
|
||||||
|
@ -106,7 +108,8 @@ class Setup2FAQRPage extends BasePage {
|
||||||
height: 32,
|
height: 32,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Clipboard.setData(ClipboardData(text: '${setup2FAViewModel.secretKey}'));
|
ClipboardUtil.setSensitiveDataToClipboard(
|
||||||
|
ClipboardData(text: '${setup2FAViewModel.secretKey}'));
|
||||||
showBar<void>(context, S.of(context).copied_to_clipboard);
|
showBar<void>(context, S.of(context).copied_to_clipboard);
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
|
|
|
@ -1,16 +1,17 @@
|
||||||
import 'package:auto_size_text/auto_size_text.dart';
|
import 'package:auto_size_text/auto_size_text.dart';
|
||||||
import 'package:cake_wallet/entities/qr_view_data.dart';
|
import 'package:cake_wallet/entities/qr_view_data.dart';
|
||||||
|
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||||
|
import 'package:cake_wallet/src/widgets/list_row.dart';
|
||||||
import 'package:cake_wallet/src/widgets/section_divider.dart';
|
import 'package:cake_wallet/src/widgets/section_divider.dart';
|
||||||
|
import 'package:cake_wallet/generated/i18n.dart';
|
||||||
|
import 'package:cake_wallet/routes.dart';
|
||||||
|
import 'package:cake_wallet/utils/clipboard_util.dart';
|
||||||
import 'package:cake_wallet/utils/show_bar.dart';
|
import 'package:cake_wallet/utils/show_bar.dart';
|
||||||
|
import 'package:cake_wallet/view_model/wallet_keys_view_model.dart';
|
||||||
import 'package:device_display_brightness/device_display_brightness.dart';
|
import 'package:device_display_brightness/device_display_brightness.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||||
import 'package:cake_wallet/generated/i18n.dart';
|
|
||||||
import 'package:cake_wallet/src/screens/base_page.dart';
|
|
||||||
import 'package:cake_wallet/src/widgets/list_row.dart';
|
|
||||||
import 'package:cake_wallet/view_model/wallet_keys_view_model.dart';
|
|
||||||
import 'package:cake_wallet/routes.dart';
|
|
||||||
import 'package:qr_flutter/qr_flutter.dart';
|
import 'package:qr_flutter/qr_flutter.dart';
|
||||||
|
|
||||||
class WalletKeysPage extends BasePage {
|
class WalletKeysPage extends BasePage {
|
||||||
|
@ -56,7 +57,7 @@ class WalletKeysPage extends BasePage {
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(12.0),
|
borderRadius: BorderRadius.circular(12.0),
|
||||||
color: Theme.of(context).accentTextTheme!.bodySmall!.color!,
|
color: Theme.of(context).accentTextTheme.bodySmall!.color!,
|
||||||
),
|
),
|
||||||
child: Center(
|
child: Center(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
|
@ -84,7 +85,7 @@ class WalletKeysPage extends BasePage {
|
||||||
separatorBuilder: (context, index) => Container(
|
separatorBuilder: (context, index) => Container(
|
||||||
height: 1,
|
height: 1,
|
||||||
padding: EdgeInsets.only(left: 24),
|
padding: EdgeInsets.only(left: 24),
|
||||||
color: Theme.of(context).accentTextTheme!.titleLarge!.backgroundColor!,
|
color: Theme.of(context).accentTextTheme.titleLarge!.backgroundColor!,
|
||||||
child: const SectionDivider(),
|
child: const SectionDivider(),
|
||||||
),
|
),
|
||||||
itemCount: walletKeysViewModel.items.length,
|
itemCount: walletKeysViewModel.items.length,
|
||||||
|
@ -93,7 +94,7 @@ class WalletKeysPage extends BasePage {
|
||||||
|
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Clipboard.setData(ClipboardData(text: item.value));
|
ClipboardUtil.setSensitiveDataToClipboard(ClipboardData(text: item.value));
|
||||||
showBar<void>(context, S.of(context).copied_key_to_clipboard(item.title));
|
showBar<void>(context, S.of(context).copied_key_to_clipboard(item.title));
|
||||||
},
|
},
|
||||||
child: ListRow(
|
child: ListRow(
|
||||||
|
|
15
lib/utils/clipboard_util.dart
Normal file
15
lib/utils/clipboard_util.dart
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
|
import 'package:cake_wallet/utils/device_info.dart';
|
||||||
|
import 'package:sensitive_clipboard/sensitive_clipboard.dart';
|
||||||
|
|
||||||
|
class ClipboardUtil {
|
||||||
|
static Future<void> setSensitiveDataToClipboard(ClipboardData data) async {
|
||||||
|
if (DeviceInfo.instance.isMobile) {
|
||||||
|
await SensitiveClipboard.copy(data.text);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Clipboard.setData(data);
|
||||||
|
}
|
||||||
|
}
|
|
@ -81,6 +81,7 @@ dependencies:
|
||||||
path_provider_android: 2.0.24
|
path_provider_android: 2.0.24
|
||||||
shared_preferences_android: 2.0.17
|
shared_preferences_android: 2.0.17
|
||||||
url_launcher_android: 6.0.24
|
url_launcher_android: 6.0.24
|
||||||
|
sensitive_clipboard: ^1.0.0
|
||||||
bitcoin_flutter:
|
bitcoin_flutter:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/cake-tech/bitcoin_flutter.git
|
url: https://github.com/cake-tech/bitcoin_flutter.git
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue