macOS: Edit view: Update public key as you edit
Signed-off-by: Roopesh Chander <roop@roopc.net>
This commit is contained in:
parent
bbeb732ef3
commit
80977b95de
|
@ -27,6 +27,7 @@ class ConfTextStorage: NSTextStorage {
|
|||
|
||||
private let backingStore: NSMutableAttributedString
|
||||
private(set) var hasError = false
|
||||
private(set) var privateKeyString: String?
|
||||
|
||||
override init() {
|
||||
backingStore = NSMutableAttributedString(string: "")
|
||||
|
@ -129,6 +130,7 @@ class ConfTextStorage: NSTextStorage {
|
|||
|
||||
func highlightSyntax() {
|
||||
hasError = false
|
||||
privateKeyString = nil
|
||||
|
||||
backingStore.beginEditing()
|
||||
var spans = highlight_config(backingStore.string.cString(using: String.Encoding.utf8))!
|
||||
|
@ -143,6 +145,10 @@ class ConfTextStorage: NSTextStorage {
|
|||
hasError = true
|
||||
}
|
||||
|
||||
if span.type == HighlightPrivateKey {
|
||||
privateKeyString = backingStore.attributedSubstring(from: NSRange(location: span.start, length: span.len)).string
|
||||
}
|
||||
|
||||
spans = spans.successor()
|
||||
}
|
||||
backingStore.endEditing()
|
||||
|
|
|
@ -8,6 +8,7 @@ class ConfTextView: NSTextView {
|
|||
private let confTextStorage = ConfTextStorage()
|
||||
|
||||
var hasError: Bool { return confTextStorage.hasError }
|
||||
@objc dynamic var privateKeyString: String?
|
||||
|
||||
override var string: String {
|
||||
didSet {
|
||||
|
@ -51,6 +52,9 @@ extension ConfTextView: NSTextViewDelegate {
|
|||
|
||||
func textDidChange(_ notification: Notification) {
|
||||
confTextStorage.highlightSyntax()
|
||||
if privateKeyString != confTextStorage.privateKeyString {
|
||||
privateKeyString = confTextStorage.privateKeyString
|
||||
}
|
||||
needsDisplay = true
|
||||
}
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ class TunnelEditViewController: NSViewController {
|
|||
return publicKeyRow
|
||||
}()
|
||||
|
||||
let textView: NSTextView = {
|
||||
let textView: ConfTextView = {
|
||||
let textView = ConfTextView()
|
||||
let minWidth: CGFloat = 120
|
||||
let minHeight: CGFloat = 60
|
||||
|
@ -62,6 +62,8 @@ class TunnelEditViewController: NSViewController {
|
|||
let tunnelsManager: TunnelsManager
|
||||
let tunnel: TunnelContainer?
|
||||
|
||||
var textViewObservationToken: AnyObject?
|
||||
|
||||
init(tunnelsManager: TunnelsManager, tunnel: TunnelContainer?) {
|
||||
self.tunnelsManager = tunnelsManager
|
||||
self.tunnel = tunnel
|
||||
|
@ -75,8 +77,19 @@ class TunnelEditViewController: NSViewController {
|
|||
override func loadView() {
|
||||
if let tunnel = tunnel, let tunnelConfiguration = tunnel.tunnelConfiguration {
|
||||
nameRow.value = tunnel.name
|
||||
publicKeyRow.value = tunnelConfiguration.interface.publicKey.base64EncodedString()
|
||||
textView.string = tunnelConfiguration.asWgQuickConfig()
|
||||
publicKeyRow.value = tunnelConfiguration.interface.publicKey.base64EncodedString()
|
||||
textView.privateKeyString = tunnelConfiguration.interface.privateKey.base64EncodedString()
|
||||
textViewObservationToken = textView.observe(\.privateKeyString) { [weak publicKeyRow] textView, _ in
|
||||
if let privateKeyString = textView.privateKeyString,
|
||||
let privateKey = Data(base64Encoded: privateKeyString),
|
||||
privateKey.count == TunnelConfiguration.keyLength {
|
||||
let publicKey = Curve25519.generatePublicKey(fromPrivateKey: privateKey)
|
||||
publicKeyRow?.value = publicKey.base64EncodedString()
|
||||
} else {
|
||||
publicKeyRow?.value = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
scrollView.documentView = textView
|
||||
|
|
Loading…
Reference in New Issue