]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
macOS: Edit view: Update public key as you edit
authorRoopesh Chander <roop@roopc.net>
Tue, 8 Jan 2019 19:11:36 +0000 (00:41 +0530)
committerRoopesh Chander <roop@roopc.net>
Mon, 14 Jan 2019 09:22:35 +0000 (14:52 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/UI/macOS/View/ConfTextStorage.swift
WireGuard/WireGuard/UI/macOS/View/ConfTextView.swift
WireGuard/WireGuard/UI/macOS/ViewController/TunnelEditViewController.swift

index 2a9d36d1993baed9bcd33fab0fd11dd685d7b1f7..75c18298038047a762118f9fbe7fb562a32fc305 100644 (file)
@@ -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()
index cd91b01e666e2b9f5b8016ee2793db2fc82d273e..eda5ee9641091259b2c7b0b88deeeda236ffd2d0 100644 (file)
@@ -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
     }
 
index 81437876e75a91a2ae7796d6ba917efe81eab64d..d8dbbd20721e1e05d73ba54845d6664d9311b43c 100644 (file)
@@ -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