sinatra-portier 1.3.0 → 1.5.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
- SHA1:
3
- metadata.gz: b69ad3706ecd35b13c72a3466113634f0a8aa89c
4
- data.tar.gz: 7a91809bbc697a7d09a240bdfbbaab7ad7545773
2
+ SHA256:
3
+ metadata.gz: cbb567b7fdc34ac49a53113b97b08a27b52c2fd1e85552c2ea44eb7cabfc9666
4
+ data.tar.gz: 3528e61f4a6fdc75ed3d2aee2bb80235a139860ca079b63d6ee3cfac487adbf3
5
5
  SHA512:
6
- metadata.gz: 11f3a230f0f3a9a9d861ffa1cd4651cb0193154df0e343f234e2711be6b6d4c217ad7a63efae308c264d7d70c89e15415fb354c0332e6a005a2a5a85f6022a65
7
- data.tar.gz: 9a6a524ce59d2d2a4b4e493b156f9f27d6cb778bd91608a385b6d1a1f3fee2c8f45a3e652e16276f9aa41137e64cca0456633a8ea747702d2c386879623d101a
6
+ metadata.gz: ce0b199ca249d27d1cefc7db7c25f6bb5595165d7076843a190c448e61b596fcd2b0e3c362ddaf155ca6f7fb3002a73511b0ba4a8f111a5ffc1f5b1bc7b8e15c
7
+ data.tar.gz: 5c6e1b3cc2890c87f32bda865530accd31ff97df69c5977d1c1de5009337cda8f38447756da9ca202cfae8d34859c8f9d98a6a606efc4d76120ec5587dedceba
data/README.md CHANGED
@@ -10,7 +10,7 @@ Note that logins are not done from within a form on your site -- you provide a l
10
10
 
11
11
  ## How to get started
12
12
 
13
- Install the gem **sinatra-portier**"
13
+ Install the gem **sinatra-portier**:
14
14
 
15
15
  ```
16
16
  gem install sinatra-portier
@@ -27,7 +27,7 @@ require 'sinatra/browserid'
27
27
  register Sinatra::BrowserID
28
28
 
29
29
  set :sessions, true
30
- # Disabling origin-chek is needed to make webkit-browsers like Chrome work.
30
+ # Disabling origin-check is needed to make webkit-browsers like Chrome work.
31
31
  # Behind a proxy you will also need to disable :remote_token, regardless for which browser.
32
32
  set :protection, except: [:http_origin]
33
33
  get '/' do
@@ -53,12 +53,19 @@ end
53
53
  ```
54
54
 
55
55
  See the rdoc for more details on the helper functions. For a functioning
56
- example app, run <tt>rackup -p $PORT</tt> in the example directory.
56
+ example app, start the app in the example directory:
57
+
58
+ ```
59
+ bundle install
60
+ bundle exec rackup -p PORT
61
+
62
+ ```
57
63
 
58
64
  Available sinatra settings:
59
65
 
60
66
  * <tt>:browserid_url</tt>: If you're using an alternate auth provider
61
67
  other than https://broker.portier.io
62
68
  * <tt>:browserid_login_url</tt>: URL users get redirected to when the
63
- <tt>authorize!</tt> helper is called and a user is not logged in
64
- * <tt>:browserid_button_class</tt> css class of the login button
69
+ <tt>authorize!(redirect: nil)</tt> helper is called and a user is not logged in. `redirect` is an optional parameter to set the redirect target on the function call instead.
70
+ * <tt>:browserid_button_class</tt>: Css class of the login button
71
+ * <tt>:browserid_button_text</tt>: Text of the login button
data/example/app.rb CHANGED
@@ -1,28 +1,29 @@
1
- #!/usr/bin/env ruby
2
-
3
- $: << File.join(File.dirname(__FILE__), "..", "lib")
4
-
5
- require "sinatra/base"
6
- require "sinatra/browserid"
7
-
8
- class TestApp < Sinatra::Base
9
- register Sinatra::BrowserID
1
+ require 'sinatra'
2
+ require 'sinatra/browserid'
3
+
4
+
5
+ register Sinatra::BrowserID
6
+
7
+ set :sessions, true
8
+ # Disabling origin-check is needed to make webkit-browsers like Chrome work.
9
+ # Behind a proxy you will also need to disable :remote_token, regardless for which browser.
10
+ set :protection, except: [:http_origin]
11
+ get '/' do
12
+ if authorized?
13
+ "Welcome, #{authorized_email}"
14
+ else
15
+ render_login_button
16
+ end
17
+ end
10
18
 
11
- set :sessions, true
19
+ get '/secure' do
20
+ authorize! # require a user be logged in
12
21
 
13
- get '/' do
14
- erb :index
15
- end
22
+ authorized_email # browserid email
23
+ end
16
24
 
17
- get '/logout' do
25
+ get '/logout' do
18
26
  logout!
19
27
 
20
28
  redirect '/'
21
- end
22
-
23
- get '/confidential' do
24
- authorize!
25
-
26
- "Hey #{authorized_email}, you're authorized!"
27
- end
28
- end
29
+ end
data/example/config.ru CHANGED
@@ -1,2 +1,8 @@
1
- require "./app"
2
- run TestApp
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require
5
+
6
+ require './app.rb'
7
+
8
+ run Sinatra::Application.new
@@ -28,6 +28,28 @@ module Sinatra
28
28
  session[:browserid_email]
29
29
  end
30
30
 
31
+ # Normalize the email like the broker will do it, see
32
+ # https://github.com/portier/portier.github.io/blob/master/specs/Email-Normalization.md
33
+ def normalize_email(email)
34
+ begin
35
+ user, domain = email.split("@")
36
+ if user == nil or user.empty?
37
+ raise ArgumentError.new('user part must not be empty')
38
+ end
39
+ user = user.downcase
40
+ domain = SimpleIDN.to_ascii(domain).downcase
41
+ begin
42
+ IPAddr.new(domain)
43
+ rescue
44
+ # if domain could not be parsed as IP we are good
45
+ return user + "@" + domain
46
+ end
47
+ raise ArgumentError.new('domain must not be an IP')
48
+ rescue Exception => e
49
+ raise ArgumentError, 'Not a valid email adress: ' + e.message
50
+ end
51
+ end
52
+
31
53
  # Returns the HTML to render the Persona login form.
32
54
  # Optionally takes a URL parameter for where the user should
33
55
  # be redirected to after the assert POST back.
@@ -10,7 +10,7 @@ module Sinatra
10
10
  <input type=hidden name=client_id value="<%= request.base_url.chomp('/') %>" />
11
11
  <input type=hidden name=redirect_uri value="<%= url '/_browserid_assert' %>" />
12
12
  <input type=hidden name=nonce value="<%= nonce %>" />
13
- <input type=submit value="Log In" class="<%= settings.browserid_button_class %>" />
13
+ <input type=submit value="<%= settings.browserid_button_text %>" class="<%= settings.browserid_button_class %>" />
14
14
  </form>
15
15
  EOF
16
16
  end
@@ -4,9 +4,12 @@ require "open-uri"
4
4
  require 'json'
5
5
  require 'url_safe_base64'
6
6
  require 'jwt'
7
+ require 'simpleidn'
8
+ require 'ipaddr'
7
9
  require "sinatra/base"
8
10
  require 'sinatra/browserid/helpers'
9
11
  require 'sinatra/browserid/template'
12
+ require 'addressable/uri'
10
13
 
11
14
  # This module provides an interface to verify a users email address
12
15
  # with browserid.org.
@@ -19,6 +22,7 @@ module Sinatra
19
22
  app.set :browserid_login_button, :red
20
23
  app.set :browserid_login_url, "/_browserid_login"
21
24
  app.set :browserid_button_class, ""
25
+ app.set :browserid_button_text, "Log in"
22
26
 
23
27
  app.get '/_browserid_login' do
24
28
  # TODO(petef): render a page that initiates login without
@@ -30,10 +34,19 @@ module Sinatra
30
34
  begin
31
35
  # 3. Server checks signature
32
36
  # for that, fetch the public key from the LA instance (TODO: Do that beforehand for trusted instances, and generally cache the key)
33
- public_key_jwks = ::JSON.parse(URI.parse(URI.escape(settings.browserid_url + '/keys.json')).read)
37
+ public_key_jwks_uri = Addressable::URI.parse(settings.browserid_url + '/keys.json')
38
+ public_key_jwks = ::JSON.parse(URI.parse(public_key_jwks_uri).read)
34
39
  public_key = OpenSSL::PKey::RSA.new
35
- public_key.e = OpenSSL::BN.new UrlSafeBase64.decode64(public_key_jwks["keys"][0]["e"]), 2
36
- public_key.n = OpenSSL::BN.new UrlSafeBase64.decode64(public_key_jwks["keys"][0]["n"]), 2
40
+ if public_key.respond_to? :set_key
41
+ # set n and d via the new set_key function, as direct access to n and e is blocked for some ruby and openssl versions.
42
+ # Note that we have no d, as this is a public key, which would be the third param
43
+ public_key.set_key( (OpenSSL::BN.new UrlSafeBase64.decode64(public_key_jwks["keys"][0]["n"]), 2),
44
+ (OpenSSL::BN.new UrlSafeBase64.decode64(public_key_jwks["keys"][0]["e"]), 2),
45
+ nil)
46
+ else
47
+ public_key.e = OpenSSL::BN.new UrlSafeBase64.decode64(public_key_jwks["keys"][0]["e"]), 2
48
+ public_key.n = OpenSSL::BN.new UrlSafeBase64.decode64(public_key_jwks["keys"][0]["n"]), 2
49
+ end
37
50
 
38
51
  id_token = JWT.decode params[:id_token], public_key, true, { :algorithm => 'RS256' }
39
52
  id_token = id_token[0]
@@ -43,7 +56,7 @@ module Sinatra
43
56
  id_token["exp"] > Time.now.to_i &&
44
57
  id_token["email_verified"] &&
45
58
  id_token["nonce"] == session[:nonce])
46
- session[:browserid_email] = id_token["email"]
59
+ session[:browserid_email] = id_token['email']
47
60
  session.delete(:nonce)
48
61
  if session['redirect_url']
49
62
  redirect session['redirect_url']
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra-portier
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pete Fritchman
8
8
  - Malte Paskuda
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-09-01 00:00:00.000000000 Z
12
+ date: 2021-09-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
@@ -53,7 +53,35 @@ dependencies:
53
53
  - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: 0.2.2
56
- description:
56
+ - !ruby/object:Gem::Dependency
57
+ name: simpleidn
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 0.0.9
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 0.0.9
70
+ - !ruby/object:Gem::Dependency
71
+ name: addressable
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '2.8'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '2.8'
84
+ description:
57
85
  email:
58
86
  - malte@paskuda.biz
59
87
  executables: []
@@ -63,7 +91,6 @@ files:
63
91
  - README.md
64
92
  - example/app.rb
65
93
  - example/config.ru
66
- - example/views/index.erb
67
94
  - lib/sinatra/browserid.rb
68
95
  - lib/sinatra/browserid/helpers.rb
69
96
  - lib/sinatra/browserid/template.rb
@@ -71,7 +98,7 @@ files:
71
98
  homepage: https://github.com/onli/sinatra-portier
72
99
  licenses: []
73
100
  metadata: {}
74
- post_install_message:
101
+ post_install_message:
75
102
  rdoc_options:
76
103
  - "--inline-source"
77
104
  require_paths:
@@ -87,9 +114,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
114
  - !ruby/object:Gem::Version
88
115
  version: '0'
89
116
  requirements: []
90
- rubyforge_project:
91
- rubygems_version: 2.6.13
92
- signing_key:
117
+ rubygems_version: 3.2.22
118
+ signing_key:
93
119
  specification_version: 4
94
120
  summary: Sinatra extension for user authentication with portier
95
121
  test_files: []
@@ -1,21 +0,0 @@
1
- <html>
2
- <head>
3
- </head>
4
- <body>
5
-
6
- <h1>Test App</h1>
7
-
8
- <p>
9
- <% if authorized? %>
10
- Hello, <%= authorized_email %> <a href="/logout">(logout)</a>
11
- <% else %>
12
- <%= render_login_button %>
13
- <% end %>
14
- </p>
15
-
16
- <p>
17
- see a <a href="/confidential">page that requires a login</a>.
18
- </p>
19
-
20
- </body>
21
- </html>