classifieds 0.1.0 → 0.2.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.
- 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
|