cloud_encrypted_sync_filesystem_adapter 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +35 -0
- data/README.md +16 -0
- data/Rakefile +10 -0
- data/cloud_encrypted_sync_filesystem_adapter.gemspec +25 -0
- data/lib/adapters/filesystem.rb +55 -0
- data/lib/cloud_encrypted_sync_filesystem_adapter.rb +2 -0
- data/lib/version.rb +3 -0
- data/test/test_helper.rb +34 -0
- data/test/unit/adapter_test.rb +118 -0
- metadata +154 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
coverage/*
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
cloud_encrypted_sync_filesystem_adapter (0.1.0)
|
5
|
+
cloud_encrypted_sync
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activesupport (3.2.3)
|
11
|
+
i18n (~> 0.6)
|
12
|
+
multi_json (~> 1.0)
|
13
|
+
cloud_encrypted_sync (0.3.1)
|
14
|
+
fakefs (0.4.1)
|
15
|
+
i18n (0.6.0)
|
16
|
+
metaclass (0.0.1)
|
17
|
+
mocha (0.11.4)
|
18
|
+
metaclass (~> 0.0.1)
|
19
|
+
multi_json (1.3.4)
|
20
|
+
rake (0.9.2.2)
|
21
|
+
simplecov (0.6.4)
|
22
|
+
multi_json (~> 1.0)
|
23
|
+
simplecov-html (~> 0.5.3)
|
24
|
+
simplecov-html (0.5.3)
|
25
|
+
|
26
|
+
PLATFORMS
|
27
|
+
ruby
|
28
|
+
|
29
|
+
DEPENDENCIES
|
30
|
+
activesupport
|
31
|
+
cloud_encrypted_sync_filesystem_adapter!
|
32
|
+
fakefs
|
33
|
+
mocha
|
34
|
+
rake
|
35
|
+
simplecov
|
data/README.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
CloudEncryptedSync Filesystem Adapter
|
2
|
+
=====================================
|
3
|
+
|
4
|
+
A simple filesystem adapter for the CloudEncryptedSync gem.
|
5
|
+
|
6
|
+
This gem is meant primarily to serve as a demo. Instead of syncing files
|
7
|
+
to a remote cloud service, this adapter writes the ecrypted files to another
|
8
|
+
folder on your local filesystem.
|
9
|
+
|
10
|
+
In addition to arguments required by CES, you must also pass
|
11
|
+
`--storage-path /some/local/path` which tells CES where to write the encrypted
|
12
|
+
files to.
|
13
|
+
|
14
|
+
In theory, this should work just fine with a NFS mounted folder as well, but
|
15
|
+
this has not been tested and is not officially supported.
|
16
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.expand_path('../lib/version', __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "cloud_encrypted_sync_filesystem_adapter"
|
5
|
+
s.version = CloudEncryptedSyncFilesystemAdapter::VERSION
|
6
|
+
s.platform = Gem::Platform::RUBY
|
7
|
+
s.authors = ["Jonathan S. Garvin"]
|
8
|
+
s.email = ["jon@5valleys.com"]
|
9
|
+
s.homepage = "https://github.com/jsgarvin/cloud_encrypted_sync_filesystem_adapter"
|
10
|
+
s.summary = %q{Filesystem adapter plugin for CloudEncryptedSync gem.}
|
11
|
+
s.description = %q{Filesystem adapter plugin for CloudEncryptedSync gem.}
|
12
|
+
|
13
|
+
s.add_dependency('cloud_encrypted_sync')
|
14
|
+
|
15
|
+
s.add_development_dependency('rake')
|
16
|
+
s.add_development_dependency('mocha')
|
17
|
+
s.add_development_dependency('fakefs')
|
18
|
+
s.add_development_dependency('simplecov')
|
19
|
+
s.add_development_dependency('activesupport')
|
20
|
+
|
21
|
+
s.files = `git ls-files`.split("\n")
|
22
|
+
s.test_files = `git ls-files -- test/*`.split("\n")
|
23
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
24
|
+
s.require_paths = ["lib"]
|
25
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module CloudEncryptedSync
|
2
|
+
module Adapters
|
3
|
+
class Filesystem < Template
|
4
|
+
attr_accessor :storage_path
|
5
|
+
|
6
|
+
def parse_command_line_options(parser)
|
7
|
+
parser.on('--storage-path PATH', 'Path to folder where encrypted files are/will be stored.') do |storage|
|
8
|
+
self.storage_path = storage
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def write(data, key)
|
13
|
+
File.open(storage_path_to(key),'w') { |file| file.write(data) }
|
14
|
+
end
|
15
|
+
|
16
|
+
def read(key)
|
17
|
+
if key_exists?(key)
|
18
|
+
File.read(storage_path_to(key))
|
19
|
+
else
|
20
|
+
raise Errors::NoSuchKey.new(key)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def delete(key)
|
25
|
+
if key_exists?(key)
|
26
|
+
File.delete(storage_path_to(key))
|
27
|
+
else
|
28
|
+
raise Errors::NoSuchKey.new(key)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def key_exists?(key)
|
33
|
+
File.exist?(storage_path_to(key))
|
34
|
+
end
|
35
|
+
|
36
|
+
#######
|
37
|
+
private
|
38
|
+
#######
|
39
|
+
|
40
|
+
def storage_path_to(key)
|
41
|
+
"#{expanded_and_created_storage_path}/#{key}"
|
42
|
+
end
|
43
|
+
|
44
|
+
def expanded_and_created_storage_path
|
45
|
+
FileUtils.mkdir_p(expanded_storage_path)
|
46
|
+
return expanded_storage_path
|
47
|
+
end
|
48
|
+
|
49
|
+
def expanded_storage_path
|
50
|
+
File.expand_path(storage_path)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/version.rb
ADDED
data/test/test_helper.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'simplecov'
|
4
|
+
require 'fakefs/safe'
|
5
|
+
require 'active_support/test_case'
|
6
|
+
require 'test/unit'
|
7
|
+
|
8
|
+
SimpleCov.start
|
9
|
+
|
10
|
+
require 'cloud_encrypted_sync'
|
11
|
+
require 'cloud_encrypted_sync_filesystem_adapter'
|
12
|
+
|
13
|
+
module CloudEncryptedSyncFilesystemAdapter
|
14
|
+
class ActiveSupport::TestCase
|
15
|
+
|
16
|
+
setup :initialize_fake_fs
|
17
|
+
teardown :deactivate_fake_fs
|
18
|
+
|
19
|
+
#######
|
20
|
+
private
|
21
|
+
#######
|
22
|
+
|
23
|
+
def initialize_fake_fs
|
24
|
+
FakeFS.activate!
|
25
|
+
FakeFS::FileSystem.clear
|
26
|
+
end
|
27
|
+
|
28
|
+
def deactivate_fake_fs
|
29
|
+
FakeFS.deactivate!
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
require 'mocha'
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module CloudEncryptedSyncFilesystemAdapter
|
4
|
+
class AdapterTest < ActiveSupport::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
stub_configuration
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
unstub_configuration
|
12
|
+
end
|
13
|
+
|
14
|
+
# This is just a basic example (that will fail until you update it).
|
15
|
+
test 'should parse command line options' do
|
16
|
+
unstub_configuration
|
17
|
+
Object.send(:remove_const,:ARGV)
|
18
|
+
::ARGV = '--storage-path /some/path'.split(/\s/)
|
19
|
+
@option_parser = OptionParser.new do |parser|
|
20
|
+
adapter.parse_command_line_options(parser)
|
21
|
+
end
|
22
|
+
@option_parser.parse!
|
23
|
+
assert_equal('/some/path',CloudEncryptedSync::Adapters::Filesystem.instance.send(:storage_path))
|
24
|
+
stub_configuration #just so that teardown unstub doesn't throw errors
|
25
|
+
end
|
26
|
+
|
27
|
+
test 'should write readable data to cloud and then delete it' do
|
28
|
+
|
29
|
+
test_data = 'testdata'
|
30
|
+
test_key = 'testkey'
|
31
|
+
|
32
|
+
assert !adapter.key_exists?(test_key)
|
33
|
+
|
34
|
+
assert_difference('number_of_files_in_storage') do
|
35
|
+
adapter.write(test_data,test_key)
|
36
|
+
end
|
37
|
+
assert adapter.key_exists?(test_key)
|
38
|
+
|
39
|
+
assert_equal(test_data,adapter.read(test_key))
|
40
|
+
|
41
|
+
assert_difference('number_of_files_in_storage',-1) do
|
42
|
+
adapter.delete(test_key)
|
43
|
+
end
|
44
|
+
assert !adapter.key_exists?(test_key)
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
# Your adapter should be written in such a way that this test passes as is.
|
49
|
+
test 'should raise NoSuchKey error' do
|
50
|
+
assert_raises(CloudEncryptedSync::Errors::NoSuchKey) { adapter.read('nonexistentkey') }
|
51
|
+
end
|
52
|
+
|
53
|
+
test 'should return false for non existent keys' do
|
54
|
+
refute adapter.key_exists?('nonexistentkey')
|
55
|
+
end
|
56
|
+
|
57
|
+
test 'should return true to existent keys' do
|
58
|
+
key = 'foobar'
|
59
|
+
File.open(storage_path_to(key),'w') { |file| file.write('Hello, World!') }
|
60
|
+
assert adapter.key_exists?(key)
|
61
|
+
end
|
62
|
+
|
63
|
+
test 'should write to storage' do
|
64
|
+
key = 'foobar'
|
65
|
+
refute adapter.key_exists?(key)
|
66
|
+
assert_difference('number_of_files_in_storage') do
|
67
|
+
adapter.write('this is my handle, this is my spout',key)
|
68
|
+
end
|
69
|
+
assert adapter.key_exists?(key)
|
70
|
+
end
|
71
|
+
|
72
|
+
test 'should read file from storage' do
|
73
|
+
key = 'foobar'
|
74
|
+
data = 'Hello, World!'
|
75
|
+
File.open(storage_path_to(key),'w') { |file| file.write(data) }
|
76
|
+
assert_equal(data,adapter.read(key))
|
77
|
+
end
|
78
|
+
|
79
|
+
test 'should delete file from storage' do
|
80
|
+
key = 'foobar'
|
81
|
+
data = 'Hello, World!'
|
82
|
+
File.open(storage_path_to(key),'w') { |file| file.write(data) }
|
83
|
+
assert_difference('number_of_files_in_storage',-1) do
|
84
|
+
adapter.delete(key)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
#######
|
89
|
+
private
|
90
|
+
#######
|
91
|
+
|
92
|
+
def number_of_files_in_storage
|
93
|
+
Dir["#{full_storage_path}/*"].length
|
94
|
+
end
|
95
|
+
|
96
|
+
def storage_path_to(key)
|
97
|
+
adapter.send(:storage_path_to,key)
|
98
|
+
end
|
99
|
+
|
100
|
+
def full_storage_path
|
101
|
+
adapter.send(:expanded_storage_path)
|
102
|
+
end
|
103
|
+
|
104
|
+
def adapter
|
105
|
+
CloudEncryptedSync::Adapters::Filesystem.instance
|
106
|
+
end
|
107
|
+
|
108
|
+
# Setup test configuration values here as if they were passed in as command line arguments
|
109
|
+
def stub_configuration
|
110
|
+
CloudEncryptedSync::Adapters::Filesystem.any_instance.stubs(:storage_path).returns(File.expand_path('../test_storage_folder', __FILE__))
|
111
|
+
end
|
112
|
+
|
113
|
+
# Remove stubbed settings here that were stubbed in above method.
|
114
|
+
def unstub_configuration
|
115
|
+
CloudEncryptedSync::Adapters::Filesystem.any_instance.unstub(:storage_path)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
metadata
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cloud_encrypted_sync_filesystem_adapter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jonathan S. Garvin
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-11-29 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: cloud_encrypted_sync
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: mocha
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: fakefs
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: simplecov
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: activesupport
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
description: Filesystem adapter plugin for CloudEncryptedSync gem.
|
111
|
+
email:
|
112
|
+
- jon@5valleys.com
|
113
|
+
executables: []
|
114
|
+
extensions: []
|
115
|
+
extra_rdoc_files: []
|
116
|
+
files:
|
117
|
+
- .gitignore
|
118
|
+
- Gemfile
|
119
|
+
- Gemfile.lock
|
120
|
+
- README.md
|
121
|
+
- Rakefile
|
122
|
+
- cloud_encrypted_sync_filesystem_adapter.gemspec
|
123
|
+
- lib/adapters/filesystem.rb
|
124
|
+
- lib/cloud_encrypted_sync_filesystem_adapter.rb
|
125
|
+
- lib/version.rb
|
126
|
+
- test/test_helper.rb
|
127
|
+
- test/unit/adapter_test.rb
|
128
|
+
homepage: https://github.com/jsgarvin/cloud_encrypted_sync_filesystem_adapter
|
129
|
+
licenses: []
|
130
|
+
post_install_message:
|
131
|
+
rdoc_options: []
|
132
|
+
require_paths:
|
133
|
+
- lib
|
134
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
135
|
+
none: false
|
136
|
+
requirements:
|
137
|
+
- - ! '>='
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
|
+
none: false
|
142
|
+
requirements:
|
143
|
+
- - ! '>='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
requirements: []
|
147
|
+
rubyforge_project:
|
148
|
+
rubygems_version: 1.8.24
|
149
|
+
signing_key:
|
150
|
+
specification_version: 3
|
151
|
+
summary: Filesystem adapter plugin for CloudEncryptedSync gem.
|
152
|
+
test_files:
|
153
|
+
- test/test_helper.rb
|
154
|
+
- test/unit/adapter_test.rb
|