class GemsStatus::Utils

Constants

EMAIL_TMP_PATH

Attributes

errors[RW]

Public Class Methods

check_parameters(classname, conf, parameters) click to toggle source
# File lib/gems-status/utils.rb, line 103
def Utils.check_parameters(classname, conf, parameters)
  if !conf['classname'] then
    raise "trying to initialize #{classname} when parameter classname does not exists"
  end
  if conf['classname'] != classname then
    raise "trying to initialize #{classname} when parameter classname is #{conf['classname']}"
  end
  parameters.each do |p|
    if !conf[p] then
      raise "parameter #{p} not found for #{classname}"
    end
  end
end
download_date(name, version) click to toggle source
# File lib/gems-status/utils.rb, line 178
def Utils.download_date(name, version)
  Utils::log_debug "looking for date for #{name} - #{version}"
  begin
    versions = JSON.parse(open("https://rubygems.org/api/v1/versions/#{name}.json").read)
    versions.each do |v|
      if Gem::Version.new(v["number"]) == version
        Utils::log_debug  "Date for #{name} - #{version} : #{v["built_at"]}"
        return Time.parse v["built_at"]
      end
    end
  rescue
    Utils::log_error(name, "There was a problem opening https://rubygems.org/api/v1/versions/#{name}.json")
  end
  nil
end
download_emails(email_username, email_password, mailing_lists) click to toggle source
# File lib/gems-status/utils.rb, line 57
def Utils.download_emails(email_username, email_password, mailing_lists)
  begin
    self.get_emails_from_fs if @@emails.nil?
  rescue Exception => e
    self.log_error "", "There was a problem getting emails from filesystem #{e.message}"
  end
  if @@emails.nil?
    self.log_error "", "There was a problem getting emails from filesystem"
    @@emails = {}
  end
  self.log_debug "Emails read from filesystem #{@@emails.to_a.flatten.length}"
  Gmail.new(email_username, email_password) do |gmail|
   mailing_lists.each do |mailing_list|
     @@emails[mailing_list] = [] unless @@emails[mailing_list]
     Utils::log_debug "New security email alerts from #{mailing_list} #{gmail.inbox.count( :unread, :to => mailing_list)}"
     gmail.inbox.emails(:unread, :to => mailing_list).each do |email|
       mail = GemsStatus::Mail.new
       mail.uid = email.uid
       mail.subject = email.subject
       Utils::log_debug "Read #{mail.subject}"
       @@emails[mailing_list] << mail
       begin
         self.save_email_to_fs(mailing_list, mail)
         email.read!
       rescue Exception => e
         self.log_error "", "Error saving mail to filesystem #{e.message}"
         email.unread!
       end
     end
   end
  end
  return @@emails
end
download_license(name, version, gems_url) click to toggle source
# File lib/gems-status/utils.rb, line 141
def Utils.download_license(name, version, gems_url)
  version = version.to_s if version.is_a? Gem::Version
  key = "#{name}-#{version}-#{gems_url.gsub("/", "_").gsub(":", "_")}"
  return @@licenses[key] if @@licenses[key]
  begin
    gem_file_path = self.download_gem(name, version, gems_url)
  rescue Exception => e
    self.log_error(name, e.message)
    return nil
  end
  license = Gem::Format.from_file_by_path(gem_file_path).spec.license
  if !license || license.empty?
    if @@known_licenses[name]
      if @@known_licenses[name][version]
        license = @@known_licenses[name][version]
        Utils::log_debug "get license from known licenses for #{name} #{version}"
      else #@@known_licenses[name] but different version
        Utils::log_debug "I can't find license for #{name} but I have info from another version #{@@known_licenses[name].sort.last}"
      end
    end
  end
  @@licenses[key] = license
  return license
end
download_md5(name, version, gems_url) click to toggle source
# File lib/gems-status/utils.rb, line 127
def Utils.download_md5(name, version, gems_url)
  key = "#{name}-#{version}-#{gems_url.gsub("/", "_").gsub(":", "_")}"
  return @@md5_sums[key] if @@md5_sums[key]
  begin
    gem_file_path = self.download_gem(name, version, gems_url)
  rescue Exception => e
    self.log_error(name, e.message)
    return nil
  end
  md5 = Digest::MD5.hexdigest(open(gem_file_path).read)
  @@md5_sums["#{name}-#{version}"] = md5
  return md5
end
errors() click to toggle source
# File lib/gems-status/utils.rb, line 99
def Utils.errors
  return @@errors
end
get_emails_from_fs() click to toggle source
# File lib/gems-status/utils.rb, line 23
def Utils.get_emails_from_fs
  @@emails = {}
  Dir.glob("#{EMAIL_TMP_PATH}/**/*").each do |filename|
    next unless File.file?(filename)
    open(filename, "r") do |file|
      mail = GemsStatus::Mail.new
      mailing_list = File.dirname(filename).split("/").pop
      mail.uid = File.basename(filename)
      mail.subject = file.read
      
      if @@emails[mailing_list]
        @@emails[mailing_list] << mail
      else
        @@emails[mailing_list] = [mail]
      end
      self.log_debug "email from filesystem #{filename}"
    end
  end
end
known_licenses() click to toggle source
# File lib/gems-status/utils.rb, line 95
def Utils.known_licenses
  return @@known_licenses
end
known_licenses=(licenses) click to toggle source
# File lib/gems-status/utils.rb, line 91
def Utils.known_licenses=(licenses)
  @@known_licenses = licenses
end
log_debug(msg) click to toggle source
# File lib/gems-status/utils.rb, line 123
def Utils.log_debug(msg)
  $stderr.puts "DEBUG: #{msg}"
end
log_error(name, msg) click to toggle source
# File lib/gems-status/utils.rb, line 117
def Utils.log_error(name, msg)
  @@errors[name] = "\n" unless @@errors[name]
  @@errors[name]  << msg << "\n"
  $stderr.puts "ERROR: #{msg}"
end
save_email_to_fs(listname, mail) click to toggle source
# File lib/gems-status/utils.rb, line 43
def Utils.save_email_to_fs(listname, mail)
  dirname = "#{EMAIL_TMP_PATH}/#{listname}"
  filename = "#{dirname}/#{mail.uid}"
  if File.exists?(filename)
    self.log_debug "email had already been downloaded #{mail.uid} - skipping"
    return
  end
  FileUtils::mkdir_p(dirname)  unless File.exists?(dirname)
  open(filename, "w") do |f|
    self.log_debug "writing email to fs #{mail.uid}"
    f.write(mail.subject)
  end
end
send_email(email_receiver, email_username, email_password, name, mssg) click to toggle source
# File lib/gems-status/utils.rb, line 166
def Utils.send_email(email_receiver, email_username, email_password, name, mssg)
    Gmail.new(email_username, email_password) do |gmail|
      gmail.deliver do
        to email_receiver
        subject "[gems-status] security alerts for #{name}"
        text_part do
           body mssg
         end
      end
    end
end

Private Class Methods

download_gem(name, version, gems_url) click to toggle source
# File lib/gems-status/utils.rb, line 196
def Utils.download_gem(name, version, gems_url)
  gem_uri = URI.parse("#{gems_url}/#{name}-#{version}.gem")
  tmp_path = "tmp/utils/gems/#{gems_url.gsub("/", "_").gsub(":", "_")}/"
  gem_name = "#{name}-#{version}.gem"
  full_path = "#{tmp_path}/#{gem_name}"
  return full_path if File.exists? full_path
  uri_debug = gem_uri.clone
  uri_debug.password = "********" if uri_debug.password
  Utils::log_debug "download #{@name} from #{uri_debug}"
  FileUtils::mkdir_p(tmp_path) if ! File.exists?(tmp_path)
  if gem_uri.user && gem_uri.password
    source = open(gem_uri.scheme + "://" + gem_uri.host + "/" + gem_uri.path,
                 "rb",
                  :http_basic_authentication=>[gem_uri.user, gem_uri.password])
  else
    source = open(gem_uri)
  end
  open(full_path, "wb") do |file|
    file.write(source.read)
  end
  source.close
  return full_path
end