sinatra_persona 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c1ba1fe80f2488f91d18942203c55ebe077f9174
4
+ data.tar.gz: 31bc6216e5469b6606a0837e7c29881e6b715255
5
+ SHA512:
6
+ metadata.gz: 7dc897d527acf83713bb2a5118a753aa1f287a3cb86d29ae347e05b8ee9a006974957b7c5aec4494fee55c404eb0697ebb736433c6896f9c86473fdfd42fb214
7
+ data.tar.gz: 7e3b522355335e81ff034bfcd01baeb379c706eeb88fc405b470be03a59e93d2367564e0a39ba3c0b37b4382efa1bc23e64582764c1b6d933fbf1dd596f4821b
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sinatra_persona.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Colin J. Fuller
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # SinatraPersona
2
+
3
+ A Sinatra extension for logging in with [persona](https://persona.org/about) and verifying persona assertions.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'sinatra_persona'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install sinatra_persona
18
+
19
+ ## Usage
20
+
21
+ ### Include the extension in your app.
22
+
23
+ For a classic-style app:
24
+ ```ruby
25
+ require 'sinatra_persona'
26
+ enable :sessions
27
+ ```
28
+
29
+ For a modular-style app:
30
+ ```ruby
31
+ require 'sinatra/base'
32
+ require 'sinatra_persona'
33
+
34
+ class MyApp < Sinatra::Base
35
+ enable :sessions
36
+ register Sinatra::Persona
37
+ # Application code here
38
+ end
39
+ ```
40
+
41
+ ### URL handlers
42
+
43
+ The extension defines a POST handler at `/auth/perona_verifier` to which the
44
+ assertions to be verified are sent. You don't need to use this explicitly if
45
+ you use the supplied login button helper and scripts helper.
46
+
47
+ ### Interface
48
+
49
+ Several helpers are available for interacting with persona:
50
+
51
+ - `persona` gets the e-mail by which a user has identified or nil if not
52
+ identified.
53
+ - `persona?` is an alias for `persona` (if you want to use it to check if
54
+ someone has identified and follow the boolean-with-question-mark convention)
55
+ - `clear_persona!` clears out the persona information from the session. This
56
+ will require users to log in again.
57
+ - `persona_button` returns a string containing an html button element that will
58
+ trigger login. This is not styled by default, but has id
59
+ `persona-login-button` so you can style it however you like.
60
+ - `persona_scripts` returns a string containing html script tags that will
61
+ include the persona scripts from persona.org, a script to set the click
62
+ action of the persona button on the page, and jQuery hosted by google. See
63
+ the settings section below if don't want to inlcude the default jQuery and
64
+ instead supply your own self-hosted one.
65
+
66
+ ### Settings
67
+
68
+ Several optional settings are available via the normal Sinatra settings
69
+ mechanism (i.e. to set setting `foo` to `'value'`, do `set :foo, 'value'` in
70
+ your app.
71
+
72
+ - `persona_login_button_text`: the text to display on the login button returned
73
+ by the `persona_button` helper. Defaults to "Log in with Persona".
74
+
75
+ - `persona_verifier_uri`: a stdlib URI (not a string) that is a location that
76
+ verifies persona assertions. Defaults to
77
+ "https://verifier.login.persona.org/verify". Make sure this uses https.
78
+
79
+ - `after_persona_redirect`: a string that is the location to redirect to after
80
+ verifying the persona assertion. Defaults to '/'.
81
+
82
+ - `persona_no_jquery`: set to true if you don't want to use the google-hosted
83
+ jQuery version. At the moment, the scripts returned by the `persona_scripts`
84
+ helper require jQuery, so you'll need to supply your own if you turn this
85
+ off.
86
+
87
+ ## Contributing
88
+
89
+ License: MIT. See LICENSE.txt for the full text.
90
+
91
+ Pull requests welcome!
92
+
93
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,33 @@
1
+ module PersonaJS
2
+ BUTTON_SCRIPT = <<SCRIPT
3
+ $(function() {
4
+ $('#persona-login-button').click(function() {
5
+ navigator.id.get(verifyAssertion);
6
+ });
7
+
8
+ function verifyAssertion(assertion) {
9
+ $.ajax({
10
+ type: 'POST',
11
+ url: '/auth/persona_verifier',
12
+ data: {assertion: assertion},
13
+ success: function(res, status, xhr) {window.location.reload();},
14
+ failure: function(res, status, xhr) {window.location.reload();}
15
+ });
16
+ }
17
+ });
18
+ SCRIPT
19
+
20
+ def self.scripts_no_jquery
21
+ <<SCRIPTS
22
+ <script type="text/javascript">
23
+ #{BUTTON_SCRIPT}
24
+ </script>
25
+ <script src="https://login.persona.org/include.js"></script>
26
+ SCRIPTS
27
+ end
28
+
29
+ def self.scripts
30
+ jquery = '<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>'
31
+ jquery + scripts_no_jquery
32
+ end
33
+ end
@@ -0,0 +1,29 @@
1
+ require 'sinatra/base'
2
+ require 'json'
3
+ require 'net/https'
4
+
5
+ module Persona
6
+ module Verifier
7
+
8
+ DEFAULT_VERIFIER_URI = URI("https://verifier.login.persona.org/verify")
9
+
10
+ def self.verify_assertion(assertion, audience, verifier_uri: nil)
11
+ verifier_uri ||= DEFAULT_VERIFIER_URI
12
+ Net::HTTP.start(verifier_uri.host, verifier_uri.port, use_ssl: true) do |conn|
13
+ params = {assertion: assertion, audience: audience}
14
+ verifier_uri.query = URI.encode_www_form(params)
15
+ request = Net::HTTP::Post.new verifier_uri
16
+ response = conn.request request
17
+ if not response.code == '200' or response.body.nil? then
18
+ return nil
19
+ end
20
+ parsed = JSON.parse response.body
21
+ if parsed['status'] == 'okay' then
22
+ parsed['email']
23
+ else
24
+ nil
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,3 @@
1
+ module SinatraPersona
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,64 @@
1
+ require 'sinatra_persona/version'
2
+ require 'sinatra_persona/verifier'
3
+ require 'sinatra_persona/js'
4
+ require 'sinatra/base'
5
+
6
+ module Sinatra
7
+ module Persona
8
+ def self.registered(app)
9
+ app.helpers Persona::Helpers
10
+ app.post '/auth/persona_verifier' do
11
+ assertion = params[:assertion]
12
+ audience = request.host_with_port
13
+ verifier_uri = settings.respond_to? :persona_verifier_uri ? settings.persona_verifier_uri : nil
14
+ email = ::Persona::Verifier.verify_assertion(assertion, audience)
15
+ if email.nil?
16
+ session.delete(:persona)
17
+ else
18
+ session[:persona] = email
19
+ end
20
+ if session.respond_to? :after_persona_redirect
21
+ redirect to settings.after_persona_redirect
22
+ else
23
+ redirect to '/'
24
+ end
25
+ end
26
+ end
27
+
28
+ module Helpers
29
+
30
+ DEFAULT_LOGIN_TEXT = "Log in with Persona"
31
+
32
+ def persona?
33
+ session[:persona]
34
+ end
35
+
36
+ def persona
37
+ session[:persona]
38
+ end
39
+
40
+ def clear_persona!
41
+ session[:persona] = nil
42
+ end
43
+
44
+ def persona_button
45
+ login_text = DEFAULT_LOGIN_TEXT
46
+ if settings.respond_to? :persona_login_button_text
47
+ login_text = settings.persona_login_button_text
48
+ end
49
+ "<button id='persona-login-button'>Log in with Persona</button>"
50
+ end
51
+
52
+ def persona_scripts
53
+ if settings.respond_to? :persona_no_jquery and settings.persona_no_jquery
54
+ PersonaJS.scripts_no_jquery
55
+ else
56
+ PersonaJS.scripts
57
+ end
58
+ end
59
+ end
60
+ end
61
+ register Persona
62
+ end
63
+
64
+
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'sinatra_persona/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "sinatra_persona"
8
+ spec.version = SinatraPersona::VERSION
9
+ spec.authors = ["Colin J. Fuller"]
10
+ spec.email = ["cjfuller@gmail.com"]
11
+ spec.summary = %q{Persona verifier for Sinatra}
12
+ spec.homepage = ""
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.5"
21
+ spec.add_development_dependency "rake"
22
+ spec.add_dependency "haml"
23
+ spec.add_dependency "sinatra"
24
+ end
25
+
26
+
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sinatra_persona
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Colin J. Fuller
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: haml
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sinatra
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description:
70
+ email:
71
+ - cjfuller@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - lib/sinatra_persona.rb
82
+ - lib/sinatra_persona/js.rb
83
+ - lib/sinatra_persona/verifier.rb
84
+ - lib/sinatra_persona/version.rb
85
+ - sinatra_persona.gemspec
86
+ homepage: ''
87
+ licenses:
88
+ - MIT
89
+ metadata: {}
90
+ post_install_message:
91
+ rdoc_options: []
92
+ require_paths:
93
+ - lib
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ requirements: []
105
+ rubyforge_project:
106
+ rubygems_version: 2.2.1
107
+ signing_key:
108
+ specification_version: 4
109
+ summary: Persona verifier for Sinatra
110
+ test_files: []