DRD Get User — Group 16, Code 141

Fetches one directory record by denomination + serial number. Open read: no authentication required. This is how a QMail client learns a correspondent’s display name, avatar symbols, inbox fee, and account age before sending.

Quick reference

Command Group16 (DRD)
Command Code141 (0x8D)
Server functioncmd_drd_get_user in cmd_drd.c
Request bodyExactly 23 bytes: challenge(16) + DN(1) + SN(4) + terminator(2)
AuthenticationNone — user records are public
Success responseStatus 250 + one user record (34 + name bytes)
Not foundStatus 193 (ERROR_NO_ENTRY), no payload

Request body (23 bytes)

Challenge random (12 bytes, part 1 of 2) 0 7 Challenge random (part 2) 8 11 Challenge CRC32 (BE) 12 15 DN 16 Serial Number (BE) 17 20 3E 3E (term) 21 22
Body offsetSizeFieldDescription
0–1112Challenge randomRandom bytes generated by the client.
12–154Challenge CRC32Big-endian CRC32 of bytes 0–11.
161DenominationDenomination of the record being fetched.
17–204Serial NumberSerial number of the record being fetched, big-endian.
21–222TerminatorFixed 3E 3E. The body must be exactly 23 bytes.

Response

On success the payload is one user record in the standard DRD serialization:

User record payload (34 + FL + LL bytes)

+------+--------+-----------+----+----+----+------------+------------+----+-------+----+------+
| DN   | SN     | inbox fee | S1 | S2 | CR | created_at | updated_at | FL | first | LL | last |
| 1    | 4 (BE) | 8 (BE)    | 1  | 1  | 1  | 8 (BE)     | 8 (BE)     | 1  | FL    | 1  | LL   |
+------+--------+-----------+----+----+----+------------+------------+----+-------+----+------+
offset 0   1       5          13   14   15   16           24           32   33     ...  ...
Payload offsetSizeFieldDescription
01DenominationEcho of the record key.
1–44Serial NumberEcho of the record key, big-endian.
5–128Inbox feeBig-endian signed int64, units of 10−8 CC.
131First symbolAvatar symbol index.
141Second symbolAvatar symbol index.
151Class rejection (CR)Signed minimum sender denomination (0x00 = accepts all; 0xFF = −1 = 0.1 CC). Senders below this denomination are rejected at the Tell gate with ERROR_SENDER_CLASS_REJECTED (237).
16–238created_atBig-endian Unix seconds. First-post time; never changes. Display account age from this.
24–318updated_atBig-endian Unix seconds of the latest post.
321First-name length (FL)0–63.
33...FLFirst nameUTF-8.
33+FL1Last-name length (LL)0–63.
34+FL...LLLast nameUTF-8.

Status codes

DecimalHexSymbolMeaning
2500xFASTATUS_SUCCESSRecord returned in the payload.
1930xC1ERROR_NO_ENTRYNo record exists for that denomination/serial on this RAIDA.
160x10ERROR_INVALID_PACKET_LENGTHBody is not exactly 23 bytes.
2520xFCERROR_INTERNALDatabase failure.
2540xFEERROR_MEMORY_ALLOCServer allocation failure.

Common mistakes

Treating 193 on one RAIDA as “user does not exist”

RAIDAs are independent. A record can be present on 24 servers and missing on one that was offline during the post. Query a few servers before concluding a user is unregistered.

Reading names as fixed-width fields

Both names are length-prefixed and variable. The record has no fixed total size; always honor FL and LL.