Files
dwg-dxf-viewer-sample/docs/license-mpl2-acadrust.md
T
minsungandClaude Opus 5 ce3859c487 docs: ship the acadrust MPL-2.0 notice, license text and local patch
The deployed site serves a .wasm with acadrust compiled into it, and our
vendored copy carries one modified MPL file
(src/io/dwg/dwg_stream_readers/object_reader/entities.rs, the read_mesh
array-count bounds fix). That is Executable Form distribution of modified
Covered Software, so MPL-2.0 3.2 requires the Source Code Form to be
available and recipients to be told how to get it. Nothing shipped said
so: no license text, no notice, no obtainable source - the upstream
mirror repos are private.

Add THIRD-PARTY-NOTICES.md plus public/licenses/ (MPL-2.0 text, the
read_mesh patch against the pristine 0.4.1 crate, and a served copy of
the notice), and link them from the page so recipients can actually find
them. Original crate download plus the patch reproduces the exact source
compiled into the wasm.

MPL does not require upstreaming, and the lineweight work did not touch
any MPL file - dwg-wasm/src/lib.rs is our MIT wrapper. docs/license-mpl2-
acadrust.md records the analysis and the checklist for future changes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 17:59:10 +09:00

138 lines
7.2 KiB
Markdown

# acadrust MPL-2.0 — 의무 사항과 조치 내역
| 항목 | 내용 |
|------|------|
| 작성 목적 | 파서(acadrust, MPL-2.0)를 담은 wasm 을 공개 배포하면서 지켜야 할 의무를 확정하고 조치 내역 기록 |
| 대상 배포물 | `https://dwg-dxf-viewer-sample.pages.dev/` (Cloudflare Pages, 공개) |
| 검토일 | 2026-08-04 |
| 상태 | **조치 완료** — 고지 파일·MPL 원문·패치 동봉, 사이트에서 링크 |
---
## 0. 결론 (세 줄)
1. **이번 lineweight 작업은 MPL 파일을 건드리지 않았다.** 수정한 `dwg-wasm/src/lib.rs`
우리 MIT 코드다. → MPL 의무가 *새로* 생기지 않았다.
2. 그러나 **이전부터** acadrust 를 한 파일 패치해서 wasm 에 컴파일해 공개 배포 중이었고,
그 상태가 **MPL-2.0 §3.2 위반**이었다. 라이선스 원문도 고지도 소스 입수 경로도 없었다.
3. **upstream(hakanaktt/acadrust)에 PR 을 올릴 의무는 없다.** MPL 은 기여 강제가 아니다.
**배포물에 고지 + 소스 입수 경로만 넣으면 된다.** ← 이번에 그렇게 조치했다.
---
## 1. 무엇이 MPL 이고 무엇이 우리 것인가
| 코드 | 위치 | 라이선스 | 이번 세션에서 수정? |
|------|------|----------|---------------------|
| **acadrust 0.4.1** (DWG 파서 본체) | `hmwebviewer/rust/acadrust/` | **MPL-2.0** | **아니오** |
| dwg-wasm (wasm-bindgen 래퍼 + JSON 직렬화) | `hmwebviewer/rust/dwg-wasm/src/lib.rs` | MIT (우리 코드) | 예 (lineWeight 필드 추가) |
| Viewer2D 외 프론트엔드 | `src/` | MIT | 예 |
MPL-2.0 은 **파일 단위(file-level) 카피레프트**다. GPL 처럼 프로젝트 전체로 번지지 않는다.
MPL 파일을 고쳤으면 **그 파일만** MPL 로 유지하고 소스를 공개하면 되고,
MPL 파일을 호출·링크하는 우리 코드(§3.3 의 "Larger Work")는 우리가 원하는 라이선스로 배포할 수 있다.
**`lib.rs` 에 필드 세 개 추가한 것은 MPL 전염 사유가 아니다.**
## 2. 그럼에도 의무가 있는 이유 — 이미 한 파일을 고쳤다
vendored acadrust 를 crates.io 원본과 diff 하면 **정확히 한 파일**이 다르다.
```bash
diff -rq ~/.cargo/registry/src/index.crates.io-*/acadrust-0.4.1/src \
hmwebviewer/rust/acadrust/src
# → src/io/dwg/dwg_stream_readers/object_reader/entities.rs 만 differ
```
`read_mesh` 의 배열 길이를 남은 비트 수로 제한하는 패치다(대형 SubD 메쉬 손상 수정,
[`subdmesh-rendering.md`](./subdmesh-rendering.md)). **이 파일은 Modified Covered
Software** 이고, 그 소스는 MPL 하에 제공되어야 한다.
그리고 `.wasm` 은 acadrust 를 컴파일해 담은 **Executable Form** 이다. 공개 사이트에서
브라우저로 내려보내는 순간 MPL 상 "Distribution" 에 해당한다.
### 적용되는 조항
| 조항 | 요구 |
|------|------|
| §3.1 | Source Code Form 을 배포하면 MPL 하에 배포하고 라이선스 사본을 동봉 |
| **§3.2** | **Executable Form 배포 시**: (a) 해당 Covered Software 의 Source Code Form 을 MPL 하에 제공하고, (b) **수령자에게 그 입수 방법을 알릴 것** (배포 비용 이상 청구 금지) |
| §3.3 | Larger Work(우리 앱)는 다른 라이선스로 배포 가능 — 위 (a)(b)를 지키는 한 |
| §3.4 | 라이선스·저작권 고지를 제거하지 말 것 |
**MPL 에는 upstream 기여 의무 조항이 없다.** §3.2 는 "수령자에게 제공"이지
"원저자에게 반영"이 아니다.
## 3. 위반 상태였던 지점 (조치 전)
- 배포 사이트에 MPL-2.0 **원문 없음**
- acadrust 를 쓴다는 **고지 없음** (README 표에만 한 줄, 배포물에는 미포함)
- 패치된 `entities.rs` 소스를 **얻을 방법 없음**
- `hmwebviewer` GitHub 저장소는 비공개(API 404)
- 샘플 저장소는 사내 gitea
- 즉 공개 배포 대상자가 소스에 접근할 경로가 전무
## 4. 조치 사항 (완료)
### 4-1. 배포물에 동봉
| 파일 | 배포 URL | 내용 |
|------|----------|------|
| `public/licenses/acadrust-MPL-2.0.txt` | `/licenses/acadrust-MPL-2.0.txt` | MPL-2.0 원문 (§3.1·§3.4) |
| `public/licenses/acadrust-0.4.1-read_mesh.patch` | `/licenses/acadrust-0.4.1-read_mesh.patch` | 우리 수정분 diff (§3.2(a)) |
| `public/licenses/THIRD-PARTY-NOTICES.md` | `/licenses/THIRD-PARTY-NOTICES.md` | 컴포넌트·버전·업스트림·수정 여부·복원 절차 (§3.2(b)) |
저장소 루트에도 같은 내용의 [`../THIRD-PARTY-NOTICES.md`](../THIRD-PARTY-NOTICES.md) 를 둔다.
### 4-2. 사이트에서 링크
`index.html` 우측 "Module recipe" 패널 하단에 고지 링크 추가.
§3.2(b) 의 "reasonable manner" 요건은 **수령자가 실제로 찾을 수 있는 위치**를 요구한다.
### 4-3. 소스 복원 절차 명시
원본 크레이트 + 패치 조합이면 컴파일된 소스를 바이트 단위로 재현할 수 있다.
```bash
curl -O https://crates.io/api/v1/crates/acadrust/0.4.1/download
tar xf download && cd acadrust-0.4.1
patch -p1 < acadrust-0.4.1-read_mesh.patch
```
업스트림 커밋 `f249c2f816acf36ee51cd5533716bdd443c2517e` 도 고지에 적어 뒀다
(크레이트의 `.cargo_vcs_info.json` 값).
## 5. 질문에 대한 답
> **"해당 레포(upstream)에 올려야 하나, 배포시 문서만 추가하면 되나?"**
**문서(고지) + 소스 입수 경로만 배포물에 넣으면 된다. upstream PR 은 의무가 아니다.**
| 선택지 | MPL 상 필요? | 판단 |
|--------|--------------|------|
| 배포물에 MPL 원문 + 고지 + 패치 동봉 | **필수** | ✅ 이번에 조치 |
| upstream `hakanaktt/acadrust` 에 PR | 아니오 | 선택 — read_mesh 수정은 일반 버그픽스라 올리면 유지보수 부담이 준다 (권장, 의무 아님) |
| `hmwebviewer` 저장소 공개 전환 | 아니오 | 불필요 — 패치 동봉으로 §3.2 충족 |
| 패치된 acadrust 전체 소스를 이 저장소에 vendoring | 아니오 | 더 엄격한 대안. 189 파일이 샘플 저장소에 들어와 무거워짐. 원본+패치 방식은 배포판(distro) 관행과 동일하고 §3.2 를 충족 |
> **"lineweight 작업으로 라이선스 의무가 생겼나?"**
**아니오.** 이번에 고친 `dwg-wasm/src/lib.rs` 는 MIT 인 우리 파일이고, MPL 파일은
건드리지 않았다(위 §2 diff 로 확인). 의무는 **이전 read_mesh 패치 + wasm 공개 배포**에서
이미 발생해 있었고, 이번에 뒤늦게 정리한 것이다.
## 6. 앞으로 지킬 것 (체크리스트)
- [ ] `rust/acadrust/` 아래 파일을 고치면 → 패치 파일을 다시 뽑아 `public/licenses/` 갱신
- [ ] acadrust 버전을 올리면 → 고지의 버전·커밋·패치를 함께 갱신
- [ ] 새 서드파티를 번들하면 → `THIRD-PARTY-NOTICES.md` 에 행 추가
- [ ] MPL 파일에서 라이선스 헤더 주석을 지우지 말 것 (§3.4)
- [ ] 배포 전 `/licenses/` 3개 파일이 실제로 서빙되는지 확인
## 7. 참고
- MPL-2.0 원문: [`../public/licenses/acadrust-MPL-2.0.txt`](../public/licenses/acadrust-MPL-2.0.txt)
- FAQ: https://www.mozilla.org/MPL/2.0/FAQ/ (Q: file-level copyleft, Q: 배포 의무 범위)
- 수정 경위: [`subdmesh-rendering.md`](./subdmesh-rendering.md)
- 이번 파서 변경(MIT 영역): [`lineweight-rendering.md`](./lineweight-rendering.md) §4-1