Files
GitJournal/packages/git_setup/lib/key_editors.dart
2023-02-09 16:00:29 +01:00

142 lines
3.6 KiB
Dart

/*
* SPDX-FileCopyrightText: 2019-2021 Vishesh Handa <me@vhanda.in>
*
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import 'dart:convert';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:gitjournal/l10n.dart';
import 'package:gitjournal/logger/logger.dart';
import 'package:universal_io/io.dart' as io;
class PublicKeyEditor extends StatelessWidget {
final Key formKey;
final TextEditingController _controller;
const PublicKeyEditor(this.formKey, this._controller);
@override
Widget build(BuildContext context) {
return KeyEditor(formKey, _controller, _validator);
}
String? _validator(BuildContext context, String? val) {
if (val == null) {
return null;
}
val = val.trim();
if (!val.startsWith("ssh-")) {
return context.loc.setupKeyEditorsPublic;
}
return null;
}
}
class PrivateKeyEditor extends StatelessWidget {
final Key formKey;
final TextEditingController _controller;
const PrivateKeyEditor(this.formKey, this._controller);
@override
Widget build(BuildContext context) {
return KeyEditor(formKey, _controller, _validator);
}
String? _validator(BuildContext context, String? val) {
if (val == null) {
return null;
}
val = val.trim();
if (!val.startsWith("-----BEGIN ")) {
return context.loc.setupKeyEditorsPrivate;
}
if (!val.endsWith("PRIVATE KEY-----")) {
return context.loc.setupKeyEditorsPrivate;
}
return null;
}
}
class KeyEditor extends StatelessWidget {
final Key formKey;
final TextEditingController textEditingController;
final String? Function(BuildContext, String?) validator;
const KeyEditor(this.formKey, this.textEditingController, this.validator);
@override
Widget build(BuildContext context) {
var inputField = Form(
key: formKey,
child: TextFormField(
textAlign: TextAlign.left,
maxLines: null,
style: Theme.of(context).textTheme.bodyMedium,
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: (s) => validator(context, s),
controller: textEditingController,
decoration: const InputDecoration(
border: OutlineInputBorder(),
isDense: true,
),
),
autovalidateMode: AutovalidateMode.onUserInteraction,
);
var screenSize = MediaQuery.of(context).size;
return Column(
children: [
Container(
constraints: BoxConstraints(
maxHeight: screenSize.height / 4,
),
child: SingleChildScrollView(
child: Container(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: inputField,
),
),
),
OutlinedButton(
child: Text(
context.loc.setupKeyEditorsLoad,
style: Theme.of(context).textTheme.bodyMedium,
),
onPressed: _pickAndLoadFile,
),
],
);
}
Future<void> _pickAndLoadFile() async {
var result = await FilePicker.platform.pickFiles();
try {
if (result != null && result.files.isNotEmpty) {
var pf = result.files.single;
if (pf.bytes != null) {
textEditingController.text = utf8.decode(pf.bytes!);
} else {
var file = io.File(result.files.single.path!);
var data = await file.readAsString();
textEditingController.text = data.trim();
}
}
} catch (e, stackTrace) {
Log.e(
"Open File for importing SSH Key",
ex: e,
stacktrace: stackTrace,
);
}
}
}