private let backingStore: NSMutableAttributedString
private(set) var hasError = false
+ private(set) var privateKeyString: String?
override init() {
backingStore = NSMutableAttributedString(string: "")
func highlightSyntax() {
hasError = false
+ privateKeyString = nil
backingStore.beginEditing()
var spans = highlight_config(backingStore.string.cString(using: String.Encoding.utf8))!
hasError = true
}
+ if span.type == HighlightPrivateKey {
+ privateKeyString = backingStore.attributedSubstring(from: NSRange(location: span.start, length: span.len)).string
+ }
+
spans = spans.successor()
}
backingStore.endEditing()
private let confTextStorage = ConfTextStorage()
var hasError: Bool { return confTextStorage.hasError }
+ @objc dynamic var privateKeyString: String?
override var string: String {
didSet {
func textDidChange(_ notification: Notification) {
confTextStorage.highlightSyntax()
+ if privateKeyString != confTextStorage.privateKeyString {
+ privateKeyString = confTextStorage.privateKeyString
+ }
needsDisplay = true
}
return publicKeyRow
}()
- let textView: NSTextView = {
+ let textView: ConfTextView = {
let textView = ConfTextView()
let minWidth: CGFloat = 120
let minHeight: CGFloat = 60
let tunnelsManager: TunnelsManager
let tunnel: TunnelContainer?
+ var textViewObservationToken: AnyObject?
+
init(tunnelsManager: TunnelsManager, tunnel: TunnelContainer?) {
self.tunnelsManager = tunnelsManager
self.tunnel = tunnel
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