REFACTOR: Enhance password validation - #58
Conversation
|
리뷰 완료 — Blocker 0건, Major 0건, Minor 0건, Question 0건 |
|
리뷰 완료 — Blocker 1건, Major 0건, Minor 1건, Question 0건 |
0d19d7e to
67f0ab1
Compare
67f0ab1 to
760f700
Compare
| } | ||
|
|
||
| password := string(raw) | ||
| if err := validatePassword(password); err != nil { |
There was a problem hiding this comment.
[Major] ReadPassword가 "신규 비밀번호 생성"과 "기존 자격증명 입력(인증)"을 구분하지 않고 모두 validatePassword로 검증합니다.
cmd/acl/user/add.go의 readAdminCredentials(), cmd/acl/admin/passwd.go·cmd/acl/group/add.go·cmd/acl/user/remove.go 등에서 "admin password" 필드는 이미 존재하는 관리자 자격증명을 그대로 입력해 conn.AddAuth로 ZooKeeper에 인증하는 용도입니다. 그런데 이 값도 여기서 정책 검증에 걸리면 ZooKeeper에 연결·인증을 시도해 보기도 전에 무조건 실패합니다.
특히 이번 변경으로 길이 판정 기준이 바이트 수(len(p), 기존 internal/util.go)에서 룬(문자) 수(utf8.RuneCountInString, internal/password.go)로 바뀌었습니다. 예를 들어 한글 4자로 만든 12바이트짜리 기존 admin 비밀번호는 예전 바이트 기준 정책은 통과했지만, 새 룬 기준(12자 이상)으로는 거부됩니다. 비밀번호를 바꾼 적 없는 관리자가 acl user add/remove/permissions, acl admin passwd 등 admin password를 입력하는 모든 커맨드에서 "invalid password" 에러로 인증 자체를 할 수 없게 됩니다.
"새 비밀번호 생성" 지점(그룹 생성 시 admin 비밀번호, 신규 사용자 비밀번호, admin passwd의 new password)에서만 정책 검증을 하도록 분리하는 것을 제안합니다.
func ReadPassword(prompt string) (string, error) {
// ... 기존 입력 로직 ...
return password, nil // validatePassword 호출 제거
}
func ReadNewPassword(prompt string) (string, error) {
password, err := ReadPassword(prompt)
if err != nil {
return "", err
}
if err := validatePassword(password); err != nil {
return "", fmt.Errorf("invalid password: %w", err)
}
return password, nil
}그리고 인증용 admin password 입력 지점은 ReadPassword를, 신규 비밀번호 생성 지점(새 password/new password/user password)은 ReadNewPassword를 쓰도록 호출부를 나눕니다.
|
리뷰 완료 — Blocker 0건, Major 1건, Minor 0건, Question 1건 [Question] 이 PR이 리뷰 규칙(CLAUDE.md)을 변경합니다. 머지 전에 사람이 확인해 주세요. |
🔗 Related Issue
⌨️ What I did