diff --git a/cli/onionshare_cli/__init__.py b/cli/onionshare_cli/__init__.py index 0a7a1d3c..cea445a9 100644 --- a/cli/onionshare_cli/__init__.py +++ b/cli/onionshare_cli/__init__.py @@ -43,57 +43,7 @@ def main(cwd=None): onionshare uses. """ common = Common() - - # Display OnionShare banner - print(f"OnionShare {common.version} | https://onionshare.org/") - reset = "\033[0m" - purple = "\33[95m" - print(purple) - print(" @@@@@@@@@ ") - print(" @@@@@@@@@@@@@@@@@@@ ") - print(" @@@@@@@@@@@@@@@@@@@@@@@@@ ") - print(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ") - print( - " @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ___ _ " - ) - print( - " @@@@@@ @@@@@@@@@@@@@ / _ \\ (_) " - ) - print( - " @@@@ @ @@@@@@@@@@@ | | | |_ __ _ ___ _ __ " - ) - print( - " @@@@@@@@ @@@@@@@@@@ | | | | '_ \\| |/ _ \\| '_ \\ " - ) - print( - " @@@@@@@@@@@@ @@@@@@@@@@ \\ \\_/ / | | | | (_) | | | | " - ) - print( - " @@@@@@@@@@@@@@@@ @@@@@@@@@ \\___/|_| |_|_|\\___/|_| |_| " - ) - print( - " @@@@@@@@@ @@@@@@@@@@@@@@@@ _____ _ " - ) - print( - " @@@@@@@@@@ @@@@@@@@@@@@ / ___| | " - ) - print( - " @@@@@@@@@@ @@@@@@@@ \\ `--.| |__ __ _ _ __ ___ " - ) - print( - " @@@@@@@@@@@ @ @@@@ `--. \\ '_ \\ / _` | '__/ _ \\" - ) - print( - " @@@@@@@@@@@@@ @@@@@@ /\\__/ / | | | (_| | | | __/" - ) - print( - " @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ \\____/|_| |_|\\__,_|_| \\___|" - ) - print(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ") - print(" @@@@@@@@@@@@@@@@@@@@@@@@@ ") - print(" @@@@@@@@@@@@@@@@@@@ ") - print(" @@@@@@@@@ ") - print(reset) + common.display_banner() # OnionShare CLI in OSX needs to change current working directory (#132) if common.platform == "Darwin": @@ -143,6 +93,12 @@ def main(cwd=None): help="Filename of persistent session", ) # General args + parser.add_argument( + "--title", + metavar="TITLE", + default=None, + help="Set a title", + ) parser.add_argument( "--public", action="store_true", @@ -246,6 +202,7 @@ def main(cwd=None): connect_timeout = int(args.connect_timeout) config_filename = args.config persistent_filename = args.persistent + title = args.title public = bool(args.public) autostart_timer = int(args.autostart_timer) autostop_timer = int(args.autostop_timer) @@ -294,6 +251,7 @@ def main(cwd=None): if mode_settings.just_created: # This means the mode settings were just created, not loaded from disk + mode_settings.set("general", "title", title) mode_settings.set("general", "public", public) mode_settings.set("general", "autostart_timer", autostart_timer) mode_settings.set("general", "autostop_timer", autostop_timer) diff --git a/cli/onionshare_cli/common.py b/cli/onionshare_cli/common.py index e812aa98..0b0d084f 100644 --- a/cli/onionshare_cli/common.py +++ b/cli/onionshare_cli/common.py @@ -44,8 +44,13 @@ class Common: """ C_RESET = "\033[0m" + C_BG_PURPLE = "\033[45m" + C_BOLD = "\033[01m" + C_WHITE = "\033[97m" C_LIGHTGRAY = "\033[37m" C_DARKGRAY = "\033[90m" + C_LIGHTPURPLE = "\033[95m" + C_DARKPURPLE = "\033[35m" def __init__(self, verbose=False): self.verbose = verbose @@ -59,6 +64,248 @@ class Common: with open(self.get_resource_path("version.txt")) as f: self.version = f.read().strip() + def display_banner(self): + """ + Raw ASCII art example: + ╭───────────────────────────────────────────╮ + │ * ▄▄█████▄▄ * │ + │ ▄████▀▀▀████▄ * │ + │ ▀▀█▀ ▀██▄ │ + │ * ▄█▄ ▀██▄ │ + │ ▄█████▄ ███ -+- │ + │ ███ ▀█████▀ │ + │ ▀██▄ ▀█▀ │ + │ * ▀██▄ ▄█▄▄ * │ + │ * ▀████▄▄▄████▀ │ + │ ▀▀█████▀▀ │ + │ -+- * │ + │ ▄▀▄ ▄▀▀ █ │ + │ █ █ ▀ ▀▄ █ │ + │ █ █ █▀▄ █ ▄▀▄ █▀▄ ▀▄ █▀▄ ▄▀▄ █▄▀ ▄█▄ │ + │ ▀▄▀ █ █ █ ▀▄▀ █ █ ▄▄▀ █ █ ▀▄█ █ ▀▄▄ │ + │ │ + │ v2.3.1 │ + │ │ + │ https://onionshare.org/ │ + ╰───────────────────────────────────────────╯ + """ + + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "╭───────────────────────────────────────────╮" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_LIGHTPURPLE + + " * " + + self.C_WHITE + + "▄▄█████▄▄" + + self.C_LIGHTPURPLE + + " * " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_WHITE + + " ▄████▀▀▀████▄" + + self.C_LIGHTPURPLE + + " * " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_WHITE + + " ▀▀█▀ ▀██▄ " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_LIGHTPURPLE + + " * " + + self.C_WHITE + + "▄█▄ ▀██▄ " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_WHITE + + " ▄█████▄ ███" + + self.C_LIGHTPURPLE + + " -+- " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_WHITE + + " ███ ▀█████▀ " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_WHITE + + " ▀██▄ ▀█▀ " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_LIGHTPURPLE + + " * " + + self.C_WHITE + + "▀██▄ ▄█▄▄" + + self.C_LIGHTPURPLE + + " * " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_LIGHTPURPLE + + " * " + + self.C_WHITE + + "▀████▄▄▄████▀ " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_WHITE + + " ▀▀█████▀▀ " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_LIGHTPURPLE + + " -+- * " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_WHITE + + " ▄▀▄ ▄▀▀ █ " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_WHITE + + " █ █ ▀ ▀▄ █ " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_WHITE + + " █ █ █▀▄ █ ▄▀▄ █▀▄ ▀▄ █▀▄ ▄▀▄ █▄▀ ▄█▄ " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_WHITE + + " ▀▄▀ █ █ █ ▀▄▀ █ █ ▄▄▀ █ █ ▀▄█ █ ▀▄▄ " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│ │" + + self.C_RESET + ) + left_spaces = (43 - len(self.version) - 1) // 2 + right_spaces = left_spaces + if left_spaces + len(self.version) + right_spaces < 43: + right_spaces += 1 + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_LIGHTGRAY + + f"{' '*left_spaces}v{self.version}{' '*right_spaces}" + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│ │" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "│" + + self.C_LIGHTGRAY + + " https://onionshare.org/ " + + self.C_LIGHTGRAY + + "│" + + self.C_RESET + ) + print( + self.C_BG_PURPLE + + self.C_LIGHTGRAY + + "╰───────────────────────────────────────────╯" + + self.C_RESET + ) + print() + def load_settings(self, config=None): """ Loading settings, optionally from a custom config json file. @@ -130,16 +377,24 @@ class Common: try: appdata = os.environ["APPDATA"] onionshare_data_dir = f"{appdata}\\OnionShare" - except: + except Exception: # If for some reason we don't have the 'APPDATA' environment variable # (like running tests in Linux while pretending to be in Windows) - onionshare_data_dir = os.path.expanduser("~/.config/onionshare") + try: + xdg_config_home = os.environ["XDG_CONFIG_HOME"] + onionshare_data_dir = f"{xdg_config_home}/onionshare" + except: + onionshare_data_dir = os.path.expanduser("~/.config/onionshare") elif self.platform == "Darwin": onionshare_data_dir = os.path.expanduser( "~/Library/Application Support/OnionShare" ) else: - onionshare_data_dir = os.path.expanduser("~/.config/onionshare") + try: + xdg_config_home = os.environ["XDG_CONFIG_HOME"] + onionshare_data_dir = f"{xdg_config_home}/onionshare" + except: + onionshare_data_dir = os.path.expanduser("~/.config/onionshare") # Modify the data dir if running tests if getattr(sys, "onionshare_test_mode", False): @@ -257,7 +512,7 @@ class Common: try: tmpsock.bind(("127.0.0.1", random.randint(min_port, max_port))) break - except OSError as e: + except OSError: pass _, port = tmpsock.getsockname() return port diff --git a/cli/onionshare_cli/mode_settings.py b/cli/onionshare_cli/mode_settings.py index 7b545623..25d4e837 100644 --- a/cli/onionshare_cli/mode_settings.py +++ b/cli/onionshare_cli/mode_settings.py @@ -42,6 +42,7 @@ class ModeSettings: }, "persistent": {"mode": None, "enabled": False}, "general": { + "title": None, "public": False, "autostart_timer": False, "autostop_timer": False, diff --git a/cli/onionshare_cli/resources/templates/chat.html b/cli/onionshare_cli/resources/templates/chat.html index b4443c09..7156d58c 100644 --- a/cli/onionshare_cli/resources/templates/chat.html +++ b/cli/onionshare_cli/resources/templates/chat.html @@ -2,7 +2,7 @@
-