opr 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b1792360804ff4bb0d545126ae92164e26c250bb78eb9970a8f449ceea2f6c73
4
- data.tar.gz: d22b82e1d53ce14e79fc7b650ad558faf0f604fce75f92627924faa8ec3252e7
3
+ metadata.gz: 60b9ea300b10f0bfe13e5b0920a77858e1368d6c5f03e3611867fc09e9d5d151
4
+ data.tar.gz: b2f3ade43eecbfab25e0bf21d2f21bbf99e7935b3f60a1ad3d1f10bc8ddd7d47
5
5
  SHA512:
6
- metadata.gz: 70ec8ea6492598f4afa3ca5406a61f3fd677334452637b69d2aaf28361ab2315223f325888850fad0b6ebeadbe535635348f9d2a8fe30cf6ee093199e3ce62d5
7
- data.tar.gz: cd1e34f9844125d3d17d2ab67e611293a916c10c972334789c7163387daaa5fd2bb3b6c5edec96fc95b422fe2953404ecc6d22c3d02b35740b1946fc6f0e18ab
6
+ metadata.gz: 59469077a64f27f07802049b2a1213b9ea32856230cd74a11c3d8673d60ef5c6ab920fb10d3af457ee28f169df52eab120bd792fe5492130304fc5df1da53cb4
7
+ data.tar.gz: ac4b903311d32d13afa1c14957e2ca0f19419dfddca70e61da4a9b55552ac0c2ccb120b1a94832159f8e59ef9e8deac7905765f000893db1bcb6984fe9d45a02
data/README.adoc CHANGED
@@ -1,15 +1,14 @@
1
- # Rubyists::Opr
1
+ # Opr
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/rubyists::opr`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ This gem supplies the `opr` binary, which wraps the 1password `op` cli from https://1password.com/downloads/command-line/.
4
+ The goal of opr is to be as compatible as possible with the `pass` cli from https://www.passwordstore.org/.
6
5
 
7
6
  ## Installation
8
7
 
9
8
  Add this line to your application's Gemfile:
10
9
 
11
10
  ```ruby
12
- gem 'rubyists::opr'
11
+ gem 'opr'
13
12
  ```
14
13
 
15
14
  And then execute:
@@ -18,11 +17,21 @@ And then execute:
18
17
 
19
18
  Or install it yourself as:
20
19
 
21
- $ gem install rubyists::opr
20
+ $ gem install opr
22
21
 
23
22
  ## Usage
24
23
 
25
- TODO: Write usage instructions here
24
+ - `opr --help`
25
+ - `opr list vaults` List all vaults
26
+ - `opr list items --vault=SomeVault` List all items in SomeVault
27
+ - `opr get SomeVault/SomeItem` Get the password from SomeVault named SomeItem. This should be piped to xclip/pbcopy.
28
+ - `opr gen` Generate a new password (8-16 characters)
29
+ - `echo "\#@%!" | opr gen` Generate a new password, using only "#@%!" as "special" characters.
30
+ - `opr gen -s15` Generate a new password, 15 chars long
31
+ - `opr gen -s15 NewItem` Generate a new password, 15 chars long, save as "NewItem" in vault "Private"
32
+ - `opr gen -m15 -M20 NewItem --vault=MyVault` Generate a new password, 15-20 chars long, save as "NewItem" in vault "MyVault"
33
+ - `opr rm NewItem --vault=MyVault` Remove the item 'NewItem' from vault 'MyVault'
34
+ - `opr rm NewItem` Remove the item 'NewItem' from vault 'Private'
26
35
 
27
36
  ## Development
28
37
 
@@ -32,13 +41,13 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
32
41
 
33
42
  ## Contributing
34
43
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/rubyists::opr. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/rubyists::opr/blob/master/CODE_OF_CONDUCT.md).
44
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[rubyists]/opr. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[rubyists]/opr/blob/master/CODE_OF_CONDUCT.md).
36
45
 
37
46
 
38
47
  ## Code of Conduct
39
48
 
40
- Everyone interacting in the Rubyists::Opr project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/rubyists::opr/blob/master/CODE_OF_CONDUCT.md).
49
+ Everyone interacting in the Rubyists::Opr project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[rubyists]/opr/blob/master/CODE_OF_CONDUCT.md).
41
50
 
42
51
  ## Copyright
43
52
 
44
- Copyright (c) 2019 Tj (bougyman) Vanderpoel. See [MIT License](LICENSE.txt) for further details.
53
+ Copyright (c) 2019 Tj (bougyman) Vanderpoel. See [MIT License](LICENSE.txt) for further details.
@@ -24,6 +24,20 @@ module Rubyists
24
24
  end
25
25
  map %w[--version -v] => :version
26
26
 
27
+ desc 'rm ITEM', 'Remove an item from a vault'
28
+ method_option :vault, aliases: '-v', type: :string,
29
+ desc: 'The vault to look for ITEM'
30
+ method_option :help, aliases: '-h', type: :boolean,
31
+ desc: 'Display usage information'
32
+ def rm(item)
33
+ if options[:help]
34
+ invoke :help, ['rm']
35
+ else
36
+ require_relative 'commands/rm'
37
+ Rubyists::Opr::Commands::Rm.new(item, options).execute
38
+ end
39
+ end
40
+
27
41
  desc 'get ITEM', 'Get the contents of an item'
28
42
  method_option :vault, aliases: '-v', type: :string, desc: 'Which vault the item is in'
29
43
  method_option :help, aliases: '-h', type: :boolean,
@@ -40,7 +40,8 @@ module Rubyists
40
40
  parsed = parse_path
41
41
  Opr.with_login do
42
42
  vault = Vault.find_by_name(parsed.vault)
43
- vault.insert(name: parsed.name, type: :login, password: pass, username: options[:username])
43
+ vault.insert(title: parsed.name, type: :login, password: pass,
44
+ username: options[:username], notes: options[:notes])
44
45
  end
45
46
  output.puts "#{parsed.name} saved in #{parsed.vault}"
46
47
  end
@@ -23,7 +23,7 @@ module Rubyists
23
23
  warn 'No vault specified, using "Private"'
24
24
  vault = 'Private'
25
25
  end
26
- Opr.with_login { output.puts Item.find(@item, vault: vault) }
26
+ Opr.with_login { output.puts Item.find(@item, vault: vault).password }
27
27
  end
28
28
  end
29
29
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../command'
4
+
5
+ module Rubyists
6
+ module Opr
7
+ # Commands namespace
8
+ module Commands
9
+ # the rm command
10
+ class Rm < Rubyists::Opr::Command
11
+ def initialize(item, options)
12
+ @item = item
13
+ @options = options
14
+ end
15
+
16
+ def execute(input: $stdin, output: $stdout) # rubocop:disable Lint/UnusedMethodArgument
17
+ vault_name = if options[:vault]
18
+ options[:vault]
19
+ else
20
+ warn 'No vault given, using "Private"'
21
+ 'Private'
22
+ end
23
+ Opr.with_login do
24
+ found = Item.find(@item, vault: vault_name)
25
+ return(output.puts("No item '#{@item}' found in vault '#{vault_name}'")) if found.nil?
26
+
27
+ found.delete!
28
+ output.puts "Removed '#{@item}' from '#{vault_name}'"
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,19 @@
1
+ {
2
+ "notesPlain": "<%= notes %>",
3
+ "sections": [],
4
+ "passwordHistory": [],
5
+ "fields": [
6
+ {
7
+ "value": "<%= username %>",
8
+ "name": "username",
9
+ "type": "T",
10
+ "designation": "username"
11
+ },
12
+ {
13
+ "value": "<%= password %>",
14
+ "name": "password",
15
+ "type": "P",
16
+ "designation": "password"
17
+ }
18
+ ]
19
+ }
@@ -10,13 +10,26 @@ module Rubyists
10
10
  new uuid: hash['uuid'], name: hash['overview']['title'], raw: hash
11
11
  end
12
12
 
13
+ def self.create(hash, title, vault = 'Private', type: :login)
14
+ cmd = TTY::Command.new pty: true, printer: :null
15
+
16
+ Opr.with_login do
17
+ cmd.run "#{Opr.opbin} create item '#{type.capitalize}' '#{hash}' --vault='#{vault}' --title='#{title}'"
18
+ end
19
+ end
20
+
13
21
  def self.find(item, vault:)
14
22
  cmd = TTY::Command.new pty: true, printer: :null
15
- out, err = cmd.run "#{Opr.opbin} get item '#{item}' --vault='#{vault}'"
23
+ out, err = Opr.with_login do
24
+ cmd.run "#{Opr.opbin} get item '#{item}' --vault='#{vault}'"
25
+ end
16
26
  raise Error, err unless err.empty?
17
27
 
18
- item = from_output out
19
- item.password
28
+ from_output out
29
+ rescue TTY::Command::ExitError => e
30
+ return nil if e.to_s.match? /item with query "#{Regexp.escape(item)}" not found/
31
+
32
+ raise
20
33
  end
21
34
 
22
35
  attr_reader :name, :uuid, :raw
@@ -26,6 +39,17 @@ module Rubyists
26
39
  @raw = raw
27
40
  end
28
41
 
42
+ def vault_uuid
43
+ @vault_uuid ||= raw['vaultUuid']
44
+ end
45
+
46
+ def delete!
47
+ Opr.with_login do
48
+ cmd = TTY::Command.new pty: true, printer: :null
49
+ cmd.run "#{Opr.opbin} delete item '#{name}' --vault='#{vault_uuid}'"
50
+ end
51
+ end
52
+
29
53
  def password
30
54
  pass_field = @raw['details']['fields'].detect { |f| f['designation'] == 'password' }
31
55
  pass_field['value']
@@ -13,7 +13,9 @@ module Rubyists
13
13
 
14
14
  def self.all
15
15
  cmd = TTY::Command.new pty: true, printer: :null
16
- out, err = cmd.run Opr.opbin, 'list', 'vaults'
16
+ out, err = Opr.with_login { cmd.run Opr.opbin, 'list', 'vaults' }
17
+ raise "Error #{err}" unless err.nil? || err.empty?
18
+
17
19
  vaults = JSON.parse out
18
20
  vaults.map { |v| from_hash v }
19
21
  end
@@ -28,21 +30,23 @@ module Rubyists
28
30
  @uuid = uuid
29
31
  end
30
32
 
31
- def insert(name:, password:, type: 'login', username: nil, notes: nil)
32
- current = Item.find(name, vault: self.name)
33
- raise "There is already an item named #{name} in the #{self.name} vault" if current
33
+ def insert(title:, password:, type: 'login', username: nil, notes: nil)
34
+ current = Item.find(title, vault: name)
35
+ raise "There is already an item named #{title} in the #{name} vault" if current
34
36
 
35
37
  tpl = Opr::LIBDIR.join("commands/templates/gen/#{type}.erb")
36
38
  erb = ERB.new(tpl.read)
37
- hash = JSON.parse erb.result(binding)
38
- Item.create!(hash, vault: uuid, name: name)
39
+ json = erb.result(binding)
40
+ Item.create(json, title, name, type: :login)
39
41
  end
40
42
 
41
43
  def items
42
44
  return @items if @items
43
45
 
44
46
  cmd = TTY::Command.new pty: true, printer: :null
45
- out, err = cmd.run "#{Opr.opbin} list items --vault='#{name}'"
47
+ out, err = Opr.with_login { cmd.run "#{Opr.opbin} list items --vault='#{name}'" }
48
+ raise "Error #{err}" unless err.nil? || err.empty?
49
+
46
50
  array = JSON.parse out
47
51
  @items = array.map { |h| Item.from_hash h }
48
52
  end
@@ -0,0 +1 @@
1
+ #
@@ -1,5 +1,5 @@
1
1
  module Rubyists
2
2
  module Opr
3
- VERSION = '0.2.0'.freeze
3
+ VERSION = '0.3.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tj (bougyman) Vanderpoel
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-23 00:00:00.000000000 Z
11
+ date: 2019-12-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -180,6 +180,8 @@ files:
180
180
  - lib/rubyists::opr/commands/list.rb
181
181
  - lib/rubyists::opr/commands/list/items.rb
182
182
  - lib/rubyists::opr/commands/list/vaults.rb
183
+ - lib/rubyists::opr/commands/rm.rb
184
+ - lib/rubyists::opr/commands/templates/gen/login.erb
183
185
  - lib/rubyists::opr/model/item.rb
184
186
  - lib/rubyists::opr/model/vault.rb
185
187
  - lib/rubyists::opr/templates/.gitkeep
@@ -188,6 +190,7 @@ files:
188
190
  - lib/rubyists::opr/templates/get/.gitkeep
189
191
  - lib/rubyists::opr/templates/list/items/.gitkeep
190
192
  - lib/rubyists::opr/templates/list/vaults/.gitkeep
193
+ - lib/rubyists::opr/templates/rm/.gitkeep
191
194
  - lib/rubyists::opr/utils.rb
192
195
  - lib/rubyists::opr/version.rb
193
196
  - rubyists::opr.gemspec