linkedin_sign_in 0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.travis.yml +18 -0
  4. data/CHANGELOG.md +3 -0
  5. data/Gemfile +6 -0
  6. data/Gemfile.lock +155 -0
  7. data/MIT-LICENSE +20 -0
  8. data/README.md +154 -0
  9. data/Rakefile +40 -0
  10. data/SECURITY.md +3 -0
  11. data/app/controllers/linkedin_sign_in/authorizations_controller.rb +17 -0
  12. data/app/controllers/linkedin_sign_in/base_controller.rb +15 -0
  13. data/app/controllers/linkedin_sign_in/callbacks_controller.rb +27 -0
  14. data/app/helpers/linkedin_sign_in/button_helper.rb +7 -0
  15. data/bin/rails +16 -0
  16. data/config/routes.rb +4 -0
  17. data/lib/linkedin-id-token.rb +190 -0
  18. data/lib/linkedin_sign_in/engine.rb +32 -0
  19. data/lib/linkedin_sign_in/identity.rb +55 -0
  20. data/lib/linkedin_sign_in/redirect_protector.rb +25 -0
  21. data/lib/linkedin_sign_in.rb +10 -0
  22. data/linkedin_sign_in.gemspec +21 -0
  23. data/test/certificate.pem +19 -0
  24. data/test/controllers/authorizations_controller_test.rb +26 -0
  25. data/test/controllers/callbacks_controller_test.rb +36 -0
  26. data/test/dummy/.ruby-version +1 -0
  27. data/test/dummy/Rakefile +6 -0
  28. data/test/dummy/app/assets/config/manifest.js +3 -0
  29. data/test/dummy/app/assets/images/.keep +0 -0
  30. data/test/dummy/app/assets/javascripts/application.js +15 -0
  31. data/test/dummy/app/assets/javascripts/cable.js +13 -0
  32. data/test/dummy/app/assets/javascripts/channels/.keep +0 -0
  33. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  34. data/test/dummy/app/channels/application_cable/channel.rb +4 -0
  35. data/test/dummy/app/channels/application_cable/connection.rb +4 -0
  36. data/test/dummy/app/controllers/application_controller.rb +2 -0
  37. data/test/dummy/app/controllers/concerns/.keep +0 -0
  38. data/test/dummy/app/helpers/application_helper.rb +2 -0
  39. data/test/dummy/app/jobs/application_job.rb +2 -0
  40. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  41. data/test/dummy/app/models/application_record.rb +3 -0
  42. data/test/dummy/app/models/concerns/.keep +0 -0
  43. data/test/dummy/app/views/layouts/application.html.erb +15 -0
  44. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  45. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  46. data/test/dummy/bin/bundle +3 -0
  47. data/test/dummy/bin/rails +4 -0
  48. data/test/dummy/bin/rake +4 -0
  49. data/test/dummy/bin/setup +36 -0
  50. data/test/dummy/bin/update +31 -0
  51. data/test/dummy/bin/yarn +11 -0
  52. data/test/dummy/config/application.rb +20 -0
  53. data/test/dummy/config/boot.rb +5 -0
  54. data/test/dummy/config/cable.yml +10 -0
  55. data/test/dummy/config/database.yml +25 -0
  56. data/test/dummy/config/environment.rb +5 -0
  57. data/test/dummy/config/environments/development.rb +32 -0
  58. data/test/dummy/config/environments/production.rb +57 -0
  59. data/test/dummy/config/environments/test.rb +33 -0
  60. data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
  61. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  62. data/test/dummy/config/initializers/content_security_policy.rb +25 -0
  63. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  64. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  65. data/test/dummy/config/initializers/inflections.rb +16 -0
  66. data/test/dummy/config/initializers/linkedin_sign_in.rb +4 -0
  67. data/test/dummy/config/initializers/mime_types.rb +4 -0
  68. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  69. data/test/dummy/config/locales/en.yml +33 -0
  70. data/test/dummy/config/puma.rb +34 -0
  71. data/test/dummy/config/routes.rb +2 -0
  72. data/test/dummy/config/spring.rb +6 -0
  73. data/test/dummy/config/storage.yml +34 -0
  74. data/test/dummy/config.ru +5 -0
  75. data/test/dummy/lib/assets/.keep +0 -0
  76. data/test/dummy/log/.keep +0 -0
  77. data/test/dummy/package.json +5 -0
  78. data/test/dummy/public/404.html +67 -0
  79. data/test/dummy/public/422.html +67 -0
  80. data/test/dummy/public/500.html +66 -0
  81. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  82. data/test/dummy/public/apple-touch-icon.png +0 -0
  83. data/test/dummy/public/favicon.ico +0 -0
  84. data/test/helpers/button_helper_test.rb +36 -0
  85. data/test/key.pem +27 -0
  86. data/test/models/identity_test.rb +48 -0
  87. data/test/models/redirect_protector_test.rb +34 -0
  88. data/test/test_helper.rb +28 -0
  89. metadata +267 -0
@@ -0,0 +1,36 @@
1
+ require "test_helper"
2
+
3
+ class LinkedinSignIn::ButtonHelperTest < ActionView::TestCase
4
+ test "generating a login button with text content" do
5
+ assert_dom_equal <<-HTML, linkedin_sign_in_button("Log in with Linkedin", proceed_to: "https://www.example.com/login")
6
+ <form action="/linkedin_sign_in/authorization" accept-charset="UTF-8" method="post">
7
+ <input name="utf8" type="hidden" value="&#x2713;" />
8
+ <input name="proceed_to" type="hidden" value="https://www.example.com/login" />
9
+ <button type="submit">Log in with Linkedin</button>
10
+ </form>
11
+ HTML
12
+ end
13
+
14
+ test "generating a login button with HTML content" do
15
+ assert_dom_equal <<-HTML, linkedin_sign_in_button(proceed_to: "https://www.example.com/login") { image_tag("linkedin.png") }
16
+ <form action="/linkedin_sign_in/authorization" accept-charset="UTF-8" method="post">
17
+ <input name="utf8" type="hidden" value="&#x2713;" />
18
+ <input name="proceed_to" type="hidden" value="https://www.example.com/login" />
19
+ <button type="submit"><img src="/images/linkedin.png"></button>
20
+ </form>
21
+ HTML
22
+ end
23
+
24
+ test "generating a login button with custom attributes" do
25
+ button = linkedin_sign_in_button("Log in with Linkedin", proceed_to: "https://www.example.com/login",
26
+ class: "login-button", data: { disable_with: "Loading Linkedin login…" })
27
+
28
+ assert_dom_equal <<-HTML, button
29
+ <form action="/linkedin_sign_in/authorization" accept-charset="UTF-8" method="post">
30
+ <input name="utf8" type="hidden" value="&#x2713;" />
31
+ <input name="proceed_to" type="hidden" value="https://www.example.com/login" />
32
+ <button type="submit" class="login-button" data-disable-with="Loading Linkedin login…">Log in with Linkedin</button>
33
+ </form>
34
+ HTML
35
+ end
36
+ end
data/test/key.pem ADDED
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEowIBAAKCAQEArZztTnC23cY+H+iP2lDCZAiX6wzb6dL9pY1CaGquoalj5qGY
3
+ HJfdp4wb7fdZ6ST3xmgstGWC34s1DQUSpH6OrtzF77m5LWKpN0lQno8tE1BNdT8E
4
+ cdbv8dHNqwk2umO6aQKDvVK98qHHA5pHHj/DKaHx1nra3WscoZLZasuoKTO1fpI4
5
+ /mp8kkJOF6gyZReBVx7fNhzDSt8W41ychKMjLnRlCEgQ5/6xvG9y8RCmsFIi1QiO
6
+ eIN/i/zouJ2QhFzQnf5r1qVRaD6RUBjKClt0vSsRaML35A0sVmMIGJ1p7DtLnl0v
7
+ lmDC/PCjtUH+1ZhGfdbu8NfxIjFcYrnM8cnEnwIDAQABAoIBAQCFsPlg1RVMlJNU
8
+ eP8Fq/j1lVR/UYird6mRacUAqV5O6SUf/cIoCp5Knm8Hgdl/2tLeu2vpgt4UDJvO
9
+ qeBgQYDYkPPvlcJOe9I428E0SKb6X3U2W0+t5kkhm2FYWyEEyTVMFf6itOvGwuOB
10
+ F7W6SnmcPrP/aN3PceM7XN0GC0w0ZPOgpsKO4zJiXyA+NQhOdV/xsUtAgM/zXPVb
11
+ UzJyixPDqJfBHBNCkP6FcJxkc+cLlxnZaG7ug2qfWzvj0l2EepcWQ3R/E56mixcN
12
+ nIoha07jBMJhX0KbRgcZsMmvR0/Z2sLkUgphTI/EdIsPQ/zvfqSQTQAKjDB4Orsi
13
+ quaIerupAoGBANVfWh+d4GnhcxtHYb1CCS6CU1dJDh6vGifeLvAAxuiAOBAepQUs
14
+ 9+ewVaS7ARnZ7jwtqOOKRDvAZpEukh7lqFj5haqzuRrImTO6v/Lk8XAA2RC7hY6v
15
+ b65WszIYgGemSubJot7Tevk/lu8lhdkZKp+OZdPU9NS2cEPCcQ3zDchbAoGBANBM
16
+ IVJuQHutAzCTKfjhbZCn78e7AA/eQGMycZUM6i60muYC7L57P0W++ycK6A1cJ49X
17
+ XJ9VvKtjtfqITbIUGuvaFii7XAaGMV85LffJ5t1DjucLScIBDxYp5EJz5/Qj2RDw
18
+ hWJZ+IF0Z4+k1jmIM+eyoNzmjWyYvgpmhFfhx0gNAoGAHcRyt0x4PW1FeL3JpfSr
19
+ gUCPTfMUNDWriXpWxAbnuRICQEV2MjWm1DzmhdfM/IVJ1j1sfWoRwOBDrud3XTYe
20
+ +WK+QiVWoqTvsqbQFpvYDw8fOVVf+ZsCEqln0IpYh51Mf8wLm9iXJGS5st1iQfpf
21
+ 1uivzhC8o1xcZyeeTBrnhlcCgYBHp7ja04SpRwZO4oFQ1bPMTIlHC0RlMQ6zUToT
22
+ jULOWGDk+WKZ0GoewylA8BaN6gLN477ALU1fJEkI63TW6uWr9vUig/mPYQCBAnmW
23
+ wUUDHud9AbwY2iZneHfGiHrl2KMmmac5AzxixDmQB6OOXRWGAkQmWcWS8ySFDWk/
24
+ ljLozQKBgE1gv+PXyxFOsuKNAylj2h8SlfzyOReS7XgPOX3x27yhp18Y8Wq9jeBr
25
+ INjRFL7CpydZZOB5B8i4CLqa3B0dA/lIYbc5FaLefBY+mt82YtpMsYP1I4bAe/ub
26
+ K7fp2z10/eKfa2e5mcTS2WBwJmVz0cR8Plqd2zPb3+yE+JMiU/k7
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,48 @@
1
+ require 'test_helper'
2
+ require 'jwt'
3
+
4
+ class LinkedinSignIn::IdentityTest < ActiveSupport::TestCase
5
+ setup do
6
+ stub_request(:get, "https://api.linkedin.com/v1/people/~:(id,firstName,lastName,picture-url,email-address,positions)?format=json").
7
+ to_return \
8
+ status: 200,
9
+ body: {
10
+ id: "573222559223877",
11
+ firstName: "Vincent",
12
+ lastName: "Robert",
13
+ emailAddress: "vincent@genezys.net",
14
+ pictureUrl: "https://example.com/avatar.png",
15
+ positions: {
16
+ values: [
17
+ { isCurrent: true, company: { name: "Touch & Sell" } },
18
+ { isCurrent: false, company: { name: "Cantor" } }
19
+ ]
20
+ }
21
+ }.to_json
22
+ end
23
+
24
+ test "extracting user ID" do
25
+ assert_equal "573222559223877", LinkedinSignIn::Identity.new("fake_token").user_id
26
+ end
27
+
28
+ test "extracting first name" do
29
+ assert_equal "Vincent", LinkedinSignIn::Identity.new("fake_token").first_name
30
+ end
31
+
32
+ test "extracting last name" do
33
+ assert_equal "Robert", LinkedinSignIn::Identity.new("fake_token").last_name
34
+ end
35
+
36
+ test "extracting email address" do
37
+ assert_equal "vincent@genezys.net", LinkedinSignIn::Identity.new("fake_token").email_address
38
+ end
39
+
40
+ test "extracting avatar URL" do
41
+ assert_equal "https://example.com/avatar.png",
42
+ LinkedinSignIn::Identity.new("fake_token").avatar_url
43
+ end
44
+
45
+ test "extracting current company name" do
46
+ assert_equal "Touch & Sell", LinkedinSignIn::Identity.new("fake_token").current_company_name
47
+ end
48
+ end
@@ -0,0 +1,34 @@
1
+ require 'test_helper'
2
+ require 'linkedin_sign_in/redirect_protector'
3
+
4
+ class LinkedinSignIn::RedirectProtectorTest < ActiveSupport::TestCase
5
+ test "disallows URL target with different host than source" do
6
+ assert_raises LinkedinSignIn::RedirectProtector::Violation do
7
+ LinkedinSignIn::RedirectProtector.ensure_same_origin 'https://malicious.example.com', 'https://genezys.net'
8
+ end
9
+ end
10
+
11
+ test "disallows URL target with different port than source" do
12
+ assert_raises LinkedinSignIn::RedirectProtector::Violation do
13
+ LinkedinSignIn::RedirectProtector.ensure_same_origin 'https://genezys.net:10443', 'https://genezys.net'
14
+ end
15
+ end
16
+
17
+ test "disallows URL target with different protocol than source" do
18
+ assert_raises LinkedinSignIn::RedirectProtector::Violation do
19
+ LinkedinSignIn::RedirectProtector.ensure_same_origin 'http://genezys.net', 'https://genezys.net'
20
+ end
21
+ end
22
+
23
+ test "allows URL target with same origin as source" do
24
+ assert_nothing_raised do
25
+ LinkedinSignIn::RedirectProtector.ensure_same_origin 'https://genezys.net', 'https://genezys.net'
26
+ end
27
+ end
28
+
29
+ test "allows path target" do
30
+ assert_nothing_raised do
31
+ LinkedinSignIn::RedirectProtector.ensure_same_origin '/callback', 'https://genezys.net'
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,28 @@
1
+ ENV['RAILS_ENV'] = 'test'
2
+
3
+ FAKE_LINKEDIN_CLIENT_ID = '86179201039-eks5VfVc46WoFYyZVUDpQHeZFDRCqno3.apps.linkedinusercontent.com'
4
+ FAKE_LINKEDIN_CLIENT_SECRET = 'r(XsBajmyMddruvf$jDgLyPK'
5
+
6
+ require_relative '../test/dummy/config/environment'
7
+
8
+ require 'rails/test_help'
9
+ require 'webmock/minitest'
10
+ require 'byebug'
11
+
12
+ require 'openssl'
13
+ LINKEDIN_PRIVATE_KEY = OpenSSL::PKey::RSA.new(File.read(File.expand_path('key.pem', __dir__)))
14
+ LINKEDIN_X509_CERTIFICATE = OpenSSL::X509::Certificate.new(File.read(File.expand_path('certificate.pem', __dir__)))
15
+
16
+ if LINKEDIN_X509_CERTIFICATE.not_after <= Time.now
17
+ raise "Test certificate is expired. Generate a new one and run the tests again: `bundle exec rake test:certificate:generate`."
18
+ end
19
+
20
+ require 'linkedin-id-token'
21
+ # LinkedinSignIn::Identity.validator = Validator.new(x509_cert: LINKEDIN_X509_CERTIFICATE)
22
+
23
+ class ActionView::TestCase
24
+ private
25
+ def assert_dom_equal(expected, actual, message = nil)
26
+ super expected.remove(/(\A|\n)\s*/), actual, message
27
+ end
28
+ end
metadata ADDED
@@ -0,0 +1,267 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: linkedin_sign_in
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.3'
5
+ platform: ruby
6
+ authors:
7
+ - Vincent Robert
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-11-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 5.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 5.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: oauth2
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.4.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.4.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.15'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.15'
55
+ - !ruby/object:Gem::Dependency
56
+ name: jwt
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 1.5.6
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 1.5.6
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 3.4.2
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 3.4.2
83
+ description:
84
+ email:
85
+ - vincent.robert@genezys.net
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".travis.yml"
92
+ - CHANGELOG.md
93
+ - Gemfile
94
+ - Gemfile.lock
95
+ - MIT-LICENSE
96
+ - README.md
97
+ - Rakefile
98
+ - SECURITY.md
99
+ - app/controllers/linkedin_sign_in/authorizations_controller.rb
100
+ - app/controllers/linkedin_sign_in/base_controller.rb
101
+ - app/controllers/linkedin_sign_in/callbacks_controller.rb
102
+ - app/helpers/linkedin_sign_in/button_helper.rb
103
+ - bin/rails
104
+ - config/routes.rb
105
+ - lib/linkedin-id-token.rb
106
+ - lib/linkedin_sign_in.rb
107
+ - lib/linkedin_sign_in/engine.rb
108
+ - lib/linkedin_sign_in/identity.rb
109
+ - lib/linkedin_sign_in/redirect_protector.rb
110
+ - linkedin_sign_in.gemspec
111
+ - test/certificate.pem
112
+ - test/controllers/authorizations_controller_test.rb
113
+ - test/controllers/callbacks_controller_test.rb
114
+ - test/dummy/.ruby-version
115
+ - test/dummy/Rakefile
116
+ - test/dummy/app/assets/config/manifest.js
117
+ - test/dummy/app/assets/images/.keep
118
+ - test/dummy/app/assets/javascripts/application.js
119
+ - test/dummy/app/assets/javascripts/cable.js
120
+ - test/dummy/app/assets/javascripts/channels/.keep
121
+ - test/dummy/app/assets/stylesheets/application.css
122
+ - test/dummy/app/channels/application_cable/channel.rb
123
+ - test/dummy/app/channels/application_cable/connection.rb
124
+ - test/dummy/app/controllers/application_controller.rb
125
+ - test/dummy/app/controllers/concerns/.keep
126
+ - test/dummy/app/helpers/application_helper.rb
127
+ - test/dummy/app/jobs/application_job.rb
128
+ - test/dummy/app/mailers/application_mailer.rb
129
+ - test/dummy/app/models/application_record.rb
130
+ - test/dummy/app/models/concerns/.keep
131
+ - test/dummy/app/views/layouts/application.html.erb
132
+ - test/dummy/app/views/layouts/mailer.html.erb
133
+ - test/dummy/app/views/layouts/mailer.text.erb
134
+ - test/dummy/bin/bundle
135
+ - test/dummy/bin/rails
136
+ - test/dummy/bin/rake
137
+ - test/dummy/bin/setup
138
+ - test/dummy/bin/update
139
+ - test/dummy/bin/yarn
140
+ - test/dummy/config.ru
141
+ - test/dummy/config/application.rb
142
+ - test/dummy/config/boot.rb
143
+ - test/dummy/config/cable.yml
144
+ - test/dummy/config/database.yml
145
+ - test/dummy/config/environment.rb
146
+ - test/dummy/config/environments/development.rb
147
+ - test/dummy/config/environments/production.rb
148
+ - test/dummy/config/environments/test.rb
149
+ - test/dummy/config/initializers/application_controller_renderer.rb
150
+ - test/dummy/config/initializers/backtrace_silencers.rb
151
+ - test/dummy/config/initializers/content_security_policy.rb
152
+ - test/dummy/config/initializers/cookies_serializer.rb
153
+ - test/dummy/config/initializers/filter_parameter_logging.rb
154
+ - test/dummy/config/initializers/inflections.rb
155
+ - test/dummy/config/initializers/linkedin_sign_in.rb
156
+ - test/dummy/config/initializers/mime_types.rb
157
+ - test/dummy/config/initializers/wrap_parameters.rb
158
+ - test/dummy/config/locales/en.yml
159
+ - test/dummy/config/puma.rb
160
+ - test/dummy/config/routes.rb
161
+ - test/dummy/config/spring.rb
162
+ - test/dummy/config/storage.yml
163
+ - test/dummy/lib/assets/.keep
164
+ - test/dummy/log/.keep
165
+ - test/dummy/package.json
166
+ - test/dummy/public/404.html
167
+ - test/dummy/public/422.html
168
+ - test/dummy/public/500.html
169
+ - test/dummy/public/apple-touch-icon-precomposed.png
170
+ - test/dummy/public/apple-touch-icon.png
171
+ - test/dummy/public/favicon.ico
172
+ - test/helpers/button_helper_test.rb
173
+ - test/key.pem
174
+ - test/models/identity_test.rb
175
+ - test/models/redirect_protector_test.rb
176
+ - test/test_helper.rb
177
+ homepage: https://github.com/genezys/linkedin_sign_in
178
+ licenses:
179
+ - MIT
180
+ metadata: {}
181
+ post_install_message:
182
+ rdoc_options: []
183
+ require_paths:
184
+ - lib
185
+ required_ruby_version: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: 1.9.3
190
+ required_rubygems_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ requirements: []
196
+ rubyforge_project:
197
+ rubygems_version: 2.7.6
198
+ signing_key:
199
+ specification_version: 4
200
+ summary: Sign in (or up) with Linkedin for Rails applications
201
+ test_files:
202
+ - test/certificate.pem
203
+ - test/controllers/authorizations_controller_test.rb
204
+ - test/controllers/callbacks_controller_test.rb
205
+ - test/dummy/.ruby-version
206
+ - test/dummy/Rakefile
207
+ - test/dummy/app/assets/config/manifest.js
208
+ - test/dummy/app/assets/images/.keep
209
+ - test/dummy/app/assets/javascripts/application.js
210
+ - test/dummy/app/assets/javascripts/cable.js
211
+ - test/dummy/app/assets/javascripts/channels/.keep
212
+ - test/dummy/app/assets/stylesheets/application.css
213
+ - test/dummy/app/channels/application_cable/channel.rb
214
+ - test/dummy/app/channels/application_cable/connection.rb
215
+ - test/dummy/app/controllers/application_controller.rb
216
+ - test/dummy/app/controllers/concerns/.keep
217
+ - test/dummy/app/helpers/application_helper.rb
218
+ - test/dummy/app/jobs/application_job.rb
219
+ - test/dummy/app/mailers/application_mailer.rb
220
+ - test/dummy/app/models/application_record.rb
221
+ - test/dummy/app/models/concerns/.keep
222
+ - test/dummy/app/views/layouts/application.html.erb
223
+ - test/dummy/app/views/layouts/mailer.html.erb
224
+ - test/dummy/app/views/layouts/mailer.text.erb
225
+ - test/dummy/bin/bundle
226
+ - test/dummy/bin/rails
227
+ - test/dummy/bin/rake
228
+ - test/dummy/bin/setup
229
+ - test/dummy/bin/update
230
+ - test/dummy/bin/yarn
231
+ - test/dummy/config.ru
232
+ - test/dummy/config/application.rb
233
+ - test/dummy/config/boot.rb
234
+ - test/dummy/config/cable.yml
235
+ - test/dummy/config/database.yml
236
+ - test/dummy/config/environment.rb
237
+ - test/dummy/config/environments/development.rb
238
+ - test/dummy/config/environments/production.rb
239
+ - test/dummy/config/environments/test.rb
240
+ - test/dummy/config/initializers/application_controller_renderer.rb
241
+ - test/dummy/config/initializers/backtrace_silencers.rb
242
+ - test/dummy/config/initializers/content_security_policy.rb
243
+ - test/dummy/config/initializers/cookies_serializer.rb
244
+ - test/dummy/config/initializers/filter_parameter_logging.rb
245
+ - test/dummy/config/initializers/inflections.rb
246
+ - test/dummy/config/initializers/linkedin_sign_in.rb
247
+ - test/dummy/config/initializers/mime_types.rb
248
+ - test/dummy/config/initializers/wrap_parameters.rb
249
+ - test/dummy/config/locales/en.yml
250
+ - test/dummy/config/puma.rb
251
+ - test/dummy/config/routes.rb
252
+ - test/dummy/config/spring.rb
253
+ - test/dummy/config/storage.yml
254
+ - test/dummy/lib/assets/.keep
255
+ - test/dummy/log/.keep
256
+ - test/dummy/package.json
257
+ - test/dummy/public/404.html
258
+ - test/dummy/public/422.html
259
+ - test/dummy/public/500.html
260
+ - test/dummy/public/apple-touch-icon-precomposed.png
261
+ - test/dummy/public/apple-touch-icon.png
262
+ - test/dummy/public/favicon.ico
263
+ - test/helpers/button_helper_test.rb
264
+ - test/key.pem
265
+ - test/models/identity_test.rb
266
+ - test/models/redirect_protector_test.rb
267
+ - test/test_helper.rb