Tunnel creation: Compute public key from private key as the text is being edited
Signed-off-by: Roopesh Chander <roop@roopc.net>
This commit is contained in:
@@ -27,6 +27,8 @@ class TunnelViewModel {
|
|||||||
case deletePeer = "Delete peer"
|
case deletePeer = "Delete peer"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static let keyLengthInBase64 = 44
|
||||||
|
|
||||||
class InterfaceData {
|
class InterfaceData {
|
||||||
var scratchpad: [InterfaceField: String] = [:]
|
var scratchpad: [InterfaceField: String] = [:]
|
||||||
var fieldsWithError: Set<InterfaceField> = []
|
var fieldsWithError: Set<InterfaceField> = []
|
||||||
@@ -53,6 +55,16 @@ class TunnelViewModel {
|
|||||||
} else {
|
} else {
|
||||||
scratchpad[field] = stringValue
|
scratchpad[field] = stringValue
|
||||||
}
|
}
|
||||||
|
if (field == .privateKey) {
|
||||||
|
if (stringValue.count == TunnelViewModel.keyLengthInBase64),
|
||||||
|
let privateKey = Data(base64Encoded: stringValue),
|
||||||
|
privateKey.count == 32 {
|
||||||
|
let publicKey = Curve25519.generatePublicKey(fromPrivateKey: privateKey)
|
||||||
|
scratchpad[.publicKey] = publicKey.base64EncodedString()
|
||||||
|
} else {
|
||||||
|
scratchpad.removeValue(forKey: .publicKey)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -160,6 +160,17 @@ extension TunnelEditTableViewController {
|
|||||||
cell.onValueChanged = { [weak interfaceData] value in
|
cell.onValueChanged = { [weak interfaceData] value in
|
||||||
interfaceData?[field] = value
|
interfaceData?[field] = value
|
||||||
}
|
}
|
||||||
|
// Compute public key live
|
||||||
|
if (field == .privateKey) {
|
||||||
|
cell.onValueBeingEdited = { [weak self, weak interfaceData] value in
|
||||||
|
if let interfaceData = interfaceData, let s = self {
|
||||||
|
interfaceData[.privateKey] = value
|
||||||
|
if let row = s.interfaceFieldsBySection[section].firstIndex(of: .publicKey) {
|
||||||
|
s.tableView.reloadRows(at: [IndexPath(row: row, section: section)], with: .none)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return cell
|
return cell
|
||||||
}
|
}
|
||||||
} else if ((numberOfPeers > 0) && (section < (numberOfInterfaceSections + numberOfPeers * numberOfPeerSections))) {
|
} else if ((numberOfPeers > 0) && (section < (numberOfInterfaceSections + numberOfPeers * numberOfPeerSections))) {
|
||||||
@@ -289,6 +300,7 @@ class TunnelsEditTableViewKeyValueCell: UITableViewCell {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var onValueChanged: ((String) -> Void)? = nil
|
var onValueChanged: ((String) -> Void)? = nil
|
||||||
|
var onValueBeingEdited: ((String) -> Void)? = nil
|
||||||
|
|
||||||
let keyLabel: UILabel
|
let keyLabel: UILabel
|
||||||
let valueTextField: UITextField
|
let valueTextField: UITextField
|
||||||
@@ -352,6 +364,13 @@ extension TunnelsEditTableViewKeyValueCell: UITextFieldDelegate {
|
|||||||
onValueChanged(textField.text ?? "")
|
onValueChanged(textField.text ?? "")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
|
||||||
|
if let onValueBeingEdited = onValueBeingEdited {
|
||||||
|
let modifiedText = ((textField.text ?? "") as NSString).replacingCharacters(in: range, with: string)
|
||||||
|
onValueBeingEdited(modifiedText)
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class TunnelsEditTableViewButtonCell: UITableViewCell {
|
class TunnelsEditTableViewButtonCell: UITableViewCell {
|
||||||
|
|||||||
Reference in New Issue
Block a user