#!/usr/bin/env ruby
#
# $Id: index.cgi,v 1.6 2005/12/12 22:43:54 Yuukis Exp $
#
#
$KCODE = 'e'
class DayomonFilter
VERSION = '1.0 (20051212)'
NAME = "DayomonFilter/#{VERSION}"
BASE_URI = 'http://dayomon.org'
SCRIPT_URI = 'http://dayomon.org/filter/'
FOOTER = %Q(このページは "#{NAME}" によってフィルタされている。)
require 'nkf'
require 'net/http'
require 'cgi'
require 'timeout'
require 'uri'
require 'open-uri'
def initialize
cgi = CGI.new
url = cgi['uri']
bye if url == ''
bye if cgi.user_agent =~ /(bot|slup)/i
['"', '<', '>', "'"].each {|x| bye if url.index(x) }
url = "http://#{url}" if url !~ /^http:/i
@uri = URI.parse(url)
begin
timeout(15) {
contents = OpenURI.open_uri(url, 'User-Agent' => NAME, 'Referer' => BASE_URI)
cgi.out('text/html') { filtering(contents.read) }
}
rescue TimeoutError
cgi.out('text/plain') { 'Operation Timeouted!!' }
end
end
private
def bye
print "Location: #{BASE_URI}\n\n"
exit
end
def filtering(str)
ret = ''
if @uri.path !~ /\/$/
dir_path = File.dirname(@uri.path) + '/'
else
dir_path = @uri.path
end
parent = 'http://' + @uri.host + dir_path
grandparent = 'http://' + @uri.host + File.dirname(dir_path)
NKF.nkf('-ex', str).each{ |line|
if line =~ /.*content\-type.*text\/html.*/i
ret << line.gsub(/charset=.*\"/i,"charset=euc-jp\"")
elsif line =~ /(href|src)=/i
['href', 'src'].each {|tag|
line.gsub!(/#{tag}=\"\.\.\//i, "#{tag}=\"#{grandparent}") # '../'
line.gsub!(/#{tag}=\"\.\//i, "#{tag}=\"#{parent}") # './'
line.gsub!(/#{tag}=\"\/\//i, "#{tag}=\"http://") # '//' for slashcode.
line.gsub!(/#{tag}=\"\//i, "#{tag}=\"http://#{@uri.host}/") # '/'
if line =~ /#{tag}=/i
line.gsub!(/#{tag}=\"(.*?)\"/i) {
x = $1.dup
if x !~ /^http:/i
%Q(#{tag}="#{parent}#{x}")
else
%Q(#{tag}="#{x}")
end
}
end
}
if line !~ /.*text\/css.*/i
ret << line.gsub(/href=\"http:/i, "href=\"#{SCRIPT_URI}?uri=http:")
else
ret << line
end
elsif line =~ /<\/body>/i
ret << line.gsub(/<\/body>/i,"
\n#{FOOTER}\n