rotp 4.0.2 → 4.1.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 +4 -4
- data/.travis.yml +4 -4
- data/CHANGELOG.md +6 -0
- data/Dockerfile-2.0 +11 -0
- data/Dockerfile-2.5 +10 -0
- data/Dockerfile-2.6 +11 -0
- data/README.md +21 -4
- data/lib/rotp/arguments.rb +4 -0
- data/lib/rotp/cli.rb +2 -2
- data/lib/rotp/otp.rb +2 -2
- data/lib/rotp/version.rb +1 -1
- data/spec/lib/rotp/cli_spec.rb +16 -0
- metadata +6 -12
- data/Dockerfile-1.9 +0 -15
- data/Dockerfile-2.1 +0 -16
- data/Dockerfile-2.3 +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72a52a1f0f26257e83977969144abf6324fee40c65ef4f6b3b910d30c3bb1e36
|
4
|
+
data.tar.gz: 212a5ca91186490c07221f7f17e4d39cc05778b89ebf22cf53712de2cfb8944a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41b36b57154571a35d8d3f59961c3f1754c2bfb3bf06e2a29e2360b24ba884e7d632f86d3d5491341034a30654ba971d96bfcfecae85687a701230cf8e4523ba
|
7
|
+
data.tar.gz: d70217238c2d859b674f9cc702e9ffcb4fcb5cdf3a75d9b40306d0dee8f28198363d6001510e2cbc2b507d24cb753127d602b6dec211da77287d7ac04fabef98
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/Dockerfile-2.0
ADDED
data/Dockerfile-2.5
ADDED
data/Dockerfile-2.6
ADDED
data/README.md
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
[](https://travis-ci.org/mdp/rotp)
|
4
4
|
[](https://rubygems.org/gems/rotp)
|
5
|
+
[](https://www.rubydoc.info/github/mdp/rotp/master)
|
5
6
|
[](https://github.com/mdp/rotp/blob/master/LICENSE)
|
6
7
|
|
7
8
|
A ruby library for generating and validating one time passwords (HOTP & TOTP) according to [RFC 4226](http://tools.ietf.org/html/rfc4226) and [RFC 6238](http://tools.ietf.org/html/rfc6238).
|
@@ -72,14 +73,17 @@ User.find(someUserID)
|
|
72
73
|
totp = ROTP::TOTP.new(user.otp_secret)
|
73
74
|
totp.now # => "492039"
|
74
75
|
|
76
|
+
# Let's take a look at the last time the user authenticated with an OTP
|
75
77
|
user.last_otp_at # => 1432703530
|
76
78
|
|
77
79
|
# Verify the OTP
|
78
80
|
last_otp_at = totp.verify("492039", after: user.last_otp_at) #=> 1472145760
|
79
81
|
# ROTP returns the timestamp(int) of the current period
|
82
|
+
|
80
83
|
# Store this on the user's account
|
81
84
|
user.update(last_otp_at: last_otp_at)
|
82
|
-
|
85
|
+
|
86
|
+
# Someone attempts to reuse the OTP inside the 30s window
|
83
87
|
last_otp_at = totp.verify("492039", after: user.last_otp_at) #=> nil
|
84
88
|
# It fails to verify because we are still in the same 30s interval window
|
85
89
|
```
|
@@ -115,8 +119,11 @@ Provisioning URI's generated by ROTP are compatible with most One Time Password
|
|
115
119
|
Google Authenticator.
|
116
120
|
|
117
121
|
```ruby
|
118
|
-
totp.
|
119
|
-
|
122
|
+
totp = ROTP::TOTP.new("base32secret3232", issuer: "My Service")
|
123
|
+
totp.provisioning_uri("alice@google.com") # => 'otpauth://totp/My%20Service:alice@google.com?secret=base32secret3232&issuer=My+Service'
|
124
|
+
|
125
|
+
hotp = ROTP::HOTP.new("base32secret3232", issuer: "My Service")
|
126
|
+
hotp.provisioning_uri("alice@google.com", 0) # => 'otpauth://hotp/alice@google.com?secret=base32secret3232&counter=0'
|
120
127
|
```
|
121
128
|
|
122
129
|
This can then be rendered as a QR Code which the user can scan using their mobile phone and the appropriate application.
|
@@ -143,6 +150,16 @@ bundle install
|
|
143
150
|
bundle exec rspec
|
144
151
|
```
|
145
152
|
|
153
|
+
### Testign with Docker
|
154
|
+
|
155
|
+
In order to make it easier to test against different ruby version, ROTP comes
|
156
|
+
with a set of Dockerfiles for each version that we test against in Travis
|
157
|
+
|
158
|
+
```bash
|
159
|
+
docker build -f Dockerfile-2.6 -t rotp_2.6 .
|
160
|
+
docker run --rm -v $(pwd):/usr/src/app rotp_2.6
|
161
|
+
```
|
162
|
+
|
146
163
|
## Executable Usage
|
147
164
|
|
148
165
|
The rotp rubygem includes an executable for helping with testing and debugging
|
@@ -162,7 +179,7 @@ Have a look at the [contributors graph](https://github.com/mdp/rotp/graphs/contr
|
|
162
179
|
|
163
180
|
## License
|
164
181
|
|
165
|
-
MIT Copyright (C)
|
182
|
+
MIT Copyright (C) 2019 by Mark Percival, see [LICENSE](https://github.com/mdp/rotp/blob/master/LICENSE) for details.
|
166
183
|
|
167
184
|
## Other implementations
|
168
185
|
|
data/lib/rotp/arguments.rb
CHANGED
@@ -68,6 +68,10 @@ module ROTP
|
|
68
68
|
parser.on_tail('-h', '--help', 'Show this message') do
|
69
69
|
options!.mode = :help
|
70
70
|
end
|
71
|
+
|
72
|
+
parser.on('-d', '--digest [ALGORITHM]', 'Use algorithm for the digest (default sha1)') do |digest|
|
73
|
+
options!.digest = digest
|
74
|
+
end
|
71
75
|
end
|
72
76
|
end
|
73
77
|
|
data/lib/rotp/cli.rb
CHANGED
@@ -31,9 +31,9 @@ module ROTP
|
|
31
31
|
return arguments.to_s if options.mode == :help
|
32
32
|
|
33
33
|
if options.mode == :time
|
34
|
-
ROTP::TOTP.new(options.secret).now
|
34
|
+
ROTP::TOTP.new(options.secret, options).now
|
35
35
|
elsif options.mode == :hmac
|
36
|
-
ROTP::HOTP.new(options.secret).at options.counter
|
36
|
+
ROTP::HOTP.new(options.secret, options).at options.counter
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
data/lib/rotp/otp.rb
CHANGED
@@ -5,10 +5,10 @@ module ROTP
|
|
5
5
|
|
6
6
|
# @param [String] secret in the form of base32
|
7
7
|
# @option options digits [Integer] (6)
|
8
|
-
# Number of integers in the OTP
|
8
|
+
# Number of integers in the OTP.
|
9
9
|
# Google Authenticate only supports 6 currently
|
10
10
|
# @option options digest [String] (sha1)
|
11
|
-
# Digest used in the HMAC
|
11
|
+
# Digest used in the HMAC.
|
12
12
|
# Google Authenticate only supports 'sha1' currently
|
13
13
|
# @returns [OTP] OTP instantiation
|
14
14
|
def initialize(s, options = {})
|
data/lib/rotp/version.rb
CHANGED
data/spec/lib/rotp/cli_spec.rb
CHANGED
@@ -18,6 +18,14 @@ RSpec.describe ROTP::CLI do
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
context 'generating a TOTP with sha256 digest' do
|
22
|
+
let(:argv) { %w[--secret JBSWY3DPEHPK3PXP --digest sha256] }
|
23
|
+
|
24
|
+
it 'prints the corresponding token' do
|
25
|
+
expect(output).to eq '544902'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
21
29
|
context 'generating a TOTP with no secret' do
|
22
30
|
let(:argv) { %w[--time --secret] }
|
23
31
|
|
@@ -49,4 +57,12 @@ RSpec.describe ROTP::CLI do
|
|
49
57
|
expect(output).to eq '161024'
|
50
58
|
end
|
51
59
|
end
|
60
|
+
|
61
|
+
context 'generating a HOTP' do
|
62
|
+
let(:argv) { %W[--hmac --secret #{'a' * 32} --counter 1234 --digest sha256] }
|
63
|
+
|
64
|
+
it 'prints the corresponding token' do
|
65
|
+
expect(output).to eq '325941'
|
66
|
+
end
|
67
|
+
end
|
52
68
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rotp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Percival
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
@@ -92,9 +92,9 @@ files:
|
|
92
92
|
- ".gitignore"
|
93
93
|
- ".travis.yml"
|
94
94
|
- CHANGELOG.md
|
95
|
-
- Dockerfile-
|
96
|
-
- Dockerfile-2.
|
97
|
-
- Dockerfile-2.
|
95
|
+
- Dockerfile-2.0
|
96
|
+
- Dockerfile-2.5
|
97
|
+
- Dockerfile-2.6
|
98
98
|
- Gemfile
|
99
99
|
- Guardfile
|
100
100
|
- LICENSE
|
@@ -158,10 +158,4 @@ rubygems_version: 2.7.6
|
|
158
158
|
signing_key:
|
159
159
|
specification_version: 4
|
160
160
|
summary: A Ruby library for generating and verifying one time passwords
|
161
|
-
test_files:
|
162
|
-
- spec/lib/rotp/arguments_spec.rb
|
163
|
-
- spec/lib/rotp/base32_spec.rb
|
164
|
-
- spec/lib/rotp/cli_spec.rb
|
165
|
-
- spec/lib/rotp/hotp_spec.rb
|
166
|
-
- spec/lib/rotp/totp_spec.rb
|
167
|
-
- spec/spec_helper.rb
|
161
|
+
test_files: []
|
data/Dockerfile-1.9
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
FROM ruby:1.9
|
2
|
-
|
3
|
-
# throw errors if Gemfile has been modified since Gemfile.lock
|
4
|
-
RUN bundle config --global frozen 1
|
5
|
-
|
6
|
-
RUN mkdir -p /usr/src/app
|
7
|
-
WORKDIR /usr/src/app
|
8
|
-
|
9
|
-
COPY Gemfile /usr/src/app/
|
10
|
-
COPY Gemfile.lock /usr/src/app/
|
11
|
-
COPY . /usr/src/app
|
12
|
-
RUN bundle install
|
13
|
-
|
14
|
-
CMD ["bundler", "exec", "rspec"]
|
15
|
-
|
data/Dockerfile-2.1
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
FROM ruby:2.1
|
2
|
-
|
3
|
-
# throw errors if Gemfile has been modified since Gemfile.lock
|
4
|
-
RUN bundle config --global frozen 1
|
5
|
-
|
6
|
-
RUN mkdir -p /usr/src/app
|
7
|
-
WORKDIR /usr/src/app
|
8
|
-
|
9
|
-
COPY Gemfile /usr/src/app/
|
10
|
-
COPY Gemfile.lock /usr/src/app/
|
11
|
-
COPY . /usr/src/app
|
12
|
-
RUN bundle install
|
13
|
-
|
14
|
-
|
15
|
-
CMD ["bundler", "exec", "rspec"]
|
16
|
-
|
data/Dockerfile-2.3
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
FROM ruby:2.3
|
2
|
-
|
3
|
-
# throw errors if Gemfile has been modified since Gemfile.lock
|
4
|
-
RUN bundle config --global frozen 1
|
5
|
-
|
6
|
-
RUN mkdir -p /usr/src/app
|
7
|
-
WORKDIR /usr/src/app
|
8
|
-
|
9
|
-
COPY Gemfile /usr/src/app/
|
10
|
-
COPY Gemfile.lock /usr/src/app/
|
11
|
-
COPY . /usr/src/app
|
12
|
-
RUN bundle install
|
13
|
-
|
14
|
-
|
15
|
-
CMD ["bundler", "exec", "rspec"]
|
16
|
-
|