oa-casport 0.1.1 → 0.1.4
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.
- data/README.md +39 -0
- data/lib/oa-casport/version.rb +1 -1
- data/lib/omniauth/strategies/casport.rb +44 -30
- data/oa-casport.gemspec +3 -0
- data/spec/casport_spec.rb +15 -0
- data/spec/spec_helper.rb +15 -0
- metadata +30 -5
- data/README +0 -30
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# oa-casport
|
2
|
+
|
3
|
+
The goal of this gem is to allow CASPORT integartion with your rack-based application easily through OmniAuth.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add the following line to your Gemfile:
|
8
|
+
|
9
|
+
gem 'oa-casport'
|
10
|
+
|
11
|
+
## Configuration Parameters:
|
12
|
+
|
13
|
+
Configuration within the initializer for OmniAuth:
|
14
|
+
|
15
|
+
# @example Basic Usage
|
16
|
+
#
|
17
|
+
# use OmniAuth::Strategies::Casport, {
|
18
|
+
# :setup => true
|
19
|
+
# }
|
20
|
+
#
|
21
|
+
# @example Full Options Usage
|
22
|
+
#
|
23
|
+
# use OmniAuth::Strategies::Casport, {
|
24
|
+
# :setup => true,
|
25
|
+
# :cas_server => 'http://cas.slkdemos.com/users/',
|
26
|
+
# :format => 'json', 'xml' || Defaults to 'xml'
|
27
|
+
# :format_header => 'application/xml', 'application/json' || Defaults to 'application/xml'
|
28
|
+
# :ssl_ca_file => 'path/to/ca_file.crt',
|
29
|
+
# :pem_cert => '/path/to/cert.pem',
|
30
|
+
# :pem_cert_pass => 'keep it secret, keep it safe.',
|
31
|
+
# :redis_options => 'disabled'
|
32
|
+
# }
|
33
|
+
|
34
|
+
## Example Applications
|
35
|
+
|
36
|
+
You can see how to set it up and use it with a Rails 3 application at: [https://github.com/stevenhaddox/oa-casport-rails3](https://github.com/stevenhaddox/oa-casport-rails3)
|
37
|
+
|
38
|
+
\#TODO: You can see how to set it up and use it with a Sinatra application at: [https://github.com/stevenhaddox/oa-casport-sinatra](https://github.com/stevenhaddox/oa-casport-sinatra)
|
39
|
+
|
data/lib/oa-casport/version.rb
CHANGED
@@ -2,6 +2,7 @@ require 'omniauth/core'
|
|
2
2
|
require 'httparty'
|
3
3
|
require 'redis'
|
4
4
|
require 'uri'
|
5
|
+
require 'yaml'
|
5
6
|
|
6
7
|
module OmniAuth
|
7
8
|
module Strategies
|
@@ -11,19 +12,20 @@ module OmniAuth
|
|
11
12
|
# @example Basic Usage
|
12
13
|
#
|
13
14
|
# use OmniAuth::Strategies::Casport, {
|
14
|
-
#
|
15
|
-
#
|
15
|
+
# :setup => true
|
16
|
+
# }
|
16
17
|
# @example Full Options Usage
|
17
18
|
#
|
18
19
|
# use OmniAuth::Strategies::Casport, {
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
20
|
+
# :setup => true,
|
21
|
+
# :cas_server => 'http://cas.slkdemos.com/users/',
|
22
|
+
# :format => 'json', 'xml', 'html', etc. || Defaults to 'xml'
|
23
|
+
# :format_header => 'application/xml',
|
24
|
+
# :ssl_ca_file => 'path/to/ca_file.crt',
|
25
|
+
# :pem_cert => '/path/to/cert.pem',
|
26
|
+
# :pem_cert_pass => 'keep it secret, keep it safe.',
|
27
|
+
# :redis_options => 'disabled' or options_hash || Defaults to {:host => '127.0.0.1', :port => 6739}
|
28
|
+
# }
|
27
29
|
class Casport
|
28
30
|
|
29
31
|
include OmniAuth::Strategy
|
@@ -65,7 +67,7 @@ module OmniAuth
|
|
65
67
|
fail!(:invalid_user, e)
|
66
68
|
end
|
67
69
|
OmniAuth::Utils.deep_merge(super, {
|
68
|
-
'uid' => user_obj['
|
70
|
+
'uid' => user_obj['dn'],
|
69
71
|
'user_info' => {
|
70
72
|
'name' => user_obj['full_name'],
|
71
73
|
'email' => user_obj['email']
|
@@ -83,7 +85,9 @@ module OmniAuth
|
|
83
85
|
# :pem_cert_pass - plaintext password, not recommended!
|
84
86
|
def self.setup_httparty(opts)
|
85
87
|
format opts[:format].to_sym
|
86
|
-
headers 'Accept'
|
88
|
+
headers 'Accept' => opts[:format_header]
|
89
|
+
headers 'Content-Type' => opts[:format_header]
|
90
|
+
headers 'X-XSRF-UseProtection' => 'false' if opts[:format] == 'json'
|
87
91
|
if opts[:ssl_ca_file]
|
88
92
|
ssl_ca_file opts[:ssl_ca_file]
|
89
93
|
if opts[:pem_cert_pass]
|
@@ -98,12 +102,19 @@ module OmniAuth
|
|
98
102
|
# Can't get user data without a UID from the application
|
99
103
|
begin
|
100
104
|
raise "No UID set in request.env['omniauth.strategy'].options[:uid]" if @options[:uid].nil?
|
101
|
-
|
105
|
+
# Fix DN order (if we have a DN) for CASPORT to work properly
|
106
|
+
if @options[:uid].include?('/') or @options[:uid].include?(',')
|
107
|
+
# Convert '/' to ',' and split on ','
|
108
|
+
@options[:uid] = @options[:uid].gsub('/',',').split(',').reject{|array| array.all? {|el| el.nil? || el.strip.empty? }}
|
109
|
+
# See if the DN is in the order CASPORT expects (and fix it if needed)
|
110
|
+
@options[:uid] = @options[:uid].reverse if @options[:uid].first.downcase.include? 'c='
|
111
|
+
# Join our array of DN elements back together with a comma as expected by CASPORT
|
112
|
+
@options[:uid] = @options.join ','
|
113
|
+
end
|
102
114
|
rescue => e
|
103
115
|
fail!(:uid_not_found, e)
|
104
116
|
end
|
105
117
|
|
106
|
-
url = URI.escape("#{@options[:cas_server]}/#{@options[:uid]}.#{@options[:format]}")
|
107
118
|
begin
|
108
119
|
raise Errno::ECONNREFUSED if @options[:redis_options] == 'disabled'
|
109
120
|
cache = @options[:redis_options].nil? ? Redis.new : Redis.new(@options[:redis_options])
|
@@ -111,30 +122,33 @@ module OmniAuth
|
|
111
122
|
# User is not in the cache
|
112
123
|
# Retrieving the user data from CASPORT
|
113
124
|
# {'userinfo' => {{'uid' => UID}, {'fullName' => NAME},...}},
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
125
|
+
get_user
|
126
|
+
if @user
|
127
|
+
# Set Redis object for the user, and expire after 24 hours
|
128
|
+
cache.set @options[:uid], @user.to_yaml
|
129
|
+
cache.expire @options[:uid], 1440
|
130
|
+
end
|
131
|
+
else
|
132
|
+
# We found our user in the cache, let's parse it into a Ruby object
|
133
|
+
@user = YAML::load(@user)
|
118
134
|
end
|
119
135
|
# If we can't connect to Redis...
|
120
136
|
rescue Errno::ECONNREFUSED => e
|
121
|
-
|
137
|
+
get_user
|
122
138
|
end
|
123
|
-
@user = nil if user_empty?
|
124
139
|
@user
|
125
140
|
end
|
126
141
|
|
127
|
-
#
|
128
|
-
def
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
142
|
+
# Query for the user against CASPORT, return as nil or parsed object
|
143
|
+
def get_user
|
144
|
+
return if @user # no extra http calls
|
145
|
+
url = URI.escape("#{@options[:cas_server]}/#{@options[:uid]}.#{@options[:format]}")
|
146
|
+
response = Casport.get(url)
|
147
|
+
if response.success?
|
148
|
+
@user = response.parsed_response
|
149
|
+
else
|
150
|
+
@user = nil
|
136
151
|
end
|
137
|
-
is_empty == true ? true : nil
|
138
152
|
end
|
139
153
|
|
140
154
|
end
|
data/oa-casport.gemspec
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '../lib/omniauth/strategies/casport.rb')
|
3
|
+
|
4
|
+
desribe ".user" do
|
5
|
+
let(:app) { lamdba { |env| [200, {}, ['Test']] } }
|
6
|
+
|
7
|
+
it "should have correct xml returned" do
|
8
|
+
result = {'userinfo' => {'name' => 'Tyler Durden'}}
|
9
|
+
userinfo = '<userinfo><name>Tyler Durden</name></userinfo>'
|
10
|
+
FakeWeb.register_uri(:get, 'http://cas.dev/dn', :body => userinfo)
|
11
|
+
options = {:dn => 'dn', :cas_server => 'http://cas.dev/'}
|
12
|
+
user = OmniAuth::Strategies::Casport.new(app, options).user
|
13
|
+
user.should == result
|
14
|
+
end
|
15
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
4
|
+
require 'fakeweb'
|
5
|
+
require 'oa-casport'
|
6
|
+
require 'httparty'
|
7
|
+
require 'redis'
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
# some (optional) config here
|
11
|
+
end
|
12
|
+
|
13
|
+
before(:each) do
|
14
|
+
FakeWeb.clean_registry
|
15
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: oa-casport
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.4
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jesus Jackson
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2011-07-
|
14
|
+
date: 2011-07-28 00:00:00 -04:00
|
15
15
|
default_executable:
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
@@ -47,6 +47,28 @@ dependencies:
|
|
47
47
|
version: "0"
|
48
48
|
type: :runtime
|
49
49
|
version_requirements: *id003
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: rspec
|
52
|
+
prerelease: false
|
53
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: "0"
|
59
|
+
type: :development
|
60
|
+
version_requirements: *id004
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: fakeweb
|
63
|
+
prerelease: false
|
64
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: "0"
|
70
|
+
type: :development
|
71
|
+
version_requirements: *id005
|
50
72
|
description: " Simple gem to enable rack powered Ruby apps to authenticate internally via casport with ease"
|
51
73
|
email:
|
52
74
|
- jesusejackson@gmail.com
|
@@ -61,12 +83,14 @@ files:
|
|
61
83
|
- .gitignore
|
62
84
|
- .rvmrc
|
63
85
|
- Gemfile
|
64
|
-
- README
|
86
|
+
- README.md
|
65
87
|
- Rakefile
|
66
88
|
- lib/oa-casport.rb
|
67
89
|
- lib/oa-casport/version.rb
|
68
90
|
- lib/omniauth/strategies/casport.rb
|
69
91
|
- oa-casport.gemspec
|
92
|
+
- spec/casport_spec.rb
|
93
|
+
- spec/spec_helper.rb
|
70
94
|
has_rdoc: true
|
71
95
|
homepage: https://github.com/stevenhaddox/oa-casport
|
72
96
|
licenses: []
|
@@ -95,5 +119,6 @@ rubygems_version: 1.6.2
|
|
95
119
|
signing_key:
|
96
120
|
specification_version: 3
|
97
121
|
summary: OmniAuth gem for internal casport server
|
98
|
-
test_files:
|
99
|
-
|
122
|
+
test_files:
|
123
|
+
- spec/casport_spec.rb
|
124
|
+
- spec/spec_helper.rb
|
data/README
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
# oa-casport is a custom strategy for authentication with Casport that works with the OmniAuth gem
|
2
|
-
|
3
|
-
## Examples:
|
4
|
-
|
5
|
-
You can see how to set it up and use it with a Rails 3 application at: [https://github.com/stevenhaddox/oa-casport-rails3](https://github.com/stevenhaddox/oa-casport-rails3)
|
6
|
-
|
7
|
-
\#TODO: You can see how to set it up and use it with a Sinatra application at: [https://github.com/stevenhaddox/oa-casport-sinatra](https://github.com/stevenhaddox/oa-casport-sinatra)
|
8
|
-
|
9
|
-
## Configuration Parameters:
|
10
|
-
|
11
|
-
Configuration within the initializer for OmniAuth:
|
12
|
-
|
13
|
-
# @example Basic Usage
|
14
|
-
#
|
15
|
-
# use OmniAuth::Strategies::Casport, {
|
16
|
-
# :setup => true
|
17
|
-
# }
|
18
|
-
# @example Full Options Usage
|
19
|
-
#
|
20
|
-
# use OmniAuth::Strategies::Casport, {
|
21
|
-
# :setup => true,
|
22
|
-
# :cas_server => 'http://cas.slkdemos.com/users/',
|
23
|
-
# :format => 'json', 'xml', 'html', etc. || Defaults to 'xml'
|
24
|
-
# :format_header => 'application/xml',
|
25
|
-
# :ssl_ca_file => 'path/to/ca_file.crt',
|
26
|
-
# :pem_cert => '/path/to/cert.pem',
|
27
|
-
# :pem_cert_pass => 'keep it secret, keep it safe.'
|
28
|
-
# }
|
29
|
-
|
30
|
-
|