mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-06-11 01:44:50 +08:00
113 lines
2.8 KiB
Bash
113 lines
2.8 KiB
Bash
#!/bin/bash
|
|
set -e
|
|
|
|
APP_IDENTIFIER="cn.crossdesk.app"
|
|
|
|
# Keep known historical identifiers here. tccutil only resets identifiers that
|
|
# Launch Services can currently resolve, so path/db cleanup below remains a
|
|
# best-effort fallback for stale entries from unsigned or removed builds.
|
|
BUNDLE_IDENTIFIERS=(
|
|
"cn.crossdesk.app"
|
|
"cn.crossdesk.CrossDesk"
|
|
"com.crossdesk.app"
|
|
"com.crossdesk.CrossDesk"
|
|
"com.kunkundi.crossdesk"
|
|
"com.kunkundi.CrossDesk"
|
|
)
|
|
|
|
TCC_SERVICES=(
|
|
"ScreenCapture"
|
|
"Accessibility"
|
|
"Microphone"
|
|
"AudioCapture"
|
|
)
|
|
|
|
run_tccutil() {
|
|
local user_name="$1"
|
|
local user_id="$2"
|
|
local service="$3"
|
|
local bundle_id="$4"
|
|
|
|
if [ -n "$user_name" ] && [ -n "$user_id" ]; then
|
|
/bin/launchctl asuser "$user_id" \
|
|
/usr/bin/sudo -u "$user_name" \
|
|
/usr/bin/tccutil reset "$service" "$bundle_id" >/dev/null 2>&1
|
|
else
|
|
/usr/bin/tccutil reset "$service" "$bundle_id" >/dev/null 2>&1
|
|
fi
|
|
}
|
|
|
|
reset_bundle_tcc() {
|
|
local user_name="$1"
|
|
local user_id="$2"
|
|
local bundle_id
|
|
local service
|
|
|
|
for bundle_id in "${BUNDLE_IDENTIFIERS[@]}"; do
|
|
if run_tccutil "$user_name" "$user_id" "All" "$bundle_id"; then
|
|
continue
|
|
fi
|
|
|
|
for service in "${TCC_SERVICES[@]}"; do
|
|
run_tccutil "$user_name" "$user_id" "$service" "$bundle_id" || true
|
|
done
|
|
done
|
|
}
|
|
|
|
cleanup_tcc_db() {
|
|
local db_path="$1"
|
|
|
|
if [ ! -f "$db_path" ] || ! command -v sqlite3 >/dev/null 2>&1; then
|
|
return
|
|
fi
|
|
|
|
/usr/bin/sqlite3 "$db_path" <<'SQL' >/dev/null 2>&1 || true
|
|
DELETE FROM access
|
|
WHERE service IN (
|
|
'kTCCServiceScreenCapture',
|
|
'kTCCServiceAccessibility',
|
|
'kTCCServiceMicrophone',
|
|
'kTCCServiceAudioCapture'
|
|
)
|
|
AND (
|
|
client IN (
|
|
'cn.crossdesk.app',
|
|
'cn.crossdesk.CrossDesk',
|
|
'com.crossdesk.app',
|
|
'com.crossdesk.CrossDesk',
|
|
'com.kunkundi.crossdesk',
|
|
'com.kunkundi.CrossDesk'
|
|
)
|
|
OR lower(client) LIKE '%crossdesk%'
|
|
);
|
|
SQL
|
|
}
|
|
|
|
cleanup_user_tcc_db() {
|
|
local user_name="$1"
|
|
local home_dir
|
|
|
|
home_dir=$(/usr/bin/dscl . -read "/Users/${user_name}" NFSHomeDirectory 2>/dev/null |
|
|
/usr/bin/awk '{print $2}')
|
|
if [ -z "$home_dir" ]; then
|
|
return
|
|
fi
|
|
|
|
cleanup_tcc_db "${home_dir}/Library/Application Support/com.apple.TCC/TCC.db"
|
|
}
|
|
|
|
CONSOLE_USER=$(/usr/bin/stat -f "%Su" /dev/console 2>/dev/null || true)
|
|
if [ -n "$CONSOLE_USER" ] &&
|
|
[ "$CONSOLE_USER" != "root" ] &&
|
|
[ "$CONSOLE_USER" != "loginwindow" ]; then
|
|
CONSOLE_UID=$(/usr/bin/id -u "$CONSOLE_USER" 2>/dev/null || true)
|
|
reset_bundle_tcc "$CONSOLE_USER" "$CONSOLE_UID"
|
|
cleanup_user_tcc_db "$CONSOLE_USER"
|
|
fi
|
|
|
|
# Also clear any system/root-scoped decisions as a harmless fallback.
|
|
reset_bundle_tcc "" ""
|
|
cleanup_tcc_db "/Library/Application Support/com.apple.TCC/TCC.db"
|
|
|
|
exit 0
|