google_safe_browsing 0.3.9 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -33,6 +33,7 @@ module GoogleSafeBrowsing
33
33
 
34
34
  #split into host and path components
35
35
  splits = split_host_path(cann)
36
+
36
37
  cann = fix_host( splits[:host] ) + '/' + fix_path( splits[:path] )
37
38
 
38
39
  # add leading protocol
@@ -48,6 +49,8 @@ module GoogleSafeBrowsing
48
49
  # @return (Array) array of cannonicalized url permutation strings
49
50
  def self.urls_for_lookup(lookup_url)
50
51
  lookup_url = url(lookup_url)
52
+ #return empty array if url returns nil; for invalid url
53
+ return [] if lookup_url.blank?
51
54
 
52
55
  lookup_url = remove_protocol(lookup_url)
53
56
 
@@ -71,219 +74,262 @@ module GoogleSafeBrowsing
71
74
  cart_prod(host_strings, path_strings)
72
75
  end
73
76
 
74
- # private
77
+ # private
75
78
 
76
- # Generates the path permutations from the raw path string
77
- #
78
- # @param (String) raw_path path split from the full url string
79
- # @return (Array) array of path permutation strings
80
- def self.generate_path_strings(raw_path)
81
- return [ '/', '' ] if raw_path == ''
79
+ # Generates the path permutations from the raw path string
80
+ #
81
+ # @param (String) raw_path path split from the full url string
82
+ # @return (Array) array of path permutation strings
83
+ def self.generate_path_strings(raw_path)
84
+ return [ '/', '' ] if raw_path == ''
82
85
 
83
- path_split = raw_path.split('?')
84
- path = path_split[0] || ''
85
- params = path_split[1] || ''
86
+ path_split = raw_path.split('?')
87
+ path = path_split[0] || ''
88
+ params = path_split[1] || ''
86
89
 
87
90
 
88
- path_components = path.split('/').first(3)
89
- path_strings = [ '/' ]
90
- path_components.length.times do
91
- path_strings << '/' + path_components.join('/')
92
- path_components.pop
93
- end
91
+ path_components = path.split('/').first(3)
92
+ path_strings = [ '/' ]
93
+ path_components.length.times do
94
+ path_strings << '/' + path_components.join('/')
95
+ path_components.pop
96
+ end
94
97
 
95
- path_strings.map! do |p|
96
- unless p.index('.')
97
- p + '/'
98
- else
99
- p
100
- end
101
- end
102
- path_strings.map!{ |p| p.to_s.gsub!(/\/+/, '/') }
103
- path_strings.compact!
104
- path_strings.uniq!
105
-
106
- unless params.blank?
107
- path_strings | path_strings.map do |p|
108
- if p[-1] == '/'
109
- p
110
- else
111
- "#{p}?#{params}"
112
- end
113
- end
98
+ path_strings.map! do |p|
99
+ unless p.index('.')
100
+ p + '/'
114
101
  else
115
- return path_strings
102
+ p
116
103
  end
117
104
  end
105
+ path_strings.map!{ |p| p.to_s.gsub!(/\/+/, '/') }
106
+ path_strings.compact!
107
+ path_strings.uniq!
118
108
 
119
- # Returns the cartesian product of two arrays by concatination of the string representation of the elements
120
- #
121
- # @param (Array) a_one array of strings
122
- # @param (Array) a_two array of strings
123
- # @return (Array) cartesian product of arrays with elements concatinated
124
- def self.cart_prod(a_one, a_two)
125
- result = []
126
- a_one.each do |i|
127
- a_two.each do |j|
128
- result << "#{i}#{j}"
109
+ unless params.blank?
110
+ path_strings | path_strings.map do |p|
111
+ if p[-1] == '/'
112
+ p
113
+ else
114
+ "#{p}?#{params}"
129
115
  end
130
116
  end
131
- result
117
+ else
118
+ return path_strings
132
119
  end
120
+ end
133
121
 
134
- # Takes the canonicalized url and splits the host and the path apart
135
- #
136
- # @param (String) cann canonicalized url string
137
- # @return (Hash) !{ :host => host_part, :path => path_part }
138
- def self.split_host_path(cann)
139
- ret= { :host => cann, :path => '' }
140
- split_point = cann.index('/')
141
- if split_point
142
- ret[:host] = cann[0..split_point-1]
143
- ret[:path] = cann[split_point+1..-1]
122
+ # Returns the cartesian product of two arrays by concatination of the string representation of the elements
123
+ #
124
+ # @param (Array) a_one array of strings
125
+ # @param (Array) a_two array of strings
126
+ # @return (Array) cartesian product of arrays with elements concatinated
127
+ def self.cart_prod(a_one, a_two)
128
+ result = []
129
+ a_one.each do |i|
130
+ a_two.each do |j|
131
+ result << "#{i}#{j}"
144
132
  end
145
-
146
- ret
147
133
  end
134
+ result
135
+ end
148
136
 
149
- # Strips the fragment portion of the url string (the last '#' and everything after)
150
- #
151
- # @param (String) string url
152
- # @return (String) parameter with the fragment removed
153
- def self.remove_fragment(string)
154
- string = string[0..string.index('#')-1] if string.index('#')
155
- string
137
+ # Takes the canonicalized url and splits the host and the path apart
138
+ #
139
+ # @param (String) cann canonicalized url string
140
+ # @return (Hash) !{ :host => host_part, :path => path_part }
141
+ def self.split_host_path(cann)
142
+ ret= { :host => cann, :path => '' }
143
+ split_point = cann.index('/')
144
+ if split_point
145
+ ret[:host] = cann[0..split_point-1]
146
+ ret[:path] = cann[split_point+1..-1]
156
147
  end
157
148
 
158
- # Continues to unescape the url until unescaping has no effect
159
- #
160
- # @param (String) url url string
161
- # @return (String) fully unescaped url string
162
- def self.recursively_unescape(url)
163
- compare_url = url.clone
149
+ ret
150
+ end
151
+
152
+ # Strips the fragment portion of the url string (the last '#' and everything after)
153
+ #
154
+ # @param (String) string url
155
+ # @return (String) parameter with the fragment removed
156
+ def self.remove_fragment(string)
157
+ string = string[0..string.index('#')-1] if string.index('#')
158
+ string
159
+ end
160
+
161
+ # Continues to unescape the url until unescaping has no effect
162
+ #
163
+ # @param (String) url url string
164
+ # @return (String) fully unescaped url string
165
+ def self.recursively_unescape(url)
166
+ compare_url = url.clone
167
+ url = URI.unescape(url)
168
+ while(compare_url != url)
169
+ compare_url = url.clone
164
170
  url = URI.unescape(url)
165
- while(compare_url != url)
166
- compare_url = url.clone
167
- url = URI.unescape(url)
168
- end
169
- url
170
171
  end
172
+ url
173
+ end
171
174
 
172
- # Apply initial fixes to host string
173
- #
174
- # @param (String) host host string
175
- # @return (String) standardized host string
176
- def self.fix_host(host)
177
- #puts "In Host: #{host}"
178
- # remove leading and trailing dots, multiple dots to one
179
- host.gsub!(/\A\.+|\.+\Z/, '')
180
- host.gsub!(/\.+/, '.')
181
-
182
- host.downcase!
183
-
184
- if host =~ /^\d+$/
185
- host = IP::V4.new(host.to_i).to_addr
186
- elsif host =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/
187
- host = IP.new(host).to_addr
175
+ # Apply initial fixes to host string
176
+ #
177
+ # @param (String) host host string
178
+ # @return (String) standardized host string
179
+ def self.fix_host(host)
180
+ #puts "In Host: #{host}"
181
+ # remove leading and trailing dots, multiple dots to one
182
+ host.gsub!(/\A\.+|\.+\Z/, '')
183
+ host.gsub!(/\.+/, '.')
184
+
185
+ host.downcase!
186
+
187
+ host_splits = self.split_username_password_and_port(host)
188
+
189
+ if host_splits[:host] =~ /^\d+$/
190
+ host_splits[:host] = IP::V4.new(host.to_i).to_addr
191
+ elsif host_splits[:host] =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/
192
+ begin
193
+ host_splits[:host] = IP.new(host).to_addr
194
+ rescue ArgumentError
188
195
  end
189
-
190
- host
191
196
  end
192
197
 
193
- # Apply initial fixes to path string
194
- #
195
- # @param (String) path path string
196
- # @return (String) standardized path string
197
- def self.fix_path(path)
198
- #puts "In Path: #{path}"
199
-
200
- #remove leading slash
201
- path = path[1..-1] if path[0..0] == '/'
198
+ result = host_splits[:host]
199
+ result = "#{host_splits[:creds]}@#{result}" unless host_splits[:creds].blank?
200
+ result = "#{result}:#{host_splits[:port]}" unless host_splits[:port].blank?
201
+ result
202
+ end
202
203
 
203
- preserve_trailing_slash = ( path[-1..-1] == '/' )
204
+ # Apply initial fixes to path string
205
+ #
206
+ # @param (String) path path string
207
+ # @return (String) standardized path string
208
+ def self.fix_path(path)
209
+ #puts "In Path: #{path}"
204
210
 
205
- if path.index('?')
206
- first_ques = path.index('?')
207
- params = path[first_ques..-1]
208
- path = path[0..first_ques-1]
209
- end
211
+ #remove leading slash
212
+ path = path[1..-1] if path[0..0] == '/'
210
213
 
211
- # remove multiple '/'
212
- path.gsub!(/\/+/, '/')
214
+ preserve_trailing_slash = ( path[-1..-1] == '/' )
213
215
 
214
- new_path_array = []
215
- path.split('/').each do |p|
216
- new_path_array << p unless p == '.' || p == '..'
217
- new_path_array.pop if p == '..'
218
- end
216
+ if path.index('?')
217
+ first_ques = path.index('?')
218
+ params = path[first_ques..-1]
219
+ path = path[0..first_ques-1]
220
+ end
219
221
 
220
- path = new_path_array.join('/')
221
- path += '/' if preserve_trailing_slash
222
- path += params if params
222
+ # remove multiple '/'
223
+ path.gsub!(/\/+/, '/')
223
224
 
224
- path
225
+ new_path_array = []
226
+ path.split('/').each do |p|
227
+ new_path_array << p unless p == '.' || p == '..'
228
+ new_path_array.pop if p == '..'
225
229
  end
226
230
 
227
- # Escape the url, but do not escape certain characters; such as the carat
228
- #
229
- # @param (String) url url string
230
- # @return (String) escaped url string
231
- def self.strict_escape(url)
232
- url = URI.escape url
231
+ path = new_path_array.join('/')
232
+ path += '/' if preserve_trailing_slash
233
+ path += params if params
233
234
 
234
- # unescape carat, may need other optionally escapeable chars
235
- url.gsub!('%5E','^')
235
+ path
236
+ end
236
237
 
237
- url
238
- end
238
+ # Escape the url, but do not escape certain characters; such as the carat
239
+ #
240
+ # @param (String) url url string
241
+ # @return (String) escaped url string
242
+ def self.strict_escape(url)
243
+ url = URI.escape url
239
244
 
240
- # Strip the leading protocol from the url string
241
- #
242
- # @param (String) cann url string
243
- # @return (String) url string without the protocol
244
- def self.remove_protocol(cann)
245
- if cann.index(PROTOCOL_DELIMITER)
246
- delimiting_index = cann.index(PROTOCOL_DELIMITER)
247
- @protocol = cann[0..delimiting_index-1]
248
- protocol_end_index = delimiting_index + PROTOCOL_DELIMITER.length
249
- cann = cann[protocol_end_index..-1]
250
- end
251
- cann
252
- end
245
+ # unescape carat, may need other optionally escapeable chars
246
+ url.gsub!('%5E','^')
247
+
248
+ url
249
+ end
253
250
 
254
- # Strip the user name, password and port number from the url
255
- #
256
- # @param (String) host_string host portion of the url
257
- # @return (String) host portion of the url without the username, password and port
258
- def self.strip_username_password_and_port_from_host(host_string)
259
- host_string = remove_port(host_string)
260
- remove_username_and_password(host_string)
251
+ # Strip the leading protocol from the url string
252
+ #
253
+ # @param (String) cann url string
254
+ # @return (String) url string without the protocol
255
+ def self.remove_protocol(cann)
256
+ if cann.index(PROTOCOL_DELIMITER)
257
+ delimiting_index = cann.index(PROTOCOL_DELIMITER)
258
+ @protocol = cann[0..delimiting_index-1]
259
+ protocol_end_index = delimiting_index + PROTOCOL_DELIMITER.length
260
+ cann = cann[protocol_end_index..-1]
261
261
  end
262
+ cann
263
+ end
262
264
 
263
- # Strip port number from host string
264
- #
265
- # @param (see strip_username_password_and_port_from_host)
266
- # @return (String) host part without the port number
267
- def self.remove_port(host_string)
268
- port_sep = host_string.rindex(':')
269
- if port_sep
270
- host_string[0..port_sep-1]
271
- else
272
- host_string
273
- end
265
+ # Strip the user name, password and port number from the url
266
+ #
267
+ # @param (String) host_string host portion of the url
268
+ # @return (String) host portion of the url without the username, password and port
269
+ def self.strip_username_password_and_port_from_host(host_string)
270
+ host_string = remove_port(host_string)
271
+ remove_username_and_password(host_string)
272
+ end
273
+
274
+ # Strip port number from host string
275
+ #
276
+ # @param (see strip_username_password_and_port_from_host)
277
+ # @return (String) host part without the port number
278
+ def self.remove_port(host_string)
279
+ self.split_port(host_string)[:host]
280
+ end
281
+
282
+ # Strip user name and password from host part of url
283
+ #
284
+ # @param (see remove_port)
285
+ # @return (String) host part of url without user name or password
286
+ def self.remove_username_and_password(host_string)
287
+ self.split_username_and_password(host_string)[:host]
288
+ end
289
+
290
+ # Split user name, passowrd from the host
291
+ #
292
+ # @param (see remove_port)_
293
+ # @return (Hash) :host has the host string, :creds holds the username and password string
294
+ def self.split_username_and_password(host_string)
295
+ un_sep = host_string.index('@')
296
+ result = {}
297
+ if un_sep
298
+ splits = host_string.split('@')
299
+ result[:host] = splits[1]
300
+ result[:creds] = splits[0]
301
+ else
302
+ result[:host] = host_string
303
+ result[:creds] = nil
274
304
  end
305
+ result
306
+ end
275
307
 
276
- # Strip user name and password from host part of url
277
- #
278
- # @param (see remove_port)
279
- # @return (String) host part of url without user name or password
280
- def self.remove_username_and_password(host_string)
281
- un_sep = host_string.index('@')
282
- if un_sep
283
- host_string[un_sep+1..-1]
284
- else
285
- host_string
286
- end
308
+ # Split post number and host string into a hash
309
+ #
310
+ # @param (See remove_port)
311
+ # @return (Hash) :host has the host string, :port holds the port number
312
+ def self.split_port(host_string)
313
+ port_sep = host_string.rindex(':')
314
+ result = {}
315
+ if port_sep
316
+ splits = host_string.split(':')
317
+ result[:host] = splits[0]
318
+ result[:port] = splits[1]
319
+ else
320
+ result[:host] = host_string
321
+ result[:port] = nil
287
322
  end
323
+ result
324
+ end
325
+
326
+ # Split the user name, password and port from the host string
327
+ #
328
+ # @param (see remove_port)
329
+ # @return (Hash) :host as the host string; :creds has the username and password; :port holds the port number
330
+ def self.split_username_password_and_port(host_string)
331
+ result = self.split_username_and_password(host_string)
332
+ result.merge(self.split_port(result[:host]))
333
+ end
288
334
  end
289
335
  end
@@ -1,3 +1,3 @@
1
1
  module GoogleSafeBrowsing
2
- VERSION = "0.3.9"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google_safe_browsing
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.9
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-06 00:00:00.000000000 Z
12
+ date: 2012-07-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -151,7 +151,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
151
151
  version: '0'
152
152
  segments:
153
153
  - 0
154
- hash: -2592586138011771612
154
+ hash: -4373468862577111822
155
155
  required_rubygems_version: !ruby/object:Gem::Requirement
156
156
  none: false
157
157
  requirements:
@@ -160,10 +160,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
160
160
  version: '0'
161
161
  segments:
162
162
  - 0
163
- hash: -2592586138011771612
163
+ hash: -4373468862577111822
164
164
  requirements: []
165
165
  rubyforge_project:
166
- rubygems_version: 1.8.23
166
+ rubygems_version: 1.8.24
167
167
  signing_key:
168
168
  specification_version: 3
169
169
  summary: Rails 3 plugin for Google's Safe Browsing API v2