18
18
#
19
19
# Here we've stored the HMAC secret and other entries in the team's kvstore;
20
20
# you could also store the entries in the bot's own kvstore (the default team).
21
+ #
22
+ # TODO: this is currently not working exactly right. sorry.
21
23
# ###################################
22
24
23
25
import asyncio
@@ -69,15 +71,15 @@ def __init__(self, client):
69
71
70
72
async def put (
71
73
self ,
72
- team : str ,
73
74
namespace : str ,
74
75
entry_key : str ,
75
76
entry_value : Dict [str , str ],
77
+ team : str ,
76
78
revision : Union [int , None ] = None ,
77
79
) -> Union [keybase1 .KVPutResult , keybase1 .KVGetResult ]:
78
80
try :
79
81
res : keybase1 .KVPutResult = await self .kvstore .put (
80
- team , namespace , entry_key , entry_value , revision
82
+ namespace , entry_key , entry_value , team = team , revision = revision
81
83
)
82
84
return res # successful put. return KVPutResult
83
85
except RevisionError :
@@ -86,14 +88,14 @@ async def put(
86
88
87
89
async def delete (
88
90
self ,
89
- team : str ,
90
91
namespace : str ,
91
92
entry_key : str ,
93
+ team : str ,
92
94
revision : Union [int , None ] = None ,
93
95
) -> Union [keybase1 .KVDeleteEntryResult , keybase1 .KVGetResult ]:
94
96
try :
95
97
res : keybase1 .KVDeleteEntryResult = await self .kvstore .delete (
96
- team , namespace , entry_key , revision
98
+ namespace = namespace , entry_key = entry_key , revision = revision , team = team
97
99
)
98
100
return res # successful delete. return KVDeleteEntryResult
99
101
except (RevisionError , DeleteNonExistentError ):
@@ -102,15 +104,15 @@ async def delete(
102
104
return res
103
105
104
106
async def get (
105
- self , team : str , namespace : str , entry_key : str
107
+ self , namespace : str , entry_key : str , team : str
106
108
) -> keybase1 .KVGetResult :
107
- res = await self .kvstore .get (team , namespace , entry_key )
109
+ res = await self .kvstore .get (namespace , entry_key , team )
108
110
return res
109
111
110
112
async def list_entrykeys (
111
- self , team : str , namespace : str
113
+ self , namespace : str , team : str
112
114
) -> keybase1 .KVListEntryResult :
113
- res = await self .kvstore .list_entrykeys (team , namespace )
115
+ res = await self .kvstore .list_entrykeys (namespace , team )
114
116
return res
115
117
116
118
@@ -155,11 +157,15 @@ async def load_secret(self, team, namespace) -> bytes:
155
157
try :
156
158
# we don't expect self.SECRET_KEY's revision > 0
157
159
await self .kvstore .put (
158
- namespace , self .SECRET_KEY , bytes_to_str (secret ), 1 , team
160
+ namespace ,
161
+ self .SECRET_KEY ,
162
+ bytes_to_str (secret ),
163
+ revision = 1 ,
164
+ team = team ,
159
165
)
160
166
except RevisionError :
161
167
res : keybase1 .KVGetResult = await self .kvstore .get (
162
- team , namespace , self .SECRET_KEY
168
+ namespace , self .SECRET_KEY , team = team
163
169
)
164
170
secret = str_to_bytes (res .entry_value )
165
171
if team not in self .secrets :
@@ -182,7 +188,7 @@ async def put(
182
188
entry_value [SecretKeyKVStoreClient .KEY_KEY ] = entry_key
183
189
h = await self .hmac_key (team , namespace , entry_key )
184
190
res = await self .kvstore .put (
185
- namespace , h , json .dumps (entry_value ), revision , team
191
+ namespace , h , json .dumps (entry_value ), revision = revision , team = team
186
192
)
187
193
res .entry_key = entry_key
188
194
return res
@@ -195,28 +201,28 @@ async def delete(
195
201
revision : Union [int , None ] = None ,
196
202
) -> keybase1 .KVDeleteEntryResult :
197
203
h = await self .hmac_key (team , namespace , entry_key )
198
- res = await self .kvstore .delete (namespace , h , revision , team )
204
+ res = await self .kvstore .delete (namespace , h , revision = revision , team = team )
199
205
res .entry_key = entry_key
200
206
return res
201
207
202
208
async def get (
203
209
self , team : str , namespace : str , entry_key : str
204
210
) -> keybase1 .KVGetResult :
205
211
h = await self .hmac_key (team , namespace , entry_key )
206
- res = await self .kvstore .get (namespace , h , team )
212
+ res = await self .kvstore .get (namespace , h , team = team )
207
213
res .entry_key = entry_key
208
214
return res
209
215
210
216
async def list_entrykeys (
211
217
self , team : str , namespace : str
212
218
) -> keybase1 .KVListEntryResult :
213
- res = await self .kvstore .list_entrykeys (namespace , team )
219
+ res = await self .kvstore .list_entrykeys (namespace , team = team )
214
220
if res .entry_keys :
215
221
res .entry_keys = [
216
222
e for e in res .entry_keys if not e .entry_key .startswith ("_" )
217
223
]
218
224
for e in res .entry_keys :
219
- get_res = await self .kvstore .get (namespace , e .entry_key , team )
225
+ get_res = await self .kvstore .get (namespace , e .entry_key , team = team )
220
226
e .entry_key = json .loads (get_res .entry_value )[self .KEY_KEY ]
221
227
return res
222
228
@@ -242,7 +248,7 @@ async def add(self, team, tool) -> Tuple[bool, Union[keybase1.KVGetResult, None]
242
248
most recent get result if applicable)
243
249
"""
244
250
res = await self .lookup (team , tool )
245
- if res .entry_value != "" :
251
+ if res .entry_value is not None :
246
252
return (True , res ) # if tool already exists, return get
247
253
expected_revision = res .revision + 1
248
254
res = await self .kvstore .put (team , self .NAMESPACE , tool , {}, expected_revision )
@@ -260,10 +266,15 @@ async def remove(
260
266
most recent get result if applicable)
261
267
"""
262
268
res = await self .lookup (team , tool )
263
- if res .entry_value == "" :
269
+ if res .entry_value is None :
264
270
return (True , res ) # if tool already doesn't exist, return get
265
271
expected_revision = res .revision + 1
266
- res = await self .kvstore .delete (team , self .NAMESPACE , tool , expected_revision )
272
+ res = await self .kvstore .delete (
273
+ namespace = self .NAMESPACE ,
274
+ entry_key = tool ,
275
+ revision = expected_revision ,
276
+ team = team ,
277
+ )
267
278
if type (res ) == keybase1 .KVGetResult :
268
279
return (False , res )
269
280
else :
@@ -281,14 +292,14 @@ async def reserve(
281
292
most recent get result if applicable)
282
293
"""
283
294
res = await self .lookup (team , tool )
284
- info = json .loads (res .entry_value ) if res .entry_value != "" else {}
295
+ info = json .loads (res .entry_value ) if res .entry_value is not None else {}
285
296
if day in info :
286
297
return (False , res ) # failed to put because day is already reserved.
287
298
else :
288
299
info [day ] = user
289
300
expected_revision = res .revision + 1
290
301
res = await self .kvstore .put (
291
- team , self .NAMESPACE , tool , info , expected_revision
302
+ self .NAMESPACE , tool , info , revision = expected_revision , team = team
292
303
)
293
304
if type (res ) == keybase1 .KVGetResult :
294
305
return (False , res )
@@ -308,7 +319,7 @@ async def unreserve(
308
319
most recent get result if applicable)
309
320
"""
310
321
res = await self .lookup (team , tool )
311
- info = json .loads (res .entry_value ) if res .entry_value != "" else {}
322
+ info = json .loads (res .entry_value ) if res .entry_value is not None else {}
312
323
if day not in info :
313
324
# a noop because currently not reserved
314
325
return (True , res )
@@ -319,20 +330,20 @@ async def unreserve(
319
330
info .pop (day )
320
331
expected_revision = res .revision + 1
321
332
res = await self .kvstore .put (
322
- team , self .NAMESPACE , tool , info , expected_revision
333
+ self .NAMESPACE , tool , info , revision = expected_revision , team = team
323
334
)
324
335
if type (res ) == keybase1 .KVGetResult :
325
336
return (False , res )
326
337
else :
327
338
return (True , None )
328
339
329
340
async def list_tools (self , team ) -> List [str ]:
330
- res = await self .kvstore .list_entrykeys (team , self .NAMESPACE )
341
+ res = await self .kvstore .list_entrykeys (self .NAMESPACE , team = team )
331
342
keys = [e .entry_key for e in res .entry_keys ] if res .entry_keys else []
332
343
return keys
333
344
334
345
335
- async def basic_rental_users (bot , rental , team ):
346
+ async def basic_rental_users (rental , team ):
336
347
user1 = "Jo"
337
348
user2 = "Charlie"
338
349
date1 = "2044-03-12"
@@ -397,7 +408,7 @@ async def basic_rental_users(bot, rental, team):
397
408
assert SecretKeyKVStoreClient .KEY_KEY in info
398
409
399
410
400
- async def concurrent_rental_users (bot , rental , team ):
411
+ async def concurrent_rental_users (rental , team ):
401
412
tool = "time travel machine"
402
413
403
414
async def concurrent_rental_user (user_id : int ):
@@ -451,10 +462,10 @@ def noop_handler(*args, **kwargs):
451
462
rental = RentalBotClient (bot )
452
463
453
464
print ("...basic rental actions..." )
454
- await basic_rental_users (bot , rental , team )
465
+ await basic_rental_users (rental , team )
455
466
456
467
print ("...multiple users try to reserve..." )
457
- await concurrent_rental_users (bot , rental , team )
468
+ await concurrent_rental_users (rental , team )
458
469
459
470
print ("...5_secret_storage example is complete." )
460
471
0 commit comments