mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-08-23 17:13:54 +08:00
138 lines
3.4 KiB
Dart
138 lines
3.4 KiB
Dart
/*
|
|
* SPDX-FileCopyrightText: 2019-2021 Vishesh Handa <me@vhanda.in>
|
|
*
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:easy_localization/easy_localization.dart';
|
|
import 'package:file_picker/file_picker.dart';
|
|
import 'package:gitjournal/logger/logger.dart';
|
|
import 'package:universal_io/io.dart';
|
|
|
|
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(String? val) {
|
|
if (val == null) {
|
|
return null;
|
|
}
|
|
|
|
val = val.trim();
|
|
if (!val.startsWith("ssh-")) {
|
|
return tr("setup.keyEditors.public");
|
|
}
|
|
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(String? val) {
|
|
if (val == null) {
|
|
return null;
|
|
}
|
|
|
|
val = val.trim();
|
|
if (!val.startsWith("-----BEGIN ")) {
|
|
return tr("setup.keyEditors.private");
|
|
}
|
|
if (!val.endsWith("PRIVATE KEY-----")) {
|
|
return tr("setup.keyEditors.private");
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
class KeyEditor extends StatelessWidget {
|
|
final Key formKey;
|
|
final TextEditingController textEditingController;
|
|
final String? Function(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.bodyText2,
|
|
autovalidateMode: AutovalidateMode.onUserInteraction,
|
|
validator: validator,
|
|
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(
|
|
tr("setup.keyEditors.load"),
|
|
style: Theme.of(context).textTheme.bodyText2,
|
|
),
|
|
onPressed: _pickAndLoadFile,
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
Future<void> _pickAndLoadFile() async {
|
|
var result = await FilePicker.platform.pickFiles();
|
|
|
|
if (result != null &&
|
|
result.files.isNotEmpty &&
|
|
result.files.single.path != null) {
|
|
var file = File(result.files.single.path!);
|
|
try {
|
|
var data = await file.readAsString();
|
|
textEditingController.text = data.trim();
|
|
} catch (e, stackTrace) {
|
|
Log.e(
|
|
"Open File for importing SSH Key",
|
|
ex: e,
|
|
stacktrace: stackTrace,
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|