From 12f88d83421aaee9cdf72f9ba4c2587c7f0f44e3 Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Tue, 3 Sep 2024 17:29:47 -0700 Subject: [PATCH 1/8] Override user directory. --- app/user_manager.py | 1 + comfy/cli_args.py | 1 + folder_paths.py | 15 +++++++++++++++ main.py | 5 +++++ 4 files changed, 22 insertions(+) diff --git a/app/user_manager.py b/app/user_manager.py index 95ad157c3a6b..9d99204b3814 100644 --- a/app/user_manager.py +++ b/app/user_manager.py @@ -20,6 +20,7 @@ def __init__(self): self.settings = AppSettings(self) if not os.path.exists(user_directory): + print('Creating user directory: ', user_directory) os.mkdir(user_directory) if not args.multi_user: print("****** User settings have been changed to be stored on the server instead of browser storage. ******") diff --git a/comfy/cli_args.py b/comfy/cli_args.py index 65b879907f63..75b19c0096c4 100644 --- a/comfy/cli_args.py +++ b/comfy/cli_args.py @@ -47,6 +47,7 @@ def __call__(self, parser, namespace, values, option_string=None): parser.add_argument("--output-directory", type=str, default=None, help="Set the ComfyUI output directory.") parser.add_argument("--temp-directory", type=str, default=None, help="Set the ComfyUI temp directory (default is in the ComfyUI directory).") parser.add_argument("--input-directory", type=str, default=None, help="Set the ComfyUI input directory.") +parser.add_argument("--user-directory", type=str, default=None, help="Set the ComfyUI user directory.") parser.add_argument("--auto-launch", action="store_true", help="Automatically launch ComfyUI in the default browser.") parser.add_argument("--disable-auto-launch", action="store_true", help="Disable auto launching the browser.") parser.add_argument("--cuda-device", type=int, default=None, metavar="DEVICE_ID", help="Set the id of the cuda device this instance will use.") diff --git a/folder_paths.py b/folder_paths.py index d7a7e0c3d24a..949b138c2735 100644 --- a/folder_paths.py +++ b/folder_paths.py @@ -84,6 +84,14 @@ def get_input_directory() -> str: global input_directory return input_directory +def get_user_directory() -> str: + global user_directory + return user_directory + +def set_user_directory(user_dir: str) -> None: + global user_directory + user_directory = user_dir + #NOTE: used in http server so don't put folders that should not be accessed remotely def get_directory_by_type(type_name: str) -> str | None: @@ -166,6 +174,13 @@ def add_model_folder_path(folder_name: str, full_folder_path: str) -> None: else: folder_names_and_paths[folder_name] = ([full_folder_path], set()) +def replace_folder_path(folder_name: str, full_folder_path: str) -> None: + global folder_names_and_paths + folder_name = map_legacy(folder_name) + if folder_name in folder_names_and_paths: + folder_names_and_paths[folder_name] = full_folder_path + + def get_folder_paths(folder_name: str) -> list[str]: folder_name = map_legacy(folder_name) return folder_names_and_paths[folder_name][0][:] diff --git a/main.py b/main.py index 748846b4a69a..00b49fc4ce82 100644 --- a/main.py +++ b/main.py @@ -232,6 +232,11 @@ def cleanup_temp(): input_dir = os.path.abspath(args.input_directory) logging.info(f"Setting input directory to: {input_dir}") folder_paths.set_input_directory(input_dir) + + if args.user_directory: + user_dir = os.path.abspath(args.user_directory) + logging.info(f"Setting user directory to: {user_dir}") + folder_paths.set_user_directory(user_dir) if args.quick_test_for_ci: exit(0) From 5440eb7e1a71f9f7922e506c53e655de5dae9863 Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Wed, 4 Sep 2024 12:12:59 -0700 Subject: [PATCH 2/8] Use overridden user directory. --- app/user_manager.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/user_manager.py b/app/user_manager.py index 9d99204b3814..f9ce80b94912 100644 --- a/app/user_manager.py +++ b/app/user_manager.py @@ -7,16 +7,15 @@ from aiohttp import web from urllib import parse from comfy.cli_args import args -from folder_paths import user_directory +import folder_paths from .app_settings import AppSettings default_user = "default" -users_file = os.path.join(user_directory, "users.json") class UserManager(): def __init__(self): - global user_directory + user_directory = folder_paths.get_user_directory() self.settings = AppSettings(self) if not os.path.exists(user_directory): @@ -35,6 +34,9 @@ def __init__(self): else: self.users = {"default": "default"} + def get_users_file(self): + return os.path.join(folder_paths.get_user_directory(), "users.json") + def get_request_user_id(self, request): user = "default" if args.multi_user and "comfy-user" in request.headers: @@ -46,7 +48,7 @@ def get_request_user_id(self, request): return user def get_request_user_filepath(self, request, file, type="userdata", create_dir=True): - global user_directory + user_directory = folder_paths.get_user_directory() if type == "userdata": root_dir = user_directory @@ -55,6 +57,7 @@ def get_request_user_filepath(self, request, file, type="userdata", create_dir=T user = self.get_request_user_id(request) path = user_root = os.path.abspath(os.path.join(root_dir, user)) + print(f"User: {user}, Path: {path}") # prevent leaving /{type} if os.path.commonpath((root_dir, user_root)) != root_dir: @@ -87,7 +90,7 @@ def add_user(self, name): self.users[user_id] = name global users_file - with open(users_file, "w") as f: + with open(self.get_users_file(), "w") as f: json.dump(self.users, f) return user_id From d65af573031f733c8d853f2dc9f07680e5cd4953 Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Mon, 9 Sep 2024 15:20:32 +0900 Subject: [PATCH 3/8] Remove prints. --- app/user_manager.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/user_manager.py b/app/user_manager.py index f9ce80b94912..aa8d35834639 100644 --- a/app/user_manager.py +++ b/app/user_manager.py @@ -19,7 +19,6 @@ def __init__(self): self.settings = AppSettings(self) if not os.path.exists(user_directory): - print('Creating user directory: ', user_directory) os.mkdir(user_directory) if not args.multi_user: print("****** User settings have been changed to be stored on the server instead of browser storage. ******") @@ -57,7 +56,6 @@ def get_request_user_filepath(self, request, file, type="userdata", create_dir=T user = self.get_request_user_id(request) path = user_root = os.path.abspath(os.path.join(root_dir, user)) - print(f"User: {user}, Path: {path}") # prevent leaving /{type} if os.path.commonpath((root_dir, user_root)) != root_dir: From ffaf78cf97a51d655e3143ea44efb4956a51605b Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Mon, 9 Sep 2024 15:31:05 +0900 Subject: [PATCH 4/8] Remove references to global user_files. --- app/user_manager.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/user_manager.py b/app/user_manager.py index aa8d35834639..62c22cde5ed5 100644 --- a/app/user_manager.py +++ b/app/user_manager.py @@ -25,8 +25,8 @@ def __init__(self): print("****** For multi-user setups add the --multi-user CLI argument to enable multiple user profiles. ******") if args.multi_user: - if os.path.isfile(users_file): - with open(users_file) as f: + if os.path.isfile(self.get_users_file()): + with open(self.get_users_file()) as f: self.users = json.load(f) else: self.users = {} @@ -87,7 +87,6 @@ def add_user(self, name): self.users[user_id] = name - global users_file with open(self.get_users_file(), "w") as f: json.dump(self.users, f) From 5af7a9ef615f9aefdc29fd06d9de7bce38994a51 Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Mon, 9 Sep 2024 15:31:14 +0900 Subject: [PATCH 5/8] Remove unused replace_folder function. --- folder_paths.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/folder_paths.py b/folder_paths.py index 949b138c2735..ea4ecc2ac0ee 100644 --- a/folder_paths.py +++ b/folder_paths.py @@ -174,12 +174,6 @@ def add_model_folder_path(folder_name: str, full_folder_path: str) -> None: else: folder_names_and_paths[folder_name] = ([full_folder_path], set()) -def replace_folder_path(folder_name: str, full_folder_path: str) -> None: - global folder_names_and_paths - folder_name = map_legacy(folder_name) - if folder_name in folder_names_and_paths: - folder_names_and_paths[folder_name] = full_folder_path - def get_folder_paths(folder_name: str) -> list[str]: folder_name = map_legacy(folder_name) From cb34a1c411945816e4771261a9ad005fe8b93ca7 Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Mon, 9 Sep 2024 15:31:37 +0900 Subject: [PATCH 6/8] Remove newline. --- folder_paths.py | 1 - 1 file changed, 1 deletion(-) diff --git a/folder_paths.py b/folder_paths.py index ea4ecc2ac0ee..38076b5bc743 100644 --- a/folder_paths.py +++ b/folder_paths.py @@ -174,7 +174,6 @@ def add_model_folder_path(folder_name: str, full_folder_path: str) -> None: else: folder_names_and_paths[folder_name] = ([full_folder_path], set()) - def get_folder_paths(folder_name: str) -> list[str]: folder_name = map_legacy(folder_name) return folder_names_and_paths[folder_name][0][:] From a470108e492555f4fa83e684128eacc72dfe256e Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Mon, 9 Sep 2024 17:35:17 +0900 Subject: [PATCH 7/8] Remove global during get_user_directory. --- folder_paths.py | 1 - 1 file changed, 1 deletion(-) diff --git a/folder_paths.py b/folder_paths.py index 38076b5bc743..263704a4c800 100644 --- a/folder_paths.py +++ b/folder_paths.py @@ -85,7 +85,6 @@ def get_input_directory() -> str: return input_directory def get_user_directory() -> str: - global user_directory return user_directory def set_user_directory(user_dir: str) -> None: From da98c01c5ba38c1292c291cc23526cfb9d0db283 Mon Sep 17 00:00:00 2001 From: Robin Huang Date: Wed, 11 Sep 2024 17:13:41 +0900 Subject: [PATCH 8/8] Add validation. --- comfy/cli_args.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/comfy/cli_args.py b/comfy/cli_args.py index 75b19c0096c4..d0f7064320e3 100644 --- a/comfy/cli_args.py +++ b/comfy/cli_args.py @@ -47,7 +47,6 @@ def __call__(self, parser, namespace, values, option_string=None): parser.add_argument("--output-directory", type=str, default=None, help="Set the ComfyUI output directory.") parser.add_argument("--temp-directory", type=str, default=None, help="Set the ComfyUI temp directory (default is in the ComfyUI directory).") parser.add_argument("--input-directory", type=str, default=None, help="Set the ComfyUI input directory.") -parser.add_argument("--user-directory", type=str, default=None, help="Set the ComfyUI user directory.") parser.add_argument("--auto-launch", action="store_true", help="Automatically launch ComfyUI in the default browser.") parser.add_argument("--disable-auto-launch", action="store_true", help="Disable auto launching the browser.") parser.add_argument("--cuda-device", type=int, default=None, metavar="DEVICE_ID", help="Set the id of the cuda device this instance will use.") @@ -172,6 +171,8 @@ def is_valid_directory(path: Optional[str]) -> Optional[str]: help="The local filesystem path to the directory where the frontend is located. Overrides --front-end-version.", ) +parser.add_argument("--user-directory", type=is_valid_directory, default=None, help="Set the ComfyUI user directory with an absolute path.") + if comfy.options.args_parsing: args = parser.parse_args() else: