Alternar contraseña de protector de pantalla con script

Estoy usando una aplicación bastante antigua llamada Proximity para activar AppleScripts cuando mi teléfono entra y sale del rango de Bluetooth de mi Mac. Junto con otras tareas, quiero proteger mi computadora portátil cuando el teléfono está fuera de alcance (habilitar el protector de pantalla y la contraseña), luego deshabilitar el requisito de contraseña cuando mi teléfono vuelve a estar dentro del alcance.

Antes de 10.9

Tenía esto funcionando (principalmente) en OS 10.8 y versiones anteriores. Cuando mi teléfono estaba fuera de alcance, podía ejecutar:

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 1"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

tell application "System Events"
    set ss to screen saver "Soundstream"
    start ss
end tell

Es notifyScreensaverun programa compilado en C que hace que el protector de pantalla vuelva a leer las preferencias de requisitos de contraseña (de esta publicación del foro ).

Esto habilitaría el requisito de una contraseña y luego ejecutaría inmediatamente el protector de pantalla. Este era el comportamiento correcto si mi computadora portátil estaba en un entorno público. Sin embargo, cuando estaba en casa, no quería tener que escribir la contraseña cada vez que salía de la habitación y regresaba un minuto después. Entonces agregando otra capa de complejidad:

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 1"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

set ssid to getWifiSSID()
if ssid is equal to "RouterName" then
    (* if at home, only enable password requirement without triggering screensaver *)
else
    (* if not at home, lock screen immediately *)
    tell application "System Events"
        set ss to screen saver "Soundstream"
        start ss
    end tell
end if

on getWifiSSID()
    set theWiFi to do shell script "wifi=`/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | awk '/ SSID/ {print substr($0, index($0, $2))}'`
echo $wifi
"
    return theWiFi
end getWifiSSID

Usando esto, cuando estoy en casa, solo necesito escribir mi contraseña si mi teléfono está fuera de alcance Y si mi computadora ha estado inactiva durante el tiempo suficiente para activar el tiempo de espera del protector de pantalla (~ 20 minutos).

Cuando mi teléfono volviera a estar dentro del alcance, ejecutaría:

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 0"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

Si el protector de pantalla ya se estaba ejecutando, aún sería necesario escribir la contraseña para desbloquear la computadora, pero la contraseña no sería necesaria si el protector de pantalla se iniciara nuevamente más tarde.

Hubo un pequeño problema aquí: ocasionalmente (creo que cuando no hubo ninguna entrada del usuario entre el momento en que se ejecutó el script fuera de rango y el script dentro del rango, y el protector de pantalla se había habilitado), la pantalla simplemente ser completamente negro en lugar de mostrar la solicitud de contraseña para desbloquear la computadora. Sin embargo, en este caso podría tabular en el campo de contraseña y escribir la contraseña a ciegas para desbloquear la computadora.

En 10.9

El cambio más significativo que he encontrado en 10.9 ocurre cuando la contraseña y el protector de pantalla están habilitados y luego la contraseña está deshabilitada, sin ninguna entrada de usuario en el medio. Cuando vuelvo a desbloquear la computadora, el protector de pantalla no requiere una contraseña e inmediatamente regresa al escritorio. Sin embargo, el teclado todavía está atrapado por el protector de pantalla: puedo interactuar con los programas con el mouse, pero cualquier pulsación de tecla solo provoca un sonido de alerta de advertencia ("Funk" de las alertas estándar).

Un ejemplo mínimo que provoca este comportamiento es:

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 1"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

tell application "System Events"
    set ss to screen saver "Soundstream"
    start ss
end tell

delay 5

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 0"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

La forma principal que encontré para salir de este estado semibloqueado es volver a habilitar el requisito de contraseña y volver a ejecutar el protector de pantalla, y luego ingresar la contraseña manualmente.

El comportamiento más ideal (en mi opinión) sería bloquear mi computadora tan pronto como mi teléfono esté fuera de alcance, luego desbloquearla automáticamente (sin necesidad de escribir una contraseña) cuando mi teléfono vuelva a estar dentro del alcance. Sin embargo, desde versiones anteriores del sistema operativo, he estado trabajando bajo la suposición de que se requiere la entrada del usuario para desbloquear la computadora después de que se hayan activado los requisitos del protector de pantalla y la contraseña. Con esta restricción, el comportamiento deseado es simplemente restaurar la funcionalidad que estaba presente antes de 10.9: poder escribir la contraseña para desbloquear la computadora cuando vuelva a estar dentro del alcance, pero no solicitar una contraseña nuevamente hasta que el teléfono esté fuera del alcance.

¿Alguna sugerencia sobre cómo lograr esto?

Dependiendo de qué tan recientes sean su teléfono y Mac, esta también podría ser una opción: Toque para desbloquear
Desafortunadamente, parece que mi Mac es solo una generación demasiado vieja para que bluetooth de baja energía (y, por lo tanto, Knock) funcione. Sin embargo, parece muy interesante; Estaré pendiente de su evolución.

Respuestas (1)

Me pasa lo mismo en la 10.9. También intenté cambiar require password to wake of security preferencesy poner las pantallas en suspensión en lugar de iniciar un protector de pantalla:

tell application "System Events"
    set require password to wake of security preferences to true
    --start screen saver "Random"
    do shell script "pmset displaysleepnow"
    delay 5
    set require password to wake of security preferences to false
end tell

Sin embargo, ninguno de los dos ayudó.

Sin embargo, puede cerrar sesión en la pantalla de cambio rápido de usuario en lugar de bloquear la pantalla:

/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend
El pmset displaysleepnowes útil, por alguna razón no lo había encontrado en el pasado. Desafortunadamente, el cambio rápido de usuario no me permitiría bloquear la computadora con un retraso, por ejemplo, cuando salgo de la habitación por un minuto en casa.