ipaccess 1.2.2 → 1.2.3

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: b6d8d6f3a6fb60cff951294e480196549e9da563
4
- data.tar.gz: 38c2a1f94f3dc943e06f0d9ceb796e4742aefccf
3
+ metadata.gz: 5c067da1cc87d038d6403e92656123c4423ccf83
4
+ data.tar.gz: de98f452bb6a6e9b316a7f6bed1844419ea171ce
5
5
  SHA512:
6
- metadata.gz: 3f21cba65126bc0b99359b626cf271687f371bb63694af255c29af018be75c39f51078c1347e416c6be9aa80069e6a8e1ab4291e688427b766430d4214867de8
7
- data.tar.gz: a01d3fcdc90cc583e4af458da0ceb85f3a9241cb411ef7f9eddc3a4fe45123c2755627c0456e2731a5284dfcb3e5a162bc0b3b8db894ffcd988beeef4b24883e
6
+ metadata.gz: 6b2c28324a897856ebbc67bb807d716f65e6d8e0a49ff3715b05635948c75699d29e0b797a60c4e40eed8912f23820a73c1a858720107cd5483cb2b932e5a080
7
+ data.tar.gz: 5d78bfe1b8491064c952bfb04f9fc566c62549c5370ab7c6d91a06a25913b71a7dec474b07640ae8d45cf232df5a8b765844b1cacd730b8e8eebb49a9ff3daf6
Binary file
data.tar.gz.sig CHANGED
Binary file
data/ChangeLog CHANGED
@@ -1,3 +1,63 @@
1
+ commit 32b176f52c9a7aa3caf2375215c4ffa6030d5c45
2
+ Author: Paweł Wilk <siefca@gnu.org>
3
+ Date: Thu Dec 26 03:35:07 2013 +0100
4
+
5
+ Gemspec regenerated
6
+
7
+ commit bfe69f65bb505335b02cc6362096e10c263d3a8b
8
+ Author: Paweł Wilk <siefca@gnu.org>
9
+ Date: Thu Dec 26 03:34:34 2013 +0100
10
+
11
+ Image links in documentation changed to remote GitHub assets
12
+
13
+ commit 8f6b9754d2a95558cc2a32f4c2dd0b4d82be7a8a
14
+ Author: Paweł Wilk <siefca@gnu.org>
15
+ Date: Thu Dec 26 03:28:53 2013 +0100
16
+
17
+ Version bump
18
+
19
+ commit f349435979ef92105fd559ca4f40078bb1919c67
20
+ Author: Paweł Wilk <siefca@gnu.org>
21
+ Date: Thu Dec 26 03:28:40 2013 +0100
22
+
23
+ Open-uri example updated
24
+
25
+ commit 46e0836b6dc9a7dc12095ada8be7856352b88cba
26
+ Author: Paweł Wilk <siefca@gnu.org>
27
+ Date: Thu Dec 26 03:28:29 2013 +0100
28
+
29
+ Net::HTTP#connect wrapped in IPAccess::Patches::Net::HTTP
30
+
31
+ commit 27b0545884c616d141220c5817837fb3359911f5
32
+ Author: Paweł Wilk <siefca@gnu.org>
33
+ Date: Thu Dec 26 03:02:20 2013 +0100
34
+
35
+ Open-uri example simplified
36
+
37
+ commit abcfd75caed6c0768b9ed01803633577855f9400
38
+ Author: Paweł Wilk <siefca@gnu.org>
39
+ Date: Thu Dec 26 02:58:34 2013 +0100
40
+
41
+ Required Ruby version is now 1.9.2
42
+
43
+ commit cb4774148d7e1e16f9162589c39525bc13113708
44
+ Author: Paweł Wilk <siefca@gnu.org>
45
+ Date: Tue Dec 24 15:00:44 2013 +0100
46
+
47
+ Readme updated
48
+
49
+ commit d026e34e862153c93e69562e72ef6bd2ab6434b9
50
+ Author: Paweł Wilk <siefca@gnu.org>
51
+ Date: Tue Dec 24 14:50:20 2013 +0100
52
+
53
+ Added Badge to Readme
54
+
55
+ commit 7f969e0bd5c6170d356f74427377c0f0254d389f
56
+ Author: Paweł Wilk <siefca@gnu.org>
57
+ Date: Tue Dec 24 14:46:28 2013 +0100
58
+
59
+ Readme updated
60
+
1
61
  commit 1583d574540f53806e2e77ae0e6d336307b3fc60
2
62
  Author: Paweł Wilk <siefca@gnu.org>
3
63
  Date: Tue Dec 24 14:43:08 2013 +0100
data/README.md CHANGED
@@ -1,9 +1,12 @@
1
1
  # IP Access Control for Ruby
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/ipaccess.png)](http://badge.fury.io/rb/ipaccess)
4
+
3
5
  **ipaccess version `1.2`** (`Mortal Compat`)
4
6
 
5
7
  * https://rubygems.org/gems/ipaccess
6
8
  * https://github.com/siefca/ipaccess
9
+ * http://rubydoc.info/gems/ipaccess/
7
10
  * pw@gnu.org
8
11
 
9
12
  ## Description
@@ -17,8 +20,8 @@ shipped with this library.
17
20
  ## Features
18
21
 
19
22
  * Maintaining IP access lists based on rules; see [IPAccess::List](http://rubydoc.info/gems/ipaccess/IPAccess/List).
20
- * Grouping input/output access lists into sets; [IPAccess::Set](http://rubydoc.info/gems/ipaccess/IPAccess/Set).
21
- * Automating access checks and raising exceptions; [IPAccess::Set](http://rubydoc.info/gems/ipaccess/IPAccess/Set#check_in).
23
+ * Grouping input/output access lists into sets; see [IPAccess::Set](http://rubydoc.info/gems/ipaccess/IPAccess/Set).
24
+ * Automating access checks and raising exceptions; see [IPAccess::Set](http://rubydoc.info/gems/ipaccess/IPAccess/Set#check_in).
22
25
  * Many formats of IP addresses accepted; see [IPAccess.to_cidrs](http://rubydoc.info/gems/ipaccess/IPAccess#to_cidrs-class_method).
23
26
  * Variants of socket handling classes with IP access control; see [IPAccess::Socket](http://rubydoc.info/gems/ipaccess/IPAccess/Socket) and [IPAccess::Net](http://rubydoc.info/gems/ipaccess/IPAccess/Net).
24
27
  * Methods for patching native socket handling classes; see [IPAccess.arm](http://rubydoc.info/gems/ipaccess/IPAccess#arm-class_method).
@@ -40,20 +43,40 @@ classes that use IPAccess::Set instances to control access of the real TCP/IP tr
40
43
 
41
44
  ## Synopsis
42
45
 
43
- # load patched sockets
44
- require 'ipaccess/socket'
46
+ Total control:
47
+
48
+ ```ruby
49
+ require 'ipaccess/net/http'
50
+ require 'open-uri'
51
+
52
+ # Add host's IP by to black list of global output access set
53
+ IPAccess::Set::Global.output.blacklist 'example.org'
54
+
55
+ # Arm all future sockets used by Net::HTTP
56
+ IPAccess.arm Net::HTTP
57
+
58
+ # Open URI
59
+ open 'http://example.org/'
60
+ ```
61
+
62
+ Access management for specific socket objects:
63
+
64
+ ```ruby
65
+ # load patched sockets
66
+ require 'ipaccess/socket'
67
+
68
+ # assume IP given by untrusted user
69
+ ip_from_user = '192.168.5.5'
70
+
71
+ # create new access set
72
+ acl = IPAccess::Set.new
45
73
 
46
- # assume IP given by untrusted user
47
- ip_from_user = '192.168.5.5'
74
+ # blacklist private and local subnets
75
+ acl.output.block :private, :local
48
76
 
49
- # create new access set
50
- acl = IPAccess::Set.new
51
-
52
- # blacklist private and local subnets
53
- acl.output.block :private, :local
54
-
55
- # create TCP socket with IP access control
56
- socket = IPAccess::TCPSocket(ip_from_user, 80, acl)
77
+ # create TCP socket with IP access control
78
+ socket = IPAccess::TCPSocket(ip_from_user, 80, acl)
79
+ ```
57
80
 
58
81
  ## Requirements
59
82
 
@@ -78,7 +101,7 @@ classes that use IPAccess::Set instances to control access of the real TCP/IP tr
78
101
 
79
102
  ## More information
80
103
 
81
- See IPAccess module's documentation for more information.
104
+ See IPAccess module's [documentation](http://rubydoc.info/gems/ipaccess/) for more information.
82
105
 
83
106
  ## License
84
107
 
data/Rakefile CHANGED
@@ -30,7 +30,7 @@ Hoe.plugin :gemspec
30
30
 
31
31
  Hoe.spec 'ipaccess' do
32
32
  developer "Paweł Wilk", "pw@gnu.org"
33
- self.version = "1.2.2"
33
+ self.version = "1.2.3"
34
34
  self.rubyforge_name = 'ipaccess'
35
35
  self.summary = 'IP Access Control for Ruby'
36
36
  self.description = 'This library allows you to control IP access for sockets and other objects'
@@ -41,6 +41,8 @@ Hoe.spec 'ipaccess' do
41
41
  self.readme_file = 'README.md'
42
42
  self.history_file = 'docs/HISTORY'
43
43
 
44
+ require_ruby_version '>= 1.9.2'
45
+
44
46
  extra_deps << ["netaddr",">= 1.5.0"]
45
47
  extra_dev_deps << ['rspec', '>= 2.6.0'] <<
46
48
  ['yard', '>= 0.8.2'] <<
@@ -1,14 +1,23 @@
1
1
  $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
2
 
3
+ require 'net/http'
3
4
  require 'ipaccess/net/http'
4
5
  require 'open-uri'
5
- require 'uri'
6
6
 
7
7
  # Add host's IP by to black list of global output access set
8
- IPAccess::Set::Global.output.blacklist 'example.org'
8
+ IPAccess::Set::Global.output.blacklist :unusual
9
9
 
10
10
  # Arm sockets
11
11
  IPAccess.arm Net::HTTP
12
12
 
13
+ # Set some defaults
14
+ Net::HTTP.ipaccess_defaults = {
15
+ :check_only_real => true,
16
+ :opened_on_deny => true
17
+ }
18
+
19
+ # Show blacklisted IP addresses
20
+ puts IPAccess::Set::Global.output.show
21
+
13
22
  # Open URI
14
- open 'http://example.org/'
23
+ open 'http://localhost/'
@@ -1,21 +1,22 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: ipaccess 1.2.0.20131223130056 ruby lib
2
+ # stub: ipaccess 1.2.3.20131226033445 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "ipaccess"
6
- s.version = "1.2.0.20131223130056"
6
+ s.version = "1.2.3.20131226033445"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
9
9
  s.authors = ["Pawe\u{142} Wilk"]
10
10
  s.cert_chain = ["/Users/siefca/.gem/gem-public_cert.pem"]
11
- s.date = "2013-12-23"
11
+ s.date = "2013-12-26"
12
12
  s.description = "This library allows you to control IP access for sockets and other objects"
13
13
  s.email = ["pw@gnu.org"]
14
- s.extra_rdoc_files = ["Manifest.txt"]
15
- s.files = [".rspec", ".yardopts", "ChangeLog", "LGPL-LICENSE", "Manifest.txt", "README.md", "Rakefile", "docs/COPYING", "docs/FAQ", "docs/HISTORY", "docs/LEGAL", "docs/LGPL", "docs/TODO", "docs/images/ipaccess.png", "docs/images/ipaccess_ac_for_args.png", "docs/images/ipaccess_ac_for_socket.png", "docs/images/ipaccess_logo.png", "docs/images/ipaccess_relations.png", "docs/images/ipaccess_setup_origin.png", "docs/images/ipaccess_setup_origin_tab.png", "docs/images/ipaccess_view.png", "docs/rdoc.css", "examples/ftp.rb", "examples/http.rb", "examples/imap.rb", "examples/pop.rb", "examples/smtp.rb", "examples/tcp_server.rb", "examples/tcp_socket.rb", "examples/telnet.rb", "examples/text_message.rb", "lib/ipaccess.rb", "lib/ipaccess/arm_sockets.rb", "lib/ipaccess/ghost_doc/ghost_doc.rb", "lib/ipaccess/ghost_doc/ghost_doc_acl.rdoc", "lib/ipaccess/ghost_doc/ghost_doc_net_ftp.rb", "lib/ipaccess/ghost_doc/ghost_doc_net_http.rb", "lib/ipaccess/ghost_doc/ghost_doc_net_smtp.rb", "lib/ipaccess/ghost_doc/ghost_doc_net_telnet.rb", "lib/ipaccess/ghost_doc/ghost_doc_p_blacklist.rb", "lib/ipaccess/ghost_doc/ghost_doc_p_blacklist_e.rb", "lib/ipaccess/ghost_doc/ghost_doc_p_unblacklist.rb", "lib/ipaccess/ghost_doc/ghost_doc_p_unblacklist_e.rb", "lib/ipaccess/ghost_doc/ghost_doc_p_unwhitelist.rb", "lib/ipaccess/ghost_doc/ghost_doc_p_unwhitelist_e.rb", "lib/ipaccess/ghost_doc/ghost_doc_p_whitelist.rb", "lib/ipaccess/ghost_doc/ghost_doc_p_whitelist_e.rb", "lib/ipaccess/ghost_doc/ghost_doc_patched_usage.rb", "lib/ipaccess/ghost_doc/ghost_doc_sockets.rb", "lib/ipaccess/ip_access_check.rb", "lib/ipaccess/ip_access_errors.rb", "lib/ipaccess/ip_access_list.rb", "lib/ipaccess/ip_access_set.rb", "lib/ipaccess/net/ftp.rb", "lib/ipaccess/net/http.rb", "lib/ipaccess/net/https.rb", "lib/ipaccess/net/imap.rb", "lib/ipaccess/net/pop.rb", "lib/ipaccess/net/smtp.rb", "lib/ipaccess/net/telnet.rb", "lib/ipaccess/patches/generic.rb", "lib/ipaccess/patches/net_ftp.rb", "lib/ipaccess/patches/net_http.rb", "lib/ipaccess/patches/net_https.rb", "lib/ipaccess/patches/net_imap.rb", "lib/ipaccess/patches/net_pop.rb", "lib/ipaccess/patches/net_smtp.rb", "lib/ipaccess/patches/net_telnet.rb", "lib/ipaccess/patches/netaddr.rb", "lib/ipaccess/patches/sockets.rb", "lib/ipaccess/socket.rb", "lib/ipaccess/sockets.rb", "spec/ip_access_list_spec.rb", "spec/rcov.opts", "spec/spec.opts", ".gemtest"]
14
+ s.extra_rdoc_files = ["Manifest.txt", "lib/ipaccess/ghost_doc/ghost_doc_acl.rdoc", "lib/ipaccess/ghost_doc/ghost_doc_patched_usage.rdoc"]
15
+ s.files = [".rspec", ".yardopts", "ChangeLog", "LGPL-LICENSE", "Manifest.txt", "README.md", "Rakefile", "docs/COPYING", "docs/FAQ", "docs/HISTORY", "docs/LEGAL", "docs/LGPL", "docs/TODO", "docs/images/ipaccess.png", "docs/images/ipaccess_ac_for_args.png", "docs/images/ipaccess_ac_for_socket.png", "docs/images/ipaccess_logo.png", "docs/images/ipaccess_relations.png", "docs/images/ipaccess_setup_origin.png", "docs/images/ipaccess_setup_origin_tab.png", "docs/images/ipaccess_view.png", "docs/rdoc.css", "docs/yard-tpl/default/fulldoc/html/css/common.css", "examples/ftp.rb", "examples/http.rb", "examples/imap.rb", "examples/open-uri.rb", "examples/pop.rb", "examples/smtp.rb", "examples/tcp_server.rb", "examples/tcp_socket.rb", "examples/telnet.rb", "examples/text_message.rb", "ipaccess.gemspec", "lib/ipaccess.rb", "lib/ipaccess/arm_sockets.rb", "lib/ipaccess/core.rb", "lib/ipaccess/ghost_doc/ghost_doc.rb", "lib/ipaccess/ghost_doc/ghost_doc_acl.rdoc", "lib/ipaccess/ghost_doc/ghost_doc_net_ftp.rb", "lib/ipaccess/ghost_doc/ghost_doc_net_http.rb", "lib/ipaccess/ghost_doc/ghost_doc_net_smtp.rb", "lib/ipaccess/ghost_doc/ghost_doc_net_telnet.rb", "lib/ipaccess/ghost_doc/ghost_doc_patched_usage.rdoc", "lib/ipaccess/ghost_doc/ghost_doc_sockets.rb", "lib/ipaccess/ip_access_check.rb", "lib/ipaccess/ip_access_errors.rb", "lib/ipaccess/ip_access_list.rb", "lib/ipaccess/ip_access_set.rb", "lib/ipaccess/net/ftp.rb", "lib/ipaccess/net/http.rb", "lib/ipaccess/net/https.rb", "lib/ipaccess/net/imap.rb", "lib/ipaccess/net/pop.rb", "lib/ipaccess/net/smtp.rb", "lib/ipaccess/net/telnet.rb", "lib/ipaccess/patches/generic.rb", "lib/ipaccess/patches/net_ftp.rb", "lib/ipaccess/patches/net_http.rb", "lib/ipaccess/patches/net_https.rb", "lib/ipaccess/patches/net_imap.rb", "lib/ipaccess/patches/net_pop.rb", "lib/ipaccess/patches/net_smtp.rb", "lib/ipaccess/patches/net_telnet.rb", "lib/ipaccess/patches/netaddr.rb", "lib/ipaccess/patches/sockets.rb", "lib/ipaccess/socket.rb", "lib/ipaccess/sockets.rb", "spec/ip_access_list_spec.rb", "spec/rcov.opts", "spec/spec.opts", ".gemtest"]
16
16
  s.homepage = "https://rubygems.org/gems/ipaccess"
17
17
  s.rdoc_options = ["--title", "Ipaccess Documentation", "--quiet"]
18
18
  s.require_paths = ["lib"]
19
+ s.required_ruby_version = Gem::Requirement.new(">= 1.9.2")
19
20
  s.rubyforge_project = "ipaccess"
20
21
  s.rubygems_version = "2.1.11"
21
22
  s.signing_key = "/Users/siefca/.gem/gem-private_key.pem"
@@ -99,7 +99,7 @@ require 'ipaccess/ip_access_set'
99
99
  # To properly understand what are the most important structures mentioned above it's worth
100
100
  # to look at the diagram:
101
101
  #
102
- # link:images/ipaccess_view.png
102
+ # link:https://raw.github.com/siefca/IPAccess/master/docs/images/ipaccess_view.png
103
103
  #
104
104
  # == Usage
105
105
  #
@@ -175,7 +175,7 @@ require 'ipaccess/ip_access_set'
175
175
  # between the IPAccess::TCPSocket class
176
176
  # and other classes from this module:
177
177
  #
178
- # link:images/ipaccess_relations.png
178
+ # link:https://raw.github.com/siefca/IPAccess/master/docs/images/ipaccess_relations.png
179
179
 
180
180
  module IPAccess
181
181
 
@@ -228,19 +228,26 @@ class IPAccess::Net::HTTP
228
228
  def acl_recheck
229
229
  # Real code hidden.
230
230
  end
231
-
232
- # :call-seq:
233
- # new(address)<br />
234
- # new(address, acl) <br />
235
- # new(address, port, acl)
236
- #
231
+
237
232
  # Creates a new object for the specified address.
238
233
  # This method does not open the TCP connection.
239
234
  # It optionally sets an access set given as the
240
235
  # last parameter. If parameter is not given it
241
236
  # sets ACL to IPAccess::Set.Global.
242
-
243
- def initialize
237
+ #
238
+ # Flags are symbols that control behavior of IPAccess:
239
+ #
240
+ # * +:opened_on_deny+ causes blocking method to leave a socket open when access is denied and a socket was re-checked
241
+ # * +:check_only_proxy+ causes access checks to be applied only to a proxy server address if a proxy is in use
242
+ # * +:check_only_real+ causes access check to be applied only to a destination address (and not to proxy server) if a proxy is in use
243
+ #
244
+ # @overload new(address)
245
+ # @overload new(address, acl)
246
+ # @overload new(address, port, acl)
247
+ # @overload new(address, acl, *flags)
248
+ # @overload new(address, port, acl, *flags)
249
+
250
+ def initialize(address)
244
251
  # Real code hidden.
245
252
  end
246
253
 
@@ -247,13 +247,13 @@ module IPAccess
247
247
  # how it works you may
248
248
  # look at the workflow diagram:
249
249
  #
250
- # link:images/ipaccess_setup_origin.png
250
+ # link:https://raw.github.com/siefca/IPAccess/master/docs/images/ipaccess_setup_origin.png
251
251
  #
252
252
  # To predict the logic in an easy way
253
253
  # you may also find the input/output states
254
254
  # table useful:
255
255
  #
256
- # link:images/ipaccess_setup_origin_tab.png
256
+ # link:https://raw.github.com/siefca/IPAccess/master/docs/images/ipaccess_setup_origin_tab.png
257
257
  #
258
258
  # After calling this method you may find
259
259
  # a reference to two original objects.
@@ -382,7 +382,7 @@ module IPAccess
382
382
  # In order to understand this method's logic
383
383
  # properly you may look at the diagram:
384
384
  #
385
- # link:images/ipaccess_ac_for_args.png
385
+ # link:https://raw.github.com/siefca/IPAccess/master/docs/images/ipaccess_ac_for_args.png
386
386
 
387
387
  def check(*addresses) # :yields: address, rule, list, addresses, originator
388
388
  return addresses if self.empty?
@@ -411,7 +411,7 @@ module IPAccess
411
411
  # In order to understand this method's logic
412
412
  # properly you may look at the diagram:
413
413
  #
414
- # link:images/ipaccess_ac_for_socket.png
414
+ # link:https://raw.github.com/siefca/IPAccess/master/docs/images/ipaccess_ac_for_socket.png
415
415
 
416
416
  def check_socket(socket, originator=nil) # :yields: address, rule, list, socket, originator
417
417
  if (self.empty? || !socket.respond_to?(:getpeername))
@@ -33,15 +33,17 @@ require 'ipaccess/patches/sockets'
33
33
  # :stopdoc:
34
34
 
35
35
  module IPAccess::Patches::Net
36
-
36
+
37
37
  ###################################################################
38
38
  # Net::HTTP class with IP access control.
39
39
  # It uses output access lists.
40
-
40
+
41
41
  module HTTP
42
42
 
43
43
  include IPAccess::Patches::ACL
44
44
 
45
+ IPAC_KNOWN_FLAGS = [:opened_on_deny, :check_only_proxy, :check_only_real].freeze
46
+
45
47
  def self.included(base)
46
48
 
47
49
  marker = (base.name =~ /IPAccess/) ? base.superclass : base
@@ -49,7 +51,7 @@ module IPAccess::Patches::Net
49
51
  base.instance_variable_set(:@uses_ipaccess, true)
50
52
 
51
53
  base.class_eval do
52
-
54
+
53
55
  # CLASS METHODS
54
56
  unless (base.name.nil? && base.class.name == "Class")
55
57
  (class << self; self; end).class_eval do
@@ -58,24 +60,28 @@ module IPAccess::Patches::Net
58
60
 
59
61
  # overload HTTP.new() since it's not usual.
60
62
  define_method :new do |address, *args|
61
- late_opened_on_deny = !!args.reject! { |x| x.is_a?(Symbol) && x == :opened_on_deny }
63
+ passed_flags = {}
64
+ args.reject! { |x| x.is_a?(Symbol) && IPAC_KNOWN_FLAGS.include?(x) && passed_flags[x] = true }
62
65
  args.pop if args.last.nil?
63
66
  late_acl = IPAccess.valid_acl?(args.last) ? args.pop : :global
64
67
  obj = __ipac__orig_new(address, *args)
65
68
  obj.acl = late_acl unless obj.acl == late_acl
66
- obj.opened_on_deny = late_opened_on_deny
69
+ obj.opened_on_deny = passed_flags.fetch(:opened_on_deny, ipaccess_defaults.fetch(:opened_on_deny, false) )
70
+ obj.check_only_proxy = passed_flags.fetch(:check_only_proxy, ipaccess_defaults.fetch(:check_only_proxy, false) )
71
+ obj.check_only_real = passed_flags.fetch(:check_only_real, ipaccess_defaults.fetch(:check_only_real, false) )
67
72
  return obj
68
73
  end
69
-
74
+
70
75
  # overwrite HTTP.start()
71
76
  define_method :__ipacall__start do |block, address, *args|
72
- late_on_deny = ( !!args.reject! { |x| x.is_a?(Symbol) && x == :opened_on_deny } ? :opened_on_deny : nil )
77
+ passed_flags = []
78
+ args.reject! { |x| x.is_a?(Symbol) && IPAC_KNOWN_FLAGS.include?(x) && passed_flags << x }
73
79
  args.pop if args.last.nil?
74
80
  acl = IPAccess.valid_acl?(args.last) ? args.pop : :global
75
81
  port, p_addr, p_port, p_user, p_pass = *args
76
- new(address, port, p_addr, p_port, p_user, p_pass, acl, late_on_deny).start(&block)
82
+ new(address, port, p_addr, p_port, p_user, p_pass, acl, *passed_flags).start(&block)
77
83
  end
78
-
84
+
79
85
  # block passing wrapper for Ruby 1.8
80
86
  def start(*args, &block)
81
87
  __ipacall__start(block, *args)
@@ -83,56 +89,81 @@ module IPAccess::Patches::Net
83
89
 
84
90
  # overwrite HTTP.get_response()
85
91
  define_method :__ipacall__get_response do |block, uri_or_host, *args|
86
- late_on_deny = ( !!args.reject! { |x| x.is_a?(Symbol) && x == :opened_on_deny } ? :opened_on_deny : nil )
92
+ passed_flags = []
93
+ args.reject! { |x| x.is_a?(Symbol) && IPAC_KNOWN_FLAGS.include?(x) && passed_flags << x }
87
94
  args.pop if args.last.nil?
88
95
  late_acl = IPAccess.valid_acl?(args.last) ? args.pop : :global
89
96
  path, port = *args
90
97
  if path
91
98
  host = uri_or_host
92
- new(host, (port || Net::HTTP.default_port), late_acl, late_on_deny).start { |http|
99
+ new(host, (port || Net::HTTP.default_port), late_acl, *passed_flags).start { |http|
93
100
  return http.request_get(path, &block)
94
101
  }
95
102
  else
96
103
  uri = uri_or_host
97
- new(uri.host, uri.port, late_acl, late_on_deny).start { |http|
104
+ new(uri.host, uri.port, late_acl, *passed_flags).start { |http|
98
105
  return http.request_get(uri.request_uri, &block)
99
106
  }
100
107
  end
101
108
  end
102
-
109
+
103
110
  # block passing wrapper for Ruby 1.8
104
111
  def get_response(*args, &block)
105
112
  __ipacall__get_response(block, *args)
106
113
  end
107
-
114
+
115
+ # this allows to initialize defaults
116
+ def ipaccess_defaults
117
+ @ipaccess_defaults ||= {
118
+ :opened_on_deny => false,
119
+ :check_only_proxy => false,
120
+ :check_only_real => false
121
+ }
122
+ end
123
+
124
+ # this allows to set defaults
125
+ def ipaccess_defaults=(vals)
126
+ ipaccess_defaults.merge!(vals)
127
+ end
128
+
108
129
  end
109
-
130
+
110
131
  end # class methods
111
-
132
+
133
+ attr_accessor :check_only_proxy, :check_only_real
134
+
112
135
  orig_initialize = self.instance_method :initialize
113
136
  orig_conn_address = self.instance_method :conn_address
114
137
  orig_on_connect = self.instance_method :on_connect
115
-
138
+ orig_connect = self.instance_method :connect
139
+
116
140
  # initialize on steroids.
117
141
  define_method :__ipacall__initialize do |block, *args|
118
- @opened_on_deny = !!args.reject! { |x| x.is_a?(Symbol) && x == :opened_on_deny }
142
+ @opened_on_deny = !!args.reject! { |x| x.is_a?(Symbol) && x == :opened_on_deny }
143
+ @check_only_proxy = !!args.reject! { |x| x.is_a?(Symbol) && x == :check_only_proxy }
144
+ @check_only_real = !!args.reject! { |x| x.is_a?(Symbol) && x == :check_only_real }
145
+ if self.class.respond_to?(:ipaccess_defaults)
146
+ @opened_on_deny ||= self.class.ipaccess_defaults.fetch(:opened_on_deny, false)
147
+ @check_only_proxy ||= self.class.ipaccess_defaults.fetch(:check_only_proxy, false)
148
+ @check_only_real ||= self.class.ipaccess_defaults.fetch(:check_only_real, false)
149
+ end
119
150
  args.pop if args.last.nil?
120
151
  self.acl = IPAccess.valid_acl?(args.last) ? args.pop : :global
121
152
  orig_initialize.bind(self).call(*args, &block)
122
153
  end
123
-
154
+
124
155
  # block passing wrapper for Ruby 1.8
125
156
  def initialize(*args, &block)
126
157
  __ipacall__initialize(block, *args)
127
158
  end
128
-
159
+
129
160
  # on_connect on steroids.
130
161
  define_method :on_connect do
131
- acl_recheck # check address form socket to be sure
162
+ acl_recheck # check address from socket to be sure
132
163
  orig_on_connect.bind(self).call
133
164
  end
134
165
  private :on_connect
135
-
166
+
136
167
  # conn_address on steroids.
137
168
  define_method :conn_address do
138
169
  addr = orig_conn_address.bind(self).call
@@ -141,31 +172,43 @@ module IPAccess::Patches::Net
141
172
  return ipaddr
142
173
  end
143
174
  private :conn_address
144
-
175
+
176
+ # connect on steroids.
177
+ define_method :connect do
178
+ if proxy? && !check_only_real
179
+ ipaddr = ::TCPSocket.getaddress(proxy_address)
180
+ real_acl.output.check_ipstring(ipaddr, self)
181
+ return orig_connect.bind(self).call if check_only_proxy
182
+ end
183
+ ipaddr = ::TCPSocket.getaddress(address)
184
+ real_acl.output.check_ipstring(ipaddr, self)
185
+ orig_connect.bind(self).call
186
+ end
187
+ private :connect
188
+
145
189
  # This method returns default access list indicator
146
190
  # used by protected object; in this case it's +:output+.
147
191
  define_method :default_list do
148
192
  :output
149
193
  end
150
-
194
+
151
195
  # this hook will be called each time @acl is reassigned
152
196
  define_method :acl_recheck do
153
197
  try_arm_and_check_socket @socket
154
198
  nil
155
199
  end
156
-
200
+
157
201
  # this hook terminates connection
158
202
  define_method :terminate do
159
203
  self.finish if self.started?
160
204
  end
161
-
205
+
162
206
  end # base.class_eval
163
207
 
164
208
  end # self.included
165
-
209
+
166
210
  end # module HTTP
167
-
211
+
168
212
  end # module IPAccess::Patches
169
213
 
170
214
  # :startdoc:
171
-
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ipaccess
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paweł Wilk
@@ -28,7 +28,7 @@ cert_chain:
28
28
  rNombKmtHC0ASsAPzFZnw/+W2b73UATwnH0dZKm2TTZT5HeSqXnFUu9gH6MtI/S+
29
29
  VfsAlLTm8uSWA3CjR1dJYgRUp8tYQxwNwMv5IV1Fky9p8NKSU233lhBSOUJcrA==
30
30
  -----END CERTIFICATE-----
31
- date: 2013-12-24 00:00:00.000000000 Z
31
+ date: 2013-12-26 00:00:00.000000000 Z
32
32
  dependencies:
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: netaddr
@@ -266,7 +266,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
266
266
  requirements:
267
267
  - - '>='
268
268
  - !ruby/object:Gem::Version
269
- version: '0'
269
+ version: 1.9.2
270
270
  required_rubygems_version: !ruby/object:Gem::Requirement
271
271
  requirements:
272
272
  - - '>='
metadata.gz.sig CHANGED
Binary file