1. Abstract

These are the official extensions to ADC. This document is based on the information contained in the ADC wiki - spefications from there are moved here when they are mature and stable enough.

2. Version history

The latest draft of the next version of this document as well as intermediate and older versions can be downloaded from $URL: https://adc.svn.sourceforge.net/svnroot/adc/trunk/ADC-EXT.txt $.

This version corresponds to $Revision: 12 $.

2.1. Version 1.0

  • Initial release created from original ADC 1.0 text

  • Added PING extension

2.2. Version 1.0.1

  • Added TS as additional MSG parameter

  • Added DFAV

2.3. Version 1.0.2

  • Added UCMD extension

3. Extensions

3.1. TIGR - Tiger tree hash support

3.1.1. General

This extension adds Tiger tree hash support to the base protocol. It is intended to be used both for identifying files and for purposes such as CID generation and password negotiation

3.1.2. TIGR for shared files

All files shared by TIGR supporting clients must have been hashed using Merkle Hash trees, as defined by http://www.open-content.net/specs/draft-jchapweske-thex-02.html. The Tiger algorithm, as specified by http://www.cs.technion.ac.il/~biham/Reports/Tiger/, functions as the hash algorithm. A base segment size of 1024 bytes must be used when generating the tree, but clients may then discard parts of the tree as long as at least 7 levels are kept or a block granularity of 64 KiB is achieved.

Generally, the root of the tree (TTH) serves to identify a file uniquely. Searches use it and it must be present in the file list. Further, the root of the file list must also be available and discoverable via GFI. A client may also request the rest of the tree using the normal client-client transfer procedure. The root must be encoded using base32 encoding when converted to text.

In the file list, each File element carries an additional attribute "TTH" containing the base32-encoded value of the Tiger tree root.

In the GET/GFI type, the full tree may be accessed using the "tthl" type.

"tthl" transfers send the largest set of leaves available) as a binary stream of leaf data, right-to-left, with no spacing in between them. <start_pos> must be set to 0 and <bytes> to -1 when requesting the data. <bytes> must contain the total binary size of the leaf stream in SND; by dividing this length by the individual hash length, the number of leaves, and thus the leaf level, can be deducted. The received leaves can then be used to reconstruct the entire tree, and the resulting root must match the root of the file (this verifies the integrity of the tree itself). Identifier must be a TTH root value from the "TTH/" root.

In the GET/GFI namespace, files are identified by "TTH/<base32-encoded tree root>".

In SCH and GFI, the following attributes are added:

TR Tiger tree Hash root, encoded with base32.
TD Tree depth, index of the highest level of tree data available, root-only = 0, first level (2 leaves) = 1, second level = 2, etc…

3.2. BZIP - File list compressed with bzip2

This extension adds a special file "files.xml.bz2" in the unnamed root of the share which contains "files.xml" compressed with bzip2 1.0.3+ (www.bzip.org).

3.3. ZLIB - Compressed communication

There are two variants of zlib support, FULL and GET, and only one should be used on a each communications channel set up.

3.3.1. ZLIB-FULL

If, during SUP negotiation, a peer sends "ZLIF" in its support string, it must accept two additional commands, ZON and ZOF. Upon reception of ZON the peer must start decompressing the incoming stream of data with zlib before interpreting it, and stop doing so after ZOF is received (in the compressed stream). The compressing end must partially flush the zlib buffer after each chunk of data to allow for decompression by the peer.

3.3.2. ZLIB-GET

The alternative is to send "ZLIG" to indicate that zlib is supported for binary transfers using the GET command, but not otherwise. A flag "ZL1" is added to the to the SND command to indicate that the data will come compressed, and the client receiving requests it by adding the same flag to GET (the sending client may ignore a request for a compressed transfer, but may also use it even when not requested by the receiver). The <bytes> parameter of the GET and SND commands is to be interpreted as the number of uncompressed bytes to be transferred.

3.4. PING - Pinger extension

Added 2008-03-14, based on ADC 1.0

This extension can be supported by both clients and hubs, and when present, if hub supports it, it must send additional information to the client ( otherwise normal base client).

It’s purpose is to send to hublist pingers additional information about the hub that otherwise it would be impossible to get as a normal user (eg. minimum share, maximum user count, etc).

3.4.1. INF

Contexts : F

When the client supporting the PING extension connects, the hub must send its normal INF along with the following added fields ( none mandatory, if not present, it means hub has no restrictions in that matter, or non existent):

Code Type Description
HH string Hub Host address ( DNS or IP )
WS url Hub Website
NE string Hub Network
OW string Hub Owner name
UC integer Current User count
SS integer Total share size
SF integer Total files shared
MS integer Minimum share required to enter hub ( bytes )
XS integer Maximum share for entering hub ( bytes )
ML integer Minimum slots required to enter hub
XL integer Maximum slots for entering hub
MU integer Minimum hubs connected where clients can be users
MR integer Minimum hubs connected where client can be registered
MO integer Minimum hubs connected where client can be operators
XU integer Maximum hubs connected where clients can be users
XR integer Maximum hubs connected where client can be registered
XO integer Maximum hubs connected where client can be operators
MC integer Maximum possible clients ( users ) who can connect
UP integer Hub uptime (seconds)
NI string Hub name (from BASE)
DE string Hub description (from BASE)
VE string Hub software version (from BASE)

The hub must continue to send the user list as for a normal user (move to NORMAL state). The pinger may decide to go through or disconnect (eg. if it doesn’t require additional information about the users).

Example
 -pinger- HSUP ADBASE ADPING AD..
 -hub- ISUP ADBASE ADPING AD..
 -hub- ISID ..
 -hub- IINF NIhubname DEcurrent\stopic VE.. HHmyhub.no-ip.org:555 WShttp://myhub.no-ip.org/ OWmyname UC2231 SS.. SF.. MS0 ML0 MC5000
 - (pinger may disconnect)
 -..

3.4.2. Hub - Hublist communication

The same extension goes for hub- hublist communication. This way, the hub takes the role of the client and the hublist of the server.

The hublist may send INF about itself with NI field which would become hublist name and WS hublist web address.

Example
 -hub- HSUP ADBASE ADPING AD..
 -hublist- ISUP ADBASE ADPING AD..
 -hublist- IINF NIhublist_name WShublist_address
 -hub- HINF  NIhubname DEcurrent\stopic VE.. HHmyhub.no-ip.org:555 WShttp://myhub.no-ip.org/ OWmyname UC2231 SS.. SF.. MS0 ML0 MC5000
 -( disconnect )

3.5. TS - Timestamp in MSG

Timestamp of the moment when the message was sent, expressed in seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).

3.6. DFAV - Distributed Favorites

The idea behind this extension is to generate a public hublist from the users favorite hublist. Implementations should separate between public and private hubs in the favorite hublist of an user, in order not to distribute private hubs where one can not connect to anyway.

3.6.1. GFA

Contexts: T, C

Asks all users within the same hub with the correct feature to send all publicly available hubs, in their favorite hub list to the requesting client.

3.6.2. RFA

Contexts: C

Response of a client.

HA | Hub address

LG | Last succesfull login time ( number of seconds since the epoch (1970), (UTC) )

All INF fields from BASE are inherited. All INF fields from PING extension are inherited.

3.7. UCMD

CMD name

Contexts: F

States: NORMAL

User commands are used to send hub-specific commands to the client which provide useful shortcuts for the user. These commands contain strings which must be sent back to the hub and keyword substitutions in the strings. Each user command has a display name, a string to be sent to the hub, and one or more categories where it may appear. The strings passed to the hub must first be passed through a dictionary replacement that replaces all keywords in the string and then through the equivalent of the C standard function "strftime", with the current time.

Name uniquely (per hub) identifies a particular user command. The name may contain "/" to indicate a logical structure on the viewing client, where each "/" introduces a new submenu level. Other than name, the command also has a number of flags that further detail what to do with it.

RM 1 = Remove Command
CT Message Category, 1 = Hub command, client parameters only, 2 = User list command, client and user parameters, 4 = Search result command, client, user and file parameters, 8 = File list command, client, user and file parameters. Multiple types are specified by adding the numbers together.
TT The full text to be sent to hub, including FOURCC, parameters and keywords.
CO 1 = Constrained, when sending this command on multiple users (for example in search results), constrain it to once per CID only
SP 1 = Insert separator instead of command name (name must still be present to uniquely identify the command).

3.7.1. Keywords

Keywords are specified using "%[keyword]". Unknown keywords must be replaced by the empty string. Additionally, all %-substitutions of the C function "strftime" must be supported.

The following tables specify the keywords that must be supported.

Client parameters

myCID Client CID
mySID ClientSID
myXX One for each flag on that particular hub; for example, myI4 and myNI

User parameters

userCID User CID
userSID User SID
userXX One for each flag on the user sent; for example, userI4 and userNI

File parameters

fileXX One for each flag contained within a search result or file list entry (see RES)

Hub parameters

hubXX One for each flag of the hub; for example, hubNI and hubVE

The following tables specify the keywords that are optional.

User parameters

line:info Prompts the user for input where info is the displayed text description for the user input

3.7.2. Example

ICMD ADCH++/Hub\smanagement/Register\snick TTHMSG\s+regnick\s%[userNI]\s%[line:Password\s(leave\sempty\sto\sun-reg)]\s%[line:Level\s(facultative;\sdefaults\sto\syour\sown\slevel\sminus\sone)]\n CT2
ICMD ADCH++/Hub\smanagement/Reload\sbans TTHMSG\s+loadbans\n CT3
ICMD ADCH++/Hub\smanagement/Reload\sscripts TTHMSG\s+reload\n CT3
ICMD ADCH++/Info TTHMSG\s+info\s%[userNI]\n CT2
ICMD ADCH++/Info TTHMSG\s+info\n CT1