mirror of
https://github.com/acamarata/curtain.git
synced 2026-06-30 18:54: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.
55 lines
2.3 KiB
Swift
55 lines
2.3 KiB
Swift
import SwiftUI
|
|
|
|
/// Purpose: Advanced tab — diagnostics toggle, re-open onboarding, settings export /
|
|
/// import / reset, and version footer.
|
|
/// Extracted from PreferencesView to keep every tab file under 500 lines.
|
|
/// Inputs: @AppStorage for diagnostics; injected closures for the three settings-file
|
|
/// actions and the onboarding re-open; a Binding for hasPassword so Reset can
|
|
/// refresh it without coupling to the parent's @State directly.
|
|
/// Outputs: writes to UserDefaults (via the closures); no direct coordinator calls.
|
|
/// Constraints: @MainActor (SwiftUI). Reset/Export/Import are defined in the parent
|
|
/// PreferencesView and passed in as closures so the exportableKeys list stays
|
|
/// in one place.
|
|
/// SPORT: MASTER-PREFS
|
|
struct PrefAdvancedTab: View {
|
|
@AppStorage(Settings.Key.diagnosticsLoggingEnabled) private var diagnosticsLogging = false
|
|
|
|
let openOnboarding: () -> Void
|
|
let exportSettings: () -> Void
|
|
let importSettings: () -> Void
|
|
let resetToDefaults: () -> Void
|
|
|
|
var body: some View {
|
|
Form {
|
|
Section("Diagnostics") {
|
|
Toggle("Enable diagnostics logging", isOn: $diagnosticsLogging)
|
|
}
|
|
Section("Setup") {
|
|
Button("Open Setup…", action: openOnboarding)
|
|
}
|
|
Section("Settings file") {
|
|
HStack {
|
|
Button("Export…", action: exportSettings)
|
|
Button("Import…", action: importSettings)
|
|
}
|
|
Button("Reset to Defaults", role: .destructive, action: resetToDefaults)
|
|
}
|
|
Section {
|
|
HStack(spacing: 10) {
|
|
Image(nsImage: CurtainIcon.appIcon(size: 28))
|
|
.resizable().frame(width: 28, height: 28)
|
|
VStack(alignment: .leading, spacing: 1) {
|
|
Text("Curtain \(appVersion)").font(.callout).bold()
|
|
Text("Privacy for macOS Screen Sharing")
|
|
.font(.caption).foregroundStyle(.secondary)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.formStyle(.grouped)
|
|
}
|
|
|
|
private var appVersion: String {
|
|
Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "1.0.0"
|
|
}
|
|
}
|