현재 배포하는 acadrust-dwg WASM이 hakanaktt/acadrust의 공식 WASM과 동일한지, 아니면 별도로 수정·확장한 빌드인지 확인한다.
핵심 정정: upstream에는 비교할 "공식 WASM"이 없다
hakanaktt/acadrust가 공식 배포하는 것은 crates.io의 Rust library crate다. GitHub의 전체 브랜치·Git 이력을 확인한 결과 다음이 없다.
wasm-bindgen 의존성 및 export
[lib] crate-type = ["cdylib"]
wasm-pack 빌드 설정
.wasm, JS glue, npm package
GitHub Release의 WASM binary
초기 Cargo.toml에는 한때 로컬 dxf-tools-wasm workspace를 가리키는 설정이 있었지만 a265a61에서 제거됐으며, 해당 WASM wrapper 소스나 산출물은 upstream Git 이력에 들어온 적이 없다.
따라서 공식 WASM과 현재 바이너리의 hash를 비교하는 방식은 성립하지 않는다.
질문에 대한 직접 판정
WASM 전체: 커스텀판이 확실함
현재 acadrust_dwg_bg.wasm은 upstream 공식 바이너리가 아니라 자체 rust/dwg-wasm이 만든 WASM이다. 다음 로직이 자체 코드로 추가돼 있다.
parse_dwg, parse_dwg_json WebAssembly export
CadDocument를 Viewer2D 전용 CadParseResult JSON으로 변환
entity/table/header 필드 매핑
HATCH boundary 원호 샘플링과 손상 호 우회
OLE2FRAME 이미지/좌표 추출
대용량 DWG용 streaming JSON 직렬화
즉 "공식 WASM을 그대로 배포했는가?"에 대한 답은 아니다다. 공식 WASM이 존재하지 않으며, 현재 것은 acadrust를 내부 엔진으로 링크한 별도 WASM application/wrapper다.
acadrust 코어: 문서상 무수정, 현재 증거만으로 확정 불가
저장소 문서와 당시 Cargo.toml 주석은 crates.io acadrust v0.4.1을 path = "../acadrust"로 복사해 수정 없이 사용했다고 기록한다. HATCH/OLE/성능 수정도 모두 rust/dwg-wasm에서 했다고 명시한다.
그러나 당시 rust/acadrust 소스와 lockfile이 Gitea에 없으므로 현재 바이너리만 역으로 분석해 "코어 파일이 한 줄도 수정되지 않았다"고 확정할 수는 없다. 이 부분은 source 복구 후 upstream f249c2f와 파일 hash/diff로 검증해야 한다.
있음 — 수정된 해당 파일을 포함한 대응 Source Code Form을 MPL-2.0으로 제공
별도 파일인 rust/dwg-wasm wrapper
원칙적으로 없음 — MPL 코드를 복사하지 않은 별도 파일이면 Larger Work의 자체 코드
Viewer2D/TypeScript 코드
원칙적으로 없음 — 별도 파일이고 MPL 코드를 포함하지 않는 경우
Mozilla FAQ Q11은 MPL 코드와 별도 파일을 정적 링크한 Larger Work도 전체 소스 공개 대상이 아니라고 명시한다. 따라서 "커스텀 WASM이므로 wrapper 전체를 공개해야 한다"는 결론은 맞지 않는다.
반대로 기존 문서의 "acadrust가 무수정이므로 새 소스 공개 의무가 없다"는 문구도 불완전하다. 외부에 컴파일한 MPL 실행형을 배포하면 무수정이어도 대응 acadrust source의 획득 위치를 수신자에게 알려야 한다(FAQ Q8, §3.2).
Cloudflare Pages는 WASM 사본을 브라우저에 전달하므로 FAQ Q17의 외부 배포에 해당한다. 현재 배포 HTML/JS/public assets에는 acadrust의 정확한 source URL과 MPL 고지가 확인되지 않고, repository README의 간단한 license 표만 있다. 따라서 현재는 최소한 source availability notice가 부족한 compliance gap으로 보는 것이 안전하다.
최소 조치:
배포 UI 또는 함께 전송되는 JS/NOTICE에 acadrust, MPL-2.0, 정확한 commit/source URL을 명시한다.
가능하면 검증된 exact source archive를 자체 저장소/배포물에 보존한다.
rust/acadrust 복구 후 f249c2f와 diff하여 수정 파일 유무를 확정한다.
수정 파일이 발견되면 그 파일과 기존 MPL notice를 MPL-2.0으로 공개한다.
별도 wrapper는 MPL 코드를 복사하지 않았음을 파일 단위로 확인하고 자체 라이선스를 유지한다.
결론
링크된 코어는 이름만 같은 별도 구현체로 보이지 않는다. upstream 저장소는 최초 dxf-tools-rs 구현에서 acadrust로 이름을 바꾼 뒤 같은 Git 계보에서 계속 개발됐고, 샘플의 WASM에도 그 Rust 소스 경로가 남아 있다.
다만 이 저장소의 src/viewer2d/acadrust-dwg/는 upstream 크레이트 자체가 아니라, 로컬에 복사한 acadrust 소스를 커스텀 rust/dwg-wasm 래퍼와 링크해 만든 생성물(JS glue + WASM) 이다. Rust 입력 소스와 lockfile이 Gitea에 없기 때문에 "upstream 0.4.1을 수정 없이 사용했다"는 문서의 주장은 현재 저장소만으로 재현·검증할 수 없다.
따라서 판정은 다음과 같다.
WASM 패키지: upstream 공식본이 아닌 자체 구현
링크된 Rust 코어 계보: upstream과 동일한 계열
소스 관리 방식: upstream Git 이력을 보존한 subtree/submodule이 아니라 vendored copy로 추정
주의할 점은 upstream main의 현재 HEAD c8a58bd도 버전 문자열이 여전히 0.4.1이라는 것이다. 배포 snapshot 이후 8커밋, 56파일, +6,810/-851줄이 추가됐다. 따라서 v0.4.1 표기만으로 crates.io 배포본과 GitHub 최신 소스를 구분할 수 없다.
3. 샘플의 acadrust-dwg는 upstream crate가 아니라 커스텀 WASM 패키지다
특히 b047dc4에서 공개된 TypeScript 변화는 parse_dwg(bytes) -> JsValue에서 parse_dwg_json(bytes) -> JSON.parse(...)로 전환한 것이다. 저장소 문서와 커밋 메시지는 이 변경들이 rust/dwg-wasm 래퍼에서 이뤄졌고 rust/acadrust는 수정하지 않았다고 설명한다.
하지만 Rust 입력 소스가 커밋돼 있지 않아, binary diff만으로는 그 주장을 독립적으로 증명하거나 어느 upstream 커밋인지 확정할 수 없다.
리스크
동일한 0.4.1 문자열을 가진 crates.io 배포본과 GitHub 후속 snapshot을 구분하지 못한다.
WASM을 재현 빌드할 수 없고, 변경이 wrapper에만 있었는지 감사할 수 없다.
MPL-2.0 대응에서 실제 배포 바이너리에 대응하는 Source Form을 명확히 가리키기 어렵다.
향후 upstream 보안/파싱 수정 반영 여부를 diff 기반으로 판단할 수 없다.
제안 작업 / 완료 조건
재현 빌드·SBOM의 상위 작업은 #3에서 계속하고, 이 이슈에서는 provenance 확정을 선행한다.
현재 배포 WASM을 만든 rust/acadrust와 rust/dwg-wasm 소스를 복구한다.
rust/acadrust를 crates.io 0.4.1의 f249c2f 및 당시 upstream 후속 커밋과 파일 단위 비교한다.
정확한 upstream URL + full commit SHA + crate checksum을 UPSTREAM.md 또는 lockfile에 기록한다.
차이가 있으면 patch를 분리해 저장하고 "unmodified" 문구를 실제 상태에 맞게 수정한다.
vendoring을 유지한다면 MPL-2.0 LICENSE와 대응 Source Form을 배포물/NOTICE에서 연결한다.
가능하면 Cargo.toml의 git = ..., rev = ... 또는 검증 가능한 cargo vendor 입력으로 교체한다.
동일 source/toolchain/lockfile로 WASM 재현 빌드 후 checksum 또는 허용 가능한 차이를 기록한다.
## 조사 목적
현재 배포하는 `acadrust-dwg` WASM이 [`hakanaktt/acadrust`](https://github.com/hakanaktt/acadrust)의 공식 WASM과 동일한지, 아니면 별도로 수정·확장한 빌드인지 확인한다.
## 핵심 정정: upstream에는 비교할 "공식 WASM"이 없다
`hakanaktt/acadrust`가 공식 배포하는 것은 crates.io의 **Rust library crate**다. GitHub의 전체 브랜치·Git 이력을 확인한 결과 다음이 없다.
- `wasm-bindgen` 의존성 및 export
- `[lib] crate-type = ["cdylib"]`
- `wasm-pack` 빌드 설정
- `.wasm`, JS glue, npm package
- GitHub Release의 WASM binary
초기 `Cargo.toml`에는 한때 로컬 `dxf-tools-wasm` workspace를 가리키는 설정이 있었지만 [`a265a61`](https://github.com/hakanaktt/acadrust/commit/a265a619c89c49771930f99b8e0ce2649382f85e)에서 제거됐으며, 해당 WASM wrapper 소스나 산출물은 upstream Git 이력에 들어온 적이 없다.
따라서 공식 WASM과 현재 바이너리의 hash를 비교하는 방식은 성립하지 않는다.
## 질문에 대한 직접 판정
### WASM 전체: 커스텀판이 확실함
현재 `acadrust_dwg_bg.wasm`은 upstream 공식 바이너리가 아니라 자체 `rust/dwg-wasm`이 만든 WASM이다. 다음 로직이 자체 코드로 추가돼 있다.
- `parse_dwg`, `parse_dwg_json` WebAssembly export
- `CadDocument`를 Viewer2D 전용 `CadParseResult` JSON으로 변환
- entity/table/header 필드 매핑
- HATCH boundary 원호 샘플링과 손상 호 우회
- OLE2FRAME 이미지/좌표 추출
- 대용량 DWG용 streaming JSON 직렬화
즉 "공식 WASM을 그대로 배포했는가?"에 대한 답은 **아니다**다. 공식 WASM이 존재하지 않으며, 현재 것은 acadrust를 내부 엔진으로 링크한 별도 WASM application/wrapper다.
### acadrust 코어: 문서상 무수정, 현재 증거만으로 확정 불가
저장소 문서와 당시 `Cargo.toml` 주석은 crates.io `acadrust` v0.4.1을 `path = "../acadrust"`로 복사해 **수정 없이 사용했다**고 기록한다. HATCH/OLE/성능 수정도 모두 `rust/dwg-wasm`에서 했다고 명시한다.
그러나 당시 `rust/acadrust` 소스와 lockfile이 Gitea에 없으므로 현재 바이너리만 역으로 분석해 "코어 파일이 한 줄도 수정되지 않았다"고 확정할 수는 없다. 이 부분은 source 복구 후 upstream `f249c2f`와 파일 hash/diff로 검증해야 한다.
## MPL-2.0 현재 의무 판정
Mozilla의 [MPL 2.0 원문 §3.2](https://www.mozilla.org/en-US/MPL/2.0/#distribution-of-executable-form)와 [공식 FAQ Q8–Q11](https://www.mozilla.org/en-US/MPL/2.0/FAQ/) 기준으로 다음처럼 구분해야 한다.
| 대상 | 현재 공개 의무 |
|---|---|
| 무수정 `acadrust` 코어 | **있음** — WASM 수신자에게 대응 MPL Source Code Form을 어디서 얻는지 알려야 함 |
| 직접 수정한 `acadrust` source file | **있음** — 수정된 해당 파일을 포함한 대응 Source Code Form을 MPL-2.0으로 제공 |
| 별도 파일인 `rust/dwg-wasm` wrapper | **원칙적으로 없음** — MPL 코드를 복사하지 않은 별도 파일이면 Larger Work의 자체 코드 |
| Viewer2D/TypeScript 코드 | **원칙적으로 없음** — 별도 파일이고 MPL 코드를 포함하지 않는 경우 |
Mozilla FAQ Q11은 MPL 코드와 별도 파일을 정적 링크한 Larger Work도 전체 소스 공개 대상이 아니라고 명시한다. 따라서 "커스텀 WASM이므로 wrapper 전체를 공개해야 한다"는 결론은 맞지 않는다.
반대로 기존 문서의 "acadrust가 무수정이므로 새 소스 공개 의무가 없다"는 문구도 불완전하다. 외부에 컴파일한 MPL 실행형을 배포하면 무수정이어도 대응 acadrust source의 획득 위치를 수신자에게 알려야 한다(FAQ Q8, §3.2).
Cloudflare Pages는 WASM 사본을 브라우저에 전달하므로 FAQ Q17의 외부 배포에 해당한다. 현재 배포 HTML/JS/public assets에는 acadrust의 정확한 source URL과 MPL 고지가 확인되지 않고, repository README의 간단한 license 표만 있다. 따라서 **현재는 최소한 source availability notice가 부족한 compliance gap으로 보는 것이 안전하다.**
최소 조치:
- 배포 UI 또는 함께 전송되는 JS/NOTICE에 `acadrust`, MPL-2.0, 정확한 commit/source URL을 명시한다.
- 가능하면 검증된 exact source archive를 자체 저장소/배포물에 보존한다.
- `rust/acadrust` 복구 후 `f249c2f`와 diff하여 수정 파일 유무를 확정한다.
- 수정 파일이 발견되면 그 파일과 기존 MPL notice를 MPL-2.0으로 공개한다.
- 별도 wrapper는 MPL 코드를 복사하지 않았음을 파일 단위로 확인하고 자체 라이선스를 유지한다.
## 결론
**링크된 코어는 이름만 같은 별도 구현체로 보이지 않는다.** upstream 저장소는 최초 `dxf-tools-rs` 구현에서 `acadrust`로 이름을 바꾼 뒤 같은 Git 계보에서 계속 개발됐고, 샘플의 WASM에도 그 Rust 소스 경로가 남아 있다.
다만 이 저장소의 `src/viewer2d/acadrust-dwg/`는 upstream 크레이트 자체가 아니라, 로컬에 복사한 `acadrust` 소스를 커스텀 `rust/dwg-wasm` 래퍼와 링크해 만든 **생성물(JS glue + WASM)** 이다. Rust 입력 소스와 lockfile이 Gitea에 없기 때문에 "upstream 0.4.1을 수정 없이 사용했다"는 문서의 주장은 현재 저장소만으로 재현·검증할 수 없다.
따라서 판정은 다음과 같다.
- WASM 패키지: **upstream 공식본이 아닌 자체 구현**
- 링크된 Rust 코어 계보: **upstream과 동일한 계열**
- 소스 관리 방식: **upstream Git 이력을 보존한 subtree/submodule이 아니라 vendored copy로 추정**
- 정확한 snapshot: **미확정** (`0.4.1`만으로 식별 불가)
- 별도 구현 부분: **`dwg-wasm` 변환/직렬화 및 JS 연동 래퍼**
## 근거
### 1. upstream은 rename 전후로 Git 계보가 이어진다
- 최초 소스 커밋: [`db60e63` (`dxf-tools-rs` 0.1.0)](https://github.com/hakanaktt/acadrust/commit/db60e63bbfcccc7f1bf392790e03a9cee39e4dd2)
- 이름 변경: [`f2c7f26` (`Rename crate to acadrust`)](https://github.com/hakanaktt/acadrust/commit/f2c7f265e7f8852e582ab565e2a92de4328e6e52)
- `Cargo.toml` package, repository URL, import 이름을 바꾼 동일 커밋 계보이다.
- 이 커밋은 현재 `main`의 ancestor이다.
- DWG 지원 및 MIT → MPL-2.0 변경: [`741b5a6`](https://github.com/hakanaktt/acadrust/commit/741b5a63f87105d48eb63842261bf78d5b5fce00)
즉 현재 GitHub 프로젝트는 같은 이름을 재사용해 새로 만든 무관한 구현체가 아니라, 기존 `dxf-tools-rs`를 rename하고 확장한 프로젝트다.
### 2. crates.io `0.4.1`은 정확히 `f249c2f`에서 배포됐다
- [`acadrust` 0.4.1](https://crates.io/crates/acadrust/0.4.1)의 `.cargo_vcs_info.json`:
- `git.sha1 = f249c2f816acf36ee51cd5533716bdd443c2517e`
- 다운로드한 crate SHA-256:
- `d96c49ac7520273f8fb65865995efca78f5d75fdaf11d3ba3c87114f6496b941`
- 대응 커밋: [`f249c2f` (`0.4.1`)](https://github.com/hakanaktt/acadrust/commit/f249c2f816acf36ee51cd5533716bdd443c2517e)
주의할 점은 upstream `main`의 현재 HEAD [`c8a58bd`](https://github.com/hakanaktt/acadrust/commit/c8a58bda53489c0f02c1e6f763b718df1ad91c6f)도 버전 문자열이 여전히 `0.4.1`이라는 것이다. 배포 snapshot 이후 **8커밋, 56파일, +6,810/-851줄**이 추가됐다. 따라서 `v0.4.1` 표기만으로 crates.io 배포본과 GitHub 최신 소스를 구분할 수 없다.
### 3. 샘플의 `acadrust-dwg`는 upstream crate가 아니라 커스텀 WASM 패키지다
현재 WASM의 문자열/패닉 경로에는 다음 경로가 포함된다.
```text
D:\MYCLAUDE_PROJECT\hmwebviewer\rust\acadrust\src\...
```
이는 registry dependency를 그대로 링크했다기보다 로컬 `rust/acadrust`를 path dependency로 사용한 빌드라는 근거다. 반면 이 Gitea 저장소와 확인 가능한 `hmwebviewer` main에는 다음 입력이 없다.
- `rust/acadrust/**`
- `rust/dwg-wasm/**`
- Rust `Cargo.lock`
- 고정 toolchain 및 재현 build recipe
저장된 것은 `src/viewer2d/acadrust-dwg/*.js`, `*.d.ts`, `*.wasm` 생성물뿐이다.
### 4. 샘플에서 실제로 변한 부분
| 샘플 커밋 | WASM 크기 | 확인되는 변화 |
|---|---:|---|
| [`95fa6a4`](https://gitea.hmac.kr/cyhan/dwg-dxf-viewer-sample/commit/95fa6a452b50394ff11fba60db482dd038fe2355) | 850,364 B | 최초 WASM 공개 |
| [`be8d52f`](https://gitea.hmac.kr/cyhan/dwg-dxf-viewer-sample/commit/be8d52fcd5917cb08b5f7b97a5a53172fe636f7d) | 866,795 B | OLE2FRAME 이미지/좌표 변환 추가 |
| [`76f3e20`](https://gitea.hmac.kr/cyhan/dwg-dxf-viewer-sample/commit/76f3e2058275d15bd294e8d89ac4d2d21372514e) | 862,104 B | OLE 좌표 추출 수정 |
| [`b047dc4`](https://gitea.hmac.kr/cyhan/dwg-dxf-viewer-sample/commit/b047dc44e237bf730f6503c6b450d441b24c7b29) | 879,925 B | `parse_dwg_json` 스트리밍 경로, 대용량 DWG 및 hatch 보정 |
특히 `b047dc4`에서 공개된 TypeScript 변화는 `parse_dwg(bytes) -> JsValue`에서 `parse_dwg_json(bytes) -> JSON.parse(...)`로 전환한 것이다. 저장소 문서와 커밋 메시지는 이 변경들이 `rust/dwg-wasm` 래퍼에서 이뤄졌고 `rust/acadrust`는 수정하지 않았다고 설명한다.
하지만 Rust 입력 소스가 커밋돼 있지 않아, binary diff만으로는 그 주장을 독립적으로 증명하거나 어느 upstream 커밋인지 확정할 수 없다.
## 리스크
- 동일한 `0.4.1` 문자열을 가진 crates.io 배포본과 GitHub 후속 snapshot을 구분하지 못한다.
- WASM을 재현 빌드할 수 없고, 변경이 wrapper에만 있었는지 감사할 수 없다.
- MPL-2.0 대응에서 실제 배포 바이너리에 대응하는 Source Form을 명확히 가리키기 어렵다.
- 향후 upstream 보안/파싱 수정 반영 여부를 diff 기반으로 판단할 수 없다.
## 제안 작업 / 완료 조건
재현 빌드·SBOM의 상위 작업은 #3에서 계속하고, 이 이슈에서는 provenance 확정을 선행한다.
- [ ] 현재 배포 WASM을 만든 `rust/acadrust`와 `rust/dwg-wasm` 소스를 복구한다.
- [ ] `rust/acadrust`를 crates.io `0.4.1`의 `f249c2f` 및 당시 upstream 후속 커밋과 파일 단위 비교한다.
- [ ] 정확한 upstream URL + full commit SHA + crate checksum을 `UPSTREAM.md` 또는 lockfile에 기록한다.
- [ ] 차이가 있으면 patch를 분리해 저장하고 "unmodified" 문구를 실제 상태에 맞게 수정한다.
- [ ] vendoring을 유지한다면 MPL-2.0 `LICENSE`와 대응 Source Form을 배포물/NOTICE에서 연결한다.
- [ ] 가능하면 `Cargo.toml`의 `git = ..., rev = ...` 또는 검증 가능한 `cargo vendor` 입력으로 교체한다.
- [ ] 동일 source/toolchain/lockfile로 WASM 재현 빌드 후 checksum 또는 허용 가능한 차이를 기록한다.
## 관련 이슈
- #3 — DWG WASM 재현 빌드·SBOM·외부 배포 체계
- #9 — application dist의 third-party license·NOTICE
lectom
changed title from investigation: acadrust upstream 계보와 vendored snapshot 식별 to investigation: acadrust 공식 배포물과 custom DWG WASM 변경 경계2026-08-03 16:50:22 +09:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
조사 목적
현재 배포하는
acadrust-dwgWASM이hakanaktt/acadrust의 공식 WASM과 동일한지, 아니면 별도로 수정·확장한 빌드인지 확인한다.핵심 정정: upstream에는 비교할 "공식 WASM"이 없다
hakanaktt/acadrust가 공식 배포하는 것은 crates.io의 Rust library crate다. GitHub의 전체 브랜치·Git 이력을 확인한 결과 다음이 없다.wasm-bindgen의존성 및 export[lib] crate-type = ["cdylib"]wasm-pack빌드 설정.wasm, JS glue, npm package초기
Cargo.toml에는 한때 로컬dxf-tools-wasmworkspace를 가리키는 설정이 있었지만a265a61에서 제거됐으며, 해당 WASM wrapper 소스나 산출물은 upstream Git 이력에 들어온 적이 없다.따라서 공식 WASM과 현재 바이너리의 hash를 비교하는 방식은 성립하지 않는다.
질문에 대한 직접 판정
WASM 전체: 커스텀판이 확실함
현재
acadrust_dwg_bg.wasm은 upstream 공식 바이너리가 아니라 자체rust/dwg-wasm이 만든 WASM이다. 다음 로직이 자체 코드로 추가돼 있다.parse_dwg,parse_dwg_jsonWebAssembly exportCadDocument를 Viewer2D 전용CadParseResultJSON으로 변환즉 "공식 WASM을 그대로 배포했는가?"에 대한 답은 아니다다. 공식 WASM이 존재하지 않으며, 현재 것은 acadrust를 내부 엔진으로 링크한 별도 WASM application/wrapper다.
acadrust 코어: 문서상 무수정, 현재 증거만으로 확정 불가
저장소 문서와 당시
Cargo.toml주석은 crates.ioacadrustv0.4.1을path = "../acadrust"로 복사해 수정 없이 사용했다고 기록한다. HATCH/OLE/성능 수정도 모두rust/dwg-wasm에서 했다고 명시한다.그러나 당시
rust/acadrust소스와 lockfile이 Gitea에 없으므로 현재 바이너리만 역으로 분석해 "코어 파일이 한 줄도 수정되지 않았다"고 확정할 수는 없다. 이 부분은 source 복구 후 upstreamf249c2f와 파일 hash/diff로 검증해야 한다.MPL-2.0 현재 의무 판정
Mozilla의 MPL 2.0 원문 §3.2와 공식 FAQ Q8–Q11 기준으로 다음처럼 구분해야 한다.
acadrust코어acadrustsource filerust/dwg-wasmwrapperMozilla FAQ Q11은 MPL 코드와 별도 파일을 정적 링크한 Larger Work도 전체 소스 공개 대상이 아니라고 명시한다. 따라서 "커스텀 WASM이므로 wrapper 전체를 공개해야 한다"는 결론은 맞지 않는다.
반대로 기존 문서의 "acadrust가 무수정이므로 새 소스 공개 의무가 없다"는 문구도 불완전하다. 외부에 컴파일한 MPL 실행형을 배포하면 무수정이어도 대응 acadrust source의 획득 위치를 수신자에게 알려야 한다(FAQ Q8, §3.2).
Cloudflare Pages는 WASM 사본을 브라우저에 전달하므로 FAQ Q17의 외부 배포에 해당한다. 현재 배포 HTML/JS/public assets에는 acadrust의 정확한 source URL과 MPL 고지가 확인되지 않고, repository README의 간단한 license 표만 있다. 따라서 현재는 최소한 source availability notice가 부족한 compliance gap으로 보는 것이 안전하다.
최소 조치:
acadrust, MPL-2.0, 정확한 commit/source URL을 명시한다.rust/acadrust복구 후f249c2f와 diff하여 수정 파일 유무를 확정한다.결론
링크된 코어는 이름만 같은 별도 구현체로 보이지 않는다. upstream 저장소는 최초
dxf-tools-rs구현에서acadrust로 이름을 바꾼 뒤 같은 Git 계보에서 계속 개발됐고, 샘플의 WASM에도 그 Rust 소스 경로가 남아 있다.다만 이 저장소의
src/viewer2d/acadrust-dwg/는 upstream 크레이트 자체가 아니라, 로컬에 복사한acadrust소스를 커스텀rust/dwg-wasm래퍼와 링크해 만든 생성물(JS glue + WASM) 이다. Rust 입력 소스와 lockfile이 Gitea에 없기 때문에 "upstream 0.4.1을 수정 없이 사용했다"는 문서의 주장은 현재 저장소만으로 재현·검증할 수 없다.따라서 판정은 다음과 같다.
0.4.1만으로 식별 불가)dwg-wasm변환/직렬화 및 JS 연동 래퍼근거
1. upstream은 rename 전후로 Git 계보가 이어진다
db60e63(dxf-tools-rs0.1.0)f2c7f26(Rename crate to acadrust)Cargo.tomlpackage, repository URL, import 이름을 바꾼 동일 커밋 계보이다.main의 ancestor이다.741b5a6즉 현재 GitHub 프로젝트는 같은 이름을 재사용해 새로 만든 무관한 구현체가 아니라, 기존
dxf-tools-rs를 rename하고 확장한 프로젝트다.2. crates.io
0.4.1은 정확히f249c2f에서 배포됐다acadrust0.4.1의.cargo_vcs_info.json:git.sha1 = f249c2f816acf36ee51cd5533716bdd443c2517ed96c49ac7520273f8fb65865995efca78f5d75fdaf11d3ba3c87114f6496b941f249c2f(0.4.1)주의할 점은 upstream
main의 현재 HEADc8a58bd도 버전 문자열이 여전히0.4.1이라는 것이다. 배포 snapshot 이후 8커밋, 56파일, +6,810/-851줄이 추가됐다. 따라서v0.4.1표기만으로 crates.io 배포본과 GitHub 최신 소스를 구분할 수 없다.3. 샘플의
acadrust-dwg는 upstream crate가 아니라 커스텀 WASM 패키지다현재 WASM의 문자열/패닉 경로에는 다음 경로가 포함된다.
이는 registry dependency를 그대로 링크했다기보다 로컬
rust/acadrust를 path dependency로 사용한 빌드라는 근거다. 반면 이 Gitea 저장소와 확인 가능한hmwebviewermain에는 다음 입력이 없다.rust/acadrust/**rust/dwg-wasm/**Cargo.lock저장된 것은
src/viewer2d/acadrust-dwg/*.js,*.d.ts,*.wasm생성물뿐이다.4. 샘플에서 실제로 변한 부분
95fa6a4be8d52f76f3e20b047dc4parse_dwg_json스트리밍 경로, 대용량 DWG 및 hatch 보정특히
b047dc4에서 공개된 TypeScript 변화는parse_dwg(bytes) -> JsValue에서parse_dwg_json(bytes) -> JSON.parse(...)로 전환한 것이다. 저장소 문서와 커밋 메시지는 이 변경들이rust/dwg-wasm래퍼에서 이뤄졌고rust/acadrust는 수정하지 않았다고 설명한다.하지만 Rust 입력 소스가 커밋돼 있지 않아, binary diff만으로는 그 주장을 독립적으로 증명하거나 어느 upstream 커밋인지 확정할 수 없다.
리스크
0.4.1문자열을 가진 crates.io 배포본과 GitHub 후속 snapshot을 구분하지 못한다.제안 작업 / 완료 조건
재현 빌드·SBOM의 상위 작업은 #3에서 계속하고, 이 이슈에서는 provenance 확정을 선행한다.
rust/acadrust와rust/dwg-wasm소스를 복구한다.rust/acadrust를 crates.io0.4.1의f249c2f및 당시 upstream 후속 커밋과 파일 단위 비교한다.UPSTREAM.md또는 lockfile에 기록한다.LICENSE와 대응 Source Form을 배포물/NOTICE에서 연결한다.Cargo.toml의git = ..., rev = ...또는 검증 가능한cargo vendor입력으로 교체한다.관련 이슈
investigation: acadrust upstream 계보와 vendored snapshot 식별to investigation: acadrust 공식 배포물과 custom DWG WASM 변경 경계