blob: 9de10933dcb753b24cde790e5c8487ece522fb45 [file] [log] [blame]
#!/usr/local/plan9/bin/rc
. 9.rc
name = secstore
get = secstoreget
put = secstoreput
edit = no
load = no
flush = no
fn secstoreget{
secstore -i -g $1 <_password
}
fn secstoreput{
secstore -i -p $1 <_password
}
fn aesget{
if(! ~ $1 /*){
echo >[1=2] ipso: aescbc requires fully qualified pathname
exit usage
}
aescbc -i -d < $1 > `{basename $1} <[3] _password
}
fn aesput{
aescbc -i -e > $1 < `{basename $1} <[3] _password
}
fn editedfiles{
if(~ $get aesget){
for(i in $files)
if(ls -tr | sed '1,/^_timestamp$/d' | grep -s '^'^`{basename $i}^'$')
echo $i
}
if not
ls -tr | sed '1,/^_timestamp$/d'
}
while(~ $1 -*){
switch($1){
case -a
name = aescbc
get = aesget
put = aesput
case -f
flush = yes
case -e
edit = yes
case -l
load = yes
case *
echo >[2=1] 'usage: ipso [-a -f -e -l] [-s] [file ...]'
exit usage
}
shift
}
if(~ $flush no && ~ $edit no && ~ $load no){
edit = yes
if(~ factotum $*){
load = yes
flush = yes
}
}
if(~ $flush yes && ~ $edit no && ~ $load no){
echo flushing old keys
echo delkey | 9p write factotum/ctl
exit 0
}
if(~ $get aesget && ~ $#* 0){
echo >[2=1] ipso: must specify a fully qualified file name for aescbc '(-a)'
exit usage
}
user=`{whoami}
cd /tmp || exit $status
tmp=`{df | grep -v /lib/init | awk '$1=="tmpfs" {print $NF}'}
if(! ~ $#tmp 0)
cd $tmp(1) || exit $status
mkdir -p ipso.$user
chmod 700 ipso.$user || exit $status
cd ipso.$user
dir=`{pwd}
dir=$"dir
fn sigexit {
rm -rf $dir
}
if ( ~ $edit yes ) echo '
Warning: The editor will display the secret contents of
your '$name' files in the clear, and they will
be stored temporarily in '^$dir^'
in the clear, along with your password.
'
# get password and remember it
readcons -s $name^' password' >_password
# get list of files
if(~ $#* 0){
if(! secstore -G . -i < _password > _listing){
echo 'secstore read failed - bad password?'
sleep 2
exit password
}
files=`{sed 's/[ ]+.*//' _listing}
}
if not
files = $*
# copy the files to local ramfs
for(i in $files){
if(! $get $i){
echo $name ' read failed - bad password?'
sleep 2
exit password
}
}
sleep 2; date > _timestamp # so we can find which files have been edited.
# edit the files
if(~ $edit yes){
B `{for(i in $files) basename $i}
readcons 'type enter when finished editing' >/dev/null
}
if(~ $flush yes ){
echo flushing old keys
echo delkey | 9p write factotum/ctl
}
if(~ $load yes){
echo loading factotum keys
if (~ factotum $files) cat factotum | 9p write -l factotum/ctl
}
# copy the files back
for(i in `{editedfiles}){
prompt='copy '''^`{basename $i}^''' back? [y/n/x]'
switch(`{readcons $prompt}){
case [yY]*
if(! $put $i){
echo $name ' read failed - bad password?'
sleep 2
exit password
}
echo ''''$i'''' copied to $name
if(~ $i factotum && ! ~ $load yes){ # do not do it twice
cat $i | 9p write -l factotum/ctl
}
case [xXqQ]*
exit
case [nN]* *
echo ''''$i'''' skipped
}
}
exit ''