Bimoid/Proto
Текст размещенный ниже взят из архива, опубликованного на форуме проекта Bimoid (ссылка). Для конвертации RTF2Wiki использовано расширение OpenOffice - Sun Wiki Publisher.
Черновик описания протокола OBIMP
OBIMP (Open Binary Instant Messaging Protocol)
Draft 1.0, Revision C.
Content:
1. Basic information
2. General BEX types
3. Administrative BEX types
4. OBIMP packets sequences
5. Country and language codes
**********************************************************************************
1. Basic information
General information:
OBIMP is a binary networking protocol and is transmitted in network byte order (NBO) over TCP.
This protocol was developed for instant messaging services. The main idea was to make open,
simple, secure and extensible binary instant messaging protocol. OBIMP implies structured data
interchanging between server and clients using defined in this document rules. Every protocol
data begins from OBIMP header. Header contains control values and special command type and
subtype that are called binary extension (BEX) type and subtype. All strings that supposed to be
transmitted inside OBIMP packet have to be encoded to UTF-8 encoding including account names.
Servers and ports:
To identify OBIMP connection it is recommended to use following port numbers on server
and these ports should be default ports on client programs:
7023 - TCP port number for client connections
7024 - TCP port number for administrative connections
7025 - TCP port number for secure client connections over TLS/SSL
7026 - TCP port number for secure administrative connections over TLS/SSL
Protocol data types:
Byte, Bool - unsigned 1 byte
Word - unsigned 2 bytes
LongWord – unsigned 4 bytes
QuadWord – unsigned 8 bytes
OctaWord – unsigned 16 bytes
BLK - bytes array, variable length
UTF8 - UTF-8 encoded string, variable length
OBIMP header structure (header is always 17 bytes length):
- Byte: every server/client command starts from byte 0x23 - "#";
- LongWord: sequence, from 0 to 0xFFFFFFFF, first packet have to start always from 0;
- Word: BEX type;
- Word: BEX subtype;
- LongWord: request id, used for marking client requests to link it with server replies;
- LongWord: following data length;
All following data is wTLD (wide Type Length Data) based according its BEX type and subtype.
wTLD types are unique only inside the same BEX. There cannot be two or more wTLDs with
same type in one BEX. There is no any protocol version transmitted in packets because of
wTLD structured data. Being typed, protocol can be extended and updated without any
server/client incompatibility risks.
wTLD may have embedded one or more sTLD (short Type Length Data) to describe data
that is not supposed to be too long. To correctly identify sTLD, all sTLDs have to be used
strongly inside documented parts of this specification.
wTLD/sTLD may have no data, it is called empty wTLD/sTLD, in this case length will be zero.
wTLD structure is:
- Type: LongWord
- Length: LongWord
- Data: data with specified length
sTLD structure is:
- Type: Word
- Length: Word
- Data: data with specified length
BEX types marking in this document and limits:
If BEX have to be sent by client it will be marked as "CLI" inside BEX definition.
If BEX have to be sent by server it will be marked as "SRV" inside BEX definition.
If the same BEX can be sent by client and by server it will be marked as "CLI_SRV"
inside BEX definition.
As far as maximal BEX data size can be 4GB and in present time this is too large
data for one BEX packet there are client BEX limits exist and it depends
on OBIMP server software configuration. By default every client BEX cannot be
larger than OBIMP_BEX_MAX_DATA_LEN including all wTLDs inside BEX else
server will disconnect such a client. Server has no BEX data size limits for server
BEXs.
OBIMP_BEX_MAX_DATA_LEN = 0x00020000
**********************************************************************************
2. General BEX types
General BEX types are transmitted between OBIMP clients and server for instant
messaging services, including accounts login and registration processes.
Available general BEX types:
0x0001, Common. (OBIMP_BEX_COM)
0x0002, Contact list. (OBIMP_BEX_CL)
0x0003, Presence (OBIMP_BEX_PRES)
0x0004, Instant messaging (OBIMP_BEX_IM)
0x0005, Users directory (OBIMP_BEX_UD)
0x0006, User avatars (OBIMP_BEX_UA)
=====================================================
BEX 0x0001, Common. (OBIMP_BEX_COM)
=====================================================
Subtype: 0x0001. (OBIMP_BEX_COM_CLI_HELLO)
Client have to initiate login sequence first.
If client already passed login sequence during connection negotiation and it has
got unique server cookie then it have to include wTLD 0x0002 with cookie. If cookie
is correct then server will reply with OBIMP_BEX_COM_LOGIN_REPLY.
If client is going to register new account then it have to add only one
empty wTLD 0x0003.
Available request scenarios:
Request:
wTLD 0x0001: UTF8, account name
Optional:
wTLD 0x0002: BLK, unique server cookie
Request:
wTLD 0x0003: empty, new account registration attempt
------------------------------------------------------------------------------------------------
Subtype: 0x0002. (OBIMP_BEX_COM_SRV_HELLO)
If account is valid then server will send wTLD 0x0002 with server key else it
will send wTLD 0x0001 with hello error code. Instead of sending server key,
server can redirect to another OBIMP server using wTLD 0x0003
and wTLD 0x0004. If client was redirected then login sequence will start
from beginning.
If client requested new account registration then server will reply
with wTLD 0x0005. If there is registration URL available in server
configuration then server will add wTLD 0x0006 where user can register
new account from web.
Only for compatibility purposes with existing users databases was added
plain-text authentication. If server supports only plain-text authentication
it have to send only wTLD 0x0007. This authentication type is not recommended.
Available replies:
Reply:
wTLD 0x0001: Word, hello error (HELLO_ERROR_CODE)
Reply:
wTLD 0x0002: BLK, server key to generate one-time MD5 password hash
Reply:
wTLD 0x0003: UTF8, redirect, new server host/ip
wTLD 0x0004: LongWord, redirect, new server port number
Reply:
wTLD 0x0005: Bool, if value is True then registration is enabled
Optional:
wTLD 0x0006: UTF8, registration URL
Reply:
wTLD 0x0007: empty, server requires plain-text password authentication
Hello error codes:
HELLO_ERROR_ACCOUNT_INVALID = 0x0001
HELLO_ERROR_SERVICE_TEMP_UNAVAILABLE = 0x0002
HELLO_ERROR_ACCOUNT_BANNED = 0x0003
HELLO_ERROR_WRONG_COOKIE = 0x0004
HELLO_ERROR_TOO_MANY_CLIENTS = 0x0005
HELLO_ERROR_INVALID_LOGIN = 0x0006
------------------------------------------------------------------------------------------------
Subtype: 0x0003. (OBIMP_BEX_COM_CLI_LOGIN)
If server replied with server key then client have to generate special MD5 hash
and send it to server.
If server requested plain-text password authentication then client have to send
plain-text password.
Request:
wTLD 0x0001: UTF8, account name
wTLD 0x0002: OctaWord, one-time generated MD5 hash (see below how to generate it)
Request:
wTLD 0x0001: UTF8, account name
wTLD 0x0003: UTF8, plain-text password
One-time MD5 hash generated using following formula:
MD5( MD5( UTF8Encode( LowerCase(Account) ) + "OBIMPSALT" + UTF8Encode(Password) ) + ServerKey )
As far as account name and password is Unicode, UTF-8 encoding used before
MD5 hash generation to make it more universal and platform independent.
Note that LowerCase have to support Unicode "lowercasing".
------------------------------------------------------------------------------------------------
Subtype: 0x0004. (OBIMP_BEX_COM_SRV_LOGIN_REPLY)
If account and MD5 hash matched then server will send wTLD 0x0002 with
supported BEXs and wTLD 0x0003 with maximal client BEXs data length else
it will send wTLD 0x0001 with login error code.
If account and MD5 hash matched and current server is just for authentication
purposes then it will reply with unique cookie and with main server address
and port where client have to connect.
Available replies:
Reply:
wTLD 0x0001: Word, login error (LOGIN_ERROR_CODE)
Optional:
wTLD 0x0007: UTF8, password reminder URL if wrong password code
Reply:
wTLD 0x0002: array of Word, server supported BEXs (Word pairs, first Word is BEX type,
second Word is maximal BEX subtype)
wTLD 0x0003: LongWord, maximal client BEXs data length
Reply:
wTLD 0x0004: UTF8, new server host/ip
wTLD 0x0005: LongWord, new server port number
wTLD 0x0006: BLK, unique server cookie
Login error codes:
LOGIN_ERROR_ACCOUNT_INVALID = 0x0001
LOGIN_ERROR_SERVICE_TEMP_UNAVAILABLE = 0x0002
LOGIN_ERROR_ACCOUNT_BANNED = 0x0003
LOGIN_ERROR_WRONG_PASSWORD = 0x0004
LOGIN_ERROR_INVALID_LOGIN = 0x0005
------------------------------------------------------------------------------------------------
Subtype: 0x0005. (OBIMP_BEX_COM_SRV_BYE)
Server can close connection for some reason. It will send wTLD 0x0001 with bye
reason code and after sending will immediately close connection.
wTLD 0x0001: Word, bye reason code (BYE_REASON_CODE)
Bye reason codes:
BYE_REASON_SRV_SHUTDOWN = 0x0001
BYE_REASON_CLI_NEW_LOGIN = 0x0002
BYE_REASON_ACCOUNT_KICKED = 0x0003
BYE_REASON_INCORRECT_SEQ = 0x0004
BYE_REASON_INCORRECT_BEX_TYPE = 0x0005
BYE_REASON_INCORRECT_BEX_SUB = 0x0006
BYE_REASON_INCORRECT_BEX_STEP = 0x0007
BYE_REASON_TIMEOUT = 0x0008
BYE_REASON_INCORRECT_WTLD = 0x0009
BYE_REASON_NOT_ALLOWED = 0x000A
BYE_REASON_FLOODING = 0x000B
------------------------------------------------------------------------------------------------
Subtype: 0x0006. (OBIMP_BEX_COM_CLI_SRV_KEEPALIVE_PING)
Server and client can send keep alive pings each other to check that
connection is not broken.
No wTLDs.
Server.
Server can send this BEX every n minutes if connection is idle. If server will not
receive pong BEX from client during next n minutes then server will close connection.
Client.
Client can send this BEX any time after login sequence if needed. If pong BEX
from server was not received during time defined by client developer, then
client have to close connection.
------------------------------------------------------------------------------------------------
Subtype: 0x0007. (OBIMP_BEX_COM_CLI_SRV_KEEPALIVE_PONG)
After receiving ping BEX, client/server have to reply with this BEX to notify that
connection is not broken.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0008. (OBIMP_BEX_COM_CLI_REGISTER)
Used to register new account from client. It is not recommended to enable
registration through protocol if you are going to make public IM server.
If registration is disabled, client can register new account only by adding
wTLD 0x0004 with current server administrative key. This is useful if registration
for clients is disabled and used only web form or administration program for
registration.
wTLD 0x0001: UTF8, account name (maximal UTF-8 encoded length depends on server setting)
wTLD 0x0002: UTF8, password (maximal UTF-8 encoded length is 1024)
wTLD 0x0003: UTF8, secure email (maximal UTF-8 encoded length is 1024)
Optional:
wTLD 0x0004: BLK, current server administrative key
------------------------------------------------------------------------------------------------
Subtype: 0x0009. (OBIMP_BEX_COM_SRV_REGISTER_REPLY)
This is server reply for registration attempt.
If server replied with REG_RES_BAD_ACCOUNT_NAME then it will include
optional wTLDs with registration conditions.
wTLD 0x0001: Word, registration result code (see below)
Optional:
wTLD 0x0002: UTF8, allowed characters in the account name for registration
wTLD 0x0003: UTF8, disallowed first characters in the account name for registration
wTLD 0x0004: UTF8, disallowed last characters in the account name for registration
wTLD 0x0005: LongWord, minimal account name length for registration
Registration result codes:
REG_RES_SUCCESS = 0x0000
REG_RES_DISABLED = 0x0001
REG_RES_ACCOUNT_EXISTS = 0x0002
REG_RES_BAD_ACCOUNT_NAME = 0x0003
REG_RES_BAD_REQUEST = 0x0004
REG_RES_BAD_SERVER_KEY = 0x0005
REG_RES_SERVICE_TEMP_UNAVAILABLE = 0x0006
=====================================================
BEX 0x0002, Contact list. (OBIMP_BEX_CL)
=====================================================
Subtype: 0x0001. (OBIMP_BEX_CL_CLI_PARAMS)
Client have to request contact list parameters and limits to notify user if any
limit exceeding.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0002. (OBIMP_BEX_CL_SRV_PARAMS_REPLY)
Contact list parameters and limits:
wTLD 0x0001: LongWord, maximal groups count
wTLD 0x0002: LongWord, maximal UTF-8 encoded group name length
wTLD 0x0003: LongWord, maximal contacts count all over contact list
wTLD 0x0004: LongWord, maximal UTF-8 encoded account name length
wTLD 0x0005: LongWord, maximal UTF-8 encoded contact name length
wTLD 0x0006: LongWord, maximal UTF-8 encoded authorization reason/revoke length
wTLD 0x0007: LongWord, maximal user/developer sTLDs count in one item
wTLD 0x0008: LongWord, maximal user/developer sTLD length
wTLD 0x0009: LongWord, offline authorization messages (requests, replies, revokes) count awaiting for client request
------------------------------------------------------------------------------------------------
Subtype: 0x0003. (OBIMP_BEX_CL_CLI_REQUEST)
Client can request server side contact list any time during logged in session.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0004. (OBIMP_BEX_CL_SRV_REPLY)
Server side contact list data will be returned in wTLD 0x0001.
wTLD 0x0001: BLK, contact list data (see below how it can be parsed)
Contact list data parsing.
It consists from two parts:
1. LongWord, items count in contact list.
2. Contact list items.
Contact list item structure is universal for every item type and consists of:
Word, Item Type
LongWord, Item ID
LongWord, Group ID
LongWord, length of following sTLDs according it's item type:
for Groups:
sTLD 0x0001: UTF8, group name
for Contacts:
sTLD 0x0002: UTF8, account name
sTLD 0x0003: UTF8, contact name
sTLD 0x0004: Byte, privacy type
sTLD 0x0005: empty, authorization flag (can be removed by server only)
sTLD 0x0006: empty, general item flag (can be added/removed by server only)
Every item has unique Item ID, every item has Group ID. Group item has
Group ID of the parent group if it is sub group. If Group ID = 0 then item
has no parent group.
If item has general item flag then it means that this item was added and
can be removed only by administartor.
Every item can have own user/developer specified sTLDs for any needs,
but it have to start from sTLD 0x8000 and must meet sTLDs limits.
Item types:
CL_ITEM_TYPE_GROUP = 0x0001
CL_ITEM_TYPE_CONTACT = 0x0002
Contact privacy types:
CL_PRIV_TYPE_NONE = 0x00
CL_PRIV_TYPE_VISIBLE_LIST = 0x01
CL_PRIV_TYPE_INVISIBLE_LIST = 0x02
CL_PRIV_TYPE_IGNORE_LIST = 0x03
CL_PRIV_TYPE_IGNORE_NOT_IN_LIST = 0x04
When client adding or changing contact with privacy type
CL_PRIV_TYPE_IGNORE_NOT_IN_LIST then Group ID have to be always 0
else server will return an error. This is because of such contacts don't have to be
in contact list.
------------------------------------------------------------------------------------------------
Subtype: 0x0005. (OBIMP_BEX_CL_CLI_VERIFY)
If client has local copy of the contact list it can verify its checksum with server
side copy of the contact list instead of requesting full contact list from server.
To use this BEX, client have to save local contact list copy in server format and
check MD5 of contact list data described above with MD5 checksum replied by
server for this request.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0006. (OBIMP_BEX_CL_SRV_VERIFY_REPLY)
Server will reply with current MD5 checksum of server side contact list for
client to decide, request contact list from server or local copy is actual.
wTLD 0x0001: OctaWord, MD5 checksum of the server side contact list blob
------------------------------------------------------------------------------------------------
Subtype: 0x0007. (OBIMP_BEX_CL_CLI_ADD_ITEM)
Client adding item to server side contact list. If client adding new contact item
then it have to add authorization flag too else server will return bad request error.
wTLD 0x0001: Word, contact list Item Type
wTLD 0x0002: LongWord, parent Group ID of adding item
wTLD 0x0003: array of sTLD, adding item sTLDs according item type
------------------------------------------------------------------------------------------------
Subtype: 0x0008. (OBIMP_BEX_CL_SRV_ADD_ITEM_REPLY)
Server will reply with wTLD 0x0001 with adding result code. If there is no any
error on adding new item then server will add wTLD 0x0002 with newly
added item ID.
wTLD 0x0001: Word, adding result code (ADD_RES_CODE)
wTLD 0x0002: LongWord, newly added Item ID
Adding result codes:
ADD_RES_SUCCESS = 0x0000
ADD_RES_ERROR_WRONG_ITEM_TYPE = 0x0001
ADD_RES_ERROR_WRONG_PARENT_GROUP = 0x0002
ADD_RES_ERROR_NAME_LEN_LIMIT = 0x0003
ADD_RES_ERROR_WRONG_NAME = 0x0004
ADD_RES_ERROR_ITEM_ALREADY_EXISTS = 0x0005
ADD_RES_ERROR_ITEM_LIMIT_REACHED = 0x0006
ADD_RES_ERROR_BAD_REQUEST = 0x0007
ADD_RES_ERROR_BAD_ITEM_STLD = 0x0008
ADD_RES_ERROR_NOT_ALLOWED = 0x0009
------------------------------------------------------------------------------------------------
Subtype: 0x0009. (OBIMP_BEX_CL_CLI_DEL_ITEM)
Client deleting item from server side contact list.
wTLD 0x0001: LongWord, Item ID
------------------------------------------------------------------------------------------------
Subtype: 0x000A. (OBIMP_BEX_CL_SRV_DEL_ITEM_REPLY)
Server will reply with wTLD 0x0001.
wTLD 0x0001: Word, deletion result code (DEL_RES_CODE)
Deletion result codes:
DEL_RES_SUCCESS = 0x0000
DEL_RES_ERROR_NOT_FOUND = 0x0001
DEL_RES_ERROR_NOT_ALLOWED = 0x0002
DEL_RES_ERROR_GROUP_NOT_EMPTY = 0x0003
------------------------------------------------------------------------------------------------
Subtype: 0x000B. (OBIMP_BEX_CL_CLI_UPD_ITEM)
Client updating item of the server side contact list. Client can update every item
field excepting Item Type, Item ID, account name, authorization flag. Client have
to specify in the wTLD 0x0001 Item ID of updating item. To change parent group
client have to add wTLD 0x0002 with new parent Group ID. To change other data
client have to add wTLD 0x0003 with sTLDs. wTLD 0x0003 have to include all
sTLDs of this item even if most of them are not going to be changed, because
missing sTLDs will be interpreted by server like client is going to delete them.
Client don't have to remove authorization flag if it is not removed by server yet or
don't have to add authorization flag if it was already removed by server. In both
cases server will return bad request error if such mistake will take place.
wTLD 0x0001: LongWord, Item ID
wTLD 0x0002: New parent Group ID (optional)
wTLD 0x0003: array of sTLD, item sTLDs according item type (optional)
------------------------------------------------------------------------------------------------
Subtype: 0x000C. (OBIMP_BEX_CL_SRV_UPD_ITEM_REPLY)
Server will reply with wTLD 0x0001.
wTLD 0x0001: Word, update operation result code (UPD_RES_CODE)
Update operation result codes:
UPD_RES_SUCCESS = 0x0000
UPD_RES_ERROR_NOT_FOUND = 0x0001
UPD_RES_ERROR_WRONG_PARENT_GROUP = 0x0002
UPD_RES_ERROR_NAME_LEN_LIMIT = 0x0003
UPD_RES_ERROR_WRONG_NAME = 0x0004
UPD_RES_ERROR_ITEM_ALREADY_EXISTS = 0x0005
UPD_RES_ERROR_BAD_REQUEST = 0x0006
UPD_RES_ERROR_BAD_ITEM_STLD = 0x0007
UPD_RES_ERROR_NOT_ALLOWED = 0x0008
------------------------------------------------------------------------------------------------
Subtype: 0x000D. (OBIMP_BEX_CL_CLI_SRV_AUTH_REQUEST)
Every newly added contact to contact list will be not authorized. To receive
presence info client have to request authorization from added contact.
Remote user will decide permit or deny this request. Authorization request
have to be sent only to contact which is in client's contact list and it is
not authorized else server will close connection with "not allowed" reason.
wTLD 0x0001: UTF8, account name of authorization request receiver/sender
wTLD 0x0002: UTF8, authorization request reason
Server can add following wTLDs:
wTLD 0x0003: empty, offline authorization message flag
wTLD 0x0004: QuadWord, offline authorization message time
------------------------------------------------------------------------------------------------
Subtype: 0x000E. (OBIMP_BEX_CL_CLI_SRV_AUTH_REPLY)
Remote contact reply for authorization request.
If authorization request was granted by remote contact then server will
automatically remove authorization flag for this contact in server side contact list
and client will receive presence info of this contact according remote contact status.
Client have to manually remove authorization flag in its local copy of contact list.
If authorization request was denied by remote contact then client should suggest
deletion of this contact or sending authorization request again but later.
wTLD 0x0001: UTF8, account name of authorization reply receiver/sender
wTLD 0x0002: Word, authorization reply code
Server can add following wTLDs:
wTLD 0x0003: empty, offline authorization message flag
wTLD 0x0004: QuadWord, offline authorization message time
Authorization reply code:
AUTH_REPLY_GRANTED = 0x0001
AUTH_REPLY_DENIED = 0x0002
------------------------------------------------------------------------------------------------
Subtype: 0x000F. (OBIMP_BEX_CL_CLI_SRV_AUTH_REVOKE)
Contact can revoke previously permitted authorization. Client have to
manually add authorization flag to its local copy of contact list, because server will
stop sending presence info for this contact.
wTLD 0x0001: UTF8, account name of authorization revoke receiver/sender
wTLD 0x0002: UTF8, authorization revoke reason
Server can add following wTLDs:
wTLD 0x0003: empty, offline authorization message flag
wTLD 0x0004: QuadWord, offline authorization message time
------------------------------------------------------------------------------------------------
Subtype: 0x0010. (OBIMP_BEX_CL_CLI_REQ_OFFAUTH)
Using this BEX, client should request offline authorization requests, replies, revokes
on every login if in BEX OBIMP_BEX_CL_SRV_PARAMS_REPLY there are offline
authorization messages awaiting count greater than zero. If there are offline
authorization messages available then server will send offline marked
authorization requests, replies or revokes.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0011. (OBIMP_BEX_CL_SRV_DONE_OFFAUTH)
After all offline authorization messages was sent to client from server, server will
notify client about all authorization messages sent to client and they have to be
deleted by client.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0012. (OBIMP_BEX_CL_CLI_DEL_OFFAUTH)
To delete all offline authorization messages client have to send this BEX. Usually it
have to be sent after receiving server BEX OBIMP_BEX_CL_SRV_DONE_OFFAUTH.
No wTLDs.
=====================================================
BEX 0x0003, Presence (OBIMP_BEX_PRES)
=====================================================
Subtype: 0x0001. (OBIMP_BEX_PRES_CLI_PARAMS)
Client have to request presence info parameters and limits to notify user if any
limit exceeding.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0002. (OBIMP_BEX_PRES_SRV_PARAMS_REPLY)
Presence info parameters:
wTLD 0x0001: LongWord, maximal UTF-8 encoded status name length
wTLD 0x0002: LongWord, maximal UTF-8 encoded additional status picture description length
wTLD 0x0003: LongWord, maximal UTF-8 encoded client name length
wTLD 0x0004: LongWord, maximal capabilities count
------------------------------------------------------------------------------------------------
Subtype: 0x0003. (OBIMP_BEX_PRES_CLI_SET_CAPS)
Before notify contacts about client presence info, client have to set own capabilities.
Client always can change this info during session.
wTLD 0x0001: Array of Word, client capabilities (see below)
wTLD 0x0002: Word, client type (see below)
wTLD 0x0003: UTF8, user client name
wTLD 0x0004: QuadWord, user client version (see below)
Available client capabilities:
CAP_MSGS_UTF8 = 0x0001 - UTF-8 encoding messages support (required for all clients)
CAP_MSGS_RTF = 0x0002 - RTF (Rich Text Format) messages support with UTF-8 encoding
CAP_MSGS_HTML = 0x0003 - HTML (HyperText Markup Language) messages support UTF-8 encoding
CAP_MSGS_ENCRYPT = 0x0004 - Encryption support
CAP_NOTIFS_TYPING = 0x0005 - Typing notifications support
CAP_AVATARS = 0x0006 - Avatars support
Available client types:
CLIENT_TYPE_USER = 0x0001 - User
CLIENT_TYPE_BOT = 0x0002 - Bot
CLIENT_TYPE_SERVICE = 0x0003 - Service
Client version represented as 8 bytes where every next 2 bytes mean
major, minor, release and build of version info.
------------------------------------------------------------------------------------------------
Subtype: 0x0004. (OBIMP_BEX_PRES_CLI_SET_STATUS)
Client sets own presence info. wTLD 0x0001 must be always included in this BEX.
Optional wTLD 0x0002 with status name can be included for developers statuses
that are not defined here.
wTLD 0x0001: LongWord, presence status value (see below)
Optional:
wTLD 0x0002: UTF8, status name
wTLD 0x0003: LongWord, additional status picture number
wTLD 0x0004: UTF8, additional status picture description
Available default presence status values:
PRES_STATUS_ONLINE = 0x0000
PRES_STATUS_INVISIBLE = 0x0001
PRES_STATUS_INVISIBLE_FOR_ALL = 0x0002
PRES_STATUS_FREE_FOR_CHAT = 0x0003
PRES_STATUS_AT_HOME = 0x0004
PRES_STATUS_AT_WORK = 0x0005
PRES_STATUS_LUNCH = 0x0006
PRES_STATUS_AWAY = 0x0007
PRES_STATUS_NOT_AVAILABLE = 0x0008
PRES_STATUS_OCCUPIED = 0x0009
PRES_STATUS_DO_NOT_DISTURB = 0x000A
Users/developers can add own status values starting from 0x80000000.
PRES_STATUS_DEVELOPER >= 0x80000000
------------------------------------------------------------------------------------------------
Subtype: 0x0005. (OBIMP_BEX_PRES_CLI_ACTIVATE)
To receive contacts statuses and start notify contacts about user status,
client have to activate presence info broadcast using this BEX. This BEX must be
sent only once during login sequence when client ready to receive contacts
presence info and already set own presence status.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0006. (OBIMP_BEX_PRES_SRV_CONTACT_ONLINE)
When contact goes online, server will broadcast about contact's presence info
to every contact in its contact list according contact privacy type.
wTLD 0x0001: UTF8, account name
wTLD 0x0002: LongWord, presence status value
Optional:
wTLD 0x0003: UTF8, status name
wTLD 0x0004: LongWord, additional status picture number
wTLD 0x0005: UTF8, additional status picture description
wTLD 0x0006: Array of Word, client capabilities
wTLD 0x0007: Word, client type
wTLD 0x0008: UTF8, client name
wTLD 0x0009: QuadWord, client version
wTLD 0x000A: QuadWord, client connected time
wTLD 0x000B: QuadWord, registration date
wTLD 0x000C: OctaWord, avatar MD5 hash
------------------------------------------------------------------------------------------------
Subtype: 0x0007. (OBIMP_BEX_PRES_SRV_CONTACT_OFFLINE)
When contact goes offline or activates invisible status, server will broadcast
about it to contacts in its contact list according contact privacy type.
wTLD 0x0001: UTF8, account name
=====================================================
BEX 0x0004, Instant messaging (OBIMP_BEX_IM)
=====================================================
Subtype: 0x0001. (OBIMP_BEX_IM_CLI_PARAMS)
Client have to request instant messaging parameters and limits to notify user if any
limit exceeding.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0002. (OBIMP_BEX_IM_SRV_PARAMS_REPLY)
Instant messaging parameters:
wTLD 0x0001: LongWord, maximal UTF-8 encoded account name length
wTLD 0x0002: LongWord, maximal message data length
wTLD 0x0003: LongWord, offline messages count awaiting for client request
------------------------------------------------------------------------------------------------
Subtype: 0x0003. (OBIMP_BEX_IM_CLI_REQ_OFFLINE)
Client should request offline messages on every login if in BEX
OBIMP_BEX_IM_SRV_PARAMS_REPLY there are offline messages awaiting count
greater than zero. If there are offline messages available then server will send
offline marked message BEX.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0004. (OBIMP_BEX_IM_SRV_DONE_OFFLINE)
After all offline messages was sent to client from server, server will notify client
about all messages sent to client and they have to be deleted by client.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0005. (OBIMP_BEX_IM_CLI_DEL_OFFLINE)
To delete all offline messages client have to send this BEX. Usually it have to be
sent after receiving server BEX OBIMP_BEX_IM_SRV_DONE_OFFLINE.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0006. (OBIMP_BEX_IM_CLI_MESSAGE)
Client sending message. Message type must be selected using remote client
capabilities. Base capability is UTF-8 encoded message. It have to be used
for sending messages to not in list contacts and to online contacts which client
doesn't support any other message types. If remote client does not have capability
of message type support then such message even will not be delivered to remote
client. Every message must have unique message ID and it must not be zero else
server will close connection. Unique message ID is generating by client and it can
be any kind of counter.
To send encrypted message client have to add wTLD 0x0006, but first of all it
have to request public key from remote contact using corresponding BEX.
wTLD 0x0001: UTF8, account name of message receiver
wTLD 0x0002: LongWord, unique message ID
wTLD 0x0003: LongWord, message type (see below)
wTLD 0x0004: BLK, message data
Optional:
wTLD 0x0005: empty, request message acknowledge from remote client
wTLD 0x0006: LongWord, encryption type (see corresponding BEX for types)
Message types:
MSG_TYPE_UTF8 = 0x0001 - UTF-8 encoded message (base type)
MSG_TYPE_RTF = 0x0002 - RTF (Rich Text Format) message with UTF-8 encoding
MSG_TYPE_HTML = 0x0003 - HTML (HyperText Markup Language) message with UTF-8 encoding
------------------------------------------------------------------------------------------------
Subtype: 0x0007. (OBIMP_BEX_IM_SRV_MESSAGE)
Client receiving message. It will receive exactly the same message that it was
generated by remote client in BEX above excepting wTLD 0x0001. Server can
add additional wTLDs.
If received encrypted message with wTLD 0x0006, then client have to decrypt
received message data and then parse it according message type.
wTLD 0x0001: UTF8, account name of message sender
wTLD 0x0002: LongWord, unique message ID
wTLD 0x0003: LongWord, message type
wTLD 0x0004: BLK, message data
Optional:
wTLD 0x0005: empty, request message delivery report from remote client
wTLD 0x0006: LongWord, encryption type (see corresponding BEX for types)
Server can add following wTLDs:
wTLD 0x0007: empty, offline message flag
wTLD 0x0008: QuadWord, offline message time
wTLD 0x0009: empty, system message flag
------------------------------------------------------------------------------------------------
Subtype: 0x0008. (OBIMP_BEX_IM_CLI_SRV_MSG_REPORT)
If remote client requested message delivery report in its message then client
should send message acknowledge immediately after receiving message.
In cases of privacy when using invisible statuses and for not in list contacts
client should not send message acknowledge.
wTLD 0x0001: UTF8, account name of delivery report receiver/sender
wTLD 0x0002: LongWord, unique received message ID
------------------------------------------------------------------------------------------------
Subtype: 0x0009. (OBIMP_BEX_IM_CLI_SRV_NOTIFY)
If both clients support notifications then they have to send them in both
directions when needed.
wTLD 0x0001: UTF8, account name of notification receiver/sender
wTLD 0x0002: LongWord, notification type (see below)
wTLD 0x0003: LongWord, notification value (see below)
Available notifications types:
NOTIF_TYPE_USER_TYPING = 0x0001
Notification values:
NOTIF_VALUE_USER_TYPING_START = 0x0001
NOTIF_VALUE_USER_TYPING_FINISH = 0x0002
------------------------------------------------------------------------------------------------
Subtype: 0x000A. (OBIMP_BEX_IM_CLI_SRV_ENCRYPT_KEY_REQ)
If remote client which contact is in client contact list has asymmetric key
cryptography support capability then client can request public key to encrypt
outgoing messages for remote client.
wTLD 0x0001: UTF8, account name of public key request receiver/sender
------------------------------------------------------------------------------------------------
Subtype: 0x000B. (OBIMP_BEX_IM_CLI_SRV_ENCRYPT_KEY_REPLY)
If client supports asymmetric key cryptography and it has public key, it will
reply with encryption type and public key else it will reply with ENC_TYPE_DISABLED
or will not reply at all.
wTLD 0x0001: UTF8, account name of public key receiver/sender
wTLD 0x0002: LongWord, encryption type (see below)
Optional (added only when encryption type is not ENC_TYPE_DISABLED):
wTLD 0x0003: BLK, public key
Available encryption types:
ENC_TYPE_DISABLED = 0x0000 (encryption disabled or not supported)
ENC_TYPE_OBIMP = 0x0001 (OBIMP client internal encryption, currently is TDES)
ENC_TYPE_PGP = 0x0002 (currently is not used)
=====================================================
BEX 0x0005, Users directory (OBIMP_BEX_UD)
=====================================================
Subtype: 0x0001. (OBIMP_BEX_UD_CLI_PARAMS)
Client have to request users directory parameters and limits to notify user if any
limit exceeding.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0002. (OBIMP_BEX_UD_SRV_PARAMS_REPLY)
Users directory parameters:
wTLD 0x0001: LongWord, maximal UTF-8 encoded account name length
wTLD 0x0002: LongWord, maximal UTF-8 encoded details field length
wTLD 0x0003: LongWord, maximal UTF-8 encoded about field length
wTLD 0x0004: Bool, if True then client can change account's secure email
wTLD 0x0005: Bool, if True then client can change account's password
wTLD 0x0006: UTF8, secure email/password changing URL if available
------------------------------------------------------------------------------------------------
Subtype: 0x0003. (OBIMP_BEX_UD_CLI_DETAILS_REQ)
Client can request user details any time during session. Only for authorized
contacts in client's contact list server will return all available details else it will
return only nick name, first name and last name.
Client account details can be requested the same way.
wTLD 0x0001: UTF8, account name
------------------------------------------------------------------------------------------------
Subtype: 0x0004. (OBIMP_BEX_UD_SRV_DETAILS_REQ_REPLY)
Users directory details for requested account.
wTLD 0x0001: Word, request details result code (DETAILS_RES_CODE)
wTLD 0x0002: UTF8, account name
Only for client's account:
wTLD 0x0003: UTF8, secure email
wTLD 0x0019: Bool, if True then online status will not be shown in users directory
Optional:
wTLD 0x0004: UTF8, nick name
wTLD 0x0005: UTF8, first name
wTLD 0x0006: UTF8, last name
wTLD 0x0007: Word, country code (see below)
wTLD 0x0008: UTF8, region/state
wTLD 0x0009: UTF8, city
wTLD 0x000A: UTF8, zip code
wTLD 0x000B: UTF8, address
wTLD 0x000C: Word, language code (see below)
wTLD 0x000D: Word, additional language code (see below)
wTLD 0x000E: Byte, gender (0x00 - not specified, 0x01 - female, 0x02 - male)
wTLD 0x000F: QuadWord, birthday
wTLD 0x0010: UTF8, homepage
wTLD 0x0011: UTF8, about
wTLD 0x0012: UTF8, interests
wTLD 0x0013: UTF8, email
wTLD 0x0014: UTF8, additional email
wTLD 0x0015: UTF8, home phone
wTLD 0x0016: UTF8, work phone
wTLD 0x0017: UTF8, cellular phone
wTLD 0x0018: UTF8, fax number
wTLD 0x001A: UTF8, company
wTLD 0x001B: UTF8, division/department
wTLD 0x001C: UTF8, position
User details request result codes:
DETAILS_RES_SUCCESS = 0x0000
DETAILS_RES_NOT_FOUND = 0x0001
DETAILS_RES_TOO_MANY_REQUESTS = 0x0002
DETAILS_RES_SERVICE_TEMP_UNAVAILABLE = 0x0003
Country codes:
Can be found at the end of this document
Language codes:
Can be found at the end of this document
------------------------------------------------------------------------------------------------
Subtype: 0x0005. (OBIMP_BEX_UD_CLI_DETAILS_UPD)
Client can update own account details. Client can send only updated details fields.
wTLD 0x0001: UTF8, client's account name
Optional:
wTLD 0x0002: UTF8, nick name
wTLD 0x0003: UTF8, first name
wTLD 0x0004: UTF8, last name
wTLD 0x0005: Word, country code (see below)
wTLD 0x0006: UTF8, region/state
wTLD 0x0007: UTF8, city
wTLD 0x0008: UTF8, zip code
wTLD 0x0009: UTF8, address
wTLD 0x000A: Word, language code (see below)
wTLD 0x000B: Word, additional language code (see below)
wTLD 0x000C: Byte, gender (0x00 - not specified, 0x01 - female, 0x02 - male)
wTLD 0x000D: QuadWord, birthday
wTLD 0x000E: UTF8, homepage
wTLD 0x000F: UTF8, about
wTLD 0x0010: UTF8, interests
wTLD 0x0011: UTF8, email
wTLD 0x0012: UTF8, additional email
wTLD 0x0013: UTF8, home phone
wTLD 0x0014: UTF8, work phone
wTLD 0x0015: UTF8, cellular phone
wTLD 0x0016: UTF8, fax number
wTLD 0x0017: Bool, if True then online status will not be shown in users directory
wTLD 0x0018: UTF8, company
wTLD 0x0019: UTF8, division/department
wTLD 0x001A: UTF8, position
------------------------------------------------------------------------------------------------
Subtype: 0x0006. (OBIMP_BEX_UD_SRV_DETAILS_UPD_REPLY)
Server will reply with update result code.
wTLD 0x0001: Word, update details result code (UPD_DETAILS_RES_CODE)
Update details result codes:
UPD_DETAILS_RES_SUCCESS = 0x0000
UPD_DETAILS_RES_BAD_REQUEST = 0x0001
UPD_DETAILS_RES_SERVICE_TEMP_UNAVAILABLE = 0x0002
------------------------------------------------------------------------------------------------
Subtype: 0x0007. (OBIMP_BEX_UD_CLI_SEARCH)
Client can search for other users according search criterion. Every criterion in the
client request have to be represented as corresponding wTLD.
Request:
wTLD 0x0001: UTF8, account name
Or request:
wTLD 0x0002: UTF8, email
Or request:
wTLD 0x0003: UTF8, nick name
wTLD 0x0004: UTF8, first name
wTLD 0x0005: UTF8, last name
wTLD 0x0006: Word, country code
wTLD 0x0007: UTF8, city
wTLD 0x0008: Word, language code
wTLD 0x0009: Byte, gender (0x00 - not specified, 0x01 - female, 0x02 - male)
wTLD 0x000A: Byte, age min
wTLD 0x000B: Byte, age max
wTLD 0x000C: Byte, zodiac sign (see below)
wTLD 0x000D: UTF8, interests
wTLD 0x000E: empty, search online users only
Zodiac signs:
ZODIAC_ARIES = 0x01
ZODIAC_TAURUS = 0x02
ZODIAC_GEMINI = 0x03
ZODIAC_CANCER = 0x04
ZODIAC_LEO = 0x05
ZODIAC_VIRGO = 0x06
ZODIAC_LIBRA = 0x07
ZODIAC_SCORPIO = 0x08
ZODIAC_SAGITTARIUS = 0x09
ZODIAC_CAPRICORN = 0x0A
ZODIAC_AQUARIUS = 0x0B
ZODIAC_PISCES = 0x0C
------------------------------------------------------------------------------------------------
Subtype: 0x0008. (OBIMP_BEX_UD_SRV_SEARCH_REPLY)
Server will reply with search results. There can be more than one BEX if more
than one user corresponds for search criterion.
wTLD 0x0001: Word, request details result code (SEARCH_RES_CODE)
Optional:
wTLD 0x0002: UTF8, account name
wTLD 0x0003: UTF8, nick name
wTLD 0x0004: UTF8, first name
wTLD 0x0005: UTF8, last name
wTLD 0x0006: Byte, gender (0x00 - not specified, 0x01 - female, 0x02 - male)
wTLD 0x0007: Byte, age
wTLD 0x0008: empty, user is online
If this is last BEX with search result then server will add following wTLDs:
wTLD 0x0009: empty, last search result
wTLD 0x000A: LongWord, total count of results in DB
Search result codes:
SEARCH_RES_SUCCESS = 0x0000
SEARCH_RES_NOT_FOUND = 0x0001
SEARCH_RES_BAD_REQUEST = 0x0002
SEARCH_RES_TOO_MANY_REQUESTS = 0x0003
SEARCH_RES_SERVICE_TEMP_UNAVAILABLE = 0x0004
------------------------------------------------------------------------------------------------
Subtype: 0x0009. (OBIMP_BEX_UD_CLI_SECURE_UPD)
If server allowed changing of secure email and password then client can send
this BEX. To change secure email or password client have to send wTLD 0x0001 with
client's account name and wTLD 0x0002 with current password.
wTLD 0x0001: UTF8, client's account name
wTLD 0x0002: UTF8, account's current password
wTLD 0x0003: UTF8, account's new secure email
or/and
wTLD 0x0004: UTF8, account's new password
------------------------------------------------------------------------------------------------
Subtype: 0x000A. (OBIMP_BEX_UD_SRV_SECURE_UPD_REPLY)
Server will reply with secure email or password update result code.
wTLD 0x0001: Word, update result code (UPD_SECURE_RES_CODE)
Update details result codes:
UPD_SECURE_RES_SUCCESS = 0x0000
UPD_SECURE_RES_BAD_REQUEST = 0x0001
UPD_SECURE_RES_SERVICE_TEMP_UNAVAILABLE = 0x0002
UPD_SECURE_RES_NOT_ALLOWED = 0x0003
=====================================================
BEX 0x0006, User avatars (OBIMP_BEX_UA)
Currently server supports PNG avatars only.
Server will check PNG header on setting new avatar.
=====================================================
Subtype: 0x0001. (OBIMP_BEX_UA_CLI_PARAMS)
Client have to request users avatars parameters and limits to notify user if any
limit exceeding.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0002. (OBIMP_BEX_UA_SRV_PARAMS_REPLY)
If server has saved client avatar then it will add wTLD 0x0002 with avatar file
MD5 hash. Users avatars parameters:
wTLD 0x0001: LongWord, maximal avatar file size
wTLD 0x0002: OctaWord, current client avatar file MD5 hash
------------------------------------------------------------------------------------------------
Before sending BEXs below client have to set capabilities using
OBIMP_BEX_PRES_CLI_SET_CAPS where have to be avatars support capability
else server will reply with error.
------------------------------------------------------------------------------------------------
Subtype: 0x0003. (OBIMP_BEX_UA_CLI_AVATAR_REQ)
Client can request own and users avatars any time during session. Avatar file
MD5 hash can be got from presence info if remote client supports avatars.
wTLD 0x0001: OctaWord, avatar file MD5 hash
------------------------------------------------------------------------------------------------
Subtype: 0x0004. (OBIMP_BEX_UA_SRV_AVATAR_REPLY)
If server has such avatar with requested MD5 hash then it will reply with
avatar file else it will reply with error in wTLD 0x0001.
wTLD 0x0001: Word, avatar request result (see below)
wTLD 0x0002: OctaWord, avatar file MD5 hash
wTLD 0x0003: BLK, avatar file
Avatar request result:
AVATAR_REQ_SUCCESS = 0x0000
AVATAR_REQ_NOT_FOUND = 0x0001
AVATAR_REQ_NOT_ALLOWED = 0x0002
------------------------------------------------------------------------------------------------
Subtype: 0x0005. (OBIMP_BEX_UA_CLI_AVATAR_SET)
Client can set own avatar any time during session. Client have to send MD5 hash
of the avatar file that will be checked by server after receiving this BEX.
Old avatar will be replaced by server automatically.
To remove or clear avatar client have to send empty wTLD 0x0001.
wTLD 0x0001: OctaWord, avatar file MD5 hash
wTLD 0x0002: BLK, avatar file data
Or
wTLD 0x0001: empty, means that client cleared own avatar
------------------------------------------------------------------------------------------------
Subtype: 0x0006. (OBIMP_BEX_UA_SRV_AVATAR_SET_REPLY)
If avatar was successfully received by server and avatar file MD5 hash checked
then server will broadcast new avatar MD5 hash to users in presence info.
wTLD 0x0001: Word, avatar request result (see below)
Avatar set result:
AVATAR_SET_SUCCESS = 0x0000
AVATAR_SET_BAD_MD5 = 0x0001
AVATAR_SET_NOT_ALLOWED = 0x0002
AVATAR_SET_TEMP_UNAVAILABLE = 0x0003
**********************************************************************************
3. Administrative BEX types
Administrative BEX types are transmitted between OBIMP administrative clients and
administrative server for OBIMP server settings and user accounts administration.
Available BEX types:
0x0001, Windows server administration. (OBIMP_BEX_WADM)
=====================================================
BEX 0xF001, Windows server administration (OBIMP_BEX_WADM)
=====================================================
Subtype: 0x0001. (OBIMP_BEX_WADM_CLI_LOGIN)
To login for administrative purposes client have to connect to special
administrative server and port number. And this will be first BEX after connection
established. Server key is generated on server.
wTLD 0x0001: BLK, current server administrative key
------------------------------------------------------------------------------------------------
Subtype: 0x0002. (OBIMP_BEX_WADM_SRV_LOGIN_REPLY)
If this is administrative server will reply with this BEX. If client sent valid
server key it will reply with wTLD 0x0001 with success code. After
success administrative login client can send other administrative BEXs.
wTLD 0x0001: Word, administrative result code (see below)
Administrative status codes:
ADM_RES_CODE_SUCCESS = 0x0000
ADM_RES_CODE_BAD_KEY = 0x0001
------------------------------------------------------------------------------------------------
Subtype: 0x0003. (OBIMP_BEX_WADM_CLI_PARAMS)
To request server parameters client have to send this BEX.
No wTLDs.
------------------------------------------------------------------------------------------------
Subtype: 0x0004. (OBIMP_BEX_WADM_SRV_PARAMS_REPLY)
Server parameters reply.
wTLD 0x0001: UTF8, users database directory path
wTLD 0x0002: LongWord, main server port number to listen incoming connections
wTLD 0x0003: LongWord, administration server port number to listen incoming connections
wTLD 0x0004: Bool, start main server on system start
wTLD 0x0005: Bool, start administration server on system start
wTLD 0x0006: Bool, listen for incoming connections on main server port
wTLD 0x0007: Bool, listen for incoming connections on administration server port
wTLD 0x0008: Bool, server administration key auto-change feature
wTLD 0x0009: LongWord, server administration key auto-change seconds
wTLD 0x000A: LongWord, maximal clients count limit
wTLD 0x000B: LongWord, current connected clients count
wTLD 0x000C: LongWord, total registered users count
wTLD 0x000D: LongWord, authentication timeout seconds
wTLD 0x000E: LongWord, idle seconds to send keep alive pings
wTLD 0x000F: LongWord, maximal account name length
wTLD 0x0010: LongWord, maximal groups count in contact list
wTLD 0x0011: LongWord, maximal group name length
wTLD 0x0012: LongWord, maximal contacts count
wTLD 0x0013: LongWord, maximal contact name length
wTLD 0x0014: LongWord, maximal authorization reason/revoke length
wTLD 0x0015: LongWord, maximal status name length
wTLD 0x0016: LongWord, maximal status picture description length
wTLD 0x0017: LongWord, maximal client name length
wTLD 0x0018: LongWord, maximal capabilities count
wTLD 0x0019: LongWord, maximal message data length
wTLD 0x001A: LongWord, maximal details fields length
wTLD 0x001B: LongWord, maximal about field length
wTLD 0x001C: LongWord, maximal avatar file size
wTLD 0x001D: UTF8, IP ban list
wTLD 0x001E: Bool, users can register new accounts flag
wTLD 0x001F: UTF8, registration URL
wTLD 0x0020: UTF8, allowed characters in the account name for registration
wTLD 0x0021: UTF8, disallowed first characters in the account name for registration
wTLD 0x0022: UTF8, disallowed last characters in the account name for registration
wTLD 0x0023: LongWord, minimal account name length for registration
wTLD 0x0024: UTF8, password reminder URL
wTLD 0x0025: UTF8, log files path
wTLD 0x0026: Bool, write log file for main server
wTLD 0x0027: Bool, write log file for admin server
wTLD 0x0028: UTF8, secure email and password change URL
wTLD 0x0029: Bool, users can change account's secure email
wTLD 0x002A: Bool, users can change account's password
wTLD 0x002B: LongWord, main server optional port number to listen incoming connections
wTLD 0x002C: LongWord, main server optional port number to listen incoming connections
wTLD 0x002D: BLK, general contact list data
------------------------------------------------------------------------------------------------
Subtype: 0x0005. (OBIMP_BEX_WADM_CLI_SET)
To set server parameters client have to send this BEX. All wTLDs are the same like
in BEX OBIMP_BEX_WADM_SRV_PARAMS_REPLY. Client should send only
changed settings wTLDs.
wTLD 0x0001: UTF8, users database directory path
....
Client don't have to send following wTLDs:
wTLD 0x000B: LongWord, current connected clients count
wTLD 0x000C: LongWord, total registered users count
------------------------------------------------------------------------------------------------
Subtype: 0x0006. (OBIMP_BEX_WADM_SRV_SET_REPLY)
This BEX is server reply if setting change BEX was sent. Server will return the
same wTLDs count like it was sent in OBIMP_BEX_WADM_CLI_SET.
wTLD 0x0001: Word, users DB directory setting change result code (see below)
....
Setting change result codes:
SET_CHANGE_SUCCESS = 0x0000
SET_CHANGE_NOT_ALLOWED = 0x0001
------------------------------------------------------------------------------------------------
Subtype: 0x0007. (OBIMP_BEX_WADM_CLI_BROADCAST)
Used to send system message to clients or to disconnect all clients.
The sender of system message will be OBIMP packet begin sign "#"
and all such messages will be marked using system message flag.
wTLD 0x0001: Word, broadcast flag (see below)
To send system message, client have to add following wTLD:
wTLD 0x0002: UTF8, system message text (maximal UTF-8 encoded length is 2048)
Broadcast flags:
BROADCAST_MSG_TO_ALL = 0x0001
BROADCAST_MSG_TO_CONNECTED_ONLY = 0x0002
BROADCAST_DROP_CONNECTIONS = 0x0003
------------------------------------------------------------------------------------------------
Subtype: 0x0008. (OBIMP_BEX_WADM_SRV_BROADCAST_REPLY)
Server will reply with broadcast result code.
wTLD 0x0001: Word, broadcast result code (see below)
Broadcast result codes:
BC_RES_SUCCESS = 0x0000
BC_RES_BAD_REQUEST = 0x0001
BC_RES_MSG_LEN_LIMIT = 0x0002
------------------------------------------------------------------------------------------------
Subtype: 0x0009. (OBIMP_BEX_WADM_CLI_USER)
Used to add/update/ban/delete users.
wTLD 0x0001: Word, user command (see below)
wTLD 0x0002: UTF8, account name (max length depends on server setting)
CMD_USER_ADD, CMD_USER_UPD:
When adding new user, client have to add password and secure email wTLDs.
wTLD 0x0003: UTF8, password (maximal UTF-8 encoded length is 1024)
wTLD 0x0004: UTF8, secure email (maximal UTF-8 encoded length is 1024)
When changing password or changing secure email client have to add
corresponding wTLD or both wTLDs above.
CMD_USER_BAN, CMD_USER_UNBAN:
When banning or unbanning user, ban/unban note or reason should be added by
adding following wTLD:
wTLD 0x0005: UTF8, ban/unban note (maximal UTF-8 encoded length is 2048)
CMD_USER_ADD, CMD_USER_UPD:
When adding/changing user details client have to add one or more from this wTLDs:
wTLD 0x0006: UTF8, nick name
wTLD 0x0007: UTF8, first name
wTLD 0x0008: UTF8, last name
wTLD 0x0009: Word, country code
wTLD 0x000A: UTF8, region/state
wTLD 0x000B: UTF8, city
wTLD 0x000C: UTF8, zip code
wTLD 0x000D: UTF8, address
wTLD 0x000E: Word, language code
wTLD 0x000F: Word, additional language code
wTLD 0x0010: Byte, gender (0x00 - not specified, 0x01 - female, 0x02 - male)
wTLD 0x0011: QuadWord, birthday
wTLD 0x0012: UTF8, homepage
wTLD 0x0013: UTF8, about
wTLD 0x0014: UTF8, interests
wTLD 0x0015: UTF8, email
wTLD 0x0016: UTF8, additional email
wTLD 0x0017: UTF8, home phone
wTLD 0x0018: UTF8, work phone
wTLD 0x0019: UTF8, cellular phone
wTLD 0x001A: UTF8, fax number
wTLD 0x001B: Bool, if True then online status will not be shown in users directory
wTLD 0x001C: UTF8, company
wTLD 0x001D: UTF8, division/department
wTLD 0x001E: UTF8, position
Available user commands:
CMD_USER_ADD = 0x0001
CMD_USER_DEL = 0x0002
CMD_USER_UPD = 0x0003
CMD_USER_BAN = 0x0004
CMD_USER_UNBAN = 0x0005
CMD_USER_KICK = 0x0006
CMD_USER_DETAILS = 0x0007
CMD_USER_CLEARCL = 0x0008
------------------------------------------------------------------------------------------------
Subtype: 0x000A. (OBIMP_BEX_WADM_SRV_USER_REPLY)
Server will reply with user add/ban/delete result code.
wTLD 0x0001: Word, user operation result code (see below)
If client requested user details and such user was found then following wTLDs
will be added:
wTLD 0x0002: UTF8, account name
wTLD 0x0003: UTF8, secure email
wTLD 0x0004: UTF8, nick name
wTLD 0x0005: UTF8, first name
wTLD 0x0006: UTF8, last name
wTLD 0x0007: Word, country code
wTLD 0x0008: UTF8, region/state
wTLD 0x0009: UTF8, city
wTLD 0x000A: UTF8, zip code
wTLD 0x000B: UTF8, address
wTLD 0x000C: Word, language code
wTLD 0x000D: Word, additional language code
wTLD 0x000E: Byte, gender (0x00 - not specified, 0x01 - female, 0x02 - male)
wTLD 0x000F: QuadWord, birthday
wTLD 0x0010: UTF8, homepage
wTLD 0x0011: UTF8, about
wTLD 0x0012: UTF8, interests
wTLD 0x0013: UTF8, email
wTLD 0x0014: UTF8, additional email
wTLD 0x0015: UTF8, home phone
wTLD 0x0016: UTF8, work phone
wTLD 0x0017: UTF8, cellular phone
wTLD 0x0018: UTF8, fax number
wTLD 0x0019: UTF8, base64 encoded password hash
wTLD 0x001A: QuadWord, registration date
wTLD 0x001B: LongWord, current presence status
wTLD 0x001C: QuadWord, last connected date
wTLD 0x001D: UTF8, last IP address
wTLD 0x001E: Bool, banned flag
wTLD 0x001F: QuadWord, ban/unban date
wTLD 0x0020: UTF8, ban/unban note
wTLD 0x0021: QuadWord, total logins count
wTLD 0x0022: Bool, if True then online status will not be shown in users directory
wTLD 0x0023: UTF8, company
wTLD 0x0024: UTF8, division/department
wTLD 0x0025: UTF8, position
User operation result codes:
USER_RES_SUCCESS = 0x0000
USER_RES_BAD_REQUEST = 0x0001
USER_RES_NOT_FOUND = 0x0002
USER_RES_ALREADY_EXISTS = 0x0003
USER_RES_LEN_LIMIT = 0x0004
USER_RES_SERVICE_TEMP_UNAVAILABLE = 0x0005
------------------------------------------------------------------------------------------------
Subtype: 0x000B. (OBIMP_BEX_WADM_SRV_STATE)
Server can send state of total users count and connected users count.
wTLD 0x0001: LongWord, current connected clients count
wTLD 0x0002: LongWord, total registered users count
------------------------------------------------------------------------------------------------
Subtype: 0x000C. (OBIMP_BEX_WADM_CLI_LIST)
Used to get list of connected, registered and last registered user lists.
wTLD 0x0001: Word, list type (see below)
wTLD 0x0002: LongWord, get next users from this index
Admin list types:
LIST_TYPE_CONNECTED = 0x0001
LIST_TYPE_REGISTERED = 0x0002
LIST_TYPE_LAST_REGED = 0x0003
------------------------------------------------------------------------------------------------
Subtype: 0x000D. (OBIMP_BEX_WADM_SRV_LIST_REPLY)
Server will reply with requested list. As far as there can be a lot of users, every
new request will return maximum 100 users until LIST_REQ_FINISHED code will
not be received. If there are next users found then server will add user data wTLDs.
wTLD 0x0001: Word, list request result code (see below)
wTLD 0x0002: LongWord, last index to make next request
Optional:
wTLD 0x0003: UTF8, account name
wTLD 0x0004: UTF8, last IP address
wTLD 0x0005: QuadWord, total logins count
wTLD 0x0006: UTF8, secure e-mail
List request result codes:
LIST_REQ_FINISHED = 0x0000
LIST_REQ_MORE_AVAILABLE = 0x0001
LIST_REQ_BAD_REQUEST = 0x0002
**********************************************************************************
4. OBIMP packets sequences
If BEX have to be sent by client it will be marked with "GREEN" color.
If BEX have to be sent by server it will be marked with "MAROON" color.
=====================================================
4.1 General BEX types sequences
=====================================================
4.1.1 New account registration:
- Client connects to OBIMP server
- OBIMP_BEX_COM_CLI_HELLO
wTLD 0x0003: empty, will just identify registration attempt
- OBIMP_BEX_COM_SRV_HELLO
wTLD 0x0005: Bool, if value is True then registration is enabled
Optional: wTLD 0x0006: UTF8, registration URL
a) If registration is enabled
- OBIMP_BEX_COM_CLI_REGISTER
wTLD 0x0001: UTF8, account name (maximal UTF-8 encoded length depends on server setting)
wTLD 0x0002: UTF8, password (maximal UTF-8 encoded length is 1024)
wTLD 0x0003: UTF8, secure email (maximal UTF-8 encoded length is 1024)
Optional: wTLD 0x0004: BLK, current server administrative key
- OBIMP_BEX_COM_SRV_REGISTER_REPLY
wTLD 0x0001: Word, registration result code
Optional:
wTLD 0x0002: UTF8, allowed characters in the account name for registration
wTLD 0x0003: UTF8, disallowed first characters in the account name for registration
wTLD 0x0004: UTF8, disallowed last characters in the account name for registration
wTLD 0x0005: LongWord, minimal account name length for registration
- Client disconnects
b) If registration is disabled
- Client disconnects
- If registration URL is available then client should ask user to register using this URL
------------------------------------------------------------------------------------------------
4.1.2 Logging in:
--------------------------------------------------
Scenario 1 (Hello error).
- Client connects to OBIMP server
- OBIMP_BEX_COM_CLI_HELLO
wTLD 0x0001: UTF8, account name
- OBIMP_BEX_COM_SRV_HELLO
wTLD 0x0001: Word, hello error (HELLO_ERROR_CODE)
- Client disconnects
--------------------------------------------------
Scenario 2 (Server redirect).
- Client connects to OBIMP server
- OBIMP_BEX_COM_CLI_HELLO
wTLD 0x0001: UTF8, account name
- OBIMP_BEX_COM_SRV_HELLO
wTLD 0x0003: UTF8, redirect, new server host/ip
wTLD 0x0004: LongWord, redirect, new server port number
- Client disconnects
- Client restarts login sequence from beginning using new OBIMP server host and port
--------------------------------------------------
Scenario 3 (Login error/success/cookie).
- Client connects to OBIMP server
- OBIMP_BEX_COM_CLI_HELLO
wTLD 0x0001: UTF8, account name
- OBIMP_BEX_COM_SRV_HELLO
wTLD 0x0002: BLK, server key to generate one-time MD5 password hash
- OBIMP_BEX_COM_CLI_LOGIN
wTLD 0x0001: UTF8, account name
wTLD 0x0002: OctaWord, one-time generated MD5 hash
- OBIMP_BEX_COM_SRV_LOGIN_REPLY
a) wTLD 0x0001: Word, login error (LOGIN_ERROR_CODE)
Optional: wTLD 0x0007: UTF8, password reminder URL if wrong password code
b) wTLD 0x0002: array of Word, server supported BEXs
wTLD 0x0003: LongWord, maximal client BEXs data length
c) wTLD 0x0004: UTF8, new server host/ip
wTLD 0x0005: LongWord, new server port number
wTLD 0x0006: BLK, unique server cookie
a) If login error
- Client disconnects
- If password reminder URL is available then client should show it to user
b) Login success (see "After login actions")
c) New server host, port number and unique cookie received
- Client disconnects
- Client restarts login sequence from beginning using new server host, port
number and cookie (see "Login with cookie" scenario)
--------------------------------------------------
Scenario 4 (Plain-text password login).
- Client connects to OBIMP server
- OBIMP_BEX_COM_CLI_HELLO
wTLD 0x0001: UTF8, account name
- OBIMP_BEX_COM_SRV_HELLO
wTLD 0x0007: empty, server requires plain-text password authentication
- OBIMP_BEX_COM_CLI_LOGIN
wTLD 0x0001: UTF8, account name
wTLD 0x0003: UTF8, plain-text password
- OBIMP_BEX_COM_SRV_LOGIN_REPLY
(next data is the same as in scenario 3)
...
--------------------------------------------------
Scenario 5 (Login with cookie).
- Client connects to OBIMP server
- OBIMP_BEX_COM_CLI_HELLO
wTLD 0x0001: UTF8, account name
wTLD 0x0002: BLK, unique server cookie
a) If account name and cookie not matched
- OBIMP_BEX_COM_SRV_HELLO
wTLD 0x0001: Word, hello error (HELLO_ERROR_CODE)
- Client disconnects
b) If account name and cookie matched
- OBIMP_BEX_COM_SRV_LOGIN_REPLY
wTLD 0x0002: array of Word, server supported BEXs
wTLD 0x0003: LongWord, maximal client BEXs data length
- Login success (see "After login actions")
------------------------------------------------------------------------------------------------
4.1.3 After login actions:
After successful login, client have to request all server BEX types parameters,
because they can change while client was offline. Server supported BEXs was
sent to client inside OBIMP_BEX_COM_SRV_LOGIN_REPLY.
1. Request parameters for all server supported BEX types one by one excluding
OBIMP_BEX_COM type as far as it is basic BEX type:
- OBIMP_BEX_[SERVER_SUPPORTED_BEX_TYPE]_CLI_PARAMS
For example:
- OBIMP_BEX_CL_CLI_PARAMS
- OBIMP_BEX_PRES_CLI_PARAMS
- OBIMP_BEX_IM_CLI_PARAMS
- OBIMP_BEX_UD_CLI_PARAMS
- OBIMP_BEX_UA_CLI_PARAMS
2. Before notify contacts about client presence info, client have to set own
capabilities. Client always can change this info during session.
- OBIMP_BEX_PRES_CLI_SET_CAPS
3. Request server side contact list or verify existing local copy with server's copy.
a) If there is no local copy of the server side contact list then request it from server:
- OBIMP_BEX_CL_CLI_REQUEST
- OBIMP_BEX_CL_SRV_REPLY
b) If there is local copy of the server side contact list then verify contact list's blob
by calculating its MD5 hash with MD5 hash sent by server in the reply:
- OBIMP_BEX_CL_CLI_VERIFY
- OBIMP_BEX_CL_SRV_VERIFY_REPLY
4. Continue only after successful receiving or verifying server side contact list, set
client's presence status and status picture number with description:
- OBIMP_BEX_PRES_CLI_SET_STATUS
5. Finally activate presence status broadcasting. Now client is ready for messaging.
- OBIMP_BEX_PRES_CLI_ACTIVATE
6. Request client's account details if needed:
- OBIMP_BEX_UD_CLI_DETAILS_REQ
------------------------------------------------------------------------------------------------
4.1.4 Requesting offline messages:
Offline messages can be requested after sending OBIMP_BEX_PRES_CLI_ACTIVATE.
OBIMP_BEX_IM_CLI_PARAMS has offline messages awaiting wTLD. If there are offline
messages then request them:
- OBIMP_BEX_IM_CLI_REQ_OFFLINE
Server will send all available offline messages one by one marked with offline
message wTLDs:
- OBIMP_BEX_IM_SRV_MESSAGE
After sending all offline messages server will notify client by following BEX:
- OBIMP_BEX_IM_SRV_DONE_OFFLINE
If client received all offline messages then it have to request offline messages
deletion else server will send them on next request:
- OBIMP_BEX_IM_CLI_DEL_OFFLINE
------------------------------------------------------------------------------------------------
4.1.5 Requesting offline authorization requests, replies, revokes:
Offline authorization messages can be requested after sending
OBIMP_BEX_PRES_CLI_ACTIVATE. OBIMP_BEX_CL_CLI_PARAMS has offline
authorization messages awaiting wTLD. If there are offline authorization messages
then request them:
- OBIMP_BEX_CL_CLI_REQ_OFFAUTH
Server will send all available offline authorization messages one by one marked
with offline authorization message wTLDs:
- OBIMP_BEX_CL_CLI_SRV_AUTH_REQUEST
or
- OBIMP_BEX_CL_CLI_SRV_AUTH_REPLY
or
- OBIMP_BEX_CL_CLI_SRV_AUTH_REVOKE
After sending all offline authorization messages server will notify client by
following BEX:
- OBIMP_BEX_CL_SRV_DONE_OFFAUTH
If client received all offline authorization messages then it have to request offline
authorization messages deletion else server will send them on next request:
- OBIMP_BEX_CL_CLI_DEL_OFFAUTH
=====================================================
4.2 Administrative BEX types sequences
=====================================================
4.2.1 Logging in:
- Client connects to administrative server
- OBIMP_BEX_WADM_CLI_LOGIN
wTLD 0x0001: BLK, current server administrative key
- OBIMP_BEX_WADM_SRV_LOGIN_REPLY
wTLD 0x0001: Word, administrative result code
a) If was sent bad server key
- Client disconnects
b) If was sent correct server key then request all server parameters
- OBIMP_BEX_WADM_CLI_PARAMS
- OBIMP_BEX_WADM_SRV_PARAMS_REPLY
------------------------------------------------------------------------------------------------
**********************************************************************************
5. Country and language codes
Available country codes:
1 Afghanistan
2 Albania
3 Antarctica
4 Algeria
5 American Samoa
6 Andorra
7 Angola
8 Antigua and Barbuda
9 Azerbaijan
10 Argentina
11 Australia
12 Austria
13 Bahamas
14 Bahrain
15 Bangladesh
16 Armenia
17 Barbados
18 Belgium
19 Bermuda
20 Bhutan
21 Bolivia
22 Bosnia and Herzegovina
23 Botswana
24 Bouvet Island
25 Brazil
26 Belize
27 British Indian Ocean Territory
28 Solomon Islands
29 Virgin Islands, British
30 Brunei Darussalam
31 Bulgaria
32 Myanmar
33 Burundi
34 Belarus
35 Cambodia
36 Cameroon
37 Canada
38 Cape Verde
39 Cayman Islands
40 Central African Republic
41 Sri Lanka
42 Chad
43 Chile
44 China
45 Taiwan, Province of China
46 Christmas Island
47 Cocos (Keeling) Islands
48 Colombia
49 Comoros
50 Mayotte
51 Congo
52 Congo, Democratic Republic of the
53 Cook Islands
54 Costa Rica
55 Croatia
56 Cuba
57 Cyprus
58 Czech Republic
59 Benin
60 Denmark
61 Dominica
62 Dominican Republic
63 Ecuador
64 El Salvador
65 Equatorial Guinea
66 Ethiopia
67 Eritrea
68 Estonia
69 Faroe Islands
70 Falkland Islands (Malvinas)
71 South Georgia and the South Sandwich Islands
72 Fiji
73 Finland
74 Aland Islands
75 France
76 French Guiana
77 French Polynesia
78 French Southern Territories
79 Djibouti
80 Gabon
81 Georgia
82 Gambia
83 Palestinian Territory, Occupied
84 Germany
85 Ghana
86 Gibraltar
87 Kiribati
88 Greece
89 Greenland
90 Grenada
91 Guadeloupe
92 Guam
93 Guatemala
94 Guinea
95 Guyana
96 Haiti
97 Heard Island and McDonald Islands
98 Holy See (Vatican City State)
99 Honduras
100 Hong Kong
101 Hungary
102 Iceland
103 India
104 Indonesia
105 Iran, Islamic Republic of
106 Iraq
107 Ireland
108 Israel
109 Italy
110 Cote d'Ivoire
111 Jamaica
112 Japan
113 Kazakhstan
114 Jordan
115 Kenya
116 Korea, Democratic People's Republic of
117 Korea, Republic of
118 Kuwait
119 Kyrgyzstan
120 Lao People's Democratic Republic
121 Lebanon
122 Lesotho
123 Latvia
124 Liberia
125 Libyan Arab Jamahiriya
126 Liechtenstein
127 Lithuania
128 Luxembourg
129 Macao
130 Madagascar
131 Malawi
132 Malaysia
133 Maldives
134 Mali
135 Malta
136 Martinique
137 Mauritania
138 Mauritius
139 Mexico
140 Monaco
141 Mongolia
142 Moldova, Republic of
143 Montenegro
144 Montserrat
145 Morocco
146 Mozambique
147 Oman
148 Namibia
149 Nauru
150 Nepal
151 Netherlands
152 Netherlands Antilles
153 Aruba
154 New Caledonia
155 Vanuatu
156 New Zealand
157 Nicaragua
158 Niger
159 Nigeria
160 Niue
161 Norfolk Island
162 Norway
163 Northern Mariana Islands
164 United States Minor Outlying Islands
165 Micronesia, Federated States of
166 Marshall Islands
167 Palau
168 Pakistan
169 Panama
170 Papua New Guinea
171 Paraguay
172 Peru
173 Philippines
174 Pitcairn
175 Poland
176 Portugal
177 Guinea-Bissau
178 Timor-Leste
179 Puerto Rico
180 Qatar
181 Reunion
182 Romania
183 Russian Federation
184 Rwanda
185 Saint Barthelemy
186 Saint Helena
187 Saint Kitts and Nevis
188 Anguilla
189 Saint Lucia
190 Saint Martin (French part)
191 Saint Pierre and Miquelon
192 Saint Vincent and the Grenadines
193 San Marino
194 Sao Tome and Principe
195 Saudi Arabia
196 Senegal
197 Serbia
198 Seychelles
199 Sierra Leone
200 Singapore
201 Slovakia
202 Viet Nam
203 Slovenia
204 Somalia
205 South Africa
206 Zimbabwe
207 Spain
208 Western Sahara
209 Sudan
210 Suriname
211 Svalbard and Jan Mayen
212 Swaziland
213 Sweden
214 Switzerland
215 Syrian Arab Republic
216 Tajikistan
217 Thailand
218 Togo
219 Tokelau
220 Tonga
221 Trinidad and Tobago
222 United Arab Emirates
223 Tunisia
224 Turkey
225 Turkmenistan
226 Turks and Caicos Islands
227 Tuvalu
228 Uganda
229 Ukraine
230 Macedonia, the former Yugoslav Republic of
231 Egypt
232 United Kingdom
233 Guernsey
234 Jersey
235 Isle of Man
236 Tanzania, United Republic of
237 United States
238 Virgin Islands, U.S.
239 Burkina Faso
240 Uruguay
241 Uzbekistan
242 Venezuela, Bolivarian Republic of
243 Wallis and Futuna
244 Samoa
245 Yemen
246 Zambia
Available language codes:
1 Afrikaans
2 Albanian
3 Arabic
4 Armenian
5 Azerbaijani
6 Belorussian
7 Bhojpuri
8 Bosnian
9 Bulgarian
10 Burmese
11 Cantonese
12 Catalan
13 Chamorro
14 Chinese
15 Croatian
16 Czech
17 Danish
18 Dutch
19 English
20 Esperanto
21 Estonian
22 Farsi
23 Finnish
24 French
25 Gaelic
26 German
27 Greek
28 Gujarati
29 Hebrew
30 Hindi
31 Hungarian
32 Icelandic
33 Indonesian
34 Italian
35 Japanese
36 Khmer
37 Korean
38 Kurdish
39 Lao
40 Latvian
41 Lithuanian
42 Macedonian
43 Malay
44 Mandarin
45 Mongolian
46 Norwegian
47 Persian
48 Polish
49 Portuguese
50 Punjabi
51 Romanian
52 Russian
53 Serbian
54 Sindhi
55 Slovak
56 Slovenian
57 Somali
58 Spanish
59 Swahili
60 Swedish
61 Tagalog
62 Taiwanese
63 Tamil
64 Tatar
65 Thai
66 Turkish
67 Ukrainian
68 Urdu
69 Vietnamese
70 Welsh
71 Yiddish
72 Yoruba