ipaccess 0.0.4 → 1.2.0

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.
Files changed (88) hide show
  1. checksums.yaml +15 -0
  2. checksums.yaml.gz.sig +1 -0
  3. data.tar.gz.sig +0 -0
  4. data/.gemtest +0 -0
  5. data/.rspec +1 -0
  6. data/.yardopts +12 -0
  7. data/ChangeLog +1495 -0
  8. data/{docs/LGPL-LICENSE → LGPL-LICENSE} +0 -0
  9. data/Manifest.txt +76 -0
  10. data/README.md +96 -0
  11. data/Rakefile +65 -42
  12. data/docs/COPYING +41 -45
  13. data/docs/FAQ +12 -0
  14. data/docs/HISTORY +17 -0
  15. data/docs/LEGAL +1 -1
  16. data/docs/LGPL +166 -0
  17. data/docs/TODO +150 -7
  18. data/docs/images/ipaccess.png +0 -0
  19. data/docs/images/ipaccess_ac_for_args.png +0 -0
  20. data/docs/images/ipaccess_ac_for_socket.png +0 -0
  21. data/docs/images/ipaccess_logo.png +0 -0
  22. data/docs/images/ipaccess_relations.png +0 -0
  23. data/docs/images/ipaccess_setup_origin.png +0 -0
  24. data/docs/images/ipaccess_setup_origin_tab.png +0 -0
  25. data/docs/images/ipaccess_view.png +0 -0
  26. data/docs/rdoc.css +22 -0
  27. data/examples/ftp.rb +62 -0
  28. data/examples/http.rb +81 -0
  29. data/examples/imap.rb +37 -0
  30. data/examples/pop.rb +31 -0
  31. data/examples/smtp.rb +26 -0
  32. data/examples/tcp_server.rb +32 -0
  33. data/examples/tcp_socket.rb +7 -3
  34. data/examples/telnet.rb +32 -0
  35. data/examples/text_message.rb +45 -0
  36. data/lib/ipaccess.rb +557 -7
  37. data/lib/ipaccess/arm_sockets.rb +7 -4
  38. data/lib/ipaccess/ghost_doc/ghost_doc.rb +23 -0
  39. data/lib/ipaccess/ghost_doc/ghost_doc_acl.rb +54 -0
  40. data/lib/ipaccess/ghost_doc/ghost_doc_net_ftp.rb +213 -0
  41. data/lib/ipaccess/ghost_doc/ghost_doc_net_http.rb +272 -0
  42. data/lib/ipaccess/ghost_doc/ghost_doc_net_smtp.rb +186 -0
  43. data/lib/ipaccess/ghost_doc/ghost_doc_net_telnet.rb +227 -0
  44. data/lib/ipaccess/ghost_doc/ghost_doc_p_blacklist.rb +36 -0
  45. data/lib/ipaccess/ghost_doc/ghost_doc_p_blacklist_e.rb +7 -0
  46. data/lib/ipaccess/ghost_doc/ghost_doc_p_unblacklist.rb +36 -0
  47. data/lib/ipaccess/ghost_doc/ghost_doc_p_unblacklist_e.rb +7 -0
  48. data/lib/ipaccess/ghost_doc/ghost_doc_p_unwhitelist.rb +36 -0
  49. data/lib/ipaccess/ghost_doc/ghost_doc_p_unwhitelist_e.rb +7 -0
  50. data/lib/ipaccess/ghost_doc/ghost_doc_p_whitelist.rb +36 -0
  51. data/lib/ipaccess/ghost_doc/ghost_doc_p_whitelist_e.rb +7 -0
  52. data/lib/ipaccess/ghost_doc/ghost_doc_patched_usage.rb +64 -0
  53. data/lib/ipaccess/ghost_doc/ghost_doc_sockets.rb +571 -0
  54. data/lib/ipaccess/ip_access_check.rb +508 -0
  55. data/lib/ipaccess/ip_access_errors.rb +186 -40
  56. data/lib/ipaccess/ip_access_list.rb +955 -1122
  57. data/lib/ipaccess/ip_access_set.rb +212 -0
  58. data/lib/ipaccess/net/ftp.rb +39 -0
  59. data/lib/ipaccess/net/http.rb +39 -0
  60. data/lib/ipaccess/net/https.rb +30 -0
  61. data/lib/ipaccess/net/imap.rb +39 -0
  62. data/lib/ipaccess/net/pop.rb +46 -0
  63. data/lib/ipaccess/net/smtp.rb +39 -0
  64. data/lib/ipaccess/net/telnet.rb +38 -0
  65. data/lib/ipaccess/patches/generic.rb +807 -0
  66. data/lib/ipaccess/patches/net_ftp.rb +165 -0
  67. data/lib/ipaccess/patches/net_http.rb +175 -0
  68. data/lib/ipaccess/patches/net_https.rb +29 -0
  69. data/lib/ipaccess/patches/net_imap.rb +117 -0
  70. data/lib/ipaccess/patches/net_pop.rb +171 -0
  71. data/lib/ipaccess/patches/net_smtp.rb +130 -0
  72. data/lib/ipaccess/patches/net_telnet.rb +103 -0
  73. data/lib/ipaccess/{netaddr_patch.rb → patches/netaddr.rb} +20 -11
  74. data/lib/ipaccess/patches/sockets.rb +586 -0
  75. data/lib/ipaccess/socket.rb +52 -1
  76. data/lib/ipaccess/sockets.rb +4 -30
  77. data/spec/ip_access_list_spec.rb +33 -21
  78. data/spec/spec.opts +2 -2
  79. metadata +289 -63
  80. metadata.gz.sig +0 -0
  81. data/docs/DOWNLOAD +0 -17
  82. data/docs/README +0 -95
  83. data/docs/WELCOME +0 -8
  84. data/lib/ipaccess/ghost_doc.rb +0 -206
  85. data/lib/ipaccess/ghost_doc_acl.rb +0 -31
  86. data/lib/ipaccess/ip_access.rb +0 -456
  87. data/lib/ipaccess/ip_access_patches.rb +0 -431
  88. data/spec/core_spec.rb +0 -5
@@ -0,0 +1,165 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Author:: Paweł Wilk (mailto:pw@gnu.org)
4
+ # Copyright:: Copyright (c) 2009-2014 by Paweł Wilk
5
+ # License:: This program is licensed under the terms of {GNU Lesser General Public License}[link:docs/LGPL.html] or {Ruby License}[link:docs/COPYING.html].
6
+ #
7
+ # Modules contained in this file are meant for
8
+ # patching Ruby's Net::FTP class in order to add
9
+ # IP access control to it. It is also used
10
+ # to create variant of Net::FTP class
11
+ # with IP access control.
12
+ #
13
+ #--
14
+ #
15
+ # Copyright (C) 2009 by Paweł Wilk. All Rights Reserved.
16
+ #
17
+ # This program is free software; you can redistribute it and/or modify
18
+ # it under the terms of either: 1) the GNU Lesser General Public License
19
+ # as published by the Free Software Foundation; either version 3 of the
20
+ # License, or (at your option) any later version; or 2) Ruby's License.
21
+ #
22
+ # See the file COPYING for complete licensing information.
23
+ #
24
+ #++
25
+ #
26
+
27
+ require 'socket'
28
+ require 'net/ftp'
29
+ require 'ipaccess/ip_access_errors'
30
+ require 'ipaccess/patches/generic'
31
+ require 'ipaccess/patches/sockets'
32
+
33
+ # :stopdoc:
34
+
35
+ module IPAccess::Patches::Net
36
+
37
+ ###################################################################
38
+ # Net::FTP class with IP access control.
39
+ # It uses output and occasionally input access lists.
40
+
41
+ module FTP
42
+
43
+ include IPAccess::Patches::ACL
44
+
45
+ def self.included(base)
46
+
47
+ marker = (base.name =~ /IPAccess/) ? base.superclass : base
48
+ return if marker.instance_variable_defined?(:@uses_ipaccess)
49
+ base.instance_variable_set(:@uses_ipaccess, true)
50
+
51
+ base.class_eval do
52
+
53
+ # CLASS METHODS
54
+ unless (base.name.nil? && base.class.name == "Class")
55
+ (class << self; self; end).class_eval do
56
+
57
+ # overwrite FTP.open()
58
+ define_method :__ipacall__open do |block, host, *args|
59
+ late_opened_on_deny = false
60
+ args.each { |x| late_opened_on_deny = true if (x.is_a?(Symbol) && x == :opened_on_deny) }
61
+ args.unshift host
62
+ if block.is_a?(Proc)
63
+ if late_opened_on_deny
64
+ raise ArgumentError, "The :opened_on_deny flag cannot be used when passing a block to FTP.open"
65
+ end
66
+ ftp = new(*args)
67
+ begin
68
+ block.call(ftp)
69
+ ensure
70
+ ftp.close
71
+ end
72
+ else
73
+ new(*args)
74
+ end
75
+ end
76
+
77
+ # block passing wrapper for Ruby 1.8
78
+ def open(*args, &block)
79
+ __ipacall__open(block, *args)
80
+ end
81
+
82
+ end
83
+
84
+ end # class methods
85
+
86
+ orig_initialize = self.instance_method :initialize
87
+ orig_open_socket = self.instance_method :open_socket
88
+ #orig_sendcmd = self.instance_method :sendcmd
89
+ orig_set_socket = self.instance_method :set_socket
90
+ orig_makeport = self.instance_method :makeport
91
+
92
+ # initialize on steroids.
93
+ define_method :__ipacall__initialize do |block, *args|
94
+ @opened_on_deny = false
95
+ args.delete_if { |x| @opened_on_deny = true if (x.is_a?(Symbol) && x == :opened_on_deny) }
96
+ args.pop if args.last.nil?
97
+ self.acl = IPAccess.valid_acl?(args.last) ? args.pop : :global
98
+ orig_initialize.bind(self).call(*args, &block)
99
+ end
100
+
101
+ # block passing wrapper for Ruby 1.8
102
+ def initialize(*args, &block)
103
+ __ipacall__initialize(block, *args)
104
+ end
105
+
106
+ # open_socket on steroids.
107
+ define_method :open_socket do |host, port|
108
+ unless @opened_on_deny
109
+ host = ::TCPSocket.getaddress(host)
110
+ real_acl.output.check_ipstring(host, self)
111
+ end
112
+ try_arm_and_check_socket( orig_open_socket.bind(self).call(host, port) )
113
+ end
114
+ private :open_socket
115
+
116
+ # set_socket on steroids.
117
+ define_method :set_socket do |sock, *args|
118
+ ret = orig_set_socket.bind(self).call(sock, args.first)
119
+ try_arm_and_check_socket(@sock, self)
120
+ return ret
121
+ end
122
+
123
+ # sendcmd on steroids.
124
+ #define_method :sendcmd do |*args|
125
+ # acl_recheck
126
+ # orig_sendcmd.bind(self).call(*args)
127
+ #end
128
+
129
+ # makeport on steroids.
130
+ define_method :makeport do
131
+ late_sock = orig_makeport.bind(self).call
132
+ begin
133
+ try_arm_and_check_socket late_sock
134
+ rescue IOError
135
+ end
136
+ return late_sock
137
+ end
138
+
139
+ # This method returns default access list indicator
140
+ # used by protected object; in this case it's +:output+.
141
+ define_method :default_list do
142
+ :output
143
+ end
144
+
145
+ # this hook will be called each time @acl is reassigned
146
+ define_method :acl_recheck do
147
+ try_arm_and_check_socket @sock
148
+ nil
149
+ end
150
+
151
+ # this hook terminates connection
152
+ define_method :terminate do
153
+ self.close unless self.closed?
154
+ end
155
+
156
+ end # base.class_eval
157
+
158
+ end # self.included
159
+
160
+ end # module FTP
161
+
162
+ end # module IPAccess::Patches
163
+
164
+ # :startdoc:
165
+
@@ -0,0 +1,175 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Author:: Paweł Wilk (mailto:pw@gnu.org)
4
+ # Copyright:: Copyright (c) 2009-2014 by Paweł Wilk
5
+ # License:: This program is licensed under the terms of {GNU Lesser General Public License}[link:docs/LGPL.html] or {Ruby License}[link:docs/COPYING.html].
6
+ #
7
+ # Modules contained in this file are meant for
8
+ # patching Ruby's Net::HTTP class in order to add
9
+ # IP access control to it. It is also used
10
+ # to create variant of Net::HTTP class
11
+ # with IP access control.
12
+ #
13
+ #--
14
+ #
15
+ # Copyright (C) 2009 by Paweł Wilk. All Rights Reserved.
16
+ #
17
+ # This program is free software; you can redistribute it and/or modify
18
+ # it under the terms of either: 1) the GNU Lesser General Public License
19
+ # as published by the Free Software Foundation; either version 3 of the
20
+ # License, or (at your option) any later version; or 2) Ruby's License.
21
+ #
22
+ # See the file COPYING for complete licensing information.
23
+ #
24
+ #++
25
+ #
26
+
27
+ require 'socket'
28
+ require 'net/http'
29
+ require 'ipaccess/ip_access_errors'
30
+ require 'ipaccess/patches/generic'
31
+ require 'ipaccess/patches/sockets'
32
+
33
+ # :stopdoc:
34
+
35
+ module IPAccess::Patches::Net
36
+
37
+ ###################################################################
38
+ # Net::HTTP class with IP access control.
39
+ # It uses output access lists.
40
+
41
+ module HTTP
42
+
43
+ include IPAccess::Patches::ACL
44
+
45
+ def self.included(base)
46
+
47
+ marker = (base.name =~ /IPAccess/) ? base.superclass : base
48
+ return if marker.instance_variable_defined?(:@uses_ipaccess)
49
+ base.instance_variable_set(:@uses_ipaccess, true)
50
+
51
+ base.class_eval do
52
+
53
+ # CLASS METHODS
54
+ unless (base.name.nil? && base.class.name == "Class")
55
+ (class << self; self; end).class_eval do
56
+
57
+ alias :__ipac__orig_new :new
58
+
59
+ # overload HTTP.new() since it's not usual.
60
+ define_method :new do |address, *args|
61
+ late_opened_on_deny = false
62
+ args.delete_if { |x| late_opened_on_deny = true if (x.is_a?(Symbol) && x == :opened_on_deny) }
63
+ args.pop if args.last.nil?
64
+ late_acl = IPAccess.valid_acl?(args.last) ? args.pop : :global
65
+ obj = __ipac__orig_new(address, *args)
66
+ obj.acl = late_acl unless obj.acl == late_acl
67
+ obj.opened_on_deny = late_opened_on_deny
68
+ return obj
69
+ end
70
+
71
+ # overwrite HTTP.start()
72
+ define_method :__ipacall__start do |block, address, *args|
73
+ late_on_deny = nil
74
+ args.delete_if { |x| late_on_deny = x if (x.is_a?(Symbol) && x == :opened_on_deny) }
75
+ args.pop if args.last.nil?
76
+ acl = IPAccess.valid_acl?(args.last) ? args.pop : :global
77
+ port, p_addr, p_port, p_user, p_pass = *args
78
+ new(address, port, p_addr, p_port, p_user, p_pass, acl, late_on_deny).start(&block)
79
+ end
80
+
81
+ # block passing wrapper for Ruby 1.8
82
+ def start(*args, &block)
83
+ __ipacall__start(block, *args)
84
+ end
85
+
86
+ # overwrite HTTP.get_response()
87
+ define_method :__ipacall__get_response do |block, uri_or_host, *args|
88
+ late_on_deny = nil
89
+ args.delete_if { |x| late_on_deny = x if (x.is_a?(Symbol) && x == :opened_on_deny) }
90
+ args.pop if args.last.nil?
91
+ late_acl = IPAccess.valid_acl?(args.last) ? args.pop : :global
92
+ path, port = *args
93
+ if path
94
+ host = uri_or_host
95
+ new(host, (port || Net::HTTP.default_port), late_acl, late_on_deny).start { |http|
96
+ return http.request_get(path, &block)
97
+ }
98
+ else
99
+ uri = uri_or_host
100
+ new(uri.host, uri.port, late_acl, late_on_deny).start { |http|
101
+ return http.request_get(uri.request_uri, &block)
102
+ }
103
+ end
104
+ end
105
+
106
+ # block passing wrapper for Ruby 1.8
107
+ def get_response(*args, &block)
108
+ __ipacall__get_response(block, *args)
109
+ end
110
+
111
+ end
112
+
113
+ end # class methods
114
+
115
+ orig_initialize = self.instance_method :initialize
116
+ orig_conn_address = self.instance_method :conn_address
117
+ orig_on_connect = self.instance_method :on_connect
118
+
119
+ # initialize on steroids.
120
+ define_method :__ipacall__initialize do |block, *args|
121
+ @opened_on_deny = false
122
+ args.delete_if { |x| @opened_on_deny = true if (x.is_a?(Symbol) && x == :opened_on_deny) }
123
+ args.pop if args.last.nil?
124
+ self.acl = IPAccess.valid_acl?(args.last) ? args.pop : :global
125
+ orig_initialize.bind(self).call(*args, &block)
126
+ end
127
+
128
+ # block passing wrapper for Ruby 1.8
129
+ def initialize(*args, &block)
130
+ __ipacall__initialize(block, *args)
131
+ end
132
+
133
+ # on_connect on steroids.
134
+ define_method :on_connect do
135
+ acl_recheck # check address form socket to be sure
136
+ orig_on_connect.bind(self).call
137
+ end
138
+ private :on_connect
139
+
140
+ # conn_address on steroids.
141
+ define_method :conn_address do
142
+ addr = orig_conn_address.bind(self).call
143
+ ipaddr = ::TCPSocket.getaddress(addr)
144
+ real_acl.output.check_ipstring(ipaddr, self)
145
+ return ipaddr
146
+ end
147
+ private :conn_address
148
+
149
+ # This method returns default access list indicator
150
+ # used by protected object; in this case it's +:output+.
151
+ define_method :default_list do
152
+ :output
153
+ end
154
+
155
+ # this hook will be called each time @acl is reassigned
156
+ define_method :acl_recheck do
157
+ try_arm_and_check_socket @socket
158
+ nil
159
+ end
160
+
161
+ # this hook terminates connection
162
+ define_method :terminate do
163
+ self.finish if self.started?
164
+ end
165
+
166
+ end # base.class_eval
167
+
168
+ end # self.included
169
+
170
+ end # module HTTP
171
+
172
+ end # module IPAccess::Patches
173
+
174
+ # :startdoc:
175
+
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Author:: Paweł Wilk (mailto:pw@gnu.org)
4
+ # Copyright:: Copyright (c) 2009-2014 by Paweł Wilk
5
+ # License:: This program is licensed under the terms of {GNU Lesser General Public License}[link:docs/LGPL.html] or {Ruby License}[link:docs/COPYING.html].
6
+ #
7
+ # Modules contained in this file are meant for
8
+ # patching Ruby's Net::HTTP class in order to add
9
+ # IP access control to it. It is also used
10
+ # to create variant of Net::HTTP class
11
+ # with IP access control.
12
+ #
13
+ #--
14
+ #
15
+ # Copyright (C) 2009 by Paweł Wilk. All Rights Reserved.
16
+ #
17
+ # This program is free software; you can redistribute it and/or modify
18
+ # it under the terms of either: 1) the GNU Lesser General Public License
19
+ # as published by the Free Software Foundation; either version 3 of the
20
+ # License, or (at your option) any later version; or 2) Ruby's License.
21
+ #
22
+ # See the file COPYING for complete licensing information.
23
+ #
24
+ #++
25
+ #
26
+
27
+ require 'net/https'
28
+ require 'ipaccess/patches/net/http'
29
+
@@ -0,0 +1,117 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Author:: Paweł Wilk (mailto:pw@gnu.org)
4
+ # Copyright:: Copyright (c) 2009-2014 by Paweł Wilk
5
+ # License:: This program is licensed under the terms of {GNU Lesser General Public License}[link:docs/LGPL.html] or {Ruby License}[link:docs/COPYING.html].
6
+ #
7
+ # Modules contained in this file are meant for
8
+ # patching Ruby's Net::IMAP class in order to add
9
+ # IP access control to it. It is also used
10
+ # to create variant of Net::IMAP class
11
+ # with IP access control.
12
+ #
13
+ #--
14
+ #
15
+ # Copyright (C) 2009 by Paweł Wilk. All Rights Reserved.
16
+ #
17
+ # This program is free software; you can redistribute it and/or modify
18
+ # it under the terms of either: 1) the GNU Lesser General Public License
19
+ # as published by the Free Software Foundation; either version 3 of the
20
+ # License, or (at your option) any later version; or 2) Ruby's License.
21
+ #
22
+ # See the file COPYING for complete licensing information.
23
+ #
24
+ #++
25
+ #
26
+
27
+ require 'socket'
28
+ require 'net/imap'
29
+ require 'ipaccess/ip_access_errors'
30
+ require 'ipaccess/patches/generic'
31
+ require 'ipaccess/patches/sockets'
32
+
33
+ # :stopdoc:
34
+
35
+ module IPAccess::Patches::Net
36
+
37
+ ###################################################################
38
+ # Net::IMAP class with IP access control.
39
+ # It uses output access lists.
40
+
41
+ module IMAP
42
+
43
+ include IPAccess::Patches::ACL
44
+
45
+ def self.included(base)
46
+
47
+ marker = (base.name =~ /IPAccess/) ? base.superclass : base
48
+ return if marker.instance_variable_defined?(:@uses_ipaccess)
49
+ base.instance_variable_set(:@uses_ipaccess, true)
50
+
51
+ base.class_eval do
52
+
53
+ orig_initialize = self.instance_method :initialize
54
+ orig_authenticate = self.instance_method :authenticate
55
+ orig_start_tls_session= self.instance_method :start_tls_session if self.method_defined?(:start_tls_session)
56
+
57
+ # initialize on steroids.
58
+ define_method :__ipacall__initialize do |block, host, *args|
59
+ @opened_on_deny = false
60
+ args.delete_if { |x| @opened_on_deny = true if (x.is_a?(Symbol) && x == :opened_on_deny) }
61
+ args.pop if args.last.nil?
62
+ self.acl = IPAccess.valid_acl?(args.last) ? args.pop : :global
63
+ ipaddr = ::TCPSocket.getaddress(host)
64
+ real_acl.output.check_ipstring(ipaddr, :none)
65
+ obj = orig_initialize.bind(self).call(ipaddr, *args, &block)
66
+ @host = host
67
+ self.acl_recheck
68
+ return obj
69
+ end
70
+
71
+ # authenticate on steroids.
72
+ define_method :authenticate do |auth_type, *args|
73
+ self.acl_recheck
74
+ orig_authenticate.bind(self).call(auth_type, *args)
75
+ end
76
+
77
+ # block passing wrapper for Ruby 1.8
78
+ def initialize(host, *args, &block)
79
+ __ipacall__initialize(block, host, *args)
80
+ end
81
+
82
+ # start_tls_session on steroids.
83
+ if self.method_defined?(:start_tls_session)
84
+ define_method :start_tls_session do |params|
85
+ ret = orig_start_tls_session.bind(self).call(params)
86
+ self.acl_recheck
87
+ return ret
88
+ end
89
+ end
90
+
91
+ # This method returns default access list indicator
92
+ # used by protected object; in this case it's +:output+.
93
+ define_method :default_list do
94
+ :output
95
+ end
96
+
97
+ # this hook will be called each time @acl is reassigned
98
+ define_method :acl_recheck do
99
+ try_arm_and_check_socket @sock
100
+ nil
101
+ end
102
+
103
+ # this hook terminates connection
104
+ define_method :terminate do
105
+ self.disconnect unless disconnected?
106
+ end
107
+
108
+ end # base.class_eval
109
+
110
+ end # self.included
111
+
112
+ end # module IMAP
113
+
114
+ end # module IPAccess::Patches
115
+
116
+ # :startdoc:
117
+