- acadrust-0.6.5-upgrade.md: what changed in dwg-wasm and why (failsafe reads, 32 MiB wasm memory growth, API changes), the field-level parse diff with each cause, cost (wasm size, load time) and what is left. - acadrust-0.6.5-upgrade-report.html: self-contained report with old/new captures of all 22 samples, zoomed checks of the formerly patched MESH and OLE2FRAME paths, and a diff image for each of the 5 changed views. - license-mpl2-acadrust.md / README: the obligation is now license text plus source location; records why the 0.4.1 notice was wrong. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5.1 KiB
5.1 KiB
acadrust MPL-2.0 — 의무 사항과 조치 내역
| 항목 | 내용 |
|---|---|
| 작성 목적 | 파서(acadrust, MPL-2.0)를 담은 wasm 을 공개 배포하면서 지켜야 할 의무를 확정하고 조치 내역 기록 |
| 대상 배포물 | https://dwg-dxf-viewer-sample.pages.dev/ (Cloudflare Pages, 공개) |
| 최초 검토 | 2026-08-04 (0.4.1 + 로컬 패치) |
| 갱신 | 2026-10-19 — acadrust 0.6.5 무수정으로 교체, 로컬 패치 폐기 |
| 상태 | 소스 트리 조치 완료. 배포본(dist2 / pages.dev)은 재빌드·재배포 전까지 옛 고지 |
0. 결론
- acadrust 를 0.6.5 (crates.io) 무수정으로 쓴다. 로컬 패치가 필요 없어졌으므로 "수정본 소스 공개" 의무가 없다. 남는 의무는 MPL 원문 동봉 + 고지 + 소스 위치 안내뿐이다.
- 우리 래퍼
dwg-wasm은 MIT (MPL 은 파일 단위라 번지지 않는다). 0.6.5 대응으로 고친 곳(할당자, failsafe, API 변경)은 전부 이 래퍼 안이다. - upstream PR 의무는 없다.
1. 무엇이 MPL 이고 무엇이 우리 것인가
| 코드 | 위치 | 라이선스 | 수정 여부 |
|---|---|---|---|
| acadrust 0.6.5 (DWG 파서 본체) | crates.io, dwg-wasm/Cargo.toml 에서 =0.6.5 고정 |
MPL-2.0 | 무수정 |
| dwg-wasm (wasm-bindgen 래퍼 + JSON 직렬화) | hmwebviewer/rust/dwg-wasm/ |
MIT (우리 코드) | 수정함 |
| Viewer2D 외 프론트엔드 | src/ |
MIT | — |
2. 0.4.1 시절 고지가 틀렸던 이유 (2026-10-19 확인)
2026-08-04 고지는 "한 파일만 수정"이라고 했지만, 실제 vendored 0.4.1 은
2파일 3건이 원본과 달랐다 (hmwebviewer feat/subdmesh-render 브랜치 기준).
| 파일 | 수정 |
|---|---|
object_reader/entities.rs |
read_mesh 배열 개수를 남은 비트로 제한 (대형 SubD 메쉬 손상 수정) |
object_reader/entities.rs |
OLE2FRAME 네 모서리 좌표를 데이터 헤더에서 추출 |
dwg_document_builder.rs |
그 좌표를 엔티티에 대입 |
공개했던 acadrust-0.4.1-read_mesh.patch 는 원본이 아니라 OLE 중간 수정본을 기준으로
만들어져서, 원본 0.4.1 에 git apply 하면 entities.rs:2350 에서 실패했다.
즉 배포된 wasm 의 소스를 재현할 수 없었다 → MPL §3.2(a) 미충족.
3. 0.6.5 가 두 수정을 대체하는 근거
같은 도면을 네이티브 프로브로 읽어 비교했다 (2026-10-19).
| 샘플 | 원본 0.4.1 | 우리 패치본 | 0.6.5 무수정 |
|---|---|---|---|
| 대산당진 노면 MESH#1 | verts 100000 / faces 14 (손상) | 105497 / 185444 / 290931 | 105497 / 185444 / 290931 |
| C0060203 OLE2FRAME 좌표 | (1,1,0)/(0,0,0) 기본값 | (20584.21, 25712.29)–(39654.45, 13712.29) | 같음 |
업그레이드에 따른 래퍼 변경과 회귀 결과는 acadrust-0.6.5-upgrade.md.
4. 적용되는 조항 (무수정 사용 기준)
| 조항 | 요구 | 조치 |
|---|---|---|
| §3.2(a)(b) | Executable Form 배포 시 소스를 MPL 로 제공하고 수령자에게 입수 방법을 알릴 것 | 고지에 crates.io 다운로드 URL·커밋·SHA-256 명시 |
| §3.1 / §3.4 | 라이선스 사본 동봉, 고지 제거 금지 | public/licenses/acadrust-MPL-2.0.txt (0.6.5 LICENSE 와 동일 확인) |
| §3.3 | Larger Work(우리 앱)는 다른 라이선스 가능 | dwg-wasm·Viewer2D 는 MIT |
crates.io 는 게시된 버전을 삭제하지 않는다(yank 해도 다운로드 가능). 그래서 정확한 버전
링크를 소스 입수 경로로 삼는다. FAQ 가 "링크만으로 충분"하다고 명시하지는 않으므로,
상용 납품처럼 더 확실해야 하는 배포에서는 .crate 파일(4.1MB)을 함께 두는 방안을 검토한다.
5. 배포물 구성
| 파일 | 배포 URL | 내용 |
|---|---|---|
public/licenses/acadrust-MPL-2.0.txt |
/licenses/acadrust-MPL-2.0.txt |
MPL-2.0 원문 |
public/licenses/THIRD-PARTY-NOTICES.md |
/licenses/THIRD-PARTY-NOTICES.md |
컴포넌트·버전·커밋·SHA-256·소스 입수 방법 |
index.html "Module recipe" 패널 하단에서 두 곳으로 링크한다 (§3.2(b) "reasonable manner").
옛 acadrust-0.4.1-read_mesh.patch 는 삭제했다.
6. 앞으로 지킬 것 (체크리스트)
- acadrust 를 고치지 않는다. 고쳐야 하면 fork 소스 전체를 공개 위치에 두고 고지를 "modified" 로 바꾼다
- acadrust 버전을 올리면 → 고지의 버전·커밋·SHA-256 갱신 (
Cargo.lockchecksum) - 새 서드파티를 번들하면 →
THIRD-PARTY-NOTICES.md에 행 추가 - 배포 전
/licenses/2개 파일이 실제로 서빙되는지 확인 - (미해결) wasm 에 컴파일되는 Rust 의존성(MIT/Apache/BSD 등)의 고지 생성 —
cargo about등
7. 참고
- MPL-2.0 원문:
../public/licenses/acadrust-MPL-2.0.txt - FAQ: https://www.mozilla.org/MPL/2.0/FAQ/ (Q6 사내 사용, Q8 실행 파일 배포, Q17 "distribute" 의미)
- MESH 수정 경위:
subdmesh-rendering.md