mirror of
https://github.com/Comfy-Org/ComfyUI-Manager.git
synced 2026-11-04 23:37:31 +00:00
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Comfy-Org/ComfyUI-Manager#3060
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/Comfy-Org/ComfyUI-Manager/pull/3157
Author: @ltdrdata
Created: 8/13/2026
Status: ✅ Merged
Merged: 8/13/2026
Merged by: @ltdrdata
Base:
main← Head:fix/issue-3128📝 Commits (2)
ffb2f03fix(security-messages): state the actual gate in install-denial messages (#3128)aaed26afix(config): merge write_config() onto disk instead of rebuilding from the startup snapshot (#3128)📊 Changes
4 files changed (+640 additions, -36 deletions)
View changed files
📝
glob/manager_core.py(+158 -26)📝
glob/manager_server.py(+9 -8)📝
js/common.js(+2 -2)➕
tests/test_write_config_persistence.py(+471 -0)📄 Description
Fixes the diagnostic half of #3128, plus a config-persistence data-loss bug in the same area.
1. Install-denial messages state the actual gate
The
allow_git_url_install/allow_pip_installpolicy (introduced in #2991) isflag AND loopback: the install is allowed only when the flag istrueandthe server listens on a loopback address (
is_dedicated_install_allowed=bool(flag) and is_loopback(listen)). The code and the README both documentedthis, but the denial message shipped in #2991 mentioned only the flag:
A user on
--listen 0.0.0.0who set the flag was still denied, with no hint why.This is issue #3128 (C2). The messages now state both conditions, print the live
--listenvalue at the emission site, and give the correct restart guidance(the values are read once at startup — stop the server, edit, then start):
SECURITY_MESSAGE_FLAG_GIT_URL/_FLAG_PIP— both conditions + live listen value.SECURITY_MESSAGE_MIDDLE_OR_BELOW— dropped the non-existent'middle'value;now names only real levels (any value other than
strong).SECURITY_MESSAGE_BLOCKED_RISKinstead ofreusing the security_level message (no security_level value can lift a block).
js/common.jsdedicated-403 messages mirror the loopback clause.No behavior change — only the messages. The predicate is untouched.
2. write_config() no longer reverts hand-edited config.ini
write_config()rebuilt config.ini's[default]section entirely from thestartup snapshot into a fresh parser opened
'w'. Any Manager settings changetherefore silently:
users to edit),
http_channel_enabled,default_cache_as_channel_url),[default]section.get_config()now tracks which keys callers actually change;write_config()re-reads config.ini and overlays only those keys plus the live
preview_method.Hand-edited values, unknown keys, and foreign sections survive; CRLF sanitization
still applies; an unparsable config.ini falls back to a full rewrite instead of
failing every settings endpoint.
Scope
install/uninstall path (#3128 C1) — the client discards the server body and
substitutes a "default channel" lead. Not addressed here.
Verification
tests/test_write_config_persistence.py— pins the three loss classes and thesettings round-trip (5 passed).
carries the live listen value across loopback / arbitrary-loopback / 0.0.0.0
binds; real 403 dialog shows the new copy; hand-edit + foreign key + custom
section survive a settings change.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.