diff --git a/README.md b/README.md
index 740ff63..0c87157 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,6 @@ If you do try to use it, you'll need to create ~/.config/sucks.conf. It
should look something like this:
```
-email=user@example.org
user=2017010101abdef012345
domain=ecouser.net
resource=abcdef01
@@ -21,9 +20,10 @@ vacuum=[robot id]@126.ecorobot.net
```
I got these values by using xmppeek to do a man-in-the-middle attack on
-the android app. I suspect that the Android app re-keys the connection
-on a regular basis, as the secret was changing regularly up until I
-cleared the Android app's data from my phone.
+the android app. You can use the included log_clean.py script to generate
+a config from a captured session. (I suspect that the Android app re-keys
+the connection on a regular basis, as the secret was changing regularly
+up until I cleared the Android app's data from my phone.)
If you're curious about the protocol, I have [a very rough
doc](protocol.md) started. I'll happily accept pull requests for it.
diff --git a/log_clean.py b/log_clean.py
index 7230b79..25dea57 100644
--- a/log_clean.py
+++ b/log_clean.py
@@ -1,5 +1,6 @@
-import sys
+import base64
import re
+import sys
# a script to take an xmpppeek log of a Ecovacs app session with a Deebot N79 and strip out some of the nonsense,
# including any private identifiers
@@ -35,7 +36,8 @@ for line in sys.stdin:
if match:
robotid = match.group(1)
if not auth_glob:
- match = re.search('([-A-Za-z0-9+/=]+)', line)
+ match = re.search('([-A-Za-z0-9+/=]+)',
+ line)
if match:
auth_glob = match.group(1)
if source_ip:
@@ -51,13 +53,34 @@ for line in sys.stdin:
# translate client commmands
- line = re.sub('()', 'id=\\1 command=\\2', line)
+ line = re.sub(
+ '()',
+ 'id=\\1 command=\\2', line)
# translate server responses
- line = re.sub('', 'id=\\1 result =empty', line)
- line = re.sub('', 'id=\\1 id=\\2 result=\\3', line)
- line = re.sub('(', 'id=\\1 response=\\2', line)
+ line = re.sub(
+ '',
+ 'id=\\1 result =empty', line)
+ line = re.sub(
+ '',
+ 'id=\\1 id=\\2 result=\\3', line)
+ line = re.sub(
+ '(',
+ 'id=\\1 response=\\2', line)
print(line)
+# per SASL plain auth: https://tools.ietf.org/html/rfc4616
+(authentication_id, authorization_id, password) = base64.b64decode(auth_glob).decode().split(sep='\0')
+
+# no idea what the leading field is, and the resource appears to be the same
+(mystery, resource, secret) = password.split('/')
+
+print("------------------")
+print("sample config:")
+print("user=" + userid)
+print("domain=ecouser.net")
+print("resource=" + resourceid)
+print("secret=" + secret)
+print("vacuum=" + robotid + "@126.ecorobot.net")