commit d4dd13ad97a3da468fed69f0d24e3f6699852360 Author: Fanir Date: Wed Nov 20 20:53:27 2013 +0100 v0.0.0 -- initial commit diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..720d44b --- /dev/null +++ b/Makefile @@ -0,0 +1,3 @@ +all: usblocker.go + go fmt usblocker.go + go build usblocker.go diff --git a/usblocker b/usblocker new file mode 100755 index 0000000..ec760e1 Binary files /dev/null and b/usblocker differ diff --git a/usblocker.go b/usblocker.go new file mode 100644 index 0000000..3713ac9 --- /dev/null +++ b/usblocker.go @@ -0,0 +1,144 @@ +package main + +import ( + "fmt" + "log" + "os" + _ "os/exec" + "path/filepath" + "strings" + "time" +) + +/* Shows the help message + */ +func ShowHelp() { + fmt.Println("Watches a device and locks the screen if the device is missing.") + fmt.Println() + fmt.Println("Usage:") + fmt.Println(" usblocker run: Runs USBLocker in foreground.") + //fmt.Println(" usblocker daemon: Runs in background.") + //fmt.Println(" usblocker create: Prepares a device for usage with USBLocker.") + //fmt.Println(" (Not yet implemented!)") +} + +/* The watcher himself! + */ +func WatcherUnlocked(device string) { + // Watch! + for { + _, errs := os.Stat(device) + if errs != nil { + break + } + time.Sleep(time.Duration(1) * time.Second) + } + log.Println("Locked") + var args []string + args = append(args, "-nolock") + //args = append(args, "-info") + //args = append(args, "") + args = append(args, "-mode") + args = append(args, "blank") + //log.Println(args) + var attr os.ProcAttr + lpid, err := os.StartProcess("/usr/bin/xlock", args, &attr) + if err != nil { + log.Fatal("Error: ", err) + } + WatcherLocked(lpid) +} + +/* Watcher for locked state / no device + */ +func WatcherLocked(lpid *os.Process) { + var passphrase []byte // TEH KEY!!1! + var devices []string // list of devices + var lfile *os.File // device file + ldev := "" // device file name + version := "v0" // version string + + // Set the passphrase + for i := range passphrase { + passphrase[i] = 0 + } + + for { + var err error + devices, err = filepath.Glob("/dev/?d?1") + if err != nil { + log.Fatal("Error while getting list of aviable devices (/dev/?d?1):", err) + } + + // Search lock device + for i := range devices { + log.Println("Checking", devices[i], "for usblocker data...") + lfile, err = os.Open(devices[i]) + if err != nil { + log.Fatal("Error while opening the device file:", err) + } + // Check for magic string + magictest := []byte(" ") + length, err := lfile.Read(magictest) + if err != nil { + log.Fatal("Error while reading the device file:", err) + _ = lfile.Close() + } + if length == 9 && string(magictest) == "usblocker" { + ldev = devices[i] + break + } + } + + // Check lockdev version + if ldev != "" { + log.Println("Checking", ldev, "for right version...") + versiontest := []byte(" ") + length, err := lfile.Read(versiontest) + _ = lfile.Close() + if err != nil { + log.Fatal("Error while reading the device file:", err) + } + if length == 7 && strings.HasPrefix(string(versiontest), version) { + // And finally: UNLOCK! + log.Println("Unlocked") + if lpid != nil { + lpid.Kill() + _, _ = lpid.Wait() + } + WatcherUnlocked(ldev) + } + } + + time.Sleep(time.Duration(1) * time.Second) + } +} + +/* The main function + */ +func main() { + // Determining what to do + if len(os.Args) == 1 { + ShowHelp() + return + } + switch os.Args[1] { + case "run": + case "daemon": + log.Fatal("Not yet implemented.") + case "create": + log.Fatal("Not yet implemented.") + default: + ShowHelp() + } + + // Check for root + if os.Getuid() != 0 { + log.Fatal("YU NO GOT ROOT??") + } + + // Greet the user :) + //log.Println("USBLocker", version) + + WatcherLocked(nil) +}