This file is indexed.

/usr/lib/ruby/vendor_ruby/net/irc/server.rb is in ruby-net-irc 0.0.9-3.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
class Net::IRC::Server
	# Server global state for accessing Server::Session
	attr_accessor :state
	attr_accessor :sessions

	def initialize(host, port, session_class, opts={})
		@host          = host
		@port          = port
		@session_class = session_class
		@opts          = OpenStruct.new(opts)
		@sessions      = []
		@state         = {}
	end

	# Start server loop.
	def start
		@serv = TCPServer.new(@host, @port)
		@log  = @opts.logger || Logger.new($stdout)
		@log.info "Host: #{@host} Port:#{@port}"
		@accept = Thread.start do
			loop do
				Thread.start(@serv.accept) do |s|
					begin
						@log.info "Client connected, new session starting..."
						s = @session_class.new(self, s, @log, @opts)
						@sessions << s
						s.start
					rescue Exception => e
						puts e
						puts e.backtrace
					ensure
						@sessions.delete(s)
					end
				end
			end
		end
		@accept.join
	end

	# Close all sessions.
	def finish
		Thread.exclusive do
			@accept.kill
			begin
				@serv.close
			rescue
			end
			@sessions.each do |s|
				s.finish
			end
		end
	end


	class Session
		include Net::IRC
		include Constants

		attr_reader :prefix, :nick, :real, :host

		# Override subclass.
		def server_name
			"net-irc"
		end

		# Override subclass.
		def server_version
			"0.0.0"
		end

		# Override subclass.
		def available_user_modes
			"eixwy"
		end

		# Override subclass.
		def available_channel_modes
			"spknm"
		end

		def initialize(server, socket, logger, opts={})
			@server, @socket, @log, @opts = server, socket, logger, opts
		end

		def self.start(*args)
			new(*args).start
		end

		# Start session loop.
		def start
			on_connected
			while l = @socket.gets
				begin
					@log.debug "RECEIVE: #{l.chomp}"
					m = Message.parse(l)
					next if on_message(m) === true

					name = "on_#{(COMMANDS[m.command.upcase] || m.command).downcase}"
					send(name, m) if respond_to?(name)

					break if m.command == QUIT
				rescue Message::InvalidMessage
					@log.error "MessageParse: " + l.inspect
				end
			end
		rescue IOError
		ensure
			finish
		end

		# Close this session.
		def finish
			begin
				@socket.close
			rescue
			end
			on_disconnected
		end

		# Default PASS callback.
		# Set @pass.
		def on_pass(m)
			@pass = m.params[0]
		end

		# Default NICK callback.
		# Set @nick.
		def on_nick(m)
			@nick = m.params[0]
			@prefix = Prefix.new("#{@nick}!#{@user}@#{@host}") if defined? @prefix
		end

		# Default USER callback.
		# Set @user, @real, @host and call initial_message.
		def on_user(m)
			@user, @real = m.params[0], m.params[3]
			@nick ||= @user
			@host = @socket.peeraddr[2]
			@prefix = Prefix.new("#{@nick}!#{@user}@#{@host}")
			initial_message
		end

		# Call when socket connected.
		def on_connected
		end

		# Call when socket closed.
		def on_disconnected
		end

		# Catch all messages.
		# If this method return true, aother callback will not be called.
		def on_message(m)
		end

		# Default PING callback. Response PONG.
		def on_ping(m)
			post server_name, PONG, m.params[0]
		end

		# Do nothing.
		# This is for avoiding error on calling super.
		# So you can always call super at subclass.
		def method_missing(name, *args)
		end

		private
		# Post message to server.
		#
		#     include Net::IRC::Constants
		#     post prefix, PRIVMSG, "#channel", "foobar"
		def post(prefix, command, *params)
			m = Message.new(prefix, command, params.map {|s|
				#s.gsub(/\r\n|[\r\n]/, " ")
				s.tr("\r\n", " ")
			})
			@log.debug "SEND: #{m.to_s.chomp}"
			@socket << m
		rescue IOError
			finish
		end

		# Call when client connected.
		# Send RPL_WELCOME sequence. If you want to customize, override this method at subclass.
		def initial_message
			post server_name, RPL_WELCOME,  @nick, "Welcome to the Internet Relay Network #{@prefix}"
			post server_name, RPL_YOURHOST, @nick, "Your host is #{server_name}, running version #{server_version}"
			post server_name, RPL_CREATED,  @nick, "This server was created #{Time.now}"
			post server_name, RPL_MYINFO,   @nick, "#{server_name} #{server_version} #{available_user_modes} #{available_channel_modes}"
		end
	end
end # Server