lib/sfpagent/agent.rb in sfpagent-0.4.14 vs lib/sfpagent/agent.rb in sfpagent-0.4.15

- old
+ new

@@ -6,10 +6,11 @@ require 'uri' require 'net/http' require 'logger' require 'json' require 'digest/md5' +require 'shellwords' module Sfp module Agent NetHelper = Object.new.extend(Sfp::Helper::Net) @@ -511,12 +512,12 @@ false end def self.uninstall_module(name) return false if @@config[:modules_dir] == '' - - module_dir = "#{@@config[:modules_dir]}/#{name}" + module_dir = Shellwords.escape(File.expand_path("#{@@config[:modules_dir]}/#{name}")) + return false if not subpath(module_dir, @@config[:modules_dir]) if File.directory?(module_dir) result = !!system("rm -rf #{module_dir}") else result = true end @@ -540,25 +541,30 @@ File.delete @@config[:modules_dir] if File.exist? @@config[:modules_dir] Dir.mkdir(@@config[:modules_dir], 0700) end # delete old files - module_dir = "#{@@config[:modules_dir]}/#{name}" - system("rm -rf #{module_dir}") if File.exist? module_dir + module_dir = Shellwords.escape("#{@@config[:modules_dir]}/#{name}") + return false if not subpath(module_dir, @@config[:modules_dir]) + system("rm -rf #{module_dir}") if File.exist?(module_dir) # save the archive Dir.mkdir("#{module_dir}", 0700) File.open("#{module_dir}/data.tgz", 'wb', 0600) { |f| f.syswrite data } # extract the archive and the files system("cd #{module_dir}; tar xvf data.tgz") Dir.entries(module_dir).each { |name| next if name == '.' or name == '..' - if File.directory? "#{module_dir}/#{name}" - system("cd #{module_dir}/#{name}; mv * ..; mv .* .. 2>/dev/null; cd ..; rm -rf #{name}") + name = Shellwords.escape(name) + target = "#{module_dir}/#{name}" + return false if not subpath(target, @@config[:modules_dir]) + if File.directory? target + system("cd #{target} && mv * .. && mv .* .. 2>/dev/null ; cd .. && rm -rf #{name}") end - system("cd #{module_dir}; rm data.tgz") + datafile = "#{module_dir}/data.tgz" + File.delete(datafile) if File.exist?(datafile) } load_modules(@@config) if reload Sfp::Agent.logger.info "Installing module #{name} [OK]" @@ -659,11 +665,11 @@ f.write(output) f.flush f.truncate(f.pos) end rescue Exception => e - Sfp::Agent.logger.error e.to_s + Sfp::Agent.warn 'cannot update /etc/hosts' end end true end @@ -674,9 +680,18 @@ return @@agents_database if modified_time == @@agents_database_modified_time and (Time.new - modified_time) < 60 @@agents_database_modified_time = File.mtime(AgentsDataFile) @@agents_database = JSON[File.read(AgentsDataFile)] end + + # return true if path1 is subpath of path2, otherwise false + def self.subpath(path1, path2) + path1 = File.expand_path(path1) + path2 = File.expand_path(path2) + (path1[0,path2.length] == path2) + end + + class Maintenance IntervalTime = 600 # 10 minutes def initialize(opts={})