require 'fileutils'
require 'www/lib'
require 'www/dir'
require 'www/common'
require 'www/admin'
class WWW
include Common
def handle_exadefault
check_template_file('exalogin','exalogin-template.htm')
if id = logged_in_session(true) then
finish_login
else
message('Error', 'No default login permitted.')
end
end
def handle_exalogin
check_template_file('exalogin','exalogin-template.htm')
if id = logged_in_session(false) then
finish_login
else
message('Error', 'No default login permitted.')
end
end
def finish_login
get_gui()
filename, path, task = @session.get('gui'), @session.checked('path','.'), @session.get('task')
if ! task.empty? then
save_session
handle_exatask
elsif filename and not filename.empty? then
save_session
fullname = filename.gsub(/\.\./,'')
fullname = File.join(path,filename) unless FileTest.file?(fullname)
fullname = File.join(@interface.get('path:interfaces'), filename) unless FileTest.file?(fullname)
fullname = File.join(@interface.get('path:interfaces'), path, filename) unless FileTest.file?(fullname)
if FileTest.file?(fullname) then
send_file(fullname,true)
else
message('Interface', 'Invalid interface request, no valid interface file.' )
end
else
message('Interface', 'Invalid interface request, no default interface file.')
end
end
def handle_exainterface()
check_template_file('text','exalogin-template.htm')
if id = valid_session() then
filename = @interface.get('process:uri').to_s # kind of dup
if ! filename.empty? && filename.sub!(/^.*\//,'') then
path = @session.checked('path', '.')
fullname = filename.gsub(/\.\./,'')
fullname = File.join(path,filename) unless FileTest.file?(fullname)
fullname = File.join(@interface.get('path:interfaces'),filename) unless FileTest.file?(fullname)
fullname = File.join(@interface.get('path:interfaces'),path,filename) unless FileTest.file?(fullname)
if FileTest.file?(fullname) then
save_session
send_file(fullname,true)
else
get_file(filename)
filename, path = @session.get('gui'), @session.checked('path','.')
if filename and not filename.empty? then
save_session
fullname = filename.gsub(/\.\./,'')
fullname = File.join(path,filename) unless FileTest.file?(fullname)
fullname = File.join(@interface.get('path:interfaces'),filename) unless FileTest.file?(fullname)
fullname = File.join(@interface.get('path:interfaces'),path,filename) unless FileTest.file?(fullname)
send_file(fullname,true) if FileTest.file?(fullname)
else
message('Interface', 'Invalid interface request, no interface file.')
end
end
else
message('Interface', 'Invalid interface request, no resource file.')
end
else
message('Interface', 'Invalid interface request, no login.')
end
end
def handle_exarequest() # todo: check if request is 'command'
check_template_file('exalogin','exalogin-template.htm')
if id = client_session() then
client = true
@interface.set('log:kind', "remote client request: #{id}")
elsif id = valid_session() then
client = false
@interface.set('log:kind', "remote browser request: #{id}")
else
client, id = false, nil
@interface.set('log:kind', 'unknown kind of request')
end
if id then
dir, tmp = dirname, tmp_path(dirname)
requestname, replyname = 'request.exa', 'reply.exa'
requestfile, replyfile = File.join(tmp,requestname), File.join(tmp,replyname)
lockfile = File.join(dirname,lckname)
action, filename, command, url, req = '', '', '', '', ''
extract_sent_files(tmp)
@variables.each do |key, value|
case key
when 'exa:request' then
req = value.dup
when 'exa:action' then
action = value.dup
# when 'exa:command' then
# command = value.dup
# when 'exa:url' then
# url = value.dup
when 'exa:filename' then
filename = value.dup
when 'exa:threshold' then
@interface.set('process:threshold', value.dup)
when /^fakename/o then
@variables.set(key, File.basename(value))
when /^filename\-/o then
@variables.set(key, filename = File.basename(value))
when /^dataname\-/o then
@variables.set(key)
else # remove varname- prefix from value
@variables.set(key, @variables.get(key).sub(/#{key}\-/,''))
end
end
@variables.check('exa:filename', filename)
@variables.check('exa:action', action)
if @variables.empty?('exa:filename') then
@variables.set('exa:filename', @interface.get('log:attachments').split('|').first || '')
end
req.gsub!(//i, '')
dat = "\n"
@variables.each do |key, value|
if ['password','exa:request'].include?(key) then
# skip
elsif ! value || value.empty? then
dat << "\n"
else # todo: escape 'm
dat << "#{value}\n"
end
end
dat << "\n"
if req.empty? then
req << "\n"
req << "\n"
req << "\n"
req << "'#{action}\n" unless action.empty?
# req << "'#{command}\n" unless command.empty?
# req << "'#{url}\n" unless url.empty?
req << "\n"
req << "constructed request\n"
req << dat
req << "\n"
else
# better use rexml but slower
if req =~ /]*>.*?\s*\s*(.*?)\s*<\/exa:threshold>\s*.*?<\/exa:request>/moi then
threshold = $1
unless threshold.empty? then
@interface.set('process:threshold', threshold)
@session.set('threshold', threshold)
end
end
req.sub!(/(]*>.*?)\s*\s*\-\-action\=(.*?)\s*<\/exa:option>\s*(.*?<\/exa:request>)/moi) do
pre, act, pos = $1, $2, $3
action = act.sub(/\.exa$/,'') if action.empty?
str = "#{pre}#{action}#{pos}"
str.sub(/\s*.*?<\/exa:command>\s*/moi ,'')
end
req.sub!(/(]*>.*?)\s*(.*?)\s*<\/exa:action>(.*?<\/exa:request>)/moi) do
pre, act, pos = $1, $2, $3
action = act.sub(/\.exa$/,'') if action.empty?
str = "#{pre}#{action}#{pos}"
str.sub(/\s*.*?<\/exa:command>\s*/moi ,'')
end
unless req =~ /(.*?)<\/exa:data>/moi then
req.sub!(/(<\/exa:request>)/) do dat + $1 end
end
end
req.sub!(/.*?<\/exa:filename>/moi, '')
unless @variables.empty?('exa:filename') then
req.sub!(/(<\/exa:application>)/moi) do
"#{@variables.get('exa:filename')}<\/exa:filename>" + $1
end
end
@variables.set('exa:action', action)
@interface.set("log:#{requestname}", req)
begin
File.open(requestfile,'w') do |f|
f << req
end
rescue
message('Error', 'There is a problem in handling this request (working path access).')
return
end
File.delete(replyfile) rescue false
@interface.set('log:action',action)
get_command(action)
logdata = ''
begin
command = @session.get('command')
@interface.set('log:command',if command.empty? then '[no command]' else command end)
if ! command.empty? then
@session.set('starttime', Time.now.to_i.to_s) # can be variables and in save list
if @interface.true?('process:background') then
# background
@session.set('status', 'running: background')
@session.set('maxtime', @interface.get('process:timeout'))
@session.set('threshold', @interface.get('process:threshold'))
save_session
timeout(@@watch_delay) do
save_environment(@interface,tmp)
begin
starttime = File.mtime(@session_file)
# crap
loop do
sleep(1)
if starttime != File.mtime(@session_file) then
break unless FileTest.file?(lockfile)
end
end
rescue TimeoutError
if client then
send_reply()
else
message('Status', 'Processing your request takes a while',true,5,'exastatus')
end
return
rescue
end
end
if client then send_reply() else send_result() end
else
# foreground
status = 'running: foreground'
@session.set('status', status)
@session.set('maxtime', @interface.get('process:timeout'))
@session.set('threshold', @interface.get('process:threshold'))
save_session
timeout(@interface.get('process:timeout').to_i) do
begin
status = 'running: foreground'
set_environment(@interface)
save_environment(@interface,tmp)
command = command_string(tmp,command)
logdata = `#{command}`
rescue TimeoutError
status = 'running: timeout'
logdata = "timeout: #{@interface.get('process:timeout')} seconds"
rescue
status = 'running: aborted'
logdata = 'fatal runtime error'
else
@session.set('endtime', Time.now.to_i.to_s)
status = 'running: finished'
end
end
@session.set('status', status)
save_session
case @session.get('status')
when 'running: finished' then
if client then send_reply(logdata) else send_result(logdata) end
when 'running: timeout' then
message('Error', 'There is a problem in handling this request (timeout).')
when 'running: aborted' then
message('Error', 'There is a problem in handling this request (aborted).')
else
message('Error', 'There is a problem in handling this request (unknown).')
end
end
else
message('Error', 'There is a problem in handling this request (no runner).')
end
rescue
message('Error', 'There is a problem in handling this request (no run).' + $!)
end
else
message('Error', 'Invalid session.')
end
end
def handle_exacommand() # shares code with exarequest
check_template_file('exalogin','exalogin-template.htm')
if id = client_session() then
client = true
@interface.set('log:kind', "remote client request: #{id}")
elsif id = valid_session() then
client = false
@interface.set('log:kind', "remote browser request: #{id}")
else
client, id = false, nil
@interface.set('log:kind', 'unknown kind of request')
end
if id then
dir, tmp = dirname, tmp_path(dirname)
requestname, replyname = 'request.exa', 'reply.exa'
requestfile, replyfile = File.join(tmp,requestname), File.join(tmp,replyname)
req, command, url = '', '', ''
@variables.each do |key, value|
case key
when 'exa:request' then
req = value.dup
when 'exa:command' then
command = value.dup
when 'exa:threshold' then
@interface.set('process:threshold', value.dup)
when 'exa:url' then
url = value.dup
end
end
unless req.empty? then
# better use rexml but slower / reuse these : command = filter_from_request('exa:command')
if req =~ /]*>.*?\s*\s*(.*?)\s*<\/exa:command>\s*.*?<\/exa:request>/moi then
command = $1
end
if req =~ /]*>.*?\s*\s*(.*?)\s*<\/exa:url>\s*.*?<\/exa:request>/moi then
url = $1
end
if req =~ /]*>.*?\s*\s*(.*?)\s*<\/exa:threshold>\s*.*?<\/exa:request>/moi then
threshold = $1
unless threshold.empty? then
@interface.set('process:threshold', threshold)
@session.set('threshold', threshold)
end
end
end
@variables.check('exa:command', command)
@variables.check('exa:url', url)
File.delete(replyfile) rescue false
case @variables.get('exa:command')
when 'fetch' then
if @variables.empty?('exa:url') then
message('Error', "Problems with fetching, no file given")
else
# the action starts here
filename = @variables.get('exa:url').to_s # kind of dup
unless filename.empty? then
get_path(filename) # also registers filename as url
path = @session.checked('path', '')
fullname = filename.gsub(/\.\./,'')
fullname = File.join(path,fullname) unless path.empty?
if FileTest.file?(fullname) then
if client then
send_url(fullname)
else
send_file(fullname,true)
end
@session.set('threshold', @interface.get('process:threshold'))
@session.set('url',filename)
save_session
else
message('Error', "Problems with fetching, unknown file #{fullname}.")
# message('Error', "Problems with fetching, unknown file #{filename}.")
end
else
message('Error', "Problems with fetching, invalid file #{filename}.")
end
# and ends here
end
else
message('Error', "Invalid command #{command}.")
end
else
message('Error', 'Invalid session.')
end
end
def handle_exastatus
get_cfg() # weird, needed for apache, but not for wwwserver
if request_variable('id').empty? then
if id = valid_session() then
send_result()
else
message('Error', 'Invalid session.')
end
else
if id = valid_session() then
send_reply()
else
send_reply('invalid session')
end
end
end
end