JEP-0008: User Avatars in Jabber

A proposal for avatars in Jabber.


WARNING: This JEP has been retracted by the author(s). Implementation of the protocol described herein is not recommended. Developers desiring similar functionality should implement the protocol that supersedes this one (if any).


JEP Information

Status: Retracted
Type: Standards Track
Number: 0008
Version: 0.2
Last Updated: 2003-05-06
JIG: Standards JIG
Approving Body: Jabber Council
Dependencies: None
Supersedes: None
Superseded By: None
Short Name: None

Author Information

Thomas Muldowney

Email: temas@jabber.org
JID: temas@jabber.org

Julian Missig

Email: julian@jabber.org
JID: julian@jabber.org

Jens Alfke

Email: jens@mac.com

Peter Millard

Email: me@pgmillard.com
JID: pgmillard@jabber.org

Legal Notice

This Jabber Enhancement Proposal is copyright 1999 - 2004 by the Jabber Software Foundation (JSF) and is in full conformance with the JSF's Intellectual Property Rights Policy <http://www.jabber.org/jsf/ipr-policy.php>. This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at <http://www.opencontent.org/openpub/>).

Discussion Venue

The preferred venue for discussion of this document is the Standards-JIG discussion list: <http://mail.jabber.org/mailman/listinfo/standards-jig>.

Relation to XMPP

The Extensible Messaging and Presence Protocol (XMPP) is defined in the XMPP Core and XMPP IM specifications contributed by the Jabber Software Foundation to the Internet Standards Process, which is managed by the Internet Engineering Task Force in accordance with RFC 2026. Any protocols defined in this JEP have been developed outside the Internet Standards Process and are to be understood as extensions to XMPP rather than as an evolution, development, or modification of XMPP itself.

Conformance Terms

The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.


Table of Contents

1. Introduction
2. Image Requirements
3. Avatar Availability
4. Avatar Retrieval
5. Future Considerations
Notes
Revision History


1. Introduction

Many communication applications now allow for the association of a small image or buddy icon (avatar) with a user of that application. The avatar is not intended to be a defining portrait of the user, but rather a simple expression of the user's appearance, mood, status, and the like. This proposal outlines a way to incorporate avatars into the current Jabber platform.

2. Image Requirements

Certain restrictions are placed upon the image. First, the image height and width must be between thirty-two (32) and sixty-four (64) pixels. The suggested size is sixty-four (64) pixels high and sixty-four (64) pixels wide [1]. Images should be square, but this is not required. Images should be in GIF, JPEG, or PNG format, although it is possible that in future revisions of this spec more formats will be allowed. Finally, images must use less than eight (8) kilobytes of data.

3. Avatar Availability

There are two methods of showing that a client has an avatar available:

  1. Embedding the jabber:x:avatar namespace within <presence/> packets using Jabber's <x/> element
  2. Displaying the jabber:iq:avatar namespace in browse requests

Partly because Jabber browsing is relatively undeveloped, this proposal focuses on the first option.

The <x/> element in the jabber:x:avatar namespace contains a SHA1 hash (hexadecimal, not base64) of the image data in a <hash/> element. (Because the odds of creating an identical hash are small, the hash is considered unique to the image and can be used to cache images between client sessions, resulting in fewer requests for the image.) The initial announcement of the availability of an avatar is done by sending a presence packet with the jabber:x:avatar information, as follows:

Example 1.

<presence>
  <x xmlns='jabber:x:avatar'>
    <hash>SHA1 of image data</hash>
  </x>
</presence>
  

If the avatar-generating user changes the avatar, a new presence packet is sent out with the updated information:

Example 2.

<presence>
  <x xmlns='jabber:x:avatar'>
    <hash>SHA1 of new image data</hash>
  </x>
</presence>
  

To disable the avatar, the avatar-generating user's client will send a presence packet with the jabber:x:avatar namespace but with no hash information:

Example 3.

<presence>
  <x xmlns='jabber:x:avatar'/>
</presence>
  

Clients should send the current avatar hash in every <presence/> packet even if the avatar has not changed. Remember that other clients logging in will receive a copy of the most recent <presence/> element, which should therefore always contain the most recent avatar hash. However, if the client's connection is lost unexpectedly or the client disconnects without sending an unavailable presence, the server will send other clients a <presence/> element containing no jabber:x:avatar extension. Therefore if, after receiving one or more presence packets containing jabber:x:avatar information, an avatar-receiving client receives a presence packet that does not include the jabber:x:avatar namespace, it is recommended that the client save the avatar image until the next set of information is received. In this case the avatar-generating client might send something as simple as the following:

Example 4.

<presence/>
  

4. Avatar Retrieval

There are two methods for retrieving the actual avatar data:

  1. An exchange between clients of <iq/> elements in the jabber:iq:avatar namespace
  2. Public XML storage from the avatar-generating client to the server and public XML retrieval from the server to the avatar-requesting client [2]

The first of these methods is preferred. On this model, a query is sent directly to the avatar-generating client using an <iq/> element of type "get" in the jabber:iq:avatar namespace [3] [4]:

Example 5.

<iq id='2' type='get' to='user@server/resource'>
  <query xmlns='jabber:iq:avatar'/>
</iq>
  

The avatar-generating client will reply with an <iq/> element of type "result" in the jabber:iq:avatar namespace; this reply will contain a query element that in turn contains a <data/> element with the MIME type in the 'mimetype' attribute and the data base64-encoded in the body of the <data/> element:

Example 6.

<iq id='2' type='result' to='user@server/resource'>
  <query xmlns='jabber:iq:avatar'>
    <data mimetype='image/jpeg'>
      Base64-Encoded Data
    </data>
  </query>
</iq>
  

If the first method fails, the second method that should be attempted by sending a request to the server for the avatar-generating user's public XML containing the avatar data. This data is to be stored in the storage:client:avatar namespace. This method presumes that the avatar-generating client has already stored its avatar data on the server:

Example 7.

<iq id='0' type='set' to='user@server'>
  <query xmlns='storage:client:avatar'>
    <data mimetype='image/jpeg'>
      Base64 Encoded Data
    </data>
  </query>
</iq>
  

Once such data has been set, the avatar can be retrieved by any requesting client from the avatar-generating client's public XML storage:

Example 8.

<iq id='1' type='get' to='user@server'>
  <query xmlns='storage:client:avatar'/>
</iq>
  

5. Future Considerations

It is acknowledged that sending avatar information within presence packets is less than desirable in many respects (e.g., in network traffic generated); however, there currently exists in Jabber no generic framework for addressing these shortcomings. Possible solutions on the horizon include live browsing and a pub/sub model, but these are still embryonic and experimental. Once something of that nature is accepted by the Council, the avatar spec will be modified to work within that framework rather than by attaching to presence.


Notes

1. It is highly recommended that clients never scale up images when displaying them.

2. Refer to the Generic XML Namespace Storage draft protocol.

3. Whenever possible, the avatar-requesting client should attempt to determine if the avatar-generating client has an avatar available before requesting it.

4. It is suggested that no request be made if it is known (such as through a browse reply) that a client does not support the jabber:iq:avatar namespace.


Revision History

Version 0.2 (2003-05-06)

At the request of the authors, the status of this JEP has been changed to Retracted, to be superseded by a forthcoming JEP. This JEP will not be considered further by the Jabber Software Foundation and should not be used as a basis for implementations. (psa)

Version 0.1 (2001-09-14)

Initial release (tm)


END