Desktop RTDB: Repo::HandleTransactionResponse collapses every non-datastale server error (incl. permission_denied) to kErrorUnknownError with an empty message
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức phù hợp với người mới
- 70/100
Hướng nghiên cứu
Bắt đầu tại database/src/desktop/core/repo.cc, ở Repo::HandleTransactionResponse() và RerunTransactionQueue(), sau đó so sánh luồng trạng thái và thông báo của phản hồi trong database/src/desktop/connection/persistent_connection.cc. Hoàn thành khi các lỗi giao dịch giữ nguyên mã lỗi máy chủ đã được ánh xạ và thông báo, bao gồm permission_denied, thay vì hoàn tất dưới dạng kErrorUnknownError với thông báo trống.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Environment
- Firebase C++ SDK 13.9.0 (desktop/Windows; the cited code is unchanged at the 13.11.0 tag)
- Identified while tracing FlutterFire
firebase_database12.4.6 on Windows; the defect below is independently confirmed from the pinned desktop C++ source.
What happens
When the server rejects a transaction commit (e.g. a security-rules fence returns permission_denied on the wire), the transaction Future<DataSnapshot> completes with:
error()=kErrorUnknownError(10) — notkErrorPermissionDenied(8)error_message()=""(empty)
so callers cannot distinguish "rules denied this commit" from any other failure, and there is no message to log. Plain SetValue() writes on the same path correctly surface kErrorPermissionDenied, which makes the transaction behavior surprising.
Where the information is lost (pinned to 3d7ce2a, the 13.9.0 tag)
- The wire layer maps the response status correctly and retains the server message.
HandlePutResponse()converts the status and passes the response body toTriggerResponse():
https://github.com/firebase/firebase-cpp-sdk/blob/3d7ce2a584d0b8daf1374bc2534c6ea71fa7fd6c/database/src/desktop/connection/persistent_connection.cc#L955-L970
TriggerResponse()stores both values, and the adjacent status map includespermission_denied→kErrorPermissionDenied:
https://github.com/firebase/firebase-cpp-sdk/blob/3d7ce2a584d0b8daf1374bc2534c6ea71fa7fd6c/database/src/desktop/connection/persistent_connection.cc#L1244-L1281 Repo::HandleTransactionResponse()then discards both fields for every error response other thandatastale:
https://github.com/firebase/firebase-cpp-sdk/blob/3d7ce2a584d0b8daf1374bc2534c6ea71fa7fd6c/database/src/desktop/core/repo.cc#L982-L1000for (auto& transaction : response->queue()) { transaction->status = TransactionData::kStatusNeedsAbort; transaction->abort_reason = kErrorUnknownError; }RerunTransactionQueue()finally completes the future with the no-message overload, soerror_message()is empty:
https://github.com/firebase/firebase-cpp-sdk/blob/3d7ce2a584d0b8daf1374bc2534c6ea71fa7fd6c/database/src/desktop/core/repo.cc#L1003-L1138DataSnapshot snapshot(new DataSnapshotInternal( database_, node, QuerySpec(transaction->path))); transaction->ref_future->CompleteWithResult(transaction->future_handle, abort_reason, snapshot);
Expected
abort_reason should carry the mapped response code (8 for permission_denied, etc.) and the completion should pass the response's error message through, matching what the Android SDK reports for the same server rejection.
Impact
Any desktop app implementing fenced/optimistic transactions (rules-enforced epochs, leases, counters) receives an undiagnosable unknown/empty failure for what is actually a well-defined rules denial. Downstream SDK wrappers (e.g. FlutterFire's Windows plugin) inherit the collapsed code, so the loss is user-visible in every binding built on this implementation.
- Ngôn ngữ chính
- C++
- Star
- 326
- Fork
- 138
- Merge trung bình
- 2 ngày 16 giờ
- Pull request đã merge (30 ngày)
- 3
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của firebase/firebase-cpp-sdk
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
firebase/firebase-cpp-sdk#1905 · 2 bình luận ·
-
api: firestore
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 35/100
firebase/firebase-cpp-sdk#1920 · 3 bình luận ·
-
new type: question
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 45/100
firebase/firebase-cpp-sdk#1892 · 1 bình luận ·
-
nightly-testing
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 25/100
firebase/firebase-cpp-sdk#1859 ·
-
nightly-testing
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 30/100
firebase/firebase-cpp-sdk#1858 ·
Tất cả issue của firebase/firebase-cpp-sdk
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
flutter-webrtc/flutter-webrtc#2206 ·
-
litertlm-android AAR ships no consumer ProGuard rules → "mid == null" SIGABRT in minified apps Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
google-ai-edge/LiteRT-LM#3739 ·
-
Component: GLib
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
-
Mute ydb/tests/functional/dstool/test_canonical_requests.py.Test.test_group_take_snapshot in main Đang mởai_reviewed
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
ydb-platform/ydb#53974 · 3 bình luận ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
google/libultrahdr#485 ·