reedb 0.10.rc1 → 0.11

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.
@@ -18,7 +18,14 @@ require 'sinatra'
18
18
  require 'rack'
19
19
 
20
20
  # Reedb requirements
21
- require 'reedb'
21
+ # This rescue block fixes the issue where reedbd could not be run without system integration
22
+ begin
23
+ require 'reedb'
24
+ rescue LoadError => e
25
+ require_relative '../reedb'
26
+ end
27
+
28
+ require_relative 'errors/exit_errors'
22
29
 
23
30
  # HTTP handler class that registers the functions
24
31
  # for the vault interface
@@ -32,15 +39,15 @@ class ReedbHandler < Sinatra::Base
32
39
  # PUT /vaults/scope Scope a vault that already exists
33
40
 
34
41
  # POST /vaults/*vault-id*/request_token Auth for vault with ID
35
- # [AUTH] POST /vaults/*vault-id*/headers Return vault headers
36
- # [AUTH] POST /vaults/*vault-id*/close Close vault with ID
42
+ # [AUTH] POST /vaults/*vault-id*/headers Return vault headers
43
+ # [AUTH] POST /vaults/*vault-id*/close Close vault with ID
37
44
 
38
- # [AUTH] POST /vaults/*vault-id*/files/*file-id* Returns body of a file
39
- # [AUTH] POST /vaults/*vault-id*/files/*file-id*/history Returns history of a file (???)
45
+ # [AUTH] POST /vaults/*vault-id*/files/*file-id* Returns body of a file
46
+ # [AUTH] POST /vaults/*vault-id*/files/*file-id*/history Returns history of a file (???)
40
47
 
41
- # [AUTH] PUT /vaults/*vault-id*/files Create file
42
- # [AUTH] POST /vaults/*vault-id*/files/*file-id* Update file contents
43
- # [AUTH] POST /vaults/*vault-id*/files/*file-id*/remove Removes a file
48
+ # [AUTH] PUT /vaults/*vault-id*/files Create file
49
+ # [AUTH] POST /vaults/*vault-id*/files/*file-id* Update file contents
50
+ # [AUTH] POST /vaults/*vault-id*/files/*file-id*/remove Removes a file
44
51
 
45
52
  configure :production, :development do
46
53
  enable :logging
@@ -50,8 +57,8 @@ class ReedbHandler < Sinatra::Base
50
57
  status status_code # Set http status code
51
58
  content_type 'application/json'
52
59
  response = { 'success' => (status_code >= 400 ? false : true),
53
- 'message' => message,
54
- 'payload' => payload }
60
+ 'message' => message,
61
+ 'payload' => payload }
55
62
  return response.to_json
56
63
  end
57
64
 
@@ -66,7 +73,7 @@ class ReedbHandler < Sinatra::Base
66
73
 
67
74
  # If request was garbage
68
75
  unless request.content_type == 'application/json'
69
- return build_response(400, 'Data was malformed. Expects JSON!')
76
+ return build_response(400, 'Data was malformed. Expects JSON!')
70
77
  end
71
78
 
72
79
  # Check if the JSON data
@@ -74,7 +81,7 @@ class ReedbHandler < Sinatra::Base
74
81
  begin
75
82
  data = JSON.parse(request.body.read)
76
83
  rescue
77
- return build_response(400, 'JSON data was malformed!')
84
+ return build_response(400, 'JSON data was malformed!')
78
85
  end
79
86
 
80
87
  name = data["name"] if data["name"]
@@ -83,8 +90,8 @@ class ReedbHandler < Sinatra::Base
83
90
  encryption = :auto # TODO: Handle this better!
84
91
 
85
92
  # This gets fired if not all neccesary information was provided.
86
- if name == nil && path == nil && passphrase == nil
87
- return build_response(400, 'Required data fields are missing from JSON data body!')
93
+ if name == nil || path == nil || passphrase == nil
94
+ return build_response(400, 'Required data fields are missing from JSON data body!')
88
95
  end
89
96
 
90
97
  # Now deal with the actual stuff
@@ -92,25 +99,26 @@ class ReedbHandler < Sinatra::Base
92
99
 
93
100
  # Catches ALL possible errors that can occur during this operation!
94
101
  begin
95
- token = Reedb::Vault::create_vault(name, path, passphrase, encryption)
102
+ token = Reedb::Vault::create_vault(name, path, passphrase)
96
103
  rescue InsecureUserPasswordError => e
97
104
  return build_response(400, e.message)
98
105
 
99
106
  rescue VaultExistsAtLocationError => e
100
107
  return build_response(409, e.message)
101
108
 
109
+ # Thank you descriptive exception messages
102
110
  rescue VaultWritePermissionsError,
103
- VaultMissingConfigurationError,
104
- VaultLoggerError,
105
- BadCacheError,
106
- EncryptionFailedError,
107
- DecryptionFailedError => e
111
+ VaultMissingConfigurationError,
112
+ VaultLoggerError,
113
+ BadCacheError,
114
+ EncryptionFailedError,
115
+ DecryptionFailedError => e
108
116
 
109
117
  # Bundled error return
110
118
  return build_response(500, e.message)
111
119
  end
112
120
 
113
- return build_response(201, "Vault was successfully crated at location", token)
121
+ return build_response(201, 'Vault was successfully crated at location', token)
114
122
  end
115
123
 
116
124
  # Scope a new vault on the system.
@@ -125,14 +133,14 @@ class ReedbHandler < Sinatra::Base
125
133
  begin
126
134
  data = JSON.parse(request.body.read)
127
135
  rescue
128
- return build_response(400, 'JSON data was malformed!')
136
+ return build_response(400, 'JSON data was malformed!')
129
137
  end
130
138
 
131
- name = data["name"] if data["name"]
132
- path = data["path"] if data["path"]
139
+ name = data['name'] ? data['name'] : nil
140
+ path = data['path'] ? data['path'] : nil
133
141
 
134
- if name == nil && path == nil
135
- return build_response(400, 'Required data fields are missing from JSON data body!')
142
+ if name == nil || path == nil
143
+ return build_response(400, 'Required data fields are missing from JSON data body!')
136
144
  end
137
145
 
138
146
  begin
@@ -142,7 +150,7 @@ class ReedbHandler < Sinatra::Base
142
150
  end
143
151
 
144
152
  # If everything went well
145
- return build_response(200, "Vault successfully scoped. It is now available to load.")
153
+ return build_response(200, 'Vault successfully scoped. It is now available to load.')
146
154
  end
147
155
 
148
156
  put '/vaults/unscope' do
@@ -156,14 +164,14 @@ class ReedbHandler < Sinatra::Base
156
164
  begin
157
165
  data = JSON.parse(request.body.read)
158
166
  rescue
159
- return build_response(400, 'JSON data was malformed!')
167
+ return build_response(400, 'JSON data was malformed!')
160
168
  end
161
169
 
162
170
  name = data["name"] if data["name"]
163
171
  path = data["path"] if data["path"]
164
172
 
165
- if name == nil && path == nil
166
- return build_response(400, 'Required data fields are missing from JSON data body!')
173
+ if name == nil || path == nil
174
+ return build_response(400, 'Required data fields are missing from JSON data body!')
167
175
  end
168
176
 
169
177
  begin
@@ -174,14 +182,12 @@ class ReedbHandler < Sinatra::Base
174
182
 
175
183
  # If everything went well
176
184
  return build_response(200, "Vault successfully unscoped and will not show up in vault lists anymore.")
177
- end
185
+ end
178
186
 
179
187
  # Request a token for a vault
180
188
  post '/vaults/*/request_token' do
181
189
  vault_uuid = params[:splat][0]
182
190
 
183
- puts vault_uuid
184
-
185
191
  if vault_uuid == nil
186
192
  return build_response(400, 'Missing vault access id.')
187
193
  end
@@ -196,14 +202,14 @@ class ReedbHandler < Sinatra::Base
196
202
  begin
197
203
  data = JSON.parse(request.body.read)
198
204
  rescue
199
- return build_response(400, 'JSON data was malformed!')
205
+ return build_response(400, 'JSON data was malformed!')
200
206
  end
201
207
 
202
- passphrase = data["passphrase"] if data["passphrase"]
208
+ passphrase = data['passphrase'] if data['passphrase']
203
209
  permanent = false # TODO: Implement this!
204
210
 
205
- if passphrase == nil && permanent == nil
206
- return build_response(400, 'Required data fields are missing from JSON data body!')
211
+ if passphrase == nil || permanent == nil
212
+ return build_response(400, 'Required data fields are missing from JSON data body!')
207
213
  end
208
214
 
209
215
  token = nil
@@ -213,7 +219,7 @@ class ReedbHandler < Sinatra::Base
213
219
  return build_response(404, e.message)
214
220
 
215
221
  rescue WrongUserPasswordError => e
216
- return build_response(401, e.message)
222
+ return build_response(401, e.message)
217
223
  end
218
224
 
219
225
  return build_response(200, "Access successfully granted for vault", token)
@@ -222,7 +228,7 @@ class ReedbHandler < Sinatra::Base
222
228
  post '/vaults/*/free_token' do
223
229
  vault_uuid = params[:splat][0]
224
230
 
225
- unless vault_uuid
231
+ unless vault_uuid
226
232
  return build_response(400, 'Missing vault access id.')
227
233
  end
228
234
 
@@ -236,13 +242,13 @@ class ReedbHandler < Sinatra::Base
236
242
  begin
237
243
  data = JSON.parse(request.body.read)
238
244
  rescue
239
- return build_response(400, 'JSON data was malformed!')
245
+ return build_response(400, 'JSON data was malformed!')
240
246
  end
241
247
 
242
248
  token = data["token"] if data["token"]
243
249
 
244
250
  if token == nil
245
- return build_response(400, 'Required data fields are missing from JSON data body!')
251
+ return build_response(400, 'Required data fields are missing from JSON data body!')
246
252
  end
247
253
 
248
254
  begin
@@ -258,7 +264,7 @@ class ReedbHandler < Sinatra::Base
258
264
  post '/vaults/*/close' do
259
265
  vault_uuid = params[:splat][0]
260
266
 
261
- unless vault_uuid
267
+ unless vault_uuid
262
268
  return build_response(400, 'Missing vault access id.')
263
269
  end
264
270
 
@@ -272,18 +278,18 @@ class ReedbHandler < Sinatra::Base
272
278
  begin
273
279
  data = JSON.parse(request.body.read)
274
280
  rescue
275
- return build_response(400, 'JSON data was malformed!')
281
+ return build_response(400, 'JSON data was malformed!')
276
282
  end
277
283
 
278
- token = data["token"] if data["token"]
279
-
284
+ token = data['token'] if data['token']
285
+
280
286
  unless token
281
- return build_response(400, 'Required data fields are missing from JSON data body!')
287
+ return build_response(400, 'Required data fields are missing from JSON data body!')
282
288
  end
283
289
 
284
290
  begin
285
291
  Reedb::Vault::close_vault(vault_uuid, token)
286
-
292
+
287
293
  rescue VaultNotAvailableError => e
288
294
  return build_response(404, e.message)
289
295
 
@@ -298,14 +304,13 @@ class ReedbHandler < Sinatra::Base
298
304
  end
299
305
 
300
306
  return build_response(200, "Vault #{vault_uuid} successfully closed.")
301
-
302
307
  end
303
308
 
304
309
  # [AUTH] Request headers for a vault with token/ id
305
310
  post '/vaults/*/headers' do
306
311
  vault_uuid = params[:splat][0]
307
312
 
308
- if vault_uuid == nil
313
+ if vault_uuid == nil
309
314
  return build_response(400, 'Missing vault access id.')
310
315
  end
311
316
 
@@ -319,20 +324,20 @@ class ReedbHandler < Sinatra::Base
319
324
  begin
320
325
  data = JSON.parse(request.body.read)
321
326
  rescue
322
- return build_response(400, 'JSON data was malformed!')
327
+ return build_response(400, 'JSON data was malformed!')
323
328
  end
324
329
 
325
330
  token = data["token"] if data["token"]
326
331
  search = data["search"] if data["search"]
327
332
 
328
333
  if token == nil
329
- return build_response(400, 'Required data fields are missing from JSON data body!')
334
+ return build_response(400, 'Required data fields are missing from JSON data body!')
330
335
  end
331
336
 
332
337
  headers = nil
333
338
  begin
334
339
  headers = Reedb::Vault::access_headers(vault_uuid, token, search)
335
-
340
+
336
341
  rescue VaultNotAvailableError => e
337
342
  return build_response(404, e.message)
338
343
 
@@ -350,11 +355,11 @@ class ReedbHandler < Sinatra::Base
350
355
  end
351
356
 
352
357
  # [AUTH] Return body of a file
353
- post '/vaults/*/files/*' do
358
+ post '/vaults/*/files/*/body' do
354
359
  vault_uuid = params[:splat][0]
355
360
  file_id = params[:splat][1]
356
361
 
357
- unless vault_uuid
362
+ unless vault_uuid
358
363
  return build_response(400, 'Missing vault access id.')
359
364
  end
360
365
 
@@ -368,21 +373,16 @@ class ReedbHandler < Sinatra::Base
368
373
  begin
369
374
  data = JSON.parse(request.body.read)
370
375
  rescue
371
- return build_response(400, 'JSON data was malformed!')
376
+ return build_response(400, 'JSON data was malformed!')
372
377
  end
373
378
 
374
- token = data["token"].delete!("\n") if data["token"]
379
+ token = data['token'] if data['token']
375
380
 
376
- puts "#{token}\n"
377
- puts "#{Reedb::Config::Master::dump_config}\n"
378
-
379
- unless token
380
- return build_response(400, 'Required data fields are missing from JSON data body!')
381
- end
381
+ return build_response(400, 'Required data fields are missing from JSON data body!') if token == nil
382
382
 
383
383
  file = nil
384
384
  begin
385
- file = Reedb::Vault::access_file(vault_uuid, file_id, token, false)
385
+ file = Reedb::Vault::access_file(vault_uuid, token, file_id, false)
386
386
  rescue FileNotFoundError => e
387
387
  return build_response(404, e.message)
388
388
 
@@ -396,7 +396,7 @@ class ReedbHandler < Sinatra::Base
396
396
  return build_response(403, e.message)
397
397
 
398
398
  end
399
- return build_response(200, "File read without version history", file)
399
+ return build_response(200, 'File read without version history', file)
400
400
  end
401
401
 
402
402
  # [AUTH] Return history of a file
@@ -404,7 +404,7 @@ class ReedbHandler < Sinatra::Base
404
404
  vault_uuid = params[:splat][0]
405
405
  file_id = params[:splat][1]
406
406
 
407
- unless vault_uuid
407
+ unless vault_uuid
408
408
  return build_response(400, 'Missing vault access id.')
409
409
  end
410
410
 
@@ -418,21 +418,18 @@ class ReedbHandler < Sinatra::Base
418
418
  begin
419
419
  data = JSON.parse(request.body.read)
420
420
  rescue
421
- return build_response(400, 'JSON data was malformed!')
421
+ return build_response(400, 'JSON data was malformed!')
422
422
  end
423
423
 
424
- token = data["token"].delete!("\n") if data["token"]
425
-
426
- puts "#{token}\n"
427
- puts "#{Reedb::Config::Master::dump_config}\n"
424
+ token = data['token'] if data['token']
428
425
 
429
426
  unless token
430
- return build_response(400, 'Required data fields are missing from JSON data body!')
427
+ return build_response(400, 'Required data fields are missing from JSON data body!')
431
428
  end
432
429
 
433
430
  file = nil
434
431
  begin
435
- file = Reedb::Vault::access_file(vault_uuid, file_id, token, true)
432
+ file = Reedb::Vault::access_file(vault_uuid, token, file_id, true)
436
433
  rescue FileNotFoundError => e
437
434
  return build_response(404, e.message)
438
435
 
@@ -453,7 +450,7 @@ class ReedbHandler < Sinatra::Base
453
450
  put '/vaults/*/files' do
454
451
  vault_uuid = params[:splat][0]
455
452
 
456
- unless vault_uuid
453
+ unless vault_uuid
457
454
  return build_response(400, 'Missing vault access id.')
458
455
  end
459
456
 
@@ -467,39 +464,39 @@ class ReedbHandler < Sinatra::Base
467
464
  begin
468
465
  data = JSON.parse(request.body.read)
469
466
  rescue
470
- return build_response(400, 'JSON data was malformed!')
467
+ return build_response(400, 'JSON data was malformed!')
471
468
  end
472
469
 
473
- token = data["token"] if data["token"]
474
- name = data["name"] if data["name"]
475
- file_data = data["data"] if data["data"]
470
+ token = data['token'] if data['token']
471
+ name = data['name'] if data['name']
472
+ file_data = data['data'] if data['data']
476
473
 
477
- unless token && name && file_data
478
- return build_response(400, 'Required data fields are missing from JSON data body!')
474
+ if token == nil || name == nil || file_data == nil
475
+ return build_response(400, 'Required data fields are missing from JSON data body!')
479
476
  end
480
477
 
481
478
  headers = Reedb::Vault::access_headers(vault_uuid, token, nil)
482
- unless headers.include?(name)
483
- return build_response(400, "File already exists. Use update POST instead.")
484
- end
479
+ return build_response(400, 'File already exists. Use update POST instead.') if headers.include?(name)
485
480
 
486
- response = nil
487
481
  begin
488
- response = Reedb::Vault::insert(vault_uuid, token, name, file_data)
482
+ Reedb::Vault::insert(vault_uuid, token, name, file_data)
489
483
  rescue VaultNotAvailableError => e
490
484
  return build_response(404, e.message)
491
-
485
+
492
486
  rescue UnknownTokenError => e
493
487
  return build_response(401, e.message)
494
-
488
+
495
489
  rescue UnautherisedTokenError => e
496
490
  return build_response(403, e.message)
497
-
491
+
498
492
  rescue FileBusyError => e
499
493
  return build_response(418, "Dont take this error code too seriously: #{e.message}")
500
494
  end
501
495
 
502
- return build_response(200, "File successfully created!")
496
+ headers = Reedb::Vault::access_headers(vault_uuid, token, nil)
497
+
498
+ # Adds the file name as a handle to the payload so that it can be referenced in a future request
499
+ return build_response(200, 'File successfully created!', { 'file_handle' => headers[name]['name'] })
503
500
  end
504
501
 
505
502
  # [AUTH] Update file contents
@@ -507,7 +504,7 @@ class ReedbHandler < Sinatra::Base
507
504
  vault_uuid = params[:splat][0]
508
505
  file_name = params[:splat][1]
509
506
 
510
- unless vault_uuid
507
+ unless vault_uuid
511
508
  return build_response(400, 'Missing vault access id.')
512
509
  end
513
510
 
@@ -521,14 +518,14 @@ class ReedbHandler < Sinatra::Base
521
518
  begin
522
519
  data = JSON.parse(request.body.read)
523
520
  rescue
524
- return build_response(400, 'JSON data was malformed!')
521
+ return build_response(400, 'JSON data was malformed!')
525
522
  end
526
523
 
527
- token = data["token"] if data["token"]
528
- file_data = data["data"] if data["data"]
524
+ token = data['token'] if data['token']
525
+ file_data = data['data'] if data['data']
529
526
 
530
- unless token && file_data
531
- return build_response(400, 'Required data fields are missing from JSON data body!')
527
+ if token == nil || file_data == nil
528
+ return build_response(400, 'Required data fields are missing from JSON data body!')
532
529
  end
533
530
 
534
531
  begin
@@ -536,18 +533,18 @@ class ReedbHandler < Sinatra::Base
536
533
 
537
534
  rescue VaultNotAvailableError => e
538
535
  return build_response(404, e.message)
539
-
536
+
540
537
  rescue UnknownTokenError => e
541
538
  return build_response(401, e.message)
542
-
539
+
543
540
  rescue UnautherisedTokenError => e
544
541
  return build_response(403, e.message)
545
-
542
+
546
543
  rescue FileBusyError => e
547
544
  return build_response(418, "Dont take this error code too seriously: #{e.message}")
548
545
  end
549
546
 
550
- return build_response(200, "File successfully updated!")
547
+ return build_response(200, 'File successfully updated!')
551
548
  end
552
549
 
553
550
  # [AUTH] Removes a file
@@ -555,7 +552,7 @@ class ReedbHandler < Sinatra::Base
555
552
  vault_uuid = params[:splat][0]
556
553
  file_name = params[:splat][1]
557
554
 
558
- unless vault_uuid
555
+ unless vault_uuid
559
556
  return build_response(400, 'Missing vault access id.')
560
557
  end
561
558
 
@@ -569,14 +566,14 @@ class ReedbHandler < Sinatra::Base
569
566
  begin
570
567
  data = JSON.parse(request.body.read)
571
568
  rescue
572
- return build_response(400, 'JSON data was malformed!')
569
+ return build_response(400, 'JSON data was malformed!')
573
570
  end
574
571
 
575
- token = data["token"] if data["token"]
572
+ token = data['token'] if data['token']
576
573
 
577
574
  begin
578
575
  Reedb::Vault::remove(vault_uuid, token, file_name)
579
-
576
+
580
577
  rescue FileNotFoundError, VaultNotAvailableError => e
581
578
  return build_response(404, e.message)
582
579
 
@@ -587,31 +584,51 @@ class ReedbHandler < Sinatra::Base
587
584
  return build_response(403, e.message)
588
585
  end
589
586
 
590
- return build_response(200, "File successfully deleted.")
587
+ return build_response(200, 'File successfully deleted.')
591
588
  end
592
589
  end
593
590
 
594
- options = {}
591
+ @options = {}
595
592
 
596
593
  # Setting default options
597
- options[:pw_length] = 12
598
- options[:verbose] = false
599
- options[:daemon] = true
600
- options[:port] = Reedb::NET_PORT
601
- options[:os] = Reedb::Utilities::parse_os
602
- options[:path] = Reedb::DEF_MASTER_PATH
603
-
604
- #create parsers
594
+ @options[:pw_length] = 12
595
+ @options[:verbose] = false
596
+ @options[:daemon] = true
597
+ @options[:port] = Reedb::NET_PORT
598
+ @options[:os] = Reedb::Utilities::parse_os
599
+ @options[:path] = Reedb::DEFAULT_PATH
600
+ @options[:dave] = false
601
+ @options[:force] = false
602
+
603
+ # Create argument parsers and handle them
605
604
  opts = OptionParser.new
606
- opts.on('-l', '--pw-length INTEGER') { |o| options[:pw_length] = o }
607
- opts.on('-p', '--port INTEGER') { |o| options[:port] = o }
608
- opts.on('-v', '--verbose') { options[:verbose] = true }
609
- opts.on('-d', '--no-daemon') { options[:daemon] = false }
610
- opts.on('-a', '--app-path STRING') { |o| options[:path] = o }
605
+ opts.on('-l', '--pw-length INTEGER') { |o| @options[:pw_length] = o }
606
+ opts.on('-p', '--port INTEGER') { |o| @options[:port] = o }
607
+ opts.on('-v', '--verbose') { @options[:verbose] = true }
608
+ opts.on('-f', '--force') { @options[:force] = true }
609
+ opts.on('--dave') { @options[:dave] = true }
610
+ opts.on('-d', '--no-daemon') { @options[:daemon] = false }
611
+ opts.on('-a', '--app-path STRING') { |o| @options[:path] = o }
611
612
  opts.parse! unless ARGV == []
612
613
 
613
- # This creates the Reedb module and binds it to a variable to be interacted with in the future
614
- Reedb::Core::init({:os => options[:os], :pw_length => options[:pw_length],
615
- :daemon => options[:daemon], :verbose => options[:verbose], :path => options[:path]})
614
+ # Define what to do when that evil SIGTERM comes
615
+ at_exit { Reedb::Core::terminate('root', true) }
616
+
616
617
  # Next up we start the HTTP server and that's that. We're up and running :)
617
- Rack::Handler::WEBrick.run(ReedbHandler.new, {:Port => options[:port], :BindAddress => "localhost"})
618
+ def http_server
619
+ Rack::Handler::WEBrick.run(ReedbHandler.new, { :Port => @options[:port], :BindAddress => 'localhost' })
620
+ end
621
+
622
+ # This creates the Reedb module and binds it to a variable to be interacted with in the future
623
+ # Gives more information to the core classes than they need
624
+
625
+ begin
626
+ Reedb::Core::init(@options) { http_server }
627
+ rescue Interrupt => e
628
+ puts e.message
629
+ puts 'User interrupt fired! Abandon ship...abandon ship!\n'
630
+ puts 'Waiting for background threads to die...'
631
+ Reedb::Core::terminate('user', true)
632
+ puts "Exit code #{Reedb::EXIT_PANIC_INTERUPT}"
633
+ exit(Reedb::EXIT_PANIC_INTERUPT)
634
+ end