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={})