classifieds 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +78 -11
- data/lib/classifieds/main.rb +59 -21
- data/lib/classifieds/version.rb +1 -1
- data/lib/classifieds.rb +3 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be21a9b90c90cb9033fb3d083fbdfe046f088214
|
4
|
+
data.tar.gz: 1105c72dbc850ae727fd72a8726fedd550e78f76
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fd490542826ca9d4ad8e8a72aff680b8b97f41a4c2cd05848fd8d8ce44ce786f2f885fd527289aae1aa312de29ae46da75fad8da9a267e6b9ef38c6a9ade351
|
7
|
+
data.tar.gz: dbe2f6c2de67696c56252d893c9b1445e1293e05ee767108af49a4a02f1cc3e8ba9321a21a9cf5899d34f49cbc80d92f0a9401772b2db79eec28b91c139bf6bd
|
data/README.md
CHANGED
@@ -16,28 +16,28 @@ $ gem install classifieds
|
|
16
16
|
|
17
17
|
## Usage
|
18
18
|
|
19
|
-
|
19
|
+
Generate identity files using by public key encryption.
|
20
20
|
|
21
21
|
```
|
22
|
-
$ classifieds
|
22
|
+
$ classifieds keygen
|
23
23
|
```
|
24
24
|
|
25
|
-
|
25
|
+
Show a status of the encryption of this repository.
|
26
26
|
|
27
27
|
```
|
28
|
-
$ classifieds
|
28
|
+
$ classifieds status
|
29
29
|
```
|
30
30
|
|
31
|
-
|
31
|
+
Encrypt files which were described in .classifieds.
|
32
32
|
|
33
33
|
```
|
34
|
-
$ classifieds
|
34
|
+
$ classifieds encrypt
|
35
35
|
```
|
36
36
|
|
37
|
-
|
37
|
+
Decrypt files which were described in .classifieds.
|
38
38
|
|
39
39
|
```
|
40
|
-
$ classifieds
|
40
|
+
$ classifieds decrypt
|
41
41
|
```
|
42
42
|
|
43
43
|
## Example
|
@@ -60,8 +60,7 @@ In your repository:
|
|
60
60
|
First, initialize classifieds.
|
61
61
|
|
62
62
|
```
|
63
|
-
$ classifieds
|
64
|
-
.classifieds was created
|
63
|
+
$ touch .classifieds
|
65
64
|
|
66
65
|
$ ls -a
|
67
66
|
.classifieds bar/ foo fuga/ hoge/
|
@@ -90,6 +89,8 @@ Unencrypted:
|
|
90
89
|
/path/to/fuga/fuga2
|
91
90
|
```
|
92
91
|
|
92
|
+
### Password Encryption
|
93
|
+
|
93
94
|
Encrypt files.
|
94
95
|
|
95
96
|
```
|
@@ -116,7 +117,73 @@ Encrypted:
|
|
116
117
|
/path/to/fuga/fuga2
|
117
118
|
|
118
119
|
$ cat foo
|
119
|
-
|
120
|
+
65c0ec273963aacc69af593b03d1710ff90f75daB5KyfrnkTXz/K6+SeNkapA==
|
121
|
+
```
|
122
|
+
|
123
|
+
Decrypt files.
|
124
|
+
|
125
|
+
```
|
126
|
+
$ classifieds decrypt
|
127
|
+
Password:
|
128
|
+
Decrypted:
|
129
|
+
/path/to/foo
|
130
|
+
/path/to/bar/bar2
|
131
|
+
/path/to/hoge/hoge1.rb
|
132
|
+
/path/to/fuga/fuga1
|
133
|
+
/path/to/fuga/fuga2
|
134
|
+
```
|
135
|
+
|
136
|
+
Check the status.
|
137
|
+
|
138
|
+
```
|
139
|
+
$ classifieds status
|
140
|
+
Unencrypted:
|
141
|
+
/path/to/foo
|
142
|
+
/path/to/bar/bar2
|
143
|
+
/path/to/hoge/hoge1.rb
|
144
|
+
/path/to/fuga/fuga1
|
145
|
+
/path/to/fuga/fuga2
|
146
|
+
|
147
|
+
$ cat foo
|
148
|
+
foo
|
149
|
+
```
|
150
|
+
|
151
|
+
### Public Key Encryption
|
152
|
+
|
153
|
+
Generate keys.
|
154
|
+
|
155
|
+
```
|
156
|
+
$ classifieds keygen > ~/classifieds_private_key
|
157
|
+
$ ls .classifieds.d/*
|
158
|
+
.classifieds.d/common_key
|
159
|
+
.classifieds.d/public_key
|
160
|
+
```
|
161
|
+
|
162
|
+
Encrypt files.
|
163
|
+
|
164
|
+
```
|
165
|
+
$ classifieds encrypt -i ~/classifieds_private_key
|
166
|
+
Encrypted:
|
167
|
+
/path/to/foo
|
168
|
+
/path/to/bar/bar2
|
169
|
+
/path/to/hoge/hoge1.rb
|
170
|
+
/path/to/fuga/fuga1
|
171
|
+
/path/to/fuga/fuga2
|
172
|
+
```
|
173
|
+
|
174
|
+
Check the status.
|
175
|
+
|
176
|
+
```
|
177
|
+
$ classifieds status
|
178
|
+
Encrypted:
|
179
|
+
/path/to/foo
|
180
|
+
/path/to/bar/bar2
|
181
|
+
/path/to/hoge/hoge1.rb
|
182
|
+
/path/to/fuga/fuga1
|
183
|
+
/path/to/fuga/fuga2
|
184
|
+
|
185
|
+
$ cat foo
|
186
|
+
65c0ec273963aacc69af593b03d1710ff90f75daB5KyfrnkTXz/K6+SeNkapA==
|
120
187
|
```
|
121
188
|
|
122
189
|
Decrypt files.
|
data/lib/classifieds/main.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'digest/sha1'
|
2
2
|
require 'openssl'
|
3
|
+
require 'base64'
|
3
4
|
require 'fileutils'
|
4
5
|
|
5
6
|
require 'safe_colorize'
|
@@ -11,24 +12,46 @@ module Classifieds
|
|
11
12
|
using SafeColorize
|
12
13
|
|
13
14
|
def initialize(*args)
|
15
|
+
unless File.exists?(SOURCE_FILE)
|
16
|
+
STDERR.puts "#{SOURCE_FILE} is not found".color(:red)
|
17
|
+
exit 1
|
18
|
+
end
|
19
|
+
|
20
|
+
FileUtils.mkdir_p(SOURCE_DIRECTORY) unless Dir.exists?(SOURCE_DIRECTORY)
|
14
21
|
@prefix = Digest::SHA1.hexdigest('classifieds')
|
15
22
|
super
|
16
23
|
end
|
17
24
|
|
18
|
-
desc '
|
19
|
-
|
20
|
-
|
21
|
-
|
25
|
+
desc 'keygen', 'Generate identity files using by public key encryption'
|
26
|
+
option :force, type: :boolean, aliases: '-f'
|
27
|
+
def keygen
|
28
|
+
if !options[:force] && (File.exists?(PUBLIC_KEY_PATH) && File.exists?(COMMON_KEY_PATH))
|
29
|
+
STDERR.puts 'Already exists'.color(:red)
|
30
|
+
exit 1
|
22
31
|
else
|
23
|
-
|
24
|
-
|
32
|
+
OpenSSL::Random.seed(File.read('/dev/random', 16))
|
33
|
+
rsa = OpenSSL::PKey::RSA.new(2048)
|
34
|
+
pub = rsa.public_key
|
35
|
+
File.open(PUBLIC_KEY_PATH, 'w') do |f|
|
36
|
+
f.puts pub.to_pem
|
37
|
+
end
|
38
|
+
File.open(COMMON_KEY_PATH, 'w') do |f|
|
39
|
+
f.puts pub.public_encrypt(OpenSSL::Random.random_bytes(16))
|
40
|
+
end
|
41
|
+
puts rsa
|
25
42
|
end
|
26
43
|
end
|
27
44
|
|
28
45
|
desc 'encrypt', 'Encrypt files which were described in .classifieds'
|
46
|
+
option :identity_file, type: 'string', aliases: '-i'
|
29
47
|
def encrypt
|
30
|
-
|
31
|
-
|
48
|
+
if identity_file = options[:identity_file]
|
49
|
+
rsa = OpenSSL::PKey::RSA.new(File.read(identity_file).chomp)
|
50
|
+
@password = rsa.private_decrypt(File.read(COMMON_KEY_PATH).chomp)
|
51
|
+
else
|
52
|
+
@password = ask_password
|
53
|
+
retype_password
|
54
|
+
end
|
32
55
|
|
33
56
|
encrypted_files = classifieds.each_with_object([]) do |file_path, array|
|
34
57
|
next if encrypted?(file_path)
|
@@ -56,8 +79,14 @@ module Classifieds
|
|
56
79
|
end
|
57
80
|
|
58
81
|
desc 'decrypt', 'Decrypt files which were described in .classifieds'
|
82
|
+
option :identity_file, type: 'string', aliases: '-i'
|
59
83
|
def decrypt
|
60
|
-
|
84
|
+
if identity_file = options[:identity_file]
|
85
|
+
rsa = OpenSSL::PKey::RSA.new(File.read(identity_file).chomp)
|
86
|
+
@password = rsa.private_decrypt(File.read(COMMON_KEY_PATH).chomp)
|
87
|
+
else
|
88
|
+
@password = ask_password
|
89
|
+
end
|
61
90
|
|
62
91
|
decrypted_files = classifieds.each_with_object([]) do |file_path, array|
|
63
92
|
next if decrypted?(file_path)
|
@@ -99,9 +128,9 @@ module Classifieds
|
|
99
128
|
end
|
100
129
|
end
|
101
130
|
puts 'Encrypted:'.color(:green) unless encrypted_files.empty?
|
102
|
-
encrypted_files.each {|
|
131
|
+
encrypted_files.each {|encrypted_file| puts "\t" + encrypted_file }
|
103
132
|
puts 'Unencrypted:'.color(:red) unless unencrypted_files.empty?
|
104
|
-
unencrypted_files.each {|
|
133
|
+
unencrypted_files.each {|unencrypted_file| puts "\t" + unencrypted_file }
|
105
134
|
end
|
106
135
|
|
107
136
|
private
|
@@ -127,26 +156,35 @@ module Classifieds
|
|
127
156
|
end
|
128
157
|
|
129
158
|
def classifieds
|
130
|
-
File.
|
131
|
-
Parser.parse(f.read)
|
132
|
-
end
|
133
|
-
rescue Errno::ENOENT
|
134
|
-
STDERR.puts "#{SOURCE_FILE} is not found".color(:red)
|
135
|
-
exit 1
|
159
|
+
Parser.parse(File.read(SOURCE_FILE).chomp)
|
136
160
|
end
|
137
161
|
|
138
162
|
def encrypt_data(data)
|
139
163
|
cipher = OpenSSL::Cipher.new('AES-256-CBC')
|
140
164
|
cipher.encrypt
|
141
|
-
|
142
|
-
|
165
|
+
key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(
|
166
|
+
@password,
|
167
|
+
File.expand_path(File.dirname(__FILE__)).split('/').pop,
|
168
|
+
1000,
|
169
|
+
cipher.key_len + cipher.iv_len
|
170
|
+
)
|
171
|
+
cipher.key = key_iv[0, cipher.key_len]
|
172
|
+
cipher.iv = key_iv[cipher.key_len, cipher.iv_len]
|
173
|
+
Base64.encode64(cipher.update(data) + cipher.final)
|
143
174
|
end
|
144
175
|
|
145
176
|
def decrypt_data(data)
|
146
177
|
cipher = OpenSSL::Cipher.new('AES-256-CBC')
|
147
178
|
cipher.decrypt
|
148
|
-
|
149
|
-
|
179
|
+
key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(
|
180
|
+
@password,
|
181
|
+
File.expand_path(File.dirname(__FILE__)).split('/').pop,
|
182
|
+
1000,
|
183
|
+
cipher.key_len + cipher.iv_len
|
184
|
+
)
|
185
|
+
cipher.key = key_iv[0, cipher.key_len]
|
186
|
+
cipher.iv = key_iv[cipher.key_len, cipher.iv_len]
|
187
|
+
cipher.update(Base64.decode64(data)) + cipher.final
|
150
188
|
end
|
151
189
|
|
152
190
|
def encrypted?(file)
|
data/lib/classifieds/version.rb
CHANGED
data/lib/classifieds.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: classifieds
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kaihar4
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -108,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
108
|
version: '0'
|
109
109
|
requirements: []
|
110
110
|
rubyforge_project:
|
111
|
-
rubygems_version: 2.4.5
|
111
|
+
rubygems_version: 2.4.5.1
|
112
112
|
signing_key:
|
113
113
|
specification_version: 4
|
114
114
|
summary: File Encryption Manager
|