cqr 0.0.1 → 0.0.2

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
  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: []