Support Apple Remote Desktop auth via account username+password
RoyalVNCKit prioritizes .diffieHellman (ARD) over .vnc during handshake when both are offered. My delegate adapter was passing an empty username to VNCUsernamePasswordCredential, so any Mac with user-account screen sharing enabled rejected the credential before .vnc fallback could happen. Fix: persist a username on SavedConnection and pipe it through to the credential callback. Leave blank to use the VNC-only password path. AddConnection footer now explains the two Mac paths: • User account (ARD) — macOS short name + full account password • VNC-only password — blank username + ≤8 char password Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -28,6 +28,7 @@ public final class SessionController {
|
||||
public let displayName: String
|
||||
public let host: String
|
||||
public let port: Int
|
||||
public let username: String
|
||||
|
||||
private let keychainTag: String
|
||||
private let passwordProvider: any PasswordProviding
|
||||
@@ -47,6 +48,7 @@ public final class SessionController {
|
||||
displayName: String,
|
||||
host: String,
|
||||
port: Int,
|
||||
username: String = "",
|
||||
keychainTag: String,
|
||||
viewOnly: Bool = false,
|
||||
clipboardSyncEnabled: Bool = true,
|
||||
@@ -59,6 +61,7 @@ public final class SessionController {
|
||||
self.displayName = displayName
|
||||
self.host = host
|
||||
self.port = port
|
||||
self.username = username
|
||||
self.keychainTag = keychainTag
|
||||
self.viewOnly = viewOnly
|
||||
self.clipboardSyncEnabled = clipboardSyncEnabled
|
||||
@@ -78,6 +81,7 @@ public final class SessionController {
|
||||
displayName: saved.displayName,
|
||||
host: saved.host,
|
||||
port: saved.port,
|
||||
username: saved.username,
|
||||
keychainTag: saved.keychainTag,
|
||||
viewOnly: saved.viewOnly,
|
||||
clipboardSyncEnabled: saved.clipboardSyncEnabled,
|
||||
@@ -302,7 +306,8 @@ public final class SessionController {
|
||||
let adapter = DelegateAdapter(
|
||||
controller: self,
|
||||
passwordProvider: passwordProvider,
|
||||
keychainTag: keychainTag
|
||||
keychainTag: keychainTag,
|
||||
username: username
|
||||
)
|
||||
connection.delegate = adapter
|
||||
self.connection = connection
|
||||
@@ -366,13 +371,16 @@ private final class DelegateAdapter: NSObject, VNCConnectionDelegate, @unchecked
|
||||
weak var controller: SessionController?
|
||||
let passwordProvider: any PasswordProviding
|
||||
let keychainTag: String
|
||||
let username: String
|
||||
|
||||
init(controller: SessionController,
|
||||
passwordProvider: any PasswordProviding,
|
||||
keychainTag: String) {
|
||||
keychainTag: String,
|
||||
username: String) {
|
||||
self.controller = controller
|
||||
self.passwordProvider = passwordProvider
|
||||
self.keychainTag = keychainTag
|
||||
self.username = username
|
||||
}
|
||||
|
||||
func connection(_ connection: VNCConnection,
|
||||
@@ -398,7 +406,7 @@ private final class DelegateAdapter: NSObject, VNCConnectionDelegate, @unchecked
|
||||
case .vnc:
|
||||
credential = VNCPasswordCredential(password: pwd)
|
||||
case .appleRemoteDesktop, .ultraVNCMSLogonII:
|
||||
credential = VNCUsernamePasswordCredential(username: "", password: pwd)
|
||||
credential = VNCUsernamePasswordCredential(username: username, password: pwd)
|
||||
@unknown default:
|
||||
credential = VNCPasswordCredential(password: pwd)
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ public final class SavedConnection {
|
||||
public var displayName: String
|
||||
public var host: String
|
||||
public var port: Int
|
||||
public var username: String
|
||||
public var colorTagRaw: String
|
||||
public var lastConnectedAt: Date?
|
||||
public var preferredEncodings: [String]
|
||||
@@ -23,6 +24,7 @@ public final class SavedConnection {
|
||||
displayName: String,
|
||||
host: String,
|
||||
port: Int = 5900,
|
||||
username: String = "",
|
||||
colorTag: ColorTag = .blue,
|
||||
preferredEncodings: [String] = ["7", "16", "5", "6"],
|
||||
keychainTag: String = UUID().uuidString,
|
||||
@@ -37,6 +39,7 @@ public final class SavedConnection {
|
||||
self.displayName = displayName
|
||||
self.host = host
|
||||
self.port = port
|
||||
self.username = username
|
||||
self.colorTagRaw = colorTag.rawValue
|
||||
self.lastConnectedAt = nil
|
||||
self.preferredEncodings = preferredEncodings
|
||||
|
||||
Reference in New Issue
Block a user