Since March 10, 2003 - Version 2.1
hypothetic.org

MSN Messenger Protocol

Notification - Retrieving personal details

Back To Normal Layout

What does this page cover?

This page explains how to retrieve your personal details from MSN Messenger. This includes information about people on your contact list, a list of groups they can belong to, your personal phone numbers, and some privacy settings.

When the official client logs on, the first thing it does is send the SYN command to retrieve everything on the contact list. This page gives background information about your contact details and a thorough description of the SYN command. For information about setting your personal details, see this page.

Background information

These are the basic concepts in MSN's personal information.

Version number

Your complete set of personal details has a version number. Every time a change is made to the contact list, either initiated by you or by someone else, that number is incremented. If your details are changed then changed back (even while you're offline), the number will be incremented twice.

The purpose of this number is to ensure that the client and server have the same version of the contact details. Clients should cache all contact details. When the client logs on, if no changes have been made since it last logged off, it can avoid downloading all of your personal details. The number is always between 0 and 4294967295 (2^32 - 1).

Forward List (FL)

The forward list, abbreviated as FL, is the list of principals whose presence you are subscribed to. You can expect to be notified about their on-line state, phone numbers, etc. This is what a layman would call their "contact list".

This list currently (as of March 23, 2003), has a limit of 150 people, doubled from a previous 75. If you try to add a 151st person, you will receive error 210 and they will not be added.

Everyone in your forward list belongs to one or more groups, identified by their group number. By default, they belong to group 0.

Reverse List (RL)

The reverse list, abbreviated as RL, is the list of principals that have you on their forward list. You cannot make modifications to it. If you attempt to add or remove people from this list, you will be immediately disconnected from the NS with no error message.

Allow List (AL)

The allow list, abbreviated as AL, is the list of principals that you allow to see your online presence - as opposed to your reverse list, which is the list of people who request to see your online presence. If someone removes you from his or her contact list, he or she is automatically removed from your RL but not your AL. He or she no longer receives online presence from you, but if he or she adds you again, your client can act in the knowledge that you previously allowed him or her to see your presence.

Block List (BL)

The block list, abbreviated as BL, is the list of people that are blocked from seeing your online presence. They will never receive your status, and when they try to invite you to a switchboard session, they will be notified that you are offline. No-one can be on the AL and the BL at the same time, and if you try to add someone to both lists, you will receive error 219.

Group List

This is a list of groups that people on your forward list can belong to. Every group has a name and a ID number. You are guaranteed to have at least one group defined (which everyone on your contact list belongs to by default). The default name for this list is "~".

The client and server always refer to groups by number rather than name.

Phone Numbers

MSN Messenger allows you to advertise your personal, home, and work phone phone numbers as well as your MSN Mobile and MSN Direct devices if you have them. You should be automatically sent phone number information about people in your FL, but as of November 2003, a bug in Microsoft's servers mean this doesn't happen. You can choose whether or not to make phone numbers available, and blocked people are sent blank phone number information, so there is no big privacy issue with it.

Synchronisation

The SYN ("synchronisation") command is used to synchronise all four contact lists, the group list, your phone numbers, and some privacy settings with the server. The official client synchronises right after it logs on and before it sets its initial status. Sending SYN more than once in a session has no effect, and may get you disconnected. You should send SYN immediately after logging in to the Messenger server, as the server won't send you certain commands (e.g. additions to your reverse list) until you do. Clients should store a cached version of your details after logging off. This helps to reduce the time it takes to log in.

Sending SYN

The SYN command has a TrID and one parameter - the cached version number (or 0 if the client doesn't store personal details). If the cached version number is the same as the version on the server (i.e. no changes have been made), the server will not send the list to the client. If the version numbers do not match, the server will send the entire list.

It can take quite a while to download all the personal details - over ten seconds for a large list on a slow connection. It might be best to send SYN before setting your initial status so that other people will not have to wait for you to download your list before you can receive their messages.

Here are two examples of the SYN command:

>>> SYN 12 2194\r\n

>>> SYN 13 0\r\n

SYN Responses

The SYN response is one of the few MSN Messenger responses that have a different number of parameters in different situations. If the client's cache is up-to-date, the response will contain a TrID and one parameter (the version number). Otherwise, the response will contain a TrID and three parameters: updated version number, number of people on your contact list, and number of groups you've defined.

If the cache is up-to-date, the synchronisation has ended and there will be no further responses to the command. Otherwise the server will send these extra responses (in this order):

None of these responses will have TrIDs

Example SYN Responses

In this example, the cached version is "125", which the server verifies as up-to-date.

>>> SYN 1 125\r\n

<<< SYN 1 125\r\n

In this example, the client hasn't stored a cache, so the server sends a full list. The gaps in the response have been inserted to make reading easier. There are no blank lines in the protocol.

>>> SYN 1 0\r\n

<<< SYN 1 139 5 4\r\n

<<< GTC A\r\n
<<< BLP AL\r\n

<<< PRP PHH 01%20234\r\n
<<< PRP PHM 56%20789\r\n

<<< LSG 0 Other%20Contacts 0\r\n
<<< LSG 1 Coworkers 0\r\n
<<< LSG 2 Friends 0\r\n
<<< LSG 3 Family 0\r\n

<<< LST principal1@passport.com principal1 4\r\n
<<< LST principal2@passport.com principal2 10\r\n
<<< LST principal3@passport.com principal3 11 1,3\r\n
<<< LST principal4@passport.com principal4 11 0\r\n
<<< BPR PHH 01%20234\r\n
<<< BPR MOB Y\r\n
<<< LST principal5@passport.com principal5 12\r\n
<<< LST principal6@passport.com principal6 11 2\r\n
<<< BPR PHW 45%206789\r\n

Privacy Settings

There are two privacy settings in MSN Messenger: GTC and BLP.

GTC

The GTC value can be set to A or N. The client should change its behaviour based on this value. The value isn't processed by the server or advertised to other clients.

The client is expected to use this value in deciding how to behave when someone is added the RL who hasn't previously been put on the AL or BL. It's possible, for example, for someone to have been on your RL once before, then removed, then come back on, in which case they might already be on your block or allow list. The default setting is A. Because the server only stores this value, it's still the client's job to add them to one of the lists - the server will not do this automatically.

If the GTC value is set to A or the BLP value (below) is set to BL, the official client will alert the user when someone new is added to the reverse list and ask whether to allow or block them. Otherwise, it will automatically add them to the allow list.

BLP

Like GTC, the BLP value is stored on the server and is retrieved by the client every time it logs on. This setting also has only two values: AL and BL. Unlike GTC, the server actually reads this setting and does certain things differently depending on its value.

People who are on neither your AL nor BL will be treated as if they are on the list specified in BLP. If the value is AL, they will be allowed to invite you to a switchboard session and chat with you. If the value is BL, they will be informed that you are offline, and they will not be allowed to invite you to chat. The default value is AL.

Phone Numbers

The only time you can receive the phone numbers that you have set for yourself is during a SYN. Personal phone numbers are sent immediately after BLP. These phone numbers arrive in PRP responses. Each PRP has two parameters: a three letter phone type and the value of the phone number.

Here is a list of the five different phone number types in the order that they are sent:

Phone numbers are not sent if they are empty, MOB and MBE aren't sent unless they are enabled. Because of this, the only way to tell whether you've finished receiving PRPs is when you receive the first LSG response (there will always be at least one LSG response).

The value for the first three items can be anything up to 95 characters. This value can contain any characters allowed in a nickname and is URL-encoded.

The value of MOB and MBE can only be Y ("yes"). If MOB is set, the client has allowed other people to contact him on his mobile device through the PAG command. If MBE is set, that shows that the client has enabled a mobile device on MSN Mobile. Note that these values are completely independent from the PHM mobile device number.

There are reports of a sixth phone number type to handle MSN Direct devices. This WWE value works exactly like MOB, but will be set to "2" if it's enabled. This value has never been observed in MSNP8, and as of November 2003, the MSN Messenger server has bugs in its handling of phone numbers that prevent proper testing.

Below is an example of the phone numbers of someone who has set her home phone number and has a mobile device but has chosen not to allow people to page her on MSN. Note that the home phone number is URL-encoded, and would show up like this when decoded: "555 555-0690".

<<< PRP PHH 555%20555-0690\r\n
<<< PRP MBE Y\r\n

Group List (LSG)

After the PRPs have been sent, the NS will send the list of groups you've defined with the LSG command. The NS will send one LSG for each group. Each LSG will contain an identification number of the group, the URL-encoded name of the group, and a number which the official client always sets to 0 (but you can set it to any number). If you haven't added any groups, the default group name and ID are ~ (tilde) and 0 (zero) respectively.

Contact List (LST)

After sending the LSG responses, the NS will send information about the people on your contact list. The entire synchronisation process is complete when the last LST response has been received.

LST is another response with a variable number of parameters:

If the person is in your FL, you will also receive some BPR responses immediately following the LST (if they have set their phone numbers). The format of a BPR response is similar to the PRP responses above, except that there's no such thing as a BPR MBE response. If a principal has MOB set to Y, that means that you can page them with the PAG command. If they have WWE set to 2, you can direct-page them with the PGD command.

It is also possible to receive BPRs outside of a SYN. This is discussed more on the setting details page.

List numbers

The third parameter is the principal's "list number", which represents the lists they're in (allow, block, forward, reverse). Each list has a numerical value - the forward list is 1, the allow list is 2, the block list is 4 and the reverse list is 8. A principal's list number represents the sum of the lists the principal is in. For example, someone on your forward and allow lists but not your block or reverse lists would have a list number of 3.

Because list values are all powers of 2, you can tell which lists a principal is in with the bitwise AND function. ANDing the principal's list number with the value of a list will tell you whether they are in that list. For example, if a principal's list number is 3, "3 AND 1" returns "1" (meaning that they're on your forward list), "3 AND 2" returns "2" (meaning they're on your allow list), while "3 AND 4" and "3 AND 8" return "0" (meaning they aren't on your block or reverse lists).

Everyone on your reverse list should be on either your allow or block list, but this isn't always the case (for example, if they were added since you last logged off). You can check this by ANDing their list number with 14 (the sum of the add, block and allow lists). If the result is "8", they're on your reverse list but neither of the others. For example, if a buddy's list number is "11", "11 AND 14" returns "10" (meaning they have already been added to your allow list); whereas if their list number is "9", "9 AND 14" returns "8" (meaning they haven't been added to your add or block lists). See GTC above for how to handle these people.

There are some programs that erase everyone from your allow list so that you can appear offline to people while you talk, but when you log back on again with a normal client, they are often flooded with messages about new buddies.

Copyright ©2002-2004 to Mike Mintz.
<http://www.mikemintz.com/>