Fixed issue validation encryption keys

This commit is contained in:
Juan Gilsanz Polo 2022-10-27 22:29:23 +02:00
parent 121af9caaa
commit fb74be3e69
6 changed files with 132 additions and 11 deletions

View file

@ -5,13 +5,15 @@ import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/widgets/section_label.dart';
import 'package:adguard_home_manager/widgets/custom_switch_list_tile.dart';
import 'package:adguard_home_manager/screens/settings/encryption/config_error_modal.dart';
import 'package:adguard_home_manager/screens/settings/encryption/status.dart';
import 'package:adguard_home_manager/screens/settings/encryption/custom_text_field.dart';
import 'package:adguard_home_manager/screens/settings/encryption/master_switch.dart';
import 'package:adguard_home_manager/screens/settings/encryption/encryption_functions.dart';
import 'package:adguard_home_manager/widgets/custom_switch_list_tile.dart';
import 'package:adguard_home_manager/classes/process_modal.dart';
import 'package:adguard_home_manager/functions/encode_base64.dart';
import 'package:adguard_home_manager/functions/snackbar.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart';
@ -87,6 +89,8 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
String? validDataError;
int dataValidApi = 0;
Map<String, dynamic>? dataValid;
void fetchData({bool? showRefreshIndicator}) async {
setState(() => loadStatus = 0);
@ -141,8 +145,8 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
"port_https": httpsPortController.text != '' ? int.parse(httpsPortController.text) : null,
"port_dns_over_tls": tlsPortController.text != '' ? int.parse(tlsPortController.text) : null,
"port_dns_over_quic": dnsOverQuicPortController.text != '' ? int.parse(dnsOverQuicPortController.text) : null,
"certificate_chain": certificateContentController.text.replaceAll('\n', ''),
"private_key": pastePrivateKeyController.text.replaceAll('\n', ''),
"certificate_chain": encodeBase64(certificateContentController.text),
"private_key": encodeBase64(pastePrivateKeyController.text),
"private_key_saved": usePreviouslySavedKey,
"certificate_path": certificatePathController.text,
"private_key_path": privateKeyPathController.text,
@ -153,6 +157,7 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
if (result['data']['warning_validation'] != null && result['data']['warning_validation'] != '') {
dataValidApi = 2;
validDataError = result['data']['warning_validation'];
dataValid = result['data'];
}
else {
dataValidApi = 1;
@ -422,11 +427,43 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
checkDataValid();
},
label: AppLocalizations.of(context)!.certificateContent,
helperText: AppLocalizations.of(context)!.enterOnlyCertificate,
errorText: certificateContentError,
multiline: true,
keyboardType: TextInputType.multiline,
),
if (dataValid != null) ...[
const SizedBox(height: 20),
if (dataValid!['valid_chain'] != null) ...[
Status(
valid: dataValid!['valid_chain'],
label: dataValid!['valid_chain'] == true
? AppLocalizations.of(context)!.validCertificateChain
: AppLocalizations.of(context)!.invalidCertificateChain,
),
const SizedBox(height: 10),
],
if (dataValid!['subject'] != null) ...[
Status(
valid: true,
label: "${AppLocalizations.of(context)!.subject}: ${dataValid!['subject']}"
),
const SizedBox(height: 10),
],
if (dataValid!['issuer'] != null) ...[
Status(
valid: true,
label: "${AppLocalizations.of(context)!.issuer}: ${dataValid!['issuer']}"
),
const SizedBox(height: 10),
],
if (dataValid!['not_after'] != null) ...[
Status(
valid: true,
label: "${AppLocalizations.of(context)!.expirationDate}: ${dataValid!['not_after']}"
),
const SizedBox(height: 10),
]
],
SectionLabel(label: AppLocalizations.of(context)!.privateKey),
RadioListTile(
value: 0,
@ -491,12 +528,30 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
checkDataValid();
},
label: AppLocalizations.of(context)!.pastePrivateKey,
helperText: AppLocalizations.of(context)!.enterOnlyPrivateKey,
errorText: pastePrivateKeyError,
keyboardType: TextInputType.multiline,
multiline: true,
),
const SizedBox(height: 20),
if (dataValid != null) ...[
if (dataValid!['valid_key'] != null) ...[
Status(
valid: dataValid!['valid_key'],
label: dataValid!['valid_key'] == true
? AppLocalizations.of(context)!.validPrivateKey
: AppLocalizations.of(context)!.invalidPrivateKey,
),
const SizedBox(height: 10)
],
if (dataValid!['valid_pair'] != null && dataValid!['valid_pair'] == false) ...[
Status(
valid: false,
label: AppLocalizations.of(context)!.keysNotMatch,
),
const SizedBox(height: 10)
],
const SizedBox(height: 10)
]
],
);

View file

@ -25,20 +25,20 @@ String? validatePort(BuildContext context, String value) {
String? validateCertificate(BuildContext context, String cert) {
final regExp = RegExp(r'(-{3,}(\bBEGIN CERTIFICATE\b))|(-{3,}-{3,}(\END CERTIFICATE\b)-{3,})', multiLine: true);
if (regExp.hasMatch(cert.replaceAll('\n', ''))) {
return AppLocalizations.of(context)!.invalidCertificate;
return null;
}
else {
return null;
return AppLocalizations.of(context)!.invalidCertificate;
}
}
String? validatePrivateKey(BuildContext context, String cert) {
final regExp = RegExp(r'(-{3,}(\bBEGIN\b).*(PRIVATE KEY\b))|(-{3,}-{3,}(\bEND\b).*(PRIVATE KEY\b)-{3,})', multiLine: true);
if (regExp.hasMatch(cert.replaceAll('\n', ''))) {
return AppLocalizations.of(context)!.invalidPrivateKey;
return null;
}
else {
return null;
return AppLocalizations.of(context)!.invalidPrivateKey;
}
}

View file

@ -0,0 +1,45 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart';
class Status extends StatelessWidget {
final bool valid;
final String label;
const Status({
Key? key,
required this.valid,
required this.label
}) : super(key: key);
@override
Widget build(BuildContext context) {
final appConfigProvider = Provider.of<AppConfigProvider>(context);
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Container(
width: 10,
height: 10,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: valid == true
? appConfigProvider.useThemeColorForStatus == true
? Theme.of(context).primaryColor
: Colors.green
: appConfigProvider.useThemeColorForStatus == true
? Colors.grey
: Colors.red
),
),
const SizedBox(width: 20),
Flexible(child: Text(label))
],
),
);
}
}