#!/usr/local/bin/ruby require 'cgi' require 'drb' # Require authenticators class CGI def redirect( where ) print this.header( { 'Status' => '302 Moved', 'location' => '#{where}' } ) end end # Default settings moved to soks.rb class WikiCgi def initialize( cgi, wiki, settings ) @cgi, @wiki, @name, @wikiurl, @authenticators = server, wiki, settings[:name] , settings[:url] , settings[:authenticators] end def service( cgi ) case cgi.path_translated # Redirect some cgis to static file servlet when '/robots.txt', '/favicon.ico' ; cgi.redirect( "#{@wikiurl}/attachment#{cgi.path_translated}") # If cgi of the form /verb/pagename then execute the approriate method when /\/(\w+?)\/(.+)/ verb, pagename = $1, $2 # authenticate cgi, response if self.respond_to?( "do#{verb.capitalize}" ) self.send( "do#{verb.capitalize}", cgi, pagename, cgi.remote_user ) else cgi.out { @wiki.view( pagename, verb, cgi.remote_user ) } end when /\/(.+)/ ; redirect( cgi, $1, 'view' ) # No verb given when "/" ; redirect( cgi, "Home Page", 'view' ) # No page or verb given end #response['Content-Type'] ||= "text/html" #response['Cache-control'] ||= 'no-cache' #response['Pragma'] ||= 'no-cache' end def authenticate( cgi ) @authenticators.each do |path_regex,authenticator| if cgi.path_translated.downcase =~ path_regex authenticator.authenticate( cgi ) break end end end def redirect( cgi, pagename, verb = 'view' ) pagename = pagename.url_encode # Reformat into url encoding cgi.redirect( verb ? "#{@wikiurl}/#{verb}/#{pagename}" : "#{@wikiurl}/#{pagename}") end def doWiki( cgi, pagename, person ) redirect( pagename.gsub(/([a-z])([A-Z])/,'\1 \2') ) end def doFind( cgi, pagename, person ) cgi.out { @wiki.find( cgi.query['regex'].strip ) } end def doSave( cgi, pagename, person ) content = cgi.query["content"].to_s newpagename = cgi.query["titleprefix"].to_s + cgi.query["newtitle"].to_s @wiki.revise( pagename, content.gsub(/\r\n/,"\n"), person, newpagename) if content redirect( newpagename ) end def doRollback( cgi, pagename, person ) revision = cgi.query['revision'] ? cgi.query['revision'].to_i : nil @wiki.rollback( pagename, revision, person ) if revision redirect( pagename ) end def doDelete( cgi, pagename, person ) @wiki.delete( pagename, person ) redirect( pagename ) end def doUpload( cgi, pagename, person ) newpagename = cgi.query["titleprefix"].to_s + cgi.query["newtitle"].to_s unless cgi.query['file'] == "" @wiki.revise( pagename, upload( cgi.query['file'].filename[/[0-9A-Za-z.]*$/], cgi.query['file'] ) , person, newpagename ) else @wiki.move( pagename, person, newpagename ) end redirect( newpagename ) end def doRss( cgi, pagename, person ) cgi.out { @wiki.view( pagename, 'rss', person ) } # response["Content-Type"] = "text/xml" end private def upload( filename, filedata ) path = "#{$SETTINGS[:root_directory]}/attachment/" filename = unique_filename( path ,filename ) File.open( File.join( path, filename ), 'wb' ) { |file| filedata.list.each { |data| file << data } } "/attachment/#{filename}" end def unique_filename( path, filename ) bits = filename.split(/\./) while File.exist? File.join( path, filename ) if bits.length >= 1 bits[-2].succ! else bits[0].succ! end filename = bits.join('.') end filename end end wiki = DRbObject.new( nil, 'druby://localhost:9001') settings = wiki.settings cgi = CGI.new cgi = WikiCgi.new( cgi, wiki, settings ) cgi.service