opr 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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