싸인 이미지 SMB 직접 읽기 — 공유 매핑 구현(서버측 SMB 개방 대기)
사용자 결정(②SMB 직접 접근)에 따라 구현. 실측 확인:
- 파일서버 = DB 서버와 같은 호스트, 전송 데몬 포트 2002 는 열림
- <b>SMB 445·139 는 닫힘</b>, UNC·관리공유 접근 모두 실패 → 서버측 조치 필요
- 서명 경로는 서버측 절대경로 D:\MsystechHIS\{사이트}\... (설정 루트 E:\msys\ 와 다름)
그래서 공유가 열리는 즉시 동작하도록 매핑을 넣었다:
Images:SignatureShareMap 에 "서버접두=UNC접두" 를 두면 해석 순서가
①레거시 캐시 ②공유(UNC) ③직접 경로가 된다. 접두는 대소문자 무시로
<b>긴 것부터</b> 맞추고(짧은 접두가 정확한 대응을 묻지 않게), '=' 없는
설정 오타는 무시한다(반쪽 경로를 만들면 조용히 틀린다). 자격증명은
설정에 담지 않는다 — 공유 접근은 단말 로그인 계정으로 붙는다.
진단 --db-filecfg 확장: 접속 <b>대상</b>(Type·IP·Port·FileDirectory)과
경로 접두 분포를 찍고(자격증명은 길이만), 공유 매핑별 접근 가능 여부와
파일서버 SMB(445) 개방 여부를 판정해 무엇을 열어야 하는지 알려 준다.
- dotnet test 358/358 (매핑 4건 추가: 치환·긴 접두 우선·오타 무시·해석 순서)
- --edit-smoke 실패 0 · --db-patient ①~㊲ 전건 통과
- --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 불변
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
a0333791b6
commit
345b2e1da1
@@ -66,6 +66,51 @@ public sealed class SignatureImagePathTests
|
||||
Assert.AreEqual(SignatureImageOrigin.DirectPath, result.Origin);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void 공유_매핑이_서버경로를_UNC_로_바꾼다()
|
||||
{
|
||||
var map = new[] { @"D:\MsystechHIS=\\fs\MsystechHIS" };
|
||||
Assert.AreEqual(@"\\fs\MsystechHIS\002\a.tif",
|
||||
SignatureImagePath.MapToShare(@"D:\MsystechHIS\002\a.tif", map));
|
||||
// 대소문자 무시 — 병원 데이터의 표기가 제각각이다
|
||||
Assert.AreEqual(@"\\fs\MsystechHIS\002\a.tif",
|
||||
SignatureImagePath.MapToShare(@"d:\msystechhis\002\a.tif", map));
|
||||
// 대응 없는 접두는 빈 문자열(엉뚱한 경로를 만들지 않는다)
|
||||
Assert.AreEqual(string.Empty, SignatureImagePath.MapToShare(@"E:\other\a.tif", map));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void 접두가_겹치면_긴_쪽이_이긴다()
|
||||
{
|
||||
// 짧은 접두가 먼저 걸리면 더 정확한 대응이 묻힌다
|
||||
var map = new[] { @"D:\HIS=\\fs\all", @"D:\HIS\Sign=\\fs\sign" };
|
||||
Assert.AreEqual(@"\\fs\sign\a.tif", SignatureImagePath.MapToShare(@"D:\HIS\Sign\a.tif", map));
|
||||
Assert.AreEqual(@"\\fs\all\Etc\b.tif", SignatureImagePath.MapToShare(@"D:\HIS\Etc\b.tif", map));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void 설정_오타는_값으로_바꾸지_않는다()
|
||||
{
|
||||
// '=' 가 없거나 한쪽이 비면 그 항목은 무시한다 — 반쪽 경로를 만들면 조용히 틀린다
|
||||
var map = new[] { "그냥문자열", @"D:\HIS=", @"=\\fs\x" };
|
||||
Assert.AreEqual(string.Empty, SignatureImagePath.MapToShare(@"D:\HIS\a.tif", map));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void 캐시가_없으면_공유를_먼저_보고_직접경로는_그_다음이다()
|
||||
{
|
||||
var map = new[] { @"D:\MsystechHIS=\\fs\MsystechHIS" };
|
||||
var remote = @"D:\MsystechHIS\002\a.tif";
|
||||
var shared = @"\\fs\MsystechHIS\002\a.tif";
|
||||
// 공유에 있으면 공유
|
||||
var viaShare = SignatureImagePath.Resolve(remote, Install, p => p == shared, map);
|
||||
Assert.AreEqual(SignatureImageOrigin.Share, viaShare.Origin);
|
||||
Assert.AreEqual(shared, viaShare.LocalPath);
|
||||
// 공유에 없고 원격 경로가 열리면 직접
|
||||
var viaDirect = SignatureImagePath.Resolve(remote, Install, p => p == remote, map);
|
||||
Assert.AreEqual(SignatureImageOrigin.DirectPath, viaDirect.Origin);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void UNC_공유_경로도_파일명을_뗀다()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user