activestorage-horcrux 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5e3f1b44e9be312f76b1f54bc9aac82d024b8c48110508e746b27e3c524e7636
4
- data.tar.gz: cef3c2477017ed6228d4bcdad96a5b647c74695de257582d7723e8105cb502cd
3
+ metadata.gz: 8709676589bd8ed4406d3e0c9ffc2e7beede65830f37c707a2b6c1061bb3f8e3
4
+ data.tar.gz: 94c9b7508e4c5648bc9a9d2761ea0447c6537d6122aca3aeaeadecb425fd608b
5
5
  SHA512:
6
- metadata.gz: 149fc099063b20a0f14f28dda79ec41b23f0e90bd160fec681908fe12c6afcd50c7273164389b5f9a0fccd8f33a7054a51ab649e92fab92c3cad6355ffecf511
7
- data.tar.gz: 6a678681feb0b3de7e6273bc8cdd2ad4769ee681916d8fa49e8796a318c5b6c38b2251c908d4793cca09999e6e5b790cf954620cddfafb416a3955c6fefbbac4
6
+ metadata.gz: a3b0831c200ec394f04288cd8d245130de0227d67f7870b6b92ed5f3bbab2c33844cc38c4bb40acdc7a073056b3b4a109009d11f946d845b2c68fe5d89b93aa4
7
+ data.tar.gz: 1c2569bee9f9f2dac190df90b5777e9a11b831c70ed4ed2a419e4f5d34de384d409e8eb09dafc64e6445672507b4f3fd1a71906b61f2a3f31622388968e5910e
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- activestorage-horcrux (0.0.1)
4
+ activestorage-horcrux (0.0.3)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -1,9 +1,10 @@
1
1
  [![Build Status](https://travis-ci.org/johncallahan/activestorage-horcrux.svg?branch=master)](https://travis-ci.org/johncallahan/activestorage-horcrux)
2
2
 
3
- An ActiveStorage gem that uploads across one or more other
4
- ActiveStorage services using Shamir Secret Sharing (via the [tss-rb
5
- gem](https://github.com/grempe/tss-rb)). Use it in your storage.yml
6
- file. It is not a mirror, but can be named as a storage service.
3
+ An ActiveStorage service option that uploads shares *across* one or
4
+ more other storage services using Shamir Secret Sharing (via the
5
+ [tss-rb gem](https://github.com/grempe/tss-rb)). Use it in your
6
+ storage.yml file. It is not a mirror, but can be named as a storage
7
+ service.
7
8
 
8
9
  ```ruby
9
10
  # in storage.yml
@@ -19,17 +20,46 @@ horcrux:
19
20
  service: Horcrux
20
21
  shares: 5
21
22
  threshold: 3
23
+ prefix: true
22
24
  services: [ disk1, disk2 ]
23
25
  ```
24
26
 
25
- Configuration elements:
27
+ # Configuration elements:
26
28
 
27
29
  * service: name of the service
28
- * shares: specified the number of shares split across services.
29
- * threshold: specifies the _minimum_ number of shares are needed to
30
- reconstruct the contents.
30
+ * shares: (integer) specified the number of shares split across services.
31
+ * threshold: (integer) specifies the _minimum_ number of shares are needed to reconstruct the contents.
32
+ * prefix: (boolean) prefix the key with the name of the service
31
33
  * services: one or more other ActiveStorage services in storage.yml
32
34
 
33
- Instead of a single key, an array of keys is passed to the upload
34
- function. The array of keys is not persisted and can be shown to the
35
- user for subsequent downloads.
35
+ After upload, the blob key is replaced with a comma-separated list of
36
+ keys for each shard. You can retrieve the blob key(s) and then
37
+ replace it to hide the share keys (but remember to save them
38
+ someplace!). Later, you can change the key(s) back again and download
39
+ the attachment shares (using at least threshold number of keys).
40
+
41
+ # Demo
42
+
43
+ Compatible with the [lockbox gem](https://github.com/ankane/lockbox). See this [demo example](https://github.com/johncallahan/activestorage-horcrux-example).
44
+
45
+ # Testing
46
+
47
+ ```shell
48
+ % rspec
49
+ ```
50
+
51
+ # Development
52
+
53
+ Bump the version in lib/active_storage/service/version.rb and then
54
+
55
+ ```shell
56
+ % bundle
57
+ % gem build activestorage-horcrux
58
+ % gem push activestorage-horcrux-0.0.x.gem
59
+ ```
60
+
61
+ # To-do/Issues
62
+
63
+ * using Tempfile for passing back keys (yuck)
64
+ * size limitations (by the tss-rb gem)
65
+ * intercept and convert TSS errors to gem-specific errors
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'tss'
4
4
  require 'base64'
5
- require "active_support/core_ext/module/delegation"
5
+ require 'active_support/core_ext/module/delegation'
6
6
 
7
7
  # frozen_string_literal: true
8
8
 
@@ -15,21 +15,31 @@ module ActiveStorage
15
15
  base64Data = Base64.encode64(data)
16
16
  shards = TSS.split(secret: base64Data,threshold: @threshold,num_shares: @shares)
17
17
  i = 0
18
+ main_key = ""
18
19
  servicesamples = []
19
- file = Tempfile.new(key,"/tmp")
20
20
  while i < shards.count
21
21
  if servicesamples.empty?
22
22
  servicesamples = services[0..-1]
23
23
  end
24
24
  svc = servicesamples.sample
25
25
  shardkey = SecureRandom.base58(key.length)
26
- shardkey = svc[:name] + ':' + shardkey if prefix
27
- svc[:service].upload shardkey, StringIO.new(shards[i]), checksum: nil, **options
28
- file.write("#{shardkey},")
26
+
27
+ scblob = Class.new Blob
28
+ scblob.service = svc[:service]
29
+ iofile = Tempfile.new(shardkey,"/tmp")
30
+ iofile.write(shards[i])
31
+ iofile.rewind
32
+ myblob = scblob.create_and_upload! io:iofile, filename: ""
33
+ iofile.close
34
+ iofile.unlink
35
+
36
+ main_key = main_key + "#{myblob.reload.key},"
29
37
  servicesamples.delete(svc)
30
38
  i = i + 1
31
39
  end
32
- file.close
40
+ main_blob = Blob.find_by_key(key)
41
+ main_blob.key = main_key
42
+ main_blob.save!
33
43
  end
34
44
 
35
45
  def download(keys,&block)
@@ -39,11 +49,23 @@ module ActiveStorage
39
49
  while i < shardkeys.count
40
50
  j = 0
41
51
  while j < services.count
42
- if services[j][:service].exist?(shardkeys[i])
43
- shards << services[j][:service].download(shardkeys[i])
52
+ begin
53
+ if services[j][:service].exist?(shardkeys[i])
54
+ shard = services[j][:service].download(shardkeys[i])
55
+ shards << shard
56
+ break
57
+ end
58
+ j = j + 1
59
+ rescue NotImplementedError
60
+ begin
61
+ shard = services[j][:service].download(shardkeys[i]).to_s
62
+ shards << shard
63
+ break
64
+ rescue RestClient::BadRequest
65
+ j = j + 1
66
+ end
44
67
  end
45
- j = j + 1
46
- end
68
+ end
47
69
  i = i + 1
48
70
  end
49
71
  secret = TSS.combine(shares: shards)
@@ -1,5 +1,5 @@
1
1
  module ActiveStorage
2
2
  module HorcruxService
3
- VERSION = '0.0.2'.freeze
3
+ VERSION = '0.0.3'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activestorage-horcrux
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Callahan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-16 00:00:00.000000000 Z
11
+ date: 2020-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler