1818 shell: string
1919 ]
2020
21+ proc cgetenv * (name: cstring ): cstring
22+ {.importc : " getenv" , header : " <stdlib.h>" .}
23+
24+ proc csetenv * (name: cstring , value: cstring , override: cint ): cint
25+ {.importc : " setenv" , header : " <stdlib.h>" .}
26+
27+ proc cunsetenv * (name: cstring ): cint
28+ {.importc : " unsetenv" , header : " <stdlib.h>" .}
29+
2130const
22- pkgLibDir* = getenv (" PROG_PKGLIBDIR" )
23- localStateDir* = getenv (" PROG_LOCALSTATEDIR" )
24- sysConfDir* = getenv (" PROG_SYSCONFDIR" )
31+ pkgLibDir* = getEnv (" PROG_PKGLIBDIR" )
32+ localStateDir* = getEnv (" PROG_LOCALSTATEDIR" )
33+ sysConfDir* = getEnv (" PROG_SYSCONFDIR" )
2534
2635 bashCmd* = " /bin/bash"
2736 suCmd* = " /usr/bin/su"
@@ -199,12 +208,6 @@ proc forkWaitRedirect*(call: () -> int): tuple[output: seq[string], code: int] =
199208
200209 (lines, code)
201210
202- proc setenv * (name: cstring , value: cstring , override: cint ): cint
203- {.importc , header : " <stdlib.h>" .}
204-
205- proc unsetenv * (name: cstring ): cint
206- {.importc , header : " <stdlib.h>" .}
207-
208211proc getgrouplist * (user: cstring , group: Gid , groups: ptr cint , ngroups: var cint ): cint
209212 {.importc , header : " <grp.h>" .}
210213
@@ -232,13 +235,13 @@ proc getUser(uid: int): User =
232235let currentUser* = getUser (getuid ().int )
233236
234237let initialUser* = try :
235- let sudoUid = getenv (" SUDO_UID" )
236- let polkitUid = getenv (" PKEXEC_UID" )
238+ let sudoUid = getEnv (" SUDO_UID" )
239+ let polkitUid = getEnv (" PKEXEC_UID" )
237240
238- let uidString = if sudoUid != nil and sudoUid .len > 0 :
239- some ($ sudoUid)
240- elif polkitUid != nil and polkitUid .len > 0 :
241- some ($ polkitUid)
241+ let uidString = if sudoUid.len > 0 :
242+ some (sudoUid)
243+ elif polkitUid.len > 0 :
244+ some (polkitUid)
242245 else :
243246 none (string )
244247
@@ -257,8 +260,22 @@ proc dropPrivileges*() =
257260 discard setgroups (user.groups.len, addr (groups[0 ]));
258261 discard setgid ((Gid ) user.gid)
259262 discard setuid ((Uid ) user.uid)
260- discard setenv (" HOME" , user.home, 1 )
261- discard setenv (" SHELL" , user.shell, 1 )
263+
264+ template replaceExisting (name: string , value: string ) =
265+ if cgetenv (name) != nil :
266+ discard csetenv (name, value, 1 )
267+
268+ replaceExisting (" USER" , user.name)
269+ replaceExisting (" USERNAME" , user.name)
270+ replaceExisting (" LOGNAME" , user.name)
271+ replaceExisting (" HOME" , user.home)
272+ replaceExisting (" SHELL" , user.shell)
273+
274+ discard cunsetenv (" SUDO_COMMAND" )
275+ discard cunsetenv (" SUDO_USER" )
276+ discard cunsetenv (" SUDO_UID" )
277+ discard cunsetenv (" SUDO_GID" )
278+ discard cunsetenv (" PKEXEC_UID" )
262279
263280proc toString * [T](arr: array [T, char ], length: Option [int ]): string =
264281 var workLength = length.get (T.high + 1 )
0 commit comments