forked from openrs2/openrs2
There are still a small number of items I need to flesh out. I also need to document response codes for packets other than 16/18, as some response codes differ from the standard set. Signed-off-by: Graham <gpe@openrs2.org>bzip2
parent
62271878b6
commit
bb18fc7d50
@ -0,0 +1,370 @@ |
|||||||
|
# Login protocol |
||||||
|
|
||||||
|
## Upstream |
||||||
|
|
||||||
|
| Opcode | Length | Jagex name | Description | |
||||||
|
|-------:|---------------:|-----------------------------|------------------------------------| |
||||||
|
| 14 | 1 | `INIT_GAME_CONNECTION` | Set username hash | |
||||||
|
| 15 | 4 | `INIT_JS5REMOTE_CONNECTION` | Switch to JS5 mode | |
||||||
|
| 16 | Variable short | `GAMELOGIN` | Login (new session) | |
||||||
|
| 17 | 0 | Unknown | Switch to JAGGRAB mode | |
||||||
|
| 18 | Variable short | Unknown | Reconnect (existing session) | |
||||||
|
| 20 | 6 | Unknown | Check date of birth and country | |
||||||
|
| 21 | 8 | `CREATE_CHECK_NAME` | Check username availability | |
||||||
|
| 22 | Variable byte | `CREATE_ACCOUNT` | Create account | |
||||||
|
| 23 | 4 | `REQUEST_WORLDLIST` | Request world list | |
||||||
|
| 24 | Variable byte | `CHECK_WORLD_SUITABILITY` | Request most suitable world number | |
||||||
|
|
||||||
|
### 14 (`INIT_GAME_CONNECTION`) |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|--------------|---------------| |
||||||
|
| UnsignedByte | Username hash | |
||||||
|
|
||||||
|
The following algorithm computes the username hash: |
||||||
|
|
||||||
|
usernameHash = (encodedUsername >> 16) & 0x1F |
||||||
|
|
||||||
|
where `encodedUsername` is the player's Base37-encoded username. |
||||||
|
|
||||||
|
The consensus in the community is that Jagex's implementation uses the username |
||||||
|
hash to load balance between login servers, but this has not been confirmed. |
||||||
|
|
||||||
|
### 15 (`INIT_JS5REMOTE_CONNECTION`) |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|-----------|---------------------| |
||||||
|
| Int | Client build number | |
||||||
|
|
||||||
|
### 16 (`GAMELOGIN`) |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|---------------|----------------------------------------------| |
||||||
|
| Int | Client build number | |
||||||
|
| Byte | Unknown (hard-coded to `0` in client script) | |
||||||
|
| Boolean | Advert suppressed | |
||||||
|
| Boolean | Client signed | |
||||||
|
| UnsignedByte | Display mode | |
||||||
|
| UnsignedShort | Canvas width | |
||||||
|
| UnsignedShort | Canvas height | |
||||||
|
| UnsignedByte | Anti-aliasing mode | |
||||||
|
| Byte\[24\] | UID | |
||||||
|
| String | Settings cookie | |
||||||
|
| Int | Affiliate ID | |
||||||
|
| Int | Preferences | |
||||||
|
| Short | TODO | |
||||||
|
| Int\[29\] | JS5 archive checksums | |
||||||
|
| UnsignedByte | RSA-encrypted payload length (n) | |
||||||
|
| Byte\[n\] | RSA-encrypted payload | |
||||||
|
|
||||||
|
The unknown byte hard-coded to `0` in a client script might represent the |
||||||
|
language. It is consistent with the ID for English. We can infer that there |
||||||
|
were language-specific versions of the cache, as the surviving copy does not |
||||||
|
contain translations. |
||||||
|
|
||||||
|
The structure of the plaintext payload is described below: |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|--------------|--------------------------------| |
||||||
|
| UnsignedByte | Must be `10` | |
||||||
|
| Int | ISAAC cipher key (bits 0-31) | |
||||||
|
| Int | ISAAC cipher key (bits 32-63) | |
||||||
|
| Int | ISAAC cipher key (bits 64-95) | |
||||||
|
| Int | ISAAC cipher key (bits 96-127) | |
||||||
|
| Long | Base37-encoded username | |
||||||
|
| String | Password | |
||||||
|
|
||||||
|
### 17 (Switch to JAGGRAB mode) |
||||||
|
|
||||||
|
### 18 (Reconnect) |
||||||
|
|
||||||
|
The packet is identical to `GAMELOGIN` in all but one way: the opcode of this |
||||||
|
packet indicates the client is reconnecting due to connection loss, rather than |
||||||
|
logging in from the login screen. |
||||||
|
|
||||||
|
### 20 (Check date of birth and country) |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|---------------|------------------------------| |
||||||
|
| UnsignedByte | Day | |
||||||
|
| UnsignedByte | Month | |
||||||
|
| UnsignedShort | Year | |
||||||
|
| UnsignedShort | Country ID | |
||||||
|
|
||||||
|
### 21 (`CREATE_CHECK_NAME`) |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|-----------|------------------------------| |
||||||
|
| Long | Base37-encoded username | |
||||||
|
|
||||||
|
### 22 (`CREATE_ACCOUNT`) |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|-----------------|-------------------------------------------------------| |
||||||
|
| UnsignedShort | Client build number | |
||||||
|
| UnsignedByte | RSA-encrypted payload length (n) | |
||||||
|
| Byte\[n\] | RSA-encrypted payload | |
||||||
|
| Byte\[len-n-3\] | XTEA-encrypted payload | |
||||||
|
|
||||||
|
The structure of the RSA-decrypted payload is described below: |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|---------------|--------------------------------| |
||||||
|
| UnsignedByte | Must be `10` | |
||||||
|
| UnsignedShort | Flags (see below) | |
||||||
|
| Long | Base37-encoded username | |
||||||
|
| Int | XTEA key (bits 0-31) | |
||||||
|
| String | Password | |
||||||
|
| Int | XTEA key (bits 32-63) | |
||||||
|
| UnsignedShort | Affiliate ID | |
||||||
|
| UnsignedByte | Day | |
||||||
|
| UnsignedByte | Month | |
||||||
|
| Int | XTEA key (bits 64-95) | |
||||||
|
| UnsignedShort | Year | |
||||||
|
| UnsignedShort | Country ID | |
||||||
|
| Int | XTEA key (bits 96-127) | |
||||||
|
|
||||||
|
| Flag | Description | |
||||||
|
|------:|--------------------------------------| |
||||||
|
| `0x1` | Receive RuneScape newsletters | |
||||||
|
| `0x2` | Receive Other newsletters | |
||||||
|
| `0x4` | Share details with business partners | |
||||||
|
|
||||||
|
The structure of the XTEA-decrypted payload is described below: |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|-------------|---------------| |
||||||
|
| String | Email address | |
||||||
|
| Byte\[0-7\] | Padding | |
||||||
|
|
||||||
|
### 23 (`REQUEST_WORLDLIST`) |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|-----------|------------------------------| |
||||||
|
| Int | Previous world list checksum | |
||||||
|
|
||||||
|
The previous world list checksum is set to 0 if the client has not fetched the |
||||||
|
world list before. It is used to save bandwidth if the world list has not |
||||||
|
changed when the "Refresh" button is clicked: if checksum has not changed, the |
||||||
|
server only sends the player counts and not the full world list. |
||||||
|
|
||||||
|
Given the use of CRC-32 elsewhere in the client, it is probably the CRC-32 |
||||||
|
checksum of the encoded world list (excluding player counts), but this has not |
||||||
|
been confirmed. |
||||||
|
|
||||||
|
### 24 (`CHECK_WORLD_SUITABILITY`) |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|---------------|-------------------------------------------| |
||||||
|
| UnsignedShort | Client build number | |
||||||
|
| UnsignedByte | RSA-encrypted payload length (n) | |
||||||
|
| Byte\[n\] | RSA-encrypted payload | |
||||||
|
|
||||||
|
The structure of the plaintext payload is described below: |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|--------------|-------------------------| |
||||||
|
| UnsignedByte | Must be `10` | |
||||||
|
| Int | Random integer | |
||||||
|
| Long | Base37-encoded username | |
||||||
|
| Int | Random integer | |
||||||
|
| String | Password | |
||||||
|
| Int | Random integer | |
||||||
|
|
||||||
|
## Downstream |
||||||
|
|
||||||
|
| Opcode | Length | Jagex name | Description | |
||||||
|
|-------:|-------:|----------------------------------|----------------------------------------| |
||||||
|
| 0 | 8 | Unknown | Exchange session key | |
||||||
|
| 1 | 0 | Unknown | Display video advertisement | |
||||||
|
| 2 | 14 | `OK` | Login successful | |
||||||
|
| 3 | 0 | `INVALID_USERNAME_OR_PASSWORD` | Invalid username or password | |
||||||
|
| 4 | 0 | `BANNED` | Account banned | |
||||||
|
| 5 | 0 | `DUPLICATE` | Already logged in | |
||||||
|
| 6 | 0 | `CLIENT_OUT_OF_DATE` | Client out of date | |
||||||
|
| 7 | 0 | `SERVER_FULL` | Server full | |
||||||
|
| 8 | 0 | `LOGINSERVER_OFFLINE` | Login server offline | |
||||||
|
| 9 | 0 | `IP_LIMIT` | Too many connections from IP address | |
||||||
|
| 10 | 0 | Unknown | Bad session ID | |
||||||
|
| 11 | 0 | `FORCE_PASSWORD_CHANGE` | Password is weak | |
||||||
|
| 12 | 0 | `NEED_MEMBERS_ACCOUNT` | World is members-only | |
||||||
|
| 13 | 0 | `INVALID_SAVE` | Could not complete login | |
||||||
|
| 14 | 0 | `UPDATE_IN_PROGRESS` | Update in progress | |
||||||
|
| 15 | 0 | `RECONNECT_OK` | Reconnect successful | |
||||||
|
| 16 | 0 | `TOO_MANY_ATTEMPTS` | Too many login attemts from IP address | |
||||||
|
| 17 | 0 | Unknown | Account in members-only area | |
||||||
|
| 18 | 0 | `LOCKED` | Account locked | |
||||||
|
| 19 | 0 | Unknown | Fullscreen is members-only | |
||||||
|
| 20 | 0 | Unknown | Invalid login server requested | |
||||||
|
| 21 | 1 | `HOP_BLOCKED` | Wait for profile transfer | |
||||||
|
| 22 | 0 | `INVALID_LOGIN_PACKET` | Malformed login packet | |
||||||
|
| 23 | 0 | Unknown | No reply from login server | |
||||||
|
| 24 | 0 | `LOGINSERVER_LOAD_ERROR` | Error loading profile | |
||||||
|
| 25 | 0 | `UNKNOWN_REPLY_FROM_LOGINSERVER` | Unknown reply from login server | |
||||||
|
| 26 | 0 | `IP_BLOCKED` | IP address banned | |
||||||
|
| 27 | 0 | Unknown | Service unavailable | |
||||||
|
| 29 | 1 | `DISALLOWED_BY_SCRIPT` | Disallowed by script | |
||||||
|
| 30 | 0 | Unknown | Client is members-only | |
||||||
|
| 101 | 2 | Unknown | Switch world | |
||||||
|
|
||||||
|
### 0 (Exchange session key) |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|-----------|--------------------------------| |
||||||
|
| Long | ISAAC cipher key (bits 64-127) | |
||||||
|
|
||||||
|
### 1 (Display video advertisement) |
||||||
|
|
||||||
|
After the client has finished displaying the advertisement, it sends an empty |
||||||
|
packet with opcode 17. The opcode is encrypted with ISAAC. |
||||||
|
|
||||||
|
### 2 (`OK`) |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|---------------|--------------------------------| |
||||||
|
| UnsignedByte | Staff moderator level | |
||||||
|
| UnsignedByte | Player moderator level | |
||||||
|
| Boolean | Player is underage | |
||||||
|
| Boolean | Parental chat consent | |
||||||
|
| Boolean | Parental advertisement consent | |
||||||
|
| Boolean | Quick chat world | |
||||||
|
| Boolean | Record mouse movement | |
||||||
|
| UnsignedShort | Player index | |
||||||
|
| Boolean | Player is a member | |
||||||
|
| Boolean | Members-only world | |
||||||
|
|
||||||
|
### 3 (`INVALID_USERNAME_OR_PASSWORD`) |
||||||
|
|
||||||
|
**Message:** Invalid username or password. If you have forgotten your password, |
||||||
|
click here. |
||||||
|
|
||||||
|
### 4 (`BANNED`) |
||||||
|
|
||||||
|
**Message:** Your account has been disabled. Please <u>click here</u> to check |
||||||
|
your Message Centre for details. |
||||||
|
|
||||||
|
### 5 (`DUPLICATE`) |
||||||
|
|
||||||
|
**Message:** Your account has not logged out from its last session. Try again |
||||||
|
in a few minutes. |
||||||
|
|
||||||
|
### 6 (`CLIENT_OUT_OF_DATE`) |
||||||
|
|
||||||
|
**Message:** RuneScape has been updated! Please reload this page. |
||||||
|
|
||||||
|
### 7 (`SERVER_FULL`) |
||||||
|
|
||||||
|
**Message:** This world is full. Please use a different world. |
||||||
|
|
||||||
|
### 8 (`LOGINSERVER_OFFLINE`) |
||||||
|
|
||||||
|
**Message:** Unable to connect: login server offline. |
||||||
|
|
||||||
|
### 9 (`IP_LIMIT`) |
||||||
|
|
||||||
|
**Message:** Login limit exceeded: too many connections from your address. |
||||||
|
|
||||||
|
### 10 (Bad session ID) |
||||||
|
|
||||||
|
**Message:** Unable to connect: bad session ID. |
||||||
|
|
||||||
|
### 11 (`FORCE_PASSWORD_CHANGE`) |
||||||
|
|
||||||
|
**Message:** Your password is an extremely common choice, and is very weak. You |
||||||
|
must change it before you can login. <u>Click here</u> |
||||||
|
|
||||||
|
### 12 (`NEED_MEMBERS_ACCOUNT`) |
||||||
|
|
||||||
|
**Message:** You need a members' account to log in to this world. Please |
||||||
|
subscribe or use a different world. |
||||||
|
|
||||||
|
### 13 (`INVALID_SAVE`) |
||||||
|
|
||||||
|
**Message:** Could not complete login. Please try using a different world. |
||||||
|
|
||||||
|
### 14 (`UPDATE_IN_PROGRESS`) |
||||||
|
|
||||||
|
**Message:** The server is being updated. Please wait a few minutes and try again. |
||||||
|
|
||||||
|
### 15 (`RECONNECT_OK`) |
||||||
|
|
||||||
|
### 16 (`TOO_MANY_ATTEMPTS`) |
||||||
|
|
||||||
|
**Message:** Too many incorrect logins from your address. Please wait 5 minutes before |
||||||
|
trying again. |
||||||
|
|
||||||
|
### 17 (Account in members-only area) |
||||||
|
|
||||||
|
**Message:** You are standing in a members-only area. To play on this world, move to a free |
||||||
|
area first. |
||||||
|
|
||||||
|
### 18 (`LOCKED`) |
||||||
|
|
||||||
|
**Message:** Your account has been locked as we suspect it has been stolen. Click here to |
||||||
|
recover your account. |
||||||
|
|
||||||
|
### 19 (Fullscreen is members-only) |
||||||
|
|
||||||
|
**Message:** Fullscreen is currently a members-only feature. To log in, either return to the |
||||||
|
main menu and exit fullscreen or use a members' account. |
||||||
|
|
||||||
|
### 20 (Invalid login server requested) |
||||||
|
|
||||||
|
**Message:** Invalid loginserver requested. Please try using a different world. |
||||||
|
|
||||||
|
### 21 (`HOP_BLOCKED`) |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|--------------|-------------------------| |
||||||
|
| UnsignedByte | Hop time | |
||||||
|
|
||||||
|
**Message:** You have only just left another world. Your profile will be transferred in <n> |
||||||
|
seconds. |
||||||
|
|
||||||
|
### 22 (`INVALID_LOGIN_PACKET`) |
||||||
|
|
||||||
|
**Message:** Malformed login packet. Please try again. |
||||||
|
|
||||||
|
### 23 (No reply from login server) |
||||||
|
|
||||||
|
**Message:** No reply from login server. Please wait a minute and try again. |
||||||
|
|
||||||
|
### 24 (`LOGINSERVER_LOAD_ERROR`) |
||||||
|
|
||||||
|
**Message:** Error loading your profile. Please contact Customer Support. |
||||||
|
|
||||||
|
### 25 (`UNKNOWN_REPLY_FROM_LOGINSERVER`) |
||||||
|
|
||||||
|
**Message:** Unexpected loginserver response. Please try using a different world. |
||||||
|
|
||||||
|
### 26 (`IP_BLOCKED`) |
||||||
|
|
||||||
|
**Message:** This comptuer's address has been blocked as it was used to break our rules. |
||||||
|
|
||||||
|
### 27 (Service unavailable) |
||||||
|
|
||||||
|
Service unavailable. |
||||||
|
|
||||||
|
### 29 (`DISALLOWED_BY_SCRIPT`) |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|--------------|-------------------------| |
||||||
|
| UnsignedByte | Reason | |
||||||
|
|
||||||
|
| Reason | Message | |
||||||
|
|-------:|---------------------------------------------------------------------------------------| |
||||||
|
| 0 | You must have a Combat Level of at least 20 (without Summoning) to enter a PvP world. | |
||||||
|
| 1 | You are currently carrying lent items and cannot enter a PvP world. | |
||||||
|
| 2 | You must be standing in the Wilderness or Edgeville to enter this Bounty world. | |
||||||
|
| Other | Unexpected server response. Please try using a different world. | |
||||||
|
|
||||||
|
### 30 (Client is members-only) |
||||||
|
|
||||||
|
This is not a member's account; please choose the 'Free Users' option from the |
||||||
|
website to play on this account. |
||||||
|
|
||||||
|
### 101 (Switch world) |
||||||
|
|
||||||
|
| Data type | Description | |
||||||
|
|---------------|-------------------------| |
||||||
|
| UnsignedShort | World number | |
Loading…
Reference in new issue