Due to the common nature and detailed information for the USERINFO datatype, it was separated here. It largely is in use within the OSERVICE foodgroup.
Usages
Protocols/OSCAR/SNAC/OSERVICE_USER_INFO_QUERY
Protocols/OSCAR/SNAC/OSERVICE_USER_INFO_UPDATE
Protocols/OSCAR/SNAC/OSERVICE_SET_USERINFO_FIELDS
Datatype: OSERVICE__USERINFO
Common data structure that contains a user's username and information about their session.
Name
|
Type
|
Notes
|
displayId
|
string08
|
Formated username
|
evil
|
uint16 (word)
|
Warning level of user
|
userAttributes
|
tlvBlock
|
[Class: OSERVICE__USER_INFO_TAGS] TLV Block of user attributes
|
From Aleksandr Shutko: Basic OSCAR information (Online userinfo block)
Basic OSCAR information (Userinfo block)
|
|
|
|
|
|
Many usefull SNACs contain special block with online user information. This block
allways contain screenname (uin), warning level and number of TLVs in TLV chain.
TLV chain contain additional user information like DC info, status, user class,
idle time, online time, external ip address, account registration time, etc...
Here is the list of SNACs that contain userinfo block: SNAC(03,0B), SNAC(04,07),
SNAC(0E,06), SNAC(01,0F), SNAC(01,10), SNAC(02,06), ... Most of them contain just
three TLVs: user class, idle time, online time.
Note that you may find TLV not listed here in userinfo block. If you have such
new TLV, please send it to author of this documentation. Here is the format of
the online userinfo block (all TLVs are optional):
|
|
xx |
|
byte |
|
screenname (uin) length |
|
xx .. |
|
ascii |
|
screenname (uin) string |
|
xx xx |
|
word |
|
warning level |
|
xx xx |
|
word |
|
number of tlvs in tlv-chain |
|
| |
00 01 |
|
word |
|
TLV.Type(0x01) - user class (nick flags) |
00 04 |
|
word |
|
TLV.Length |
|
|
|
| |
|
| |
00 02 |
|
word |
|
TLV.Type(0x02) - create time |
00 04 |
|
word |
|
TLV.Length |
|
xx xx xx xx |
|
dword |
|
create time (unix time_t format) |
|
|
| |
|
| |
00 03 |
|
word |
|
TLV.Type(0x03) - signon time |
00 04 |
|
word |
|
TLV.Length |
|
xx xx xx xx |
|
dword |
|
signon time (unix time_t format) |
|
|
| |
|
| |
00 04 |
|
word |
|
TLV.Type(0x04) - idle time |
00 02 |
|
word |
|
TLV.Length |
|
xx xx |
|
word |
|
idle time (in seconds) |
|
|
| |
|
| |
00 05 |
|
word |
|
TLV.Type(0x05) - account creation time (member since) |
00 04 |
|
word |
|
TLV.Length |
|
xx xx xx xx |
|
dword |
|
time when this account was registered |
|
|
| |
|
| |
00 06 |
|
word |
|
TLV.Type(0x06) - user status [ICQ only] |
00 04 |
|
word |
|
TLV.Length |
|
|
|
| |
|
| |
00 0A |
|
word |
|
TLV.Type(0x0A) - external ip addr [ICQ only] |
00 04 |
|
word |
|
TLV.Length |
|
xx xx xx xx |
|
dword |
|
External ip address |
|
|
| |
|
| |
00 0C |
|
word |
|
TLV.Type(0x0C) - user DC info [ICQ only] |
00 25 |
|
word |
|
TLV.Length |
|
xx xx xx xx |
|
dword |
|
DC internal ip address |
xx xx xx xx |
|
dword |
|
DC tcp port |
xx |
|
byte |
|
DC type |
xx xx |
|
word |
|
DC protocol version |
xx xx xx xx |
|
dword |
|
DC auth cookie |
xx xx xx xx |
|
dword |
|
Web front port |
00 00 00 03 |
|
dword |
|
Client futures |
xx xx xx xx |
|
dword |
|
last info update time |
xx xx xx xx |
|
dword |
|
last ext info update time (i.e. icqphone status) |
xx xx xx xx |
|
dword |
|
last ext status update time (i.e. phonebook) |
xx xx |
|
word |
|
unknown |
|
|
| |
|
| |
00 0D |
|
word |
|
TLV.Type(0x0D) - client capabilities list |
00 04 |
|
word |
|
TLV.Length |
|
|
|
| |
|
| |
00 0F |
|
word |
|
TLV.Type(0x0F) - online time |
00 04 |
|
word |
|
TLV.Length |
|
xx xx xx xx |
|
dword |
|
client online time (in seconds) |
|
|
| |
|
|
|
|
|
|
|
|
|
Class: OSERVICE__USER_FLAGS
Bits specifying a user's characteristics; For compatibility reasons the lower 2 bytes of USER_FLAGS are sent in the USER_FLAGS tag, while the upper bytes are sent in the USER_FLAGS2 tag.
To form the full user flags the client needs to combine USER_FLAGS and USER_FLAGS2 shifted to the left 2 bytes. USER_FLAGS is always a uint16 (word), which USER_FLAGS2 can be any size. Another way to express the math: userFlags = USER_FLAG | (USER_FLAGS2 << 0x10)
Name
|
Value
|
Notes
|
OSERVICE__USER_FLAG_DAMNED_TRANSIENT
|
0x0001
|
Unconfirmed account
|
OSERVICE__USER_FLAG_ADMINISTRATOR
|
0x0002
|
NINA Administrator
|
OSERVICE__USER_FLAG_AOL
|
0x0004
|
User is on an AOL client
|
OSERVICE__USER_FLAG_OSCAR_PAY
|
0x0008
|
NINA commercial account
|
OSERVICE__USER_FLAG_OSCAR_FREE
|
0x0010
|
NINA free account, typically AIM
|
OSERVICE__USER_FLAG_UNAVAILABLE
|
0x0020
|
User is away
|
OSERVICE__USER_FLAG_ICQ
|
0x0040
|
ICQ user; AIM bit will also be set
|
OSERVICE__USER_FLAG_WIRELESS
|
0x0080
|
On a mobile device
|
OSERVICE__USER_FLAG_INTERNAL
|
0x0100
|
Account for internal use
|
OSERVICE__USER_FLAG_FISH
|
0x0200
|
Using IM Forwarding
|
OSERVICE__USER_FLAG_BOT
|
0x0400
|
Bot user
|
OSERVICE__USER_FLAG_BEAST
|
0x0800
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_FLAG_ONE_WAY_WIRELESS
|
0x1000
|
One way wireless device
|
OSERVICE__USER_FLAG_OFFICIAL
|
0x2000
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_FLAG_BUDDY_MATCH_DIRECT
|
0x10000
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_FLAG_BUDDY_MATCH_INDIRECT
|
0x20000
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_FLAG_NO_KNOCK_KNOCK
|
0x00040000
|
Do not display the "not on your Buddy List" knock-knock as the server took care of it or the sender is trusted
|
FORWARD_MOBILE
|
0x00080000
|
If no active instances forward to mobile
|
From Aleksandr Shutko: User classes
<a name="user_class"></a>User classes |
|
|
|
<a name="m0003"></a>
AOL users are divided into several classes. User class field is a 2 byte bitmask.
For example ICQ non-commercial account with away status has user-class=0x0070
(OSERVICE__USER_FLAG_OSCAR_FREE (@RUS CLASS_FREE) | OSERVICE__USER_FLAG_UNAVAILABLE (@RUS CLASS_AWAY) | OSERVICE__USER_FLAG_ICQ (@RUS CLASS_ICQ) = 0x0070). Here is the list of known bit
values in user class bitmask:
|
0x0001 |
OSERVICE__USER_FLAG_DAMNED_TRANSIENT (@RUS CLASS_UNCONFIRMED) |
AOL unconfirmed user flag |
0x0002 |
OSERVICE__USER_FLAG_ADMINISTRATOR (@RUS CLASS_ADMINISTRATOR) |
AOL administrator flag |
0x0004 |
OSERVICE__USER_FLAG_AOL (@RUS CLASS_AOL) |
AOL staff user flag |
0x0008 |
OSERVICE__USER_FLAG_OSCAR_PAY (@RUS CLASS_COMMERCIAL) |
AOL commercial account flag |
0x0010 |
OSERVICE__USER_FLAG_OSCAR_FREE (@RUS CLASS_FREE) |
ICQ non-commercial account flag |
0x0020 |
OSERVICE__USER_FLAG_UNAVAILABLE (@RUS CLASS_AWAY) |
Away status flag |
0x0040 |
OSERVICE__USER_FLAG_ICQ (@RUS CLASS_ICQ) |
ICQ user sign |
0x0080 |
OSERVICE__USER_FLAG_WIRELESS (@RUS CLASS_WIRELESS) |
AOL wireless user |
0x0100 |
CLASS_UNKNOWN100 |
Unknown bit |
0x0200 |
CLASS_UNKNOWN200 |
Unknown bit |
0x0400 |
CLASS_UNKNOWN400 |
Unknown bit |
0x0800 |
CLASS_UNKNOWN800 |
Unknown bit |
|
|
|
|
|
|
|
Class: OSERVICE__USER_STATUS
From Aleksandr Shutko: User status
<a name="user_status"></a>User status |
|
|
|
<a name="m0004"></a>
ICQ service presence notifications use user status field which consist of
two parts. First is a various flags (birthday flag, webaware flag, etc).
Second is a user status (online, away, busy, etc) flags. Each part is a two
bytes long. Here is the list of masks for both parts:
|
0x0001 |
OSERVICE__USER_STATUS_FLAG_WEBAWARE (@RUS STATUS_WEBAWARE) |
Status webaware flag |
0x0002 |
OSERVICE__USER_STATUS_FLAG_SHOWIP (@RUS STATUS_SHOWIP) |
Status show ip flag |
0x0008 |
OSERVICE__USER_STATUS_FLAG_BIRTHDAY (@RUS STATUS_BIRTHDAY) |
User birthday flag |
0x0020 |
OSERVICE__USER_STATUS_FLAG_WEBFRONT (@RUS STATUS_WEBFRONT) |
User active webfront flag |
0x0100 |
OSERVICE__USER_STATUS_FLAG_DCDISABLED (@RUS STATUS_DCDISABLED) |
Direct connection not supported |
0x1000 |
OSERVICE__USER_STATUS_FLAG_IP_EXPOSE_NONE (@RUS STATUS_DCAUTH) |
Direct connection upon authorization |
0x2000 |
OSERVICE__USER_STATUS_FLAG_IP_EXPOSE_BL (@RUS STATUS_DCCONT) |
DC only with contact users |
|
|
|
|
0x0000 |
OSERVICE__USER_STATUS_MASK_NORMAL (@RUS STATUS_ONLINE) |
Status is online |
0x0001 |
OSERVICE__USER_STATUS_MASK_AWAY (@RUS STATUS_AWAY) |
Status is away |
0x0002 |
OSERVICE__USER_STATUS_MASK_DND (@RUS STATUS_DND) |
Status is no not disturb (DND) |
0x0004 |
OSERVICE__USER_STATUS_MASK_NA (@RUS STATUS_NA) |
Status is not available (N/A) |
0x0010 |
OSERVICE__USER_STATUS_MASK_BUSY (@RUS STATUS_OCCUPIED) |
Status is occupied (BISY) |
0x0020 |
OSERVICE__USER_STATUS_MASK_FREE4CHAT (@RUS STATUS_FREE4CHAT) |
Status is free for chat |
0x0100 |
OSERVICE__USER_STATUS_MASK_INVISIBLE (@RUS STATUS_INVISIBLE) |
Status is invisible |
|
|
|
|
|
|
|
TLV Class: OSERVICE__USER_INFO_TAGS
These tags contain information about users and their server state.
Name
|
Tag
|
Type
|
Notes
|
OSERVICE__USER_INFO_USER_FLAGS
|
0x01
|
uint16 (word)
|
[Class: OSERVICE__USER_FLAGS] Flags that represent the user's state
|
OSERVICE__USER_INFO_CREATE_TOD
|
0x02
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_SIGNON_TOD
|
0x03
|
t70
|
Signon time
|
OSERVICE__USER_INFO_IDLE_TIME
|
0x04
|
uint16 (word)
|
Idle time in minutes
|
OSERVICE__USER_INFO_MEMBER_SINCE
|
0x05
|
t70
|
Approximation of NINA membership
|
OSERVICE__USER_INFO_STATUS
|
0x06
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_CLIENTTYPE
|
0x08
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_REALIPADDRESS
|
0x0A
|
uint32 (dword)
|
Network byte order IPv4 address
|
OSERVICE__USER_INFO_REALIPV6ADDRESS
|
0x6A
|
string
|
String of IPv6 address
|
OSERVICE__USER_INFO_ICQINFO
|
0x0C
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_OSCAR_CAPS
|
0x0D
|
Array of UUID
|
Client capabilities - if not present use the previous values received; if present but empty, clear previous values
|
OSERVICE__USER_INFO_AOL_CAPS
|
0x0E
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_OSCAR_OT
|
0x0F
|
uint32 (dword)
|
Online time in seconds, if user is using OSCAR
|
OSERVICE__USER_INFO_AOL_OT
|
0x10
|
uint32 (dword)
|
Online time in seconds, if user is using P3
|
OSERVICE__USER_INFO_ICQ_BROAD_BLOB
|
0x11
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_ICQ_BROAD_TYPE
|
0x12
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_INSTANCES
|
0x13
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_MY_INSTANCE_NUM
|
0x14
|
uint8 (byte)
|
Set in first user info. Identifies the instance number of this client
|
OSERVICE__USER_INFO_MY_PARENTAL_CONTROLS
|
0x15
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_MY_ZIP
|
0x16
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_MY_BOT_INFO
|
0x17
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_ALIAS
|
0x18
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_SHORT_OSCAR_CAPS
|
0x19
|
Array of uint16 (word)
|
Short form of capabilities
|
OSERVICE__USER_INFO_SHORT_AOL_CAPS
|
0x1A
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_ENCRYPTION_CERT_MD5
|
0x1B
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_BART_INFO
|
0x1D
|
Array of BART__ID
|
Expressions
|
OSERVICE__USER_INFO_MY_SUBSCRIPTIONS
|
0x1E
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_USER_FLAGS2
|
0x1F
|
Array of uint8 (byte)
|
[Class: OSERVICE__USER_FLAGS] Upper bytes of user flags, can be any size. userFlags = USER_FLAG | (USER_FLAGS2 << 16)
|
OSERVICE__USER_INFO_UNKNOWN_22
|
0x22
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_BUDDY_FEED_TIME
|
0x23
|
t70
|
Last Buddy Feed update time
|
OSERVICE__USER_INFO_SIG_TIME
|
0x26
|
t70
|
Time that the profile was set
|
OSERVICE__USER_INFO_AWAY_TIME
|
0x27
|
t70
|
Time that away was set
|
OSERVICE__USER_INFO_PRIMARY_INSTANCE
|
0x28
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_UNKNOWN_29_TIME
|
0x29
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_GEO_COUNTRY
|
0x2A
|
string
|
Two character country code. Sent from host to client if country is known
|
OSERVICE__USER_INFO_BUDDY_UPDATE_INDC_URL
|
0x2B
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_UNKNOWN_2C
|
0x2C
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_UNKNOWN_2D
|
0x2D
|
?
|
NOT CURRENTLY DOCUMENTED
|
OSERVICE__USER_INFO_UNKNOWN_2F
|
0x2F
|
?
|
NOT CURRENTLY DOCUMENTED
|