shredder 1.0.0 → 2.0.200126

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
- SHA1:
3
- metadata.gz: 86de11dca31147b96703885615c3727a7256bda2
4
- data.tar.gz: 10147305bd2892e76a56b5ad8378f52470c4be5d
2
+ SHA256:
3
+ metadata.gz: 498eeb86b0aea1ba926ec9c2dd168d41ef4467dd64ff79e7e712f3141aec4e02
4
+ data.tar.gz: 654802da4b46624cc48f87ca2d6aa949ba451fade334c6ce77a5c7836465938d
5
5
  SHA512:
6
- metadata.gz: 5f19a35eb7ba38592f328f0d87e93401ae528b470c6046d81ace2d4b0dfbaf1db2e8a07df8d41a2a2e86091d7969d52e51889d78988037cc53c71b3d7aeb83a4
7
- data.tar.gz: cfb6ccd2fcecd29df7a02c24caba969a06e7025ea8b82c2af782d1aa5a2c994c1eb2dff806e0e31169c426ae904ef07af6bb90c1f9c015c17e759fbd010f7ac0
6
+ metadata.gz: 52830fd82dd9711003bd78e039df4467e66b95b013ca622c28103e65265dbe8b02841f886008db00b66508e2e34a47eb8f586c398b11fecf41e2ed5bcc6274c2
7
+ data.tar.gz: 766b712345d5efa6783a730d4f9afb4a00fe48e40a7f805a65252c7075edf1bad5f6cb750ab388f842e4accd2e58bb26612d6ed1b6d43eb85f57dbcdb9f5d929
@@ -0,0 +1,113 @@
1
+ # shredder
2
+
3
+ * [VERSION 2.0.200126](https://github.com/carlosjhr64/shredder/releases)
4
+ * [github](https://github.com/carlosjhr64/shredder)
5
+ * [rubygems](https://rubygems.org/gems/shredder)
6
+
7
+ ## DESCRIPTION:
8
+
9
+ Shred a file into file fragments, and join fragments back into a restored file.
10
+
11
+ ## HELP:
12
+
13
+ $ Usage:
14
+ $ shredder shred [:options+] <shreds=FILENAME>+
15
+ $ shredder sew [:options+] <shreds=FILENAME>+
16
+ $ Options:
17
+ $ --n=INTEGER Number of shreds
18
+ $ --passphrase Relay passphrase from stding to stdout
19
+ $ Types:
20
+ $ FILENAME /^[[:print:]]+$/
21
+ $ INTEGER /^[2-9]d*$/
22
+ $ # Examples:
23
+ $ # shredder shred file.1 file.2 < file.txt
24
+ $ # shredder shred --n=2 file < file.txt
25
+ $ # shredder sew file.1 file.2 > file.txt
26
+ $ # shredder shred --n=2 file > file.txt
27
+
28
+ ## SYNOPSIS
29
+
30
+ ### Library:
31
+
32
+ require 'shredder'
33
+
34
+ #### Shredder::Streams
35
+
36
+ require 'stringio'
37
+
38
+ sewn = StringIO.new("This is a test String: 1, 2, 3.")
39
+ sewn.string.length #=> 31
40
+ shreds = [StringIO.new, StringIO.new]
41
+
42
+ shredder = Shredder::Streams.new(sewn, shreds)
43
+ shredder.shred #=> 31
44
+
45
+ shreds[0].string
46
+ #=> "T\u0001S\u001AAT\u0016T'\e\t\u001A\u001D\u0012\f\u001D"
47
+ shreds[0].string.length #=> 16
48
+
49
+ shreds[1].string
50
+ #=> "<\u001AISA\u0011\as\u0006\a]\u0011\f\u001E\u0013"
51
+ shreds[1].string.length #=> 15
52
+
53
+ restored = StringIO.new
54
+ shreds.each{|_|_.rewind}
55
+
56
+ shredder = Shredder::Streams.new(restored, shreds)
57
+ shredder.sew #=> 31
58
+
59
+ restored.string #=> "This is a test String: 1, 2, 3."
60
+
61
+ #### Shredder::Files
62
+
63
+ sewn = './tmp/sewn.txt'
64
+ shreds = './tmp/shreds'
65
+ restored = './tmp/restored.txt'
66
+
67
+ File.read(sewn).chomp #=> "This is a test file: 1, 2, 3."
68
+ File.size(sewn) #=> 30
69
+
70
+ shredder = Shredder::Files.new(sewn, shreds, 3)
71
+ shredder.shreds
72
+ #=> ["./tmp/shreds.1", "./tmp/shreds.2", "./tmp/shreds.3"]
73
+ shredder.shred #=> 30
74
+
75
+ File.read(shreds+'.1') #=> "T\u001A\u001AA\u0016F\t\u0011\u0012\u0013"
76
+ File.read(shreds+'.2') #=> "<SST\a\u000F_\u001D\u001E\u001D"
77
+ File.read(shreds+'.3') #=> "\u0001IA\u0011T\u0005\u001A\f\f$"
78
+ File.size(shreds+'.3') #=> 10
79
+
80
+ shredder = Shredder::Files.new(restored, shreds, 3)
81
+ shredder.sewn #=> "./tmp/restored.txt"
82
+ shredder.sew #=> 30
83
+ File.read(restored).chomp #=> "This is a test file: 1, 2, 3."
84
+
85
+ ## INSTALL:
86
+
87
+ $ gem install shredder
88
+
89
+ ## LICENSE:
90
+
91
+ (The MIT License)
92
+
93
+ Copyright (c) 2020 CarlosJHR64
94
+
95
+ Permission is hereby granted, free of charge, to any person obtaining
96
+ a copy of this software and associated documentation files (the
97
+ 'Software'), to deal in the Software without restriction, including
98
+ without limitation the rights to use, copy, modify, merge, publish,
99
+ distribute, sublicense, and/or sell copies of the Software, and to
100
+ permit persons to whom the Software is furnished to do so, subject to
101
+ the following conditions:
102
+
103
+ The above copyright notice and this permission notice shall be
104
+ included in all copies or substantial portions of the Software.
105
+
106
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
107
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
108
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
109
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
110
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
111
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
112
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
113
+
@@ -1,43 +1,55 @@
1
1
  #!/usr/bin/env ruby
2
-
3
- # Gems:
4
2
  require 'help_parser'
5
3
 
6
- # This Gem:
7
- require 'shredder'
8
- include SHREDDER
9
-
10
- NAME = File.basename $0 # Program Name
11
- HELP = <<HELP
12
- Usage: #{NAME} [options] [file] shred1 shred2...
4
+ OPTIONS = HelpParser['2.0.200126', <<HELP]
5
+ Usage:
6
+ shredder shred [:options+] <shreds=FILENAME>+
7
+ shredder sew [:options+] <shreds=FILENAME>+
13
8
  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.
18
-
19
- -h --help Puts this help and exits.
20
- -v --version Puts version and exits.
21
-
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}
9
+ --n=INTEGER \tNumber of shreds
10
+ --passphrase\tRelay passphrase from stding to stdout
11
+ Types:
12
+ FILENAME /^[[:print:]]+$/
13
+ INTEGER /^[2-9]\d*$/
14
+ # Examples:
15
+ # shredder shred file.1 file.2 < file.txt
16
+ # shredder shred --n=2 file < file.txt
17
+ # shredder sew file.1 file.2 > file.txt
18
+ # shredder shred --n=2 file > file.txt
28
19
  HELP
20
+ HelpParser.int?(:n)
29
21
 
30
- begin
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
22
+ shreds = OPTIONS.shreds
23
+ count = shreds.length
24
+ if n = OPTIONS.n?
25
+ if count == 1
26
+ count = n
27
+ shreds = shreds.first
28
+ elsif count != n
29
+ $stderr.puts "shred count(#{count}) not equal to n(#{n})."
30
+ exit 64
31
+ end
32
+ end
33
+ unless count > 1
34
+ $stderr.puts "shred count must be at least 2"
42
35
  exit 64
43
36
  end
37
+
38
+ require 'shredder/shredder'
39
+ require 'shredder/streams'
40
+ require 'shredder/stdio'
41
+
42
+ shredder = Shredder::StdIO.new(shreds, count)
43
+ case OPTIONS[1]
44
+ when 'shred'
45
+ shredder.shred
46
+ when 'sew'
47
+ begin
48
+ shredder.sew
49
+ rescue Errno::ENOENT
50
+ # Common expected type of error,
51
+ # user tries to sew non-existing shreds.
52
+ $stderr.puts $!.message
53
+ exit 65
54
+ end
55
+ end
@@ -1,8 +1,9 @@
1
- require 'shredder/version'
2
- require 'shredder/functions'
3
- require 'shredder/files'
4
- require 'shredder/streams'
1
+ module Shredder
2
+ VERSION = '2.0.200126'
3
+ end
5
4
  require 'shredder/shredder'
6
-
5
+ require 'shredder/streams'
6
+ require 'shredder/stdio'
7
+ require 'shredder/files'
7
8
  # Requires:
8
9
  #`ruby`
@@ -1,51 +1,37 @@
1
- module SHREDDER
2
-
1
+ module Shredder
3
2
  class Files
4
- extend Functions
5
-
6
- # this one takes filenames
7
- def initialize(sew, shreds, limit=0)
8
- @sew = sew
9
- @shreds = shreds
10
- @limit = limit
3
+ include Shredder
4
+ # this one takes filenames
5
+ def initialize(sewn, shreds=sewn, m=2, n: m)
6
+ @sewn = sewn
7
+ @shreds = shred_files(shreds, n)
8
+ raise "Need at least 2 shreds" unless @shreds.length > 1
11
9
  end
12
10
 
13
- def shred(limit=@limit)
14
- reader = File.open(@sew, 'r')
15
- writers = []
16
- @shreds.each{|shred| writers.push(File.open(shred, 'wb'))}
17
-
18
- count = nil
11
+ def shred(limit=0)
12
+ reader = writers = count = nil
19
13
  begin
20
- count = Files.shred(reader, writers, limit)
21
- rescue Exception
22
- raise $!
14
+ reader = File.open(@sewn, 'r')
15
+ writers = @shreds.map{|shred| File.open(shred, 'wb')}
16
+ count = Streams.new(reader, writers).shred(limit: limit)
23
17
  ensure
24
- writers.each{|writer| writer.close}
25
- reader.close
26
- end
27
-
18
+ writers.each{|writer| writer.close} if writers
19
+ reader.close if reader
20
+ end
28
21
  return count
29
22
  end
30
23
 
31
- def sew(limit=@limit)
32
- writer = File.open(@sew, 'wb')
33
- readers = []
34
- @shreds.each{|shred| readers.push(File.open(shred, 'r'))}
35
-
36
- count = nil
24
+ def sew(limit=0)
25
+ writer = readers = count = nil
37
26
  begin
38
- count = Files.sew(writer, readers, limit)
39
- rescue Exception
40
- raise $!
27
+ writer = File.open(@sewn, 'wb')
28
+ readers = @shreds.map{|shred| File.open(shred, 'r')}
29
+ count = Streams.new(writer, readers).sew(limit: limit)
41
30
  ensure
42
- writer.close
43
- readers.each{|reader| reader.close}
31
+ writer.close if writer
32
+ readers.each{|reader| reader.close} if readers
44
33
  end
45
-
46
34
  return count
47
35
  end
48
-
49
36
  end
50
-
51
37
  end
@@ -1,46 +1,40 @@
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
1
+ module Shredder
2
+ attr_accessor :sewn, :shreds
3
+
4
+ # note that these are streams
5
+ def shred(sewn=(@sewn or $stdin), shreds=@shreds,
6
+ writers: shreds, reader: sewn, limit: 0)
7
+ shreds,xor,count = writers.length,0,0
8
+ while byte = reader.getbyte do
9
+ writers[count%shreds].putc(xor^(xor=byte))
10
+ count += 1 # not that 0 is skipped
11
+ break if count == limit
34
12
  end
13
+ return count
14
+ end
35
15
 
36
- def shred(sewed, *shreds)
37
- execute(sewed, shreds, true)
16
+ # note that these are streams
17
+ def sew(shreds=@shreds, sewn=(@sewn or $stdout),
18
+ readers: shreds, writer: sewn, limit: 0)
19
+ shreds,xor,count = readers.length,0,0
20
+ while byte = readers[count%shreds].getbyte do
21
+ writer.putc(xor=(byte^xor))
22
+ count += 1 # note that 0 is skipped
23
+ break if count == limit
38
24
  end
25
+ return count
26
+ end
39
27
 
40
- def sew(sewed, *shreds)
41
- execute(sewed, shreds, false)
28
+ def shred_files(b, m=2, basename: b, n: m)
29
+ case basename
30
+ when Array
31
+ basename
32
+ when String
33
+ (1..n).map{|i| "#{basename}.#{i}"}
34
+ when Integer
35
+ (1..basename).map{|i| "#{@sewn or 'shred'}.#{i}"}
36
+ else
37
+ raise "Expected basename Array|String|Integer"
42
38
  end
43
-
44
39
  end
45
-
46
40
  end
@@ -0,0 +1,31 @@
1
+ module Shredder
2
+ class StdIO
3
+ include Shredder
4
+ # this one takes shred filenames and uses $stdin or $stdout appropriately.
5
+ def initialize(*args)
6
+ @shreds = shred_files(*args)
7
+ end
8
+
9
+ def shred(limit=0)
10
+ writers = count = nil
11
+ begin
12
+ writers = @shreds.map{|shred| File.open(shred, 'wb')}
13
+ count = Streams.new($stdin, writers).shred(limit: limit)
14
+ ensure
15
+ writers.each{|writer| writer.close} if writers
16
+ end
17
+ return count
18
+ end
19
+
20
+ def sew(limit=0)
21
+ readers = count = nil
22
+ begin
23
+ readers = @shreds.map{|shred| File.open(shred, 'r')}
24
+ count = Streams.new($stdout, readers).sew(limit: limit)
25
+ ensure
26
+ readers.each{|reader| reader.close} if readers
27
+ end
28
+ return count
29
+ end
30
+ end
31
+ end
@@ -1,23 +1,10 @@
1
- module SHREDDER
2
-
1
+ module Shredder
3
2
  class Streams
4
- extend Functions
5
-
3
+ include Shredder
6
4
  # this one takes streams
7
- def initialize(sew, shreds, limit=0)
8
- @sew = sew
5
+ def initialize(sewn, shreds)
6
+ @sewn = sewn
9
7
  @shreds = shreds
10
- @limit = limit
11
8
  end
12
-
13
- def shred(limit=@limit)
14
- Streams.shred(@sew,@shreds,limit)
15
- end
16
-
17
- def sew(limit=@limit)
18
- Streams.sew(@sew,@shreds,limit)
19
- end
20
-
21
9
  end
22
-
23
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shredder
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.200126
5
5
  platform: ruby
6
6
  authors:
7
- - CarlosJHR64
7
+ - carlosjhr64
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-11 00:00:00.000000000 Z
11
+ date: 2020-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: help_parser
@@ -16,94 +16,43 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.1'
19
+ version: '6.5'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 1.1.0
22
+ version: 6.5.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '1.1'
29
+ version: '6.5'
30
30
  - - ">="
31
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
73
- description: |
74
- Shred a file into file fragments, and join fragments back into a restored file.
32
+ version: 6.5.0
33
+ description: 'Shred a file into file fragments, and join fragments back into a restored
34
+ file.
75
35
 
76
- Disperse file shreds in separate depositories
77
- so that no one depository has the entire file.
36
+ '
78
37
  email: carlosjhr64@gmail.com
79
38
  executables:
80
39
  - shredder
81
40
  extensions: []
82
- extra_rdoc_files:
83
- - README.rdoc
41
+ extra_rdoc_files: []
84
42
  files:
85
- - History.txt
86
- - README.rdoc
87
- - TODO.txt
43
+ - README.md
88
44
  - bin/shredder
89
- - features/main.feature
90
- - features/step_definitions/main_steps.rb
91
45
  - lib/shredder.rb
92
46
  - lib/shredder/files.rb
93
- - lib/shredder/functions.rb
94
47
  - lib/shredder/shredder.rb
48
+ - lib/shredder/stdio.rb
95
49
  - lib/shredder/streams.rb
96
- - lib/shredder/version.rb
97
- - shredder.gemspec
98
- - test/test_shredder.rb
99
50
  homepage: https://github.com/carlosjhr64/shredder
100
51
  licenses:
101
52
  - MIT
102
53
  metadata: {}
103
54
  post_install_message:
104
- rdoc_options:
105
- - "--main"
106
- - README.rdoc
55
+ rdoc_options: []
107
56
  require_paths:
108
57
  - lib
109
58
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -117,13 +66,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
66
  - !ruby/object:Gem::Version
118
67
  version: '0'
119
68
  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'
125
- rubyforge_project:
126
- rubygems_version: 2.2.0
69
+ - 'ruby: ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux]'
70
+ rubygems_version: 3.1.2
127
71
  signing_key:
128
72
  specification_version: 4
129
73
  summary: Shred a file into file fragments, and join fragments back into a restored
File without changes
@@ -1,58 +0,0 @@
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.
data/TODO.txt DELETED
@@ -1,7 +0,0 @@
1
- == TODO
2
-
3
- Implement the --yes, --no, and --force options.
4
-
5
- == File List
6
-
7
-
@@ -1,72 +0,0 @@
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)
@@ -1,77 +0,0 @@
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,36 +0,0 @@
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
@@ -1,5 +0,0 @@
1
- module SHREDDER
2
-
3
- VERSION = '1.0.0'
4
-
5
- end
@@ -1,55 +0,0 @@
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
@@ -1,140 +0,0 @@
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