#!/bin/bash
# Optimized Script to Fix Permissions of cPanel Accounts

if [ "$#" -lt 1 ]; then
  echo "Usage: $0 username1 [username2 ...]"
  exit 1
fi

for user in "$@"; do

  HOMEDIR=$(getent passwd "$user" | cut -d: -f6)

  if [ ! -f "/var/cpanel/users/$user" ]; then
    echo "Error: User file for '$user' missing. Likely an invalid cPanel user."
    continue
  elif [ -z "$HOMEDIR" ] || [ ! -d "$HOMEDIR" ]; then
    echo "Error: Couldn't determine a valid home directory for '$user'."
    continue
  fi

  echo "Setting ownership for user: $user"
  chown -R "$user:$user" "$HOMEDIR"
  chmod 711 "$HOMEDIR"

  # Ensure necessary ownership settings
  chown "$user:nobody" "$HOMEDIR/public_html" "$HOMEDIR/.htpasswds" 2>/dev/null
  chown "$user:mail" "$HOMEDIR/etc" "$HOMEDIR/etc/"*/shadow "$HOMEDIR/etc/"*/passwd" 2>/dev/null

  echo "Setting permissions for user: $user"

  # Optimize file and directory permissions with depth limit
  find "$HOMEDIR" -maxdepth 5 -type f -exec chmod 644 {} +
  find "$HOMEDIR" -maxdepth 5 -type d -exec chmod 755 {} +
  find "$HOMEDIR" -maxdepth 5 -type d -name cgi-bin -exec chmod 755 {} +
  find "$HOMEDIR" -maxdepth 5 -type f \( -name "*.pl" -o -name "*.perl" \) -exec chmod 755 {} +

  chmod 750 "$HOMEDIR/public_html"

  # Handle CageFS permissions if it exists
  if [ -d "$HOMEDIR/.cagefs" ]; then
    chmod 775 "$HOMEDIR/.cagefs"
    chmod 700 "$HOMEDIR/.cagefs/tmp"
    chmod 700 "$HOMEDIR/.cagefs/var"
    chmod 777 "$HOMEDIR/.cagefs/cache"
    chmod 777 "$HOMEDIR/.cagefs/run"
  fi

  echo "Permissions successfully fixed for user: $user"

done

echo "All users processed."
