oplop 0.0.8 → 2.0.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
- SHA1:
3
- metadata.gz: 5923dcc29b4f4b6afbca3f1c0e46385040152e3c
4
- data.tar.gz: d37b05ca0e044ce15b5efedd05268a7b89b74da3
2
+ SHA256:
3
+ metadata.gz: fe387253f3e7471b962a13a3f4f9f6adf74779a51967b267cebb1cdb2262345c
4
+ data.tar.gz: 04ebb187af0d95379363d07af159e85b5a6cbbbca711ee2f131e8193e3805ba1
5
5
  SHA512:
6
- metadata.gz: dadf0a03d6ec98c09b2ee58a9602625423c008363f80d241cf4526e6b25525af1af1a643f4916ca18ed794db9949e8e98d21ea95d4b4a27015f5c34b8f0ee39f
7
- data.tar.gz: ab93468e5ab4a3c4becaa9ce1060313f53325353ba01856f877cae2b4b7fdad2a7df11f7241cb0808da533855b13556895b4207e7ea3691ca896db7452758959
6
+ metadata.gz: 82b7ec63eaabe9d9b3aee0b00631a4d7f8fb74d8a2273418c76e84f39995cd7dd68f4e67b0660d5221767df7faa27aea5476d76f583f0609cf7c9bf0f6ee39bb
7
+ data.tar.gz: f31f3e781ae750b59f91e46577c2631c755ddde0f3831adf16988985cca245070cae97dfae53427cd3dedf94a7b771ead7f5bd008f27a3100fce415a2a3d246d
@@ -0,0 +1 @@
1
+ 2.5.0
data/README.md CHANGED
@@ -1,22 +1,48 @@
1
1
  Oplop
2
2
  =====
3
3
 
4
- This is a ruby implementation of Oplop http://code.google.com/p/oplop/
4
+ This is a ruby implementation of Oplop http://code.google.com/p/oplop/, supporting the long oplop variation (see: https://github.com/thedod/loplop).
5
5
 
6
6
  Install
7
7
  =======
8
8
 
9
- gem install oplop
9
+ ```
10
+ gem install oplop
11
+ ```
10
12
 
11
13
  Usage
12
14
  =====
13
15
 
14
- Oplop.password(:master => "master-password", :label => "nickname")
16
+ Oplop and Loplop. Long Oplop defaults to 16 characters and support `<n>*` label
17
+ prefix for specifying length.
18
+
19
+ These will all produce the same password with the new default 16 character length:
20
+
21
+ ```ruby
22
+ Oplop.password(:master => "master-password", :label => "nickname")
23
+ Oplop.password(:master => "master-password", :label => "16*nickname")
24
+ Oplop.password(:master => "master-password", :label => "nickname", :length => 16)
25
+ ```
26
+
27
+ These will all produce the same password with the legacy 8 character length:
28
+ ```
29
+ Oplop.password(:master => "master-password", :label => "*nickname")
30
+ Oplop.password(:master => "master-password", :label => "8*nickname")
31
+ Oplop.password(:master => "master-password", :label => "nickname", :length => 8)
32
+ ```
33
+
34
+ This is a 20-character password
35
+ ```
36
+ Oplop.password(:master => "master-password", :label => "20*nickname")
37
+ ```
15
38
 
16
39
  CLI
17
40
  ===
18
41
 
19
- This includes an `oplop` program. Run `oplop --help` for more information.
42
+ This includes an `oplop` program that defaults to 8 character passwords. And a
43
+ new `loplop` program that defaults to 16 character passwords.
44
+
45
+ Run `oplop --help` for more information.
20
46
 
21
47
  License
22
48
  =======
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env ruby
2
+ oplop_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ $LOAD_PATH.unshift(oplop_dir) unless $LOAD_PATH.include?(oplop_dir)
4
+
5
+ require 'oplop'
6
+ require 'oplop/cli'
7
+ require 'highline/import'
8
+ require 'optparse'
9
+
10
+ # -- exit nicely if control-c
11
+ Signal.trap("SIGINT") { exit 2 }
12
+
13
+ # -- options
14
+ options = {}
15
+ optparse = OptionParser.new do |opts|
16
+ opts.banner = Oplop::Cli.banner
17
+
18
+ options[:verbose] = false
19
+ opts.on( '-v', '--verbose', 'Output the password to STDOUT' ) do
20
+ options[:verbose] = true
21
+ end
22
+
23
+ options[:new] = false
24
+ opts.on( '-n', '--new', 'New mode (2 prompt for master)') do
25
+ options[:new] = true
26
+ end
27
+
28
+ opts.on( '-h', '--help', 'Display this screen' ) do
29
+ puts opts
30
+ puts "\n"
31
+ puts Oplop::Cli.help
32
+ exit
33
+ end
34
+
35
+ end.parse!
36
+
37
+ # -- program
38
+ label = ARGV.shift
39
+
40
+ if label.nil? or label.empty?
41
+ puts "!! You need to pass in a label!"
42
+ exit 2
43
+ end
44
+
45
+
46
+ master = ask("Enter your master password: ") { |q| q.echo = "*" }
47
+
48
+ if options[:new]
49
+ master_confirm = ask("Enter your master password (again): ") { |q| q.echo = "*" }
50
+ if (master != master_confirm)
51
+ puts "!! Your master and confirm don't match!"
52
+ exit 2
53
+ end
54
+ end
55
+
56
+ password = Oplop.password(:label => label, :master => master)
57
+
58
+ if options[:verbose]
59
+ puts "\n Password for #{label}:\t#{password}\n\n"
60
+ end
61
+
62
+ if Oplop::Cli.copy_to_clipboard(password)
63
+ print "Your #{label} password has been copied to your clipboard. \n"
64
+ else
65
+ print "!! Could not copy to clipboard, try installing xclip. "
66
+ print "Run with --verbose flag to see password on STDOUT." unless options[:verbose]
67
+ print "\n"
68
+ end
data/bin/oplop CHANGED
@@ -53,7 +53,7 @@ if options[:new]
53
53
  end
54
54
  end
55
55
 
56
- password = Oplop.password(:label => label, :master => master)
56
+ password = Oplop.password(:label => label, :master => master, :length => Oplop::LEGACY_LENGTH)
57
57
 
58
58
  if options[:verbose]
59
59
  puts "\n Password for #{label}:\t#{password}\n\n"
@@ -1,42 +1,45 @@
1
1
  require 'digest/md5'
2
2
  require 'base64'
3
3
 
4
- module Oplop
4
+ class Oplop
5
+ attr_reader :master, :label, :length
5
6
 
6
- LENGTH = 8
7
+ LEGACY_LENGTH = 8
8
+ DEFAULT_LENGTH = 16
7
9
 
8
- #
9
- # Oplop.password(:master => 'p@ssw0rd', :label => 'github')
10
- #
11
10
  def self.password(args={})
12
- unless (args.keys.include?(:master) && args.keys.include?(:label))
13
- raise ArgumentError.new 'Master and label are required arguments.'
11
+ self.new(args).password
12
+ end
13
+
14
+ def initialize(args={})
15
+ @master = args[:master]
16
+ @label = args[:label]
17
+ @length = args[:length] || DEFAULT_LENGTH
18
+
19
+ if @label =~ /^([0-9]*)?\*/
20
+ (@length, @label) = @label.split('*')
21
+ @length = length.to_i
22
+ @length = LEGACY_LENGTH if length <= 0
14
23
  end
15
-
16
- master_label = '%s%s' % [ args.delete(:master), args.delete(:label) ]
17
-
18
- raise ArgumentError.new "Unknown keys #{args.keys.join(',')}." if args.keys.any?
19
-
20
-
21
- password = urlsafe_b64encode(Digest::MD5.digest(master_label))
22
-
24
+ end
25
+
26
+ def master_label
27
+ @master_label ||= '%s%s' % [ master, label ]
28
+ end
29
+
30
+ def password
31
+ password = Base64.urlsafe_encode64(Digest::MD5.digest(master_label))
32
+
23
33
  if password.respond_to?(:encode)
24
34
  password = password.encode('UTF-8')
25
35
  end
26
-
36
+
27
37
  if m = password.match(/\d+/)
28
- password = '%s%s' % [ m[0], password ] if (m.begin(0) >= LENGTH)
38
+ password = '%s%s' % [ m[0], password ] if (m.begin(0) >= length)
29
39
  else
30
40
  password = '1%s' % password
31
41
  end
32
-
33
- password[0,LENGTH]
34
- end
35
42
 
36
- # See http://www.ietf.org/rfc/rfc4648.txt
37
- # Ruby 1.8.x does not have this as part of the Base64 lib
38
- def self.urlsafe_b64encode(string)
39
- Base64.encode64(string).tr('+/', '-_')
43
+ password[0,length]
40
44
  end
41
-
42
45
  end
@@ -1,8 +1,8 @@
1
1
  require 'open3'
2
2
 
3
- module Oplop
3
+ class Oplop
4
4
  module Cli
5
-
5
+
6
6
  def self.banner
7
7
  "Usage: oplop [OPTIONS] [label]"
8
8
  end
@@ -11,14 +11,14 @@ module Oplop
11
11
  help = <<-HELP
12
12
  This is a simple cli program to generate oplop passwords.
13
13
 
14
- You will be prompted for your master password.
14
+ You will be prompted for your master password.
15
15
 
16
- The default behavior is to copy the password to your clipboard, and
17
- not display it. This works if you are on a Mac (and/or have pbcopy
18
- installed), or if you have xclip (installed for Linux).
16
+ The default behavior is to copy the password to your clipboard, and not display
17
+ it. This works if you are on a Mac (and/or have pbcopy installed), or if you
18
+ have xclip (installed for Linux).
19
19
 
20
- If you do not have pbcopy or xclip, you will have to run the program
21
- in verbose mode (--verbose).
20
+ If you do not have pbcopy or xclip, you will have to run the program in verbose
21
+ mode (--verbose).
22
22
 
23
23
  Here are some examples:
24
24
 
@@ -31,6 +31,20 @@ Print my gmail password to STDOUT.
31
31
  Copy a new password for amazon (prompts for master twice):
32
32
  oplop --new amazon
33
33
 
34
+ NEW: loplop
35
+
36
+ There is a new cli program called `loplop`, or long oplop. It will default to
37
+ passwords of 16 characters. It also has a new UX feature to specify the length:
38
+
39
+ loplop <n>*<label>
40
+
41
+ Where <n> is how long the password will be. The max is 22 characters. If you
42
+ start a label with *, it is a short-cut to the legacy length 8 (in other words
43
+ `8*label` and `*label` will generate the same password).
44
+
45
+ See: https://github.com/thedod/loplop
46
+
47
+
34
48
  Feedback, patches and bugs: https://github.com/bkaney/oplop
35
49
  HELP
36
50
  end
@@ -53,6 +67,6 @@ HELP
53
67
  end
54
68
  end
55
69
  end
56
-
70
+
57
71
  end
58
72
  end
@@ -1,3 +1,3 @@
1
- module Oplop
2
- VERSION = "0.0.8"
1
+ class Oplop
2
+ VERSION = "2.0.0"
3
3
  end
@@ -0,0 +1,16 @@
1
+ # language setting
2
+ language: ruby
3
+
4
+ # version numbers
5
+ rvm:
6
+ - 1.8.7
7
+ - 1.9.2
8
+ - 1.9.3
9
+ - 2.0.0
10
+ - 2.1.0
11
+ - jruby-18mode
12
+ - jruby-19mode
13
+ - rbx
14
+ - ruby-head
15
+ - jruby-head
16
+ - ree
@@ -2,23 +2,14 @@ require 'spec_helper'
2
2
 
3
3
  describe Oplop do
4
4
  describe ".password" do
5
- specify "valid arguments" do
6
- expect { Oplop.password(:master => "a", :label => "a") }.not_to raise_error
7
- end
8
-
9
- specify "invalid arguments" do
10
- expect { Oplop.password }.to raise_error(ArgumentError, /Master and label are required/)
11
- end
12
-
13
- specify "invalid arguments" do
14
- expect { Oplop.password(:master => "a", :label => "b", :foo => 'c') }.to raise_error(ArgumentError, /Unknown key/)
15
- end
16
-
17
5
  context "tests from testdata.json (see Python implementation at http://code.google.com/p/oplop/)" do
18
6
  # loop around each "case" in testdata.yml
19
7
  Yajl::Parser.new.parse(File.new(File.dirname(__FILE__) + "/testdata.json", 'r')).each do |testdata|
20
8
  specify testdata["why"] do
21
- password = Oplop.password(:master => testdata["master"], :label => testdata["label"])
9
+ password = Oplop.password(:master => testdata["master"], :label => "*" + testdata["label"])
10
+ expect(password).to eq testdata["password"]
11
+
12
+ password = Oplop.password(:master => testdata["master"], :length => 8, :label => testdata["label"])
22
13
  expect(password).to eq testdata["password"]
23
14
  end
24
15
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oplop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Kaney
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-07 00:00:00.000000000 Z
11
+ date: 2018-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -70,19 +70,23 @@ description: Provides a ruby library and command line tool for Oplop
70
70
  email:
71
71
  - brian@vermonster.com
72
72
  executables:
73
+ - loplop
73
74
  - oplop
74
75
  extensions: []
75
76
  extra_rdoc_files: []
76
77
  files:
77
78
  - ".gitignore"
79
+ - ".ruby-version"
78
80
  - Gemfile
79
81
  - README.md
80
82
  - Rakefile
83
+ - bin/loplop
81
84
  - bin/oplop
82
85
  - lib/oplop.rb
83
86
  - lib/oplop/cli.rb
84
87
  - lib/oplop/version.rb
85
88
  - oplop.gemspec
89
+ - shippable.yml
86
90
  - spec/oplop_spec.rb
87
91
  - spec/spec_helper.rb
88
92
  - spec/testdata.json
@@ -106,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
110
  version: '0'
107
111
  requirements: []
108
112
  rubyforge_project: oplop
109
- rubygems_version: 2.2.0
113
+ rubygems_version: 2.7.3
110
114
  signing_key:
111
115
  specification_version: 4
112
116
  summary: Oplop for Ruby