diff --git a/commands/cmd_wdir.py b/commands/cmd_wdir.py index 1e48db2..4ada584 100644 --- a/commands/cmd_wdir.py +++ b/commands/cmd_wdir.py @@ -1,6 +1,7 @@ import requests from bs4 import BeautifulSoup -from colorama import Fore +from urllib.parse import urljoin, urlparse +from colorama import Fore, Style class WdirCommand: def __init__(self, url): @@ -8,45 +9,50 @@ class WdirCommand: def run(self): if not self.url: - print(Fore.RED + "Usage: wdir ") + print(Fore.RED + "Usage: wdir " + Style.RESET_ALL) return + # Ensure URL has scheme if not self.url.startswith("http://") and not self.url.startswith("https://"): self.url = "http://" + self.url try: - response = requests.get(self.url, timeout=5) - if response.status_code != 200: - print(Fore.RED + f"Failed to fetch URL (status {response.status_code})") - return + print(Fore.CYAN + f"[FETCH] Scanning directory at {self.url}..." + Style.RESET_ALL) + resp = requests.get(self.url, timeout=5) + resp.raise_for_status() + except Exception as e: + print(Fore.RED + f"[ERR] Failed to fetch {self.url}: {e}" + Style.RESET_ALL) + return - soup = BeautifulSoup(response.text, "html.parser") - links = soup.find_all("a") + soup = BeautifulSoup(resp.text, "html.parser") + links = soup.find_all("a") - files = [] - dirs = [] + files = [] + for link in links: + href = link.get("href") + if not href: + continue - for link in links: - href = link.get("href") - if not href or href.startswith("?") or href.startswith("#"): - continue - if href in ("../", "/"): - continue # skip parent link - if href.endswith("/"): - dirs.append(href) - else: - files.append(href) + # Skip parent directory and in-page anchors + if href.startswith("?") or href.startswith("#") or href == "../": + continue - if not files and not dirs: - print(Fore.YELLOW + "No directory listing found (site may not expose files).") - return + full_url = urljoin(self.url, href) + filename = href.split("/")[-1] - print(Fore.CYAN + f"Directory listing for {self.url}:\n") + # Determine file type + if "." in filename: + ext = filename.split(".")[-1].lower() + ftype = f".{ext} file" + else: + ftype = "Directory" - for d in dirs: - print(Fore.BLUE + f"[DIR] {d}") - for f in files: - print(Fore.GREEN + f"[FILE] {f}") + files.append((filename, ftype, full_url)) - except requests.exceptions.RequestException as e: - print(Fore.RED + f"Error fetching URL: {e}") + if not files: + print(Fore.YELLOW + "No files or directories found (maybe directory listing is disabled)." + Style.RESET_ALL) + return + + print(Fore.GREEN + "\nFiles found:" + Style.RESET_ALL) + for fname, ftype, furl in files: + print(f" {Fore.CYAN}{fname:<30}{Style.RESET_ALL} {Fore.WHITE}→ {ftype}{Style.RESET_ALL}")