vchain_client 1.0.1 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,102 +6,408 @@ module VChainClient
6
6
  Xet0UYuBrILjHB9HcxFc+WwuCflIRWtRDsNfaY6Ra7j/cRYLeiocYA=="
7
7
 
8
8
  @config = nil
9
+ @log = nil
9
10
 
10
11
  @@recs_cache = {}
11
12
  @@keys_cache = {}
12
13
 
13
14
  def initialize(config)
14
15
  @config = config
16
+
17
+ @log = Log4r::Logger["vchain_client"]
15
18
  end
16
19
 
17
20
  def checkFederativeServer(federative_server_id)
18
- return self.checkBlockstackRecord(federative_server_id, 'federative_server')
21
+
22
+ if @log.debug?
23
+ @log.debug("[Blockstack.checkFederativeServer] input:")
24
+ @log.debug("-> federative_server_id: #{federative_server_id}")
25
+ end
26
+
27
+ begin
28
+
29
+ return self.checkBlockstackRecord(federative_server_id, 'federative_server')
30
+
31
+ rescue => e
32
+
33
+ if @log.error?
34
+ @log.error("[Blockstack.checkFederativeServer] checkBlockstackRecord raised exception:")
35
+ @log.error("#{e.class}, #{e.message}")
36
+ @log.error("-> federative_server_id: #{federative_server_id}")
37
+ @log.error("--> federative_server_id: #{federative_server_id}")
38
+ @log.error("--> type: federative_server")
39
+ end
40
+
41
+ raise e
42
+ end
19
43
  end
20
44
 
21
45
  def checkVerificator(verificator_id)
22
- return self.checkBlockstackRecord(verificator_id, 'verificator')
46
+
47
+ if @log.debug?
48
+ @log.debug("[Blockstack.checkVerificator] input:")
49
+ @log.debug("-> verificator_id: #{verificator_id}")
50
+ end
51
+
52
+ begin
53
+
54
+ return self.checkBlockstackRecord(verificator_id, 'verificator')
55
+
56
+ rescue => e
57
+
58
+ if @log.error?
59
+ @log.error("[Blockstack.checkVerificator] checkBlockstackRecord raised exception:")
60
+ @log.error("#{e.class}, #{e.message}")
61
+ @log.error("-> verificator_id: #{verificator_id}")
62
+ @log.error("--> verificator_id: #{verificator_id}")
63
+ @log.error("--> type: verificator")
64
+ end
65
+
66
+ raise e
67
+ end
23
68
  end
24
69
 
25
70
  def checkValidator(validator_id)
26
- return self.checkBlockstackRecord(validator_id, 'validator')
71
+
72
+ if @log.debug?
73
+ @log.debug("[Blockstack.checkValidator] input:")
74
+ @log.debug("-> validator_id: #{validator_id}")
75
+ end
76
+
77
+ begin
78
+
79
+ return self.checkBlockstackRecord(validator_id, 'validator')
80
+
81
+ rescue => e
82
+
83
+ if @log.error?
84
+ @log.error("[Blockstack.checkValidator] checkBlockstackRecord raised exception:")
85
+ @log.error("#{e.class}, #{e.message}")
86
+ @log.error("-> validator_id: #{validator_id}")
87
+ @log.error("--> validator_id: #{validator_id}")
88
+ @log.error("--> type: validator")
89
+ end
90
+
91
+ raise e
92
+ end
27
93
  end
28
94
 
29
95
  def checkBlockstackRecord(blockstack_id, type)
30
96
 
31
- record = self.getBlockstackRecord(blockstack_id)
97
+ if @log.debug?
98
+ @log.debug("[Blockstack.checkBlockstackRecord] input:")
99
+ @log.debug("-> blockstack_id: #{blockstack_id}")
100
+ @log.debug("-> type: #{type}")
101
+ end
102
+
103
+ record = nil
104
+
105
+ begin
106
+
107
+ record = self.getBlockstackRecord(blockstack_id)
108
+
109
+ rescue => e
110
+
111
+ if @log.error?
112
+ @log.error("[Blockstack.checkBlockstackRecord] getBlockstackRecord raised exception:")
113
+ @log.error("#{e.class}, #{e.message}")
114
+ @log.error("-> blockstack_id: #{blockstack_id}")
115
+ @log.error("-> type: #{type}")
116
+ @log.error("--> blockstack_id: #{blockstack_id}")
117
+ end
118
+
119
+ raise e
120
+ end
121
+
122
+ if record == nil
123
+ if @log.error?
124
+ @log.error("[Blockstack.checkBlockstackRecord] failed to retrieve record")
125
+ @log.error("-> blockstack_id: #{blockstack_id}")
126
+ @log.error("-> type: #{type}")
127
+ @log.error("--> blockstack_id: #{blockstack_id}")
128
+ end
129
+
130
+ return false
131
+ end
32
132
 
33
133
  signaturesHelper = VChainClient::Signatures.new(@config)
34
134
 
135
+ if @log.debug?
136
+ @log.debug("[Blockstack.checkBlockstackRecord] Signatures initialized")
137
+ end
138
+
35
139
  if record != nil
140
+
36
141
  if record.key?("pubkey")
142
+
37
143
  if record.key?("vchain_role")
38
144
 
39
145
  if record["vchain_role"] != type
40
- return nil
146
+ if @log.error?
147
+ @log.error("[Blockstack.checkBlockstackRecord] type mismatch")
148
+ @log.error("-> blockstack_id: #{blockstack_id}")
149
+ @log.error("-> type: #{type}")
150
+ @log.error("--> '"+ record["vchain_role"] +"'")
151
+ end
152
+
153
+ return false
154
+ end
155
+
156
+ if !record.key?("validator_blockstack_id")
157
+ if @log.error?
158
+ @log.error("[Blockstack.checkBlockstackRecord] record doesn't have 'validator_blockstack_id' field")
159
+ @log.error("-> blockstack_id: #{blockstack_id}")
160
+ @log.error("-> type: #{type}")
161
+ end
162
+
163
+ return false
41
164
  end
42
165
 
43
166
  validator_blockstack_id = record["validator_blockstack_id"]
44
- if validator_blockstack_id != nil
45
167
 
46
- if record["vchain_role"] != 'validator'
168
+ if @log.debug?
169
+ @log.debug("[Blockstack.checkBlockstackRecord] record's vchain_role is '"+ record["vchain_role"] +"'")
170
+ end
171
+
172
+ if record["vchain_role"] != 'validator'
173
+
174
+ if @log.debug?
175
+ @log.debug("[Blockstack.checkBlockstackRecord] going to check validator for #{blockstack_id}, validator_id: #{validator_blockstack_id}")
176
+ end
177
+
178
+ begin
179
+
47
180
  if !self.checkValidator(validator_blockstack_id)
48
- return nil
181
+
182
+ if @log.error?
183
+ @log.error("[Blockstack.checkBlockstackRecord] failed to check validator")
184
+ @log.error("-> blockstack_id: #{blockstack_id}")
185
+ @log.error("-> type: #{type}")
186
+ @log.error("--> validator_blockstack_id: #{validator_blockstack_id}")
187
+ end
188
+
189
+ return false
49
190
  end
50
- end
51
191
 
52
- validator_pub_key = nil
53
- if record["vchain_role"] != 'validator'
54
- validator_pub_key = self.getPublicKey(validator_blockstack_id)
55
- else
56
- validator_pub_key = MASTER_PUBLIC_KEY;
57
- end
192
+ rescue => e
193
+ if @log.error?
194
+ @log.error("[Blockstack.checkBlockstackRecord] checkValidator raised exception:")
195
+ @log.error("#{e.class}, #{e.message}")
196
+ @log.error("-> blockstack_id: #{blockstack_id}")
197
+ @log.error("-> type: #{type}")
198
+ @log.error("--> validator_blockstack_id: #{validator_blockstack_id}")
199
+ end
200
+
201
+ raise e
202
+ end
203
+
204
+ end
205
+
206
+ validator_pub_key = nil
207
+ if record["vchain_role"] != 'validator'
208
+
209
+ begin
210
+
211
+ validator_pub_key = self.getPublicKey(validator_blockstack_id)
212
+
213
+ rescue => e
214
+ if @log.error?
215
+ @log.error("[Blockstack.checkBlockstackRecord] getPublicKey raised exception:")
216
+ @log.error("#{e.class}, #{e.message}")
217
+ @log.error("-> blockstack_id: #{blockstack_id}")
218
+ @log.error("-> type: #{type}")
219
+ @log.error("--> validator_blockstack_id: #{validator_blockstack_id}")
220
+ end
221
+
222
+ raise e
223
+ end
224
+
225
+ else
226
+ validator_pub_key = MASTER_PUBLIC_KEY;
227
+ end
58
228
 
59
- # check client's sig
229
+ if validator_pub_key == nil
230
+ if @log.error?
231
+ @log.error("[Blockstack.checkBlockstackRecord] failed to retrieve public key:")
232
+ @log.error("-> blockstack_id: #{blockstack_id}")
233
+ @log.error("-> type: #{type}")
234
+ @log.error("--> validator_blockstack_id: #{validator_blockstack_id}")
235
+ end
60
236
 
61
- client_sig_to_check = record["vchain_id"] + record["vchain_role"] + blockstack_id + record["pubkey"] + record["sig_version"];
237
+ return false
238
+ end
239
+
240
+ # check client's sig
241
+ client_sig_to_check = record["vchain_id"] + record["vchain_role"] + blockstack_id + record["pubkey"] + record["sig_version"];
242
+
243
+ begin
62
244
 
63
245
  if signaturesHelper.verifySignature(client_sig_to_check, record["client_sig"], record["pubkey"])
246
+
64
247
  # check validator's sig
65
248
  validator_sig_to_check = record["vchain_id"] + record["vchain_role"] + blockstack_id + record["pubkey"] + record["sig_version"] + record["validator_vchain_id"] + validator_blockstack_id
66
249
 
67
- if signaturesHelper.verifySignature(validator_sig_to_check, record["validator_sig"], validator_pub_key)
68
- return true;
69
-
70
- else
71
- return nil
250
+ begin
251
+
252
+ if signaturesHelper.verifySignature(validator_sig_to_check, record["validator_sig"], validator_pub_key)
253
+
254
+ return true;
255
+
256
+ else
257
+ if @log.error?
258
+ @log.error("[Blockstack.checkBlockstackRecord] failed to verify validator_sig")
259
+ @log.error("-> blockstack_id: #{blockstack_id}")
260
+ @log.error("-> type: #{type}")
261
+ @log.error("--> validator_sig_to_check: #{validator_sig_to_check}")
262
+ @log.error("--> validator_sig: "+ Base64.encode64(record["validator_sig"]))
263
+ @log.error("--> validator_pub_key: "+ record["validator_pub_key"])
264
+ end
265
+
266
+ return false
267
+ end
268
+
269
+ rescue => e
270
+ if @log.error?
271
+ @log.error("[Blockstack.checkBlockstackRecord] verifySignature for validator_sig raised exception:")
272
+ @log.error("#{e.class}, #{e.message}")
273
+ @log.error("-> blockstack_id: #{blockstack_id}")
274
+ @log.error("-> type: #{type}")
275
+ @log.error("--> validator_sig_to_check: #{validator_sig_to_check}")
276
+ @log.error("--> validator_sig: "+ Base64.encode64(record["validator_sig"]))
277
+ @log.error("--> validator_pub_key: "+ record["validator_pub_key"])
278
+ end
279
+
280
+ raise e
72
281
  end
73
282
 
74
283
  else
75
- return nil
284
+ if @log.error?
285
+ @log.error("[Blockstack.checkBlockstackRecord] failed to verify client_sig")
286
+ @log.error("-> blockstack_id: #{blockstack_id}")
287
+ @log.error("-> type: #{type}")
288
+ @log.error("--> client_sig_to_check: #{client_sig_to_check}")
289
+ @log.error("--> client_sig: "+ Base64.encode64(record["client_sig"]))
290
+ @log.error("--> pubkey: "+ record["pubkey"])
291
+ end
292
+
293
+ return false
76
294
  end
77
- end
295
+
296
+ rescue => e
297
+ if @log.error?
298
+ @log.error("[Blockstack.checkBlockstackRecord] verifySignature for client_sig raised exception:")
299
+ @log.error("#{e.class}, #{e.message}")
300
+ @log.error("-> blockstack_id: #{blockstack_id}")
301
+ @log.error("-> type: #{type}")
302
+ @log.error("--> client_sig_to_check: #{client_sig_to_check}")
303
+ @log.error("--> client_sig: "+ Base64.encode64(record["client_sig"]))
304
+ @log.error("--> pubkey: "+ record["pubkey"])
305
+ end
306
+
307
+ raise e
308
+ end
309
+
310
+ else
311
+ if @log.error?
312
+ @log.error("[Blockstack.checkBlockstackRecord] record doesn't have 'vchain_role' field")
313
+ @log.error("-> blockstack_id: #{blockstack_id}")
314
+ @log.error("-> type: #{type}")
315
+ end
78
316
  end
317
+
318
+ else
319
+ if @log.error?
320
+ @log.error("[Blockstack.checkBlockstackRecord] record doesn't have 'pubkey' field")
321
+ @log.error("-> blockstack_id: #{blockstack_id}")
322
+ @log.error("-> type: #{type}")
323
+ end
324
+ end
325
+
326
+ else
327
+ if @log.error?
328
+ @log.error("[Blockstack.checkBlockstackRecord] record is null")
329
+ @log.error("-> blockstack_id: #{blockstack_id}")
330
+ @log.error("-> type: #{type}")
79
331
  end
80
332
  end
81
333
 
82
- return nil
334
+ return false
83
335
  end
84
336
 
85
337
  def getPublicKey(blockstack_id)
338
+
339
+ if @log.debug?
340
+ @log.debug("[Blockstack.getPublicKey] input:")
341
+ @log.debug("-> blockstack_id: #{blockstack_id}")
342
+ end
343
+
86
344
  if @@keys_cache.key?(blockstack_id)
345
+
346
+ if @log.debug?
347
+ @log.debug("[Blockstack.getPublicKey] '#{blockstack_id}' is in a cache")
348
+ end
349
+
87
350
  return @@keys_cache[blockstack_id]
88
351
  end
89
352
 
90
- record = self.getBlockstackRecord(blockstack_id);
91
- if record != nil
92
- if record.key?("pubkey")
353
+ if @log.debug?
354
+ @log.debug("[Blockstack.getPublicKey] '#{blockstack_id}' is not in a cache yet")
355
+ end
93
356
 
94
- @@keys_cache[blockstack_id] = record["pubkey"]
357
+ begin
95
358
 
96
- return record["pubkey"]
97
- end
98
- end
359
+ record = self.getBlockstackRecord(blockstack_id);
360
+
361
+ if record != nil
362
+
363
+ if record.key?("pubkey")
364
+
365
+ @@keys_cache[blockstack_id] = record["pubkey"]
366
+
367
+ return record["pubkey"]
368
+
369
+ else
370
+ if @log.error?
371
+ @log.error("[Blockstack.getPublicKey] record '#{blockstack_id}' doesn't have 'pubkey' field")
372
+ @log.error("-> blockstack_id: #{blockstack_id}")
373
+ @log.error("--> blockstack_id: #{blockstack_id}")
374
+ end
375
+ end
376
+
377
+ else
378
+ if @log.error?
379
+ @log.error("[Blockstack.getPublicKey] failed to retrieve '#{blockstack_id}' record")
380
+ @log.error("-> blockstack_id: #{blockstack_id}")
381
+ @log.error("--> blockstack_id: #{blockstack_id}")
382
+ end
383
+ end
384
+
385
+ rescue => e
386
+ if @log.error?
387
+ @log.error("[Blockstack.getPublicKey] getBlockstackRecord raised exception:")
388
+ @log.error("#{e.class}, #{e.message}")
389
+ @log.error("-> blockstack_id: #{blockstack_id}")
390
+ @log.error("--> blockstack_id: #{blockstack_id}")
391
+ end
392
+
393
+ raise e
394
+ end
99
395
 
100
396
  return nil
101
397
  end
102
398
 
103
399
  def getBlockstackRecord(blockstack_id)
400
+
401
+ if @log.debug?
402
+ @log.debug("[Blockstack.getBlockstackRecord] input:")
403
+ @log.debug("-> blockstack_id: #{blockstack_id}")
404
+ end
405
+
104
406
  if @@recs_cache.key?(blockstack_id)
407
+ if @log.debug?
408
+ @log.debug("[Blockstack.getBlockstackRecord] '#{blockstack_id}' is in a cache")
409
+ end
410
+
105
411
  return @@recs_cache[blockstack_id]
106
412
  end
107
413
 
@@ -109,24 +415,61 @@ module VChainClient
109
415
 
110
416
  cmd = blockstack_path +" get_name_zonefile "+ blockstack_id
111
417
 
112
- ret = `#{cmd}`
113
- if ret == nil || ret == "Name has no user record hash defined"
418
+ if @log.debug?
419
+ @log.debug("[Blockstack.getBlockstackRecord] using '#{blockstack_path}' as a Blockstack path")
420
+ @log.debug("[Blockstack.getBlockstackRecord] running '#{cmd}'")
421
+ end
422
+
423
+ ret = nil
424
+
425
+ begin
426
+
427
+ ret = `#{cmd}`
428
+
429
+ rescue => e
430
+ if @log.error?
431
+ @log.error("[Blockstack.getBlockstackRecord] cmd call '#{cmd}' raised exception:")
432
+ @log.error("#{e.class}, #{e.message}")
433
+ @log.error("-> blockstack_id: #{blockstack_id}")
434
+ @log.error("--> '#{cmd}'")
435
+ end
436
+
437
+ raise e
438
+ end
439
+
440
+ if ret == nil
441
+ if @log.error?
442
+ @log.error("[Blockstack.getBlockstackRecord] failed to retrieve record from cmd call")
443
+ @log.error("-> blockstack_id: #{blockstack_id}")
444
+ @log.error("--> '#{cmd}'")
445
+ end
446
+
114
447
  return nil
115
448
  end
449
+
450
+ if @log.debug?
451
+ @log.debug("[Blockstack.getBlockstackRecord] cmd call return:")
452
+ @log.debug(ret)
453
+ end
454
+
116
455
  ret = JSON.parse ret
117
456
 
118
457
  fz = {}
119
- if ret != nil
120
- if ret.key?("txt")
121
- ret["txt"].each { |rec|
122
- if rec.key?("name") && rec.key?("txt")
123
- fz[rec["name"]] = rec["txt"]
124
- end
125
- }
126
- end
458
+ if ret.key?("txt")
459
+ ret["txt"].each { |rec|
460
+ if rec.key?("name") && rec.key?("txt")
461
+ fz[rec["name"]] = rec["txt"]
462
+ end
463
+ }
464
+ end
465
+
466
+ if @log.debug?
467
+ @log.debug("[Blockstack.getBlockstackRecord] fz:")
468
+ @log.debug(fz)
127
469
  end
128
470
 
129
- if fz.key?("A1")
471
+ if fz.key?("A1") && fz.key?("A2") && fz.key?("A3") && fz.key?("A4") && fz.key?("A5") && fz.key?("A6") && fz.key?("A7") && fz.key?("A8")
472
+
130
473
  pubkey_aligned = fz["A1"]
131
474
  pubkey = pubkey_aligned[0..63] +"\n"+ pubkey_aligned[64..pubkey_aligned.length]
132
475
 
@@ -141,10 +484,22 @@ module VChainClient
141
484
  "client_sig" => Base64.decode64(fz["A8"])
142
485
  }
143
486
 
487
+ if @log.debug?
488
+ @log.debug("[Blockstack.getBlockstackRecord] output:")
489
+ @log.debug(output)
490
+ end
491
+
144
492
  @@recs_cache[blockstack_id] = output
145
493
  @@keys_cache[blockstack_id] = pubkey
146
494
 
147
495
  return output
496
+
497
+ else
498
+ if @log.error?
499
+ @log.error("[Blockstack.getBlockstackRecord] no 'A*' field")
500
+ @log.error("-> blockstack_id: #{blockstack_id}")
501
+ @log.error("--> blockstack_id: #{blockstack_id}")
502
+ end
148
503
  end
149
504
 
150
505
  return nil