修 ultracode 扫描确认的 Quick Send 关窗静默失效 + 设备判本机回落

- Quick Send 关主窗口静默失效(ultracode medium,对抗核验为真):MacQuickSend.trigger 只写 pending,而观察 pending 弹发送表单的逻辑全挂在 MacRootView——后台 / 菜单栏常驻(关主窗口、隐藏 Dock)时 MacRootView 未挂载,选完文件无表单、零反馈,正是 Quick Send 的首要场景。修:MacQuickSend 改为自持独立 NSWindow(NSHostingController 托 MacComposeSheet)呈现发送面板,不依赖主窗口——关窗 / 隐藏 Dock 态下热键 ⌃⌥⌘S 与菜单栏「快速发送文件…」均正常。MacRootView 移除 pending 的 onChange + sheet(不再需要)
- 设备判本机回落(ultracode 核验 real=false,Mac 上不可达;作防御性对齐 iOS):MacDevicesView.others 由只比 deviceID != selfDeviceID 改为 isSelf——selfDeviceID 非空按 device_id 判、缺失回落按设备名(对齐 iOS isSelf),防边角态下本机误入「其他设备」列表被右键「移除」而吊销自身会话
- 未改:Keychain ad-hoc 重编后 ACL 失效(ultracode low)——纯本地开发内环摩擦(改一行重编即换 cdhash),Phase 6 Developer ID 稳定签名后自消,对最终用户零影响、无安全/正确性后果
- 扫描结论:6 维度里剪贴板安全 / iOS 回归 / 共享 JS 变更 / 后台生命周期 四项 finder 零发现(对抗核验通过);仅 mac-features + auth-build-config 各出一条,核验为真 2 条(本次修 1 + 防御 1)、驳回 1
- 验证:just mac-build(CommilitiaDropMac.app)BUILD SUCCEEDED;iOS 无关(仅改 macOS-only 文件)
This commit is contained in:
2026-07-11 12:49:42 +08:00
parent 34f0db215c
commit f7b0f04c9c
2 changed files with 60 additions and 33 deletions
+11 -19
View File
@@ -10,7 +10,6 @@ struct MacRootView: View
{
@Environment(EngineController.self) private var engine
@Environment(AuthManager.self) private var auth
@State private var quickSend = MacQuickSend.shared
@State private var selection: MacSection = .transfers
var body: some View
@@ -51,23 +50,7 @@ struct MacRootView: View
{
NoticeOverlay()
}
// Quick Send /
.onChange(of: quickSend.pending)
{ _, urls in
if !urls.isEmpty { selection = .transfers }
}
.sheet(isPresented: Binding(get: { !quickSend.pending.isEmpty },
set: { if !$0 { quickSend.pending = [] } }))
{
MacComposeSheet(urls: quickSend.pending,
onCancel: { quickSend.pending = [] },
onSend:
{ device in
for url in quickSend.pending { engine.sendFile(to: device, fileURL: url) }
quickSend.pending = []
})
.environment(engine)
}
// Quick Send / MacQuickSend
}
@ViewBuilder
@@ -155,7 +138,16 @@ struct MacDevicesView: View
private var others: [DeviceItem]
{
engine.devices.filter { $0.deviceID != engine.selfDeviceID }
engine.devices.filter { !isSelf($0) }
}
// device_idselfDeviceID iOS isSelf
//
private func isSelf(_ dev: DeviceItem) -> Bool
{
let selfID = engine.selfDeviceID
if !selfID.isEmpty, !dev.deviceID.isEmpty { return dev.deviceID == selfID }
return dev.name == engine.deviceName
}
var body: some View