leeloo 0.0.16 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,84 +1,120 @@
1
1
  require 'gpgme'
2
- require 'tty-tree'
3
- require 'git'
4
2
  require 'fileutils'
3
+ require 'digest'
5
4
 
6
5
  module Leeloo
7
-
8
6
  class Secret
9
7
 
10
- def self.list(keystore, ascii)
11
- if ascii
12
- Dir.glob("#{keystore}/secrets/**/*.gpg")
13
- .sort
14
- .reject { |path| File.directory? path }
15
- .each { |secret| puts secret.gsub(/#{keystore}\/secrets\//, '').gsub(/\.gpg/, '') }
16
- else
17
- puts TTY::Tree.new("#{keystore}/secrets").render.gsub(/\.gpg/, '')
18
- end
8
+ attr_reader :name
9
+
10
+ def initialize name
11
+ @name = name
12
+ end
13
+
14
+ def == secret
15
+ @name == secret.name
16
+ end
17
+
18
+ def read
19
+ # returns the secret
20
+ end
21
+
22
+ def write phrase
23
+ # write the secret
24
+ end
25
+
26
+ def erase
27
+ # erase the secret
28
+ end
29
+
30
+ def footprint
31
+ # a footprint is a token proving the authenticity of a secret
32
+ end
33
+ end
34
+
35
+ class LocalFileSystemSecret < Secret
36
+
37
+ attr_reader :pathname
38
+
39
+ def initialize pathname, name
40
+ super name
41
+ @pathname = pathname
19
42
  end
20
43
 
21
- def self.add_secret(keystore, name, secret)
22
- recipients = []
23
- Dir.foreach("#{keystore}/keys") { |key| recipients << File.basename(key, ".*") unless File.directory? key }
44
+ def read
45
+ File.read @pathname
46
+ end
24
47
 
25
- FileUtils.mkdir_p File.dirname "#{keystore}/secrets/#{name}"
48
+ def write phrase
49
+ FileUtils.mkdir_p File.dirname @pathname
50
+ File.write @pathname, phrase
51
+ end
26
52
 
27
- crypto = GPGME::Crypto.new :always_trust => true
28
- crypto.encrypt secret,
29
- :output => File.open("#{keystore}/secrets/#{name}.gpg","w+"),
30
- :recipients => recipients
53
+ def erase
54
+ File.delete @pathname
55
+ end
31
56
 
32
- g = Git.open keystore
33
- g.add "#{keystore}/secrets/#{name}.gpg"
34
- g.commit "secret #{name} added"
57
+ def footprint
58
+ secret = File.read @pathname
59
+ md5 = Digest::MD5.new
60
+ md5 << secret
61
+ md5.hexdigest
35
62
  end
36
63
 
37
- def self.read_secret(keystore, name)
38
- crypto = GPGME::Crypto.new
39
- crypto.decrypt File.open("#{keystore}/secrets/#{name}.gpg")
64
+ end
65
+
66
+ class GpgLocalFileSystemSecret < LocalFileSystemSecret
67
+
68
+ def initialize pathname, name, recipients
69
+ super pathname, name
70
+ @recipients = recipients
71
+ @crypto = GPGME::Crypto.new :always_trust => true
72
+ end
73
+
74
+ def read
75
+ @crypto.decrypt File.open(@pathname)
40
76
  end
41
77
 
42
- def self.delete_secret(keystore, name)
43
- g = Git.open keystore
44
- g.remove "#{keystore}/secrets/#{name}.gpg"
45
- g.commit "secret #{name} removed"
78
+ def write phrase
79
+ FileUtils.mkdir_p File.dirname @pathname
80
+ @crypto.encrypt phrase,
81
+ :output => File.open(@pathname,"w+"),
82
+ :recipients => @recipients
46
83
  end
47
84
 
48
- def self.sign_secrets keystore
85
+ end
86
+
87
+ class GitSecretDecorator < Secret
88
+
89
+ def initialize git, secret
90
+ @git = git
91
+ @secret = secret
92
+ end
49
93
 
50
- g = Git.open keystore
94
+ def name
95
+ @secret.name
96
+ end
51
97
 
52
- recipients = []
53
- Dir.foreach("#{keystore}/keys") do |key|
54
- unless File.directory? key
55
- recipients << File.basename(key, ".*")
56
- GPGME::Key.import(File.open("#{keystore}/keys/#{key}"))
57
- end
58
- end
98
+ def read
99
+ @secret.read
100
+ end
59
101
 
60
- crypto = GPGME::Crypto.new :always_trust => true
61
- find_secrets("#{keystore}/secrets").each do |secret|
62
- say "."
63
- decrypted = crypto.decrypt File.open(secret)
64
- crypto.encrypt decrypted,
65
- :output => File.open(secret,"w+"),
66
- :recipients => recipients
67
- g.add secret
68
- end
102
+ def footprint
103
+ @secret.footprint
104
+ end
69
105
 
70
- g.commit "sync"
71
- return true
106
+ def write phrase
107
+ @secret.write phrase
108
+ @git.add @secret.pathname
109
+ @git.commit "secret #{@secret.name} added"
72
110
  end
73
111
 
74
- def self.find_secrets path
75
- elements = []
76
- Dir.glob("#{path}/**") do |element|
77
- elements << element unless Dir.exist? element
78
- elements << find_secrets(element) if Dir.exist? element
79
- end
80
- return elements.flatten
112
+ def erase
113
+ @secret.erase
114
+ @git.remove @secret.pathname
115
+ @git.commit "secret #{@secret.name} removed"
81
116
  end
82
117
 
83
118
  end
119
+
84
120
  end
@@ -0,0 +1,37 @@
1
+ require 'webrick'
2
+ require 'json'
3
+ require 'base64'
4
+
5
+ class Server
6
+
7
+ def start preferences
8
+
9
+ puts """
10
+ Please share this url :
11
+ http://your_ip:8000\?q=YOUR_TOKEN
12
+
13
+ run ssh -R:localhost:8000 ssh.localhost.run
14
+ if you want to share your password through tunneling
15
+ """
16
+
17
+ server = WEBrick::HTTPServer.new :Port => 8000
18
+ server.mount_proc '/' do |req, res|
19
+ query = req.query()["q"] || req.body()
20
+ if query
21
+ begin
22
+ body = JSON.parse(Base64.strict_decode64 query)
23
+ key = body["body"] ? JSON.parse(body["body"]) : body
24
+ res.body = preferences.keystore(key["keystore"]).secret_from_footprint(key).read.to_s
25
+ rescue => exception
26
+ puts exception
27
+ res.status = 400
28
+ end
29
+ else
30
+ res.status = 400
31
+ end
32
+ end
33
+
34
+ trap 'INT' do server.shutdown end
35
+ server.start
36
+ end
37
+ end
@@ -1,4 +1,4 @@
1
1
  module Leeloo
2
- VERSION = '0.0.16'.freeze
2
+ VERSION = '0.4.1'.freeze
3
3
  DESCRIPTION = "The easiest way to share securely your secrets".freeze
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leeloo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.16
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
- - Sylvek
8
- autorequire:
7
+ - sylvek
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-27 00:00:00.000000000 Z
11
+ date: 2021-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commander
@@ -53,89 +53,89 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.5'
55
55
  - !ruby/object:Gem::Dependency
56
- name: terminal-table
56
+ name: tty-table
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.8'
61
+ version: '0.10'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '1.8'
68
+ version: '0.10'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: tty-tree
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.1'
75
+ version: '0.3'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0.1'
82
+ version: '0.3'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: clipboard
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.1'
89
+ version: '1.3'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '1.1'
96
+ version: '1.3'
97
97
  - !ruby/object:Gem::Dependency
98
- name: ffi
98
+ name: webrick
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '1.9'
103
+ version: '1.7'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '1.9'
110
+ version: '1.7'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: bundler
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '1.15'
117
+ version: '2'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '1.15'
124
+ version: '2'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rake
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '10.0'
131
+ version: '12.0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '10.0'
138
+ version: '12.0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rspec
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '3.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rspec_junit_formatter
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '0.4'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '0.4'
153
167
  description: The easiest way to share securely your secrets
154
168
  email:
155
169
  - smaucourt@gmail.com
@@ -161,15 +175,18 @@ files:
161
175
  - exe/leeloo
162
176
  - lib/leeloo.rb
163
177
  - lib/leeloo/command.rb
164
- - lib/leeloo/config.rb
178
+ - lib/leeloo/controller.rb
165
179
  - lib/leeloo/keystore.rb
180
+ - lib/leeloo/output.rb
181
+ - lib/leeloo/preferences.rb
166
182
  - lib/leeloo/secret.rb
183
+ - lib/leeloo/server.rb
167
184
  - lib/leeloo/version.rb
168
- homepage: https://github.com/sylvek
185
+ homepage: https://github.com/sylvek/leeloo
169
186
  licenses:
170
187
  - MIT
171
188
  metadata: {}
172
- post_install_message:
189
+ post_install_message:
173
190
  rdoc_options: []
174
191
  require_paths:
175
192
  - lib
@@ -184,9 +201,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
201
  - !ruby/object:Gem::Version
185
202
  version: '0'
186
203
  requirements: []
187
- rubyforge_project:
188
- rubygems_version: 2.7.7
189
- signing_key:
204
+ rubygems_version: 3.1.4
205
+ signing_key:
190
206
  specification_version: 4
191
207
  summary: The easiest way to share securely your secrets
192
208
  test_files: []
@@ -1,62 +0,0 @@
1
- require 'yaml'
2
- require 'terminal-table'
3
-
4
- module Leeloo
5
- class Config
6
-
7
- PATH = "#{Dir.home}/.leeloo"
8
-
9
- @@keystores = []
10
-
11
- @@default = { "keystore" => "private" }
12
-
13
- def self.default
14
- @@default
15
- end
16
-
17
- def self.init
18
- Keystore::add_keystore "private", "#{PATH}/private"
19
- Config::add_keystore "private", "#{PATH}/private"
20
- end
21
-
22
- def self.list_keystores(ascii)
23
- if ascii
24
- @@keystores.each { |keystore| puts keystore['name'] }
25
- else
26
- rows = []
27
- @@keystores.each do |keystore|
28
- is_default = '*' if keystore['name'] == @@default['keystore']
29
- rows << [keystore['name'], keystore['path'], is_default ]
30
- end
31
- say Terminal::Table.new :headings => ['Name', 'Path', 'Default'], :rows => rows
32
- end
33
- end
34
-
35
- def self.load
36
- FileUtils.mkdir_p PATH
37
- if File.exist? "#{PATH}/keystores"
38
- @@keystores = YAML.load_file "#{PATH}/keystores"
39
- end
40
- if File.exist? "#{PATH}/config"
41
- @@default = YAML.load_file "#{PATH}/config"
42
- end
43
- end
44
-
45
- def self.add_keystore name, path
46
- keystore = { 'name' => name, 'path' => path}
47
- unless @@keystores.include? keystore
48
- @@keystores << keystore
49
- File.write("#{PATH}/keystores", @@keystores.to_yaml)
50
- end
51
- end
52
-
53
- def self.get_keystore name
54
- @@keystores.each do |keystore|
55
- return keystore['path'] if keystore['name'] == name
56
- end
57
-
58
- raise "keystore not found"
59
- end
60
-
61
- end
62
- end