ident 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,24 @@
1
+ /* Canvas */
2
+ .source_code pre.lines { margin-right: 20px; text-align: right; color: #888; }
3
+ .docstring pre { padding: 12px; padding-left: 0; }
4
+ .docstring pre, .source_code { background: #222; padding: 12px; margin-top: 8px; border: 1px dashed #ccc; font-size: 0.9em; overflow-x: auto; }
5
+
6
+ /* Token colours. Borrowed from pastie.org's "Blackboard" theme */
7
+ pre.code, pre.lines { font-family: Monaco, Courier, monospace; }
8
+ pre.code { color: #fff; }
9
+ pre.code .info.file { color: #888; }
10
+ pre.code .val, pre.code .int, pre.code .float { color: #61CE3C; }
11
+ pre.code .dstring, pre.code .tstring_content,
12
+ pre.code .regexp_beg, pre.code .regexp_end,
13
+ pre.code .tstring_beg, pre.code .tstring_end { color: #61DE3C; }
14
+ pre.code .embexpr_beg, pre.code .tstring, pre.code .tstring .rbrace { color: #7CFE65; }
15
+ pre.code .fid, pre.code .id.new, pre.code .id.to_s,
16
+ pre.code .id.to_sym, pre.code .id.to_f,
17
+ pre.code .dot + pre.code .id,
18
+ pre.code .id.to_i pre.code .id.each { color: #FF6400; }
19
+ pre.code .comment { color: #AEAEAE; }
20
+ pre.code .constant, pre.code .const, pre.code .symbol, pre.code .symbeg { color: #D8FA3C; }
21
+ pre.code .kw { color: #FBDE2D; }
22
+ pre.code .ivar { color: #AACEFB; }
23
+ pre.code .gvar, pre.code .backref, pre.code .id.nth_ref { color: #BADEFF; }
24
+ pre.code .regexp, .dregexp { color: #EA5EFB; }
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html>
4
+ <head>
5
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
6
+ <link rel="stylesheet" href="style.css" type="text/css" charset="utf-8" />
7
+ <link rel="stylesheet" href="custom.css" type="text/css" charset="utf-8" />
8
+ <link rel="stylesheet" href="syntax_highlight.css" type="text/css" charset="utf-8" />
9
+
10
+ <script src="jquery.js" type="text/javascript" charset="utf-8"></script>
11
+ <script src="app.js" type="text/javascript" charset="utf-8"></script>
12
+ <title>Top Level Namespace</title>
13
+ </head>
14
+ <body>
15
+ <div id="content">
16
+
17
+ </div>
18
+ <div id="yard_info">
19
+ Generated on Wednesday, October 14 2009 at 04:55:47 PM by
20
+ <abbr class="yard" title="Yay! A Ruby Documentation Tool"><a href="http://yard.soen.ca">YARD</a></abbr>
21
+ 0.2.3.3 (ruby-1.9.1).
22
+ </div>
23
+
24
+ </body>
25
+ </html>
@@ -0,0 +1,34 @@
1
+ require 'ident'
2
+
3
+ # Note: none of this examples will work when executed directly, they
4
+ # are rather meant for giving an overview how you would use the
5
+ # library in your own server applications.
6
+
7
+ # using the class method Ident.request
8
+ begin
9
+ response = Ident.request("127.0.0.1", 12345, 12345)
10
+ # if Ident.request returned an error, userid will be nil. If you want
11
+ # to know what the error was, check Response::ERROR#type or use the
12
+ # methods like `no_user?`
13
+ username = response.userid || "fallback username"
14
+ rescue Timeout::Error, Errno::ECONNREFUSED
15
+ # we couldn't connect to an identd, use a fallback username
16
+ username = "fallback username"
17
+ end
18
+
19
+ # using an instance of Ident. basically the same as above, but you can
20
+ # set the arguments before invoking the request
21
+ begin
22
+ i = Ident.new
23
+ i.ip = "127.0.0.1"
24
+ i.outbound = 12345
25
+ i.inbound = 12345
26
+ i.timeout = 5
27
+
28
+ response = i.request
29
+ username = response.userid || "fallback username"
30
+ rescue Timeout::Error, Errno::ECONNREFUSED
31
+ username = "fallback username"
32
+ end
33
+
34
+ # you can ask for the userid, the os and the charset.
data/lib/ident.rb ADDED
@@ -0,0 +1,134 @@
1
+ class Ident
2
+ require 'socket'
3
+ require 'timeout'
4
+
5
+ KNOWN_ERRORS = ["INVALID-PORT" "NO-USER" "HIDDEN-USER" "UNKNOWN-ERROR"]
6
+ module Response
7
+ # This is the blankslate response which ensures that both kind of
8
+ # responses respond to all required methods. You should never have
9
+ # to work with this class directly.
10
+ class BasicResponse
11
+ # Is the response the result of an error?
12
+ def error?; false; end
13
+ def os; nil; end
14
+ def charset; nil; end
15
+ def userid; nil; end
16
+
17
+ private
18
+ def self.error_to_method_name(error)
19
+ (error.downcase.tr('-', '_') + "?").to_sym
20
+ end
21
+
22
+ public
23
+ KNOWN_ERRORS.each do |e|
24
+ define_method(error_to_method_name(e)) do
25
+ false
26
+ end
27
+ end
28
+ end
29
+
30
+ class USERID < BasicResponse
31
+ # the operating system of the user
32
+ attr_reader :os
33
+ # the charset on the system, defaults to US-ASCII
34
+ attr_reader :charset
35
+ # the userid
36
+ attr_reader :userid
37
+ def initialize(os, userid)
38
+ @os, @charset = os.split('-')
39
+ @charset ||= 'US-ASCII'
40
+ @userid = userid
41
+ end
42
+ end
43
+
44
+ # This class gives access to the error returned by an identd. It
45
+ # defines method for every possible kind of error: invalid_port?
46
+ # no_user? hidden_user? unknown_error?
47
+ class ERROR < BasicResponse
48
+ KNOWN_ERRORS.each do |e|
49
+ define_method(error_to_method_name(e)) do
50
+ @type == e
51
+ end
52
+ end
53
+
54
+ attr_reader :type
55
+ def initialize(type)
56
+ @type = type
57
+ end
58
+
59
+ # @see BasicResponse#error?
60
+ def error?; true; end
61
+ # Did we specify an invalid port?
62
+ def invalid_port?; @type == "INVALID-PORT"; end
63
+ # Is no user known for the given connection specification?
64
+ def no_user?; @type == "NO-USER"; end
65
+ # Does the identd hide information from us?
66
+ def hidden_user?; @type == "HIDDEN-USER"; end
67
+ # Did an unknown error occur?
68
+ def unknown_error?; @type == "UNKNOWN-ERROR"; end
69
+ end
70
+
71
+ # Returns an instance of {USERID} or {ERROR}, depending on the type of
72
+ # reply.
73
+ def self.from(s)
74
+ ports, type, *addinfo = s.split(':')
75
+ klass = self.const_get(type.to_sym)
76
+ klass.new(*addinfo)
77
+ end
78
+ end
79
+
80
+ attr_accessor :ip
81
+ attr_accessor :outbound
82
+ attr_accessor :inbound
83
+ attr_accessor :timeout
84
+ attr_reader :response
85
+ # @see Ident.request
86
+ def initialize(ip = nil, outbound = nil, inbound = nil, timeout = 10)
87
+ @ip, @outbound, @inbound, @timeout = ip, outbound, inbound, timeout
88
+ @response = nil
89
+ end
90
+
91
+ # @see Ident.request
92
+ def request
93
+ @response = self.class.request(@ip, @outbound, @inbound, @timeout)
94
+ end
95
+
96
+ # This method connects to an identd at `ip` and queries information
97
+ # for the connection `outbound`->`inbound` where `outbound` is the
98
+ # port a connection is coming from (usually anything >1024) and
99
+ # `inbound` is the port connected to, the port your service is
100
+ # listening on (e.g. 6667 in the case of an IRCd)
101
+ #
102
+ #
103
+ # @example user A connects to our server on port 23, coming from 123.123.123.123 on port 6789
104
+ # Ident.request('123.123.123.123', 6789, 23)
105
+ #
106
+ # @param [String] ip The IP of the ident server
107
+ # @param [Integer] outbound The port from which the connection is coming
108
+ # @param [Integer] inbound The port to which was connected
109
+ # @param [Integer] timeout_after The timeout, defaults to 10 seconds
110
+ #
111
+ # @raise [Timeout::Error] In case of a timeout
112
+ # @raise [Errno::ECONNREFUSED] If no identd was running at the destination host
113
+ #
114
+ # @return [Response::USERID] if we successfully queried the ident server
115
+ # @return [Response::ERROR] in case of an error
116
+ def self.request(ip, outbound, inbound, timeout_after = 10)
117
+ r = nil
118
+ timeout(timeout_after) do
119
+ t = TCPSocket.new(ip, 113)
120
+ t.puts [outbound, inbound].join(', ')
121
+ r = t.gets
122
+ t.close
123
+ end
124
+
125
+ # in case the identd just kills our connection
126
+ r ||= "#{outbound}, #{inbound}:ERROR:UNKNOWN-ERROR"
127
+
128
+ r.chomp!
129
+ Response.from(r)
130
+ end
131
+ end
132
+
133
+
134
+
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ident
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Dominik Honnef
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-14 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: A Ruby library for querying identd servers (RFC 1413)
17
+ email: dominikho@gmx.net
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - lib/ident.rb
26
+ - Rakefile
27
+ - COPYING
28
+ - README
29
+ - doc/syntax_highlight.css
30
+ - doc/all-files.html
31
+ - doc/Ident
32
+ - doc/Ident/Response
33
+ - doc/Ident/Response/ERROR.html
34
+ - doc/Ident/Response/BasicResponse.html
35
+ - doc/Ident/Response/USERID.html
36
+ - doc/Ident/Response.html
37
+ - doc/custom.css
38
+ - doc/Ident.html
39
+ - doc/style.css
40
+ - doc/README.html
41
+ - doc/all-methods.html
42
+ - doc/all-namespaces.html
43
+ - doc/app.js
44
+ - doc/index.html
45
+ - doc/top-level-namespace.html
46
+ - doc/jquery.js
47
+ - examples/example.rb
48
+ has_rdoc: false
49
+ homepage: http://dominikh.fork-bomb.de
50
+ post_install_message:
51
+ rdoc_options: []
52
+
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ version:
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: "0"
66
+ version:
67
+ requirements: []
68
+
69
+ rubyforge_project: ident
70
+ rubygems_version: 1.3.1
71
+ signing_key:
72
+ specification_version: 2
73
+ summary: A Ruby library for querying identd servers (RFC 1413)
74
+ test_files: []
75
+