Blame


1 b49d0f4b 2005-02-13 devnull #!/usr/local/plan9/bin/rc
2 b49d0f4b 2005-02-13 devnull
3 b49d0f4b 2005-02-13 devnull . 9.rc
4 b49d0f4b 2005-02-13 devnull name = secstore
5 b49d0f4b 2005-02-13 devnull get = secstoreget
6 b49d0f4b 2005-02-13 devnull put = secstoreput
7 b49d0f4b 2005-02-13 devnull edit = no
8 b49d0f4b 2005-02-13 devnull load = no
9 b49d0f4b 2005-02-13 devnull flush = no
10 b49d0f4b 2005-02-13 devnull
11 b49d0f4b 2005-02-13 devnull fn secstoreget{
12 b49d0f4b 2005-02-13 devnull secstore -i -g $1 <_password
13 b49d0f4b 2005-02-13 devnull }
14 b49d0f4b 2005-02-13 devnull
15 b49d0f4b 2005-02-13 devnull fn secstoreput{
16 b49d0f4b 2005-02-13 devnull secstore -i -p $1 <_password
17 b49d0f4b 2005-02-13 devnull }
18 b49d0f4b 2005-02-13 devnull
19 b49d0f4b 2005-02-13 devnull fn aesget{
20 b49d0f4b 2005-02-13 devnull if(! ~ $1 /*){
21 b49d0f4b 2005-02-13 devnull echo >[1=2] ipso: aescbc requires fully qualified pathname
22 b49d0f4b 2005-02-13 devnull exit usage
23 b49d0f4b 2005-02-13 devnull }
24 b49d0f4b 2005-02-13 devnull aescbc -i -d < $1 > `{basename $1} <[3] _password
25 b49d0f4b 2005-02-13 devnull }
26 b49d0f4b 2005-02-13 devnull
27 b49d0f4b 2005-02-13 devnull fn aesput{
28 b49d0f4b 2005-02-13 devnull aescbc -i -e > $1 < `{basename $1} <[3] _password
29 b49d0f4b 2005-02-13 devnull }
30 b49d0f4b 2005-02-13 devnull
31 b49d0f4b 2005-02-13 devnull fn editedfiles{
32 b49d0f4b 2005-02-13 devnull if(~ $get aesget){
33 b49d0f4b 2005-02-13 devnull for(i in $files)
34 b49d0f4b 2005-02-13 devnull if(ls -tr | sed '1,/^_timestamp$/d' | grep -s '^'^`{basename $i}^'$')
35 b49d0f4b 2005-02-13 devnull echo $i
36 b49d0f4b 2005-02-13 devnull }
37 b49d0f4b 2005-02-13 devnull if not
38 b49d0f4b 2005-02-13 devnull ls -tr | sed '1,/^_timestamp$/d'
39 b49d0f4b 2005-02-13 devnull }
40 b49d0f4b 2005-02-13 devnull
41 b49d0f4b 2005-02-13 devnull while(~ $1 -*){
42 b49d0f4b 2005-02-13 devnull switch($1){
43 b49d0f4b 2005-02-13 devnull case -a
44 b49d0f4b 2005-02-13 devnull name = aescbc
45 b49d0f4b 2005-02-13 devnull get = aesget
46 b49d0f4b 2005-02-13 devnull put = aesput
47 b49d0f4b 2005-02-13 devnull case -f
48 b49d0f4b 2005-02-13 devnull flush = yes
49 b49d0f4b 2005-02-13 devnull case -e
50 b49d0f4b 2005-02-13 devnull edit = yes
51 b49d0f4b 2005-02-13 devnull case -l
52 b49d0f4b 2005-02-13 devnull load = yes
53 b49d0f4b 2005-02-13 devnull case *
54 b49d0f4b 2005-02-13 devnull echo >[2=1] 'usage: ipso [-a -f -e -l] [-s] [file ...]'
55 b49d0f4b 2005-02-13 devnull exit usage
56 b49d0f4b 2005-02-13 devnull }
57 b49d0f4b 2005-02-13 devnull shift
58 b49d0f4b 2005-02-13 devnull }
59 b49d0f4b 2005-02-13 devnull
60 b49d0f4b 2005-02-13 devnull if(~ $flush no && ~ $edit no && ~ $load no){
61 b49d0f4b 2005-02-13 devnull edit = yes
62 ae1f02ad 2008-07-09 rsc if(~ factotum $*){
63 ae1f02ad 2008-07-09 rsc load = yes
64 ae1f02ad 2008-07-09 rsc flush = yes
65 ae1f02ad 2008-07-09 rsc }
66 b49d0f4b 2005-02-13 devnull }
67 b49d0f4b 2005-02-13 devnull
68 b49d0f4b 2005-02-13 devnull if(~ $flush yes && ~ $edit no && ~ $load no){
69 b49d0f4b 2005-02-13 devnull echo flushing old keys
70 8da6bca8 2005-02-14 devnull echo delkey | 9p write factotum/ctl
71 b49d0f4b 2005-02-13 devnull exit 0
72 b49d0f4b 2005-02-13 devnull }
73 b49d0f4b 2005-02-13 devnull
74 b49d0f4b 2005-02-13 devnull if(~ $get aesget && ~ $#* 0){
75 b49d0f4b 2005-02-13 devnull echo >[2=1] ipso: must specify a fully qualified file name for aescbc '(-a)'
76 b49d0f4b 2005-02-13 devnull exit usage
77 b49d0f4b 2005-02-13 devnull }
78 b49d0f4b 2005-02-13 devnull
79 b49d0f4b 2005-02-13 devnull user=`{whoami}
80 b49d0f4b 2005-02-13 devnull cd /tmp || exit $status
81 08d52f6c 2009-04-30 rsc tmp=`{df | grep -v /lib/init | awk '$1=="tmpfs" {print $NF}'}
82 b49d0f4b 2005-02-13 devnull if(! ~ $#tmp 0)
83 b49d0f4b 2005-02-13 devnull cd $tmp(1) || exit $status
84 b49d0f4b 2005-02-13 devnull mkdir -p ipso.$user
85 b49d0f4b 2005-02-13 devnull chmod 700 ipso.$user || exit $status
86 b49d0f4b 2005-02-13 devnull cd ipso.$user
87 b49d0f4b 2005-02-13 devnull dir=`{pwd}
88 b49d0f4b 2005-02-13 devnull dir=$"dir
89 b49d0f4b 2005-02-13 devnull
90 b49d0f4b 2005-02-13 devnull fn sigexit {
91 b49d0f4b 2005-02-13 devnull rm -rf $dir
92 b49d0f4b 2005-02-13 devnull }
93 b49d0f4b 2005-02-13 devnull
94 b49d0f4b 2005-02-13 devnull if ( ~ $edit yes ) echo '
95 b49d0f4b 2005-02-13 devnull Warning: The editor will display the secret contents of
96 b49d0f4b 2005-02-13 devnull your '$name' files in the clear, and they will
97 b49d0f4b 2005-02-13 devnull be stored temporarily in '^$dir^'
98 b49d0f4b 2005-02-13 devnull in the clear, along with your password.
99 b49d0f4b 2005-02-13 devnull '
100 b49d0f4b 2005-02-13 devnull
101 b49d0f4b 2005-02-13 devnull # get password and remember it
102 b49d0f4b 2005-02-13 devnull readcons -s $name^' password' >_password
103 b49d0f4b 2005-02-13 devnull
104 b49d0f4b 2005-02-13 devnull # get list of files
105 b49d0f4b 2005-02-13 devnull if(~ $#* 0){
106 b49d0f4b 2005-02-13 devnull if(! secstore -G . -i < _password > _listing){
107 b49d0f4b 2005-02-13 devnull echo 'secstore read failed - bad password?'
108 b49d0f4b 2005-02-13 devnull sleep 2
109 b49d0f4b 2005-02-13 devnull exit password
110 b49d0f4b 2005-02-13 devnull }
111 b49d0f4b 2005-02-13 devnull files=`{sed 's/[ ]+.*//' _listing}
112 b49d0f4b 2005-02-13 devnull }
113 b49d0f4b 2005-02-13 devnull if not
114 b49d0f4b 2005-02-13 devnull files = $*
115 b49d0f4b 2005-02-13 devnull
116 b49d0f4b 2005-02-13 devnull # copy the files to local ramfs
117 b49d0f4b 2005-02-13 devnull for(i in $files){
118 b49d0f4b 2005-02-13 devnull if(! $get $i){
119 b49d0f4b 2005-02-13 devnull echo $name ' read failed - bad password?'
120 b49d0f4b 2005-02-13 devnull sleep 2
121 b49d0f4b 2005-02-13 devnull exit password
122 b49d0f4b 2005-02-13 devnull }
123 b49d0f4b 2005-02-13 devnull }
124 b49d0f4b 2005-02-13 devnull sleep 2; date > _timestamp # so we can find which files have been edited.
125 b49d0f4b 2005-02-13 devnull
126 b49d0f4b 2005-02-13 devnull # edit the files
127 817fe389 2005-02-13 devnull if(~ $edit yes){
128 817fe389 2005-02-13 devnull B `{for(i in $files) basename $i}
129 817fe389 2005-02-13 devnull readcons 'type enter when finished editing' >/dev/null
130 817fe389 2005-02-13 devnull }
131 b49d0f4b 2005-02-13 devnull if(~ $flush yes ){
132 b49d0f4b 2005-02-13 devnull echo flushing old keys
133 b49d0f4b 2005-02-13 devnull echo delkey | 9p write factotum/ctl
134 b49d0f4b 2005-02-13 devnull }
135 b49d0f4b 2005-02-13 devnull if(~ $load yes){
136 b49d0f4b 2005-02-13 devnull echo loading factotum keys
137 b49d0f4b 2005-02-13 devnull if (~ factotum $files) cat factotum | 9p write -l factotum/ctl
138 b49d0f4b 2005-02-13 devnull }
139 b49d0f4b 2005-02-13 devnull
140 b49d0f4b 2005-02-13 devnull # copy the files back
141 b49d0f4b 2005-02-13 devnull for(i in `{editedfiles}){
142 b49d0f4b 2005-02-13 devnull prompt='copy '''^`{basename $i}^''' back? [y/n/x]'
143 b49d0f4b 2005-02-13 devnull switch(`{readcons $prompt}){
144 b49d0f4b 2005-02-13 devnull case [yY]*
145 b49d0f4b 2005-02-13 devnull if(! $put $i){
146 b49d0f4b 2005-02-13 devnull echo $name ' read failed - bad password?'
147 b49d0f4b 2005-02-13 devnull sleep 2
148 b49d0f4b 2005-02-13 devnull exit password
149 b49d0f4b 2005-02-13 devnull }
150 b49d0f4b 2005-02-13 devnull echo ''''$i'''' copied to $name
151 8da6bca8 2005-02-14 devnull if(~ $i factotum && ! ~ $load yes){ # do not do it twice
152 8da6bca8 2005-02-14 devnull cat $i | 9p write -l factotum/ctl
153 8da6bca8 2005-02-14 devnull }
154 b49d0f4b 2005-02-13 devnull case [xXqQ]*
155 b49d0f4b 2005-02-13 devnull exit
156 b49d0f4b 2005-02-13 devnull case [nN]* *
157 b49d0f4b 2005-02-13 devnull echo ''''$i'''' skipped
158 b49d0f4b 2005-02-13 devnull }
159 b49d0f4b 2005-02-13 devnull }
160 b49d0f4b 2005-02-13 devnull
161 b49d0f4b 2005-02-13 devnull exit ''