@@ -7,7 +7,8 @@ SPDX-License-Identifier: Apache-2.0
77package generic
88
99import (
10- "encoding/hex"
10+ "encoding/base64"
11+ "net/url"
1112 "strings"
1213 "time"
1314
@@ -28,7 +29,7 @@ type DataTx struct {
2829}
2930
3031func (d * DataTx ) Put (db string , key string , bytes []byte , a driver.AccessControl ) error {
31- key = toOrionKey (key )
32+ key = sanitizeKey (key )
3233 var ac * types.AccessControl
3334 if a != nil {
3435 var ok bool
@@ -44,7 +45,7 @@ func (d *DataTx) Put(db string, key string, bytes []byte, a driver.AccessControl
4445}
4546
4647func (d * DataTx ) Get (db string , key string ) ([]byte , error ) {
47- key = toOrionKey (key )
48+ key = sanitizeKey (key )
4849 r , _ , err := d .dataTx .Get (db , key )
4950 if err != nil {
5051 return nil , errors .Wrapf (err , "failed getting data" )
@@ -58,7 +59,7 @@ func (d *DataTx) Commit(sync bool) (string, error) {
5859}
5960
6061func (d * DataTx ) Delete (db string , key string ) error {
61- key = toOrionKey (key )
62+ key = sanitizeKey (key )
6263 return d .dataTx .Delete (db , key )
6364}
6465
@@ -96,44 +97,36 @@ func (l *LoadedDataTx) CoSignAndClose() ([]byte, error) {
9697 return proto .Marshal (env )
9798}
9899
99- func (l * LoadedDataTx ) Reads () ( map [string ][]* driver.DataRead , error ) {
100+ func (l * LoadedDataTx ) Reads () map [string ][]* driver.DataRead {
100101 res := map [string ][]* driver.DataRead {}
101102 source := l .loadedDataTx .Reads ()
102103 for s , reads := range source {
103104 newReads := make ([]* driver.DataRead , len (reads ))
104105 for i , read := range reads {
105- k , err := fromOrionKey (read .Key )
106- if err != nil {
107- return nil , errors .WithMessagef (err , "failed to decode read key [%s]" , read .Key )
108- }
109106 newReads [i ] = & driver.DataRead {
110- Key : k ,
107+ Key : read . Key ,
111108 }
112109 }
113110 res [s ] = newReads
114111 }
115- return res , nil
112+ return res
116113}
117114
118- func (l * LoadedDataTx ) Writes () ( map [string ][]* driver.DataWrite , error ) {
115+ func (l * LoadedDataTx ) Writes () map [string ][]* driver.DataWrite {
119116 res := map [string ][]* driver.DataWrite {}
120117 source := l .loadedDataTx .Writes ()
121118 for s , writes := range source {
122119 newWrites := make ([]* driver.DataWrite , len (writes ))
123120 for i , write := range writes {
124- k , err := fromOrionKey (write .Key )
125- if err != nil {
126- return nil , errors .WithMessagef (err , "failed to decode write key [%s]" , write .Key )
127- }
128121 newWrites [i ] = & driver.DataWrite {
129- Key : k ,
122+ Key : write . Key ,
130123 Value : write .Value ,
131124 Acl : write .Acl ,
132125 }
133126 }
134127 res [s ] = newWrites
135128 }
136- return res , nil
129+ return res
137130}
138131
139132func (l * LoadedDataTx ) MustSignUsers () []string {
@@ -259,38 +252,30 @@ func (s *SessionManager) NewSession(id string) (driver.Session, error) {
259252 return & Session {s : session }, err
260253}
261254
262- // toOrionKey makes sure that each component in the key can be correctly be url escaped
263- func toOrionKey (key string ) string {
264- key = strings . ReplaceAll ( key , string ( rune ( 0 )), "~" )
255+ // sanitizeKey makes sure that each component in the key can be correctly be url escaped
256+ func sanitizeKey (key string ) string {
257+ escaped := false
265258 components := strings .Split (key , "~" )
266- b := strings. Builder {}
267- for i := 0 ; i < len ( components ); i ++ {
268- b . WriteString ( hex . EncodeToString ([] byte ( components [ i ])))
269- if i < len ( components ) - 1 {
270- b . WriteRune ( '~' )
259+ for i , c := range components {
260+ cc := url . PathEscape ( c )
261+ if c != cc {
262+ components [ i ] = base64 . StdEncoding . EncodeToString ([] byte ( c ))
263+ escaped = true
271264 }
272265 }
273- if strings . HasSuffix ( key , "~" ) {
274- b . WriteRune ( '~' )
266+ if ! escaped {
267+ return key
275268 }
276- return b .String ()
277- }
278269
279- func fromOrionKey (key string ) (string , error ) {
280- components := strings .Split (key , "~" )
281270 b := strings.Builder {}
282271 for i := 0 ; i < len (components ); i ++ {
283- decoded , err := hex .DecodeString (components [i ])
284- if err != nil {
285- return "" , errors .Wrapf (err , "failed to decode [%s]" , key )
286- }
287- b .WriteString (string (decoded ))
272+ b .WriteString (components [i ])
288273 if i < len (components )- 1 {
289274 b .WriteRune ('~' )
290275 }
291276 }
292277 if strings .HasSuffix (key , "~" ) {
293278 b .WriteRune ('~' )
294279 }
295- return b .String (), nil
280+ return b .String ()
296281}
0 commit comments