classifieds 0.2.1 → 0.2.2
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/lib/classifieds.rb +1 -0
- data/lib/classifieds/encryptor.rb +35 -0
- data/lib/classifieds/main.rb +38 -32
- data/lib/classifieds/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d6d409658285a51984fa62c9c70833593f6ec516
|
|
4
|
+
data.tar.gz: 3245625b00c570c2e0f5532b49d453bcc44cdad6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 47fb6152fb475e202712ed4dda885c0c334134680ea3d9e6ced9f481453d858e43622b58ed967772c4e2bf87bb48644ee9dc6369a93b32880316cd20954e3847
|
|
7
|
+
data.tar.gz: 5df1af17642507a30ecad363ae0fe4d39e4a8a7b88ea9e5fabdfff7f5ebcc279f17b1878af3afb1f296fa5221a54eca65469a1a4a8e8f2080bb00de7cbb401fd
|
data/lib/classifieds.rb
CHANGED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Classifieds
|
|
2
|
+
class Encryptor
|
|
3
|
+
def initialize(password, salt)
|
|
4
|
+
@cipher = OpenSSL::Cipher.new('AES-256-CBC')
|
|
5
|
+
@password = password
|
|
6
|
+
@salt = salt
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def encrypt(data)
|
|
10
|
+
@cipher.encrypt
|
|
11
|
+
key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(
|
|
12
|
+
@password,
|
|
13
|
+
@salt,
|
|
14
|
+
1000,
|
|
15
|
+
@cipher.key_len + @cipher.iv_len
|
|
16
|
+
)
|
|
17
|
+
@cipher.key = key_iv[0, @cipher.key_len]
|
|
18
|
+
@cipher.iv = key_iv[@cipher.key_len, @cipher.iv_len]
|
|
19
|
+
Base64.encode64(@cipher.update(data) + @cipher.final)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def decrypt(data)
|
|
23
|
+
@cipher.decrypt
|
|
24
|
+
key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(
|
|
25
|
+
@password,
|
|
26
|
+
@salt,
|
|
27
|
+
1000,
|
|
28
|
+
@cipher.key_len + @cipher.iv_len
|
|
29
|
+
)
|
|
30
|
+
@cipher.key = key_iv[0, @cipher.key_len]
|
|
31
|
+
@cipher.iv = key_iv[@cipher.key_len, @cipher.iv_len]
|
|
32
|
+
@cipher.update(Base64.decode64(data)) + @cipher.final
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
data/lib/classifieds/main.rb
CHANGED
|
@@ -2,6 +2,7 @@ require 'digest/sha1'
|
|
|
2
2
|
require 'openssl'
|
|
3
3
|
require 'base64'
|
|
4
4
|
require 'fileutils'
|
|
5
|
+
require 'find'
|
|
5
6
|
|
|
6
7
|
require 'safe_colorize'
|
|
7
8
|
|
|
@@ -12,12 +13,13 @@ module Classifieds
|
|
|
12
13
|
using SafeColorize
|
|
13
14
|
|
|
14
15
|
def initialize(*args)
|
|
15
|
-
unless
|
|
16
|
+
unless classifieds?
|
|
16
17
|
STDERR.puts "#{SOURCE_FILE} is not found in this repository".color(:red)
|
|
17
18
|
exit 1
|
|
18
19
|
end
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
source_directory = File.join(root_directory, SOURCE_DIRECTORY)
|
|
22
|
+
FileUtils.mkdir_p(source_directory) unless Dir.exists?(source_directory)
|
|
21
23
|
@prefix = Digest::SHA1.hexdigest('classifieds')
|
|
22
24
|
super
|
|
23
25
|
end
|
|
@@ -25,17 +27,17 @@ module Classifieds
|
|
|
25
27
|
desc 'keygen', 'Generate identity files using by public key encryption'
|
|
26
28
|
option :force, type: :boolean, aliases: '-f'
|
|
27
29
|
def keygen
|
|
28
|
-
if !options[:force] &&
|
|
30
|
+
if !options[:force] && keygenerated?
|
|
29
31
|
STDERR.puts 'Already generated in this repository'.color(:red)
|
|
30
32
|
exit 1
|
|
31
33
|
else
|
|
32
34
|
OpenSSL::Random.seed(File.read('/dev/random', 16))
|
|
33
35
|
rsa = OpenSSL::PKey::RSA.new(2048)
|
|
34
36
|
pub = rsa.public_key
|
|
35
|
-
File.open(PUBLIC_KEY_PATH, 'w') do |f|
|
|
37
|
+
File.open(File.join(root_directory, PUBLIC_KEY_PATH), 'w') do |f|
|
|
36
38
|
f.puts pub.to_pem
|
|
37
39
|
end
|
|
38
|
-
File.open(COMMON_KEY_PATH, 'w') do |f|
|
|
40
|
+
File.open(File.join(root_directory, COMMON_KEY_PATH), 'w') do |f|
|
|
39
41
|
f.puts pub.public_encrypt(OpenSSL::Random.random_bytes(16))
|
|
40
42
|
end
|
|
41
43
|
puts rsa
|
|
@@ -47,7 +49,7 @@ module Classifieds
|
|
|
47
49
|
def encrypt
|
|
48
50
|
if identity_file = options[:identity_file]
|
|
49
51
|
rsa = OpenSSL::PKey::RSA.new(File.read(identity_file).chomp)
|
|
50
|
-
@password = rsa.private_decrypt(File.read(COMMON_KEY_PATH).chomp)
|
|
52
|
+
@password = rsa.private_decrypt(File.read(File.join(root_directory, COMMON_KEY_PATH)).chomp)
|
|
51
53
|
else
|
|
52
54
|
@password = ask_password
|
|
53
55
|
retype_password
|
|
@@ -58,7 +60,6 @@ module Classifieds
|
|
|
58
60
|
|
|
59
61
|
file = File.open(file_path, 'r+')
|
|
60
62
|
file.flock(File::LOCK_EX)
|
|
61
|
-
|
|
62
63
|
data = file.read.chomp
|
|
63
64
|
|
|
64
65
|
begin
|
|
@@ -83,7 +84,7 @@ module Classifieds
|
|
|
83
84
|
def decrypt
|
|
84
85
|
if identity_file = options[:identity_file]
|
|
85
86
|
rsa = OpenSSL::PKey::RSA.new(File.read(identity_file).chomp)
|
|
86
|
-
@password = rsa.private_decrypt(File.read(COMMON_KEY_PATH).chomp)
|
|
87
|
+
@password = rsa.private_decrypt(File.read(File.join(root_directory, COMMON_KEY_PATH)).chomp)
|
|
87
88
|
else
|
|
88
89
|
@password = ask_password
|
|
89
90
|
end
|
|
@@ -94,7 +95,6 @@ module Classifieds
|
|
|
94
95
|
|
|
95
96
|
file = File.open(file_path, 'r+')
|
|
96
97
|
file.flock(File::LOCK_EX)
|
|
97
|
-
|
|
98
98
|
file.read(@prefix.size)
|
|
99
99
|
data = file.read.chomp
|
|
100
100
|
|
|
@@ -159,35 +159,41 @@ module Classifieds
|
|
|
159
159
|
end
|
|
160
160
|
|
|
161
161
|
def classifieds
|
|
162
|
-
Parser.parse(File.read(SOURCE_FILE).chomp)
|
|
162
|
+
Parser.parse(File.read(File.join(root_directory, SOURCE_FILE)).chomp)
|
|
163
163
|
end
|
|
164
164
|
|
|
165
165
|
def encrypt_data(data)
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(
|
|
169
|
-
@password,
|
|
170
|
-
File.expand_path(File.dirname(__FILE__)).split('/').pop,
|
|
171
|
-
1000,
|
|
172
|
-
cipher.key_len + cipher.iv_len
|
|
173
|
-
)
|
|
174
|
-
cipher.key = key_iv[0, cipher.key_len]
|
|
175
|
-
cipher.iv = key_iv[cipher.key_len, cipher.iv_len]
|
|
176
|
-
Base64.encode64(cipher.update(data) + cipher.final)
|
|
166
|
+
encryptor = Encryptor.new(@password, root_directory.split('/').pop)
|
|
167
|
+
encryptor.encrypt(data)
|
|
177
168
|
end
|
|
178
169
|
|
|
179
170
|
def decrypt_data(data)
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
171
|
+
encryptor = Encryptor.new(@password, root_directory.split('/').pop)
|
|
172
|
+
encryptor.decrypt(data)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def root_directory
|
|
176
|
+
@root_directory ||=
|
|
177
|
+
begin
|
|
178
|
+
target_directory = File.expand_path(Dir.pwd)
|
|
179
|
+
until target_directory == '/' do
|
|
180
|
+
Find.find(target_directory) do |path|
|
|
181
|
+
Find.prune if path =~ %r|^#{target_directory}/|
|
|
182
|
+
return target_directory if path =~ /#{SOURCE_FILE}$/
|
|
183
|
+
end
|
|
184
|
+
target_directory = File.expand_path('..', target_directory)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
nil
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def classifieds?
|
|
192
|
+
!!root_directory
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def keygenerated?
|
|
196
|
+
File.exists?(File.join(root_directory, PUBLIC_KEY_PATH)) && File.exists?(File.join(root_directory, COMMON_KEY_PATH))
|
|
191
197
|
end
|
|
192
198
|
|
|
193
199
|
def encrypted?(file)
|
data/lib/classifieds/version.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.2.
|
|
4
|
+
version: 0.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- kaihar4
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-10-
|
|
11
|
+
date: 2015-10-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: thor
|
|
@@ -84,6 +84,7 @@ files:
|
|
|
84
84
|
- classifieds.gemspec
|
|
85
85
|
- exe/classifieds
|
|
86
86
|
- lib/classifieds.rb
|
|
87
|
+
- lib/classifieds/encryptor.rb
|
|
87
88
|
- lib/classifieds/exception.rb
|
|
88
89
|
- lib/classifieds/main.rb
|
|
89
90
|
- lib/classifieds/parser.rb
|