J'utilise une application assez ancienne appelée Proximité pour déclencher des applescripts quand mon téléphone entre et sort de la portée bluetooth de mon mac. En plus d'autres tâches, je veux sécuriser mon ordinateur portable lorsque le téléphone est hors de portée (activer l'économiseur d'écran et le mot de passe), puis désactiver l'exigence du mot de passe lorsque mon téléphone revient à portée.
Avant 10.9
Cela fonctionnait (en grande partie) sous OS 10.8 et antérieur. Quand mon téléphone était hors de portée, je pouvais courir :
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
El notifyScreensaver
est un programme C compilé qui fait en sorte que l'économiseur d'écran relise les préférences d'exigence de mot de passe (de ce message du forum ).
Cela permettrait d'activer l'exigence d'un mot de passe, puis de lancer immédiatement l'économiseur d'écran. C'était le comportement correct si mon ordinateur portable se trouvait dans un environnement public. Cependant, à la maison, je ne voulais pas avoir à taper le mot de passe chaque fois que je sortais de la pièce et revenais une minute plus tard. J'ai donc ajouté une autre couche de complexité :
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
Ainsi, lorsque je suis à la maison, je ne dois taper mon mot de passe que si mon téléphone est hors de portée ET si mon ordinateur est resté inactif suffisamment longtemps pour déclencher la temporisation de l'économiseur d'écran (~20 minutes).
Quand mon téléphone revenait à portée, je courais :
do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 0"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"
Si l'économiseur d'écran était déjà en cours d'exécution, il fallait toujours taper le mot de passe pour déverrouiller l'ordinateur, mais le mot de passe n'était plus nécessaire si l'économiseur d'écran était relancé ultérieurement.
Il y avait un petit problème ici : occasionnellement (je crois qu'il n'y avait pas d'entrée utilisateur entre le moment où le script hors gamme et le script en gamme s'exécutaient, et l'économiseur d'écran avait été activé), l'écran était juste complètement noir au lieu d'afficher l'invite de mot de passe pour déverrouiller l'ordinateur. Cependant, dans ce cas, je pouvais tabuler dans le champ du mot de passe et taper le mot de passe à l'aveugle pour déverrouiller l'ordinateur.
En 10.9
Le changement le plus significatif que j'ai rencontré dans 10.9 se produit lorsque le mot de passe et l'économiseur d'écran sont activés, puis le mot de passe est désactivé, sans aucune saisie de l'utilisateur entre les deux. Lorsque je reviens ensuite pour déverrouiller l'ordinateur, l'écran de veille ne demande pas de mot de passe et revient immédiatement au bureau. Cependant, le clavier est toujours piégé par l'économiseur d'écran : je peux interagir avec les programmes à l'aide de la souris, mais toute frappe au clavier ne provoque qu'un son d'alerte ("Funk" des alertes standard).
Un exemple minimum qui provoque ce comportement est :
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"
Le principal moyen que j'ai trouvé pour sortir de cet état semi-verrouillé est de réactiver l'exigence du mot de passe et de relancer l'économiseur d'écran, puis d'entrer le mot de passe manuellement.
Le comportement le plus idéal (à mon avis) serait de verrouiller mon ordinateur dès que mon téléphone est hors de portée, puis de le déverrouiller automatiquement (sans qu'il soit nécessaire de taper un mot de passe) lorsque mon téléphone revient à portée. Cependant, depuis les versions précédentes du système d'exploitation, je travaille en supposant que l'utilisateur doit entrer pour déverrouiller l'ordinateur après que l'économiseur d'écran et le mot de passe aient été activés. Avec cette contrainte, le comportement souhaité est simplement de restaurer la fonctionnalité qui était présente avant la 10.9 - être capable de taper le mot de passe pour déverrouiller l'ordinateur lorsqu'il est à nouveau à portée, mais ne pas demander un mot de passe à nouveau jusqu'à ce que le téléphone soit hors de portée.
Avez-vous des suggestions sur la façon d'y parvenir ?