Class: SecretManager
- Inherits:
-
FileManager
- Object
- FileManager
- SecretManager
- Defined in:
- lib/team-secrets/secret_manager.rb
Instance Attribute Summary collapse
-
#master_key ⇒ Object
Returns the value of attribute master_key.
-
#working_dir ⇒ Object
Returns the value of attribute working_dir.
Attributes inherited from FileManager
Instance Method Summary collapse
-
#add(secret_name, secret, account = nil, tags = [], notes = nil) ⇒ Object
Add a secret.
-
#find(secret_name, tags = [], decrypt = true) ⇒ Object
Search for a secret, must have all tags given.
-
#getAll(tags = []) ⇒ Object
Get all decrypted secrets.
-
#getSecret(secret_name, tags = []) ⇒ Object
Get decrypted secret, array of secrets if mutliple matches.
-
#initialize(master_key = nil) ⇒ SecretManager
constructor
A new instance of SecretManager.
-
#remove(secret_name, tags = []) ⇒ Object
Remove a secret, must have all tags given.
-
#rotateMasterKey(new_master_key) ⇒ Object
Change the encryption key for all secrets.
Methods inherited from FileManager
Constructor Details
#initialize(master_key = nil) ⇒ SecretManager
Returns a new instance of SecretManager.
8 9 10 11 12 |
# File 'lib/team-secrets/secret_manager.rb', line 8 def initialize(master_key = nil) @@working_dir = Dir.pwd @@master_key = master_key unless master_key.nil? @data = @data || [] end |
Instance Attribute Details
#master_key ⇒ Object
Returns the value of attribute master_key.
6 7 8 |
# File 'lib/team-secrets/secret_manager.rb', line 6 def master_key @master_key end |
#working_dir ⇒ Object
Returns the value of attribute working_dir.
6 7 8 |
# File 'lib/team-secrets/secret_manager.rb', line 6 def working_dir @working_dir end |
Instance Method Details
#add(secret_name, secret, account = nil, tags = [], notes = nil) ⇒ Object
Add a secret
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/team-secrets/secret_manager.rb', line 23 def add(secret_name, secret, account = nil, = [], notes = nil) unless find(secret_name, , false).empty? raise 'Secret already exists with these tags' end = [] unless .is_a? Array secret_data = { name: secret_name, tags: , account: account, # like the user name or email, if applicable secret: @@master_key.class.bin_to_hex( @@master_key.encryptSecret(secret) ), notes: notes, added: Time.now } @data.push secret_data end |
#find(secret_name, tags = [], decrypt = true) ⇒ Object
Search for a secret, must have all tags given
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/team-secrets/secret_manager.rb', line 60 def find(secret_name, = [], decrypt = true) = [] unless .is_a? Array return_data = [] @data.each do |secret_data| if (secret_data[:name] == secret_name) next unless .empty? || ( - secret_data[:tags]).empty? # If no tags or secret has all tags this_secret = secret_data.dup if decrypt this_secret[:secret] = @@master_key.decryptSecret(@@master_key.class.hex_to_bin this_secret[:secret]) end return_data.push(this_secret) end end return_data end |
#getAll(tags = []) ⇒ Object
Get all decrypted secrets
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/team-secrets/secret_manager.rb', line 103 def getAll( = []) = [] unless .is_a? Array return_data = [] @data.each do |secret_data| if (.empty? || ( - secret_data[:tags]).empty?) # If no tags or secret has all tags return_data.push( name: secret_data[:name], tags: secret_data[:tags] || [], account: secret_data[:account], secret: @@master_key.decryptSecret(@@master_key.class.hex_to_bin secret_data[:secret]) ) end end return_data end |
#getSecret(secret_name, tags = []) ⇒ Object
Get decrypted secret, array of secrets if mutliple matches
81 82 83 84 85 86 87 |
# File 'lib/team-secrets/secret_manager.rb', line 81 def getSecret(secret_name, = []) res = find(secret_name, ) return nil if res.empty? res = res.map {|x| x[:secret]} return res[0] if res.length == 1 res end |
#remove(secret_name, tags = []) ⇒ Object
Remove a secret, must have all tags given
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/team-secrets/secret_manager.rb', line 43 def remove(secret_name, = []) = [] unless .is_a? Array removed = 0 @data.keep_if do |secret_data| if (secret_data[:name] == secret_name) && (.empty? || ( - secret_data[:tags]).empty?) removed += 1 false else true end end removed end |
#rotateMasterKey(new_master_key) ⇒ Object
Change the encryption key for all secrets
90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/team-secrets/secret_manager.rb', line 90 def rotateMasterKey(new_master_key) @data = @data.map do |secret_data| secret = secret_data[:secret] plain_text = @@master_key.decryptSecret( @@master_key.class.hex_to_bin secret ) secret = @@master_key.class.bin_to_hex( new_master_key.encryptSecret(plain_text) ) secret_data[:secret] = secret secret_data end @@master_key = new_master_key end |