rotp 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.rspec +3 -0
- data/README.markdown +41 -0
- data/doc/ROTP/HOTP.html +308 -0
- data/doc/ROTP/OTP.html +593 -0
- data/doc/ROTP/TOTP.html +493 -0
- data/doc/Rotp.html +179 -0
- data/doc/_index.html +144 -0
- data/doc/class_list.html +36 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +53 -0
- data/doc/css/style.css +310 -0
- data/doc/file.README.html +89 -0
- data/doc/file_list.html +38 -0
- data/doc/frames.html +13 -0
- data/doc/index.html +89 -0
- data/doc/js/app.js +203 -0
- data/doc/js/full_list.js +149 -0
- data/doc/js/jquery.js +154 -0
- data/doc/method_list.html +155 -0
- data/doc/top-level-namespace.html +88 -0
- data/lib/rotp.rb +10 -1
- data/lib/rotp/hotp.rb +14 -0
- data/lib/rotp/otp.rb +25 -5
- data/lib/rotp/totp.rb +20 -5
- data/lib/rotp/version.rb +2 -2
- data/rotp.gemspec +2 -2
- data/spec/base_spec.rb +19 -0
- metadata +25 -5
data/lib/rotp/totp.rb
CHANGED
@@ -3,28 +3,43 @@ module ROTP
|
|
3
3
|
|
4
4
|
attr_reader :interval
|
5
5
|
|
6
|
+
# @option options [Integer] interval (30) the time interval in seconds for OTP
|
7
|
+
# This defaults to 30 which is standard.
|
6
8
|
def initialize(s, options = {})
|
7
9
|
@interval = options[:interval] || 30
|
8
10
|
super
|
9
11
|
end
|
10
12
|
|
13
|
+
# Accepts either a Unix timestamp integer or a Time object.
|
14
|
+
# Time objects will be adjusted to UTC automatically
|
15
|
+
# @param [Time/Integer] time the time to generate an OTP for
|
11
16
|
def at(time)
|
12
17
|
unless time.class == Time
|
13
18
|
time = Time.at(time.to_i)
|
14
19
|
end
|
15
|
-
generate_otp(
|
20
|
+
generate_otp(timecode(time))
|
16
21
|
end
|
17
22
|
|
23
|
+
# Generate the current time OTP
|
24
|
+
# @return [Integer] the OTP as an integer
|
18
25
|
def now
|
19
|
-
generate_otp(
|
26
|
+
generate_otp(timecode(Time.now))
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns the provisioning URI for the OTP
|
30
|
+
# This can then be encoded in a QR Code and used
|
31
|
+
# to provision the Google Authenticator app
|
32
|
+
# @param [String] name of the account
|
33
|
+
# @return [String] provisioning uri
|
34
|
+
def provisioning_uri(name)
|
35
|
+
"otpauth://totp/#{URI.encode(name)}?secret=#{secret}"
|
20
36
|
end
|
21
37
|
|
22
38
|
private
|
23
39
|
|
24
|
-
def
|
40
|
+
def timecode(time)
|
25
41
|
i = time.utc.to_i * 1000
|
26
|
-
i
|
27
|
-
i
|
42
|
+
i / (interval * 1000)
|
28
43
|
end
|
29
44
|
|
30
45
|
end
|
data/lib/rotp/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module
|
2
|
-
VERSION = "1.
|
1
|
+
module ROTP
|
2
|
+
VERSION = "1.1.0"
|
3
3
|
end
|
data/rotp.gemspec
CHANGED
@@ -4,11 +4,11 @@ require "rotp/version"
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "rotp"
|
7
|
-
s.version =
|
7
|
+
s.version = ROTP::VERSION
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
s.authors = ["Mark Percival"]
|
10
10
|
s.email = ["mark@markpercival.us"]
|
11
|
-
s.homepage = ""
|
11
|
+
s.homepage = "http://github.com/mdp/rotp"
|
12
12
|
s.summary = %q{A Ruby library for generating and verifying one time passwords}
|
13
13
|
s.description = %q{Works for both HOTP and TOTP, and include QR Code provisioning}
|
14
14
|
|
data/spec/base_spec.rb
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
describe "generating a random base32 secret" do
|
4
|
+
it "should be 16 characters by default" do
|
5
|
+
ROTP.random_base32.length.should == 16
|
6
|
+
ROTP.random_base32.should match /[a-z2-7].+/
|
7
|
+
end
|
8
|
+
it "should be allow a specific length" do
|
9
|
+
ROTP.random_base32(32).length.should == 32
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
3
13
|
describe "HOTP example values from the rfc" do
|
4
14
|
it "should match the RFC" do
|
5
15
|
# 12345678901234567890 in Bas32
|
@@ -16,6 +26,10 @@ describe "HOTP example values from the rfc" do
|
|
16
26
|
hotp.at(8).should ==(399871)
|
17
27
|
hotp.at(9).should ==(520489)
|
18
28
|
end
|
29
|
+
it "should output its provisioning URI" do
|
30
|
+
hotp = ROTP::HOTP.new("wrn3pqx5uqxqvnqr")
|
31
|
+
hotp.provisioning_uri('mark@percival').should == "otpauth://hotp/mark@percival?secret=wrn3pqx5uqxqvnqr&counter=0"
|
32
|
+
end
|
19
33
|
end
|
20
34
|
|
21
35
|
describe "TOTP example values from the rfc" do
|
@@ -32,4 +46,9 @@ describe "TOTP example values from the rfc" do
|
|
32
46
|
totp.now.should ==(102705)
|
33
47
|
end
|
34
48
|
end
|
49
|
+
|
50
|
+
it "should output its provisioning URI" do
|
51
|
+
totp = ROTP::TOTP.new("wrn3pqx5uqxqvnqr")
|
52
|
+
totp.provisioning_uri('mark@percival').should == "otpauth://totp/mark@percival?secret=wrn3pqx5uqxqvnqr"
|
53
|
+
end
|
35
54
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rotp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 1.0.0
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Mark Percival
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-02-
|
18
|
+
date: 2011-02-13 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -45,8 +45,28 @@ extra_rdoc_files: []
|
|
45
45
|
|
46
46
|
files:
|
47
47
|
- .gitignore
|
48
|
+
- .rspec
|
48
49
|
- Gemfile
|
50
|
+
- README.markdown
|
49
51
|
- Rakefile
|
52
|
+
- doc/ROTP/HOTP.html
|
53
|
+
- doc/ROTP/OTP.html
|
54
|
+
- doc/ROTP/TOTP.html
|
55
|
+
- doc/Rotp.html
|
56
|
+
- doc/_index.html
|
57
|
+
- doc/class_list.html
|
58
|
+
- doc/css/common.css
|
59
|
+
- doc/css/full_list.css
|
60
|
+
- doc/css/style.css
|
61
|
+
- doc/file.README.html
|
62
|
+
- doc/file_list.html
|
63
|
+
- doc/frames.html
|
64
|
+
- doc/index.html
|
65
|
+
- doc/js/app.js
|
66
|
+
- doc/js/full_list.js
|
67
|
+
- doc/js/jquery.js
|
68
|
+
- doc/method_list.html
|
69
|
+
- doc/top-level-namespace.html
|
50
70
|
- lib/rotp.rb
|
51
71
|
- lib/rotp/hotp.rb
|
52
72
|
- lib/rotp/otp.rb
|
@@ -56,7 +76,7 @@ files:
|
|
56
76
|
- spec/base_spec.rb
|
57
77
|
- spec/spec_helper.rb
|
58
78
|
has_rdoc: true
|
59
|
-
homepage:
|
79
|
+
homepage: http://github.com/mdp/rotp
|
60
80
|
licenses: []
|
61
81
|
|
62
82
|
post_install_message:
|