From 010e9acfbd873588cb4b9de2e29ccc216acfe2e3 Mon Sep 17 00:00:00 2001 From: jjangddu Date: Mon, 1 Jun 2026 17:30:19 +0900 Subject: [PATCH] Labdb fix: payload sanitize for PostgreSQL JSONB compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 서버 로그에서 두 원인 확인: [error] POST /devices/register invalid byte sequence for encoding UTF8: 0x00 [error] POST /upload/json unsupported Unicode escape sequence PostgreSQL JSONB는 NULL escape를 거부 (HTTP 500). BLE rid: 응답에서 US-ASCII 디코딩 후 .trim()은 whitespace만 제거하고 NULL/제어문자는 남기므로, firmware/hw/serial 문자열에 padding NULL이 묻은 채 payload로 직렬화됨. 두 군데 방어: 1. BleManager.rid: 파싱에서 0x00~0x1F,0x7F를 공백으로 치환 후 trim 2. LabdbClient.sanitizeForJsonb 추가 — register/uploadJson 직전에 payload를 재귀적으로 순회하며 모든 string에서 C0 control + DEL 제거 (탭/개행/캐리지리턴은 보존) 원인 조사: 서버 SSH로 /var/log/labdb.log 직접 확인 + server.js의 /upload/json 핸들러 코드 검토 결과 서버는 받은 sensor/channels JSON을 그대로 JSONB 컬럼에 INSERT. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../medilightv2android/ble/BleManager.kt | 7 ++++++- .../services/labdb/LabdbClient.kt | Bin 7708 -> 9353 bytes 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt b/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt index 7b041c2..6e1321b 100644 --- a/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt +++ b/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt @@ -995,7 +995,12 @@ class BleManager private constructor(private val context: Context) { } } "rid:" -> { - val info = if (data.size > 4) String(data, 4, data.size - 4, Charsets.US_ASCII).trim() else "?" + // BLE 응답 끝에 NULL byte padding이 붙는 경우가 있음 — PostgreSQL JSONB가 + // 0x00을 거부하므로 trim()으로 안 빠지는 NULL/제어문자를 명시적으로 제거. + val info = if (data.size > 4) + String(data, 4, data.size - 4, Charsets.US_ASCII) + .replace(Regex("[\\x00-\\x1F\\x7F]"), " ").trim() + else "?" debugLogger.rx("rid", data.size, "device_info=$info") debugLogger.info("DEVICE_INFO $info") // 형식: "VBTHW0100 VBT26040001 VBTFW0111" (HW, Serial, FW) diff --git a/app/src/main/java/com/example/medilightv2android/services/labdb/LabdbClient.kt b/app/src/main/java/com/example/medilightv2android/services/labdb/LabdbClient.kt index bb4035b4451d3eb6ed8127a2d0b890684686ce4f..e287f04ea8fab0381e56d32ca8ebe3f514404eea 100644 GIT binary patch delta 1560 zcmcgs&rj4q6qeu#59);oUY;CCi`w0l7?rprKr})&fG#8+Ow4RMyE{^5>ddsb0;%z4 zJgz6gA3?%D;@{xaKSJMYx4VUvt3CBizxU(&zBfI6{%!s2Y~uQg*6jRbLQYK^CWRHB z`AelYjFK&0%je&xe@~{Bg@qiw0B^V-Ya=he>6Hay1JJXmeKK(S1uq`_Ls_n8q&vJjd0OygWu zGZ6}$jL4u&K|q1+rp$tgb%Lx-QMic`%Z{_#e819MTVHn};5Z23?}LZm_8qsNR>^XN zv|M91XvY%9B-cvWrOeQ+7TM{-VcrQnN>a?)<2?g)Ae=|1q8Pys@(ozaSIkM=QFltC z2Qz6)b5fK&#yq()iLOMCa&8t$*@=_%<;^>NF*}o9JVy_62{TxkNT!7#EvgVpD?&i5 z7joILU1yB)MQsR4(ugq}q&dNnG=wE(#Q#y|_DIf*a#*sX3g^!YcM}Qgx#ydvn);rb?~58y@aSOx^V2` zO|-Gbn=o8hT1L~tZOrvtjYSx6jkD!Gjn*V{(u#6c1k;Vy_