blob: 31c1429fa6c3cb98e35889bd4b1a40b1f500e121 [file] [log] [blame]
require 'digest/sha1'
require 'logger'
require 'ftools'
require 'cgi'
#--######################################################################
# Copyright (c) 2006 Logica
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#
# Contributors:
#
# Onno van der Straaten:: initial implementation
#++######################################################################
# {Copyright (c) 2006 Logica}[link:files/COPYRIGHT.html]
EPFWIKI_CSDIFF_PATH = "\"" + File.expand_path(RAILS_ROOT) + "/script/other/CSDiff/CSDiff.exe\""
FLASH_RECORD_UPDATED = "Record updated!"
FLASH_RECORD_CREATED = "Record created!"
FLASH_RECORD_DELETED = "Record deleted!"
FLASH_USE_POST_NOT_GET = 'The action does not allow a GET request, a POST request should be used'
FLASH_NOT_OWNER = "This record was created by someone else, it can only be modified by the user that created it."
MSG_EMAIL_SERVER_GENERATED = "**This message was generated by a server. Don't reply to this address.**"
REMOVE_PATTERN1 = /<script([^\<])*(ContentPageResource|ContentPageSection|ContentPageToolbar|contentPage\.preload|contentPage\.js|ContentPageSubSection|steps\.js|backPath =)([^\<])*<\/script>/mi
def create_cookie(theUser)
cookies[:epfwiki_id] = {:value => theUser.id.to_s, :expires => Time.now+31536000}
cookies[:epfwiki_token] = {:value => hash_pw(theUser.hashed_password),:expires => Time.now+31536000}
end
def expire_cookie
cookies.delete :epfwiki_id
cookies.delete :epfwiki_token
end
def notify_cadmin
Notifier::deliver_env_to(User.find_central_admin, session.instance_variable_get("@data"), params, request.env, nil)
end
def wrap_text(txt, col = 80)
txt.gsub(/(.{1,#{col}})( +|$\n?)|(.{1,#{col}})/,
"\\1\\3\n")
end
def buildid(time)
return time.strftime("%Y%m%d_%H%M")
end
def valid_filename(filename)
filename.downcase.delete("&+-.\"/\[]:;=,\\").tr(' ','_')
end
def email_addresses_4_report(users)
if users.class.to_s == "User"
return users.email
else
recipients = Array.new
for user in users
recipients = user.email if !recipients
recipients << user.email
end
return recipients
end
end
def mine?(theRecord)
return (theRecord.id == session['user'].id) if (theRecord.class.to_s == "User")
return (theRecord.user_id == session['user'].id)
end
def admin?
return session['user'].admin? if session['user']
return false
end
def user?
return !session['user'].nil?
end
def cadmin?
return (session['user'].admin == "C") if session['user']
return false
end
# HTML Tidy Configuration Options see http://tidy.sourceforge.net/docs/quickref.html
# Ruby Interface on SuSE linux does not seem to work. Causes a segmentation fault.
# If this is fixed we can start using it again instead of the current #tidy_file.
# To be able to use this we should add the EPFWIKI_TIDY_PATH environment variable.
# Examples:
# ENV['EPFWIKI_TIDY_PATH'] = '/usr/lib/libtidy.so'
# ENV['EPFWIKI_TIDY_PATH'] = ENV['EPFWIKI_ROOT_DIR'] + "vendor/tidy/bin/tidy.dll"
def tidy_file_segfaults_on_SuSE_Linux(path)
require 'tidy'
Tidy.path = ENV['EPFWIKI_TIDY_PATH']
html = IO.readlines(path).join
xml = Tidy.open(:show_warnings=>true) do |tidy|
tidy.options.indent = 'auto' # auto won't indent title, li elements
tidy.options.quote_ampersand = false # TODO is Tidy ignoring this option
tidy.options.output_encoding = 'utf8'
tidy.options.input_encoding = 'utf8'
tidy.options.char_encoding = 'utf8'
tidy.options.output_xhtml = true
tidy.options.vertical_space = 0
tidy.options.wrap = 0
tidy.options.quote_nbsp = 1
tidy.options.tidy_mark = 0
tidy.options.doctype = 'omit' # Prevent Tidy from adding some old doctype
# tidy.options.sort_attributes = 'alpha' #
# the current version supports sort_attributes but unfortunatly there is no dll distribution, only an exe
# TODO integrate new tidy dll when it is available. Note: this will improve generated diffs with xhtmldiff
xml = tidy.clean(html)
xml
outFile = File.new(path, "w")
outFile.puts(xml)
outFile.close
#puts tidy.errors
#puts tidy.diagnostics
end
end
# HTML Tidy Configuration Options see http://tidy.sourceforge.net/docs/quickref.html
# Note: tidy_success is false when there are warnings and there are always warnings!
# Tidy exists with 1 when there are warnings, 2 when there are errors, 0 when there
# are no errors or warnings.
def tidy_file(path)
cmdline = "tidy -m -config \"#{File.expand_path(RAILS_ROOT)}/config/tidy.cfg\" \"#{path}\""
RAILS_DEFAULT_LOGGER.info("HTML Tidy file with command #{cmdline}")
tidy_success = system(cmdline)
#puts "Message #{$?.exitstatus}, #{$?.pid}"
raise "Error executing command #{cmdline}: #{$?}" if $?.exitstatus == 2
end
def db_script_version(path2migratefolder)
files = Dir.entries(path2migratefolder) - [".", ".."]
version = 0
files.each { |file| version = file.split("_")[0].to_i if file.split("_")[0].to_i > version }
return version
end
def write_log(logfilename, content)
aOutputFile = File.new("#{ENV['EPFWIKI_ROOT_DIR']}log/#{logfilename}", "w")
aOutputFile.puts(content)
aOutputFile.close
end
def hash_pw(pw)
return Digest::SHA1.hexdigest(pw || '')
end
# Schedule a job to run #job_daily. Schedule this job to run at night if
# your sites are large (pages in the thousands). Under Windows this could be
# Scheduled Task to run from the app root the following command:
# ruby script/runner -e production 'job_daily'
# NOTE: ENV['EPFWIKI_HOST'] env variable is needed, because in a job we don't know the host
def job_daily
@cadmin = User.find_central_admin
BaselineProcess.find_2scan.each do |bp|
bp.scan4content
end
expired_by_update = false
Update.find_todo.each do |update|
update.do_update
expired_by_update = true
end
expire_all_pages unless expired_by_update
# send reports
Notifier::deliver_summary(:type => 'D', :host => ENV['EPFWIKI_HOST'])
Notifier::deliver_summary(:type => 'W', :host => ENV['EPFWIKI_HOST']) if Time.now.wday == 1 # monday, sunday is 0
Notifier::deliver_summary(:type => 'M', :host => ENV['EPFWIKI_HOST']) if Time.now.day == 1 # first day of the month
rescue => e
Notifier::deliver_email(User.find_central_admin, 'Error running job_daily', [], e.message + "\n" + e.backtrace.join("\n"))
end
def expire_all_pages
# expire cached pages
FileUtils.rm_rf File.expand_path("public/index.html", RAILS_ROOT)
FileUtils.rm_rf File.expand_path("public/portal/home.html", RAILS_ROOT)
FileUtils.rm_rf File.expand_path("public/portal/about.html", RAILS_ROOT)
#FileUtils.rm_rf File.expand_path("public/portal/search.html", RAILS_ROOT)
FileUtils.rm_rf File.expand_path("public/portal/wikis.html", RAILS_ROOT)
FileUtils.rm_rf File.expand_path("public/portal/users.html", RAILS_ROOT)
FileUtils.rm_rf File.expand_path("public/portal/privacypolicy.html", RAILS_ROOT)
FileUtils.rm_rf File.expand_path("public/portal/termsofuse.html", RAILS_ROOT)
# remove cache folders
['public/archives', 'public/pages/view', 'public/rss'].each do |f|
p = File.expand_path(f, RAILS_ROOT)
FileUtils.rm_r(p) if File.exists?(p)
end
end