shredder 0.2.0 → 1.0.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 86de11dca31147b96703885615c3727a7256bda2
4
+ data.tar.gz: 10147305bd2892e76a56b5ad8378f52470c4be5d
5
+ SHA512:
6
+ metadata.gz: 5f19a35eb7ba38592f328f0d87e93401ae528b470c6046d81ace2d4b0dfbaf1db2e8a07df8d41a2a2e86091d7969d52e51889d78988037cc53c71b3d7aeb83a4
7
+ data.tar.gz: cfb6ccd2fcecd29df7a02c24caba969a06e7025ea8b82c2af782d1aa5a2c994c1eb2dff806e0e31169c426ae904ef07af6bb90c1f9c015c17e759fbd010f7ac0
File without changes
@@ -0,0 +1,58 @@
1
+ = shredder
2
+
3
+ github :: https://www.github.com/carlosjhr64/shredder
4
+ rubygems :: https://rubygems.org/gems/shredder
5
+
6
+ == DESCRIPTION:
7
+
8
+ Shred a file into file fragments, and join fragments back into a restored file.
9
+
10
+ Disperse file shreds in separate depositories
11
+ so that no one depository has the entire file.
12
+
13
+ == SYNOPSIS
14
+
15
+ Command line:
16
+
17
+ $ shredder --help
18
+ $ shredder --shred file.orig file.1 file.2
19
+ $ shredder --sew file.sewed file.1 file.2
20
+ $ cat file.orig | shredder --shred --io file.1 file.2
21
+ $ shredder --sew --io file.1 file.2 > file.sewed
22
+
23
+ Library:
24
+
25
+ require 'shredder'
26
+ # ...
27
+ shredder = SHREDDER:Shredder.new
28
+ shredder.shred('orinal.txt', 'shred.1', 'shred.2')
29
+ shredder.sew( 'sewed.txt', 'shred.1', 'shred.2')
30
+
31
+ == INSTALL:
32
+
33
+ $ sudo gem install shredder
34
+
35
+ == LICENSE:
36
+
37
+ (The MIT License)
38
+
39
+ Copyright (c) 2014 CarlosJHR64
40
+
41
+ Permission is hereby granted, free of charge, to any person obtaining
42
+ a copy of this software and associated documentation files (the
43
+ 'Software'), to deal in the Software without restriction, including
44
+ without limitation the rights to use, copy, modify, merge, publish,
45
+ distribute, sublicense, and/or sell copies of the Software, and to
46
+ permit persons to whom the Software is furnished to do so, subject to
47
+ the following conditions:
48
+
49
+ The above copyright notice and this permission notice shall be
50
+ included in all copies or substantial portions of the Software.
51
+
52
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
53
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
54
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
55
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
56
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
57
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
58
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,7 @@
1
+ == TODO
2
+
3
+ Implement the --yes, --no, and --force options.
4
+
5
+ == File List
6
+
7
+
@@ -1,84 +1,43 @@
1
1
  #!/usr/bin/env ruby
2
- require 'shredder'
3
- raise "Need Shredder version ~> 0.1" if Shredder::VERSION < '0.1'
4
2
 
5
- # Command line utility
6
- class CommandLine
7
- def self.version
8
- puts Shredder::VERSION
9
- exit(0)
10
- end
3
+ # Gems:
4
+ require 'help_parser'
11
5
 
12
- def self.help
13
- puts <<EOT
14
- shredder --shred sewed_file shred_file1 shred_file2... # shred a file to shreds
15
- shredder --io --shred shred_file1 shred_file2... # shred stdin to shreds
16
- shredder --sew sewed_file shred_file1 shred_file2... # sew shreds back to file
17
- shredder --io --sew shred_file1 shred_file2... # sew shreds out to stdout
18
- # --relay in sew mode will relay the first gets from stdin (used to pass on a passphrase to gpg, for example).
19
- EOT
20
- print "# VERSION: "
21
- CommandLine.version
22
- end
6
+ # This Gem:
7
+ require 'shredder'
8
+ include SHREDDER
23
9
 
24
- def self.parse_argv
25
- options = ''
26
- while ARGV[0]=~/^-/ do
27
- options += ARGV.shift
28
- end
29
- CommandLine.version if options =~ /-v\b/ || options =~ /--version\b/ # need to allow verbose below.
30
- CommandLine.help if ARGV.length==0 || options =~ /-h/
31
- $verbose = (options=~/--verbose\b/)? true : false
32
- # validate
33
- raise "--sew or --shred ?" if !(options=~/--sew\b/) && !(options=~/--shred\b/)
34
- length = ARGV.length
35
- raise "Expected sew shred1 shred2 ..." if length < 2 && !(options=~/--io\b/)
36
- raise "Expected shred1 shred2..." if length < 1
37
- return options
38
- end
10
+ NAME = File.basename $0 # Program Name
11
+ HELP = <<HELP
12
+ Usage: #{NAME} [options] [file] shred1 shred2...
13
+ Options:
14
+ -r --shred Shred a file to shreds.
15
+ -w --sew Sew shreds back to file.
16
+ -s --io Shreds/sews from/to stdin/stdout respectively.
17
+ --relay Relay first stdin gets to stdout puts.
39
18
 
40
- def initialize
41
- options = CommandLine.parse_argv
42
- @shredding = (options=~/--shred\b/)? true : false
43
- @relay = (options=~/--relay\b/)? true : false
44
- if options=~/--io/ then
45
- if @shredding then
46
- @sew = $stdin
47
- @shreds = ARGV.map{|filename| File.open(filename,'w')} # WRITE SHREDS
48
- else
49
- @sew = $stdout
50
- @shreds = ARGV.map{|filename| File.open(filename,'r')} # READ SHREDS
51
- end
52
- else
53
- @sew = ARGV.shift
54
- @shreds = ARGV
55
- end
56
- end
19
+ -h --help Puts this help and exits.
20
+ -v --version Puts version and exits.
57
21
 
58
- def execute
59
- shredder = (@sew.class == String)? Shredder::Files.new(@sew,@shreds): Shredder::Streams.new(@sew,@shreds)
60
- begin
61
- if @shredding then
62
- shredder.shred
63
- else
64
- if @relay && (passphrase = $stdin.gets) then
65
- # In a typical situation, we may be asked to relay a passphrase
66
- $stdout.puts passphrase
67
- end
68
- shredder.sew
69
- end
70
- rescue StandardError
71
- $stderr.puts $!
72
- $stderr.puts $!.backtrace if $verbose
73
- ensure
74
- @shreds.each{|filehandle| filehandle.close} if !(@sew.class == String)
75
- end
76
- end
77
- end
22
+ -f --force These are not implemented yet,
23
+ --yes but are defined to provide
24
+ --no a symmetry with commands like gpg.
25
+ Note:
26
+ Typical use of relay is for passphrase.
27
+ Version: #{VERSION}
28
+ HELP
78
29
 
79
30
  begin
80
- CommandLine.new.execute
81
- rescue StandardError
82
- $stderr.puts $!
83
- $stderr.puts $!.backtrace if $verbose
31
+ OPTIONS = HELP_PARSER::HelpParser.new(VERSION, HELP)
32
+ OPTIONS.defaults!(:shred, false, true)
33
+ OPTIONS.defaults!(:sew, false, true)
34
+ OPTIONS.usage_error "Need choice: sew or shred?" unless OPTIONS[:sew] ^ OPTIONS[:shred] # xor
35
+ MIN = (OPTIONS[:io])? 2 : 3
36
+ OPTIONS.usage_error "Need at least 2 shreds" unless ARGV.length >= MIN
37
+ Shredder.new(OPTIONS, ARGV).execute
38
+ rescue HELP_PARSER::UsageException
39
+ puts $!.message
40
+ rescue HELP_PARSER::UsageError
41
+ STDERR.puts $!.message
42
+ exit 64
84
43
  end
@@ -0,0 +1,72 @@
1
+ @main
2
+ Feature: Main Features
3
+
4
+ Background:
5
+ * Given command "ruby -I ./lib ./bin/shredder"
6
+
7
+ Scenario: Long opt version.
8
+ * Given arguments "--version"
9
+ * When run
10
+ * Then status is "0"
11
+ * Then stderr is ""
12
+ * Then stdout is "1.0.0"
13
+
14
+ Scenario: Long opt help.
15
+ * Given arguments "--help"
16
+ * When run
17
+ * Then status is "0"
18
+ * Then stderr is ""
19
+ * Then stdout matches "^Usage: shredder"
20
+
21
+ Scenario: Can't be both sew and shred.
22
+ * Given system(rm ./temp.* 2> /dev/null)
23
+ * Given system(openssl rand -base64 32 > ./temp.txt)
24
+ * Given arguments "--sew --shred ./temp.txt ./temp.1 ./temp.2"
25
+ * When run
26
+ * Then status is "64"
27
+ * Then stderr is not ""
28
+ * Then stdout is ""
29
+ * Then stderr is "Need choice: sew or shred?"
30
+
31
+ Scenario: Needs to be either sew or shred.
32
+ * Given system(rm ./temp.* 2> /dev/null)
33
+ * Given system(openssl rand -base64 32 > ./temp.txt)
34
+ * Given arguments "./temp.txt ./temp.1 ./temp.2"
35
+ * When run
36
+ * Then status is "64"
37
+ * Then stderr is not ""
38
+ * Then stdout is ""
39
+ * Then stderr is "Need choice: sew or shred?"
40
+
41
+ Scenario: What we shred, we can sew.
42
+ * Given system(rm ./temp.* 2> /dev/null)
43
+ * Given system(openssl rand -base64 32 > ./temp.txt)
44
+ * Given arguments "--shred ./temp.txt ./temp.1 ./temp.2"
45
+ * When run
46
+ * Then status is "0"
47
+ * Then stderr is ""
48
+ * Then stdout is ""
49
+ * Then system(test -e ./temp.1)
50
+ * Then system(test -e ./temp.2)
51
+ * Given arguments "--sew ./temp.sewed ./temp.1 ./temp.2"
52
+ * When run
53
+ * Then status is "0"
54
+ * Then stderr is ""
55
+ * Then stdout is ""
56
+ * Then system(test -e ./temp.sewed)
57
+ # temp.txt and temp.sewed are equal
58
+ * Then system(diff temp.txt temp.sewed > /dev/null)
59
+ # Just a sanity check temp.1 and temp.2 are not equal
60
+ * Then not system(diff temp.1 temp.2 > /dev/null)
61
+
62
+ Scenario: What we shred from stdin, we can sew to stdout. And using 3 shreds to boot!
63
+ * Given system(rm ./temp.* 2> /dev/null)
64
+ * Given system(openssl rand -base64 32 > ./temp.txt)
65
+ * Given system(cat ./temp.txt | ruby -I ./lib ./bin/shredder --shred --io ./temp.1 ./temp.2 ./temp.3)
66
+ * Then system(test -e ./temp.3)
67
+ * Given system(ruby -I ./lib ./bin/shredder --sew --io ./temp.1 ./temp.2 ./temp.3 > ./temp.sewed)
68
+ * Then system(test -e ./temp.sewed)
69
+ * Then system(diff temp.txt temp.sewed > /dev/null)
70
+
71
+ # Let's clean up after ourselves...
72
+ * Given system(rm ./temp.* 2> /dev/null)
@@ -0,0 +1,77 @@
1
+ require 'open3'
2
+
3
+ # Requires:
4
+ #`bash`
5
+
6
+ H = {}
7
+
8
+ def _capture3(command)
9
+ stdout, stderr, status = Open3.capture3(command)
10
+ H['status'] = status.exitstatus
11
+ H['stdout'] = stdout.chomp
12
+ H['stderr'] = stderr.chomp
13
+ end
14
+
15
+ def _given(condition)
16
+ case condition
17
+ when /^(\w+) "([^"]*)"$/
18
+ H[$1] = $2
19
+ when /^system\(([^\(\)]*)\)$/
20
+ system($1)
21
+ else
22
+ raise "Unrecognized Given-Statement"
23
+ end
24
+ end
25
+
26
+ def _when(condition)
27
+ case condition
28
+ when 'run'
29
+ command, arguments = H['command'], H['arguments']
30
+ raise 'Need command and argurments to run' unless command and arguments
31
+ _capture3("#{command} #{arguments}")
32
+ when /^run\(([^\(\)]*)\)$/
33
+ _capture3($1)
34
+ else
35
+ raise "Unrecognized When-Statement"
36
+ end
37
+ end
38
+
39
+ def _then(condition)
40
+ case condition
41
+ when /^(not )?system\(([^\(\)]*)\)$/
42
+ neg, cmd = $1, $2
43
+ ok = system(cmd)
44
+ ok = !ok if neg
45
+ raise "System Call Error" unless ok
46
+ when /^(\w+) (\w+)( not)? "([^"]*)"$/
47
+ key, cmp, negate, expected = $1, $2, $3, $4
48
+ actual = H[key].to_s
49
+ ok = case cmp
50
+ when 'is'
51
+ actual == expected
52
+ when 'matches'
53
+ expected = Regexp.new(expected)
54
+ actual =~ expected
55
+ else
56
+ raise "Unrecognized Comparison Operator"
57
+ end
58
+ ok = !ok if negate
59
+ raise "Got #{actual} for #{key}" unless ok
60
+ else
61
+ raise "Unrecognized Then-Statement"
62
+ end
63
+ end
64
+
65
+ Given /^(\w+) (.*)$/ do |given, condition|
66
+ condition.strip!
67
+ case given
68
+ when 'Given'
69
+ _given(condition)
70
+ when 'When'
71
+ _when(condition)
72
+ when 'Then'
73
+ _then(condition)
74
+ else
75
+ raise "'#{given}' form not defined."
76
+ end
77
+ end
@@ -1,35 +1,8 @@
1
- module Shredder
2
- VERSION = '0.2.0'
1
+ require 'shredder/version'
2
+ require 'shredder/functions'
3
+ require 'shredder/files'
4
+ require 'shredder/streams'
5
+ require 'shredder/shredder'
3
6
 
4
- # note that these are streams
5
- def self.shred(reader,writers,limit=0)
6
- shreds = writers.length
7
- xor = count = 0
8
- while byte = reader.getbyte do
9
- writers[ count % shreds ].putc byte^xor
10
- xor = byte
11
- count += 1
12
- # note: will not break if limit is zero
13
- break if count == limit
14
- end
15
- return count
16
- end
17
-
18
- # note that these are streams
19
- def self.sew(writer,readers,limit=0)
20
- shreds = readers.length
21
- xor = count = 0
22
- while byte = readers[ count % shreds ].getbyte do
23
- chr = byte^xor
24
- xor = chr
25
- writer.putc chr
26
- count += 1
27
- # note: will not break if limit is zero
28
- break if count == limit
29
- end
30
- return count
31
- end
32
-
33
- autoload :Files, 'shredder/files'
34
- autoload :Streams, 'shredder/streams'
35
- end
7
+ # Requires:
8
+ #`ruby`
@@ -1,20 +1,23 @@
1
- module Shredder
1
+ module SHREDDER
2
+
2
3
  class Files
4
+ extend Functions
5
+
3
6
  # this one takes filenames
4
- def initialize(sew,shreds,limit=0)
5
- @sew = sew
7
+ def initialize(sew, shreds, limit=0)
8
+ @sew = sew
6
9
  @shreds = shreds
7
- @limit = limit
10
+ @limit = limit
8
11
  end
9
12
 
10
13
  def shred(limit=@limit)
11
- reader = File.open(@sew,'r')
14
+ reader = File.open(@sew, 'r')
12
15
  writers = []
13
- @shreds.each{|shred| writers.push( File.open(shred,'wb') ) }
16
+ @shreds.each{|shred| writers.push(File.open(shred, 'wb'))}
14
17
 
15
18
  count = nil
16
19
  begin
17
- count = Shredder.shred( reader, writers, limit )
20
+ count = Files.shred(reader, writers, limit)
18
21
  rescue Exception
19
22
  raise $!
20
23
  ensure
@@ -26,13 +29,13 @@ module Shredder
26
29
  end
27
30
 
28
31
  def sew(limit=@limit)
29
- writer = File.open(@sew,'wb')
32
+ writer = File.open(@sew, 'wb')
30
33
  readers = []
31
- @shreds.each{|shred| readers.push( File.open(shred,'r') ) }
34
+ @shreds.each{|shred| readers.push(File.open(shred, 'r'))}
32
35
 
33
36
  count = nil
34
37
  begin
35
- count = Shredder.sew( writer, readers, limit )
38
+ count = Files.sew(writer, readers, limit)
36
39
  rescue Exception
37
40
  raise $!
38
41
  ensure
@@ -42,5 +45,7 @@ module Shredder
42
45
 
43
46
  return count
44
47
  end
48
+
45
49
  end
50
+
46
51
  end
@@ -0,0 +1,36 @@
1
+ module SHREDDER
2
+
3
+ module Functions
4
+
5
+ # note that these are streams
6
+ def shred(reader, writers, limit=0)
7
+ shreds = writers.length
8
+ xor = count = 0
9
+ while byte = reader.getbyte do
10
+ writers[ count % shreds ].putc byte^xor
11
+ xor = byte
12
+ count += 1
13
+ # note: will not break if limit is zero
14
+ break if count == limit
15
+ end
16
+ return count
17
+ end
18
+
19
+ # note that these are streams
20
+ def sew(writer, readers, limit=0)
21
+ shreds = readers.length
22
+ xor = count = 0
23
+ while byte = readers[ count % shreds ].getbyte do
24
+ chr = byte^xor
25
+ xor = chr
26
+ writer.putc chr
27
+ count += 1
28
+ # note: will not break if limit is zero
29
+ break if count == limit
30
+ end
31
+ return count
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,46 @@
1
+ module SHREDDER
2
+
3
+ class Shredder
4
+
5
+ attr_reader :shreds, :sewed
6
+ def initialize(options={}, shreds=[], sewed=nil)
7
+ @shreds, @sewed = shreds, sewed
8
+ @shred = options[:shred]
9
+ @relay = options[:relay]
10
+ if @sewed.nil?
11
+ if options[:io]
12
+ @sewed = (@shred)? STDIN : STDOUT
13
+ else
14
+ @sewed = @shreds.shift
15
+ end
16
+ end
17
+ end
18
+
19
+ def execute(sewed=@sewed, shreds=@shreds, shred=@shred)
20
+ stream = false
21
+ if sewed.kind_of?(IO)
22
+ stream = true
23
+ rw = (shred)? 'w' : 'r'
24
+ shreds = shreds.map{|filename| File.open(filename, rw)}
25
+ end
26
+
27
+ shredder = (stream)? Shredder::Streams.new(sewed, shreds) : Shredder::Files.new(sewed, shreds)
28
+ STDOUT.puts STDIN.gets if @relay
29
+ begin
30
+ (shred)? shredder.shred : shredder.sew
31
+ ensure
32
+ shreds.each{|filehandle| filehandle.close} if stream
33
+ end
34
+ end
35
+
36
+ def shred(sewed, *shreds)
37
+ execute(sewed, shreds, true)
38
+ end
39
+
40
+ def sew(sewed, *shreds)
41
+ execute(sewed, shreds, false)
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -1,18 +1,23 @@
1
- module Shredder
1
+ module SHREDDER
2
+
2
3
  class Streams
4
+ extend Functions
5
+
3
6
  # this one takes streams
4
- def initialize(sew,shreds,limit=0)
5
- @sew = sew
7
+ def initialize(sew, shreds, limit=0)
8
+ @sew = sew
6
9
  @shreds = shreds
7
- @limit = limit
10
+ @limit = limit
8
11
  end
9
12
 
10
13
  def shred(limit=@limit)
11
- Shredder.shred(@sew,@shreds,limit)
14
+ Streams.shred(@sew,@shreds,limit)
12
15
  end
13
16
 
14
17
  def sew(limit=@limit)
15
- Shredder.sew(@sew,@shreds,limit)
18
+ Streams.sew(@sew,@shreds,limit)
16
19
  end
20
+
17
21
  end
22
+
18
23
  end
@@ -0,0 +1,5 @@
1
+ module SHREDDER
2
+
3
+ VERSION = '1.0.0'
4
+
5
+ end
@@ -0,0 +1,55 @@
1
+ Gem::Specification.new do |s|
2
+
3
+ s.name = 'shredder'
4
+ s.version = '1.0.0'
5
+
6
+ s.homepage = 'https://github.com/carlosjhr64/shredder'
7
+
8
+ s.author = 'CarlosJHR64'
9
+ s.email = 'carlosjhr64@gmail.com'
10
+
11
+ s.date = '2014-01-11'
12
+ s.licenses = ['MIT']
13
+
14
+ s.description = <<DESCRIPTION
15
+ Shred a file into file fragments, and join fragments back into a restored file.
16
+
17
+ Disperse file shreds in separate depositories
18
+ so that no one depository has the entire file.
19
+ DESCRIPTION
20
+
21
+ s.summary = <<SUMMARY
22
+ Shred a file into file fragments, and join fragments back into a restored file.
23
+ SUMMARY
24
+
25
+ s.extra_rdoc_files = ['README.rdoc']
26
+ s.rdoc_options = ["--main", "README.rdoc"]
27
+
28
+ s.require_paths = ["lib"]
29
+ s.files = %w(
30
+ History.txt
31
+ README.rdoc
32
+ TODO.txt
33
+ bin/shredder
34
+ features/main.feature
35
+ features/step_definitions/main_steps.rb
36
+ lib/shredder.rb
37
+ lib/shredder/files.rb
38
+ lib/shredder/functions.rb
39
+ lib/shredder/shredder.rb
40
+ lib/shredder/streams.rb
41
+ lib/shredder/version.rb
42
+ shredder.gemspec
43
+ test/test_shredder.rb
44
+ )
45
+ s.executables << 'shredder'
46
+ s.add_runtime_dependency 'help_parser', '~> 1.1', '>= 1.1.0'
47
+ s.add_development_dependency 'test-unit', '~> 2.5', '>= 2.5.5'
48
+ s.add_development_dependency 'symmetric_gpg', '~> 2.0', '>= 2.0.1'
49
+ s.requirements << 'ruby: ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-linux]'
50
+ s.requirements << 'bash in development: GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)'
51
+ s.requirements << 'system in development: linux/bash'
52
+ s.requirements << 'rm in development: rm (GNU coreutils) 8.13'
53
+ s.requirements << 'diff in development: diff (GNU diffutils) 3.2'
54
+
55
+ end
@@ -0,0 +1,140 @@
1
+ # Standard Libraries
2
+ require 'stringio'
3
+
4
+ # Gems
5
+ require 'test/unit'
6
+ begin
7
+ require 'symmetric_gpg'
8
+ GPG = true
9
+ rescue
10
+ STDERR.puts "Warning: symmetric_gpg not available for testing"
11
+ GPG = false
12
+ end
13
+
14
+ # This Gem
15
+ require 'shredder'
16
+ include SHREDDER
17
+
18
+ module TestFunction
19
+ extend Functions
20
+ end
21
+
22
+ class TestShredder < Test::Unit::TestCase
23
+
24
+ def test_version
25
+ assert_equal '1.0.0', VERSION
26
+ assert_equal '1.0.0', SHREDDER::VERSION
27
+ end
28
+
29
+ def test_functions_even
30
+ abc = "abcdefghijklmnopqrstuvwxyz"
31
+ string = StringIO.new(abc)
32
+ shred1 = StringIO.new
33
+ shred2 = StringIO.new
34
+ TestFunction.shred(string, [shred1, shred2])
35
+ string.rewind
36
+ shred1.rewind
37
+ shred2.rewind
38
+ l0, l1, l2 = string.length, shred1.length, shred2.length
39
+ assert_equal(l0, l1 + l2)
40
+ assert_equal(l1, l2)
41
+ sewed = StringIO.new
42
+ TestFunction.sew(sewed, [shred1, shred2])
43
+ sewed.rewind
44
+ assert_equal(sewed.read, abc)
45
+
46
+ # Note that the xor starts it's seed with the first letter,
47
+ # so that 'a' in the abc string remains unchanged.
48
+ # Anyways, the point of the following is to show that the shreds
49
+ # are no longer easily recognizable as part of the original string.
50
+
51
+ shred1.rewind
52
+ shred = shred1.read
53
+ assert_nil(shred=~/[b-z]/)
54
+
55
+ shred2.rewind
56
+ shred = shred2.read
57
+ assert_nil(shred=~/[b-z]/)
58
+ end
59
+
60
+ def test_functions_odd
61
+ abc = "abcdefghijklmnopqrstuvwxyz+"
62
+ string = StringIO.new(abc)
63
+ shred1 = StringIO.new
64
+ shred2 = StringIO.new
65
+ TestFunction.shred(string, [shred1, shred2])
66
+ string.rewind
67
+ shred1.rewind
68
+ shred2.rewind
69
+ l0, l1, l2 = string.length, shred1.length, shred2.length
70
+ assert_equal(l0, l1 + l2)
71
+ assert_equal(l1, l2+1)
72
+ sewed = StringIO.new
73
+ TestFunction.sew(sewed, [shred1, shred2])
74
+ sewed.rewind
75
+ assert_equal(sewed.read, abc)
76
+ end
77
+
78
+ def test_functions_three
79
+ abc = "abcdefghijklmnopqrstuvwxyz"
80
+ string = StringIO.new(abc)
81
+ shred1 = StringIO.new
82
+ shred2 = StringIO.new
83
+ shred3 = StringIO.new
84
+ TestFunction.shred(string, [shred1, shred2, shred3])
85
+ string.rewind
86
+ shred1.rewind
87
+ shred2.rewind
88
+ shred3.rewind
89
+ l0, l1, l2, l3 = string.length, shred1.length, shred2.length, shred3.length
90
+ assert_equal(l0, l1 + l2 + l3)
91
+ assert(l1>7)
92
+ assert(l2>7)
93
+ assert(l3>7)
94
+ sewed = StringIO.new
95
+ TestFunction.sew(sewed, [shred1, shred2, shred3])
96
+ sewed.rewind
97
+ assert_equal(sewed.read, abc)
98
+ end
99
+
100
+ # Most of the code is tested under cucumber.
101
+ # Just going to test an untested path.
102
+ # Shredder.new(...).execute is well tested.
103
+ # Now test Shredder.new.shred and #sew
104
+ def test_shredder
105
+ system('rm ./temp.* 2> /dev/null')
106
+ refute File.exist? './temp.sewed' # just a quick sanity check
107
+ system('openssl rand -base64 32 > ./temp.txt')
108
+ shredder = Shredder.new
109
+ # ...and just for something a bit different, 4 shreds.
110
+ shredder.shred('./temp.txt', './temp.1', './temp.2', './temp.3', './temp.4')
111
+ assert File.exist? './temp.1'
112
+ assert File.exist? './temp.2'
113
+ assert File.exist? './temp.3'
114
+ assert File.exist? './temp.4'
115
+ shredder.sew('./temp.sewed', './temp.1', './temp.2', './temp.3', './temp.4')
116
+ assert File.exist? './temp.sewed'
117
+ # The following will show the two files to be equal
118
+ assert system 'diff ./temp.txt ./temp.sewed 2> /dev/null'
119
+
120
+ system('rm ./temp.*') # cleanup after ourselves
121
+ end
122
+
123
+ def test_symmetric_gpg
124
+ if GPG
125
+ system('rm ./temp.* 2> /dev/null')
126
+ string = "A is for Apple."
127
+ shreds = SymmetricGPG::Shreds.new("Shreddelicious!", string, ['./temp.1','./temp.2'])
128
+ shreds.shredder = '/usr/local/bin/ruby -I ./lib ./bin/shredder'
129
+ shreds.shred # Should encrypt and then shred the string into shred.1 and shred.2.
130
+ assert File.exist? './temp.1'
131
+ assert File.exist? './temp.2'
132
+ shreds.plain = nil # no cheat!
133
+ plain = shreds.sew # should get the shredded string back.
134
+ assert_equal string, plain
135
+ # Cleanup after ourselves
136
+ system('rm ./temp.* 2> /dev/null')
137
+ end
138
+ end
139
+
140
+ end
metadata CHANGED
@@ -1,73 +1,131 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: shredder
3
- version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease:
6
- segments:
7
- - 0
8
- - 2
9
- - 0
10
- version: 0.2.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
11
5
  platform: ruby
12
- authors:
13
- - carlosjhr64@gmail.com
6
+ authors:
7
+ - CarlosJHR64
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2011-06-21 00:00:00 Z
19
- dependencies: []
20
-
11
+ date: 2014-01-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: help_parser
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.1'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.1.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.1'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.1.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: test-unit
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.5'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 2.5.5
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '2.5'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 2.5.5
53
+ - !ruby/object:Gem::Dependency
54
+ name: symmetric_gpg
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '2.0'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 2.0.1
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '2.0'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 2.0.1
21
73
  description: |
22
- The idea is to disperse file shreds in separate depositories
23
- such that no one depository has the entire file.
24
- Note: These are not file segments, they're shreds.
74
+ Shred a file into file fragments, and join fragments back into a restored file.
25
75
 
76
+ Disperse file shreds in separate depositories
77
+ so that no one depository has the entire file.
26
78
  email: carlosjhr64@gmail.com
27
- executables:
79
+ executables:
28
80
  - shredder
29
81
  extensions: []
30
-
31
- extra_rdoc_files: []
32
-
33
- files:
34
- - ./lib/shredder/streams.rb
35
- - ./lib/shredder/files.rb
36
- - ./lib/shredder.rb
37
- - ./README.txt
82
+ extra_rdoc_files:
83
+ - README.rdoc
84
+ files:
85
+ - History.txt
86
+ - README.rdoc
87
+ - TODO.txt
38
88
  - bin/shredder
39
- homepage: https://sites.google.com/site/carlosjhr64/rubygems/shredder
40
- licenses: []
41
-
89
+ - features/main.feature
90
+ - features/step_definitions/main_steps.rb
91
+ - lib/shredder.rb
92
+ - lib/shredder/files.rb
93
+ - lib/shredder/functions.rb
94
+ - lib/shredder/shredder.rb
95
+ - lib/shredder/streams.rb
96
+ - lib/shredder/version.rb
97
+ - shredder.gemspec
98
+ - test/test_shredder.rb
99
+ homepage: https://github.com/carlosjhr64/shredder
100
+ licenses:
101
+ - MIT
102
+ metadata: {}
42
103
  post_install_message:
43
- rdoc_options: []
44
-
45
- require_paths:
104
+ rdoc_options:
105
+ - "--main"
106
+ - README.rdoc
107
+ require_paths:
46
108
  - lib
47
- required_ruby_version: !ruby/object:Gem::Requirement
48
- none: false
49
- requirements:
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
50
111
  - - ">="
51
- - !ruby/object:Gem::Version
52
- hash: 3
53
- segments:
54
- - 0
55
- version: "0"
56
- required_rubygems_version: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
59
116
  - - ">="
60
- - !ruby/object:Gem::Version
61
- hash: 3
62
- segments:
63
- - 0
64
- version: "0"
65
- requirements: []
66
-
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements:
120
+ - 'ruby: ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-linux]'
121
+ - 'bash in development: GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)'
122
+ - 'system in development: linux/bash'
123
+ - 'rm in development: rm (GNU coreutils) 8.13'
124
+ - 'diff in development: diff (GNU diffutils) 3.2'
67
125
  rubyforge_project:
68
- rubygems_version: 1.8.4
126
+ rubygems_version: 2.2.0
69
127
  signing_key:
70
- specification_version: 3
71
- summary: Shred a file into file fragments, and join fragments back into a restored file.
128
+ specification_version: 4
129
+ summary: Shred a file into file fragments, and join fragments back into a restored
130
+ file.
72
131
  test_files: []
73
-
data/README.txt DELETED
@@ -1,28 +0,0 @@
1
- ### SYNOPSIS ###
2
-
3
- require 'shredder'
4
-
5
- # Shreds text.txt into test.f.1, test.f.2, test.f.3
6
- Shredder::Files.new('README.txt', ['test.f.1','test.f.2','test.f.3'] ).shred
7
-
8
- # Sews test.f.1, test.f.2, test.f.3 into restored.f.txt
9
- Shredder::Files.new('restored.f.txt', ['test.f.1','test.f.2','test.f.3'] ).sew
10
-
11
- # or #
12
-
13
- # shred streams #
14
- reader = File.open('README.txt','r')
15
- writers = []; ['test.s.1','test.s.2','test.s.3'].each{|writer| writers.push(File.open(writer,'wb'))}
16
- Shredder::Streams.new(reader,writers).shred
17
- reader.close
18
- writers.each{|writer| writer.close}
19
-
20
- # sew streams
21
- writer = File.open('restored.s.txt','wb')
22
- readers = []; ['test.s.1','test.s.2','test.s.3'].each{|writer| readers.push(File.open(writer,'r'))}
23
- Shredder::Streams.new(writer,readers).sew
24
- writer.close
25
- readers.each{|reader| reader.close}
26
-
27
- # Also available, Shredder.shred( writer, readers) and Shredder.sew( reader, writers )
28
- # and a command line utility, shredder (run shredder --help for more info).