docs: replace real Bose account IDs in examples with placeholders

Two real Bose customer account IDs were embedded in documentation
examples: 3230304 (16 files repo-wide, 5 of them .md/.txt) and
9569497 (2 files, 1 .md). Account IDs look numeric and innocuous but
they're tied to a specific Bose customer — same exposure class as
MACs and home-LAN IPs.

Mapping:
  3230304  → 1000001
  9569497  → 1000002

6 .md files touched in this commit. Remaining occurrences live in
test files and one Python script (scripts/convert_mitm_script.py) —
those are out-of-scope for the docs sweep and will be handled in a
dedicated test-fixtures commit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Tobias Gesellchen
2026-05-17 22:05:13 +02:00
co-authored by Claude Opus 4.7
parent fa51a6f610
commit 29f3fc6f96
6 changed files with 22 additions and 22 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ Content-Type: text/json; charset=utf-8
Content-Length: 587
Authorization: Bearer jGwEmFWr...
{"envelope":{"monoTime":234906,"payloadProtocolVersion":"3.1","payloadType":"scmudc","protocolVersion":"1.0","time":"2026-02-25T23:03:14.976349+00:00","uniqueId":"AABBCCDDEEFF"},"payload":{"deviceInfo":{"boseID":"3230304","deviceID":"AABBCCDDEEFF","deviceType":"SoundTouch 10","serialNumber":"I6332527703739342000020","softwareVersion":"27.0.6.46330.5043500 epdbuild.trunk.hepdswbld04.2022-08-04T11:20:29","systemSerialNumber":"069231P63364828AE"},"events":[{"data":{"play-state":"PAUSE_STATE"},"monoTime":234904,"time":"2026-02-25T23:03:14.973466+00:00","type":"play-state-changed"}]}}
{"envelope":{"monoTime":234906,"payloadProtocolVersion":"3.1","payloadType":"scmudc","protocolVersion":"1.0","time":"2026-02-25T23:03:14.976349+00:00","uniqueId":"AABBCCDDEEFF"},"payload":{"deviceInfo":{"boseID":"1000001","deviceID":"AABBCCDDEEFF","deviceType":"SoundTouch 10","serialNumber":"I6332527703739342000020","softwareVersion":"27.0.6.46330.5043500 epdbuild.trunk.hepdswbld04.2022-08-04T11:20:29","systemSerialNumber":"069231P63364828AE"},"events":[{"data":{"play-state":"PAUSE_STATE"},"monoTime":234904,"time":"2026-02-25T23:03:14.973466+00:00","type":"play-state-changed"}]}}
{% raw %}
> {%
+3 -3
View File
@@ -192,13 +192,13 @@ One row per device tested. Once two devices on different firmware confirm the sa
### Appendix — SystemConfigurationDB.xml comparison
Post-experiment we compared the device-written `/mnt/nv/BoseApp-Persistence/1/SystemConfigurationDB.xml` from the bare-paired speaker against two SSH backups taken from speakers originally paired by the official Bose app (account 3230304, devices `A_Sound_Machine` and `Sound_Machinechen`). The diff is much smaller than expected — only two fields differ, and neither is set by the pairing protocol itself:
Post-experiment we compared the device-written `/mnt/nv/BoseApp-Persistence/1/SystemConfigurationDB.xml` from the bare-paired speaker against two SSH backups taken from speakers originally paired by the official Bose app (account 1000001, devices `A_Sound_Machine` and `Sound_Machinechen`). The diff is much smaller than expected — only two fields differ, and neither is set by the pairing protocol itself:
| Field | Bare-paired (1111111) | Real-Bose-paired (3230304) | Set by |
| Field | Bare-paired (1111111) | Real-Bose-paired (1000001) | Set by |
|--------------------------|--------------------------------------------|----------------------------|-----------------------------------------------------------------------------------------------------------|
| `DeviceName` | `Bose SoundTouch 536A98` (factory default) | `Living Room SoundTouch` | `name` WS message — only sent in `--mode=full` |
| `AccountAssociatedEMail` | empty | **empty** | Never populated, even by real Bose |
| `AccountUUID` | `1111111` | `3230304` | `setMargeAccount` — both paths set it |
| `AccountUUID` | `1111111` | `1000001` | `setMargeAccount` — both paths set it |
| `Locale` | empty | **empty** | Never populated, even by real Bose |
| `acctMode` | `global` | `global` | Firmware-default; no protocol path observed to change it |
| `isMultiDeviceAccount` | `false` | `true` | Derived from the cloud's `/streaming/account/{id}/full` response — count of `<devices>` > 1 flips it true |
@@ -39,7 +39,7 @@ The current system uses multiple data collection methods to build a complete dev
<info deviceID="ABCD1234EFGH">
<name>My SoundTouch Device</name>
<type>SoundTouch 10</type>
<margeAccountUUID>3230304</margeAccountUUID>
<margeAccountUUID>1000001</margeAccountUUID>
<components>
<component>
<componentCategory>SCM</componentCategory>
+11 -11
View File
@@ -17,9 +17,9 @@ The service automatically maps between these identifiers so that API requests us
### Request Flow
```
1. HTTP Request: GET /streaming/account/3230304/device/AABBCCDDEEFF/presets
1. HTTP Request: GET /streaming/account/1000001/device/AABBCCDDEEFF/presets
2. MAC Resolution: AABBCCDDEEFF → I6332527703739342000020
3. File Access: accounts/3230304/devices/I6332527703739342000020/Presets.xml
3. File Access: accounts/1000001/devices/I6332527703739342000020/Presets.xml
```
### UPnP Discovery Integration
@@ -64,7 +64,7 @@ The service handles all common MAC address formats automatically:
**Symptoms:**
```
GET /streaming/account/3230304/device/AABBCCDDEEFF/presets
GET /streaming/account/1000001/device/AABBCCDDEEFF/presets
→ 500 Internal Server Error
→ Log: "open .../devices/AABBCCDDEEFF/Presets.xml: no such file or directory"
```
@@ -73,13 +73,13 @@ GET /streaming/account/3230304/device/AABBCCDDEEFF/presets
1. Check if mapping exists:
```bash
# Look for device directory
ls data/accounts/3230304/devices/
ls data/accounts/1000001/devices/
# Should show serial numbers like: I6332527703739342000020
```
2. Check DeviceInfo.xml:
```bash
cat data/accounts/3230304/devices/I6332527703739342000020/DeviceInfo.xml
cat data/accounts/1000001/devices/I6332527703739342000020/DeviceInfo.xml
# Look for <macAddress> field
```
@@ -106,10 +106,10 @@ Ensure the MAC address is present:
If the device was added manually, ensure proper structure:
```bash
# Create device directory using serial number
mkdir -p data/accounts/3230304/devices/I6332527703739342000020
mkdir -p data/accounts/1000001/devices/I6332527703739342000020
# Create DeviceInfo.xml with MAC address
cat > data/accounts/3230304/devices/I6332527703739342000020/DeviceInfo.xml << EOF
cat > data/accounts/1000001/devices/I6332527703739342000020/DeviceInfo.xml << EOF
<?xml version="1.0" encoding="UTF-8"?>
<info deviceID="I6332527703739342000020">
<name>My SoundTouch Device</name>
@@ -144,9 +144,9 @@ This should be handled automatically, but you can verify:
**Test different formats:**
```bash
# All of these should work the same:
curl http://localhost:8000/streaming/account/3230304/device/AABBCCDDEEFF/presets
curl http://localhost:8000/streaming/account/3230304/device/a81b6a536a98/presets
curl http://localhost:8000/streaming/account/3230304/device/AA:BB:CC:DD:EE:FF/presets
curl http://localhost:8000/streaming/account/1000001/device/AABBCCDDEEFF/presets
curl http://localhost:8000/streaming/account/1000001/device/a81b6a536a98/presets
curl http://localhost:8000/streaming/account/1000001/device/AA:BB:CC:DD:EE:FF/presets
```
## 📊 **Monitoring and Diagnostics**
@@ -162,7 +162,7 @@ Ensure proper directory organization:
```
data/
└── accounts/
└── 3230304/
└── 1000001/
└── devices/
└── I6332527703739342000020/ # Serial number directory
├── DeviceInfo.xml # Contains MAC address
+3 -3
View File
@@ -1008,7 +1008,7 @@ Use this checklist to systematically troubleshoot issues:
**Symptoms:**
```
GET /streaming/account/3230304/device/AABBCCDDEEFF/presets
GET /streaming/account/1000001/device/AABBCCDDEEFF/presets
→ 500 Internal Server Error
→ Log: "open .../devices/AABBCCDDEEFF/Presets.xml: no such file or directory"
```
@@ -1025,13 +1025,13 @@ sudo systemctl restart soundtouch-service
2. **Check device directory structure**:
```bash
# Files should be stored by serial number, not MAC
ls data/accounts/3230304/devices/
ls data/accounts/1000001/devices/
# Should show: I6332527703739342000020/ (not AABBCCDDEEFF/)
```
3. **Verify DeviceInfo.xml contains MAC address**:
```bash
cat data/accounts/3230304/devices/*/DeviceInfo.xml | grep macAddress
cat data/accounts/1000001/devices/*/DeviceInfo.xml | grep macAddress
```
**For detailed diagnosis and solutions**, see: [**MAC Address Mapping Guide**](MAC-ADDRESS-MAPPING.md)
+3 -3
View File
@@ -86,7 +86,7 @@ All subsequent messages (except `selectLastWiFiSource`, see below) use this enve
<info deviceID="{device_id}">
<name>SoundTouch 10</name>
<type>SoundTouch 10</type>
<margeAccountUUID>9569497</margeAccountUUID> <!-- empty = unpaired -->
<margeAccountUUID>1000002</margeAccountUUID> <!-- empty = unpaired -->
<margeURL>https://streaming.bose.com</margeURL>
...
</info>
@@ -165,7 +165,7 @@ The pairing flow uses a setup state machine on the device. States must be sent i
The server also pushes several `sourcesUpdated` events after successful pairing.
**`{accountId}`** — the numeric Bose account ID (e.g. `9569497`), obtainable from
**`{accountId}`** — the numeric Bose account ID (e.g. `1000002`), obtainable from
`GET /streaming/account/login` on soundtouch-service.
**`{token}`** — a Bearer token issued by Bose authentication (or soundtouch-service).
@@ -515,7 +515,7 @@ running and authenticated):
## Source References
- `bose-pairing-20260502-155542` — Session 1: initial pairing of SoundTouch 10 to account 9569497
- `bose-pairing-20260502-155542` — Session 1: initial pairing of SoundTouch 10 to account 1000002
- `bose-pairing-20260502-165549` — Session 2: re-pairing and full operation (TuneIn, Spotify, presets)
- Raw WebSocket files: `scripts/android/mitm/{session}/mirror/{n}-websocket/*.txt`
- Companion HTTP upgrade files: `scripts/android/mitm/{session}/mirror/{n}-*.http`