Ramblings Of a Madman

Yeah, like i would know a good description…

Lock and unlock Ubuntu using your iPhone

If, like me, you suffer from lazius extremis (lazy bastard, for the layman), you probably hate having to lock your computer when you leave and entering a password when you come back.

Fear not, young padawan, UDEV and xdotool to the rescue!

Here's how it works: UDEV (a linux mechanism that detects device events (including USB)) can be configured with rules that fire whenever something changes (i.e. a device is connected or disconnect from the system). When that happens, you want to run a script to lock or unlock your system, based on the type of rule that was fired. So, let's get started:

1. Create the UDEV rules:
1.1. Create a new file at /etc/udev/rules.d/100-lock-unlock-with-iphone.rules, with the following contents:

SUBSYSTEM=="usb", ENV{PRODUCT}=="2bc/12c8/520", ENV{DEVTYPE}=="usb_device", ACTION=="add",    RUN+="/home/youruser/bin/unlock"
SUBSYSTEM=="usb", ENV{PRODUCT}=="2bc/12c8/520", ENV{DEVTYPE}=="usb_device", ACTION=="remove", RUN+="/home/youruser/bin/lock"

1.2. In those lines, replace 2bc/12c8/520 with your device product id, which you can find running the following command in the terminal:

udevadm monitor --environment -u | grep PRODUCT

1.3. Disconnect or connect your iphone and you should see something like this:

PRODUCT=2bc/12c8/520

1.4. That's the value you put in the rules.
1.5. Replace youruser with your own user name, by the way.

2. Which leaves us with the /home/youruser/bin/lock and unlock scripts to create. Here is the lock script:

#!/bin/bash
export XAUTHORITY=/home/youruser/.Xauthority
export DBUS_SESSION_BUS_ADDRESS=`ps -u youruser e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35`
log=/home/youruser/lock-unlock.log
echo `date` "-" `whoami` "- Locking system..." >> $log
su youruser -c "DISPLAY=:0 gnome-screensaver-command -a"
echo `date` "-" `whoami` "- System locked!" >> $log

2.1. Again, replace youruser with your own.
2.2. You might be wondering what those lines about DBUS and the X server are all about. The reason for those is that UDEV runs stuff as root. And we want to lock and unlock the screen as our own user. Those lines make sure of that.
2.3. For the unlock script we need to install a tool called xdotool. It's basically an automation command that allows you to make the computer type stuff and control the mouse automatically. The reason to use this is because there is no way in hell you can unlock a locked screensaver (believe me, i've tried). This tool simulates user input (moves the mouse a little bit and the enters your password and presses enter). I know it's not the most secure thing in the world but it's the only way i could make it work. Install it with:

sudo apt-get install xdotool

2.4. Here's the unlock script:

#!/bin/bash
 export XAUTHORITY=/home/youruser/.Xauthority
 export DBUS_SESSION_BUS_ADDRESS=`ps -u youruser e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35`
 log=/home/youruser/lock-unlock.log
 echo `date` "-" `whoami` "- Unlocking system..." >> $log
 export DISPLAY=:0
 xdotool mousemove 0 0 && xdotool type yourpassword && xdotool key Return
 echo `date` "-" `whoami` "- System unlocked!" >> $log

2.5. Replace youruser with your own user and yourpassword with your user password.

3. Reload the UDEV rules with:

sudo udevadm control --reload-rules

4. And now when you disconnect your phone from the computer, it should lock it. When you plug it back in it should unlock.

5. Happy hacking!