1d9306527SDavid du Colombier#!/bin/rc 2ac84fd08SDavid du Colombier# ipso - edit secstore files, reload factotum keys 3ac84fd08SDavid du Colombierif(! ~ $service terminal && 4ac84fd08SDavid du Colombier ! ~ $user `{ ls -ld /mnt/factotum/ctl | awk '{print $4}' }){ 5d9306527SDavid du Colombier echo >[1=2] ipso should be run only on the terminal 6d9306527SDavid du Colombier exit terminal 7d9306527SDavid du Colombier} 8d9306527SDavid du Colombier 9ac84fd08SDavid du Colombierrfork e 10d9306527SDavid du Colombierpath=(/bin) 11d9306527SDavid du Colombierhome=(/tmp) 12d9306527SDavid du Colombiereditor = (acme -c1) 13d9306527SDavid du Colombiername = secstore 14d9306527SDavid du Colombierget = secstoreget 15d9306527SDavid du Colombierput = secstoreput 16b7327ca2SDavid du Colombieredit = no 17b7327ca2SDavid du Colombierload = no 18b7327ca2SDavid du Colombierflush = no 19d9306527SDavid du Colombier 20d9306527SDavid du Colombierfn secstoreget{ 21d9306527SDavid du Colombier auth/secstore -i -g $1 <_password 22d9306527SDavid du Colombier} 23d9306527SDavid du Colombier 24d9306527SDavid du Colombierfn secstoreput{ 25d9306527SDavid du Colombier auth/secstore -i -p $1 <_password 26d9306527SDavid du Colombier} 27d9306527SDavid du Colombier 28d9306527SDavid du Colombierfn aesget{ 29d9306527SDavid du Colombier if(! ~ $1 /*){ 30d9306527SDavid du Colombier echo >[1=2] ipso: aescbc requires fully qualified pathname 31d9306527SDavid du Colombier exit usage 32d9306527SDavid du Colombier } 33d9306527SDavid du Colombier auth/aescbc -i -d < $1 > `{basename $1} <[3] _password 34d9306527SDavid du Colombier} 35d9306527SDavid du Colombier 36d9306527SDavid du Colombierfn aesput{ 37d9306527SDavid du Colombier auth/aescbc -i -e > $1 < `{basename $1} <[3] _password 38d9306527SDavid du Colombier} 39d9306527SDavid du Colombier 40d9306527SDavid du Colombierfn editedfiles{ 41d9306527SDavid du Colombier if(~ $get aesget){ 42d9306527SDavid du Colombier for(i in $files) 43d9306527SDavid du Colombier if(ls -tr | sed '1,/^_timestamp$/d' | grep -s '^'^`{basename $i}^'$') 44d9306527SDavid du Colombier echo $i 45d9306527SDavid du Colombier } 46d9306527SDavid du Colombier if not 47d9306527SDavid du Colombier ls -tr | sed '1,/^_timestamp$/d' 48d9306527SDavid du Colombier} 49d9306527SDavid du Colombier 50ac84fd08SDavid du Colombieredexp=`{grep '^editor=' /mnt/plumb/rules >[2]/dev/null} 51ac84fd08SDavid du Colombierif(~ $#edexp 1) 52ac84fd08SDavid du Colombier eval $edexp 53ac84fd08SDavid du Colombier 54d9306527SDavid du Colombierwhile(~ $1 -*){ 55d9306527SDavid du Colombier switch($1){ 56d9306527SDavid du Colombier case -s 57d9306527SDavid du Colombier editor = sam 58d9306527SDavid du Colombier case -a 59d9306527SDavid du Colombier name = aescbc 60d9306527SDavid du Colombier get = aesget 61d9306527SDavid du Colombier put = aesput 62b7327ca2SDavid du Colombier case -f 63b7327ca2SDavid du Colombier flush = yes 64b7327ca2SDavid du Colombier case -e 65b7327ca2SDavid du Colombier edit = yes 66b7327ca2SDavid du Colombier case -l 67b7327ca2SDavid du Colombier load = yes 68d9306527SDavid du Colombier case * 69b7327ca2SDavid du Colombier echo >[2=1] 'usage: ipso [-a -f -e -l] [-s] [file ...]' 70d9306527SDavid du Colombier exit usage 71d9306527SDavid du Colombier } 72d9306527SDavid du Colombier shift 73d9306527SDavid du Colombier} 74d9306527SDavid du Colombier 75b7327ca2SDavid du Colombierif(~ $flush no && ~ $edit no && ~ $load no){ 76b7327ca2SDavid du Colombier load = yes 77b7327ca2SDavid du Colombier edit = yes 78b7327ca2SDavid du Colombier flush = yes 79b7327ca2SDavid du Colombier} 80b7327ca2SDavid du Colombier 81b7327ca2SDavid du Colombierif(~ $flush yes && ~ $edit no && ~ $load no){ 82b7327ca2SDavid du Colombier echo flushing old keys 83b7327ca2SDavid du Colombier echo delkey > /mnt/factotum/ctl 84b7327ca2SDavid du Colombier exit 0 85b7327ca2SDavid du Colombier} 86b7327ca2SDavid du Colombier 87d9306527SDavid du Colombierif(~ $get aesget && ~ $#* 0){ 88d9306527SDavid du Colombier echo >[2=1] ipso: must specify a fully qualified file name for aescbc '(-a)' 89d9306527SDavid du Colombier exit usage 90d9306527SDavid du Colombier} 91d9306527SDavid du Colombier 92d9306527SDavid du Colombierrfork ne 93d9306527SDavid du Colombierramfs -p >[2] /dev/null # silence 'i/o on hungup channel' message at exit 94d9306527SDavid du Colombierunmount /mnt/plumb 95d9306527SDavid du Colombierbind -c /tmp /srv 96d1da931cSDavid du Colombierbuiltin cd /tmp 97d9306527SDavid du Colombier 98b7327ca2SDavid du Colombierif ( ~ $edit yes ) echo ' 99d9306527SDavid du Colombier Warning: The editor will display the secret contents of 100d9306527SDavid du Colombier your '$name' files in the clear. 101d9306527SDavid du Colombier' 102d9306527SDavid du Colombier# get password and remember it 103d9306527SDavid du Colombier{ 104d9306527SDavid du Colombier echo rawon 105d9306527SDavid du Colombier echo -n $name password: >/dev/cons 106d9306527SDavid du Colombier read > _password 107d9306527SDavid du Colombier echo > /dev/cons 108d9306527SDavid du Colombier}</dev/cons > /dev/consctl 109d9306527SDavid du Colombier 110d9306527SDavid du Colombier# get list of files 111d9306527SDavid du Colombierif(~ $#* 0){ 112d9306527SDavid du Colombier if(! auth/secstore -G . -i < _password > _listing){ 113d9306527SDavid du Colombier echo 'secstore read failed - bad password?' 114d9306527SDavid du Colombier sleep 2 115d9306527SDavid du Colombier exit password 116d9306527SDavid du Colombier } 117d9306527SDavid du Colombier files=`{sed 's/[ ]+.*//' _listing} 118d9306527SDavid du Colombier} 119d9306527SDavid du Colombierif not 120d9306527SDavid du Colombier files = $* 121d9306527SDavid du Colombier 122d9306527SDavid du Colombier# copy the files to local ramfs 123d9306527SDavid du Colombierfor(i in $files){ 124d9306527SDavid du Colombier if(! $get $i){ 125d9306527SDavid du Colombier echo $name ' read failed - bad password?' 126d9306527SDavid du Colombier sleep 2 127d9306527SDavid du Colombier exit password 128d9306527SDavid du Colombier } 129d9306527SDavid du Colombier} 130d9306527SDavid du Colombiersleep 2; date > _timestamp # so we can find which files have been edited. 131d9306527SDavid du Colombier 132d9306527SDavid du Colombier# edit the files 133b7327ca2SDavid du Colombierif(~ $edit yes) $editor `{for(i in $files) basename $i} 134*6f8e93f6SDavid du Colombierif(~ factotum $files){ 135b7327ca2SDavid du Colombier if(~ $flush yes){ 136b7327ca2SDavid du Colombier echo flushing old keys 137b7327ca2SDavid du Colombier echo delkey > /mnt/factotum/ctl 138b7327ca2SDavid du Colombier } 139b7327ca2SDavid du Colombier if(~ $load yes){ 140b7327ca2SDavid du Colombier echo loading factotum keys 141*6f8e93f6SDavid du Colombier read -m < factotum > /mnt/factotum/ctl 142*6f8e93f6SDavid du Colombier } 143b7327ca2SDavid du Colombier} 144d9306527SDavid du Colombier 145d9306527SDavid du Colombier# copy the files back 146d9306527SDavid du Colombierfor(i in `{editedfiles}){ 147d9306527SDavid du Colombier echo -n copy ''''`{basename $i}^'''' back?' [y/n/x]' 148d9306527SDavid du Colombier switch(`{read}){ 149d9306527SDavid du Colombier case [yY]* 150d9306527SDavid du Colombier if(! $put $i){ 151d9306527SDavid du Colombier echo $name ' read failed - bad password?' 152d9306527SDavid du Colombier sleep 2 153d9306527SDavid du Colombier exit password 154d9306527SDavid du Colombier } 155d9306527SDavid du Colombier echo ''''$i'''' copied to $name 156d9306527SDavid du Colombier case [xXqQ]* 157d9306527SDavid du Colombier exit 158d9306527SDavid du Colombier case [nN]* * 159d9306527SDavid du Colombier echo ''''$i'''' skipped 160d9306527SDavid du Colombier } 161d9306527SDavid du Colombier} 162d9306527SDavid du Colombier 163d9306527SDavid du Colombierexit '' 164