HSFETCH not followed by HS_DESC_CONTENT event
Hi,
I'm trying to periodically get a hidden service descriptor to monitor changes. I tried using stem with the following python script:
from stem.control import Controller
import datetime
import time
ONION = 'expyuzz4wqqyqhjn'
with Controller.from_port(port = 9051) as controller:
controller.authenticate()
while True:
print(datetime.datetime.now())
desc = controller.get_hidden_service_descriptor(ONION)
time.sleep(60)
However, after about six iterations the get_hidden_service_descriptor blocks indefinitely (I waited up to 24 hours). I manually recreated what stem sends to the control port:
% nc 127.0.0.1 9051
AUTHENTICATE
250 OK
SETEVENTS HS_DESC_CONTENT HS_DESC
250 OK
HSFETCH expyuzz4wqqyqhjn
250 OK
650 HS_DESC REQUESTED expyuzz4wqqyqhjn NO_AUTH $D0B232E732DD69F181815EE6648E9AB8A67F73BA~ididntedittheconfig 2baufgsbt3a2jolhmvrsmd3ufdg72cyz
650 HS_DESC RECEIVED expyuzz4wqqyqhjn NO_AUTH $D0B232E732DD69F181815EE6648E9AB8A67F73BA~ididntedittheconfig 2baufgsbt3a2jolhmvrsmd3ufdg72cyz
650+HS_DESC_CONTENT expyuzz4wqqyqhjn 2baufgsbt3a2jolhmvrsmd3ufdg72cyz $D0B232E732DD69F181815EE6648E9AB8A67F73BA~ididntedittheconfig
<...>
650 OK
HSFETCH expyuzz4wqqyqhjn
250 OK
650 HS_DESC REQUESTED expyuzz4wqqyqhjn NO_AUTH $D05A37450AB9950181124563D3A7DBC5EE7D30BB~r3dn3ck 2baufgsbt3a2jolhmvrsmd3ufdg72cyz
650 HS_DESC RECEIVED expyuzz4wqqyqhjn NO_AUTH $D05A37450AB9950181124563D3A7DBC5EE7D30BB~r3dn3ck 2baufgsbt3a2jolhmvrsmd3ufdg72cyz
650+HS_DESC_CONTENT expyuzz4wqqyqhjn 2baufgsbt3a2jolhmvrsmd3ufdg72cyz $D05A37450AB9950181124563D3A7DBC5EE7D30BB~r3dn3ck
<...>
650 OK
HSFETCH expyuzz4wqqyqhjn
250 OK
650 HS_DESC REQUESTED expyuzz4wqqyqhjn NO_AUTH $707C1B61AC72227B34487B56D04BAA3BA1179CE8~BrassHornExit04 oalrv2mxdne6gfwikalgyl47sktjwxte
650 HS_DESC RECEIVED expyuzz4wqqyqhjn NO_AUTH $707C1B61AC72227B34487B56D04BAA3BA1179CE8~BrassHornExit04 nyuijvpn63lgfbupw5vqyfdhzbllyk7v
650+HS_DESC_CONTENT expyuzz4wqqyqhjn oalrv2mxdne6gfwikalgyl47sktjwxte $707C1B61AC72227B34487B56D04BAA3BA1179CE8~BrassHornExit04
<...>
650 OK
HSFETCH expyuzz4wqqyqhjn
250 OK
650 HS_DESC REQUESTED expyuzz4wqqyqhjn NO_AUTH $D06CD6EDAA93F4656E0C9F6347B26A2828D6CB25~Unnamed 2baufgsbt3a2jolhmvrsmd3ufdg72cyz
650 HS_DESC RECEIVED expyuzz4wqqyqhjn NO_AUTH $D06CD6EDAA93F4656E0C9F6347B26A2828D6CB25~Unnamed 2baufgsbt3a2jolhmvrsmd3ufdg72cyz
650+HS_DESC_CONTENT expyuzz4wqqyqhjn 2baufgsbt3a2jolhmvrsmd3ufdg72cyz $D06CD6EDAA93F4656E0C9F6347B26A2828D6CB25~Unnamed
<...>
650 OK
HSFETCH expyuzz4wqqyqhjn
250 OK
650 HS_DESC REQUESTED expyuzz4wqqyqhjn NO_AUTH $7056EA2E99144613694F0264C80579AAFEA6E1CD~ozora oalrv2mxdne6gfwikalgyl47sktjwxte
650 HS_DESC RECEIVED expyuzz4wqqyqhjn NO_AUTH $7056EA2E99144613694F0264C80579AAFEA6E1CD~ozora 2baufgsbt3a2jolhmvrsmd3ufdg72cyz
650+HS_DESC_CONTENT expyuzz4wqqyqhjn oalrv2mxdne6gfwikalgyl47sktjwxte $7056EA2E99144613694F0264C80579AAFEA6E1CD~ozora
<...>
650 OK
HSFETCH expyuzz4wqqyqhjn
250 OK
650 HS_DESC REQUESTED expyuzz4wqqyqhjn NO_AUTH $7044955A4D7B04CF70011D73B467B13CE5E69D41~L29Ah oalrv2mxdne6gfwikalgyl47sktjwxte
650 HS_DESC RECEIVED expyuzz4wqqyqhjn NO_AUTH $7044955A4D7B04CF70011D73B467B13CE5E69D41~L29Ah 2baufgsbt3a2jolhmvrsmd3ufdg72cyz
650+HS_DESC_CONTENT expyuzz4wqqyqhjn oalrv2mxdne6gfwikalgyl47sktjwxte $7044955A4D7B04CF70011D73B467B13CE5E69D41~L29Ah
<...>
650 OK
HSFETCH expyuzz4wqqyqhjn
250 OK
No HS_DESC or HS_DESC_CONTENT is received after the last HSFETCH (I waited about an hour). The control port spec (https://gitweb.torproject.org/torspec.git/tree/control-spec.txt) states that "On success, Tor replies "250 OK" then Tor MUST eventually follow this with both a HS_DESC and HS_DESC_CONTENT events with the results.".
I guess that stem blocks because it waits for the event. If I send another HSFETCH expyuzz4wqqyqhjn after a couple of minutes, the corresponding events are emitted just fine. Also I noticed that when the sleep in the above python script is increased to 10 minutes, get_hidden_service_descriptor continues to return a result quickly.
Trac:
Username: nickler