devise-proxy 0.1.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1e8feeaa1f3b1d27db430748fd2dc5a108b606a9
4
+ data.tar.gz: 76d447b4aef5ba2188ab7799194add1614b10991
5
+ SHA512:
6
+ metadata.gz: 311ccc467db836f3a2455ff0838ab0086bb18ce18b67207b660784b6f91ead1bd71882a295367ad439f15e519093e87c98a6f045462ddcc19a25eae80ea59b34
7
+ data.tar.gz: 91ce9f5b92fcc20ae4f9c9d6ec08723aa6ca46202e7c36abb771af63dcada2b586dbcfc64a02486cde323c31881898ba12cda09fef50c32fa238a5fe580489b6
@@ -0,0 +1,4 @@
1
+ config/devise-proxy.yml
2
+
3
+ pkg
4
+ .DS_Store
data/README.md CHANGED
@@ -28,6 +28,10 @@ You'll need a config/devise-proxy.yml file to start the application. For example
28
28
  port: 3000
29
29
 
30
30
 
31
+ ## Example Deployment on Linux ##
32
+ There is a sample init script in extra/. This script will start the proxy as a daemon on port 6969 as a given user ("tater" in our example). Edit
33
+ for your environment. Note that you may need to edit the "exec" path. In the sample it points to an rvm wrapper script created using the following command: "rvm wrapper ruby-1.9.3 bootup rackup".
34
+
31
35
  ## Troubleshooting ##
32
36
 
33
37
 
@@ -48,4 +52,4 @@ Preston Lee
48
52
 
49
53
  ## Legal ##
50
54
 
51
- See LICENSE file for details.
55
+ See LICENSE file for details.
data/Rakefile CHANGED
@@ -1,45 +1,11 @@
1
- # encoding: utf-8
2
-
3
- require 'rubygems'
4
- require 'bundler'
5
- begin
6
- Bundler.setup(:default, :development)
7
- rescue Bundler::BundlerError => e
8
- $stderr.puts e.message
9
- $stderr.puts "Run `bundle install` to install missing gems"
10
- exit e.status_code
11
- end
12
- require 'rake'
13
-
14
- require 'jeweler'
15
- Jeweler::Tasks.new do |gem|
16
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
- gem.name = "devise-proxy"
18
- gem.homepage = "http://github.com/preston/devise-proxy"
19
- gem.license = "BSD"
20
- gem.summary = %Q{A standalone Rack Middleware application that authenticates a username/password against a devise-powered backend application before forwarding the original HTTP request to the same application.}
21
- gem.description = %Q{A standalone Rack Middleware application that authenticates a username/password against a devise-powered backend application before forwarding the original HTTP request to the same application. Authentication is done on *every* request, so it is advisable to use devise-proxy sparingly.}
22
- gem.email = "conmotto@gmail.com"
23
- gem.authors = ["Preston Lee"]
24
- # dependencies defined in Gemfile
25
- end
26
- Jeweler::RubygemsDotOrgTasks.new
1
+ require "bundler/gem_tasks"
27
2
 
28
3
  require 'rake/testtask'
29
- Rake::TestTask.new(:test) do |test|
30
- test.libs << 'lib' << 'test'
31
- test.pattern = 'test/**/test_*.rb'
32
- test.verbose = true
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs << 'lib/sms-easy'
7
+ t.test_files = FileList['test/lib/devise-proxy/*_test.rb']
8
+ t.verbose = true
33
9
  end
34
-
10
+
35
11
  task :default => :test
36
-
37
- require 'rdoc/task'
38
- Rake::RDocTask.new do |rdoc|
39
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
40
-
41
- rdoc.rdoc_dir = 'rdoc'
42
- rdoc.title = "devise-proxy #{version}"
43
- rdoc.rdoc_files.include('README*')
44
- rdoc.rdoc_files.include('lib/**/*.rb')
45
- end
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+
4
+
5
+
6
+ current_dir = File.dirname(File.expand_path(__FILE__))
7
+ lib_path = File.join(current_dir, '..', 'lib')
8
+ puts lib_path
9
+ $LOAD_PATH.unshift lib_path
10
+
11
+ require 'yaml'
12
+ require 'socket'
13
+ require 'devise-proxy'
14
+ require 'ruby-debug'
15
+ require 'ipaddr'
16
+
17
+ config_file = File.join(current_dir, '..', 'config', 'devise-proxy.yml')
18
+
19
+ if File.exists? config_file
20
+ CONF = YAML::load(File.open(config_file))
21
+ auth_host = CONF['authentication']['hostname']
22
+ auth_port = CONF['authentication']['port']
23
+ AUTHENTICATOR = DeviseProxy::Authenticator.new(auth_host, auth_port)
24
+ else
25
+ puts "\nPlease create a config file prior to starting the proxy using the provided .sample file, at:\n\n\t#{config_file}\n\n"
26
+ exit 1
27
+ end
28
+
29
+
30
+ # Subset from the all-knowing Wikipedia:
31
+ #
32
+ # http://en.wikipedia.org/wiki/SOCKS
33
+ #
34
+ # The authentication methods supported are numbered as follows:
35
+ # 0x00: No authentication
36
+ # 0x01: GSSAPI[10]
37
+ # 0x02: Username/Password[11]
38
+ # 0x03-0x7F: methods assigned by IANA[12]
39
+ # 0x80-0xFE: methods reserved for private use
40
+
41
+ @@SOCKS4_VERSION = 0x04
42
+
43
+ @@SOCKS5_VERSION = 0x05
44
+ @@SOCKS5_NO_AUTH = 0x00
45
+ @@SOCKS5_USERNAME_PASSWORD = 0x02
46
+ @@SOCKS5_NO_ACCEPTABLE_METHODS = 0xFF
47
+ @@SOCKS5_AUTH_VERSION = 0x01 # "must be 0x01"
48
+ @@SOCKS5_AUTH_SUCCESS = 0x00
49
+ @@SOCKS5_AUTH_FAILURE = 0x01 # "any other value = failure, connection must be closed"
50
+
51
+ # Client-requested modes.
52
+ @@SOCKS5_TCP_STREAM_CONNECTION = 0x01
53
+ @@SOCKS5_PORT_BINDING = 0x02
54
+ @@SOCKS5_UDP_PORT = 0x03
55
+
56
+ @@SOCKS5_ADDRESS_IPV4 = 0x01
57
+ @@SOCKS5_ADDRESS_DOMAIN = 0x03
58
+ @@SOCKS5_ADDRESS_IPV6 = 0x04
59
+
60
+
61
+ def log(s)
62
+ puts "#{Time.now}: '#{s}'"
63
+ end
64
+
65
+ def validate_socks5(client)
66
+ data = client.recv(1).bytes.to_a
67
+ # puts "Socks v#{data[0]}"
68
+ data[0] == @@SOCKS5_VERSION
69
+ end
70
+
71
+ def authenticate(username, password)
72
+ # debugger
73
+ result = AUTHENTICATOR.authenticate(username, password)
74
+ log("Authentication results: #{result}.")
75
+ return result[0] == '201'
76
+ end
77
+
78
+ def not_supported(msg, client)
79
+ log(msg)
80
+ client.close
81
+ end
82
+
83
+ def forward_traffic(client)
84
+ sock = TCPSocket.new(CONF['forwarding']['hostname'], CONF['forwarding']['port'])
85
+ req = client.read
86
+ sock.write(req)
87
+ resp = sock.read
88
+ puts(resp)
89
+ client.write(resp)
90
+ end
91
+
92
+ def read_port(client)
93
+ port_a = client.recv(2).bytes.to_a
94
+ port = (port_a[0] << 8) + port_a[1]
95
+ port
96
+ end
97
+
98
+ def handle_socks5(client)
99
+ log("Requesting credentials from client.")
100
+ # debugger
101
+ challenge_bytes = [@@SOCKS5_VERSION, @@SOCKS5_USERNAME_PASSWORD].pack('C*')
102
+ log(challenge_bytes.unpack('C*'));
103
+ client.write(challenge_bytes)
104
+ ver = client.recv(1).bytes.to_a[0]
105
+ puts ver
106
+ if ver != @@SOCKS5_AUTH_VERSION
107
+ log("Client speaking non-sense.")
108
+ else
109
+ username_length = client.recv(1).bytes.to_a[0]
110
+ username = client.recv(username_length).bytes.to_a.pack('C*')
111
+ password_length = client.recv(1).bytes.to_a[0]
112
+ password = client.recv(password_length).bytes.to_a.pack('C*')
113
+ log("Attempting to authenticate #{username}:#{password}.")
114
+ success = authenticate(username, password)
115
+ if(success)
116
+
117
+ client.write [@@SOCKS5_AUTH_VERSION, @@SOCKS5_AUTH_SUCCESS].pack('C*')
118
+ # if validate_socks5(client)
119
+ client.recv(1)
120
+ if true
121
+ conn_type = client.recv(1).bytes.to_a[0]
122
+ log("Client requested type: #{conn_type}")
123
+ # case conn_type
124
+ # when @@SOCKS5_TCP_STREAM_CONNECTION
125
+ # when @@SOCKS5_PORT_BINDING
126
+ client.recv(1) # Eat a byte... "reserved, must be 0x00"
127
+ case client.recv(1).bytes.to_a[0]
128
+ when @@SOCKS5_ADDRESS_IPV4
129
+ log('IPv4 mode.')
130
+ ip = client.recv(4).bytes.to_a
131
+ port = read_port(client)
132
+ log("Client requested: #{ip}:#{port}")
133
+ resp = [@@SOCKS5_VERSION, 0, 0x00, @@SOCKS5_ADDRESS_IPV4] + ip + port_a
134
+ client.write resp.pack('C*')
135
+ forward_traffic(client)
136
+ when @@SOCKS5_ADDRESS_IPV6
137
+ not_supported("IPv6 not supported.", client)
138
+ when @@SOCKS5_ADDRESS_DOMAIN
139
+ log("Domain mode.")
140
+ domain_length = client.recv(1).bytes.to_a[0]
141
+ domain = client.recv(domain_length).bytes.to_a.pack('C*')
142
+ port = read_port(client)
143
+ log("Client requested: #{domain}:#{port}")
144
+ resp = [@@SOCKS5_VERSION, 0, 0x00, @@SOCKS5_ADDRESS_DOMAIN] + domain + port_a
145
+ client.write resp.pack('C*')
146
+ forward_traffic(client)
147
+ else
148
+ not_supported("Unsupported client connection type.", client)
149
+ end
150
+ # else
151
+ # not_supported("Client request mode not supported, sorry!", client);
152
+ # end
153
+ else
154
+ not_supported("Invalid SOCKS version.", client)
155
+ end
156
+ else
157
+ client.write [@@SOCKS5_VERSION, @@SOCKS5_AUTH_FAILURE].pack('C*')
158
+ client.close
159
+ end
160
+ end
161
+ log("Done with client connection!");
162
+ end
163
+
164
+ PROXY_PORT = 6969
165
+ server = TCPServer.new PROXY_PORT
166
+ log("Server started on port #{PROXY_PORT}.")
167
+ loop do
168
+ Thread.start(server.accept) do |client|
169
+ neg_string = client.recv(2).bytes.to_a
170
+ log("Client connection received.")
171
+ log(neg_string)
172
+ case neg_string[0]
173
+ when @@SOCKS4_VERSION
174
+ log("SOCKS v4 isn't supported, sorry!")
175
+ when @@SOCKS5_VERSION
176
+ num_methods = neg_string[1]
177
+ log("Socks v5 detected with #{num_methods} potential authentication modes.")
178
+ methods = client.recv(num_methods).bytes.to_a
179
+ supported = false
180
+ methods.each do |m|
181
+ log("Potential mode: #{m}")
182
+ supported = true if m == @@SOCKS5_USERNAME_PASSWORD
183
+ end
184
+ if supported
185
+ log("Username/Password authentication is supported!")
186
+ handle_socks5(client)
187
+ else
188
+ client.puts(@@SOCKS5_VERSION)
189
+ client.puts(@@SOCKS5_NO_ACCEPTABLE_METHODS)
190
+ end
191
+ else
192
+ log("Unknown/Unsupported client negotiation process.")
193
+ end
194
+ # (neg_string[0] == 5)
195
+ client.close
196
+ end
197
+ end
198
+
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+
4
+ require 'socket'
5
+
6
+ USERNAME = 'admin@example.com'.bytes.to_a
7
+ PASSWORD = 'passwordo'.bytes.to_a
8
+
9
+ s = TCPSocket.new('localhost', 6969)
10
+ data = [5,2,0,2].pack('C*')
11
+ puts data.length
12
+ s.write(data)
13
+ # r = s.gets
14
+ puts s.recv(2).bytes.to_a #.pack('C*')
15
+
16
+ puts "Sending credentials.."
17
+ s.write([1].pack('C*'))
18
+ s.write([USERNAME.length].pack('C*'))
19
+ s.write(USERNAME.pack('C*'))
20
+ s.write([PASSWORD.length].pack('C*'))
21
+ s.write(PASSWORD.pack('C*'))
22
+
23
+ # (
24
+ # [5] +
25
+ # [USERNAME.length] +
26
+ # USERNAME +
27
+ # [PASSWORD.length] +
28
+ # PASSWORD
29
+ # ).pack('C*')
30
+ # )
31
+ # s.flush
32
+
33
+ # write(('5' * 20).unpack('C*'))
34
+ puts "Waiting for results.."
35
+ auth_results = s.recv(2).unpack('C*')
36
+ puts "SOCKS authentication attempt: #{auth_results[1] == 0 ? 'SUCCESS' : 'FAILED'}"
37
+
38
+ # s.write
39
+
40
+ puts "Done."
data/config.ru CHANGED
@@ -1,3 +1,4 @@
1
+ require 'yaml'
1
2
 
2
3
  current_dir = File.dirname(File.expand_path(__FILE__))
3
4
  lib_path = File.join(current_dir, 'lib')
@@ -1,62 +1,24 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'devise-proxy/version'
5
5
 
6
- Gem::Specification.new do |s|
7
- s.name = "devise-proxy"
8
- s.version = "0.1.4"
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "devise-proxy"
8
+ spec.version = DeviseProxy::VERSION
9
+ spec.authors = ["Preston Lee"]
10
+ spec.email = "preston.lee@prestonlee.com"
11
+ spec.description = "A standalone Rack Middleware application that authenticates a username/password against a devise-powered backend application before forwarding the original HTTP request to the same application. Authentication is done on *every* request, so it is advisable to use devise-proxy sparingly."
12
+ spec.summary = "A standalone Rack Middleware application that authenticates a username/password against a devise-powered backend application before forwarding the original HTTP request to the same application."
13
+ spec.homepage = "https://github.com/preston/devise-proxy"
14
+ spec.licenses = ["BSD"]
9
15
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Preston Lee"]
12
- s.date = "2012-10-30"
13
- s.description = "A standalone Rack Middleware application that authenticates a username/password against a devise-powered backend application before forwarding the original HTTP request to the same application. Authentication is done on *every* request, so it is advisable to use devise-proxy sparingly."
14
- s.email = "conmotto@gmail.com"
15
- s.extra_rdoc_files = [
16
- "LICENSE",
17
- "README.md"
18
- ]
19
- s.files = [
20
- "Gemfile",
21
- "Gemfile.lock",
22
- "LICENSE",
23
- "README.md",
24
- "Rakefile",
25
- "VERSION",
26
- "config.ru",
27
- "config/devise-proxy.yml.sample",
28
- "devise-proxy.gemspec",
29
- "lib/devise-proxy.rb",
30
- "lib/devise-proxy/authenticator.rb",
31
- "lib/devise-proxy/proxy.rb",
32
- "test/helper.rb",
33
- "test/test_devise-proxy.rb"
34
- ]
35
- s.homepage = "http://github.com/preston/devise-proxy"
36
- s.licenses = ["BSD"]
37
- s.require_paths = ["lib"]
38
- s.rubygems_version = "1.8.24"
39
- s.summary = "A standalone Rack Middleware application that authenticates a username/password against a devise-powered backend application before forwarding the original HTTP request to the same application."
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
40
20
 
41
- if s.respond_to? :specification_version then
42
- s.specification_version = 3
43
-
44
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
45
- s.add_runtime_dependency(%q<rack>, [">= 0"])
46
- s.add_development_dependency(%q<shoulda>, [">= 0"])
47
- s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
48
- s.add_development_dependency(%q<rake>, [">= 0"])
49
- else
50
- s.add_dependency(%q<rack>, [">= 0"])
51
- s.add_dependency(%q<shoulda>, [">= 0"])
52
- s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
53
- s.add_dependency(%q<rake>, [">= 0"])
54
- end
55
- else
56
- s.add_dependency(%q<rack>, [">= 0"])
57
- s.add_dependency(%q<shoulda>, [">= 0"])
58
- s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
59
- s.add_dependency(%q<rake>, [">= 0"])
60
- end
21
+ spec.add_runtime_dependency 'rack', '>= 1.5.2'
22
+ spec.add_development_dependency 'rake', '>= 10.3.2'
61
23
  end
62
24
 
@@ -0,0 +1,57 @@
1
+ #!/bin/sh
2
+ #
3
+ #
4
+
5
+ # Source function library.
6
+ . /etc/rc.d/init.d/functions
7
+
8
+ # Source networking configuration.
9
+ . /etc/sysconfig/network
10
+
11
+ # Check that networking is up.
12
+ [ "$NETWORKING" = "no" ] && exit 0
13
+
14
+ exec="/usr/local/rvm/bin/bootup_rackup"
15
+ prog="devise-proxy"
16
+ user=tater
17
+ proxy_home=/home/$user/$prog
18
+ proxy_port=6969
19
+ proxy_config=$proxy_home/config.ru
20
+ pid_file=$proxy_home/$prog.pid
21
+
22
+
23
+ start() {
24
+
25
+ echo -n $"Starting $prog: "
26
+ daemon --user=$user "$exec -p $proxy_port -D -P $pid_file $proxy_config"
27
+ retval=$?
28
+ return $retval
29
+ }
30
+
31
+ stop() {
32
+ echo -n $"Stopping $prog: "
33
+ killproc -p $pid_file
34
+ retval=$?
35
+ return $retval
36
+ }
37
+
38
+ restart() {
39
+ stop
40
+ start
41
+ }
42
+
43
+ force_reload() {
44
+ restart
45
+ }
46
+
47
+ case "$1" in
48
+ start|stop|restart)
49
+ $1
50
+ ;;
51
+ force-reload)
52
+ force_reload
53
+ ;;
54
+ *)
55
+ echo $"Usage: $0 {start|stop|restart|force-reload}"
56
+ exit 2
57
+ esac
@@ -33,12 +33,13 @@ module DeviseProxy
33
33
 
34
34
  http = Net::HTTP.new(@host, @port).start
35
35
  resp1 = http.request(sig)
36
- puts "Response: #{resp1.code} , Message: #{resp1.message} , Body: #{resp1.body}"
36
+ # puts "Response: #{resp1.code} , Message: #{resp1.message} , Body: #{resp1.body}"
37
37
  result = []
38
+ json_resp = JSON.parse(resp1.body)
39
+ #puts json_resp.inspect
40
+ @auth_token = json_resp['auth_token']
38
41
  if resp1.code == "200" then
39
42
  puts "logged in"
40
- json_resp = JSON.parse(resp1.body)
41
- @auth_token = json_resp['auth_token']
42
43
 
43
44
  @req_body = {
44
45
  "device" => {
@@ -52,19 +53,19 @@ module DeviseProxy
52
53
  req.body = @req_body
53
54
 
54
55
  response = http.request(req)
55
- puts "Response: #{response.code} , Message: #{response.message} , Body: #{response.body}"
56
+ # puts "Response: #{response.code} , Message: #{response.message} , Body: #{response.body}"
56
57
 
57
58
  headers = {}
58
59
  sub_response.each_header do |k,v|
59
- headers[k] = v unless k.to_s =~ /cookie|content-length|transfer-encoding/i
60
+ headers[k] = v unless k.to_s =~ /content-length|transfer-encoding/i
60
61
  end
61
62
  result = [response.code, headers, response.body]
62
63
  else
63
64
  headers = {}
64
65
  resp1.each_header do |k,v|
65
- headers[k] = v unless k.to_s =~ /cookie|content-length|transfer-encoding/i
66
+ headers[k] = v unless k.to_s =~ /content-length|transfer-encoding/i
66
67
  end
67
- result = [resp1.code, headers, resp1.body]
68
+ result = [resp1.code, headers, resp1.body, @auth_token]
68
69
  end
69
70
  return result
70
71
  end
@@ -27,7 +27,6 @@ module DeviseProxy
27
27
  end
28
28
 
29
29
  def call(env)
30
- req = Rack::Request.new(env)
31
30
  # puts req.to_yaml
32
31
 
33
32
  puts "User agent: #{env['HTTP_USER_AGENT']}"
@@ -42,7 +41,7 @@ module DeviseProxy
42
41
  email = credentials[0]
43
42
  password = credentials[1]
44
43
 
45
- puts "Client password credentials email: #{email}, password, #{password}"
44
+ #puts "Client password credentials email: #{email}, password, #{password}"
46
45
 
47
46
  result = [502, {'Content-Type' => 'text/plain'}, ["HTTP 502 - Ah crap! The authenticating proxy seems to be having issues. :-/"]]
48
47
  begin
@@ -53,11 +52,13 @@ module DeviseProxy
53
52
 
54
53
  result = [403, auth[1], [auth[2]]]
55
54
  if allowed
55
+ env['QUERY_STRING'] = [env['QUERY_STRING'], "auth_token=#{auth[3]}"].reject{|s| s.length < 1}.join('&')
56
56
 
57
+ req = Rack::Request.new(env)
57
58
  method = req.request_method.downcase
58
59
  method[0..0] = method[0..0].upcase
59
60
 
60
- sub_request = Net::HTTP.const_get(method).new("#{req.path}#{"?" if req.query_string}#{req.query_string}")
61
+ sub_request = Net::HTTP.const_get(method).new("#{req.path}?#{req.query_string}")
61
62
 
62
63
  if sub_request.request_body_permitted? and req.body
63
64
  sub_request.body_stream = req.body
@@ -69,18 +70,29 @@ module DeviseProxy
69
70
  sub_request["Accept-Encoding"] = req.accept_encoding
70
71
  sub_request["Referer"] = req.referer
71
72
 
73
+ all_cookies = auth[1]['set-cookie'].split(/;/)
74
+ cookies_array = Array.new
75
+ all_cookies.each { | cookie |
76
+ cookies_array.push(cookie.split('; ')[0])
77
+ }
78
+ cookies = cookies_array.join('; ')
79
+
80
+ sub_request["Cookie"] = cookies
81
+
72
82
  sub_response = Net::HTTP.start(@host, @port) do |http|
73
83
  http.request(sub_request)
74
84
  end
75
85
 
76
86
  headers = {}
77
87
  sub_response.each_header do |k,v|
78
- headers[k] = v unless k.to_s =~ /cookie|content-length|transfer-encoding/i
88
+ headers[k] = v unless k.to_s =~ /cookie|content-length|transfer-encoding|status/i
79
89
  end
80
90
 
81
- result = [sub_response.code.to_i, headers, [sub_response.read_body]]
91
+ body = sub_response.body
92
+ result = [sub_response.code.to_i, headers, [body]]
82
93
  end
83
- rescue
94
+ rescue Exception => e
95
+ puts e.message
84
96
  # Probably an I/O issue connecting to the authentication service.
85
97
  end
86
98
 
@@ -93,7 +105,9 @@ module DeviseProxy
93
105
  # end
94
106
  headers['Proxy-Authenticate'] = 'Basic realm="A valid account is required. Please use your registered email address as your username."'
95
107
  headers['Content-Type'] = 'text/plain'
96
- result = [407, headers, ["Email/Password required!"]]
108
+ headers['WWW-Authenticate'] = 'Basic realm="aousntoheunth"'
109
+ # result = [407, headers, ["Email/Password required!"]]
110
+ result = [401, headers, ["Email/Password required!"]]
97
111
  end
98
112
 
99
113
 
@@ -0,0 +1,3 @@
1
+ module DeviseProxy
2
+ VERSION = '1.0.0'
3
+ end
@@ -8,7 +8,6 @@ rescue Bundler::BundlerError => e
8
8
  exit e.status_code
9
9
  end
10
10
  require 'test/unit'
11
- require 'shoulda'
12
11
 
13
12
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
13
  $LOAD_PATH.unshift(File.dirname(__FILE__))
@@ -1,6 +1,6 @@
1
- require 'helper'
1
+ require '../helper'
2
2
 
3
- class TestDeviseProxy < Test::Unit::TestCase
3
+ class AuthenticatorTest < Test::Unit::TestCase
4
4
 
5
5
  context 'initialization' do
6
6
 
metadata CHANGED
@@ -1,133 +1,96 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise-proxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
5
- prerelease:
4
+ version: 1.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Preston Lee
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-10-30 00:00:00.000000000 Z
11
+ date: 2014-10-10 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rack
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
- version: '0'
19
+ version: 1.5.2
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
- version: '0'
30
- - !ruby/object:Gem::Dependency
31
- name: shoulda
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: jeweler
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ~>
52
- - !ruby/object:Gem::Version
53
- version: 1.8.4
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: 1.8.4
26
+ version: 1.5.2
62
27
  - !ruby/object:Gem::Dependency
63
28
  name: rake
64
29
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
30
  requirements:
67
- - - ! '>='
31
+ - - ">="
68
32
  - !ruby/object:Gem::Version
69
- version: '0'
33
+ version: 10.3.2
70
34
  type: :development
71
35
  prerelease: false
72
36
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
37
  requirements:
75
- - - ! '>='
38
+ - - ">="
76
39
  - !ruby/object:Gem::Version
77
- version: '0'
40
+ version: 10.3.2
78
41
  description: A standalone Rack Middleware application that authenticates a username/password
79
42
  against a devise-powered backend application before forwarding the original HTTP
80
43
  request to the same application. Authentication is done on *every* request, so it
81
44
  is advisable to use devise-proxy sparingly.
82
- email: conmotto@gmail.com
83
- executables: []
45
+ email: preston.lee@prestonlee.com
46
+ executables:
47
+ - devise-socks.rb
48
+ - mock-socks.rb
84
49
  extensions: []
85
- extra_rdoc_files:
86
- - LICENSE
87
- - README.md
50
+ extra_rdoc_files: []
88
51
  files:
89
- - Gemfile
90
- - Gemfile.lock
52
+ - ".gitignore"
91
53
  - LICENSE
92
54
  - README.md
93
55
  - Rakefile
94
- - VERSION
56
+ - bin/devise-socks.rb
57
+ - bin/mock-socks.rb
95
58
  - config.ru
96
59
  - config/devise-proxy.yml.sample
97
60
  - devise-proxy.gemspec
61
+ - extra/devise-proxy
98
62
  - lib/devise-proxy.rb
99
63
  - lib/devise-proxy/authenticator.rb
100
64
  - lib/devise-proxy/proxy.rb
65
+ - lib/devise-proxy/version.rb
101
66
  - test/helper.rb
102
- - test/test_devise-proxy.rb
103
- homepage: http://github.com/preston/devise-proxy
67
+ - test/lib/authenticator_test.rb
68
+ homepage: https://github.com/preston/devise-proxy
104
69
  licenses:
105
70
  - BSD
71
+ metadata: {}
106
72
  post_install_message:
107
73
  rdoc_options: []
108
74
  require_paths:
109
75
  - lib
110
76
  required_ruby_version: !ruby/object:Gem::Requirement
111
- none: false
112
77
  requirements:
113
- - - ! '>='
78
+ - - ">="
114
79
  - !ruby/object:Gem::Version
115
80
  version: '0'
116
- segments:
117
- - 0
118
- hash: -1230018857575091658
119
81
  required_rubygems_version: !ruby/object:Gem::Requirement
120
- none: false
121
82
  requirements:
122
- - - ! '>='
83
+ - - ">="
123
84
  - !ruby/object:Gem::Version
124
85
  version: '0'
125
86
  requirements: []
126
87
  rubyforge_project:
127
- rubygems_version: 1.8.24
88
+ rubygems_version: 2.2.2
128
89
  signing_key:
129
- specification_version: 3
90
+ specification_version: 4
130
91
  summary: A standalone Rack Middleware application that authenticates a username/password
131
92
  against a devise-powered backend application before forwarding the original HTTP
132
93
  request to the same application.
133
- test_files: []
94
+ test_files:
95
+ - test/helper.rb
96
+ - test/lib/authenticator_test.rb
data/Gemfile DELETED
@@ -1,11 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'rack'
4
-
5
- group :development do
6
- gem "shoulda"
7
- # gem "rdoc", "~> 3.12"
8
- # gem "bundler", "~> 1.0.0"
9
- gem "jeweler", "~> 1.8.4"
10
- gem 'rake'
11
- end
@@ -1,34 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- activesupport (3.2.8)
5
- i18n (~> 0.6)
6
- multi_json (~> 1.0)
7
- git (1.2.5)
8
- i18n (0.6.1)
9
- jeweler (1.8.4)
10
- bundler (~> 1.0)
11
- git (>= 1.2.5)
12
- rake
13
- rdoc
14
- json (1.7.5)
15
- multi_json (1.3.6)
16
- rack (1.4.1)
17
- rake (0.9.2.2)
18
- rdoc (3.12)
19
- json (~> 1.4)
20
- shoulda (3.3.2)
21
- shoulda-context (~> 1.0.1)
22
- shoulda-matchers (~> 1.4.1)
23
- shoulda-context (1.0.1)
24
- shoulda-matchers (1.4.1)
25
- activesupport (>= 3.0.0)
26
-
27
- PLATFORMS
28
- ruby
29
-
30
- DEPENDENCIES
31
- jeweler (~> 1.8.4)
32
- rack
33
- rake
34
- shoulda
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.1.4