- SecretGate.passIf(hasSecret, force): 비밀 값이 없으면 묻지 않고 지나감, 있으면 pass 의 답
- 모은 곳 (같은 꼴의 복사 9곳): 원격 등록 requireSecretGate · 플레이어 (WebDAV 머리) · 그림 AI (API 키) ·
WebDAV · FTP · SFTP · SMB 설정 · AI 서비스 설정 (저장된 비밀 값이 있는 것을 고치기 전). 오류 종류 · 닫기는 그대로
- 그대로 둔 것 (같은 꼴 아님): 사용자가 직접 누른 일 앞에서 다시 묻는 8곳 (탐색기 · 폴더 고르기 · 다시 시도 · 보관함 · 자막 찾기 등),
OpenSubtitles (비밀 값 조건 없이 늘 문 - 따로 보고)
- 약속 시험 한 줄 (remote_registry_contract: 묻는지 · 답 · force)
사용자가 보게 될 동작: 바뀌는 것 없음
확인: analyze 0 · 단위 1498 ×2 · 통합 6/6 ×2 · base10 214장 0px
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Tor: debugRunning · executable 없앰 → 떠난 뒤 잠시 켜 두기를 IdleStop 모듈로 (schedule · cancel · stopNow).
환경 설정 > Tor 는 IdleStop 을 받음 (처음 값 = 앱의 Tor), [지금 끄기] = stopNow
- Wi-Fi 공유: debugLoopbackOnly · debugAddresses · loopbackOnly 인자 없앰 → WifiShareNet 주입 (열 주소 · 설정 열기).
WifiSharePage(net:) 가 debugLaunch 를 대신함. debugFail 없앰 - 시험이 실제 다른 루프백 주소 (127.0.0.x) 에서 틀린 코드를 보냄
- 관리자 권한: Elevation.debugElevated 없앰 → PlatformInfo.elevated (조립 주입), CefView(elevated:)
- CEF 시작 시간: 바꿀 수 없게 (const) - 시험은 가짜 시간을 넘김
- 단일 실행: debugStopListening 없앰 - 시험이 instance.json 을 아무도 듣지 않는 포트로 (받는 곳이 죽은 첫 창)
- SMB 찾기: 전역 debugFindSmbServers 없앰 → PlatformServices.findLanSmb 주입
- 남은 @visibleForTesting (들여다보기만): browser_page · tor_page debugNav, secret_store dpapiAt, reader_page dropMissingFiles
확인: analyze 0 · 단위 1473 ×2 · 통합 6/6 ×2 · base10 214장 0px · windows_wifi_shot ×2 · windows_smbfind_shot ×2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관리자 지시 10/21 (⑦ (나) 화면마다 차례로 - 첫째 파일 탐색기):
- 주황 · 빨강 · 노랑 · 초록 (orangeAccent · redAccent · amber · greenAccent) 을 테마 색 warning · alert · amber · positive 로.
어두운 화면은 예전 Material 값 그대로, 밝은 화면만 진하게 (글자 4.5:1 · 노랑 아이콘 3:1, 노랑 글자는 amberText)
- 탐색기: 흰 바탕에서 옅은 회색 파일 아이콘을 밝은 화면일 때만 진하게, 저장 공간 그림 "이 폴더의 파일" 칸 글자 (밝은 화면)
- 통합 캡처 시험에 JJ_SHOT_THEME=light (어두운 것과 견줌)
- 설정 설명 글을 새 이름 (밝은 화면 · 기기 따라) 에 맞춤
- 확인: 어두운 화면 캡처 95장을 9324e41 과 픽셀로 견줘 실행마다 바뀌는 곳 (시각 · CPU 숫자 · 임시 이름) 밖의 차이 0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관리자 지시 10/21 (⑦ (가) 바탕): 처음 값은 어둡게 (예전 색 그대로), 설정 "화면 밝기: 어두운 화면 / 밝은 화면 / 기기 따라" 에 "시험" 표시.
- JjColors 를 두 벌 (JjPalette.dark = 예전 값 그대로 · light) 에서 고르는 값으로. 그래서 JjColors 를 쓰던 const 는 뺐다 (기계적으로, 62개 파일 294곳)
- 밝기를 바꾸면 테마와 함께 화면 조각 전체를 다시 그림 (상태는 그대로) - JjColors 를 직접 읽는 곳도 바로 새 색
- 기기 따라: 기기 밝기가 바뀌면 따라감. 모르는 값 · 없는 값은 어둡게
- 밝은 색은 바탕 · 칸 위 글 · 흐린 글 · 강조 · 경고 · 성공 대비 4.5:1 이상 (시험으로 확인)
- 화면별 맞추기 ((나): 탐색기 → 보기 → 설정 → 나머지) 는 다음 커밋들에서
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관리자 지시 (10/18, next e8baa84 캡처에서 찾은 ①~④, 회귀 아님):
① FTP · SFTP · SMB · WebDAV 서버 창: "이름 (탭에 보임, 비우면 주소)" · "시작 폴더 (비우면 …)" · "도메인 · 작업 그룹 (보통 비움)" 이 en 412 에서 잘렸다
→ 칸 이름은 "이름" · "시작 폴더" · "도메인 · 작업 그룹", 설명은 helper (3줄까지).
② 해시 창 비교 칸 → "비교할 해시" + helper "받은 곳에서 알려 준 해시를 붙여넣으세요".
③ 일괄 이름 바꾸기 날짜 고르기: 고른 뒤 상자에는 짧게 ("날짜: 찍은 때" · "날짜: 바뀐 때"), 펼친 목록은 긴 설명 그대로.
④ 한 창 갈 곳 막대: "갈 곳:" 은 늘 보이고 폴더 이름이 길면 가운데를 줄인다 (middleEllipsis · textWidth - path_label.dart). 전체 경로는 길게 눌러 · 마우스를 올려.
확인: integration_test/windows_trunc_shot_test.dart (새, 서버 창 4개 위 · 아래, 412/960 x ko/en/ja) · windows_ftp · windows_p3 · windows_xplore_tools · windows_xplore 캡처 통과
(release\test\shots_trunc), explorer · explorer_webdav · batch_rename · file_tools · ftp · smb · smb_find 시험 통과, analyze 문제 없음, l10n 빠짐 0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관리자 결정 (10/18):
- 설정 > SMB [SMB 서명 · 암호화 필수] (smbRequireSecure, 처음 끔 - 오래된 NAS 가 붙지 않을 수 있음, 틀린 값은 끔).
켜면 Android 다리 (smbj) 가 서명을 요구하고 (withSigningRequired), 로그인 뒤 세션이 서명도 암호화도 안 되면 닫고 막는다
→ "서명 · 암호화가 되지 않는 연결이라 열지 않았습니다 (설정 …)". 설정을 바꾸면 열려 있던 연결을 닫는다 (다음 연결부터).
- 서버마다 처음 연결이 되면 info 를 한 번 물어 (세션의 shouldEncryptData · isSigningRequired) 서명도 암호화도 안 되면 탐색기 · Rsync 탭에 ⚠ (DavPath.mark, 꺼 두어도).
info 의 "encrypted" 는 협상 가능 여부 (supportsEncryption) 가 아니라 이 세션이 실제로 암호화되는지로 바꿈. [연결 확인] 경고도 서명 여부를 따라 두 가지.
- 서버 목록에서 빠지거나 설정이 바뀐 서버는 ⚠ 기억도 지운다.
시험: smb_test (새 1: 처음 끔 · 틀린 값 · 연결 전 🗄 · 처음 한 번만 info · ⚠ · 서명만 되면 ⚠ 없음 · 필수를 다리에 넘김 · 막힌 이유) · smb_find · explorer_webdav 11 통과,
analyze 문제 없음, l10n 빠짐 0, APK 빌드 (Kotlin 컴파일) 성공. 실제 NAS (서명 · 암호화 켬 / 끔) 확인은 기기에서.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
15 FTP 캡처에서 찾음 (관리자 지시 10/18, hint_fix = next 위). 서버 주소 · 시작 폴더 · 공유 이름 · WebDAV 주소 칸의 helperText 에 helperMaxLines: 3. 글은 그대로.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관리자 지시 (10/18): 훑기보다 먼저 mDNS 로 빠르게 찾기.
- lib/core/mdns_smb.dart (새, 패키지 없음): "레거시 유니캐스트" 질의 (RFC 6762 6.7) - 빈 포트에서 224.0.0.251:5353 으로 PTR (QU) 을 묻고
응답자가 그 포트로 바로 답한다. Android 의 멀티캐스트 받기 (MulticastLock, Kotlin) 없이도 받을 수 있게 고른 방식 (내 판단).
PTR → 인스턴스, SRV → 호스트 이름, A → IPv4 (이름 압축 읽기). 1.5초 모으고, 못 찾으면 빈 목록 (오류 없음). 묻기만 하고 알리지 않음
- 찾기 창: mDNS 먼저 → 이어서 포트 훑기 (mDNS 를 안 하는 NAS 도). 같은 주소는 하나로 (이름은 mDNS 것), 주소 순서. 안내 글도 고침
시험: mdns_smb_test 3 (질의 꼴 · 손으로 만든 응답 읽기 - 압축 이름 · SRV · A · 합치기) · smb_find_test - 4 통과, analyze 문제 없음, l10n 빠짐 0.
실제 NAS 의 mDNS 응답은 기기 · 사무실 망에서 확인 필요 (Synology 는 기본으로 _smb._tcp 를 알림).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관리자 지시 (10/18): cd 의 lan_scan.dart (xplore b6e4717) 를 묶음7_88 (88 SMB) 위로 가져와 SMB 추가 창의 [찾기] 에 붙인다.
- lib/core/lan_scan.dart · test/lan_scan_test.dart: b6e4717 의 것 그대로 (cd 작성 - 사설 /24 의 445 포트에 연결만 해 보고 닫음, 64개 동시, Tailscale 은 훑지 않음)
- SMB 추가 · 고치기 창: 서버 주소 아래 [같은 망에서 찾기] → 찾는 창 (무엇을 하는지 안내 · 진행 "n / 254 확인" · [취소]).
찾은 서버를 누르면 서버 주소 칸에 이름 (역방향 조회, 모르면 주소), 이름 칸이 비었으면 이름 앞부분을 채움. 못 찾으면 직접 넣으라는 안내
- 누를 때만 훑는다 (저절로 훑지 않음 - 내 판단: 망 전체에 연결을 시도하므로 사용자가 고를 때만)
- mDNS (_smb._tcp) 는 아직 (관리자 "더하면 좋음") - 포트 훑기로 찾은 것의 이름은 역방향 DNS
시험: smb_find_test (가짜 찾기 - 실제 망을 훑지 않음: 고르면 주소 · 이름 채움, 이름 모르면 주소, 못 찾음 안내, 추가 창 유지),
lan_scan_test (127.0.0.1 만), smb_test - 7 통과, analyze 문제 없음, l10n 빠짐 0. Android 실제 망에서는 기기 확인 필요.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
사용자 결정 88-1 (Windows 는 운영체제 그대로) · 88-4 (SMB3 암호화는 허용 + 안 되면 경고) 대로 Android 만.
- android/.../SmbBridge.kt (채널 jj_mkvmaker/smb, 뒤 스레드): smbj (SMB2 · SMB3, SMB1 없음) · Bouncy Castle 보안 제공자
(Android 기본에는 NTLM 의 MD4 가 없음) · 암호화 요청 (withEncryptData). 서버마다 연결 하나를 다시 씀, 파일은 손잡이로 1MB 조각.
오류를 종류로 (auth · unreachable · noShare · smb1 · permission · notFound). R8 keep 규칙 (smbj · mbassador · bouncycastle).
- lib/core/smb.dart: SmbServer (비밀번호는 안전 저장소 smb.pw.<id> 에만) · SmbRemote (RemoteClient) · SmbRegistry.
저장된 비밀번호 없음은 서버에 묻지 않고 알림, 게스트 (아이디 없음) 허용, info() 로 암호화 여부.
- vfs: smb:// 를 같은 원격 길로 (🗄), 재생 · 다른 앱은 받아서 (noStreamUrl = SFTP · SMB).
- 화면: 환경 설정 > 파일 탐색기 > SMB (Android 만) - 서버 · 포트 · 공유 · 시작 폴더 · 아이디 (비우면 게스트) · 비밀번호 · 도메인,
[연결 확인] 에서 암호화 안 되면 경고. 탐색기 탭 · ⋮ 메뉴 [SMB 서버 추가] · 탭 길게 누르기 = 고치기 · 폴더 고르는 곳.
179 바꿈: Android 에서 smb:// · \서버\공유 를 넣으면 "SMB 서버 추가로 넣으면 탭으로" 안내와 [SMB 서버 추가] (넣은 주소로 채움) · [WebDAV 서버 추가].
- 최상 · 마스터 초기화의 저장된 비밀번호 지우기에 SMB 도.
- 라이선스: SMBJ_LICENSES.txt (smbj LICENSE_HEADER · Bouncy Castle · SLF4J · MBassador 원문 + Apache 2.0 전문, smbj 는 NOTICE 파일이 없음),
라이선스 화면 · Android 고지, 판이 바뀌면 시험이 알림.
- 시험: smb_test (가짜 채널 - 1MB 조각 쓰기 · 읽기 · 목록 · 이름 바꾸기 · 지우기 · 시작 폴더 · 오류 글 · 저장된 비밀번호 없음 · 설정 · 주소 풀기),
179 시험 고침. 전체 837 통과 · 17 건너뜀, 새로 남은 임시 폴더 0. APK 빌드 (Kotlin 컴파일 · R8) 통과.
- 시험이 잡은 버그: 큰 조각 하나가 오면 1MB 로 나누지 않고 통째로 보냈다 → 나눔.
- 미완: 실제 smbj 연결 (Android 기기 + SMB 서버) 은 확인하지 못함 - 노트 10+ 등에서 PC 공유 폴더로 확인 필요.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>