shredder 1.0.0 → 2.0.200126

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.
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