clarion 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 699d1c5cabc3e667559acac59425771c17c7364b655655e072149648c4e23a8e
4
- data.tar.gz: db1dd4fe19189a5b8169c218f0d62c7a82661c98ca766c964949aeb86152acd2
3
+ metadata.gz: 587de9691a8ad2c343fb006830a7ad625489e1dafe3470a7b9f69797db777ab7
4
+ data.tar.gz: a2cc0b81450d83f3c581e0de7186fe6ff95b6cac6e3c7272d89b0e58098f5a28
5
5
  SHA512:
6
- metadata.gz: f1d33dfe907acbda086bb486db4ae472ee6ae024ce893d988cebd4388a83e9bf97a4c7f4b85bfd12a729ec7389689c9e1bd9a91659aeacd6b0f9b067745c9de9
7
- data.tar.gz: 25e19c67f5c4ec5c7b47616f7f4ea580b4514f3944b0f90b3dbe965030c3a4c937ba33f7d42eee1f68511f7e1a9d0c9fb897ca7157a8e137e30aa3da61ae0952
6
+ metadata.gz: 39fb7f981bf9738f9675b5116f0e1a62a793d280c634e416887c8be9f19bc1d5d0596689d194ac189ab137352e8804d1230afeab6ebabfe77f02f6d4c741d3ee
7
+ data.tar.gz: 65fee6e98b981f03d3e1abff530f5b92c90975c4beda98f8bec440773376a551fb3eab9ce1e9e1bb40e0c38cc745fa8a2c63237d12d3efef35b45046fe562183
data/.gitignore CHANGED
@@ -9,3 +9,5 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
+
13
+ Gemfile.lock
@@ -0,0 +1,13 @@
1
+ FROM sorah/ruby:2.4
2
+
3
+ EXPOSE 8080
4
+
5
+ RUN mkdir -p /app /app/tmp /app/lib/clarion
6
+
7
+ COPY Gemfile* /app/
8
+ COPY *.gemspec /app/
9
+ COPY lib/clarion/version.rb /app/lib/clarion/version.rb
10
+ RUN cd /app && bundle install -j4 --deployment --without 'development test'
11
+
12
+ WORKDIR /app
13
+ CMD ["bundle", "exec", "puma", "-w", "2", "-t", "4:16", "-p", "8080"]
data/Gemfile CHANGED
@@ -4,3 +4,5 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in clarion.gemspec
6
6
  gemspec
7
+
8
+ gem 'puma'
@@ -17,6 +17,7 @@ document.addEventListener("DOMContentLoaded", function() {
17
17
  let state = processionElem.attributes['data-state'].value;
18
18
  let callbackUrl = processionElem.attributes['data-callback'].value;
19
19
 
20
+ var u2fResponse;
20
21
 
21
22
  let processCallback = (json) => {
22
23
  processionElem.className = 'procession_ok';
@@ -37,18 +38,13 @@ document.addEventListener("DOMContentLoaded", function() {
37
38
  }
38
39
  }
39
40
 
40
- let cb = (response) => {
41
- console.log(response);
42
-
43
- if (response.errorCode) {
44
- processionElem.className = 'procession_error';
45
- return;
46
- }
41
+ let submitKey = () => {
47
42
  processionElem.className = 'procession_contact';
48
43
 
49
44
  let payload = JSON.stringify({
50
45
  reg_id: regId,
51
- response: JSON.stringify(response),
46
+ response: JSON.stringify(u2fResponse),
47
+ name: document.getElementById("key_name").value,
52
48
  });
53
49
 
54
50
  let handleError = (err) => {
@@ -72,10 +68,36 @@ document.addEventListener("DOMContentLoaded", function() {
72
68
  });
73
69
  }).catch(handleError);
74
70
  };
71
+ document.getElementById("key_name_form").addEventListener("submit", (e) => {
72
+ e.preventDefault();
73
+ if (u2fResponse) submitKey();
74
+ });
75
+
76
+ let u2fCallback = (response) => {
77
+ console.log(response);
78
+
79
+ if (response.errorCode == window.u2f.ErrorCodes.TIMEOUT) {
80
+ processionElem.className = 'procession_timeout';
81
+ return;
82
+ } else if (response.errorCode) {
83
+ processionElem.className = 'procession_error';
84
+ return;
85
+ }
86
+ u2fResponse = response;
87
+ processionElem.className = 'procession_edit';
88
+ document.getElementById("key_name").focus();
89
+ };
90
+
91
+ let startRequest = () => {
92
+ processionElem.className = 'procession_wait';
93
+ window.u2f.register(appId, requests, [], u2fCallback);
94
+ };
95
+
96
+ document.getElementById("retry_button").addEventListener("click", (e) => {
97
+ startRequest();
98
+ });
75
99
 
76
- processionElem.className = 'procession_wait';
77
- console.log(requests);
78
- window.u2f.register(appId, requests, [], cb, 300000);
100
+ startRequest();
79
101
  });
80
102
 
81
103
 
@@ -26,7 +26,10 @@ document.addEventListener("DOMContentLoaded", function() {
26
26
  let cb = (response) => {
27
27
  console.log(response);
28
28
 
29
- if (response.errorCode) {
29
+ if (response.errorCode == window.u2f.ErrorCodes.TIMEOUT) {
30
+ processionElem.className = 'procession_timeout';
31
+ return;
32
+ } else if (response.errorCode) {
30
33
  processionElem.className = 'procession_error';
31
34
  return;
32
35
  }
@@ -59,8 +62,14 @@ document.addEventListener("DOMContentLoaded", function() {
59
62
  }).catch(handleError);
60
63
  };
61
64
 
62
- processionElem.className = 'procession_wait';
63
- window.u2f.sign(appId, challenge, requests, cb, 300000);
65
+ let startRequest = () => {
66
+ processionElem.className = 'procession_wait';
67
+ window.u2f.sign(appId, challenge, requests, cb);
68
+ };
69
+ document.getElementById("retry_button").addEventListener("click", (e) => {
70
+ startRequest();
71
+ });
72
+ startRequest();
64
73
  });
65
74
 
66
75
 
@@ -20,6 +20,10 @@
20
20
  #procession.procession_error > div.procession_error {
21
21
  display: block;
22
22
  }
23
+ #procession.procession_timeout > div.procession_timeout {
24
+ display: block;
25
+ }
26
+
23
27
  </style>
24
28
 
25
29
  <p class='center'><strong>U2F 2FA <%- if @authn.name -%> for <%= @authn.name %><%- end -%></strong></p>
@@ -42,6 +46,10 @@
42
46
  <div class="procession_error">
43
47
  <p>Error: Reload and try again?</p>
44
48
  </div>
49
+ <div class="procession_timeout">
50
+ <p>Timed out...</p>
51
+ <p><button id="retry_button">Try again</button></p>
52
+ </div>
45
53
  </div>
46
54
  <%- if @authn.comment -%>
47
55
  <p><small><%= @authn.comment %></small></p>
@@ -76,14 +76,14 @@
76
76
  -webkit-box-sizing: border-box;
77
77
  box-sizing: border-box;
78
78
 
79
- font-size: 20px;
80
- padding: 6px 4px;
79
+ padding: 8px 4px;
81
80
 
82
81
  border: 1px solid #e9e9e9;
83
82
  border-radius: 3px;
84
83
  }
85
84
 
86
85
  input[type="submit"], button {
86
+ font-size: 16px;
87
87
  background-color: #337AB7;
88
88
  color: white;
89
89
  }
@@ -11,6 +11,9 @@
11
11
  #procession.procession_wait > div.procession_wait {
12
12
  display: block;
13
13
  }
14
+ #procession.procession_edit > div.procession_edit {
15
+ display: block;
16
+ }
14
17
  #procession.procession_contact > div.procession_contact {
15
18
  display: block;
16
19
  }
@@ -20,6 +23,9 @@
20
23
  #procession.procession_error > div.procession_error {
21
24
  display: block;
22
25
  }
26
+ #procession.procession_timeout > div.procession_timeout {
27
+ display: block;
28
+ }
23
29
  </style>
24
30
 
25
31
  <p><strong>U2F key registration<%- if @name -%> for <%= @name %><%- end -%></strong></p>
@@ -37,6 +43,13 @@
37
43
  <div class="procession_wait">
38
44
  <p>Insert and tap your security key.</p>
39
45
  </div>
46
+ <div class="procession_edit">
47
+ <p>Security key recognized:</p>
48
+ <form id="key_name_form">
49
+ <p><input type="text" id="key_name" placeholder="Name your key" required></p>
50
+ <p><input type="submit" value="Save"></p>
51
+ </form>
52
+ </div>
40
53
  <div class="procession_contact">
41
54
  <p>Contacting...</p>
42
55
  </div>
@@ -46,7 +59,12 @@
46
59
  <div class="procession_error">
47
60
  <p>Error: try again from the previous page?</p>
48
61
  </div>
62
+ <div class="procession_timeout">
63
+ <p>Timed out...</p>
64
+ <p><button id="retry_button">Try again</button></p>
65
+ </div>
49
66
  </div>
67
+
50
68
  <%- if @comment -%>
51
69
  <p><small><%= @comment %></small></p>
52
70
  <%- end -%>
@@ -127,11 +127,13 @@ module Clarion
127
127
  @reg_id = SecureRandom.urlsafe_base64(12)
128
128
  registrator = Registrator.new(u2f, counter)
129
129
  @app_id, @requests = registrator.request
130
- session[:regs] ||= {}
131
- session[:regs][@reg_id] = {
130
+ session[:regis] ||= []
131
+ session[:regis] << {
132
+ id: @reg_id,
132
133
  challenges: @requests.map(&:challenge),
133
134
  key: public_key.to_der,
134
135
  }
136
+ session[:regis].shift(session[:regis].size - 4) if session[:regis].size > 4
135
137
 
136
138
  @callback = params[:callback]
137
139
  @state = params[:state]
@@ -150,8 +152,8 @@ module Clarion
150
152
  halt 400, '{"error": "Missing params"}'
151
153
  end
152
154
 
153
- session[:regs] ||= {}
154
- reg = session[:regs][data[:reg_id]]
155
+ session[:regis] ||= []
156
+ reg = session[:regis].find { |_| _[:id] == data[:reg_id] }
155
157
  unless reg && reg[:challenges] && reg[:key]
156
158
  halt 400, '{"error": "Invalid :reg"}'
157
159
  end
@@ -164,8 +166,9 @@ module Clarion
164
166
 
165
167
  registrator = Registrator.new(u2f, counter)
166
168
  key = registrator.register!(reg[:challenges], data[:response])
169
+ key.name = data[:name]
167
170
 
168
- session[:regs].delete(data[:reg_id])
171
+ session[:regis].reject! { |_| _[:id] == data[:reg_id] }
169
172
 
170
173
  {ok: true, encrypted_key: key.to_encrypted_json(public_key, :all)}.to_json
171
174
  end
@@ -33,8 +33,8 @@ module Clarion
33
33
  @counter = counter
34
34
  end
35
35
 
36
- attr_reader :handle, :name, :public_key
37
- attr_accessor :counter
36
+ attr_reader :handle, :public_key
37
+ attr_accessor :counter, :name
38
38
 
39
39
  def to_h(all=false)
40
40
  {
@@ -1,3 +1,3 @@
1
1
  module Clarion
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clarion
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sorah Fukumori
@@ -132,8 +132,8 @@ files:
132
132
  - ".gitignore"
133
133
  - ".rspec"
134
134
  - ".travis.yml"
135
+ - Dockerfile
135
136
  - Gemfile
136
- - Gemfile.lock
137
137
  - LICENSE.txt
138
138
  - README.md
139
139
  - Rakefile
@@ -1,69 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- clarion (0.1.0)
5
- aws-sdk-dynamodb
6
- aws-sdk-s3
7
- erubis
8
- sinatra
9
- u2f
10
-
11
- GEM
12
- remote: https://rubygems.org/
13
- specs:
14
- aws-partitions (1.45.0)
15
- aws-sdk-core (3.11.0)
16
- aws-partitions (~> 1.0)
17
- aws-sigv4 (~> 1.0)
18
- jmespath (~> 1.0)
19
- aws-sdk-dynamodb (1.3.0)
20
- aws-sdk-core (~> 3)
21
- aws-sigv4 (~> 1.0)
22
- aws-sdk-kms (1.3.0)
23
- aws-sdk-core (~> 3)
24
- aws-sigv4 (~> 1.0)
25
- aws-sdk-s3 (1.8.0)
26
- aws-sdk-core (~> 3)
27
- aws-sdk-kms (~> 1)
28
- aws-sigv4 (~> 1.0)
29
- aws-sigv4 (1.0.2)
30
- diff-lcs (1.3)
31
- erubis (2.7.0)
32
- jmespath (1.3.1)
33
- mustermann (1.0.1)
34
- rack (2.0.3)
35
- rack-protection (2.0.0)
36
- rack
37
- rake (12.3.0)
38
- rspec (3.7.0)
39
- rspec-core (~> 3.7.0)
40
- rspec-expectations (~> 3.7.0)
41
- rspec-mocks (~> 3.7.0)
42
- rspec-core (3.7.0)
43
- rspec-support (~> 3.7.0)
44
- rspec-expectations (3.7.0)
45
- diff-lcs (>= 1.2.0, < 2.0)
46
- rspec-support (~> 3.7.0)
47
- rspec-mocks (3.7.0)
48
- diff-lcs (>= 1.2.0, < 2.0)
49
- rspec-support (~> 3.7.0)
50
- rspec-support (3.7.0)
51
- sinatra (2.0.0)
52
- mustermann (~> 1.0)
53
- rack (~> 2.0)
54
- rack-protection (= 2.0.0)
55
- tilt (~> 2.0)
56
- tilt (2.0.8)
57
- u2f (1.0.0)
58
-
59
- PLATFORMS
60
- ruby
61
-
62
- DEPENDENCIES
63
- bundler
64
- clarion!
65
- rake
66
- rspec (~> 3.0)
67
-
68
- BUNDLED WITH
69
- 1.16.0