diaspora/lib/federation_logger.rb
Maxwell Salzberg 190fceaf5c [SECURITY FIX] please update your pod ASAP
This is a fix for public messages, where a malicious pod could spoof a message from someone a user was connected to, as the verified signatures were not checked that the object was also from said sender.  This hole only affected public messages, and the private part of code had the correct checks
THX to s-f-s(Stephan Schulz) for reporting and tracking down this issue, and props to Raven24(florian.staudacher@gmx.at) for helping me test the patch
2012-07-02 10:00:12 -07:00

118 lines
2.8 KiB
Ruby

#custom_logger.rb
class ActiveSupport::BufferedLogger
def formatter=(formatter)
@log.formatter = formatter
end
end
class Formatter
COLORS = {
'FG' => {
'black' => '30',
'red' => '31',
'green' => '32',
'yellow' => '33',
'blue' => '34',
'violet' => '35',
'cyan' => '36',
'white' => '37',
},
'BG' => {
'black' => '40',
'red' => '41',
'green' => '42',
'yellow' => '43',
'blue' => '44',
'violet' => '45',
'cyan' => '46',
'white' => '47',
}
}
DULL = '0'
BRIGHT = '1'
NULL = '00'
ESC = "\e"
RESET = "#{ESC}[00;0;00m"
# example: \033[40;0;37m white text on black background
SEVERITY_TO_TAG_MAP = {'DEBUG'=>'meh', 'INFO'=>'fyi', 'WARN'=>'hmm', 'ERROR'=>'wtf', 'FATAL'=>'omg', 'UNKNOWN'=>'???'}
SEVERITY_TO_COLOR_MAP = {'DEBUG'=>'white', 'INFO'=>'green', 'WARN'=>'yellow', 'ERROR'=>'red', 'FATAL'=>'red', 'UNKNOWN'=>'white'}
def initialize
@colors_enabled = true
end
def random
@random ||= COLORS['FG'].keys[3]
end
def colors?
@colors_enabled
end
def fg name
COLORS['FG'][name]
end
def bg name
COLORS['BG'][name]
end
def colorize(message, c_fg='white', c_bg='black', strong=0)
if colors?
"#{ESC}[#{fg(c_fg)};#{bg(c_bg)};#{strong==0 ? DULL : BRIGHT}m#{message}#{RESET}"
else
message
end
end
def call(severity, time, progname, msg)
fmt_prefix = pretty_prefix(severity, time)
fmt_msg = pretty_message(msg)
"#{fmt_prefix} #{fmt_msg}\n"
end
def pretty_prefix(severity, time)
color = SEVERITY_TO_COLOR_MAP[severity]
fmt_severity = colorize(sprintf("%-3s","#{SEVERITY_TO_TAG_MAP[severity]}"), color, 'black', 1)
fmt_time = colorize(time.strftime("%s.%L"))
fmt_env = colorize(Rails.env, random, 'black', 1)
"#{fmt_env} - #{fmt_time} [#{fmt_severity}] (pid:#{$$})"
end
def pretty_message msg
w = 130
txt_w = (w - Rails.env.size - 3)
# get the prefix without colors, just for the length
@colors_enabled = false
prefix = pretty_prefix("DEBUG", Time.now).size + 1
@colors_enabled = true # restore value
if (msg.size <= (w-prefix))
msg
else
output = msg.strip.scan(/.{1,#{txt_w}}/).flatten.map { |line| sprintf("%#{w}s", sprintf("%-#{txt_w}s", line)) }.join("\n")
"\n#{output}"
end
end
end
class FederationLogger < ActiveSupport::BufferedLogger
end
if Rails.env.match(/integration/)
puts "using federation logger"
logfile = File.open(Rails.root.join("log", "federation_logger.log"), 'a') #create log file
logfile.sync = true #automatically flushes data to file
FEDERATION_LOGGER = FederationLogger.new(logfile) #constant accessible anywhere
FEDERATION_LOGGER.formatter = Formatter.new
else
FEDERATION_LOGGER = Rails.logger
end