lib/fusuma/plugin/appmatcher/user_switcher.rb in fusuma-plugin-appmatcher-0.4.0 vs lib/fusuma/plugin/appmatcher/user_switcher.rb in fusuma-plugin-appmatcher-0.5.0
- old
+ new
@@ -5,40 +5,41 @@
module Fusuma
module Plugin
module Appmatcher
# Drop sudo privileges
- class UserSwitcher
+ module UserSwitcher
include CustomProcess
- User = Struct.new(:username, :uid, :gid)
- attr_reader :login_user
-
- def initialize
- username = ENV["SUDO_USER"] || Etc.getlogin
- uid = `id -u #{username}`.chomp.to_i
- gid = `id -g #{username}`.chomp.to_i
- @login_user = User.new(username, uid, gid)
- end
-
# Drops privileges to that of the specified user
def drop_priv(user)
# Process.initgroups(user.username, user.gid)
Process::Sys.setegid(user.gid)
Process::Sys.setgid(user.gid)
Process::Sys.setuid(user.uid)
end
# Execute the provided block in a child process as the specified user
# The parent blocks until the child finishes.
- def as_user(user = @login_user, proctitle:)
+ def as_user(user = login_user, proctitle:)
self.proctitle = "#{self.class.name.underscore}(#{user.username}) -> #{proctitle}"
fork do
drop_priv(user)
yield(user) if block_given?
end
end
+
+ User = Struct.new(:username, :uid, :gid)
+ def login_user
+ @login_user ||= begin
+ username = ENV["SUDO_USER"] || Etc.getlogin
+ uid = `id -u #{username}`.chomp.to_i
+ gid = `id -g #{username}`.chomp.to_i
+ User.new(username, uid, gid)
+ end
+ end
+ module_function :login_user
end
end
end
end