@@ -7,7 +7,8 @@ SPDX-License-Identifier: Apache-2.0
7
7
package generic
8
8
9
9
import (
10
- "encoding/hex"
10
+ "encoding/base64"
11
+ "net/url"
11
12
"strings"
12
13
"time"
13
14
@@ -28,7 +29,7 @@ type DataTx struct {
28
29
}
29
30
30
31
func (d * DataTx ) Put (db string , key string , bytes []byte , a driver.AccessControl ) error {
31
- key = toOrionKey (key )
32
+ key = sanitizeKey (key )
32
33
var ac * types.AccessControl
33
34
if a != nil {
34
35
var ok bool
@@ -44,7 +45,7 @@ func (d *DataTx) Put(db string, key string, bytes []byte, a driver.AccessControl
44
45
}
45
46
46
47
func (d * DataTx ) Get (db string , key string ) ([]byte , error ) {
47
- key = toOrionKey (key )
48
+ key = sanitizeKey (key )
48
49
r , _ , err := d .dataTx .Get (db , key )
49
50
if err != nil {
50
51
return nil , errors .Wrapf (err , "failed getting data" )
@@ -58,7 +59,7 @@ func (d *DataTx) Commit(sync bool) (string, error) {
58
59
}
59
60
60
61
func (d * DataTx ) Delete (db string , key string ) error {
61
- key = toOrionKey (key )
62
+ key = sanitizeKey (key )
62
63
return d .dataTx .Delete (db , key )
63
64
}
64
65
@@ -96,44 +97,36 @@ func (l *LoadedDataTx) CoSignAndClose() ([]byte, error) {
96
97
return proto .Marshal (env )
97
98
}
98
99
99
- func (l * LoadedDataTx ) Reads () ( map [string ][]* driver.DataRead , error ) {
100
+ func (l * LoadedDataTx ) Reads () map [string ][]* driver.DataRead {
100
101
res := map [string ][]* driver.DataRead {}
101
102
source := l .loadedDataTx .Reads ()
102
103
for s , reads := range source {
103
104
newReads := make ([]* driver.DataRead , len (reads ))
104
105
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
- }
109
106
newReads [i ] = & driver.DataRead {
110
- Key : k ,
107
+ Key : read . Key ,
111
108
}
112
109
}
113
110
res [s ] = newReads
114
111
}
115
- return res , nil
112
+ return res
116
113
}
117
114
118
- func (l * LoadedDataTx ) Writes () ( map [string ][]* driver.DataWrite , error ) {
115
+ func (l * LoadedDataTx ) Writes () map [string ][]* driver.DataWrite {
119
116
res := map [string ][]* driver.DataWrite {}
120
117
source := l .loadedDataTx .Writes ()
121
118
for s , writes := range source {
122
119
newWrites := make ([]* driver.DataWrite , len (writes ))
123
120
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
- }
128
121
newWrites [i ] = & driver.DataWrite {
129
- Key : k ,
122
+ Key : write . Key ,
130
123
Value : write .Value ,
131
124
Acl : write .Acl ,
132
125
}
133
126
}
134
127
res [s ] = newWrites
135
128
}
136
- return res , nil
129
+ return res
137
130
}
138
131
139
132
func (l * LoadedDataTx ) MustSignUsers () []string {
@@ -259,38 +252,30 @@ func (s *SessionManager) NewSession(id string) (driver.Session, error) {
259
252
return & Session {s : session }, err
260
253
}
261
254
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
265
258
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
271
264
}
272
265
}
273
- if strings . HasSuffix ( key , "~" ) {
274
- b . WriteRune ( '~' )
266
+ if ! escaped {
267
+ return key
275
268
}
276
- return b .String ()
277
- }
278
269
279
- func fromOrionKey (key string ) (string , error ) {
280
- components := strings .Split (key , "~" )
281
270
b := strings.Builder {}
282
271
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 ])
288
273
if i < len (components )- 1 {
289
274
b .WriteRune ('~' )
290
275
}
291
276
}
292
277
if strings .HasSuffix (key , "~" ) {
293
278
b .WriteRune ('~' )
294
279
}
295
- return b .String (), nil
280
+ return b .String ()
296
281
}
0 commit comments