omniauth-aai 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ script: "bundle exec rake test"
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - jruby-19mode
6
+ gemfile:
7
+ - Gemfile
8
+ notifications:
9
+ recipients:
10
+ - claudio@beffa.ch
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'omniauth-shibboleth', :git => "git://github.com/switch-ch/omniauth-shibboleth.git"
4
+
5
+ gemspec
6
+
data/Gemfile.lock ADDED
@@ -0,0 +1,60 @@
1
+ GIT
2
+ remote: git://github.com/switch-ch/omniauth-shibboleth.git
3
+ revision: 8da8cbcb4d42e8b810cb5eaed59581e38b15b187
4
+ specs:
5
+ omniauth-shibboleth (1.0.6)
6
+ omniauth (>= 1.0.0)
7
+
8
+ PATH
9
+ remote: .
10
+ specs:
11
+ omniauth-aai (0.1)
12
+ omniauth-shibboleth
13
+
14
+ GEM
15
+ remote: http://rubygems.org/
16
+ specs:
17
+ diff-lcs (1.1.3)
18
+ ffi (1.0.11)
19
+ guard (1.2.3)
20
+ listen (>= 0.4.2)
21
+ thor (>= 0.14.6)
22
+ guard-rspec (1.1.0)
23
+ guard (>= 1.1)
24
+ hashie (1.2.0)
25
+ listen (0.4.7)
26
+ rb-fchange (~> 0.0.5)
27
+ rb-fsevent (~> 0.9.1)
28
+ rb-inotify (~> 0.8.8)
29
+ omniauth (1.1.0)
30
+ hashie (~> 1.2)
31
+ rack
32
+ rack (1.4.1)
33
+ rack-test (0.6.1)
34
+ rack (>= 1.0)
35
+ rake (0.9.2.2)
36
+ rb-fchange (0.0.5)
37
+ ffi
38
+ rb-fsevent (0.9.1)
39
+ rb-inotify (0.8.8)
40
+ ffi (>= 0.5.0)
41
+ rspec (2.10.0)
42
+ rspec-core (~> 2.10.0)
43
+ rspec-expectations (~> 2.10.0)
44
+ rspec-mocks (~> 2.10.0)
45
+ rspec-core (2.10.1)
46
+ rspec-expectations (2.10.0)
47
+ diff-lcs (~> 1.1.3)
48
+ rspec-mocks (2.10.1)
49
+ thor (0.15.4)
50
+
51
+ PLATFORMS
52
+ ruby
53
+
54
+ DEPENDENCIES
55
+ guard-rspec
56
+ omniauth-aai!
57
+ omniauth-shibboleth!
58
+ rack-test
59
+ rake
60
+ rspec (~> 2.8)
data/Guardfile ADDED
@@ -0,0 +1,6 @@
1
+ guard 'rspec', :version => 2 do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/omniauth/strategies/aai.rb$}) { |m| "spec/omniauth/strategies/aai_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
6
+
data/README.md ADDED
@@ -0,0 +1,89 @@
1
+ # OmniAuth AAI strategy
2
+
3
+ OmniAuth Shibboleth AAI strategy is an OmniAuth strategy for authenticating through SWITCHaai.
4
+
5
+ - OmniAuth: https://github.com/intridea/omniauth/wiki
6
+ - Shibboleth: https://wiki.shibboleth.net/
7
+ - SWITCHaai: http://www.switch.ch/aai/index.html
8
+
9
+ Most functionallity is borrwoed from https://github.com/toyokazu/omniauth-shibboleth
10
+
11
+ ## Getting Started
12
+
13
+ ### Installation
14
+
15
+ Install as a gem via Gemfile or with
16
+
17
+ % gem install omniauth-aai
18
+
19
+ ### Setup SWITCHaai Strategy
20
+
21
+ To use Shibboleth SWITCHaai strategy as a middleware in your rails application, add the following file to your rails application initializer directory. (There will be a generator soon)
22
+
23
+
24
+ # config/initializer/omniauth.rb
25
+ Rails.application.config.middleware.use OmniAuth::Builder do
26
+ provider :aai, {}
27
+ end
28
+
29
+ You will get by default all the standard SWITCHaai values, or you can configure it via options:
30
+
31
+ # config/initializer/omniauth.rb
32
+ Rails.application.config.middleware.use OmniAuth::Builder do
33
+ provider :aai,{
34
+ :uid_field => :'persistent-id',
35
+ :fields => [:name, :email, :swiss_ep_uid],
36
+ :extra_fields => [:'Shib-Authentication-Instant']# See lib/omniauth/strategies/aai.rb for full list.
37
+ }
38
+
39
+ Fields are provided in the Env as request.env["omniauth.auth"]["info"]["name"] and extra_fields attributes are provided as ['extra']['raw_info']['Shib-Authentication-Instant'].
40
+
41
+ ### How to authenticate users
42
+
43
+ In your application, simply direct users to '/auth/aai' to have them sign in via your organizations's AAI SP and IdP. '/auth/aai' url simply redirect users to '/auth/aai/callback', so thus you must protect '/auth/aai/callback' by SWITCHaai SP.
44
+
45
+ SWITCHaai strategy just checks the existence of Shib-Session-ID or Shib-Application-ID.
46
+
47
+ ### Development Mode
48
+
49
+ In development / local mode you can use the following mock (with default SWITCHaai values):
50
+
51
+ # config/initializer/omniauth.rb
52
+ use OmniAuth::Builder do
53
+ provider :developer, {
54
+ :uid_field => :'persistent-id',
55
+ :fields => OmniAuth::Strategies::Aai::DEFAULT_FIELDS,
56
+ :extra_fields, OmniAuth::Strategies::Aai::DEFAULT_EXTRA_FIELDS
57
+ } if Rails.env == 'development'
58
+ end
59
+
60
+ ### Debug Mode
61
+
62
+ When you deploy a new application, you may want to confirm the assumed attributes are correctly provided by SWITCHaai SP. OmniAuth SWITCHaai strategy provides a confirmation option :debug. If you set :debug true, you can see the environment variables provided at the /auth/aai/callback uri.
63
+
64
+ # config/initializer/omniauth.rb
65
+ Rails.application.config.middleware.use OmniAuth::Builder do
66
+ provider :aai, { :debug => true }
67
+ end
68
+
69
+ ## License (MIT License)
70
+
71
+ Copyright (C) SWITCH, Zurich, original copyright (omniauth-shibboleth) 2011 by Toyokazu Akiyama.
72
+
73
+ Permission is hereby granted, free of charge, to any person obtaining a copy
74
+ of this software and associated documentation files (the "Software"), to deal
75
+ in the Software without restriction, including without limitation the rights
76
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
77
+ copies of the Software, and to permit persons to whom the Software is
78
+ furnished to do so, subject to the following conditions:
79
+
80
+ The above copyright notice and this permission notice shall be included in
81
+ all copies or substantial portions of the Software.
82
+
83
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
84
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
85
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
86
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
87
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
88
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
89
+ THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task :default => :spec
6
+ task :test => :spec
7
+
data/lib/.DS_Store ADDED
Binary file
@@ -0,0 +1,8 @@
1
+ require "omniauth-aai/version"
2
+ require "omniauth"
3
+
4
+ module OmniAuth
5
+ module Strategies
6
+ autoload :Aai, 'omniauth/strategies/aai'
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ module OmniAuth
2
+ module Aai
3
+ VERSION = "0.1"
4
+ end
5
+ end
Binary file
Binary file
@@ -0,0 +1,105 @@
1
+ module OmniAuth
2
+ module Strategies
3
+ class Aai < OmniAuth::Strategies::Shibboleth
4
+
5
+ # 8 core attributes, which must be available for all users
6
+ CORE_ATTRIBUTES = {
7
+ swiss_ep_uid: [:'Shib-SwissEP-UniqueID'],
8
+ first_name: [:'Shib-InetOrgPerson-givenName'],
9
+ surname: [:'Shib-Person-surname'],
10
+ mail: [:'Shib-InetOrgPerson-mail'],
11
+ homeOrganization: [:'Shib-SwissEP-HomeOrganization'],
12
+ homeOrganizationType: [:'Shib-SwissEP-HomeOrganizationType'],
13
+ affiliation: [:'Shib-EP-Affiliation']
14
+ }
15
+
16
+ # 8 or more Shibboleth attributes, set by the Service Provider automatically if a user has a valid session
17
+ SHIBBOLETH_ATTRIBUTES = {
18
+ :entitlement => [:'Shib-EP-Entitlement'],
19
+ :preferredLanguage => [:'Shib-InetOrgPerson-preferredLanguage'],
20
+ :'Shib-Application-ID' => [],
21
+ :'Shib-Assertion-01' => [],
22
+ :'Shib-Assertion-Count' => [],
23
+ :'Shib-Authentication-Instant' => [],
24
+ :'Shib-Authentication-Method' => [],
25
+ :'Shib-AuthnContext-Class' => [],
26
+ :'Shib-Identity-Provider' => [],
27
+ :'Shib-Session-ID' => []
28
+ }
29
+
30
+ DEFAULT_EXTRA_FIELDS = (CORE_ATTRIBUTES.keys + SHIBBOLETH_ATTRIBUTES.keys)
31
+ DEFAULT_FIELDS = [:name, :email, :swiss_ep_uid ]
32
+
33
+ # persistent-id is default uid
34
+ option :uid_field, :'persistent-id'
35
+
36
+ option :debug, false
37
+
38
+ option :aai_fields, CORE_ATTRIBUTES
39
+
40
+ option :aai_extra_fields, SHIBBOLETH_ATTRIBUTES
41
+
42
+ option :fields, DEFAULT_FIELDS
43
+ option :extra_fields, DEFAULT_EXTRA_FIELDS
44
+
45
+ # # # # #
46
+ # Helper Methods
47
+ # # # # #
48
+ def aai_attributes
49
+ options.aai_extra_fields.merge(options.aai_fields)
50
+ end
51
+
52
+ def read_env( attribute_key )
53
+ ([attribute_key] + (aai_attributes[attribute_key] || [])).each do | a |
54
+ v = request.env[a.to_s]
55
+ return v unless v.nil? || v.strip == ""
56
+ end
57
+ end
58
+
59
+ # # # # #
60
+ # Rack
61
+ # # # # #
62
+ def request_phase
63
+ [
64
+ 302,
65
+ {
66
+ 'Location' => script_name + callback_path + query_string,
67
+ 'Content-Type' => 'text/plain'
68
+ },
69
+ ["You are being redirected to Shibboleth SP/IdP for sign-in."]
70
+ ]
71
+ end
72
+
73
+ def callback_phase
74
+ super
75
+ end
76
+
77
+ uid do
78
+ # persistent-id is default uid
79
+ request.env[options.uid_field.to_s]
80
+ end
81
+
82
+ info do
83
+ options.fields.inject({}) do |hash, field|
84
+ case field
85
+ when :name
86
+ hash[field] = "#{read_env(:first_name)} #{read_env(:surname)}"
87
+ when :email
88
+ hash[:email] = read_env(:mail)
89
+ else
90
+ hash[field] = read_env(field.to_s)
91
+ end
92
+ hash
93
+ end
94
+ end
95
+
96
+ extra do
97
+ options.extra_fields.inject({:raw_info => {}}) do |hash, field|
98
+ hash[:raw_info][field] = read_env(field.to_s)
99
+ hash
100
+ end
101
+ end
102
+
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/omniauth-aai/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.add_dependency 'omniauth-shibboleth'
6
+
7
+ gem.add_development_dependency 'rack-test'
8
+ gem.add_development_dependency 'rake'
9
+ gem.add_development_dependency 'rspec', '~> 2.8'
10
+ gem.add_development_dependency 'guard-rspec'
11
+
12
+ gem.authors = ["Claudio Beffa"]
13
+ gem.email = ["claudio@beffa.ch"]
14
+ gem.description = %q{OmniAuth Shibboleth strategies for SWITCHaai}
15
+ gem.summary = %q{OmniAuth Shibboleth strategies for SWITCHaai}
16
+ gem.homepage = "https://github.com/switch-ch/omniauth-aai"
17
+
18
+ gem.files = `find . -not \\( -regex ".*\\.git.*" -o -regex "\\./pkg.*" -o -regex "\\./spec.*" \\)`.split("\n").map{ |f| f.gsub(/^.\//, '') }
19
+ gem.test_files = `find spec/*`.split("\n")
20
+ gem.name = "omniauth-aai"
21
+ gem.require_paths = ["lib"]
22
+ gem.version = OmniAuth::Aai::VERSION
23
+
24
+
25
+ end
@@ -0,0 +1,101 @@
1
+ require 'spec_helper'
2
+
3
+ def make_env(path = '/auth/aai', props = {})
4
+ {
5
+ 'REQUEST_METHOD' => 'GET',
6
+ 'PATH_INFO' => path,
7
+ 'rack.session' => {},
8
+ 'rack.input' => StringIO.new('test=true')
9
+ }.merge(props)
10
+ end
11
+
12
+ def failure_path
13
+ if OmniAuth::VERSION >= "1.0" && OmniAuth::VERSION < "1.1"
14
+ "/auth/failure?message=no_aai_session"
15
+ elsif OmniAuth::VERSION >= "1.1"
16
+ "/auth/failure?message=no_shibboleth_session&strategy=aai"
17
+ end
18
+ end
19
+
20
+ describe OmniAuth::Strategies::Aai do
21
+ let(:app){ Rack::Builder.new do |b|
22
+ b.use Rack::Session::Cookie
23
+ b.use OmniAuth::Strategies::Aai
24
+ b.run lambda{|env| [200, {}, ['Not Found']]}
25
+ end.to_app }
26
+
27
+ context 'request phase' do
28
+ before do
29
+ get '/auth/aai'
30
+ end
31
+
32
+ it 'should redirect to callback_url' do
33
+ last_response.status.should == 302
34
+ last_response.location.should == '/auth/aai/callback'
35
+ end
36
+ end
37
+
38
+ context 'callback phase' do
39
+ context 'without Shibboleth session' do
40
+ before do
41
+ get '/auth/aai/callback'
42
+ end
43
+
44
+ it 'should fail to get Shib-Session-ID environment variable' do
45
+ last_response.status.should == 302
46
+ last_response.location.should == failure_path
47
+ end
48
+ end
49
+
50
+ context 'with Shibboleth session' do
51
+ let(:strategy){ OmniAuth::Strategies::Aai.new(app, {}) }
52
+
53
+ it 'should set default omniauth.auth fields' do
54
+ @dummy_id = 'abcdefg'
55
+ @uid = 'https://aai-logon.vho-switchaai.ch/idp/shibboleth!https://aai-viewer.switch.ch/shibboleth!lYQnHiuZjROvtykBpZHjy1UaZPg='
56
+ @last_name = 'Nachname'
57
+ @first_name = 'Vorname'
58
+ @email = 'test@example.com'
59
+ @shibboleth_unique_id = '099886@vho-switchaai.ch'
60
+ strategy.call!(make_env('/auth/aai/callback', 'Shib-Session-ID' => @dummy_id, 'persistent-id' => @uid, 'surname' => @last_name, 'first_name' => @first_name, 'mail' => @email, 'Shib-SwissEP-UniqueID' => @shibboleth_unique_id))
61
+ strategy.env['omniauth.auth']['uid'].should == @uid
62
+ strategy.env['omniauth.auth']['info']['name'].should == "#{@first_name} #{@last_name}"
63
+ strategy.env['omniauth.auth']['info']['email'].should == @email
64
+ strategy.env['omniauth.auth']['info']['swiss_ep_uid'].should == @shibboleth_unique_id
65
+ end
66
+ end
67
+
68
+ context 'with Shibboleth session and attribute options' do
69
+ let(:options){ { :uid_field => :uniqueID, :fields => [], :extra_fields => [:"Shib-Authentication-Instant", :homeOrganization] } }
70
+ let(:app){ lambda{|env| [404, {}, ['Awesome']]}}
71
+ let(:strategy){ OmniAuth::Strategies::Aai.new(app, options) }
72
+
73
+ it 'should set specified omniauth.auth fields' do
74
+ @dummy_id = 'abcdefg'
75
+ @uid = 'test'
76
+ @home = 'Test Corporation'
77
+ @instant = '2012-07-04T14:08:18.999Z'
78
+ strategy.call!(make_env('/auth/aai/callback', 'Shib-Session-ID' => @dummy_id, 'uniqueID' => @uid, 'Shib-Authentication-Instant' => @instant, 'homeOrganization' => @home))
79
+ strategy.env['omniauth.auth']['uid'].should == @uid
80
+ strategy.env['omniauth.auth']['extra']['raw_info']['Shib-Authentication-Instant'].should == @instant
81
+ strategy.env['omniauth.auth']['extra']['raw_info']['homeOrganization'].should == @home
82
+ end
83
+ end
84
+
85
+ context 'with debug options' do
86
+ let(:options){ { :debug => true} }
87
+ let(:strategy){ OmniAuth::Strategies::Shibboleth.new(app, options) }
88
+
89
+ it 'should raise environment variables' do
90
+ @dummy_id = 'abcdefg'
91
+ @uid = 'https://aai-logon.vho-switchaai.ch/idp/shibboleth!https://aai-viewer.switch.ch/shibboleth!lYQnHiuZjROvtykBpZHjy1UaZPg='
92
+ @last_name = 'Nachname'
93
+ @first_name = 'Vorname'
94
+ @email = 'test@example.com'
95
+ env = make_env('/auth/aai/callback', 'Shib-Session-ID' => @dummy_id, 'persistent-id' => @uid, 'surname' => @last_name, 'first_name' => @first_name, 'mail' => @email)
96
+ response = strategy.call!(env)
97
+ response[0].should == 200
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,11 @@
1
+ require 'rspec'
2
+ require 'rack/test'
3
+ require 'omniauth'
4
+ require 'omniauth/version'
5
+ require 'omniauth-shibboleth'
6
+ require 'omniauth-aai'
7
+
8
+ RSpec.configure do |config|
9
+ config.include Rack::Test::Methods
10
+ config.color_enabled = true
11
+ end
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: omniauth-aai
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Claudio Beffa
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-07-08 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: omniauth-shibboleth
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rack-test
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '2.8'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '2.8'
78
+ - !ruby/object:Gem::Dependency
79
+ name: guard-rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ description: OmniAuth Shibboleth strategies for SWITCHaai
95
+ email:
96
+ - claudio@beffa.ch
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - .travis.yml
102
+ - Gemfile
103
+ - Gemfile.lock
104
+ - Guardfile
105
+ - lib/.DS_Store
106
+ - lib/omniauth/.DS_Store
107
+ - lib/omniauth/strategies/.DS_Store
108
+ - lib/omniauth/strategies/aai.rb
109
+ - lib/omniauth-aai/version.rb
110
+ - lib/omniauth-aai.rb
111
+ - omniauth-aai.gemspec
112
+ - Rakefile
113
+ - README.md
114
+ - spec/omniauth/strategies/aai_spec.rb
115
+ - spec/spec_helper.rb
116
+ homepage: https://github.com/switch-ch/omniauth-aai
117
+ licenses: []
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ! '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ requirements: []
135
+ rubyforge_project:
136
+ rubygems_version: 1.8.24
137
+ signing_key:
138
+ specification_version: 3
139
+ summary: OmniAuth Shibboleth strategies for SWITCHaai
140
+ test_files:
141
+ - spec/omniauth/strategies/aai_spec.rb
142
+ - spec/spec_helper.rb
143
+ has_rdoc: