@@ -7,8 +7,7 @@ SPDX-License-Identifier: Apache-2.0
77package generic
88
99import (
10- "encoding/base64"
11- "net/url"
10+ "encoding/hex"
1211 "strings"
1312 "time"
1413
@@ -29,7 +28,7 @@ type DataTx struct {
2928}
3029
3130func (d * DataTx ) Put (db string , key string , bytes []byte , a driver.AccessControl ) error {
32- key = sanitizeKey (key )
31+ key = toOrionKey (key )
3332 var ac * types.AccessControl
3433 if a != nil {
3534 var ok bool
@@ -45,7 +44,7 @@ func (d *DataTx) Put(db string, key string, bytes []byte, a driver.AccessControl
4544}
4645
4746func (d * DataTx ) Get (db string , key string ) ([]byte , error ) {
48- key = sanitizeKey (key )
47+ key = toOrionKey (key )
4948 r , _ , err := d .dataTx .Get (db , key )
5049 if err != nil {
5150 return nil , errors .Wrapf (err , "failed getting data" )
@@ -59,7 +58,7 @@ func (d *DataTx) Commit(sync bool) (string, error) {
5958}
6059
6160func (d * DataTx ) Delete (db string , key string ) error {
62- key = sanitizeKey (key )
61+ key = toOrionKey (key )
6362 return d .dataTx .Delete (db , key )
6463}
6564
@@ -97,36 +96,44 @@ func (l *LoadedDataTx) CoSignAndClose() ([]byte, error) {
9796 return proto .Marshal (env )
9897}
9998
100- func (l * LoadedDataTx ) Reads () map [string ][]* driver.DataRead {
99+ func (l * LoadedDataTx ) Reads () ( map [string ][]* driver.DataRead , error ) {
101100 res := map [string ][]* driver.DataRead {}
102101 source := l .loadedDataTx .Reads ()
103102 for s , reads := range source {
104103 newReads := make ([]* driver.DataRead , len (reads ))
105104 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+ }
106109 newReads [i ] = & driver.DataRead {
107- Key : read . Key ,
110+ Key : k ,
108111 }
109112 }
110113 res [s ] = newReads
111114 }
112- return res
115+ return res , nil
113116}
114117
115- func (l * LoadedDataTx ) Writes () map [string ][]* driver.DataWrite {
118+ func (l * LoadedDataTx ) Writes () ( map [string ][]* driver.DataWrite , error ) {
116119 res := map [string ][]* driver.DataWrite {}
117120 source := l .loadedDataTx .Writes ()
118121 for s , writes := range source {
119122 newWrites := make ([]* driver.DataWrite , len (writes ))
120123 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+ }
121128 newWrites [i ] = & driver.DataWrite {
122- Key : write . Key ,
129+ Key : k ,
123130 Value : write .Value ,
124131 Acl : write .Acl ,
125132 }
126133 }
127134 res [s ] = newWrites
128135 }
129- return res
136+ return res , nil
130137}
131138
132139func (l * LoadedDataTx ) MustSignUsers () []string {
@@ -252,30 +259,38 @@ func (s *SessionManager) NewSession(id string) (driver.Session, error) {
252259 return & Session {s : session }, err
253260}
254261
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
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 )), "~" )
258265 components := strings .Split (key , "~" )
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
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 ( '~' )
264271 }
265272 }
266- if ! escaped {
267- return key
273+ if strings . HasSuffix ( key , "~" ) {
274+ b . WriteRune ( '~' )
268275 }
276+ return b .String ()
277+ }
269278
279+ func fromOrionKey (key string ) (string , error ) {
280+ components := strings .Split (key , "~" )
270281 b := strings.Builder {}
271282 for i := 0 ; i < len (components ); i ++ {
272- b .WriteString (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 ))
273288 if i < len (components )- 1 {
274289 b .WriteRune ('~' )
275290 }
276291 }
277292 if strings .HasSuffix (key , "~" ) {
278293 b .WriteRune ('~' )
279294 }
280- return b .String ()
295+ return b .String (), nil
281296}
0 commit comments