Skip to content

Commit 6571acc

Browse files
committed
Settings UI 에서 secret key management 수정
1 parent e540875 commit 6571acc

File tree

2 files changed

+61
-21
lines changed

2 files changed

+61
-21
lines changed

interface/app_pages/settings_sections/db_section.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,14 +168,23 @@ def render_db_section() -> None:
168168
default_secret = (existing.extra or {}).get(
169169
k, ""
170170
) or _prefill_from_env(new_type, k)
171+
172+
# 비밀키는 값을 미리 채우지 않음 (보안)
173+
placeholder = (
174+
"값 설정됨 (변경하려면 입력)" if default_secret else "값 없음"
175+
)
171176
sv = st.text_input(
172177
label,
173-
value=str(default_secret or ""),
178+
value="",
174179
type="password",
175180
key=f"db_edit_secret_{k}",
181+
placeholder=placeholder,
176182
)
177-
if sv != "":
183+
# 입력값이 없으면 기존 값 유지, 있으면 새 값 사용
184+
if sv:
178185
secrets[k] = sv
186+
elif default_secret:
187+
secrets[k] = default_secret
179188

180189
cols = st.columns([1, 1, 2])
181190
with cols[0]:
@@ -257,7 +266,7 @@ def render_db_section() -> None:
257266

258267
secrets_new: dict[str, str] = {}
259268
for label, k in _secret_fields(db_type):
260-
sv = st.text_input(label, key=f"db_new_secret_{k}")
269+
sv = st.text_input(label, key=f"db_new_secret_{k}", type="password")
261270
if sv != "":
262271
secrets_new[k] = sv
263272

interface/app_pages/settings_sections/llm_section.py

Lines changed: 49 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -139,20 +139,31 @@ def render_llm_section(config: Config | None = None) -> None:
139139
values: dict[str, str | None] = {}
140140
non_secret_values: dict[str, str | None] = {}
141141
for label, env_key, is_secret in fields:
142-
prefill = st.session_state.get(env_key) or os.getenv(env_key) or ""
142+
current_val = st.session_state.get(env_key) or os.getenv(env_key) or ""
143143
if is_secret:
144-
values[env_key] = st.text_input(
145-
label, value=prefill, type="password", key=f"llm_{env_key}"
144+
# 비밀키는 값을 미리 채우지 않음 (보안)
145+
# 값이 설정되어 있으면 placeholder로 표시
146+
placeholder = (
147+
"값 설정됨 (변경하려면 입력)" if current_val else "값 없음"
146148
)
149+
new_val = st.text_input(
150+
label,
151+
value="",
152+
type="password",
153+
key=f"llm_{env_key}",
154+
placeholder=placeholder,
155+
)
156+
# 입력값이 없으면 기존 값 유지, 있으면 새 값 사용
157+
values[env_key] = new_val if new_val else current_val
147158
else:
148-
v = st.text_input(label, value=prefill, key=f"llm_{env_key}")
159+
v = st.text_input(label, value=current_val, key=f"llm_{env_key}")
149160
values[env_key] = v
150161
non_secret_values[env_key] = v
151162

152163
# 메시지 영역
153164
llm_msg = st.empty()
154165

155-
st.markdown("**프로파일 저장 (비밀키 제외)**")
166+
st.markdown("**프로파일 저장**")
156167
with st.form("llm_profile_save_form"):
157168
prof_cols = st.columns([2, 2])
158169
with prof_cols[0]:
@@ -185,10 +196,16 @@ def render_llm_section(config: Config | None = None) -> None:
185196
with st.expander("저장된 LLM 프로파일", expanded=False):
186197
for p in reg.profiles:
187198
if p.fields:
188-
pairs = [
189-
f"{k}={p.fields.get(k, '')}"
190-
for k in sorted(p.fields.keys())
191-
]
199+
# 필드 정의 가져오기 (시크릿 여부 확인용)
200+
fields_def = _llm_fields(p.provider)
201+
secret_keys = {k for _, k, is_secret in fields_def if is_secret}
202+
203+
pairs = []
204+
for k in sorted(p.fields.keys()):
205+
val = p.fields.get(k, "")
206+
if k in secret_keys:
207+
val = "***"
208+
pairs.append(f"{k}={val}")
192209
fields_text = ", ".join(pairs)
193210
else:
194211
fields_text = "-"
@@ -217,20 +234,28 @@ def render_llm_section(config: Config | None = None) -> None:
217234
e_fields = _embedding_fields(e_provider)
218235
e_values: dict[str, str | None] = {}
219236
for label, env_key, is_secret in e_fields:
220-
prefill = st.session_state.get(env_key) or os.getenv(env_key) or ""
237+
current_val = st.session_state.get(env_key) or os.getenv(env_key) or ""
221238
if is_secret:
222-
e_values[env_key] = st.text_input(
223-
label, value=prefill, type="password", key=f"emb_{env_key}"
239+
placeholder = (
240+
"값 설정됨 (변경하려면 입력)" if current_val else "값 없음"
224241
)
242+
new_val = st.text_input(
243+
label,
244+
value="",
245+
type="password",
246+
key=f"emb_{env_key}",
247+
placeholder=placeholder,
248+
)
249+
e_values[env_key] = new_val if new_val else current_val
225250
else:
226251
e_values[env_key] = st.text_input(
227-
label, value=prefill, key=f"emb_{env_key}"
252+
label, value=current_val, key=f"emb_{env_key}"
228253
)
229254

230255
# 메시지 영역: 버튼 컬럼 밖(섹션 폭)
231256
emb_msg = st.empty()
232257

233-
st.markdown("**Embeddings 프로파일 저장 (시크릿 포함)**")
258+
st.markdown("**Embeddings 프로파일 저장**")
234259
with st.form("embedding_profile_save_form"):
235260
e_prof_cols = st.columns([2, 2])
236261
with e_prof_cols[0]:
@@ -263,10 +288,16 @@ def render_llm_section(config: Config | None = None) -> None:
263288
with st.expander("저장된 Embeddings 프로파일", expanded=False):
264289
for p in e_reg.profiles:
265290
if p.fields:
266-
pairs = [
267-
f"{k}={p.fields.get(k, '')}"
268-
for k in sorted(p.fields.keys())
269-
]
291+
# 필드 정의 가져오기 (시크릿 여부 확인용)
292+
fields_def = _embedding_fields(p.provider)
293+
secret_keys = {k for _, k, is_secret in fields_def if is_secret}
294+
295+
pairs = []
296+
for k in sorted(p.fields.keys()):
297+
val = p.fields.get(k, "")
298+
if k in secret_keys:
299+
val = "***"
300+
pairs.append(f"{k}={val}")
270301
fields_text = ", ".join(pairs)
271302
else:
272303
fields_text = "-"

0 commit comments

Comments
 (0)