mirror of
https://github.com/acamarata/curtain.git
synced 2026-07-01 03:04:25 +00:00
Detection: netstat lives at /usr/sbin/netstat, not /usr/bin — the hardcoded wrong path silently killed the ESTABLISHED-TCP activator (root cause of the failed live test). Fixed and live-verified. Added peered-UDP activator (5900-5902) for High-Performance sessions, per-signal transition logging, unconditional error logging for dead probe helpers, and probe v2 with full CGSession dictionary diffing. 7 new parser tests (32 total). Fixes from a full audit + adversarial review: idle source setting honored (default now Remote session activity), cover scope reduced to a coherent two-mode model with legacy migration (per-display toggle was inverted in onlyMarked and dead in all), curtain test no longer schedules a teardown over a live session, specific-display password box placement gets a real picker, refuse-to-arm enforced, activation notification posts a real banner, menu password gate bypassed when the event tap is dead, shared single-decoder aerial player with stale-task guard and async playability check, password buffer zeroed on successful unlock and Esc, XPC interruption/invalidation handlers, modern Accessibility settings URL, launchPath modernized, codesign failures now abort release.sh, monotonic CFBundleVersion, install.sh temp cleanup, dead armDisarmHotkey setting removed. Refactor: Curtain.swift and PreferencesWindow.swift split into focused files (largest now 479 lines). Wiki, README, and contributing docs updated to match. Build clean at 0 warnings, 32/32 tests pass.
33 lines
1.7 KiB
Swift
33 lines
1.7 KiB
Swift
import SwiftUI
|
|
|
|
/// Purpose: Disconnect tab — privileged-helper toggle and explanatory caption.
|
|
/// Extracted from PreferencesView to keep every tab file under 500 lines.
|
|
/// Inputs: @AppStorage binding for the feature-enabled flag; injected closure that
|
|
/// tells the coordinator to register/unregister the SMAppService daemon.
|
|
/// Outputs: writes to UserDefaults; calls enableDisconnectHelper when the toggle changes.
|
|
/// Constraints: @MainActor (SwiftUI). The helper is off by default; enabling it triggers
|
|
/// a one-time admin authorization prompt via SMAppService.
|
|
/// SPORT: MASTER-PREFS
|
|
struct PrefDisconnectTab: View {
|
|
@AppStorage(Settings.Key.disconnectFeatureEnabled) private var disconnectFeatureEnabled = false
|
|
let enableDisconnectHelper: (Bool) -> Void
|
|
|
|
var body: some View {
|
|
Form {
|
|
Section {
|
|
Toggle("Enable disconnect-remote-on-end (needs a one-time admin approval)", isOn: $disconnectFeatureEnabled)
|
|
.onChange(of: disconnectFeatureEnabled) { enableDisconnectHelper($0) }
|
|
} header: {
|
|
Text("Disconnect helper")
|
|
} footer: {
|
|
VStack(alignment: .leading, spacing: 4) {
|
|
Text("When off, a requested disconnect is logged and skipped rather than calling the privileged helper.")
|
|
.font(.caption).foregroundStyle(.secondary)
|
|
Text("The disconnect action used by unlock, idle, and on-end only fires when this helper is enabled.")
|
|
.font(.caption).foregroundStyle(.secondary)
|
|
}
|
|
}
|
|
}
|
|
.formStyle(.grouped)
|
|
}
|
|
}
|