Browse Source

Initial revision


git-svn-id: file:///home/ksmith/gitmigration/svn/xmpp/trunk@2 4b5297f7-1745-476d-ba37-a9c6900126ab
xep-0352-v0.2
Peter Saint-Andre 13 years ago
commit
2ac91f50c8
100 changed files with 45317 additions and 0 deletions
  1. 31
    0
      all.sh
  2. 187
    0
      announce.py
  3. 9
    0
      archive.sh
  4. 143
    0
      deferred.py
  5. 21
    0
      editor.shtml
  6. 399
    0
      fo.xsl
  7. 12
    0
      gen.sh
  8. BIN
      gps_datum.gif
  9. 24
    0
      gps_datum.html
  10. 29
    0
      index.shtml
  11. 121
    0
      inxep.py
  12. 91
    0
      ipr-policy.shtml
  13. 146
    0
      lastcall.py
  14. 73
    0
      protopage.xsl
  15. 122
    0
      ref.xsl
  16. 15
    0
      submit.shtml
  17. 688
    0
      xep-0001.xml
  18. 42
    0
      xep-0002.xml
  19. 347
    0
      xep-0003.xml
  20. 709
    0
      xep-0004.xml
  21. 108
    0
      xep-0005.xml
  22. 96
    0
      xep-0006.xml
  23. 73
    0
      xep-0007.xml
  24. 138
    0
      xep-0008.xml
  25. 316
    0
      xep-0009.xml
  26. 55
    0
      xep-0010.xml
  27. 483
    0
      xep-0011.xml
  28. 159
    0
      xep-0012.xml
  29. 447
    0
      xep-0013.xml
  30. 70
    0
      xep-0014.xml
  31. 258
    0
      xep-0015.xml
  32. 236
    0
      xep-0016.xml
  33. 83
    0
      xep-0017.xml
  34. 135
    0
      xep-0018.xml
  35. 81
    0
      xep-0019.xml
  36. 296
    0
      xep-0020.xml
  37. 343
    0
      xep-0021.xml
  38. 321
    0
      xep-0022.xml
  39. 175
    0
      xep-0023.xml
  40. 1132
    0
      xep-0024.xml
  41. 386
    0
      xep-0025.xml
  42. 209
    0
      xep-0026.xml
  43. 183
    0
      xep-0027.xml
  44. 13
    0
      xep-0028.xml
  45. 117
    0
      xep-0029.xml
  46. 1032
    0
      xep-0030.xml
  47. 2328
    0
      xep-0031.xml
  48. 158
    0
      xep-0032.xml
  49. 667
    0
      xep-0033.xml
  50. 249
    0
      xep-0034.xml
  51. 129
    0
      xep-0035.xml
  52. 126
    0
      xep-0036.xml
  53. 848
    0
      xep-0037.xml
  54. 365
    0
      xep-0038.xml
  55. 426
    0
      xep-0039.xml
  56. 270
    0
      xep-0040.xml
  57. 266
    0
      xep-0041.xml
  58. 1075
    0
      xep-0042.xml
  59. 793
    0
      xep-0043.xml
  60. 172
    0
      xep-0044.xml
  61. 5206
    0
      xep-0045.xml
  62. 216
    0
      xep-0046.xml
  63. 291
    0
      xep-0047.xml
  64. 171
    0
      xep-0048.xml
  65. 252
    0
      xep-0049.xml
  66. 983
    0
      xep-0050.xml
  67. 272
    0
      xep-0051.xml
  68. 387
    0
      xep-0052.xml
  69. 86
    0
      xep-0053.xml
  70. 524
    0
      xep-0054.xml
  71. 327
    0
      xep-0055.xml
  72. 181
    0
      xep-0056.xml
  73. 182
    0
      xep-0057.xml
  74. 173
    0
      xep-0058.xml
  75. 561
    0
      xep-0059.xml
  76. 6429
    0
      xep-0060.xml
  77. 83
    0
      xep-0061.xml
  78. 347
    0
      xep-0062.xml
  79. 107
    0
      xep-0063.xml
  80. 78
    0
      xep-0064.xml
  81. 827
    0
      xep-0065.xml
  82. 294
    0
      xep-0066.xml
  83. 200
    0
      xep-0067.xml
  84. 374
    0
      xep-0068.xml
  85. 51
    0
      xep-0069.xml
  86. 385
    0
      xep-0070.xml
  87. 1178
    0
      xep-0071.xml
  88. 1204
    0
      xep-0072.xml
  89. 160
    0
      xep-0073.xml
  90. 169
    0
      xep-0074.xml
  91. 1821
    0
      xep-0075.xml
  92. 95
    0
      xep-0076.xml
  93. 900
    0
      xep-0077.xml
  94. 369
    0
      xep-0078.xml
  95. 1310
    0
      xep-0079.xml
  96. 524
    0
      xep-0080.xml
  97. 270
    0
      xep-0081.xml
  98. 150
    0
      xep-0082.xml
  99. 154
    0
      xep-0083.xml
  100. 0
    0
      xep-0084.xml

+ 31
- 0
all.sh View File

@@ -0,0 +1,31 @@
#!/bin/sh
# for each XEP, generates HTML file and IETF reference, then copies XML file
# also generates HTML for the README and template
# finally, copies the stylesheet, DTD, and schema
# usage: ./all.sh

xeppath=/var/www/stage.xmpp.org/extensions

ls xep-0*.xml > tmp.txt
sed s/xep-\(.*\).xml/\1/ tmp.txt > nums.txt
rm tmp.txt

while read f
do
xsltproc xep.xsl xep-$f.xml > $xeppath/xep-$f.html
xsltproc ref.xsl xep-$f.xml > $xeppath/refs/reference.JSF.XEP-$f.xml
cp xep-$f.xml $xeppath/
done < nums.txt

rm nums.txt

xsltproc xep.xsl xep-README.xml > $xeppath/README.html
xsltproc xep.xsl xep-template.xml > $xeppath/template.html

cp xep.dtd $xeppath/
cp xep.ent $xeppath/
cp xep.xsd $xeppath/
cp xep.xsl $xeppath/

# END


+ 187
- 0
announce.py View File

@@ -0,0 +1,187 @@
#!/usr/bin/env python

# File: announce.py
# Version: 0.8
# Description: a script for announcing XEPs
# Last Modified: 2006-10-03
# Author: Peter Saint-Andre (stpeter@jabber.org)
# License: public domain
# HowTo: ./announce.py xepnum dbuser dbpw 'cvsmodsurl'
# NOTE: the cvsmodsurl MUST be in quotes!

# IMPORTS:
#
import glob
import MySQLdb
import os
from select import select
import smtplib
import socket
from string import split,strip,join,find
import sys
import time
from xml.dom.minidom import parse,parseString,Document

def getText(nodelist):
thisText = ""
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
thisText = thisText + node.data
return thisText

# get the seconds in the Unix era
now = int(time.time())

# READ IN ARGS:
#
# 1. XEP number
# 2. database user
# 3. database password

xepnum = sys.argv[1];
dbuser = sys.argv[2];
dbpw = sys.argv[3];
mods = sys.argv[4];

xepfile = 'xep-' + xepnum + '.xml'

# PARSE XEP HEADERS:
#
# - title
# - abstract
# - version
# - date
# - initials
# - remark

thexep = parse(xepfile)
xepNode = (thexep.getElementsByTagName("xep")[0])
headerNode = (xepNode.getElementsByTagName("header")[0])
titleNode = (headerNode.getElementsByTagName("title")[0])
title = getText(titleNode.childNodes)
abstractNode = (headerNode.getElementsByTagName("abstract")[0])
abstract = getText(abstractNode.childNodes)
statusNode = (headerNode.getElementsByTagName("status")[0])
xepstatus = getText(statusNode.childNodes)
typeNode = (headerNode.getElementsByTagName("type")[0])
xeptype = getText(typeNode.childNodes)
revNode = (headerNode.getElementsByTagName("revision")[0])
versionNode = (revNode.getElementsByTagName("version")[0])
version = getText(versionNode.childNodes)
dateNode = (revNode.getElementsByTagName("date")[0])
date = getText(dateNode.childNodes)
initialsNode = (revNode.getElementsByTagName("initials")[0])
initials = getText(initialsNode.childNodes)
remNode = (revNode.getElementsByTagName("remark")[0])
# could be <p> or <ul>
testRemarkNode = remNode.firstChild.nodeName
# print testRemarkNode
if (testRemarkNode == "p"):
remarkNode = (remNode.getElementsByTagName("p")[0])
remark = getText(remarkNode.childNodes)
else:
remark = "[See revision history]"

# what kind of action are we taking?
xepflag = ""
if (version == "0.1"):
xepflag = "new"
elif ((version == "1.0") & (xeptype == "Standards Track")):
xepflag = "draft"
elif ((version == "1.0") & (xeptype != "Standards Track")):
xepflag = "active"
elif (version == "2.0"):
xepflag = "final"
elif (xepstatus == "Retracted"):
xepflag = "retract"
elif (xepstatus == "Deferred"):
xepflag = "defer"

# UPDATE DATABASE:
#
# number is $xepnum
# name is $title
# type is $xeptype
# status is $xepstatus
# notes is "Version $version of XEP-$xepnum released $date."
# version is $version
# last_modified is $now
# abstract is $abstract
# changelog is "$remark ($initials)"

db = MySQLdb.connect("localhost", dbuser, dbpw, "foundation")
cursor = db.cursor()
theNotes = "Version " + version + " of XEP-" + xepnum + " released " + date + "."
theLog = remark + " (" + initials + ")"
if xepflag == "new":
theStatement = "INSERT INTO jeps VALUES ('" + str(xepnum) + "', '" + title + "', '" + xeptype + "', '" + xepstatus + "', '" + theNotes + "', '" + str(version) + "', '" + str(now) + "', '" + abstract + "', '" + theLog + "', '0', '5', 'Proposed', 'none');"
cursor.execute(theStatement)
else:
theStatement = "UPDATE jeps SET name='" + title + "', type='" + xeptype + "', status='" + xepstatus + "', notes='" + theNotes + "', version='" + str(version) + "', last_modified='" + str(now) + "', abstract='" + abstract + "', changelog='" + theLog + "' WHERE number='" + str(xepnum) + "';"
cursor.execute(theStatement)
result = cursor.fetchall()

## SEND MAIL:
#
# From: editor@jabber.org
# To: standards-jig@jabber.org
# Subject: UPDATED: XEP-$xepnum ($title)
# [or "NEW..." if version 0.1]
# Body:
# Version $version of XEP-$xepnum ($title) is now available.
# Abstract: $abstract
# Changelog: $remark ($initials)
# CVS Diff: $mods
# URL: http://www.xmpp.org/extensions/xep-$xepnum.html

fromaddr = "editor@jabber.org"
# for testing...
# toaddrs = "stpeter@jabber.org"
# for real...
toaddrs = "standards-jig@jabber.org"

if xepflag == "new":
thesubject = 'NEW: XEP-'
elif xepflag == "draft":
thesubject = 'DRAFT: XEP-'
toaddrs = toaddrs + ", jdev@jabber.org"
elif xepflag == "final":
thesubject = 'FINAL: XEP-'
toaddrs = toaddrs + ", jdev@jabber.org"
elif xepflag == "active":
thesubject = 'ACTIVE: XEP-'
elif xepflag == "retract":
thesubject = 'RETRACTED: XEP-'
elif xepflag == "defer":
thesubject = 'DEFERRED: XEP-'
else:
thesubject = 'UPDATED: XEP-'
thesubject = thesubject + xepnum + ' (' + title + ')'

versionline = 'Version ' + version + ' of XEP-' + xepnum + ' (' + title + ') has been released.'
abstractline = 'Abstract: ' + abstract
changelogline = 'Changelog: ' + remark + ' (' + initials + ')'
modsline = 'CVS Diff: ' + mods
urlline = 'URL: http://www.xmpp.org/extensions/xep-' + xepnum + '.html'

msg = "From: XMPP Extensions Editor <%s>\r\n" % fromaddr
msg = msg + "To: %s\r\n" % toaddrs
msg = msg + "Subject: %s\r\n" % thesubject
msg = msg + versionline
msg = msg + "\r\n\n"
msg = msg + abstractline
msg = msg + "\r\n\n"
msg = msg + changelogline
msg = msg + "\r\n\n"
msg = msg + modsline
msg = msg + "\r\n\n"
msg = msg + urlline
msg = msg + "\r\n\n"

server = smtplib.SMTP('localhost')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

# END


+ 9
- 0
archive.sh View File

@@ -0,0 +1,9 @@
#!/bin/sh
# archive an old version of a XEP (before publishing new version)
# usage: ./archive.sh xepnum version

xeppath=/var/www/xmpp.org/extensions

cp $xeppath/xep-$1.html $jeppath/attic/xep-$1-$2.html

# end

+ 143
- 0
deferred.py View File

@@ -0,0 +1,143 @@
#!/usr/bin/env python

# File: deferred.py
# Version: 0.2
# Description: a script for setting a JEP to Deferred
# Last Modified: 2006-04-24
# Author: Peter Saint-Andre (stpeter@jabber.org)
# License: public domain
# HowTo: ./deferred.py jepnum dbuser dbpw

# IMPORTS:
#
import glob
import MySQLdb
import os
from select import select
import smtplib
import socket
from string import split,strip,join,find
import sys
import time
from xml.dom.minidom import parse,parseString,Document

def getText(nodelist):
thisText = ""
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
thisText = thisText + node.data
return thisText

# get the seconds in the Unix era
now = int(time.time())

# READ IN ARGS:
#
# 1. JEP number
# 2. database user
# 3. database password

jepnum = sys.argv[1];
dbuser = sys.argv[2];
dbpw = sys.argv[3];

jepfile = jepnum + '/jep-' + jepnum + '.xml'

# PARSE JEP HEADERS:
#
# - title
# - abstract
# - version
# - date
# - initials
# - remark

thejep = parse(jepfile)
jepNode = (thejep.getElementsByTagName("jep")[0])
headerNode = (jepNode.getElementsByTagName("header")[0])
titleNode = (headerNode.getElementsByTagName("title")[0])
title = getText(titleNode.childNodes)
abstractNode = (headerNode.getElementsByTagName("abstract")[0])
abstract = getText(abstractNode.childNodes)
statusNode = (headerNode.getElementsByTagName("status")[0])
jepstatus = getText(statusNode.childNodes)
typeNode = (headerNode.getElementsByTagName("type")[0])
jeptype = getText(typeNode.childNodes)
revNode = (headerNode.getElementsByTagName("revision")[0])
versionNode = (revNode.getElementsByTagName("version")[0])
version = getText(versionNode.childNodes)
dateNode = (revNode.getElementsByTagName("date")[0])
date = getText(dateNode.childNodes)
initialsNode = (revNode.getElementsByTagName("initials")[0])
initials = getText(initialsNode.childNodes)
remarkNode = (revNode.getElementsByTagName("remark")[0])
remark = getText(remarkNode.childNodes)

# UPDATE DATABASE:
#
# number is $jepnum
# name is $title
# type is $jeptype
# status is $jepstatus
# notes is "Version $version of JEP-$jepnum released $date."
# version is $version
# last_modified is $now
# abstract is $abstract
# changelog is "$remark ($initials)"

db = MySQLdb.connect("localhost", dbuser, dbpw, "foundation")
cursor = db.cursor()
theNotes = "Version " + version + " of JEP-" + jepnum + " released " + date + "; consideration deferred because of inactivity."
theLog = remark + " (" + initials + ")"
theStatement = "UPDATE jeps SET name='" + title + "', type='" + jeptype + "', status='Deferred', notes='" + theNotes + "', version='" + str(version) + "', last_modified='" + str(now) + "', abstract='" + abstract + "', changelog='" + theLog + "' WHERE number='" + str(jepnum) + "';"
cursor.execute(theStatement)
result = cursor.fetchall()

# SEND MAIL:
#
# From: editor@jabber.org
# To: standards-jig@jabber.org
# Subject: DEFERRED: JEP-$jepnum ($title)
# Body:
# JEP-$jepnum ($title) has been Deferred because of inactivity.
#
# Abstract: $abstract
#
# URL: http://www.jabber.org/jeps/jep-$jepnum.html
#
# If and when a new revision of this JEP is published,
# its status will be changed back to Experimental.
#

fromaddr = "editor@jabber.org"
# for testing...
# toaddrs = "stpeter@jabber.org"
# for real...
toaddrs = "standards-jig@jabber.org"

thesubject = 'DEFERRED: JEP-' + jepnum + " (" + title + ")"
introline = 'JEP-' + jepnum + ' (' + title + ') has been Deferred because of inactivity.'
abstractline = 'Abstract: ' + abstract
urlline = 'URL: http://www.jabber.org/jeps/jep-' + jepnum + '.html'
endline = 'If and when a new revision of this JEP is published, its status will be changed back to Experimental.'

#msg = "From: %s\r\n" % fromaddr
msg = "From: JEP Editor <%s>\r\n" % fromaddr
msg = msg + "To: %s\r\n" % toaddrs
msg = msg + "Subject: %s\r\n" % thesubject
msg = msg + introline
msg = msg + "\r\n\n"
msg = msg + abstractline
msg = msg + "\r\n\n"
msg = msg + urlline
msg = msg + "\r\n\n"
msg = msg + endline
msg = msg + "\r\n"

server = smtplib.SMTP('localhost')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

# END


+ 21
- 0
editor.shtml View File

@@ -0,0 +1,21 @@
<html>
<head>
<title>XEP Editor</title>
<!--#include virtual="/includes/head.txt" -->
<h2>XEP Editor</h2>
<p>In accordance with <a href="jep-0001.html">XEP-0001</a>, the XEP Editor is responsible for overall management of the Jabber Software Foundation's standards process and publication of <a href="/extensions/">XMPP Extension Protocols</a>; in particular, the XEP Editor:</p>
<ul>
<li>works with XEP authors</li>
<li>ensures that each XEP is properly formatted</li>
<li>assigns a unique number to each XEP</li>
<li>assigns or modifies the status of each XEP</li>
<li>maintains each XEP under <a href="http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jeps/">source control</a></li>
<li>maintains the canonical <a href="/extensions/">list of XEPs</a></li>
<li>publishes each XEP to the xmpp.org website</li>
<li>publicly announces the existence and status of each XEP</li>
<li>gathers and tallies the votes of the <a href="/council/">XMPP Council</a></li>
<li>fulfills the responsibilities of the <a href="/registrar/">XMPP Registrar</a></li>
</ul>
<p>Since the founding of the Jabber Software Foundation in 2001, the XEP Editor has been <a href="http://www.jabber.org/people/stpeter.shtml">Peter Saint-Andre</a>, who may be contacted via &lt;&#101;&#100;&#105;&#116;&#111;&#114;&#64;&#106;&#97;&#98;&#98;&#101;&#114;&#46;&#111;&#114;&#103&gt;.</p>
</div>
<!--#include virtual="/includes/foot.txt" -->

+ 399
- 0
fo.xsl View File

@@ -0,0 +1,399 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<root>
<layout-master-set>
<simple-page-master master-name="cover">
<region-body margin-left="1in" margin-right="1in" margin-top="2.5in" margin-bottom="1in"/>
</simple-page-master>
<!--<simple-page-master master-name="doc_info">
<region-body margin-left="1in" margin-top="1in" margin-right="1in" margin-bottom="1in"/>
</simple-page-master>
<simple-page-master master-name="toc_page">
<region-body margin-left="1in" margin-top="1in" margin-right="1in" margin-bottom="1in"/>
</simple-page-master>-->
<simple-page-master master-name="std_page">
<region-body margin-left="1in" margin-top="1in" margin-right="1in" margin-bottom="1in"/>
<region-before extent="1in" display-align="after"/>
<region-after extent="1in" display-align="before"/>
</simple-page-master>
<page-sequence-master master-name="jep_sequence">
<single-page-master-reference master-reference="cover"/>
<!--<single-page-master-reference master-reference="doc_info"/>
<single-page-master-reference master-reference="toc_page"/>-->
<repeatable-page-master-reference master-reference="std_page"/>
</page-sequence-master>
</layout-master-set>
<page-sequence master-reference="jep_sequence">
<flow flow-name="xsl-region-body" font-family="serif" color="black" font-size="10pt">
<block space-before="1.5in" text-align="right" font-family="sans-serif" font-size="18pt">
JEP-<xsl:value-of select="/jep/header/number"/>
</block>
<block text-align="right" font-family="sans-serif" font-size="18pt">
<xsl:value-of select="/jep/header/title"/>
</block>
<!--</flow>
</page-sequence>
<page-sequence master-reference="doc_info">
<flow flow-name="xsl-region-body" font-family="serif" font-size="10pt" color="black">-->
<block font-family="sans-serif" font-size="14pt" space-after=".5em" break-before="page">Document Information</block>
<block font-size="12pt" font-weight="bold">Document Author(s)</block>
<block>
<inline font-weight="bold">Name: </inline>
<inline>
<xsl:value-of select="/jep/header/author/firstname"/>
<xsl:value-of select="/jep/header/author/surname"/>
</inline>
</block>
<block>
<inline font-weight="bold">Email: </inline>
<inline>
<xsl:value-of select="/jep/header/author/email"/>
</inline>
</block>
<block space-after=".5em">
<inline font-weight="bold">JID: </inline>
<inline>
<xsl:value-of select="/jep/header/author/jid"/>
</inline>
</block>
<block font-size="12pt" font-weight="bold">Abstract</block>
<block space-after=".5em">
<xsl:value-of select="/jep/header/abstract"/>
</block>
<block font-size="12pt" font-weight="bold">Document Status</block>
<block space-after=".5em">
<xsl:value-of select="/jep/header/status"/>
</block>
<block font-size="12pt" font-weight="bold">Dependencies/References</block>
<block space-after=".5em">
<xsl:value-of select="/jep/header/dependencies"/>
</block>
<block font-size="12pt" font-weight="bold">Legal Notice</block>
<block space-after=".5em">
<xsl:value-of select="/jep/header/legal"/>
</block>
<block font-size="12pt" font-weight="bold" space-after=".5em">Revision History</block>
<table table-layout="fixed" border-width=".25pt" border-color="black" border-style="solid">
<table-column text-align="center" column-width=".625in" column-number="1"/>
<table-column text-align="center" column-width=".75in" column-number="2"/>
<table-column text-align="center" column-width=".5in" column-number="3"/>
<table-column column-width="4.125in" column-number="4"/>
<table-body>
<table-row background-color="black" color="white" font-weight="bold">
<table-cell padding="3pt">
<block>Version</block>
</table-cell>
<table-cell padding="3pt">
<block>Date</block>
</table-cell>
<table-cell padding="3pt">
<block>Initials</block>
</table-cell>
<table-cell padding="3pt">
<block>Comment</block>
</table-cell>
</table-row>
<xsl:apply-templates select="/jep/header"/>
</table-body>
</table>
<!--</flow>
</page-sequence>
<page-sequence master-reference="toc_page" force-page-count="no-force" format="i">
<flow flow-name="xsl-region-body" font-family="serif" font-size="10pt" color="black">-->
<xsl:call-template name="processTOC"/>
</flow>
</page-sequence>
<page-sequence master-reference="std_page" initial-page-number="1">
<!--<static-content flow-name="xsl-region-before" margin-top=".5in">
<block margin-left="1in" margin-right="1in" text-align-last="justify" font-size="9pt" font-family="sans-serif" color="silver">
<xsl:value-of select="/jep/header/customer"/>
<leader leader-pattern="space"/>
Requirements Proposal
</block>
<block margin-left="1in" margin-right="1in" padding-bottom="10pt" border-after-color="black" border-after-width=".25pt" border-after-style="solid" text-align-last="justify" font-size="9pt" font-family="sans-serif" color="silver">
<xsl:value-of select="/jep/header/title"/>
<leader leader-pattern="space"/>
<xsl:value-of select="/jep/header/revision[last()]/date"/>
</block>
</static-content>-->
<static-content flow-name="xsl-region-after">
<block margin-left="1in" margin-right="1in" padding-top="10pt" border-before-color="black" border-before-width=".125pt" border-before-style="solid" text-align-last="justify" font-size="8pt" font-family="sans-serif" color="black">
IJEP-<xsl:value-of select="/jep/header/number"/>:<xsl:text> </xsl:text>
<xsl:value-of select="/jep/header/title"/>
<leader leader-pattern="space"/>
Page <page-number/> of <page-number-citation ref-id="lastpage"/>
</block>
</static-content>
<flow flow-name="xsl-region-body" font-family="serif" font-size="10pt" color="black">
<xsl:apply-templates select="/jep/section1"/>
<block font-family="sans-serif" font-size="12pt" color="black" space-before=".5em" space-after=".5em">Notes:</block>
<xsl:apply-templates select="//note" mode="endlist"/>
<block id="lastpage"/>
</flow>
</page-sequence>
</root>
</xsl:template>
<!-- From the docbook XSL -->
<xsl:template name="object.id">
<xsl:param name="object" select="."/>
<xsl:choose>
<xsl:when test="$object/@id">
<xsl:value-of select="$object/@id"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="generate-id($object)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="processTOC">
<block font-family="sans-serif" font-size="14pt" space-after=".5em" break-before="page">Table of Contents</block>
<xsl:apply-templates select="//section1" mode="toc"/>
</xsl:template>
<xsl:template match="/jep/header/revision">
<table-row>
<table-cell padding="3pt">
<block>
<xsl:value-of select="version"/>
</block>
</table-cell>
<table-cell padding="3pt">
<block>
<xsl:value-of select="date"/>
</block>
</table-cell>
<table-cell padding="3pt">
<block>
<xsl:value-of select="initials"/>
</block>
</table-cell>
<table-cell padding="3pt">
<block>
<xsl:value-of select="remark"/>
</block>
</table-cell>
</table-row>
</xsl:template>
<xsl:template match="section1" mode="toc">
<xsl:variable name="oid">
<xsl:call-template name="object.id"/>
</xsl:variable>
<xsl:variable name="num">
<xsl:number level="multiple" count="section1"/>
<xsl:text>.</xsl:text>
</xsl:variable>
<xsl:variable name="sect2.count" select="count(section2)"/>
<xsl:value-of select="$num"/>
<xsl:text> </xsl:text>
<block text-align-last="justify" font-variant="small-caps">
<xsl:value-of select="$num"/>
<xsl:value-of select="@topic"/>
<xsl:text> </xsl:text>
<leader leader-pattern="rule" space-end=".125in"/>
<xsl:text> </xsl:text>
<page-number-citation ref-id="sect-{$oid}"/>
</block>
<xsl:if test="$sect2.count &gt; 0">
<xsl:apply-templates select="section2" mode="toc">
<xsl:with-param name="prevnum" select="$num"/>
</xsl:apply-templates>
</xsl:if>
</xsl:template>
<xsl:template match="section1">
<xsl:variable name="oid">
<xsl:call-template name="object.id"/>
</xsl:variable>
<xsl:variable name="num">
<xsl:number level="multiple" count="section1"/>
<xsl:text>.</xsl:text>
</xsl:variable>
<!--<xsl:number level="single" count="section1"/>-->
<block id="sect-{$oid}" font-family="sans-serif" font-size="14pt" space-after="1em" space-before="1em" font-weight="bold">
<xsl:value-of select="$num"/>
<xsl:text> </xsl:text>
<xsl:value-of select="@topic"/>
</block>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="section2" mode="toc">
<xsl:param name="prevnum" select='""'/>
<xsl:variable name="oid">
<xsl:call-template name="object.id"/>
</xsl:variable>
<xsl:variable name="num">
<xsl:value-of select="$prevnum"/>
<xsl:number level="multiple" count="section2"/>
<xsl:text>.</xsl:text>
</xsl:variable>
<xsl:variable name="sect3.count" select="count(section3)"/>
<block text-align-last="justify" margin-left="1em">
<xsl:value-of select="$num"/>
<xsl:text> </xsl:text>
<xsl:value-of select="@topic"/>
<xsl:text> </xsl:text>
<leader leader-pattern="rule" space-end=".125in"/>
<xsl:text> </xsl:text>
<page-number-citation ref-id="sect-{$oid}"/>
</block>
<xsl:if test="$sect3.count &gt; 0">
<xsl:apply-templates select="section3" mode="toc">
<xsl:with-param name="prevnum" select="$num"/>
</xsl:apply-templates>
</xsl:if>
</xsl:template>
<xsl:template match="section2">
<xsl:param name="prevnum" select='""'/>
<xsl:variable name="oid">
<xsl:call-template name="object.id"/>
</xsl:variable>
<xsl:variable name="num">
<xsl:number level="single" count="section1"/>.<xsl:number level="multiple" count="section2"/>
<xsl:text>.</xsl:text>
</xsl:variable>
<xsl:variable name="sect3.count" select="count(section3)"/>
<block id="sect-{$oid}" font-weight="bold" font-family="sans-serif">
<xsl:value-of select="$num"/>
<xsl:text> </xsl:text>
<xsl:value-of select="@topic"/>
</block>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="section3" mode="toc">
<xsl:param name="prevnum" select='""'/>
<xsl:variable name="oid">
<xsl:call-template name="object.id"/>
</xsl:variable>
<xsl:variable name="num">
<xsl:value-of select="$prevnum"/>
<xsl:number level="multiple" count="section3"/>
<xsl:text>.</xsl:text>
</xsl:variable>
<block text-align-last="justify" margin-left="1em">
<xsl:value-of select="$num"/>
<xsl:text> </xsl:text>
<xsl:value-of select="@topic"/>
<xsl:text> </xsl:text>
<leader leader-pattern="rule" space-end=".125in"/>
<xsl:text> </xsl:text>
<page-number-citation ref-id="sect-{$oid}"/>
</block>
</xsl:template>
<xsl:template match="section3">
<xsl:variable name="oid">
<xsl:call-template name="object.id"/>
</xsl:variable>
<block id="sect-{$oid}" margin-left=".5em">
<xsl:if test="../../@type='functional-spec'">FR-<xsl:number level="single" count="section2"/>.<xsl:number level="single" count="section3"/>
</xsl:if>
<xsl:if test="../../@type='supp-spec'">SS-<xsl:number level="single" count="section2"/>.<xsl:number level="single" count="section3"/>
</xsl:if>
<xsl:text> </xsl:text>
<xsl:value-of select="@topic"/>
<xsl:apply-templates/>
</block>
</xsl:template>
<xsl:template match="p">
<block space-before=".5em" space-after=".5em">
<xsl:apply-templates/>
</block>
</xsl:template>
<xsl:template match="code">
<block space-after="1em" margin-bottom="1em" margin-left="1em" font-family="monospace" font-size="8pt" font-weight="normal" white-space-collapse="false" keep-together.within-page="always">
<xsl:value-of select="."/>
</block>
</xsl:template>
<xsl:template match="example">
<table table-layout="fixed" width="100%" space-after="1em">
<table-column column-width="proportional-column-width(1)"/>
<table-body>
<table-row keep-with-next="always">
<table-cell>
<block margin-left=".5em" space-after=".5em" space-before=".5em" font-weight="600" font-size="9pt">
Example <xsl:number level="any" count="example"/>.<xsl:text> </xsl:text>
<xsl:value-of select="@caption"/>
</block>
</table-cell>
</table-row>
<table-row>
<table-cell>
<block margin-left="1em" font-family="monospace" font-size="8pt" font-weight="normal" white-space-collapse="false" keep-together.within-page="always">
<xsl:value-of select="."/>
</block>
</table-cell>
</table-row>
</table-body>
</table>
</xsl:template>
<xsl:template match="note">
<xsl:variable name="notenum">
<xsl:number level="any" count="note"/>
</xsl:variable>
<xsl:variable name="oid">
<xsl:call-template name="object.id"/>
</xsl:variable>
<inline>[<basic-link color="blue" font-weight="bold" internal-destination="nt-{$oid}">
<xsl:value-of select="$notenum"/>
</basic-link>]</inline>
</xsl:template>
<xsl:template match="note" mode="endlist">
<xsl:variable name="oid">
<xsl:call-template name="object.id"/>
</xsl:variable>
<block id="nt-{$oid}" margin=".5em" font-size="8pt">
<xsl:value-of select="position()"/>. <xsl:apply-templates/>
</block>
</xsl:template>
<xsl:template match="link">
<basic-link external-destination="{@url}" text-decoration="underline" color="blue">
<xsl:apply-templates/>
</basic-link>
</xsl:template>
<xsl:template match="strong">
<inline font-weight="bold">
<xsl:apply-templates/>
</inline>
</xsl:template>
<xsl:template match="em">
<inline font-style="italic">
<xsl:apply-templates/>
</inline>
</xsl:template>
<xsl:template match="ul">
<list-block provisional-distance-between-starts="10pt" provisional-label-separation="3pt" space-after=".5em" space-start="1em" margin-left="1em">
<xsl:apply-templates select="li" mode="ul"/>
</list-block>
</xsl:template>
<xsl:template match="ol">
<list-block provisional-distance-between-starts="10pt" provisional-label-separation="3pt" space-after=".5em" space-start="1em" margin-left="1em">
<xsl:apply-templates select="li" mode="ol"/>
</list-block>
</xsl:template>
<xsl:template match="li" mode="ul">
<list-item>
<list-item-label end-indent="label-end()">
<block>&#x2022;</block>
</list-item-label>
<list-item-body start-indent="body-start()">
<block>
<xsl:value-of select="."/>
</block>
</list-item-body>
</list-item>
</xsl:template>
<xsl:template match="li" mode="ol">
<xsl:variable name="num">
<xsl:number level="multiple" count="li"/>
</xsl:variable>
<list-item>
<list-item-label end-indent="label-end()">
<block>
<xsl:value-of select="$num"/>.</block>
</list-item-label>
<list-item-body start-indent="body-start()">
<block>
<xsl:value-of select="."/>
</block>
</list-item-body>
</list-item>
</xsl:template>
</xsl:stylesheet>

+ 12
- 0
gen.sh View File

@@ -0,0 +1,12 @@
#!/bin/sh
# for one XEP, generates HTML file and IETF reference, then copies XML file
# usage: ./gen.sh xxxx
# (where xxxx is the 4-digit XEP number)

xeppath=/var/www/stage.xmpp.org/extensions

xsltproc xep.xsl xep-$1.xml > $xeppath/jep-$1.html
xsltproc ref.xsl xep-$1.xml > $xeppath/refs/reference.JSF.XEP-$1.xml
cp xep-$1.xml $xeppath/

# end

BIN
gps_datum.gif View File


+ 24
- 0
gps_datum.html View File

@@ -0,0 +1,24 @@
<html>
<head>
<title>GPS Datum Example</title>
</head>
<body>
<h1>GPS Datum Example</h1>
<p>The following example of GPS datum differences was kindly provided by Randy Steele of Apollo, Pennsylvania (URL: &lt;<a href="http://www.nb.net/~resteele/">http://www.nb.net/~resteele/</a>&gt;) and is archived here so that a permanent link is available from <a href="http://www.jabber.org/jeps/jep-0080.html">JEP-0080: User Geolocation</a>.</p>
<p>BEGIN EXAMPLE</p>
<hr />
<p>This is an example of the differences in the datums you can use with a GPS.
Below is a site I was checking out. I marked it on my GPS in the field. When I got back
home to find it on the topo map, I noticed something was not right. Using
the UTM coordinates from the GPS, I located the site on the topo map. But
the map site and the site I checked in the field did not match. The terrain
was different, the site I actually checked was near the road (the top red
circle). I then remembered about map datums. The topo map was made to NAD27, while
my GPS was set to WGS84. After changing the GPS to the NAD27 datum, all was fine.
So the moral of this story is: MAKE SURE THE GPS DATUM AND THE MAP DATUM MATCH!!!
Note the difference in the circle locations. I also changed my GPS datum to NAD27.</p>
<p><img src='gps_datum.gif' alt='GPS Datum Example' longdesc='An example of different GPS readings when using a datum of NAD27 vs. WGS84, provided by Randy Steele'/>
<hr />
<p>END EXAMPLE</p>
</body>
</html>

+ 29
- 0
index.shtml View File

@@ -0,0 +1,29 @@
<html>
<head>
<title>XMPP Extensions</title>
<!--#include virtual="/includes/head.txt" -->
<h2>XMPP Extensions</h2>

<p><a class="standardsButton" href="atom.xml">ATOM</a>&nbsp;&nbsp;<a class="standardsButton" href="rss.xml">RSS</a></p>

<p>The <a href='http://www.jabber.org/jsf/'>Jabber Software Foundation</a> (JSF) develops extensions to <a href="http://www.xmpp.org/">XMPP</a> through a standards process centered around XMPP Extension Protocols (XEPs). The <a href="xep-0001.html">process</a> is managed by the <a href="editor.shtml">XMPP Extensions Editor</a> and involves intensive discussion on the <a href="http://mail.jabber.org/mailman/listinfo/standards-jig/">Standards-JIG mailing list</a>, formal review and <a href="/council/votes.shtml">voting</a> by the <a href="/council/">XMPP Council</a>, and modification based on implementation experience and interoperability testing. All documents in the XEP series are available under a liberal <a href="ipr-policy.shtml">IPR Policy</a> for wide implementation. Submissions are <a href='submit.shtml'>welcome</a> (see also the <a href="/extensions/inbox/">&quot;inbox&quot;</a>). Changes are tracked via a <a href="http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jeps/">CVS repository</a> (see <a href='http://www.jabberstudio.org/cvs.php'>instructions</a>), <a href="/extensions/attic/">old versions</a> are available, and IETF-style <a href="/extensions/refs/">XML reference files</a> are provided.</p>

<p>This page lists approved XMPP extensions as well as proposals that are under active consideration. A <a href="all.shtml">list of all XEPs</a> (including retracted, rejected, deprecated, and obsolete XEPs) is also available. Good places for developers to start are the <a href='xep-0073.html'>basic</a> and <a href='xep-0117.html'>intermediate</a> protocol suites.</p>

<p><em>Note: The following table is sortable, just click on the headers (click twice to reverse the sort order).</em></p>

<table border='1' cellpadding='3' cellspacing='0' class='sortable' id='xeplist'>
<tr class='jepheader'>
<th align='left'>Number</th>
<th align='left'>Name</th>
<th align='left'>Type</th>
<th align='left'>Status</th>
<th align='left'>Date</th>
</tr>

<!--#include virtual="/includes/xeps-default.txt" -->

</table>

</div>
<!--#include virtual="/includes/foot.txt" -->

+ 121
- 0
inxep.py View File

@@ -0,0 +1,121 @@
#!/usr/bin/env python

# File: protojep.py
# Version: 0.1
# Description: a script for announcing proto-JEPs
# Last Modified: 2004-09-14
# Author: Peter Saint-Andre (stpeter@jabber.org)
# License: public domain
# HowTo: ./protojep.py filename
# (note: do not include extension!)

# IMPORTS:
#
import glob
import os
from select import select
import smtplib
import socket
from string import split,strip,join,find
import sys
import time
from xml.dom.minidom import parse,parseString,Document

def getText(nodelist):
thisText = ""
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
thisText = thisText + node.data
return thisText

# READ IN ARGS:
#
# 1. JEP filename (sans extension)

jepname = sys.argv[1];

jepfile = 'inbox/' + jepname + '.xml'

# PARSE JEP HEADERS:
#
# - title
# - abstract
# - version
# - date
# - initials
# - remark

thejep = parse(jepfile)
jepNode = (thejep.getElementsByTagName("jep")[0])
headerNode = (jepNode.getElementsByTagName("header")[0])
titleNode = (headerNode.getElementsByTagName("title")[0])
title = getText(titleNode.childNodes)
abstractNode = (headerNode.getElementsByTagName("abstract")[0])
abstract = getText(abstractNode.childNodes)
statusNode = (headerNode.getElementsByTagName("status")[0])
jepstatus = getText(statusNode.childNodes)
typeNode = (headerNode.getElementsByTagName("type")[0])
jeptype = getText(typeNode.childNodes)
revNode = (headerNode.getElementsByTagName("revision")[0])
versionNode = (revNode.getElementsByTagName("version")[0])
version = getText(versionNode.childNodes)
dateNode = (revNode.getElementsByTagName("date")[0])
date = getText(dateNode.childNodes)
initialsNode = (revNode.getElementsByTagName("initials")[0])
initials = getText(initialsNode.childNodes)
remarkNode = (revNode.getElementsByTagName("remark")[0])
remark = getText(remarkNode.childNodes)

# SEND MAIL:
#
# From: editor@jabber.org
# To: standards-jig@jabber.org
# Subject: LAST CALL: JEP-$jepnum ($title)
# Body:
# The JEP Editor has received a proposal for a new JEP.
#
# Title: $title
#
# Abstract: $abstract
#
# URL: http://www.jabber.org/jeps/inbox/$jepname.html
#
# The Jabber Council will now consider whether to accept
# this proposal as a full JEP.
#

fromaddr = "editor@jabber.org"
# for testing...
# toaddrs = "stpeter@jabber.org"
# for real...
toaddrs = "standards-jig@jabber.org"

thesubject = 'proto-JEP: ' + title
introline = 'The JEP Editor has received a proposal for a new JEP.'
titleline = 'Title: ' + title
abstractline = 'Abstract: ' + abstract
urlline = 'URL: http://www.jabber.org/jeps/inbox/' + jepname + '.html'
actionline = 'The Jabber Council will decide within 7 days (or at its next meeting) whether to accept this proposal as an official JEP.'

#msg = "From: %s\r\n" % fromaddr
msg = "From: JEP Editor <%s>\r\n" % fromaddr
msg = msg + "To: %s\r\n" % toaddrs
msg = msg + "Subject: %s\r\n" % thesubject
msg = msg + introline
msg = msg + "\r\n\n"
msg = msg + titleline
msg = msg + "\r\n\n"
msg = msg + abstractline
msg = msg + "\r\n\n"
msg = msg + urlline
msg = msg + "\r\n\n"
msg = msg + actionline
msg = msg + "\r\n\n"

server = smtplib.SMTP('localhost')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

# END


+ 91
- 0
ipr-policy.shtml View File

@@ -0,0 +1,91 @@
<html>
<head>
<title>JSF IPR Policy</title>
<!--#include virtual="/includes/head.txt" -->
<h2>JSF IPR Policy</h2>
<p>This document defines the official policy of the <a href='http://www.jabber.org/jsf/'>Jabber Software Foundation</a> regarding intellectual property rights (IPR) pertaining to <a href='http://www.xmpp.org/extensions/'>XMPP Extension Protocol</a> (XEPs) specifications.</p>
<p><em>Version 1.2</em></p>
<p><hr></p>
<strong>Table of Contents:</strong><br><dl>
<dt>1. <a href="#intro">Introduction</a></dt>
<dl>
<dt>1.1. <a href="#intro-history">History</a></dt>
<dt>1.2. <a href="#intro-role">Purpose</a></dt>
</dl>
<dt>2. <a href="#terms">Terms</a></dt>
<dl>
<dt>2.1. <a href="#xmpp">XMPP</a></dt>
<dt>2.2. <a href="#extension">XMPP Extension Protocol</a></dt>
<dt>2.3. <a href="#implementation">Implementation</a></dt>
<dt>2.4. <a href="#claim">Intellectual Property Claim</a></dt>
</dl>
<dt>3. <a href="#contributing">Terms of Contributing to XMPP Extensions</a></dt>
<dl>
<dt>3.1. <a href="#contrib-ownership">Ownership</a></dt>
<dt>3.2. <a href="#contrib-approval">Approval of XMPP Extensions</a></dt>
<dt>3.3. <a href="#contrib-private">A Note about Private Extensions</a></dt>
</dl>
<dt>4. <a href="#legal">Legal Notice</a>
</dt>
</dl>
<p><hr></p>
<h2>1. <a name="intro"></a>Introduction</h2>
<p>This document defines the official policy of the Jabber Software Foundation (JSF) regarding intellectual property rights (IPR) as they pertain to extensions to XMPP in the form of XMPP Extension Protocol specifications (XEPs). [<a href="#note1">1</a>]</p>
<blockquote>
<h3>1.1 <a name="intro-history"></a>History</h3>
<p>The Jabber/XMPP protocols have been under development since 1998 and have been discussed and documented in public forums since January 1999 in the open-source projects that were a precursor to the JSF. Through force of history and activity since its founding in the summmer of 2001, the JSF has assumed responsibility for managing the evolution of the Jabber/XMPP protocols in two ways: (1) through working with the IETF to standardize the core protocols under the name Extensible Messaging and Presence Protocol (XMPP); and (2) through the definition of extensions to the core protocol in the JSF's XMPP Extension Protocol (XEP) specification series. Through this work, the JSF has in effect "homesteaded" the domain of XMPP Extensions and has acted as a trusted third party or "intellectual property conservancy" [<a href="#note2">2</a>] to which new and established participants in the Jabber community have entrusted their XMPP Extensions.</p>
<h3>1.2 <a name="intro-role"></a>Purpose</h3>
<p>The JSF does not seek to disparage the legitimate rights of any individual or organization to assert ownership over an Implementation of XMPP or of any XMPP Extension. However, the JSF must ensure that XMPP Extensions do not pollute the free and open nature of the protocols. Preventing such pollution means that in perpetuity any entity may independently, and without payment or hindrance, create, use, sell, distribute, or dispose of implementations of XMPP and of any XMPP Extension. Such is the intent of this policy.</p>
</blockquote>
<h2>2. <a name="terms"></a>Terms</h2>
<blockquote>
<h3>2.1 <a name="xmpp"></a>XMPP</a>
</h3>
<p>The core XML streaming, instant messaging, and presence protocols developed by the Jabber community have been contributed by the JSF to the Internet Engineering Task Force (IETF) under the name Extensible Messaging and Presence Protocol (XMPP). XMPP is all and only these core protocols, as currently defined in <a href='http://www.ietf.org/rfc/rfc3920.txt'>RFC 3920</a> and <a href='http://www.ietf.org/rfc/rfc3921.txt'>RFC 3921</a>.</p>
</blockquote>
<blockquote>
<h3>2.2 <a name="extension"></a>XMPP Extension</h3>
<p>For the purposes of this IPR policy, an XMPP Extension is any specification approved by, or submitted for approval or consideration by, the JSF or its constituent committees (most particularly the <a href='/council/'>XMPP Council</a>). Such a specification must exist in the form of a standards-track XMPP Extension Protocol (XEP) specification in order to be considered an official submission. (Also referred to as an Extension.)</p>
</blockquote>
<blockquote>
<h3>2.3 <a name="implementation"></a>Implementation</h3>
<p>Any software that implements XMPP or XMPP Extensions for the purpose of providing the functionality defined by the relevant specification(s).</p>
</blockquote>
<blockquote>
<h3>2.4 <a name="claim"></a>Intellectual Property Claim</h3>
<p>Any patent, copyright, or other proprietary claim or claims made by an entity regarding a XMPP Extension. (Also referred to as a Claim.)</p>
</blockquote>
<h2>3. <a name="contributing"></a>Terms of Contributing an XMPP Extension</h2>
<p>The JSF recognizes the possibility that the creator of an XMPP Extension may make an Intellectual Property Claim regarding an XMPP Extension. Therefore, the JSF takes the following positions:</p>
<blockquote>
<h3>3.1 <a name="contrib-ownership"></a>Ownership</h3>
<p>By submitting an XMPP Extension for consideration by the JSF, the author of the Extension shall assign any ownership rights or other Claims asserted over the Extension to the JSF. This does not apply to Claims regarding any Implementations of the Extension, but rather to the Extension itself. Any documentation of the Extension (in the form of a XEP specification) shall be copyrighted by the JSF. Once an author assigns ownership to the JSF, the JSF shall in turn make the Extension available to all entities so that they may create, use, sell, distribute, or dispose of implementations of XMPP and all XMPP Extensions in perpetuity and without payment or hindrance.</p>
</p>
<h3>3.3 <a name="contrib-approval"></a>Approval of Extensions</h3>
<p>No Extension shall be approved by the JSF or its constituent committees if there are Claims to the Extension itself, or any Claims that would prevent perpetual, unrestricted, royalty-free use of the Extension in a compliant Implementation by any interested party. If Claims preventing such use are discovered, the JSF shall immediately seek to replace the Extension with unencumbered protocols that may be implemented without condition by any entity.</p>
<h3>3.3 <a name="contrib-private"></a>A Note about Private Extensions</h3>
<p>By its nature as XML, XMPP enables implementers to create their own private extensions to XMPP within custom XML namespaces. Such extensions may be kept private, and there is no compulsion for implementers to contribute such extensions to the Jabber community. It is only when an implementer seeks to have an extension standardized through the JSF's public standards process that ownership over such an extension must be transferred to the JSF. If an implementer wishes to keep its extensions private, it may simply refrain from submitting them to the JSF. However, private extensions exist outside the boundaries of XMPP and approved XMPP Extensions and must not be considered or described as part of XMPP or JSF-approved XMPP Extensions.</p>
</blockquote>
<h2>5. <a name="legal"></a>Legal Notice</h2>
<p>All XMPP Extension Protocol (XEP) specifications shall contain the following Legal Notice:</p>
<blockquote><pre>
This XMPP Extension Protocol is copyright 1999 - [year]
by the Jabber Software Foundation (JSF) and is in full
conformance with the JSF's Intellectual Property Rights
Policy (&lt;http://www.xmpp.org/extensions/ipr-policy.shtml&gt;).
This material may be distributed only subject to the terms and
conditions set forth in the Creative Commons Attribution
License (&lt;http://creativecommons.org/by/2.5/&gt;).
</pre></blockquote>
<p><hr></p>
<h3>Notes</h3>
<p><a name="note1"></a>1. For information about XMPP Extension Protocols, see &lt;<a href="http://www.xmpp.org/extensions/">http://www.xmpp.org/extensions/</a>&gt; and <a href="http://www.xmpp.org/extensions/xep-0001.html">JEP-0001</a>.</p>
<p><a name="note2"></a>2. For information about intellectual property conservancies, see &lt;<a href="http://www.creativecommons.org/concepts/#ip">http://www.creativecommons.org/concepts/#ip</a>&gt; and M. van Houweling, "Cultivating Open Information Platforms: A Land Trust Model." <cite>Journal of Telecommunications &amp; High Technology Law</cite> 1, no. 1 (2002): 309-23.</p>
<h3>Acknowledgements</h3>
<p>Many thanks to Lawrence Lessig and Molly van Houweling for their assistance in formulating this policy.</p>
<h3>Changelog</h3>
<p>Version 1.2 (2006-10-04): Modified terminology to reflect protocol branding change from Jabber to XMPP (e.g., Jabber Enhancement Proposal to XMPP Extension Protocol).</p>
<p>Version 1.1 (2005-10-04): Replaced Open Publication License with Creative Commons Attribution License.</p>
<p>Version 1.0 (2002-10-29): Initial version approved by JSF Board of Directors.</p>
</div>
<!--#include virtual="/includes/foot.txt" -->

+ 146
- 0
lastcall.py View File

@@ -0,0 +1,146 @@
#!/usr/bin/env python

# File: lastcall.py
# Version: 0.2
# Description: a script for announcing JEP Last Calls
# Last Modified: 2004-09-29
# Author: Peter Saint-Andre (stpeter@jabber.org)
# License: public domain
# HowTo: ./lastcall.py jepnum enddate dbuser dbpw

# IMPORTS:
#
import glob
import MySQLdb
import os
from select import select
import smtplib
import socket
from string import split,strip,join,find
import sys
import time
from xml.dom.minidom import parse,parseString,Document

def getText(nodelist):
thisText = ""
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
thisText = thisText + node.data
return thisText

# get the seconds in the Unix era
now = int(time.time())

# READ IN ARGS:
#
# 1. JEP number
# 2. end date
# 3. database user
# 4. database password

jepnum = sys.argv[1];
enddate = sys.argv[2];
dbuser = sys.argv[3];
dbpw = sys.argv[4];

jepfile = jepnum + '/jep-' + jepnum + '.xml'

# PARSE JEP HEADERS:
#
# - title
# - abstract
# - version
# - date
# - initials
# - remark

thejep = parse(jepfile)
jepNode = (thejep.getElementsByTagName("jep")[0])
headerNode = (jepNode.getElementsByTagName("header")[0])
titleNode = (headerNode.getElementsByTagName("title")[0])
title = getText(titleNode.childNodes)
abstractNode = (headerNode.getElementsByTagName("abstract")[0])
abstract = getText(abstractNode.childNodes)
statusNode = (headerNode.getElementsByTagName("status")[0])
jepstatus = getText(statusNode.childNodes)
typeNode = (headerNode.getElementsByTagName("type")[0])
jeptype = getText(typeNode.childNodes)
revNode = (headerNode.getElementsByTagName("revision")[0])
versionNode = (revNode.getElementsByTagName("version")[0])
version = getText(versionNode.childNodes)
dateNode = (revNode.getElementsByTagName("date")[0])
date = getText(dateNode.childNodes)
initialsNode = (revNode.getElementsByTagName("initials")[0])
initials = getText(initialsNode.childNodes)
remarkNode = (revNode.getElementsByTagName("remark")[0])
remark = getText(remarkNode.childNodes)

# UPDATE DATABASE:
#
# number is $jepnum
# name is $title
# type is $jeptype
# status is $jepstatus
# notes is "Version $version of JEP-$jepnum released $date."
# version is $version
# last_modified is $now
# abstract is $abstract
# changelog is "$remark ($initials)"

db = MySQLdb.connect("localhost", dbuser, dbpw, "foundation")
cursor = db.cursor()
theNotes = "Version " + version + " of JEP-" + jepnum + " released " + date + "; Last Call ends " + enddate + "."
theLog = remark + " (" + initials + ")"
theStatement = "UPDATE jeps SET name='" + title + "', type='" + jeptype + "', status='Proposed', notes='" + theNotes + "', version='" + str(version) + "', last_modified='" + str(now) + "', abstract='" + abstract + "', changelog='" + theLog + "' WHERE number='" + str(jepnum) + "';"
cursor.execute(theStatement)
result = cursor.fetchall()

# SEND MAIL:
#
# From: editor@jabber.org
# To: standards-jig@jabber.org
# Subject: LAST CALL: JEP-$jepnum ($title)
# Body:
# This message constitutes notice of a Last Call
# for JEP-$jepnum ($title).
#
# Abstract: $abstract
#
# URL: http://www.jabber.org/jeps/jep-$jepnum.html
#
# This Last Call begins now and shall end at the close
# of business on $enddate.
#

fromaddr = "editor@jabber.org"
# for testing...
# toaddrs = "stpeter@jabber.org"
# for real...
toaddrs = "standards-jig@jabber.org"

thesubject = 'LAST CALL: JEP-' + jepnum + " (" + title + ")"
introline = 'This message constitutes notice of a Last Call for JEP-' + jepnum + ' (' + title + ').'
abstractline = 'Abstract: ' + abstract
urlline = 'URL: http://www.jabber.org/jeps/jep-' + jepnum + '.html'
schedline = 'This Last Call begins today and shall end at the close of business on ' + enddate + '.'

#msg = "From: %s\r\n" % fromaddr
msg = "From: JEP Editor <%s>\r\n" % fromaddr
msg = msg + "To: %s\r\n" % toaddrs
msg = msg + "Subject: %s\r\n" % thesubject
msg = msg + introline
msg = msg + "\r\n\n"
msg = msg + abstractline
msg = msg + "\r\n\n"
msg = msg + urlline
msg = msg + "\r\n\n"
msg = msg + schedline
msg = msg + "\r\n"

server = smtplib.SMTP('localhost')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

# END


+ 73
- 0
protopage.xsl View File

@@ -0,0 +1,73 @@

<!-- Author: stpeter -->

<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>

<xsl:output method='html'/>

<xsl:template match='/'>
<html>
<head>
<title><xsl:value-of select='/jep/header/shortname'/></title>
<link rel='stylesheet' type='text/css' href='/jeps/jep.css' />
<link rel='shortcut icon' type='image/x-icon' href='/favicon.ico' />
<link>
<xsl:attribute name='rel'><xsl:text>alternate</xsl:text></xsl:attribute>
<xsl:attribute name='href'><xsl:text>http://www.jabber.org/jeps/jep-</xsl:text><xsl:value-of select='/jep/header/number'/><xsl:text>.html</xsl:text></xsl:attribute>
</link>
<!-- BEGIN META TAGS FOR DUBLIN CORE -->
<meta>
<xsl:attribute name='name'><xsl:text>DC.Title</xsl:text></xsl:attribute>
<xsl:attribute name='content'><xsl:value-of select='/jep/header/shortname'/></xsl:attribute>
</meta>
<meta>
<xsl:attribute name='name'><xsl:text>DC.Publisher</xsl:text></xsl:attribute>
<xsl:attribute name='content'>Jabber Software Foundation</xsl:attribute>
</meta>
<meta>
<xsl:attribute name='name'><xsl:text>DC.Date</xsl:text></xsl:attribute>
<xsl:attribute name='content'><xsl:value-of select='/jep/header/revision/date'/></xsl:attribute>
</meta>
<!-- END META TAGS FOR DUBLIN CORE -->
</head>
<body>
<h1><xsl:value-of select='/jep/header/shortname'/></h1>
<p>This page provides information about the XML namespaces defined in
<a>
<xsl:attribute name='href'>
<xsl:text>http://www.jabber.org/jeps/jep-</xsl:text>
<xsl:value-of select='/jep/header/number'/>
<xsl:text>.html</xsl:text>
</xsl:attribute>
<xsl:text>JEP-</xsl:text><xsl:value-of select='/jep/header/number' />:<xsl:text> </xsl:text><xsl:value-of select='/jep/header/title' />
</a>
(part of the <a href="http://www.jabber.org/jeps/">JEP series</a> published by the <a href="http://www.jabber.org/jsf/">Jabber Software Foundation</a>).</p>

<xsl:variable name='schema.count' select='count(/jep/header/schemaloc)'/>
<xsl:if test='$schema.count &gt; 0'>
<p>The following XML schemas are available for the <xsl:value-of select='/jep/header/title' /> protocol:</p>
<ul>
<xsl:apply-templates select='/jep/header/schemaloc'/>
</ul>
</xsl:if>

<p>Last Updated: <xsl:value-of select='/jep/header/revision/date'/></p>

</body>
</html>
</xsl:template>

<xsl:template match='schemaloc'>
<xsl:variable name='this.url' select='url'/>
<xsl:variable name='ns.count' select='count(ns)'/>
<xsl:choose>
<xsl:when test="$ns.count &gt; 0">
<li><a href='{$this.url}'><xsl:value-of select='url'/></a></li>
</xsl:when>
<xsl:otherwise>
<li><a href='{$this.url}'><xsl:value-of select='url'/></a></li>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

</xsl:stylesheet>

+ 122
- 0
ref.xsl View File

@@ -0,0 +1,122 @@
<?xml version='1.0' encoding='UTF-8'?>

<!-- Author: stpeter
Description: transforms XEP meta-data into IETF reference
-->

<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>

<xsl:output method='xml' indent='yes'/>

<xsl:template match='/'>
<reference>
<xsl:attribute name='anchor'><xsl:text>XEP-</xsl:text><xsl:value-of select='/xep/header/number'/></xsl:attribute>
<front>
<title><xsl:value-of select='/xep/header/title' /></title>
<xsl:apply-templates select='/xep/header/author'/>
<xsl:variable name='fulldate' select='/xep/header/revision[position()=1]/date'/>
<xsl:variable name='year' select='substring-before($fulldate,"-")'/>
<xsl:variable name='monthday' select='substring-after($fulldate,"-")'/>
<xsl:variable name='month' select='substring-before($monthday,"-")'/>
<xsl:variable name='day' select='substring-after($monthday,"-")'/>
<date>
<xsl:attribute name='day'><xsl:value-of select='$day'/></xsl:attribute>
<xsl:choose>
<xsl:when test='$month = "01"'>
<xsl:attribute name='month'><xsl:text>January</xsl:text></xsl:attribute>
</xsl:when>
<xsl:when test='$month = "02"'>
<xsl:attribute name='month'><xsl:text>February</xsl:text></xsl:attribute>
</xsl:when>
<xsl:when test='$month = "03"'>
<xsl:attribute name='month'><xsl:text>March</xsl:text></xsl:attribute>
</xsl:when>
<xsl:when test='$month = "04"'>
<xsl:attribute name='month'><xsl:text>April</xsl:text></xsl:attribute>
</xsl:when>
<xsl:when test='$month = "05"'>
<xsl:attribute name='month'><xsl:text>May</xsl:text></xsl:attribute>
</xsl:when>
<xsl:when test='$month = "06"'>
<xsl:attribute name='month'><xsl:text>June</xsl:text></xsl:attribute>
</xsl:when>
<xsl:when test='$month = "07"'>
<xsl:attribute name='month'><xsl:text>July</xsl:text></xsl:attribute>
</xsl:when>
<xsl:when test='$month = "08"'>
<xsl:attribute name='month'><xsl:text>August</xsl:text></xsl:attribute>
</xsl:when>
<xsl:when test='$month = "09"'>
<xsl:attribute name='month'><xsl:text>September</xsl:text></xsl:attribute>
</xsl:when>
<xsl:when test='$month = "10"'>
<xsl:attribute name='month'><xsl:text>October</xsl:text></xsl:attribute>
</xsl:when>
<xsl:when test='$month = "11"'>
<xsl:attribute name='month'><xsl:text>November</xsl:text></xsl:attribute>
</xsl:when>
<xsl:when test='$month = "12"'>
<xsl:attribute name='month'><xsl:text>December</xsl:text></xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name='month'><xsl:text></xsl:text></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:attribute name='year'><xsl:value-of select='$year'/></xsl:attribute>
</date>
</front>
<seriesInfo>
<xsl:attribute name='name'><xsl:text>JSF XEP</xsl:text></xsl:attribute>
<xsl:attribute name='value'><xsl:value-of select='/xep/header/number'/></xsl:attribute>
</seriesInfo>
<format>
<xsl:attribute name='type'><xsl:text>HTML</xsl:text></xsl:attribute>
<xsl:attribute name='target'><xsl:text>http://www.xmpp.org/extensions/xep-</xsl:text><xsl:value-of select='/xep/header/number'/><xsl:text>.html</xsl:text></xsl:attribute>
</format>
</reference>
</xsl:template>

<xsl:template match='author'>
<author>
<xsl:variable name='fname' select='firstname'/>
<xsl:choose>
<xsl:when test='starts-with($fname,"A")'><xsl:attribute name='initials'><xsl:text>A.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"B")'><xsl:attribute name='initials'><xsl:text>B.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"C")'><xsl:attribute name='initials'><xsl:text>C.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"D")'><xsl:attribute name='initials'><xsl:text>D.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"E")'><xsl:attribute name='initials'><xsl:text>E.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"F")'><xsl:attribute name='initials'><xsl:text>F.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"G")'><xsl:attribute name='initials'><xsl:text>G.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"H")'><xsl:attribute name='initials'><xsl:text>H.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"I")'><xsl:attribute name='initials'><xsl:text>I.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"J")'><xsl:attribute name='initials'><xsl:text>J.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"K")'><xsl:attribute name='initials'><xsl:text>K.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"L")'><xsl:attribute name='initials'><xsl:text>L.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"M")'><xsl:attribute name='initials'><xsl:text>M.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"N")'><xsl:attribute name='initials'><xsl:text>N.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"O")'><xsl:attribute name='initials'><xsl:text>O.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"P")'><xsl:attribute name='initials'><xsl:text>P.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"Q")'><xsl:attribute name='initials'><xsl:text>Q.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"R")'><xsl:attribute name='initials'><xsl:text>R.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"S")'><xsl:attribute name='initials'><xsl:text>S.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"T")'><xsl:attribute name='initials'><xsl:text>T.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"U")'><xsl:attribute name='initials'><xsl:text>U.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"V")'><xsl:attribute name='initials'><xsl:text>V.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"W")'><xsl:attribute name='initials'><xsl:text>W.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"X")'><xsl:attribute name='initials'><xsl:text>X.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"Y")'><xsl:attribute name='initials'><xsl:text>Y.</xsl:text></xsl:attribute></xsl:when>
<xsl:when test='starts-with($fname,"Z")'><xsl:attribute name='initials'><xsl:text>Z.</xsl:text></xsl:attribute></xsl:when>
<xsl:otherwise>
<xsl:attribute name='initals'><xsl:text></xsl:text></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:attribute name='surname'><xsl:value-of select='surname'/></xsl:attribute>
<xsl:attribute name='fullname'><xsl:value-of select='firstname'/><xsl:text> </xsl:text><xsl:value-of select='surname'/></xsl:attribute>
<organization/>
<address>
<email><xsl:value-of select='email'/></email>
</address>
</author>
</xsl:template>

</xsl:stylesheet>

+ 15
- 0
submit.shtml View File

@@ -0,0 +1,15 @@
<html>
<head>
<title>How to Submit an XMPP Extension Protocol</title>
<!--#include virtual="/includes/head.txt" -->
<h2>How to Submit an XMPP Extension Protocol</h2>
<p>Here is how to submit a proposal to the Jabber Software Foundation for consideration as an XMPP Extension Protocol:</p>
<ol>
<li><p>Contact the <a href="editor.shtml">XMPP Extensions Editor</a> so that he knows to expect your submission.</p></li>
<li><p>Write your proposal following the guidelines described in <a href="/extensions/xep-0143.html">XEP-0143: Guidelines for Authors of XMPP Extension Protocols</a>.</p></li>
<li>Make sure you read, understand, and agree to the JSF's <a href="/extensions/ipr-policy.shtml">IPR Policy</a> before you submit your proposal!</li>
<li><p>Email the XML file (or a URL for the file) to the <a href="editor.shtml">XMPP Extensions Editor</a> with a subject line of "ProtoJEP: [your title here]".</li>
</ol>
<p><strong>Note:</strong> It is the author's responsibility to provide a properly-formatted source file (see the <a href='template.xml'>template</a> and <a href='http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jeps/'>CVS repository</a>). Proposals submitted in HTML, TXT, MS Word, Open Document Format, etc. will be returned to the proposal author for proper formatting.</p>
</div>
<!--#include virtual="/includes/foot.txt" -->

+ 688
- 0
xep-0001.xml View File

@@ -0,0 +1,688 @@
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE jep SYSTEM '../jep.dtd' [
<!ENTITY % ents SYSTEM '../jep.ent'>
%ents;
]>
<?xml-stylesheet type='text/xsl' href='../jep.xsl'?>
<jep>
<header>
<title>Jabber Enhancement Proposals (JEPs)</title>
<abstract>This document defines the standards process followed by the Jabber Software Foundation.</abstract>
&LEGALNOTICE;
<number>0001</number>
<status>Active</status>
<type>Procedural</type>
<jig>None</jig>
<approver>Board</approver>
<dependencies/>
<supersedes/>
<supersededby/>
<shortname>N/A</shortname>
&stpeter;
<revision>
<version>1.16</version>
<date>2006-06-23</date>
<initials>psa</initials>
<remark><p>Clarified and simplified the state charts based on implementation experience; summarized state definitions.</p></remark>
</revision>
<revision>
<version>1.15</version>
<date>2004-11-02</date>
<initials>psa</initials>
<remark><p>Specified that a Standards Track JEP defines either (1) a wire protocol or (2) a protocol suite.</p></remark>
</revision>
<revision>
<version>1.14</version>
<date>2004-09-28</date>
<initials>psa</initials>
<remark><p>Defined Procedural JEP type as the union of JIG Formation JEPs and certain Informational JEPs in order to clarify the JEP categories; added Modifications to Approved JEPs section in order to make explicit existing Council practices regarding Active and Final JEPs; specified that JEPs on which voting was not complete at the end of a Council term shall undergo a second Last Call and subsequent vote by the new Council; modified Proposal Process to specify that the Jabber Council shall issue Last Calls on JEPs for which it is the approving body, with all discussion to occur on the Standards-JIG list; updated the schema.</p></remark>
</revision>
<revision>
<version>1.13</version>
<date>2004-08-24</date>
<initials>psa</initials>
<remark><p>Further specified the goals of the JEP process; mentioned Board-approved JEPs.</p></remark>
</revision>
<revision>
<version>1.11</version>
<date>2004-07-14</date>
<initials>psa</initials>
<remark><p>Specified the procedure for changing a JEP from Historical to Standards Track.</p></remark>
</revision>
<revision>
<version>1.10</version>
<date>2004-03-24</date>
<initials>psa</initials>
<remark><p>Specified the procedure for acceptance of a proposal as a JEP; clarified the JEP types; completed editorial review.</p></remark>
</revision>
<revision>
<version>1.9</version>
<date>2003-12-22</date>
<initials>psa</initials>
<remark><p>Added rule about automatic deferral of inactive JEPs.</p></remark>
</revision>
<revision>
<version>1.8</version>
<date>2003-10-06</date>
<initials>psa</initials>
<remark><p>Clarified the definition of informational JEP.</p></remark>
</revision>
<revision>
<version>1.7</version>
<date>2003-04-11</date>
<initials>psa</initials>
<remark><p>Added status of Retracted; corrected several errors related to the Jabber Registrar.</p></remark>
</revision>
<revision>
<version>1.6</version>
<date>2003-01-08</date>
<initials>psa</initials>
<remark><p>Further clarified the proposal process per discussion on the JSF members list.</p></remark>
</revision>
<revision>
<version>1.5</version>
<date>2002-10-29</date>
<initials>psa</initials>
<remark><p>Major revision based on experience. In addition to a reorganization of the content to improve the clarity of the presentation, changes include: (1) no anonymous authors; (2) proposal must be seconded by at least 5% of JSF members before being proposed for a Council vote; (3) clarification that the Council votes only on a particular revision of a JEP (e.g., version 1.3 when proceeding from Draft to Final); (4) added information about the "Call for Experience" phase before proceeding from Draft to Final; (5) added reference to RFC 2119; (6) added sections for security considerations, IANA considerations, and Jabber Registrar considerations. Approved by the JSF Board and Jabber Council on 2002-11-20.</p></remark>
</revision>
<revision>
<version>1.4</version>
<date>2002-01-16</date>
<initials>psa</initials>
<remark><p>Added information about the new "Experimental" state for Standards Track JEPs and made appropriate changes to the JEP process.</p></remark>
</revision>
<revision>
<version>1.3.1</version>
<date>2002-01-11</date>
<initials>psa</initials>
<remark><p>Added link to DTD.</p></remark>
</revision>
<revision>
<version>1.3</version>
<date>2001-10-23</date>
<initials>psa</initials>
<remark><p>(1) Added information about the "cooling off" period before a Standards Track JEP may be advanced from Draft to Final; (2) Added a link to the JEP template file; (3) Performed several minor fixes.</p></remark>
</revision>
<revision>
<version>1.2</version>
<date>2001-09-27</date>
<initials>psa</initials>
<remark><p>(1) Added information about expiration dates; (2) Added a status of Deprecated to Standards Track JEPs.</p></remark>
</revision>
<revision>
<version>1.1</version>
<date>2001-09-09</date>
<initials>psa</initials>
<remark><p>(1) Changed "Jabber Foundation" to "Jabber Software Foundation"; (2) Changed "JIG Proposal JEP" to "JIG Formation JEP"; (3) Removed reference to the Secretary of the Jabber Software Foundation in connection with the role of JEP Editor; (4) Clarified the possible states of acceptance of each kind of JEP and described in greater detail the criteria for advancement from one state to another.</p></remark>
</revision>
<revision>
<version>1.0</version>
<date>2001-07-09</date>
<initials>psa</initials>
<remark><p>Changed status to Active.</p></remark>
</revision>
<revision>
<version>0.1</version>
<date>2001-06-28</date>
<initials>psa</initials>
<remark><p>Initial release -- a simplified and updated version of Rahul Dave's Jabberization of the process and format for Python Enhancement Proposals</p></remark>
</revision>
</header>
<section1 topic='Introduction' anchor='intro'>
<p>The &JSF; adheres to an open standards process that enables interested parties to document existing protocols used within the Jabber/XMPP developer community and to submit proposals that define new protocols; with a few exceptions, <note>Effectively the only such exceptions are protocols that were superseded by <cite>RFC 3920</cite> and <cite>RFC 3921</cite>.</note> such protocols can be considered extensions to the Extensible Messaging and Presence Protocol (XMPP) approved by the &IETF; in &xmppcore; and &xmppim;. Advancement through the JSF's standards process is subject to open discussion on public discussion lists and approval by a technical steering committee elected by the members of the JSF. The focal point of the process is a series of protocol specifications called Jabber Enhancement Proposals or JEPs. <note>The JEP concept as exemplified in version 1.0 of this document (approved in July of 2001) was borrowed from the Python community (see <link url="http://python.sourceforge.net/peps/pep-0001.html">PEP-1</link>). Subsequent revisions have been based on the Jabber/XMPP developer community's experience with the JEP process, as well as insights gleaned from the standards processes followed by the IETF (&rfc2026;), the &W3C; (&w3process;), and other standards development organizations.</note> The nature of JEPs and the mechanisms for managing and advancing them within the Jabber Software Foundation's standards process are canonically described in the current document, which represents the first document in the JEP series.</p>
</section1>
<section1 topic='Objectives' anchor='objectives'>
<p>The Jabber Software Foundation was founded in the year 2001 to openly document, safeguard, manage, and extend the wire protocols used within the Jabber/XMPP developer community. The work of the Jabber Software Foundation has several objectives:</p>
<ol start='1'>
<li>To produce practical, technically excellent solutions to important problems of real-time communication based on the set of streaming XML technologies known as Jabber/XMPP.</li>
<li>To document Jabber protocols and XMPP extensions in a clear, concise manner so that the task of implementing the protocols is straightforward.</li>
<li>To ensure interoperability among the disparate technologies used on Jabber/XMPP networks.</li>
<li>To guarantee that any person or entity may implement the protocols without encumbrance.</li>
<li>To work in an fair, open, objective manner.</li>
</ol>
<p>The standards process specified herein has been developed and refined in order to meet these objectives.</p>
</section1>
<section1 topic='JEP Types' anchor='types'>
<p>The five JEP types are described in the following sections.</p>
<p>The approving body for all Standards Track, Informational, Historical, and Humorous JEPs is the &COUNCIL;; the approving body for Procedural JEPs may be either the &BOARD; or the Jabber Council.</p>
<p>This document focuses primarily on Standards Track JEPs since they are the vehicle for defining new protocols, but also discusses the other JEP types.</p>
<section2 topic='Standards Track' anchor='types-Standards-Track'>
<p>A <span class='ref'>Standards Track JEP</span> defines one of the following:</p>
<ol>
<li>A wire protocol intended to be used as a standard part of Jabber/XMPP technologies.
<note>Note well that a protocol defined in a Standards Track JEP is not considered a full standard of the Jabber Software Foundation until it achieves a status of Final within the standards process defined herein (a Standards Track JEP that has achieved a status of Draft may be referred to as a Draft Standard; a Standards Track JEP that has a status of Experimental must not be referred to as a standard, but instead should be referred to as a work in progress).</note>
</li>
<li>A protocol suite that determines conformance requirements (e.g., &jep0073;).</li>
</ol>
</section2>
<section2 topic='Informational' anchor='types-Informational'>
<p>An <span class='ref'>Informational JEP</span> defines one of the following:</p>
<ol start='1'>
<li>Best practices for protocol development (e.g., &jep0128;).</li>
<li>A usage profile for an existing protocol (e.g., &jep0126;).</li>
</ol>
</section2>
<section2 topic='Historical' anchor='types-Historical'>
<p>An <span class='ref'>Historical JEP</span> documents a protocol that was developed before the JEP process was instituted, but that is still in use within the Jabber/XMPP developer community; such a JEP may or may not be obsoleted by a Standards Track JEP, or upgraded to Standards Track.</p>
</section2>
<section2 topic='Humorous' anchor='types-Humorous'>
<p>A <span class='ref'>Humorous JEP</span> attempts to be funny by defining a protocol that would never be used in the real world; such JEPs are usually published on April 1 and automatically have a status of Active.</p>
</section2>
<section2 topic='Procedural' anchor='types-Procedural'>
<p>A <span class='ref'>Procedural JEP</span> defines a process or activity to be followed by the JSF, including JIG charters as specified by &jep0002;.</p>
</section2>
</section1>
<section1 topic='Submission Process' anchor='submission'>
<p>The JSF welcomes and encourages the submission of protocols to the JSF's standards process. <note>It is important to understand that private extensions to XMPP are also allowed. The JSF does not, and cannot, require such private extensions to be added to the public, official set of protocols recognized by the JSF. The processes and procedures in this document apply only to protocols that are submitted to the JSF, not to private protocol extensions used for custom functionality in particular applications. However, such private extensions must not be considered part of the protocols recognized by the JSF.</note> Any individual or group of individuals may author a proposal and submit it to the JSF for consideration as a JEP, and there is no requirement that a JEP author shall be an elected member of the JSF. However, proposals to define official JSF protocols must be presented in the JEP format and must follow the rules defined herein. The JEP authoring and submission process is defined in &jep0143; (see also &lt;<link url="http://www.jabber.org/jeps/submit.shtml">http://www.jabber.org/jeps/submit.shtml</link>&gt;). All inquiries related to the JEP process, and all submissions, should be directed to the &EDITOR;.</p>
<p>Note well that JEP authors must transfer ownership of their protocols (but not implementations thereof) to the JSF. Refer to the &JSFIPR; for details. JEP authors must make sure that they have read, understood, and agreed to the JSF IPR Policy before submitting a proposal to the JEP Editor!</p>
<p>All proposals submitted to the JSF for consideration as JEPs must contain the following information:</p>
<ol start='1'>
<li><p>Legal Notice -- the legal notice must be exactly that which is specified in the JSF IPR Policy</p></li>
<li><p>Author Information -- first name, last name, email address, and Jabber ID are all required and must be provided for all authors</p></li>
</ol>
<p>Finally, Standards Track, Informational, and Historical JEPs must conform to &rfc2119; in the use of terminology regarding requirements levels.</p>
</section1>
<section1 topic='Publication Process' anchor='publication'>
<p>The approving body for almost all JEPs is the Jabber Council; therefore, in order to be published as a JEP, a proposal must first be accepted by the Jabber Council (the only exceptions are certain kinds of Procedural JEPs, for which the approving body may be the JSF Board of Directors and which may be accepted for publication by the JEP Editor in consultation with the Board). Upon receiving a proposal, the JEP Editor shall do the following:</p>
<ul>
<li>ensure that its format is correct</li>
<li>publish it to &lt;<link url='http://www.jabber.org/jeps/inbox/'>http://www.jabber.org/jeps/inbox/</link>&gt;</li>
<li>publicly announce its existence by sending a message to the discussion list of the &SJIG;</li>
<li>request acceptance of the proposal as a JEP by the Jabber Council</li>
</ul>
<p>If no member of the Jabber Council objects to publication of the proposal within seven (7) days or at the next meeting of the Council, the JEP Editor shall accept it as a JEP. If objections are raised by the Council on the Standards-JIG list or in its meeting, the JEP author is encouraged to address the feedback of the Council and to submit a revised version of the proposal and/or confer with the JEP Editor or objecting Council member(s) regarding how to proceed.</p>
<p>If the proposal is accepted as a JEP, the JEP Editor shall do the following:</p>
<ul>
<li>assign it a number</li>
<li>specify an appropriate type</li>
<li>specify a status of Experimental</li>
<li>add it to source control <note>JEPs are kept under source control in the 'jeps' module of the CVS repository maintained at the jabberstudio.org service. Instructions for accessing these files can be found at &lt;<link url='http://www.jabberstudio.org/cvs.php'>http://www.jabberstudio.org/cvs.php</link>&gt;, and a web interface to these files is available at &lt;<link url='http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jeps/'>http://www.jabberstudio.org/cgi-bin/viewcvs.cgi/jeps/</link>&gt;.</note></li>
<li>add tracking information to the JEPs database</li>
<li>publish version 0.1 of the JEP to the JSF website <note>The canonical URL for accessing JEPs is &lt;<link url='http://www.jabber.org/jeps/'>http://www.jabber.org/jeps/</link>&gt;.</note></li>
<li>publicly announce the existence of the JEP by sending a message to the Standards-JIG list</li>
</ul>
<p>Note well that no special criteria (other than acceptance by the Jabber Council and minimal formatting compliance) need to be met in order for a JEP to be granted a status of Experimental. The granting of Experimental status must not be construed as indicating any level of approval by the JSF, the Jabber Council, or the Jabber/XMPP developer community. Implementation of Experimental JEPs is encouraged in an exploratory fashion (e.g., in a proof of concept) in order to gain experience with and iteratively improve the protocol defined therein, but such implementations may not be appropriate for deployment in production systems.</p>
</section1>
<section1 topic='Discussion Process' anchor='discussion'>
<p>Once a JEP is published, it becomes available for public discussion within the Standards JIG and the broader Jabber/XMPP developer community. The JEP author is responsible for collecting feedback from the Jabber/XMPP developer community during the life of the JEP and for incorporating such feedback into the proposal. In order to fully participate in discussion of the proposal, the JEP author should be subscribed to the Standards-JIG list, which is the primary venue for discussion of JEPs. Changes made based on feedback received by the JEP author must be captured in updated versions of the JEP (e.g., 0.2 after 0.1), each of which must be put under source control and subsequently published and announced by the JEP Editor.</p>
<p>If an Experimental JEP is inactive (i.e., no updated versions are published) for a period of six (6) months, the JEP Editor shall automatically change the status of the JEP to Deferred unless it is in the queue of JEPs under active consideration for advancement by the Jabber Council; upon submission of an updated version, the JEP Editor shall change the status back to Experimental.</p>
</section1>
<section1 topic='Proposal Process' anchor='proposal'>
<p>Before an Experimental JEP may be proposed to the Jabber Council for advancement to Draft (Standards Track JEPs) or Active (Historical, Informational, and Procedural JEPs), the Jabber Council must agree that the JEP is ready to be considered for advancement. Once the Council so agrees, it shall instruct the JEP Editor to (1) change the status of the JEP from Experimental to Proposed and (2) issue a Last Call for open discussion on the Standards JIG list. The Last Call shall expire not less than 10 days after the date of issue.</p>
<p>Once the consensus of the Standards JIG has been incorporated into the JEP and all issues of substance raised during the Last Call have been addressed by the JEP author, the JEP Editor shall formally propose a specific revision of the JEP to the Jabber Council for its vote. If necessary, the JEP Editor may, at his discretion and in consultation with the Jabber Council, extend the Last Call or issue a new Last Call if the JEP requires further discussion.</p>
<p>Last Calls regarding Procedural JEPs for which the approving body is the JSF Board of Directors may be issued directly by the JEP Editor once instructed by the Board.</p>
</section1>
<section1 topic='Approval Process' anchor='approval'>
<p>After a JEP has been proposed to the Jabber Council, any change in its status shall be determined by a vote of the Jabber Council. All members of the Council must vote, with the possible values being +1 (approve), 0 (neutral), or -1 (disapprove, with reasons). A JEP shall not be advanced to the next stage in the approval process so long as any Council Member continues to vote -1; that Council Member's written concerns must be addressed in order for the JEP to advance. A majority of Council members must vote +1 in order for a JEP to advance. (Additional voting policies, such as voting periods and defaults if a member does not vote, may be set by the Jabber Council.) A vote of the Jabber Council is final and binding, although a JEP author is free to address the concerns of the Council and to resubmit the JEP for future consideration.</p>
<p>If the Jabber Council does not complete voting on a JEP before the end of its term, the JEP Editor shall issue a new Last Call on the Standards JIG list and the newly-elected Council shall vote anew on the JEP after completion of the Last Call. This provides an opportunity for any member of the previous Council who had voted -1 to voice his or her concerns in a public forum before the new Council votes on the JEP.</p>
<p>A vote of the Jabber Council applies only to the specific revision of the JEP that has been presented to it. Further revisions may need to be re-submitted for approval.</p>
<p>Any change in the status of a JEP must be announced on the Standards-JIG list by the JEP Editor. If a JEP advances to a status of Final, it shall be so announced and also published as one of the official JSF protocols <note>A list of official JSF protocols is maintained at &lt;<link url='http://www.jabber.org/protocol/'>http://www.jabber.org/protocol</link>&gt;.</note> on the website of the Jabber Software Foundation.</p>
<p>Approval of Procedural JEPs for which the approving body is the JSF Board of Directors shall occur upon approval by the Board in accordance with the rules defined in the &BYLAWS;.</p>
<p>More detailed information about the approval process is provided below, including criteria for Standards Track JEPs and for Historical, Informational, and Procedural JEPs.</p>
<section2 topic='Standards Track JEPs' anchor='approval-std'>
<p>The possible states for a Standards Track JEP are as follows:</p>
<code>

+--> Retracted
|
|
+--> Deferred +--> Rejected
| |
| |
Experimental ----> Proposed ----> Draft ----> Final
| |
| |
+-----------+---> Deprecated ---> Obsolete
</code>
<p>The ideal path is for a Standards Track JEP is to be advanced by the Jabber Council from Proposed to Draft to Final (the criteria for this advancement are described in the following paragraphs). However, an Experimental JEP shall be assigned a status of Deferred if it has not been updated in six (6) months (e.g., because of a lack of interest or because it depends on other specifications that have yet to move forward). In addition, rather than being advanced from Proposed to Draft, a Standards Track JEP may be voted to a status of Rejected if the Jabber Council deems it unacceptable. (Note that if a JEP is Deferred, the JEP Editor may at some point re-assign it to Experimental status, and that, even if a JEP is Rejected, it is retained in source control and on the Jabber Software Foundation website for future reference.) Finally, a JEP author may voluntarily remove an Experimental JEP from further consideration, resulting in a status of Retracted.</p>
<p>In order for a Standards Track JEP to advance from Proposed to Draft, it must:</p>
<ol>
<li>fill known gaps in Jabber/XMPP technologies or deficiencies with existing protocols</li>
<li>be clearly described and accurately documented so that it can be understood and implemented by interested and knowledgeable members of the Jabber/XMPP developer community</li>
<li>document any known security considerations with the proposed technology</li>
<li>be generally stable and appropriate for further field experience</li>
<li>have achieved rough consensus (though not necessarily unanimity) within the Standards JIG</li>
<li>be formally defined by an XML schema</li>
<li>receive the requisite votes from the Jabber Council</li>
</ol>
<p>Elevation to Draft status (version 1.0) is a major advancement for the JEP, indicating a strong sense on the part of the Jabber Council and Jabber/XMPP developer community that the specification will be of lasting value. Since a Draft standard must be well-understood and must be known to be reasonably stable, it is relatively safe to use it as the basis for implementations and production deployments. However, note that because a Draft standard may still require additional field experience and may be subject to change based on such experience, mission-critical or large-scale implementations of the Draft standard may not be advisable (although every effort shall be made to ensure that any changes to a Draft JEP will be backwards-compatible with the 1.0 version). Note also that any changes to a Draft JEP must be provisionally published at &lt;<link url='http://www.jabber.org/jeps/tmp/'>http://www.jabber.org/jeps/tmp/</link>&gt;, announced on the Standards-JIG mailing list, and formally approved by the Jabber Council before being officially published at the canonical URL for the JEP.</p>
<p>In order for a JEP to advance from Draft status to Final status (version 2.0), it must be shown to be stable and well-received by the Jabber/XMPP developer community. Before presenting a Draft standard to the Jabber Council for consideration as a Final standard, the JEP Editor shall issue a Call for Experience on the Standards-JIG list so that feedback can be gathered from those who have implemented the Draft standard (the Call for Experience shall expire not less than 14 days after the date of issue, and shall not be issued until at least 60 days have passed since advancement to Draft). In addition, at least two implementations of the JEP must exist, at least one of which must be free software (in accordance with the &GPL; or &LGPL;) or open-source software (in accordance with the definition provided by &OSI;). Until two implementations are produced, a Standards Track JEP shall retain a status of Draft. Once (1) two implementations have been presented to the Jabber Council, (2) feedback provided during the Call for Experience has been incorporated into the JEP, and (3) the JEP has been fully checked for accuracy, the status of the JEP may be changed to Final upon a vote of the Council.</p>
<p>Finally, a Standards Track JEP that has been granted a status of Final may be superseded by a future JEP approved by the Jabber Council. In such cases, the status of the earlier JEP shall be changed to Deprecated, possibly with an expiration date assigned by the Jabber Council (see the <link url='#expiration'>Expiration Dates</link> section below). After a reasonable period of time or upon the passing of the expiration date, the status of the JEP shall be changed to Obsolete.</p>
</section2>
<section2 topic='Historical, Informational, and Procedural JEPs' anchor='approval-info'>
<p>The possible states for a Historical, Informational, or Procedural JEP are as follows:</p>
<code>

+--> Retracted
|
|
+--> Deferred +--> Rejected
| |
| |
Experimental ----> Proposed ----> Active
|
|
+--> Deprecated --> Obsolete
</code>
<p>Because such JEPs do not seek to define standard protocols, in general they are less controversial and tend to proceed from Proposed to Active without controversy on a vote of the Jabber Council. However, some of these JEPs may be remanded from the Council to the JEP author and/or JEP Editor for revision in order to be suitable for advancement from Proposed to Active (e.g., documentation of protocols in use must be accurate and describe any existing security concerns). As with Standards Track JEPs, the JEP author may retract such a JEP when it is Experimental, and the Council may reject such a JEP when it is Proposed.</p>
<p>Once approved, Historical, Informational, and Procedural JEPs will have a status of Active. Such a JEP may be replaced by a new JEP on the same or a similar topic, thus rendering the earlier JEP out of date; in such cases, the earlier JEP shall be assigned a status of Deprecated (and eventually Obsolete) with a note specifying the superseding JEP.</p>
<p>The Jabber Council may, at its discretion, decide to convert an Historical JEP into a Standards Track JEP if the protocol defined in the JEP has been in long use, is deemed stable and uncontroversial, and is unlikely to be superseded by a newer protocol. The Historical JEP shall be treated in the same way as a Standards Track JEP that has a status of Experimental, beginning with the <link url="#proposal">Proposal Process</link>. If after the Last Call and voting by the Jabber Council the JEP is approved for advancement on the standards track, its type shall be changed to Standards Track and its status shall be changed to Draft.</p>
</section2>
</section1>
<section1 topic='Summary of JEP States' anchor='states'>
<p>The possible states for a JEP are summarized in the following sections.</p>
<section2 topic='Experimental' anchor='states-Experimental'>
<p>A JEP of any type is in the Experimental state after it has been accepted by the Jabber Council and published by the Jabber Software Foundation but before it has advanced within the standards process to a state of Active or Draft.</p>
</section2>
<section2 topic='Proposed' anchor='states-Proposed'>
<p>A JEP of any type is in the Proposed state while it is in Last Call or under consideration by the Jabber Council for advancement from Experimental to Draft or Active.</p>
</section2>
<section2 topic='Draft' anchor='states-Draft'>
<p>A Standards Track JEP is in the Draft state after it has undergone extensive discussion and technical review on the Standards-JIG list and has been voted forward on the standards track by the Jabber Council.</p>
</section2>
<section2 topic='Final' anchor='states-Final'>
<p>A Standards Track JEP is in the Final state after it has been in the Draft state for at least 60 days, has been implemented in at least two separate codebases, and has been voted forward on the standards track by the Jabber Council.</p>
</section2>
<section2 topic='Active' anchor='states-Active'>
<p>A JEP of any type other than Standards Track is advanced to a status of Active after it has been voted forward from Experimental by the Jabber Council.</p>
</section2>
<section2 topic='Deferred' anchor='states-Deferred'>
<p>An Experimental JEP of any type is changed to the Deferred state if it has not been updated in six (6) months.</p>
</section2>
<section2 topic='Retracted' anchor='states-Retracted'>
<p>A JEP of any type is in the Retracted state if the authors have asked the JEP Editor to remove the JEP from further consideration in the JSF's standards process.</p>
</section2>
<section2 topic='Rejected' anchor='states-Rejected'>
<p>A JEP of any type is in the Rejected state if the Jabber Council has deemed it unacceptable and has voted to not move it forward within the standards process.</p>
</section2>
<section2 topic='Deprecated' anchor='states-Deprecated'>
<p>A JEP of any type is in the Deprecated state if the Jabber Council has determined that the protocol defined therein is out of date and that new implementations are no longer encouraged (e.g., because it has been superseded by a more modern protocol).</p>
</section2>
<section2 topic='Obsolete' anchor='states-Obsolete'>
<p>A JEP of any type is changed from Deprecated to Obsolete if the Jabber Council has determined that the protocol defined therein should no longer be implemented or deployed.</p>
</section2>
</section1>
<section1 topic='Modification of Final and Active JEPs' anchor='mods'>
<p>Sometimes it is necessary to modify JEPs that have received final approval by the Jabber Council or JSF Board of Directors (e.g., to correct errors, incorporate the lessons of experience, or document new security concerns). This section describes the process for doing so with regard to Standards Track JEPs that have achieved a status of Final and Historical, Informational, and Procedural JEPs that have achieved a status of Active.</p>
<p>With regard to Standards Track JEPs, the Jabber Software Foundation (in particular, the Jabber Council) strives to ensure that such JEPs are accurate, complete, and stable before advancing them to a status of Final (corresponding to document version 2.0 of the JEP). The Call for Experience and discussion within the Standards JIG help to ensure this result, but final responsibility rests with the Jabber Council. Despite the best efforts of all concerned, errors are sometimes discovered in Final JEPs (the individual who discovers such an error should inform the Council via the Standards-JIG mailing list or communicate directly with the JEP Editor). Whereas other standards development organizations may issue errata while leaving the specification itself unchanged, the JSF makes changes to the Final JEP and publishes a revised document version (e.g., version 2.1). In general the changes are made by the JEP Editor or JEP author in consultation with the Jabber Council, discussed within the Standards JIG if appropriate, and agreed upon by the full Jabber Council. Upon agreement regarding the exact changes, the Jabber Council shall instruct the JEP Editor to publish a revised version of the JEP and announce the existence of the revised version through the normal channels (e.g., on the JSF website and to the Standards-JIG list). Naturally, if members of the Jabber/XMPP developer community have concerns regarding the changes made, they are free to discuss the matter in the relevant forum (usually the Standards-JIG list) before or after the revised version has been published.</p>
<p>The process is similar with regard to Historical and Informational JEPs that have achieved a status of Active (corresponding to document version 1.0 of the JEP): the Jabber Council agrees on the exact changes to be made and instructs the JEP Editor to publish and announce a revised version (e.g., version 1.1). Here again the Jabber Council bears responsibility for any changes and public discussion is welcome.</p>
<p>Procedural JEPs may be modified more frequently as the Jabber Software Foundation gains experience with the processes defined therein. For example, JEP-0001 is modified periodically in order to document processes previously not made explicit or to modify existing processes based on experience with the JEP process; similar changes are sometimes made to the &jep0053; JEP and to various JIG-related JEPs. Changes to these JEPs are discussed by the Jabber Council, JSF Board of Directors, JSF membership, and Standards JIG as appropriate, and exact changes are agreed to by the relevant approving body (Jabber Council or JSF Board of Directors). The approving body then instructs the JEP Editor to publish and announce the revised version as described above.</p>
</section1>
<section1 topic='Expiration Dates' anchor='expiration'>
<p>In rare cases, a protocol enhancement may be accepted as an interim solution, especially when it is recognized that expected future improvements in technology or the underlying Jabber/XMPP protocols will make possible a much better solution to the problem at hand (e.g., a better protocol for user avatars may be contingent upon the development of a robust protocol for publish/subscribe functionality). In such cases, a JEP may be approved provisionally and be assigned an expiration date.</p>
<p>The exact form of such an expiration date shall be left up to the discretion of the Jabber Council. However, the preferred form is to assign an expiration date of six (6) months in the future, at which time the Jabber Council must re-affirm the status of the JEP and, if desired, extend the expiration date for another six (6) months. While this process may continue indefinitely (although that is unlikely), it has the virtue of forcing the Jabber Council and Jabber/XMPP developer community to re-examine the provisional protocol on a fairly regular basis in the light of technological changes. Alternatively, a JEP may be assigned a "soft" expiration date: that is, the JEP will expire when an expected future protocol comes into existence, whenever that may be. In either case, the status of the JEP shall be changed to Deprecated when it expires.</p>
<p>In addition, an expiration date may be assigned when the status of a JEP is changed from Final (or, potentially, Draft) to Deprecated. In this case, the expiration date applies to the date when the JEP is expected to change from Deprecated to Obsolete. These dates may be flexible; however it is expected that they will follow the same six-month rule as provisional protocol enhancements.</p>
</section1>
<section1 topic='Security Considerations' anchor='security'>
<p>Every JEP must contain a section entitled "Security Considerations", detailing security concerns or features related to the proposal; in particular, a Standards Track JEP should list the security threats that the protocol addresses and does not address, as well as security issues related to implementation of the protocol. JEP authors should refer to &rfc3552; for helpful information about documenting security considerations and should also confer with the JEP Editor and/or Jabber Council regarding this important task.</p>
</section1>
<section1 topic='IANA Considerations' anchor='iana'>
<p>Some JEPs may require interaction with &IANA;. The IANA acts as a clearinghouse to assign and coordinate the use of numerous Internet protocol parameters, such as MIME types and port numbers (e.g., the TCP ports 5222 and 5269 used by the Jabber/XMPP developer community are registered with the IANA). Whether or not a JEP requires registration of parameters with the IANA, that fact must be noted and explained in a distinct section of the JEP entitled "IANA Considerations". Registration with the IANA should not occur until a JEP advances to a status of Draft (Standards Track JEPs) or Active (Informational and Historical JEPs), and should be initiated by the Jabber Registrar in consultation with the JEP author, not by the JEP author directly with the IANA.</p>
</section1>
<section1 topic='Jabber Registrar Considerations' anchor='registrar'>
<p>The &REGISTRAR; performs a function similar to the IANA, although limited to the Jabber/XMPP developer community. It does so by reserving protocol namespaces and by uniquely assigning parameters for use in the context of Jabber/XMPP protocols (for example, the categories and types used in &jep0030;).</p>
<p>Whether or not a JEP requires registration of protocol namespaces or parameters with the Jabber Registrar, that fact must be noted and explained in a distinct section of the JEP entitled "Jabber Registrar Considerations". Such registration should not occur until a JEP advances to a status of Draft (Standards Track JEPs) or Active (Informational and Historical JEPs). Registration of protocol namespaces is initiated by the JEP Editor when a JEP advances to Draft or Active. Registration of particular parameters used within a specification may be initiated by a JEP author within the text of the JEP, or by an implementor of the JEP after it has advanced to Draft or Active. For details regarding the Jabber Registrar and its processes, refer to &jep0053;.</p>
<p>A JEP may also request that a new registry is to be created by the Jabber Registrar. The JEP author must clearly define the nature of the new registry as well as the process for submitting data to the registry, and must do so in collaboration with the Registrar.</p>
</section1>
<section1 topic='XML Schema' anchor='schema'>
<p>JEPs that define official JSF protocols must include a schema that conforms to &w3xmlschema1; and &w3xmlschema2;.</p>
<p>The schema for the JEP format itself is as follows:</p>
<code><![CDATA[
<?xml version='1.0' encoding='UTF-8'?>

<xs:schema
xmlns:xs='http://www.w3.org/2001/XMLSchema'
targetNamespace='http://www.jabber.org/jeps'
xmlns='http://www.jabber.org/jeps'
elementFormDefault='qualified'>

<xs:element name='jep'>
<xs:annotation>
<xs:documentation>

This schema defines the document format for Jabber Enhancement
Proposals (JEPs). For further information about JEPs, visit:

http://www.jabber.org/jeps/
The canonical URL for this schema is:
http://www.jabber.org/jeps/jep.xsd

</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref='header'/>
<xs:element ref='section1' maxOccurs='unbounded'/>
</xs:sequence>
</xs:complexType>
</xs:element>

<xs:element name='header'>
<xs:complexType>
<xs:sequence>
<xs:element name='title' type='xs:string'/>
<xs:element name='abstract' type='xs:string'/>
<xs:element name='legal' type='xs:string'/>
<xs:element name='number' type='xs:byte'/>
<xs:element ref='status'/>
<xs:element ref='type'/>
<xs:element name='jig' type='xs:string'/>
<xs:element name='approver' type='xs:string'/>
<xs:element ref='dependencies'/>
<xs:element ref='supersedes'/>
<xs:element ref='supersededby'/>
<xs:element name='shortname' type='xs:NCNAME'/>
<xs:element ref='schemaloc' minOccurs='0' maxOccurs='unbounded'/>
<xs:element name='registry' type='empty' minOccurs='0'/>
<xs:element name='expires' type='xs:string'/>
<xs:element ref='author' minOccurs='0' maxOccurs='unbounded'/>
<xs:element ref='revision' minOccurs='0' maxOccurs='unbounded'/>
</xs:sequence>
</xs:complexType>
</xs:element>

<xs:element name='status'>
<xs:simpleType>
<xs:restriction base='xs:NCNAME'>
<xs:enumeration value='Active'/>
<xs:enumeration value='Deferred'/>
<xs:enumeration value='Deprecated'/>
<xs:enumeration value='Draft'/>
<xs:enumeration value='Experimental'/>
<xs:enumeration value='Final'/>
<xs:enumeration value='Obsolete'/>
<xs:enumeration value='Proposed'/>
<xs:enumeration value='ProtoJEP'/>
<xs:enumeration value='Rejected'/>
<xs:enumeration value='Retracted'/>
</xs:restriction>
</xs:simpleType>
</xs:element>

<xs:element name='type'>
<xs:simpleType>
<xs:restriction base='xs:string'>
<xs:enumeration value='Historical'/>
<xs:enumeration value='Humorous'/>
<xs:enumeration value='Informational'/>
<xs:enumeration value='Organizational'/>
<xs:enumeration value='Standards Track'/>
</xs:restriction>
</xs:simpleType>
</xs:element>

<xs:element name='dependencies'>
<xs:complexType>
<xs:sequence minOccurs='0' maxOccurs='unbounded'>
<xs:element name='spec' type='xs:string'/>
</xs:sequence>
</xs:complexType>
</xs:element>

<xs:element name='supersedes'>
<xs:complexType>
<xs:sequence>
<xs:element name='spec' type='xs:string'/>
</xs:sequence>
</xs:complexType>
</xs:element>

<xs:element name='supersededby'>
<xs:complexType>
<xs:sequence>
<xs:element name='spec' type='xs:string'/>
</xs:sequence>
</xs:complexType>
</xs:element>

<xs:element name='schemaloc'>
<xs:complexType>
<xs:sequence>
<xs:element name='ns' type='xs:string' minOccurs='0'/>
<xs:element name='url' type='xs:string'/>
</xs:sequence>
</xs:complexType>
</xs:element>

<xs:element name='author'>
<xs:complexType>
<xs:sequence>
<xs:element name='firstname' type='xs:string'/>
<xs:element name='surname' type='xs:string'/>
<xs:element name='authornote' type='empty' minOccurs='0'/>
<xs:element name='org' type='xs:string' minOccurs='0'/>
<xs:element name='email' type='xs:string'/>
<xs:element name='jid' type='xs:string' minOccurs='0'/>
</xs:sequence>
</xs:complexType>
</xs:element>

<xs:element name='revision'>
<xs:complexType>
<xs:sequence>
<xs:element name='version' type='xs:string'/>
<xs:element name='date' type='xs:dateTime'/>
<xs:element name='initials' type='xs:NCName'/>
<xs:element ref='remark'/>
</xs:sequence>
</xs:complexType>
</xs:element>

<xs:element name='remark'>
<xs:complexType>
<xs:choice>
<xs:element ref='p' minOccurs='0' maxOccurs='1'/>
<xs:element ref='ul' minOccurs='0' maxOccurs='1'/>
</xs:choice>
</xs:complexType>
</xs:element>

<xs:element name='section1'>
<xs:complexType>
<xs:choice maxOccurs='unbounded'>
<xs:element ref='div' minOccurs='0' maxOccurs='unbounded'/>
<xs:element ref='p' minOccurs='0' maxOccurs='unbounded'/>
<xs:element ref='section2' minOccurs='0' maxOccurs='unbounded'/>
<xs:element ref='example' minOccurs='0' maxOccurs='unbounded'/>
<xs:element ref='code' minOccurs='0' maxOccurs='unbounded'/>
<xs:element ref='ul' minOccurs='0' maxOccurs='unbounded'/>
<xs:element ref='ol' minOccurs='0' maxOccurs='unbounded'/>
</xs:choice&