Repository navigation
Conversation
Lash-L
reviewed
Oct 31, 2026
| if not did and clean_path.startswith("/devices/"): | ||
| parts = clean_path.strip("/").split("/") | ||
| if len(parts) >= 2: | ||
| did = parts[1] |
Contributor
There was a problem hiding this comment.
extract_did() falls back to ctx.duid, so the new if not did branch never reads the path when a default device is configured. For /devices/222/sh with default device 111 and no query DID, I confirmed that only device 111 can decrypt the grant. Use extract_explicit_did() before falling back to the path.
Author
There was a problem hiding this comment.
nice catch, I've updated to use ctx.extract_explicit_did() first.
Lash-L
marked this pull request as draft
October 31, 2026 02:45
Contributor
|
Please mark as ready when my comment is resolved (so long as you agree with it) |
ratel-dev
marked this pull request as ready for review
November 2, 2026 20:11
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem & Background
On newer Roborock models with v2 firmware (verified on the Saros 10R /
roborock.vacuum.a143, firmware02.50.56), the robot blocks all incoming RPC control commands (get_status,app_start,get_map_v1, etc.) roughly 48 hours after onboarding, returning:{"code": -10002, "message": "rrcheck access denied"}While RPC commands are blocked, MQTT telemetry and status events remain connected. Re-onboarding only temporarily resets the 48-hour grace window.
Root Cause
Roborock firmware requires periodic local access license renewal (
rrcheck). While older generations (such as the S7 series) renew this viaPOST /f/c, newer firmware does not hit/f/c. Instead, it queries:Because
routes/fw/check.pypreviously only matched/f/cvariants, this request fell through tocatchall({"ok": true}), which the robot rejects as an invalid grant. After the ~48-hour grace period expires, internal access control locks up.Changes
match()inroutes/fw/check.pyto recognize paths starting with/devices/and ending with/shalongside existing_MATCH_PATHS.didis not present in query or body parameters, it is extracted directly from the path segments (/devices/<did>/sh).{k, d}inside the envelope expected by/shrequests:{ "k": payload["k"], "d": payload["d"], "success": True, "code": 200, "msg": "success", "data": payload, "result": payload, }POST /f/crequests continue to receive the standard flat{k, d}dict. Devices without a recovered public key continue falling back tocatchall.Verification & Environment
roborock.vacuum.a143)02.50.56-10002lockups.