kbsecret 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/bin/kbsecret-new +25 -1
- data/bin/kbsecret-new-session +1 -1
- data/bin/kbsecret-rm +1 -1
- data/bin/kbsecret-sessions +1 -1
- data/lib/kbsecret/config.rb +3 -5
- data/lib/kbsecret/record/abstract.rb +38 -16
- data/lib/kbsecret/record/environment.rb +3 -26
- data/lib/kbsecret/record/login.rb +3 -26
- data/lib/kbsecret/record/unstructured.rb +2 -13
- data/lib/kbsecret/record.rb +7 -0
- data/lib/kbsecret/session.rb +1 -1
- data/lib/kbsecret.rb +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3a2b28b3170e4863d44f11502981d3089d632d9
|
4
|
+
data.tar.gz: fd5336473ba16c325225a4b91d66e59b3716d8a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f3a41f94c383af499a7d5271c16ed24a3f2dda3e3ef12b7520766860015191acb9aad6765f3349b09518ce0187a9a67762f026a4c8ad487b791d46909900f87
|
7
|
+
data.tar.gz: 228a9ef975f89767c5addf46204387a9f51c2a5f1fa5c1d6464c36d4cd33fc6308b8b86bb961a6570a0caa6cbd25badc5d673a3e70fa8a92601c7da1c30d2f76
|
data/README.md
CHANGED
data/bin/kbsecret-new
CHANGED
@@ -2,6 +2,11 @@
|
|
2
2
|
|
3
3
|
require "kbsecret"
|
4
4
|
require "slop"
|
5
|
+
require "abbrev"
|
6
|
+
require "tty-prompt"
|
7
|
+
|
8
|
+
# allows for abbreviated types (e.g., `kbsecret new env ...`)
|
9
|
+
TYPE_ALIASES = Abbrev.abbrev(KBSecret::Record.record_types).freeze
|
5
10
|
|
6
11
|
opts = Slop.parse suppress_errors: true do |o|
|
7
12
|
o.banner = <<~EOS
|
@@ -9,14 +14,18 @@ opts = Slop.parse suppress_errors: true do |o|
|
|
9
14
|
|
10
15
|
Usage:
|
11
16
|
kbsecret new [--session <name>] [--force] <type> <label> <args ...>
|
17
|
+
kbsecret new [--session <name>] [--force] [--interactive] <type> <label>
|
12
18
|
|
13
19
|
Examples:
|
14
20
|
kbsecret new login gmail "foo@bar.com" "mytopsecretpassword"
|
15
21
|
kbsecret new environment API_KEY "abcdef-0123456789"
|
22
|
+
kbsecret new --interactive login netflix
|
16
23
|
EOS
|
17
24
|
|
18
25
|
o.string "-s", "--session", "the session name", default: :default
|
19
26
|
o.bool "-f", "--force", "force creation (ignore overwrites, etc.)"
|
27
|
+
o.bool "-i", "--interactive", "input record fields interactively"
|
28
|
+
o.bool "-e", "--echo", "echo input to tty (only effects --interactive)"
|
20
29
|
|
21
30
|
o.on "-h", "--help" do
|
22
31
|
puts o
|
@@ -35,6 +44,8 @@ abort "Fatal: Not enough arguments." if opts.args.size < 2
|
|
35
44
|
session = KBSecret::Session.new label: sess_name
|
36
45
|
type, label = opts.args.shift 2
|
37
46
|
|
47
|
+
type = TYPE_ALIASES[type]
|
48
|
+
|
38
49
|
if session.record?(label) && !opts.force?
|
39
50
|
abort "Fatal: Refusing to overwrite an existing record without --force."
|
40
51
|
end
|
@@ -46,8 +57,21 @@ unless KBSecret::Record.type?(type)
|
|
46
57
|
EOS
|
47
58
|
end
|
48
59
|
|
60
|
+
fields = []
|
61
|
+
|
62
|
+
if opts.interactive?
|
63
|
+
prompt = TTY::Prompt.new
|
64
|
+
klass = KBSecret::Record.class_for(type)
|
65
|
+
klass.data_fields.each do |field|
|
66
|
+
fields << prompt.ask("#{field.capitalize}?", echo: opts.echo?)
|
67
|
+
end
|
68
|
+
else
|
69
|
+
fields = opts.args
|
70
|
+
end
|
71
|
+
|
72
|
+
|
49
73
|
begin
|
50
|
-
session.add_record(type, label, *
|
74
|
+
session.add_record(type, label, *fields)
|
51
75
|
rescue => e
|
52
76
|
abort "Fatal: #{e.to_s}."
|
53
77
|
end
|
data/bin/kbsecret-new-session
CHANGED
data/bin/kbsecret-rm
CHANGED
data/bin/kbsecret-sessions
CHANGED
@@ -20,7 +20,7 @@ opts = Slop.parse suppress_errors: true do |o|
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
KBSecret::Config.
|
23
|
+
KBSecret::Config.session_labels.each do |sess_name|
|
24
24
|
session_hash = KBSecret::Config.session(sess_name)
|
25
25
|
session = KBSecret::Session.new label: sess_name
|
26
26
|
line = "#{sess_name}\n"
|
data/lib/kbsecret/config.rb
CHANGED
@@ -40,22 +40,20 @@ module KBSecret
|
|
40
40
|
end
|
41
41
|
|
42
42
|
# @return [Array<Symbol>] all configured session labels
|
43
|
-
|
44
|
-
def self.session_names
|
43
|
+
def self.session_labels
|
45
44
|
@@config[:sessions].keys
|
46
45
|
end
|
47
46
|
|
48
47
|
# @param sess [Symbol] the session label
|
49
48
|
# @return [Boolean] whether or not the given session is configured
|
50
49
|
def self.session?(sess)
|
51
|
-
|
50
|
+
session_labels.include?(sess.to_sym)
|
52
51
|
end
|
53
52
|
|
54
53
|
# Configure a session.
|
55
54
|
# @param label [Symbol] the session label
|
56
55
|
# @param hsh [Hash] the session configuration
|
57
|
-
|
58
|
-
def self.add_session(label, hsh)
|
56
|
+
def self.configure_session(label, hsh)
|
59
57
|
@@config[:sessions][label.to_sym] = hsh
|
60
58
|
File.open(CONFIG_FILE, "w") { |io| io.write @@config.to_yaml }
|
61
59
|
end
|
@@ -12,24 +12,46 @@ module KBSecret
|
|
12
12
|
attr_reader :type
|
13
13
|
attr_reader :data
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
name.split("::").last.downcase
|
20
|
-
end
|
15
|
+
class << self
|
16
|
+
def data_field(field)
|
17
|
+
@fields ||= []
|
18
|
+
@fields << field
|
21
19
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
20
|
+
class_eval %[
|
21
|
+
def #{field}
|
22
|
+
@data[self.class.type.to_sym]["#{field}".to_sym]
|
23
|
+
end
|
24
|
+
|
25
|
+
def #{field}=(val)
|
26
|
+
@data[self.class.type.to_sym]["#{field}".to_sym] = val
|
27
|
+
sync!
|
28
|
+
end
|
29
|
+
]
|
30
|
+
end
|
31
|
+
|
32
|
+
def data_fields
|
33
|
+
@fields
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [String] the record's type
|
37
|
+
# @example
|
38
|
+
# KBSecret::Record::Abstract.type # => "abstract"
|
39
|
+
def type
|
40
|
+
name.split("::").last.downcase
|
41
|
+
end
|
42
|
+
|
43
|
+
# Load the given hash-representation into a record.
|
44
|
+
# @param session [Session] the session to associate with
|
45
|
+
# @param hsh [Hash] the record's hash-representation
|
46
|
+
# @return [Record::AbstractRecord] the created record
|
47
|
+
# @api private
|
48
|
+
def load!(session, hsh)
|
49
|
+
instance = allocate
|
50
|
+
instance.session = session
|
51
|
+
instance.initialize_from_hash(hsh)
|
31
52
|
|
32
|
-
|
53
|
+
instance
|
54
|
+
end
|
33
55
|
end
|
34
56
|
|
35
57
|
# Create a brand new record, associated with a session.
|
@@ -4,6 +4,9 @@ module KBSecret
|
|
4
4
|
module Record
|
5
5
|
# Represents a record containing an environment variable and value.
|
6
6
|
class Environment < Abstract
|
7
|
+
data_field :variable
|
8
|
+
data_field :value
|
9
|
+
|
7
10
|
# @param session [Session] the session to associate with
|
8
11
|
# @param label [Symbol] the new record's label
|
9
12
|
# @param variable [String] the new record's variable
|
@@ -22,32 +25,6 @@ module KBSecret
|
|
22
25
|
}
|
23
26
|
end
|
24
27
|
|
25
|
-
# @return [String] the record's variable
|
26
|
-
def variable
|
27
|
-
@data[:environment][:variable]
|
28
|
-
end
|
29
|
-
|
30
|
-
# @param var [String] the new variable to insert into the record
|
31
|
-
# @return [void]
|
32
|
-
# @note Triggers a record sync; see {Abstract#sync!}.
|
33
|
-
def variable=(var)
|
34
|
-
@data[:environment][:variable] = var
|
35
|
-
sync!
|
36
|
-
end
|
37
|
-
|
38
|
-
# @return [String] the record's value
|
39
|
-
def value
|
40
|
-
@data[:environment][:value]
|
41
|
-
end
|
42
|
-
|
43
|
-
# @param val [String] the new value to insert into the record
|
44
|
-
# @return [void]
|
45
|
-
# @note Triggers a record sync; see {Abstract#sync!}.
|
46
|
-
def value=(val)
|
47
|
-
@data[:environment][:value] = val
|
48
|
-
sync!
|
49
|
-
end
|
50
|
-
|
51
28
|
# @return [String] a sh-style environment assignment
|
52
29
|
def to_assignment
|
53
30
|
"#{variable}=#{value}"
|
@@ -2,6 +2,9 @@ module KBSecret
|
|
2
2
|
module Record
|
3
3
|
# Represents a record containing a login (username, password) pair.
|
4
4
|
class Login < Abstract
|
5
|
+
data_field :username
|
6
|
+
data_field :password
|
7
|
+
|
5
8
|
# @param session [Session] the session to associate with
|
6
9
|
# @param label [Symbol] the new record's label
|
7
10
|
# @param user [String] the new record's username
|
@@ -16,32 +19,6 @@ module KBSecret
|
|
16
19
|
},
|
17
20
|
}
|
18
21
|
end
|
19
|
-
|
20
|
-
# @return [String] the record's username
|
21
|
-
def username
|
22
|
-
@data[:login][:username]
|
23
|
-
end
|
24
|
-
|
25
|
-
# @param user [String] the new username to insert into the record
|
26
|
-
# @return [void]
|
27
|
-
# @note Triggers a record sync; see {Abstract#sync!}.
|
28
|
-
def username=(user)
|
29
|
-
@data[:login][:username] = user
|
30
|
-
sync!
|
31
|
-
end
|
32
|
-
|
33
|
-
# @return [String] the record's password
|
34
|
-
def password
|
35
|
-
@data[:login][:password]
|
36
|
-
end
|
37
|
-
|
38
|
-
# @param pass [String] the new password to insert into the record
|
39
|
-
# @return [void]
|
40
|
-
# @note Triggers a record sync; see {Abstract#sync!}.
|
41
|
-
def password=(pass)
|
42
|
-
@data[:login][:password] = pass
|
43
|
-
sync!
|
44
|
-
end
|
45
22
|
end
|
46
23
|
end
|
47
24
|
end
|
@@ -2,6 +2,8 @@ module KBSecret
|
|
2
2
|
module Record
|
3
3
|
# Represents a record containing unstructured text.
|
4
4
|
class Unstructured < Abstract
|
5
|
+
data_field :text
|
6
|
+
|
5
7
|
# @param session [Session] the session to associate with
|
6
8
|
# @param label [Symbol] the new record's label
|
7
9
|
# @param text [String] the new record's unstructured text
|
@@ -12,19 +14,6 @@ module KBSecret
|
|
12
14
|
text: text
|
13
15
|
}
|
14
16
|
end
|
15
|
-
|
16
|
-
# @return [String] the record's unstructured text
|
17
|
-
def text
|
18
|
-
@data[:text]
|
19
|
-
end
|
20
|
-
|
21
|
-
# @param new_text [String] the new text to insert into the record
|
22
|
-
# @return [void]
|
23
|
-
# @note Triggers a record sync; see {Abstract#sync!}.
|
24
|
-
def text=(new_text)
|
25
|
-
@data[:text] = new_text
|
26
|
-
sync!
|
27
|
-
end
|
28
17
|
end
|
29
18
|
end
|
30
19
|
end
|
data/lib/kbsecret/record.rb
CHANGED
@@ -20,6 +20,13 @@ module KBSecret
|
|
20
20
|
record_classes.map(&:type)
|
21
21
|
end
|
22
22
|
|
23
|
+
# @param type [String] the record type
|
24
|
+
# @return [Class, nil] the record class corresponding to the given type
|
25
|
+
def self.class_for(type)
|
26
|
+
record_classes.find { |c| c.type == type }
|
27
|
+
end
|
28
|
+
|
29
|
+
# @param type [String] the record type
|
23
30
|
# @return [Boolean] whether a record class exists of the given type
|
24
31
|
def self.type?(type)
|
25
32
|
record_types.include?(type)
|
data/lib/kbsecret/session.rb
CHANGED
@@ -14,7 +14,7 @@ module KBSecret
|
|
14
14
|
# @param label [Symbol] the label of the session to initialize
|
15
15
|
# @note This does not *create* a new session, but loads one already
|
16
16
|
# specified in {Config::CONFIG_FILE}. To *create* a new session,
|
17
|
-
# see {Config.
|
17
|
+
# see {Config.configure_session}.
|
18
18
|
def initialize(label: :default)
|
19
19
|
@label = label
|
20
20
|
@config = Config.session(label.to_sym)
|
data/lib/kbsecret.rb
CHANGED
@@ -8,7 +8,7 @@ require_relative "kbsecret/session"
|
|
8
8
|
# The primary namespace for kbsecret.
|
9
9
|
module KBSecret
|
10
10
|
# kbsecret's current version
|
11
|
-
VERSION = "0.0.
|
11
|
+
VERSION = "0.0.3".freeze
|
12
12
|
|
13
13
|
# fail very early if the user doesn't have keybase and KBFS running
|
14
14
|
raise Keybase::KeybaseNotRunningError unless Keybase.running?
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kbsecret
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Woodruff
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: keybase-unofficial
|
@@ -55,14 +55,14 @@ dependencies:
|
|
55
55
|
description: Manages your passwords, environment, and more via KBFS.
|
56
56
|
email: william@tuffbizz.com
|
57
57
|
executables:
|
58
|
-
- kbsecret
|
59
|
-
- kbsecret-new-session
|
60
|
-
- kbsecret-new
|
58
|
+
- kbsecret
|
61
59
|
- kbsecret-rm
|
62
|
-
- kbsecret-list
|
63
60
|
- kbsecret-login
|
61
|
+
- kbsecret-new
|
64
62
|
- kbsecret-env
|
65
|
-
- kbsecret
|
63
|
+
- kbsecret-new-session
|
64
|
+
- kbsecret-list
|
65
|
+
- kbsecret-sessions
|
66
66
|
extensions: []
|
67
67
|
extra_rdoc_files: []
|
68
68
|
files:
|