marlonrichert / zsh-snap

⚡️ Znap! Fast, easy-to-use tools for Zsh dotfiles & plugins, plus git repos
MIT License
1.34k stars 41 forks source link

Using `su` can cause `$XDG_*` vars to get set to subfolders of `/root`, which messes up Znap initialization #183

Open pedromarquetti opened 2 years ago

pedromarquetti commented 2 years ago

Describe the bug

I just started using znap, followed the basic dotfiles usage for my (phlm) and root users, but when I $ sudo su then # su phlm, some "zf_mkdir" errors appear, followed by an infinite autocomplete loop

Steps To Reproduce

sudo su
su <your user>

Expected behavior

Normal switch between root user and my user with sudo su and su <my user>

Observed behavior

Currently, when I su <my user> after doing sudo su, apparently my shell is trying to mkdir /root/.local (even though I just switched to my non-root user with su), see log below

Click to expand

phlm% whoami
phlm
phlm% sudo su
[sudo] password for phlm: 
phlm# whoami
root
phlm# su phlm
init.zsh:zf_mkdir:44: cannot make directory '/root/.local': permission denied
init.zsh:zf_mkdir:44: cannot make directory '/root/.cache': permission denied
init.zsh:zf_mkdir:44: cannot make directory '/root/.cache': permission denied
init.zsh:zf_mkdir:44: cannot make directory '/root/.config': permission denied
init.zsh:zf_mkdir:44: cannot make directory '/root/.local': permission denied
init.zsh:zf_ln:61: /home/phlm/Git/zsh-snap/functions/_znap: permission denied
.autocomplete.__init__:zf_mkdir:81: cannot make directory '/root/.local': permission denied
.autocomplete.__init__:zf_mkdir:85: cannot make directory '/root/.local': permission denied
.autocomplete.__init__:zf_mkdir:103: cannot make directory '/root/.cache': permission denied
.autocomplete.async.start:6: permission denied: /root/.local/share/zsh-autocomplete/log/2022-07-01.async.log
.autocomplete.async.complete.fd-widget:3: permission denied: /root/.local/share/zsh-autocomplete/log/2022-07-01.log

... infinite loop ...

Environment:

Additional context

I used Oh My Zsh previously and it was working fine with only zsh-autocomplete, zsh-autosuggestions and zsh-syntax-highlighting, I wanted to change to zsnap for being light-weight. I'll include my zshrc, but I changed it multiple times, still the same result...

My .zshrc

# Download Znap, if it's not there yet.
[[ -f ~/Git/zsh-snap/znap.zsh ]] ||
    git clone --depth 1 -- \
        https://github.com/marlonrichert/zsh-snap.git ~/Git/zsh-snap

source ~/Git/zsh-snap/znap.zsh  # Start Znap

# `znap source` automatically downloads and starts your plugins.
znap source marlonrichert/zsh-autocomplete
znap source zsh-users/zsh-autosuggestions
znap source zsh-users/zsh-syntax-highlighting

Am I doing something wrong?

marlonrichert commented 2 years ago

Looks like, when you do su <user> either

and when using su <user>, /root is not writable and /home/<user>/Git/zsh-snap is not readable.

marlonrichert commented 2 years ago

Can you try doing su -m user? Does that solve the problem?

pedromarquetti commented 2 years ago

Can you try doing su -m user? Does that solve the problem?

It does solve the problem, it doesn't try to write to /root/, but then znap + auto-complete and auto-suggestions is not loaded.

marlonrichert commented 2 years ago

Does it give any error messages?

pedromarquetti commented 2 years ago

No. It only shows the default phlm% prompt. Do you think it's some misconfiguration? I could also send some log files (the ones that were able to be written)

Also, just to add, if I comment out znap source marlonrichert/zsh-autocomplete from .zshrc, the infinite loop doesn't happen, but it still gives the permission denied error that I mentioned

marlonrichert commented 2 years ago

Before doing su, can you put set -vx in your .zshrc file (before sourcing Zsh Autocomplete) and share the output here in a file?

pedromarquetti commented 2 years ago

Ok, so I don't understand why set -xv >/tmp/zsh.log is not working when doing sudo su > su phlm , I had to manually copy my terminal.

The log i got after doing su with zsh-autocomplete, there's an long loop there, i had to su phlm to stop it. zsh-autocomplete.log

The log I got after I ran su without zsh-autocomplete sourced: zshrc.log

Hope this helps

marlonrichert commented 2 years ago

Your zsh-autocomplete.log is 0 KB. Did your upload fail somehow?

marlonrichert commented 2 years ago

What happens if, instead of using znap source to start Zsh Autocomplete, you use just source?

pedromarquetti commented 2 years ago

Your zsh-autocomplete.log is 0 KB. Did your upload fail somehow?

Now it uploaded correctly zsh-autocomplete.log, I did su phlm at the end to stop the loop.

What happens if, instead of using znap source to start Zsh Autocomplete, you use just source?

If I do source ~/Git/zsh-autocomplete/zsh-autocomplete.plugin.zsh, same loop occurs

marlonrichert commented 2 years ago

Can you comment out most of the things in your .zshrc and leave only the minimum that’s necessary to reproduce the bug? Then share your debug output here again.

pedromarquetti commented 2 years ago

I commented out everything and did the test 4 times:

no-autocomplete with set -vx after sourcing znap.zsh no-autocomplete and set -vx before sourcing znap.zsh with autocomplete enabled, with set -vx after sourcing znap.zsh autocomplete enabled and set -vx before sourcing znap.zsh

pedromarquetti commented 2 years ago

What is "XDG_CACHE_HOME", "XDG_CONFIG_HOME" and "XDG_DATA_HOME" used for? I added

export XDG_CACHE_HOME=$HOME/.cache
export XDG_CONFIG_HOME=$HOME/.config
export XDG_DATA_HOME=~/.local/share

At the beginning of my .zshrc and no errors or infinite loops occur

marlonrichert commented 2 years ago

OK, thanks. That’s a good clue.

In your .zshrc, before setting or exporting those, can you add

print -lr "${(q+)HOME}" "${(q+)XDG_CACHE_HOME}" "${(q+)XDG_CONFIG_HOME}" "${(q+)XDG_DATA_HOME}"

and share the output here?

pedromarquetti commented 2 years ago
/home/phlm
''
''
''
~ $ sudo su                                                                         
[sudo] password for phlm: 
~ # su phlm                                                                
/home/phlm
/root/.cache
/root/.config
/root/.local/share                                                                            
marlonrichert commented 2 years ago

OK, so, for some reason, when you expand your user's privileges with su, then $XDG_CACHE_HOME, $XDG_CONFIG_HOME and $XDG_DATA_HOME get set. You need to disable this somehow.

Can you check the following files and see if they get set somewhere in there?

/etc/zshenv
/etc/zprofile
/etc/zshrc
/etc/zlogin
/etc/zlogout
pedromarquetti commented 1 year ago

Zsh has its own zsh folder inside /etc/, with

-rw-r--r-- 1 root root  344 Feb 12  2022 zlogin
-rw-r--r-- 1 root root   58 Feb 12  2022 zlogout
-rw-r--r-- 1 root root  264 Feb 12  2022 zprofile
-rw-r--r-- 1 root root  623 Feb 12  2022 zshenv
-rw-r--r-- 1 root root 3900 Feb 12  2022 zshrc

all of the files insite /etc/zsh are unchanged, and XDG variables do not get set in any of them

marlonrichert commented 1 year ago

What needs to be done is

  1. For each XDG dir, check if it is writable for us.
  2. If not, set it to the default value instead.
  3. If the default value is not writable to us either, then bail out and show an informative error.

Pull requests welcome. 🙂

pedromarquetti commented 1 month ago

@marlonrichert Should I close this issue? I discovered my problem was in how i switched users: if i use sudo -i to switch to root user and use exit to go back + if i switch to a less privileged user with su -l and go back with exit, all XDG variables run normally and no errors occur