cqr 0.0.1 → 0.0.2

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
  SHA1:
3
- metadata.gz: 093090407d6fc0f47f1e0e39f5bd07cb907452f6
4
- data.tar.gz: 3abc9d52c8c6790c7fe110fcb7e21d55e6a7b455
3
+ metadata.gz: 58db2f409a021efe800e37254cd64a8b2de3ca4c
4
+ data.tar.gz: 49c7ff066c867ebee2153adc460694e2494779df
5
5
  SHA512:
6
- metadata.gz: 30ed8f07971a90f87f4f7baa865dda51b8197b89f19c018a3940edeb2c67d14a6302a41174510b66231abf9dc54520609e34e1290daa61e2b0aff5d40e62eb26
7
- data.tar.gz: c9e56a1d545c629dc27decfcc02409c2e4271ff94b48f138b0a7ae85bd1523586f84a1be990f36ec9a027e059069f27f2d6755f524993aaebebd6269c99aeef0
6
+ metadata.gz: c9241d7f04016a719464e4d5a6977f29bef3319591bc25f43874b8c5669219e2aa3e88a04c77e3416cb419f741727c38adfc75c9e23d4d7aff8c8a4d9d91cd9c
7
+ data.tar.gz: 5d7367e56c5e685d7c7314eca7745c07f36e7b89b720526199859b62fe74e92a29902f9c3e3537ea47441a29350f63067577009d7775327301ac7b13108c5549
data/bin/cqr CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'cqr'
4
4
  require 'optparse'
5
5
  require 'pathname'
6
+ require 'io/console'
6
7
 
7
8
  basename = Pathname.new(__FILE__).basename
8
9
 
@@ -11,10 +12,6 @@ options = { margin: 4, invert: true }
11
12
  opt_parser = OptionParser.new do |opts|
12
13
  opts.banner = "Usage: #{basename} [options] TEXT"
13
14
 
14
- opts.on("-s SECRET", "--secret=SECRET", String, "[required] OTP secret") do |secret|
15
- options[:secret] = secret
16
- end
17
-
18
15
  opts.on("-m MARGIN", "--margin=MARGIN", Integer, "margin size in characters (default 4)") do |margin|
19
16
  options[:margin] = margin
20
17
  end
@@ -27,6 +24,9 @@ opt_parser = OptionParser.new do |opts|
27
24
  puts opt_parser
28
25
  exit
29
26
  end
27
+
28
+ opts.separator ""
29
+ opts.separator "for stdin input pass \"-\" as TEXT"
30
30
  end
31
31
 
32
32
  opt_parser.parse!
@@ -38,6 +38,10 @@ end
38
38
 
39
39
  text = ARGV.pop
40
40
 
41
+ if text == "-"
42
+ text = STDIN.read
43
+ end
44
+
41
45
  if !text || text.empty?
42
46
  puts opt_parser
43
47
  exit 1
data/bin/qrotp CHANGED
@@ -3,12 +3,13 @@
3
3
  require 'cqr/otp'
4
4
  require 'optparse'
5
5
  require 'base32'
6
+ require 'io/console'
6
7
 
7
- options = { margin: 4, invert: true }
8
+ options = { margin: 4, invert: true, type: 'totp' }
8
9
 
9
10
  opt_parser = OptionParser.new do |opts|
10
- opts.on("-n NAME", "--name=NAME", String, "[required] display name") do |name|
11
- options[:name] = name
11
+ opts.on("-l LABEL", "--label=LABEL", String, "[required] displayed label") do |label|
12
+ options[:label] = label
12
13
  end
13
14
 
14
15
  opts.on("-s SECRET", "--secret=SECRET", String, "[required] OTP secret") do |secret|
@@ -28,19 +29,69 @@ opt_parser = OptionParser.new do |opts|
28
29
  options[:invert] = invert
29
30
  end
30
31
 
32
+ opts.on("-e", "--echo", "don't hide stdin") do |echo|
33
+ options[:echo] = echo
34
+ end
35
+
36
+ opts.on("--issuer=ISSUER", String, "issuer of the secret") do |issuer|
37
+ options[:issuer] = issuer
38
+ end
39
+
40
+ opts.on("-d DIGITS", "--digits=DIGITS", Integer, "hotp/totp, default to totp") do |digits|
41
+ options[:digits] = digits
42
+ end
43
+
44
+ opts.on("-c COUNTER", "--counter=COUNTER", Integer, "counter state, required with hotp") do |counter|
45
+ options[:counter] = counter
46
+ end
47
+
48
+ opts.on("-t TYPE", "--type=TYPE", String, "hotp/totp, default to totp") do |type|
49
+ options[:type] = type
50
+ end
51
+
31
52
  opts.on("-h", "--help", "display this message") do
32
53
  puts opt_parser
33
54
  exit
34
55
  end
56
+
57
+ opts.separator ""
58
+ opts.separator "for stdin input pass \"-\" as NAME/SECRET"
35
59
  end
36
60
 
37
61
  opt_parser.parse!
38
62
 
39
- if !options.has_key?(:secret) || !options.has_key?(:name)
63
+
64
+ if !options.has_key?(:secret) || !options.has_key?(:label)
40
65
  puts opt_parser
41
66
  exit -1
42
67
  end
43
68
 
69
+ if options.has_key?(:type) && options[:type] == "hotp" && !options.has_key?(:counter)
70
+ puts opt_parser
71
+ exit -1
72
+ end
73
+
74
+ if options[:secret] == "-"
75
+ print "Enter secret: "
76
+ if options[:echo]
77
+ options[:secret] = STDIN.gets.chomp
78
+ else
79
+ options[:secret] = STDIN.noecho(&:gets).chomp
80
+ puts
81
+ end
82
+ end
83
+
84
+ if options[:label] == "-"
85
+ print "Enter label: "
86
+ if options[:echo]
87
+ options[:label] = STDIN.gets.chomp
88
+ else
89
+ options[:label] = STDIN.noecho(&:gets).chomp
90
+ puts
91
+ end
92
+ end
93
+
94
+
44
95
 
45
96
  if !options[:base32]
46
97
  binary = [options[:secret]].pack("H*")
@@ -49,10 +100,17 @@ end
49
100
 
50
101
 
51
102
 
52
- instance = CQR::OTP::Builder.new(options[:secret], options[:name]).to_qr
53
- instance.margin = options[:margin]
54
- instance.invert = options[:invert]
55
-
56
- puts instance.to_s
103
+ instance = CQR::OTP::Builder.new()
104
+ instance.secret = options[:secret]
105
+ instance.issuer = options[:issuer]
106
+ instance.type = options[:type]
107
+ instance.digits = options[:digits]
108
+ instance.counter = options[:counter]
109
+ instance.period = options[:period]
110
+ instance.label = options[:label]
57
111
 
112
+ qr_code = instance.to_qr
113
+ qr_code.margin = options[:margin]
114
+ qr_code.invert = options[:invert]
58
115
 
116
+ puts qr_code.to_s
data/lib/cqr.rb CHANGED
@@ -1 +1,4 @@
1
1
  require 'cqr/qr_formatter'
2
+
3
+ class CQRException < Exception
4
+ end
@@ -3,12 +3,54 @@ require 'cqr'
3
3
  module CQR
4
4
  module OTP
5
5
  class Builder
6
- def initialize(secret, name)
7
- @url = "otpauth://totp/#{name}?secret=#{secret}"
8
- end
6
+ VALID_TYPES = [ "hotp", "totp" ].freeze
7
+ VALID_DIGITS = [ 6, 8, nil ].freeze
8
+ VALID_PERIOD = [ 30, 60, nil ].freeze
9
+
10
+ attr_accessor :secret, :label, :issuer, :type, :digits, :counter, :period
9
11
 
10
12
  def to_qr
11
- QRFormatter.new(@url, 5)
13
+ QRFormatter.new(url)
14
+ end
15
+
16
+ def to_s
17
+ url
18
+ end
19
+
20
+ private
21
+
22
+ def build_type
23
+ raise CQRException.new("unknown type") unless VALID_TYPES.member?(type)
24
+ type
25
+ end
26
+
27
+ def build_digits
28
+ raise CQRException.new("wrong number of digits") unless VALID_DIGITS.member?(digits)
29
+ digits ? "&digits=#{digits}" : ""
30
+ end
31
+
32
+ def build_period
33
+ raise CQRException.new("wrong period") unless VALID_PERIOD.member?(period)
34
+ abort "period wit hotp" if period && type == "hotp"
35
+ period ? "&period=#{period}" : ""
36
+ end
37
+
38
+ def build_digits
39
+ digits ? "&digits=#{digits}" : ""
40
+ end
41
+
42
+ def build_issuer
43
+ issuer ? "&issuer=#{issuer}" : ""
44
+ end
45
+
46
+ def build_counter
47
+ raise CQRException.new("counter with non-hotp") if counter && type != "hotp"
48
+ counter ? "&counter=#{counter}" : ""
49
+ end
50
+
51
+ def url
52
+ "otpauth://#{build_type}/#{label}?secret=#{secret}#{build_digits}" +
53
+ "#{build_period}#{build_counter}#{build_issuer}"
12
54
  end
13
55
  end
14
56
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cqr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arkadiusz Hiler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-15 00:00:00.000000000 Z
11
+ date: 2013-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rqrcode
@@ -38,7 +38,7 @@ dependencies:
38
38
  - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.2.0
41
- description: CQR is comman-line tool for creating and displaying QR Codes.
41
+ description: CQR is command-line tool for creating and displaying QR Codes.
42
42
  email:
43
43
  - arkadiusz@hiler.pl
44
44
  executables:
@@ -47,14 +47,16 @@ executables:
47
47
  extensions: []
48
48
  extra_rdoc_files: []
49
49
  files:
50
+ - lib/cqr/otp.rb
50
51
  - lib/cqr/otp/builder.rb
51
52
  - lib/cqr/qr_formatter.rb
52
- - lib/cqr/otp.rb
53
53
  - lib/cqr.rb
54
54
  - bin/cqr
55
55
  - bin/qrotp
56
56
  homepage: https://github.com/ivyl/cqr
57
- licenses: []
57
+ licenses:
58
+ - MIT
59
+ - GPL-2
58
60
  metadata: {}
59
61
  post_install_message:
60
62
  rdoc_options: []