2019-06-09 17:14:18 +02:00
|
|
|
|
|
|
|
lib LibC
|
|
|
|
struct Passwd
|
|
|
|
pw_name : Char*
|
|
|
|
pw_passwd : Char*
|
|
|
|
pw_uid : UInt
|
|
|
|
pw_gid : UInt
|
|
|
|
pw_gecos : Char*
|
|
|
|
pw_dir : UInt
|
|
|
|
pw_shell : Char*
|
|
|
|
end
|
|
|
|
|
|
|
|
fun setuid(Int32) : Int32
|
|
|
|
fun setgid(Int32) : Int32
|
|
|
|
fun getpwnam(Char*) : Passwd*
|
2020-01-04 13:15:19 +01:00
|
|
|
|
|
|
|
fun initgroups(Char*, Int32) : Int32
|
2019-06-09 17:14:18 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
module System
|
|
|
|
def self.become_user(user_name : String)
|
|
|
|
pointer = LibC.getpwnam user_name.to_unsafe
|
|
|
|
|
|
|
|
if pointer.null?
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
|
|
|
passwd = pointer.value
|
|
|
|
|
2020-01-04 13:15:19 +01:00
|
|
|
uid = passwd.pw_uid
|
|
|
|
gid = passwd.pw_gid
|
|
|
|
|
|
|
|
r = LibC.initgroups user_name, passwd.pw_gid
|
2020-04-20 12:30:57 +02:00
|
|
|
# raise Errno.new "initgroups" if r != 0
|
|
|
|
raise Exception.new "initgroups" if r != 0
|
2019-11-17 20:06:42 +01:00
|
|
|
|
|
|
|
r = LibC.setgid gid
|
2020-04-20 12:30:57 +02:00
|
|
|
# raise Errno.new "setgid" if r != 0
|
|
|
|
raise Exception.new "setgid" if r != 0
|
2019-06-09 17:14:18 +02:00
|
|
|
|
2019-11-17 20:06:42 +01:00
|
|
|
r = LibC.setuid uid
|
2020-04-20 12:30:57 +02:00
|
|
|
# raise Errno.new "setuid" if r != 0
|
|
|
|
raise Exception.new "setuid" if r != 0
|
2019-06-09 17:14:18 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|