Module: TwoPass

Defined in:
lib/2pass.rb,
lib/2pass/version.rb

Constant Summary collapse

VAULT_DIR =
"#{Dir.home}/.2pass"
VERSION =
"2.0.0"

Class Method Summary collapse

Class Method Details

.add_secret(vault_name, id, value, env: nil) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/2pass.rb', line 60

def add_secret(vault_name, id, value, env: nil)
  new_secret = {
    id: id,
    value: value
  }
  data = load_vault(vault_name, env: env)
  existing_entry_id = data.find_index { |hash| hash[:id] == new_secret[:id] }
  if existing_entry_id
    raise "The secret already exists"
  end
  data << new_secret
  save_vault(vault_name, data, env: env)
end


15
16
17
18
19
20
21
22
23
24
25
# File 'lib/2pass.rb', line 15

def create_symlink(vault_name, target_path, env: nil)
  FileUtils.mkdir_p(VAULT_DIR)
  symlink_path = vault_file_path(vault_name, env: env)

  if File.exist?(symlink_path)
    puts "Symlink already exists: #{symlink_path}"
  else
    File.symlink(target_path, symlink_path)
    puts "Created symlink: #{symlink_path} -> #{target_path}"
  end
end

.get_secret(vault_name, id, env: nil) ⇒ Object



74
75
76
77
78
79
80
81
82
# File 'lib/2pass.rb', line 74

def get_secret(vault_name, id, env: nil)
  vault = load_vault(vault_name, env: env)
  entry = vault.find { |hash| hash[:id] == id }
  if entry
    entry[:value]
  else
    raise "Entry not found"
  end
end

.list_content(vault_name, env: nil, format: :table) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/2pass.rb', line 33

def list_content(vault_name, env: nil, format: :table)
  vault = load_vault(vault_name, env: env)
  if format == :table
    rows = vault
      .sort_by { |hash| hash[:id] }
      .each_with_object([]) do |h, arr|
      arr << [h[:id], h[:value]]
    end
    Terminal::Table.new(
      rows: rows,
      title: env || nil,
      style: {all_separators: true}
    ).to_s
  elsif format == :dotenv
    vault
      .map { |h| "#{h[:id]}=#{h[:value]}" }
      .sort
      .join("\n")
  elsif format == :json
    JSON.pretty_generate(
      vault
        .map { |hash| hash.slice(:id, :value) }
        .sort_by { |hash| hash[:id] }
    )
  end
end

.save_vault(vault_name, data, env: nil) ⇒ Object



27
28
29
30
31
# File 'lib/2pass.rb', line 27

def save_vault(vault_name, data, env: nil)
  FileUtils.mkdir_p(VAULT_DIR)
  file_path = vault_file_path(vault_name, env: env)
  File.write(file_path, YAML.dump(data))
end