zimbra_intercepting_proxy 0.0.4.1 → 0.0.4.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1f345ce94138c1ff8efc2cd1b020262f422b6b28
4
- data.tar.gz: 912237b2a69c2ff996817eec4ecbc002c9f378ca
3
+ metadata.gz: c43322897f826dfb60b13d7f600624311debaa4e
4
+ data.tar.gz: 52c6130238ffb9f4d7ab0be5a8381f8ac6238ed5
5
5
  SHA512:
6
- metadata.gz: 651eddbf023bc51e68eb5de039d69d17d97366b694e7e52c6f287eab7206c56f15eb3d53c58d59ad2495fb3b55ac365e6af778af0c8ab52bb60b8241b3bcaf28
7
- data.tar.gz: 8fed88b3459e1068fd4bdc0d8b8b5f482185fe2256268286598a6cbbc757ffceaaaf04ee0b21d728fd36856eb7ef5db3043c823e6f7af1a6eebff6c72ca73319
6
+ metadata.gz: 92ddfc17968639cc7a521e909df6519da27792647441c987571425f22013541348cb6284a103349fb344191d73176b2b0a2687f7a843a08aa06ae711aee58bc9
7
+ data.tar.gz: 85976c28eed04ae7b12e105638c7d2d5e44bde9e162467cf5058d4e34800c4925c42bd755134b97565df4fa3fce2ed91a961da309b65cdd8457afaa28443fd21
data/README.md CHANGED
@@ -1,7 +1,12 @@
1
1
  # ZimbraInterceptingProxy
2
2
 
3
- TODO: Write a gem description
3
+ This software is used to Intercept and Transform the traffic to and from the Zimbra Mailboxes when using a Zimbra Proxy.
4
+ If you don't know what Zimbra Proxy is, You can read about it here: [https://wiki.zimbra.com/wiki/Zimbra_Proxy_Guide](https://wiki.zimbra.com/wiki/Zimbra_Proxy_Guide)
4
5
 
6
+ ## What is good for?
7
+
8
+ ### Zimbra Migrations
9
+ Suppose you
5
10
 
6
11
  ## TODO:
7
12
 
@@ -4,6 +4,7 @@ require 'em-proxy'
4
4
  require 'http/parser'
5
5
  require "addressable/uri"
6
6
  require 'logger'
7
+ require 'xmlsimple'
7
8
  require "zimbra_intercepting_proxy/version"
8
9
  require "zimbra_intercepting_proxy/user"
9
10
  require "zimbra_intercepting_proxy/config"
@@ -4,16 +4,26 @@ module ZimbraInterceptingProxy
4
4
 
5
5
  attr_accessor :body, :headers, :parser
6
6
 
7
- def initialize(connection, parser)
7
+ def initialize(connection, parser = nil)
8
8
  @body = connection.body
9
9
  @headers = connection.headers
10
10
  @parser = parser
11
11
  end
12
12
 
13
13
  def auth_request?
14
+ default_auth_request? || zco_auth_request?
15
+ end
16
+
17
+ # This is the post Auth request sent by Webmail, ActiveSync and POP and IMAP
18
+ def default_auth_request?
14
19
  @parser.http_method == "POST" && @parser.request_url == "/zimbra/" && @headers["Cookie"] = "ZM_TEST=true" && auth_request_params?
15
20
  end
16
21
 
22
+ def zco_auth_request?
23
+ @parser.http_method == "POST" && @parser.request_url == "/service/soap/AuthRequest" && @headers["User-Agent"].match(/Zimbra-ZCO/)
24
+ end
25
+
26
+
17
27
  def auth_request_params?
18
28
  uri = Addressable::URI.parse("http://localhost/?#{@body}")
19
29
  uri.query_values["loginOp"] == "login"
@@ -29,14 +39,21 @@ module ZimbraInterceptingProxy
29
39
  end
30
40
 
31
41
  def user_token
32
- return auth_username if auth_request?
42
+ return auth_username if default_auth_request?
33
43
  return auth_zimbraId if route_request?
44
+ return auth_zco_username if zco_auth_request?
34
45
  end
35
46
 
36
47
  def auth_zimbraId
37
48
  headers["Auth-User"]
38
49
  end
39
50
 
51
+ def auth_zco_username
52
+ # Hold on, we have to dig deeper
53
+ xml = XmlSimple.xml_in @body
54
+ xml["Body"].first["AuthRequest"].first["account"].first["content"]
55
+ end
56
+
40
57
  def auth_username
41
58
  uri = Addressable::URI.parse("http://localhost/?#{@body}")
42
59
  uri.query_values["username"]
@@ -11,7 +11,7 @@ module ZimbraInterceptingProxy
11
11
 
12
12
  Proxy.start(:host => host, :port => port) do |conn|
13
13
 
14
- debug.logger "Starting server on #{host}:#{port}"
14
+ debug.logger "Starting server on #{host}:#{port} - V. #{ZimbraInterceptingProxy::VERSION}"
15
15
 
16
16
  @backend = {host: ZimbraInterceptingProxy::Config.old_backend, port: 80}
17
17
  connection = ZimbraInterceptingProxy::Connection.new
@@ -1,3 +1,3 @@
1
1
  module ZimbraInterceptingProxy
2
- VERSION = "0.0.4.1"
2
+ VERSION = "0.0.4.2"
3
3
  end
@@ -0,0 +1 @@
1
+ <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"><soap:Header><context xmlns="urn:zimbra"><userAgent name="ZimbraConnectorForOutlook" version="8.5.1.1259"/><nonotify/><noqualify/></context></soap:Header><soap:Body><AuthRequest xmlns="urn:zimbraAccount"><account by="name">watson@example.com</account><password>watson</password><virtualHost>200.91.20.186</virtualHost></AuthRequest></soap:Body></soap:Envelope>
data/test/test_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "zimbra_intercepting_proxy"
2
+ require 'ostruct'
2
3
 
3
4
  require 'minitest/autorun'
4
5
  require 'minitest/reporters' # requires the gem
data/test/test_request.rb CHANGED
@@ -3,18 +3,37 @@ require 'test_helper'
3
3
  class Request < Minitest::Test
4
4
 
5
5
  def setup
6
+ @done = false
6
7
  @auth_request = IO.read("./test/fixtures/auth_80.txt")
7
8
  @route_request = IO.read("./test/fixtures/route_7072.txt")
9
+ @soap_auth_request = IO.read("./test/fixtures/zco_soap.xml")
10
+ @connection = OpenStruct.new
11
+ @parser = OpenStruct.new
8
12
  end
9
13
 
10
- # def test_should_return_user_token_from_auth_request
11
- # request = ZimbraInterceptingProxy::Request.new @auth_request
12
- # assert_equal("pbruna", request.user_token)
13
- # end
14
- #
15
- # def test_should_return_user_token_from_route_request
16
- # request = ZimbraInterceptingProxy::Request.new @route_request
17
- # assert_equal("251b1902-2250-4477-bdd1-8a101f7e7e4e", request.user_token)
18
- # end
19
- #
14
+ def test_should_return_user_token_from_auth_request
15
+ @parser.http_method = "POST"
16
+ @parser.request_url = "/zimbra/"
17
+ @connection.headers = {"Cookie" => "ZM_TEST=true"}
18
+ @connection.body = "loginOp=login&username=pbruna&password=5693537374&client=preferred"
19
+ request = ZimbraInterceptingProxy::Request.new @connection, @parser
20
+ assert_equal("pbruna", request.user_token)
21
+ end
22
+
23
+ def test_should_return_user_token_from_route_request
24
+ @parser.request_url = ZimbraInterceptingProxy::Config::ROUTE_URL
25
+ @connection.headers = {"Auth-User" => "251b1902-2250-4477-bdd1-8a101f7e7e4e"}
26
+ request = ZimbraInterceptingProxy::Request.new @connection, @parser
27
+ assert_equal("251b1902-2250-4477-bdd1-8a101f7e7e4e", request.user_token)
28
+ end
29
+
30
+ def test_should_get_username_from_zco_auth_request
31
+ @parser.http_method = "POST"
32
+ @parser.request_url = "/service/soap/AuthRequest"
33
+ @connection.headers = {"User-Agent" => "Zimbra-ZCO"}
34
+ @connection.body = @soap_auth_request
35
+ request = ZimbraInterceptingProxy::Request.new @connection, @parser
36
+ assert_equal("watson@example.com", request.user_token)
37
+ end
38
+
20
39
  end
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["pbruna@itlinux.cl"]
11
11
  spec.summary = "A HTTP intercepting Proxy for the Zimbra Proxy"
12
12
  spec.description = spec.summary
13
- spec.homepage = ""
13
+ spec.homepage = "https://github.com/pbruna/zimbra_intercepting_proxy"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_dependency 'uuid'
24
24
  spec.add_dependency 'http_parser.rb'
25
25
  spec.add_dependency 'addressable'
26
+ spec.add_dependency 'xml-simple'
26
27
 
27
28
 
28
29
  spec.add_development_dependency "bundler", "~> 1.6"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zimbra_intercepting_proxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4.1
4
+ version: 0.0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patricio Bruna
@@ -14,112 +14,126 @@ dependencies:
14
14
  name: em-proxy
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: thor
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: uuid
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: http_parser.rb
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: addressable
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: xml-simple
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: bundler
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - ~>
101
+ - - "~>"
88
102
  - !ruby/object:Gem::Version
89
103
  version: '1.6'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - ~>
108
+ - - "~>"
95
109
  - !ruby/object:Gem::Version
96
110
  version: '1.6'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: rake
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - '>='
115
+ - - ">="
102
116
  - !ruby/object:Gem::Version
103
117
  version: '0'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - '>='
122
+ - - ">="
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: minitest-reporters
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - '>='
129
+ - - ">="
116
130
  - !ruby/object:Gem::Version
117
131
  version: '0'
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - '>='
136
+ - - ">="
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
125
139
  description: A HTTP intercepting Proxy for the Zimbra Proxy
@@ -130,7 +144,7 @@ executables:
130
144
  extensions: []
131
145
  extra_rdoc_files: []
132
146
  files:
133
- - .gitignore
147
+ - ".gitignore"
134
148
  - Gemfile
135
149
  - LICENSE.txt
136
150
  - README.md
@@ -148,12 +162,13 @@ files:
148
162
  - test/fixtures/auth_80.txt
149
163
  - test/fixtures/route_7072.txt
150
164
  - test/fixtures/users.yml
165
+ - test/fixtures/zco_soap.xml
151
166
  - test/test_backend.rb
152
167
  - test/test_helper.rb
153
168
  - test/test_request.rb
154
169
  - test/test_user.rb
155
170
  - zimbra_intercepting_proxy.gemspec
156
- homepage: ''
171
+ homepage: https://github.com/pbruna/zimbra_intercepting_proxy
157
172
  licenses:
158
173
  - MIT
159
174
  metadata: {}
@@ -163,17 +178,17 @@ require_paths:
163
178
  - lib
164
179
  required_ruby_version: !ruby/object:Gem::Requirement
165
180
  requirements:
166
- - - '>='
181
+ - - ">="
167
182
  - !ruby/object:Gem::Version
168
183
  version: '0'
169
184
  required_rubygems_version: !ruby/object:Gem::Requirement
170
185
  requirements:
171
- - - '>='
186
+ - - ">="
172
187
  - !ruby/object:Gem::Version
173
188
  version: '0'
174
189
  requirements: []
175
190
  rubyforge_project:
176
- rubygems_version: 2.0.2
191
+ rubygems_version: 2.2.2
177
192
  signing_key:
178
193
  specification_version: 4
179
194
  summary: A HTTP intercepting Proxy for the Zimbra Proxy
@@ -181,6 +196,7 @@ test_files:
181
196
  - test/fixtures/auth_80.txt
182
197
  - test/fixtures/route_7072.txt
183
198
  - test/fixtures/users.yml
199
+ - test/fixtures/zco_soap.xml
184
200
  - test/test_backend.rb
185
201
  - test/test_helper.rb
186
202
  - test/test_request.rb