@@ -11,6 +11,7 @@ import (
1111
1212 jose "github.com/dvsekhvalnov/jose2go"
1313 homedir "github.com/mitchellh/go-homedir"
14+ "github.com/mtibben/percent"
1415)
1516
1617func init () {
@@ -22,6 +23,11 @@ func init() {
2223 })
2324}
2425
26+ var filenameEscape = func (s string ) string {
27+ return percent .Encode (s , "/" )
28+ }
29+ var filenameUnescape = percent .Decode
30+
2531type fileKeyring struct {
2632 dir string
2733 passwordFunc PromptFunc
@@ -73,12 +79,12 @@ func (k *fileKeyring) unlock() error {
7379}
7480
7581func (k * fileKeyring ) Get (key string ) (Item , error ) {
76- dir , err := k .resolveDir ( )
82+ filename , err := k .filename ( key )
7783 if err != nil {
7884 return Item {}, err
7985 }
8086
81- bytes , err := ioutil .ReadFile (filepath . Join ( dir , key ) )
87+ bytes , err := ioutil .ReadFile (filename )
8288 if os .IsNotExist (err ) {
8389 return Item {}, ErrKeyNotFound
8490 } else if err != nil {
@@ -101,12 +107,12 @@ func (k *fileKeyring) Get(key string) (Item, error) {
101107}
102108
103109func (k * fileKeyring ) GetMetadata (key string ) (Metadata , error ) {
104- dir , err := k .resolveDir ( )
110+ filename , err := k .filename ( key )
105111 if err != nil {
106112 return Metadata {}, err
107113 }
108114
109- stat , err := os .Stat (filepath . Join ( dir , key ) )
115+ stat , err := os .Stat (filename )
110116 if os .IsNotExist (err ) {
111117 return Metadata {}, ErrKeyNotFound
112118 } else if err != nil {
@@ -131,11 +137,6 @@ func (k *fileKeyring) Set(i Item) error {
131137 return err
132138 }
133139
134- dir , err := k .resolveDir ()
135- if err != nil {
136- return err
137- }
138-
139140 if err = k .unlock (); err != nil {
140141 return err
141142 }
@@ -148,16 +149,29 @@ func (k *fileKeyring) Set(i Item) error {
148149 return err
149150 }
150151
151- return ioutil .WriteFile (filepath .Join (dir , i .Key ), []byte (token ), 0600 )
152+ filename , err := k .filename (i .Key )
153+ if err != nil {
154+ return err
155+ }
156+ return ioutil .WriteFile (filename , []byte (token ), 0600 )
152157}
153158
154- func (k * fileKeyring ) Remove (key string ) error {
159+ func (k * fileKeyring ) filename (key string ) ( string , error ) {
155160 dir , err := k .resolveDir ()
161+ if err != nil {
162+ return "" , err
163+ }
164+
165+ return filepath .Join (dir , filenameEscape (key )), nil
166+ }
167+
168+ func (k * fileKeyring ) Remove (key string ) error {
169+ filename , err := k .filename (key )
156170 if err != nil {
157171 return err
158172 }
159173
160- return os .Remove (filepath . Join ( dir , key ) )
174+ return os .Remove (filename )
161175}
162176
163177func (k * fileKeyring ) Keys () ([]string , error ) {
@@ -169,7 +183,7 @@ func (k *fileKeyring) Keys() ([]string, error) {
169183 var keys = []string {}
170184 files , _ := ioutil .ReadDir (dir )
171185 for _ , f := range files {
172- keys = append (keys , f .Name ())
186+ keys = append (keys , filenameUnescape ( f .Name () ))
173187 }
174188
175189 return keys , nil
0 commit comments