summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Peters <fpeters@entrouvert.com>2007-03-26 12:58:33 +0000
committerFrederic Peters <fpeters@entrouvert.com>2007-03-26 12:58:33 +0000
commitec6e0af2b11026ba99d63b230e792af5bb9b3ad1 (patch)
treed33e696a498709bf83d44b04a7adb8b28de78373
parent6b77c53a272de13271838a8cf99a6fb8aefd6949 (diff)
downloadlasso-ec6e0af2b11026ba99d63b230e792af5bb9b3ad1.tar.gz
lasso-ec6e0af2b11026ba99d63b230e792af5bb9b3ad1.tar.xz
lasso-ec6e0af2b11026ba99d63b230e792af5bb9b3ad1.zip
website import
-rw-r--r--website/convert-to-static.py281
-rw-r--r--website/ezt.py739
-rw-r--r--website/templates/base.ezt71
-rw-r--r--website/templates/buildlog.ezt85
-rw-r--r--website/templates/changelog.ezt19
-rw-r--r--website/templates/tests.ezt23
-rw-r--r--website/web/buildbox.xml9
-rw-r--r--website/web/css/buildbox.css88
-rw-r--r--website/web/css/lasso.css186
-rw-r--r--website/web/css/lasso.pngbin0 -> 12907 bytes
-rw-r--r--website/web/css/leaf-style.css276
-rw-r--r--website/web/css/my-leaf.jpegbin0 -> 21657 bytes
-rw-r--r--website/web/css/note.pngbin0 -> 2520 bytes
-rw-r--r--website/web/css/warning.pngbin0 -> 3249 bytes
-rw-r--r--website/web/devnotes/id-wsf-stating.html472
l---------website/web/doap.rdf1
-rw-r--r--website/web/doap.rdf.config.xml6
-rw-r--r--website/web/documentation/default.css126
-rw-r--r--website/web/documentation/index.xml47
-rw-r--r--website/web/documentation/interoperability.xml392
-rw-r--r--website/web/documentation/perfs.xml171
-rw-r--r--website/web/documentation/slides/20050201-lasso-solutions-linux.pdfbin0 -> 905265 bytes
-rw-r--r--website/web/download/index.xml118
-rw-r--r--website/web/figures/caution.pngbin0 -> 2369 bytes
-rw-r--r--website/web/figures/important.pngbin0 -> 2592 bytes
-rw-r--r--website/web/figures/lasso.pngbin0 -> 7305 bytes
-rw-r--r--website/web/figures/note.pngbin0 -> 2520 bytes
-rw-r--r--website/web/figures/perfs-sp-libs-large.pngbin0 -> 16948 bytes
-rw-r--r--website/web/figures/perfs-sp-libs.pngbin0 -> 13709 bytes
-rw-r--r--website/web/figures/perfs-sp-stability-large.pngbin0 -> 35996 bytes
-rw-r--r--website/web/figures/perfs-sp-stability.pngbin0 -> 43367 bytes
-rw-r--r--website/web/figures/perfs-sp-stability.svg568
-rw-r--r--website/web/figures/tip.pngbin0 -> 2288 bytes
-rw-r--r--website/web/figures/warning.pngbin0 -> 3249 bytes
-rw-r--r--website/web/index.xml169
-rw-r--r--website/web/license.xml51
-rw-r--r--website/web/links.xml62
-rw-r--r--website/web/mailinglists/index.xml26
-rw-r--r--website/web/news/00-release-0.6.0.xml19
-rw-r--r--website/web/news/01-release-0.6.1.xml18
-rw-r--r--website/web/news/02-slides-solution-linux.xml11
-rw-r--r--website/web/news/03-release-0.6.2.xml18
-rw-r--r--website/web/news/04-release-0.6.3.xml20
-rw-r--r--website/web/news/05-release-0.6.4.xml19
-rw-r--r--website/web/news/06-release-0.6.5.xml16
-rw-r--r--website/web/news/07-saml2.xml11
-rw-r--r--website/web/news/08-release-2.0.0.xml17
-rw-r--r--website/web/news/index.xml10
-rw-r--r--website/web/souk/example-schema.pngbin0 -> 46090 bytes
-rw-r--r--website/web/souk/index.xml197
-rw-r--r--website/web/souk/sp1-sso.pngbin0 -> 59257 bytes
51 files changed, 4342 insertions, 0 deletions
diff --git a/website/convert-to-static.py b/website/convert-to-static.py
new file mode 100644
index 00000000..50293ba2
--- /dev/null
+++ b/website/convert-to-static.py
@@ -0,0 +1,281 @@
+#! /usr/bin/env python
+
+import xml.dom.minidom
+import os
+import stat
+import re
+from cStringIO import StringIO
+import sys
+
+import ezt
+
+base_template = ezt.Template()
+base_template.parse(file('templates/base.ezt').read())
+buildlog_template = ezt.Template()
+buildlog_template.parse(file('templates/buildlog.ezt').read())
+changelog_template = ezt.Template()
+changelog_template.parse(file('templates/changelog.ezt').read())
+tests_template = ezt.Template()
+tests_template.parse(file('templates/tests.ezt').read())
+
+def getText(nodelist):
+ if not nodelist:
+ return None
+ rc = ''
+ for node in nodelist:
+ if node.nodeType == node.TEXT_NODE:
+ rc = rc + node.data
+ return rc.encode('utf-8')
+
+
+class ChangelogFile:
+ def __init__(self, node):
+ for attr in ('name', 'revision'):
+ try:
+ setattr(self, attr, getText(node.getElementsByTagName(attr)[0].childNodes))
+ except IndexError:
+ setattr(self, attr, None)
+
+
+class ChangelogEntry:
+ def __init__(self, node):
+ for attr in ('date', 'weekday', 'time', 'isoDate', 'msg', 'author'):
+ try:
+ setattr(self, attr, getText(node.getElementsByTagName(attr)[0].childNodes))
+ except IndexError:
+ setattr(self, attr, None)
+ self.file = [ChangelogFile(x) for x in node.getElementsByTagName('file')]
+
+
+class TestTest:
+ def __init__(self, node):
+ for attr in ('id', 'description'):
+ try:
+ setattr(self, attr, getText(node.getElementsByTagName(attr)[0].childNodes))
+ except IndexError:
+ setattr(self, attr, None)
+ self.result = node.attributes['result'].value
+
+class TestSuite:
+ def __init__(self, node):
+ for attr in ('title', 'duration'):
+ try:
+ setattr(self, attr, getText(node.getElementsByTagName(attr)[0].childNodes))
+ except IndexError:
+ setattr(self, attr, None)
+ if self.duration:
+ self.duration = '%.4f' % float(self.duration)
+ self.test = [TestTest(x) for x in node.getElementsByTagName('test')]
+ self.len_tests = len(self.test)
+
+
+class Build:
+ def __init__(self, node):
+ for attr in ('date', 'hostname', 'duration', 'buildlog', 'buildlog295', 'changelog'):
+ try:
+ setattr(self, attr, getText(node.getElementsByTagName(attr)[0].childNodes))
+ except IndexError:
+ setattr(self, attr, None)
+
+ self.display_date = '%s-%s-%s' % (self.date[:4], self.date[4:6], self.date[6:8])
+ self.display_hour = '%s:%s' % (self.date[9:11], self.date[11:13])
+
+ for component in ('liblasso', 'java', 'python', 'php', 'perl', 'csharp', 'liblasso295'):
+ try:
+ cnode = [x for x in node.getElementsByTagName(component) if \
+ x.attributes.has_key('buildlog')][0]
+ except IndexError:
+ setattr(self, component + '_status', None)
+ continue
+ setattr(self, component + '_status', getText(cnode.childNodes))
+ setattr(self, component + '_href', cnode.attributes['buildlog'].value.replace('.xml',''))
+
+ for test in ('c', 'python', 'souk'):
+ try:
+ cnode = [x for x in node.getElementsByTagName(test) if \
+ x.attributes.has_key('href')][0]
+ except IndexError:
+ setattr(self, 'tests_' + test + '_status', None)
+ continue
+ setattr(self, 'tests_' + test + '_status', getText(cnode.childNodes))
+ setattr(self, 'tests_' + test + '_href', cnode.attributes['href'].value.replace('.xml', ''))
+
+ if self.changelog:
+ self.changelog = self.changelog.replace('.xml', '')
+ dom_cl = xml.dom.minidom.parse(file('web' + self.changelog + '.xml'))
+ self.last_commit_author = getText(dom_cl.getElementsByTagName('author')[0].childNodes)
+ self.nb_commits = len(dom_cl.getElementsByTagName('entry'))
+
+
+
+re_body = re.compile('<body(.*?)>(.*)</body>', re.DOTALL)
+re_div = re.compile('<div(.*?)>(.*)</div>', re.DOTALL)
+re_title = re.compile('<title>(.*)</title>', re.DOTALL)
+re_summary = re.compile('[a-z]+\.[0-9]{4}.xml')
+
+if not os.path.exists('web-static'):
+ os.mkdir('web-static')
+
+
+for BUILDLOGS_DIR in ('build-logs', 'build-logs-wsf'):
+ if not os.path.exists('web/%s' % BUILDLOGS_DIR):
+ continue
+ if not os.path.exists('web-static/%s' % BUILDLOGS_DIR):
+ os.mkdir('web-static/%s' % BUILDLOGS_DIR)
+
+ for base, dirs, files in os.walk('web/%s' % BUILDLOGS_DIR):
+ if base.endswith('/CVS'):
+ continue
+ for dirname in dirs:
+ src_file = os.path.join(base, dirname)
+ dst_file = 'web-static/' + src_file[4:]
+ if not os.path.exists(dst_file):
+ os.mkdir(dst_file)
+ for filename in files:
+ if filename[0] == '.':
+ continue
+ src_file = os.path.join(base, filename)
+ dst_file = 'web-static/' + src_file[4:].replace('.xml', '.html')
+ if os.path.exists(dst_file) and \
+ os.stat(dst_file)[stat.ST_MTIME] >= os.stat(src_file)[stat.ST_MTIME]:
+ continue
+ if src_file.endswith('.log'):
+ os.link(src_file, dst_file)
+ continue
+ if src_file.endswith('.html'):
+ try:
+ body = re_body.findall(file(src_file).read())[0][1].strip()
+ except IndexError:
+ raise "no body found"
+ fd = StringIO()
+ base_template.generate(fd, {'body': body, 'title': 'Build Log', 'section': 'buildbox'})
+ open(dst_file, 'w').write(fd.getvalue())
+ continue
+
+ try:
+ dom = xml.dom.minidom.parse(file(src_file))
+ except:
+ continue
+ type = dom.childNodes[0].nodeName
+ if type == 'changelog':
+ entries = [ChangelogEntry(x) for x in dom.getElementsByTagName('entry')]
+ fd = StringIO()
+ changelog_template.generate(fd, {'entry': entries})
+ body = fd.getvalue()
+ fd = StringIO()
+ base_template.generate(fd, {'body': body, 'title': 'ChangeLog', 'section': 'buildbox'})
+ open(dst_file, 'w').write(fd.getvalue())
+
+ if type == 'testsuites':
+ datetime = getText(dom.getElementsByTagName('datetime')[0].childNodes)
+ title = getText(dom.getElementsByTagName('title')[0].childNodes)
+ suites = [TestSuite(x) for x in dom.getElementsByTagName('suite')]
+ fd = StringIO()
+ tests_template.generate(fd, {'datetime': datetime, 'title': title,
+ 'suite': suites})
+ body = fd.getvalue()
+ fd = StringIO()
+ base_template.generate(fd, {'body': body,
+ 'title': 'Test Suite - %s' % title, 'section': 'buildbox'})
+ open(dst_file, 'w').write(fd.getvalue())
+
+
+ day_dirs = os.listdir('web/%s/' % BUILDLOGS_DIR)
+ day_dirs.sort()
+ day_dirs.reverse()
+ day_dirs = day_dirs[:20]
+
+ main_page = []
+
+ for base, dirs, files in os.walk('web/%s' % BUILDLOGS_DIR):
+ for dirname in dirs:
+ if dirname in day_dirs:
+ for t in [x for x in os.listdir(os.path.join(base, dirname)) if re_summary.match(x)]:
+ main_page.append(os.path.join(base, dirname, t))
+
+ main_page.sort()
+ main_page.reverse()
+ main_page = main_page[:20]
+ builds = []
+ for filename in main_page:
+ builds.append( Build(xml.dom.minidom.parse(filename)) )
+ if len(builds) > 1 and builds[-2].date[:8] == builds[-1].date[:8]:
+ builds[-1].display_date = ''
+
+ fd = StringIO()
+ buildlog_template.generate(fd, {'build': builds})
+ body = fd.getvalue()
+ fd = StringIO()
+ base_template.generate(fd, {'body': body, 'title': 'Build Box', 'section': 'buildbox'})
+ if BUILDLOGS_DIR == 'build-logs':
+ open('web-static/buildbox.html', 'w').write(fd.getvalue())
+ elif BUILDLOGS_DIR == 'build-logs-wsf':
+ open('web-static/buildbox-wsf.html', 'w').write(fd.getvalue())
+
+for base, dirs, files in os.walk('web'):
+ if '/build-logs' in base or '/news/' in base:
+ continue
+ if base.endswith('CVS'):
+ continue
+ for dirname in dirs:
+ if dirname in ('CVS', 'news'):
+ continue
+ src_file = os.path.join(base, dirname)
+ dst_file = 'web-static/' + src_file[4:]
+ if not os.path.exists(dst_file):
+ os.mkdir(dst_file)
+ for filename in files:
+ if filename in ('.cvsignore', 'buildbox.xml'):
+ continue
+ if filename[0] == '.':
+ continue
+ basename, ext = os.path.splitext(filename)
+ src_file = os.path.join(base, filename)
+ dst_file = 'web-static/' + src_file[4:]
+
+ if os.path.exists(dst_file) and \
+ os.stat(dst_file)[stat.ST_MTIME] >= os.stat(src_file)[stat.ST_MTIME]:
+ continue
+
+ if ext not in ('.html', '.xml') or filename.startswith('doap.') or \
+ 'api-reference' in src_file:
+ if os.path.exists(dst_file):
+ os.unlink(dst_file)
+ os.link(src_file, dst_file)
+ continue
+
+ type = None
+ if ext == '.xml':
+ try:
+ dom = xml.dom.minidom.parse(file(src_file))
+ except:
+ print src_file
+ raise
+ type = dom.childNodes[0].nodeName
+ dst_file = dst_file.replace('.xml', '.html')
+
+ news = None
+ if dst_file == 'web-static/index.html':
+ news_files = [x for x in os.listdir('web/news/') if x.endswith('.xml') and x[2] == '-']
+ news_files.sort()
+ news_files.reverse()
+ news_files = news_files[:3]
+ news = []
+ for f in news_files:
+ news.append('<div>%s</div>' % re_div.findall(file(os.path.join('web/news/', f)).read())[0][1].strip())
+ news = '\n'.join(news)
+
+ section = src_file.split('/')[1].replace('.xml', '')
+ if ext == '.html' or type == 'html':
+ content = file(src_file).read()
+ try:
+ body = re_body.findall(content)[0][1].strip()
+ except IndexError:
+ raise "no body found"
+ title = re_title.findall(content)[0]
+ fd = StringIO()
+ base_template.generate(fd, {'body': body, 'title': title, 'section': section,
+ 'news': news})
+ open(dst_file, 'w').write(fd.getvalue())
+ continue
+
diff --git a/website/ezt.py b/website/ezt.py
new file mode 100644
index 00000000..01c39a6b
--- /dev/null
+++ b/website/ezt.py
@@ -0,0 +1,739 @@
+#!/usr/bin/env python
+"""ezt.py -- easy templating
+
+ezt templates are simply text files in whatever format you so desire
+(such as XML, HTML, etc.) which contain directives sprinkled
+throughout. With these directives it is possible to generate the
+dynamic content from the ezt templates.
+
+These directives are enclosed in square brackets. If you are a
+C-programmer, you might be familar with the #ifdef directives of the C
+preprocessor 'cpp'. ezt provides a similar concept. Additionally EZT
+has a 'for' directive, which allows it to iterate (repeat) certain
+subsections of the template according to sequence of data items
+provided by the application.
+
+The final rendering is performed by the method generate() of the Template
+class. Building template instances can either be done using external
+EZT files (convention: use the suffix .ezt for such files):
+
+ >>> template = Template("../templates/log.ezt")
+
+or by calling the parse() method of a template instance directly with
+a EZT template string:
+
+ >>> template = Template()
+ >>> template.parse('''<html><head>
+ ... <title>[title_string]</title></head>
+ ... <body><h1>[title_string]</h1>
+ ... [for a_sequence] <p>[a_sequence]</p>
+ ... [end] <hr>
+ ... The [person] is [if-any state]in[else]out[end].
+ ... </body>
+ ... </html>
+ ... ''')
+
+The application should build a dictionary 'data' and pass it together
+with the output fileobject to the templates generate method:
+
+ >>> data = {'title_string' : "A Dummy Page",
+ ... 'a_sequence' : ['list item 1', 'list item 2', 'another element'],
+ ... 'person': "doctor",
+ ... 'state' : None }
+ >>> import sys
+ >>> template.generate(sys.stdout, data)
+ <html><head>
+ <title>A Dummy Page</title></head>
+ <body><h1>A Dummy Page</h1>
+ <p>list item 1</p>
+ <p>list item 2</p>
+ <p>another element</p>
+ <hr>
+ The doctor is out.
+ </body>
+ </html>
+
+Template syntax error reporting should be improved. Currently it is
+very sparse (template line numbers would be nice):
+
+ >>> Template().parse("[if-any where] foo [else] bar [end unexpected args]")
+ Traceback (innermost last):
+ File "<stdin>", line 1, in ?
+ File "ezt.py", line 220, in parse
+ self.program = self._parse(text)
+ File "ezt.py", line 275, in _parse
+ raise ArgCountSyntaxError(str(args[1:]))
+ ArgCountSyntaxError: ['unexpected', 'args']
+ >>> Template().parse("[if unmatched_end]foo[end]")
+ Traceback (innermost last):
+ File "<stdin>", line 1, in ?
+ File "ezt.py", line 206, in parse
+ self.program = self._parse(text)
+ File "ezt.py", line 266, in _parse
+ raise UnmatchedEndError()
+ UnmatchedEndError
+
+
+Directives
+==========
+
+ Several directives allow the use of dotted qualified names refering to objects
+ or attributes of objects contained in the data dictionary given to the
+ .generate() method.
+
+ Qualified names
+ ---------------
+
+ Qualified names have two basic forms: a variable reference, or a string
+ constant. References are a name from the data dictionary with optional
+ dotted attributes (where each intermediary is an object with attributes,
+ of course).
+
+ Examples:
+
+ [varname]
+
+ [ob.attr]
+
+ ["string"]
+
+ Simple directives
+ -----------------
+
+ [QUAL_NAME]
+
+ This directive is simply replaced by the value of the qualified name.
+ If the value is a number it's converted to a string before being
+ outputted. If it is None, nothing is outputted. If it is a python file
+ object (i.e. any object with a "read" method), it's contents are
+ outputted. If it is a callback function (any callable python object
+ is assumed to be a callback function), it is invoked and passed an EZT
+ printer function as an argument.
+
+ [QUAL_NAME QUAL_NAME ...]
+
+ If the first value is a callback function, it is invoked with the
+ output file pointer as a first argument, and the rest of the values as
+ additional arguments.
+
+ Otherwise, the first value defines a substitution format, specifying
+ constant text and indices of the additional arguments. The arguments
+ are substituted and the result is inserted into the output stream.
+
+ Example:
+ ["abc %0 def %1 ghi %0" foo bar.baz]
+
+ Note that the first value can be any type of qualified name -- a string
+ constant or a variable reference. Use %% to substitute a percent sign.
+ Argument indices are 0-based.
+
+ [include "filename"] or [include QUAL_NAME]
+
+ This directive is replaced by content of the named include file. Note
+ that a string constant is more efficient -- the target file is compiled
+ inline. In the variable form, the target file is compiled and executed
+ at runtime.
+
+ Block directives
+ ----------------
+
+ [for QUAL_NAME] ... [end]
+
+ The text within the [for ...] directive and the corresponding [end]
+ is repeated for each element in the sequence referred to by the
+ qualified name in the for directive. Within the for block this
+ identifiers now refers to the actual item indexed by this loop
+ iteration.
+
+ [if-any QUAL_NAME [QUAL_NAME2 ...]] ... [else] ... [end]
+
+ Test if any QUAL_NAME value is not None or an empty string or list.
+ The [else] clause is optional. CAUTION: Numeric values are
+ converted to string, so if QUAL_NAME refers to a numeric value 0,
+ the then-clause is substituted!
+
+ [if-index INDEX_FROM_FOR odd] ... [else] ... [end]
+ [if-index INDEX_FROM_FOR even] ... [else] ... [end]
+ [if-index INDEX_FROM_FOR first] ... [else] ... [end]
+ [if-index INDEX_FROM_FOR last] ... [else] ... [end]
+ [if-index INDEX_FROM_FOR NUMBER] ... [else] ... [end]
+
+ These five directives work similar to [if-any], but are only useful
+ within a [for ...]-block (see above). The odd/even directives are
+ for example useful to choose different background colors for
+ adjacent rows in a table. Similar the first/last directives might
+ be used to remove certain parts (for example "Diff to previous"
+ doesn't make sense, if there is no previous).
+
+ [is QUAL_NAME STRING] ... [else] ... [end]
+ [is QUAL_NAME QUAL_NAME] ... [else] ... [end]
+
+ The [is ...] directive is similar to the other conditional
+ directives above. But it allows to compare two value references or
+ a value reference with some constant string.
+
+ [define VARIABLE] ... [end]
+
+ The [define ...] directive allows you to create and modify template
+ variables from within the template itself. Essentially, any data
+ between inside the [define ...] and its matching [end] will be
+ expanded using the other template parsing and output generation
+ rules, and then stored as a string value assigned to the variable
+ VARIABLE. The new (or changed) variable is then available for use
+ with other mechanisms such as [is ...] or [if-any ...], as long as
+ they appear later in the template.
+
+ [format STRING] ... [end]
+
+ The format directive controls how the values substituted into
+ templates are escaped before they are put into the output stream. It
+ has no effect on the literal text of the templates, only the output
+ from [QUAL_NAME ...] directives. STRING can be one of "raw" "html"
+ or "xml". The "raw" mode leaves the output unaltered. The "html" and
+ "xml" modes escape special characters using entity escapes (like
+ &quot; and &gt;)
+"""
+#
+# Copyright (C) 2001-2005 Greg Stein. All Rights Reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+#
+# This software is maintained by Greg and is available at:
+# http://svn.webdav.org/repos/projects/ezt/trunk/
+#
+
+import string
+import re
+from types import StringType, IntType, FloatType, LongType
+import os
+import cgi
+try:
+ import cStringIO
+except ImportError:
+ import StringIO
+ cStringIO = StringIO
+
+#
+# Formatting types
+#
+FORMAT_RAW = 'raw'
+FORMAT_HTML = 'html'
+FORMAT_XML = 'xml'
+
+#
+# This regular expression matches three alternatives:
+# expr: DIRECTIVE | BRACKET | COMMENT
+# DIRECTIVE: '[' ITEM (whitespace ITEM)* ']
+# ITEM: STRING | NAME
+# STRING: '"' (not-slash-or-dquote | '\' anychar)* '"'
+# NAME: (alphanum | '_' | '-' | '.')+
+# BRACKET: '[[]'
+# COMMENT: '[#' not-rbracket* ']'
+#
+# When used with the split() method, the return value will be composed of
+# non-matching text and the two paren groups (DIRECTIVE and BRACKET). Since
+# the COMMENT matches are not placed into a group, they are considered a
+# "splitting" value and simply dropped.
+#
+_item = r'(?:"(?:[^\\"]|\\.)*"|[-\w.]+)'
+_re_parse = re.compile(r'\[(%s(?: +%s)*)\]|(\[\[\])|\[#[^\]]*\]' % (_item, _item))
+
+_re_args = re.compile(r'"(?:[^\\"]|\\.)*"|[-\w.]+')
+
+# block commands and their argument counts
+_block_cmd_specs = { 'if-index':2, 'for':1, 'is':2, 'define':1, 'format':1 }
+_block_cmds = _block_cmd_specs.keys()
+
+# two regular expresssions for compressing whitespace. the first is used to
+# compress any whitespace including a newline into a single newline. the
+# second regex is used to compress runs of whitespace into a single space.
+_re_newline = re.compile('[ \t\r\f\v]*\n\\s*')
+_re_whitespace = re.compile(r'\s\s+')
+
+# this regex is used to substitute arguments into a value. we split the value,
+# replace the relevant pieces, and then put it all back together. splitting
+# will produce a list of: TEXT ( splitter TEXT )*. splitter will be '%' or
+# an integer.
+_re_subst = re.compile('%(%|[0-9]+)')
+
+class Template:
+
+ _printers = {
+ FORMAT_RAW : '_cmd_print',
+ FORMAT_HTML : '_cmd_print_html',
+ FORMAT_XML : '_cmd_print_xml',
+ }
+
+ def __init__(self, fname=None, compress_whitespace=1,
+ base_format=FORMAT_RAW):
+ self.compress_whitespace = compress_whitespace
+ if fname:
+ self.parse_file(fname, base_format)
+
+ def parse_file(self, fname, base_format=FORMAT_RAW):
+ "fname -> a string object with pathname of file containg an EZT template."
+
+ self.parse(_FileReader(fname), base_format)
+
+ def parse(self, text_or_reader, base_format=FORMAT_RAW):
+ """Parse the template specified by text_or_reader.
+
+ The argument should be a string containing the template, or it should
+ specify a subclass of ezt.Reader which can read templates. The base
+ format for printing values is given by base_format.
+ """
+ if not isinstance(text_or_reader, Reader):
+ # assume the argument is a plain text string
+ text_or_reader = _TextReader(text_or_reader)
+
+ printer = getattr(self, self._printers[base_format])
+ self.program = self._parse(text_or_reader, base_printer=printer)
+
+ def generate(self, fp, data):
+ if hasattr(data, '__getitem__') or callable(getattr(data, 'keys', None)):
+ # a dictionary-like object was passed. convert it to an
+ # attribute-based object.
+ class _data_ob:
+ def __init__(self, d):
+ vars(self).update(d)
+ data = _data_ob(data)
+
+ ctx = _context()
+ ctx.data = data
+ ctx.for_index = { }
+ ctx.defines = { }
+ self._execute(self.program, fp, ctx)
+
+ def _parse(self, reader, for_names=None, file_args=(), base_printer=None):
+ """text -> string object containing the template.
+
+ This is a private helper function doing the real work for method parse.
+ It returns the parsed template as a 'program'. This program is a sequence
+ made out of strings or (function, argument) 2-tuples.
+
+ Note: comment directives [# ...] are automatically dropped by _re_parse.
+ """
+
+ # parse the template program into: (TEXT DIRECTIVE BRACKET)* TEXT
+ parts = _re_parse.split(reader.text)
+
+ program = [ ]
+ stack = [ ]
+ if not for_names:
+ for_names = [ ]
+
+ if base_printer:
+ printers = [ base_printer ]
+ else:
+ printers = [ self._cmd_print ]
+
+ for i in range(len(parts)):
+ piece = parts[i]
+ which = i % 3 # discriminate between: TEXT DIRECTIVE BRACKET
+ if which == 0:
+ # TEXT. append if non-empty.
+ if piece:
+ if self.compress_whitespace:
+ piece = _re_whitespace.sub(' ', _re_newline.sub('\n', piece))
+ program.append(piece)
+ elif which == 2:
+ # BRACKET directive. append '[' if present.
+ if piece:
+ program.append('[')
+ elif piece:
+ # DIRECTIVE is present.
+ args = _re_args.findall(piece)
+ cmd = args[0]
+ if cmd == 'else':
+ if len(args) > 1:
+ raise ArgCountSyntaxError(str(args[1:]))
+ ### check: don't allow for 'for' cmd
+ idx = stack[-1][1]
+ true_section = program[idx:]
+ del program[idx:]
+ stack[-1][3] = true_section
+ elif cmd == 'end':
+ if len(args) > 1:
+ raise ArgCountSyntaxError(str(args[1:]))
+ # note: true-section may be None
+ try:
+ cmd, idx, args, true_section = stack.pop()
+ except IndexError:
+ raise UnmatchedEndError()
+ else_section = program[idx:]
+ if cmd == 'format':
+ printers.pop()
+ else:
+ func = getattr(self, '_cmd_' + re.sub('-', '_', cmd))
+ program[idx:] = [ (func, (args, true_section, else_section)) ]
+ if cmd == 'for':
+ for_names.pop()
+ elif cmd in _block_cmds:
+ if len(args) > _block_cmd_specs[cmd] + 1:
+ raise ArgCountSyntaxError(str(args[1:]))
+ ### this assumes arg1 is always a ref unless cmd is 'define'
+ if cmd != 'define':
+ args[1] = _prepare_ref(args[1], for_names, file_args)
+
+ # handle arg2 for the 'is' command
+ if cmd == 'is':
+ args[2] = _prepare_ref(args[2], for_names, file_args)
+ elif cmd == 'for':
+ for_names.append(args[1][0]) # append the refname
+ elif cmd == 'format':
+ if args[1][0]:
+ raise BadFormatConstantError(str(args[1:]))
+ funcname = self._printers.get(args[1][1])
+ if not funcname:
+ raise UnknownFormatConstantError(str(args[1:]))
+ printers.append(getattr(self, funcname))
+
+ # remember the cmd, current pos, args, and a section placeholder
+ stack.append([cmd, len(program), args[1:], None])
+ elif cmd == 'include':
+ if args[1][0] == '"':
+ include_filename = args[1][1:-1]
+ f_args = [ ]
+ for arg in args[2:]:
+ f_args.append(_prepare_ref(arg, for_names, file_args))
+ program.extend(self._parse(reader.read_other(include_filename),
+ for_names, f_args, printers[-1]))
+ else:
+ if len(args) != 2:
+ raise ArgCountSyntaxError(str(args))
+ program.append((self._cmd_include,
+ (_prepare_ref(args[1], for_names, file_args),
+ reader)))
+ elif cmd == 'if-any':
+ f_args = [ ]
+ for arg in args[1:]:
+ f_args.append(_prepare_ref(arg, for_names, file_args))
+ stack.append(['if-any', len(program), f_args, None])
+ else:
+ # implied PRINT command
+ f_args = [ ]
+ for arg in args:
+ f_args.append(_prepare_ref(arg, for_names, file_args))
+ program.append((printers[-1], f_args))
+
+ if stack:
+ ### would be nice to say which blocks...
+ raise UnclosedBlocksError()
+ return program
+
+ def _execute(self, program, fp, ctx):
+ """This private helper function takes a 'program' sequence as created
+ by the method '_parse' and executes it step by step. strings are written
+ to the file object 'fp' and functions are called.
+ """
+ for step in program:
+ if isinstance(step, StringType):
+ fp.write(step)
+ else:
+ step[0](step[1], fp, ctx)
+
+ def _cmd_print(self, valref, fp, ctx):
+ _write_value(valref, fp, ctx)
+
+ def _cmd_print_html(self, valref, fp, ctx):
+ _write_value(valref, fp, ctx, cgi.escape)
+
+ def _cmd_print_xml(self, valref, fp, ctx):
+ ### use the same quoting as HTML for now
+ self._cmd_print_html(valref, fp, ctx)
+
+ def _cmd_include(self, (valref, reader), fp, ctx):
+ fname = _get_value(valref, ctx)
+ ### note: we don't have the set of for_names to pass into this parse.
+ ### I don't think there is anything to do but document it. we also
+ ### don't have a current format (since that is a compile-time concept).
+ self._execute(self._parse(reader.read_other(fname)), fp, ctx)
+
+ def _cmd_if_any(self, args, fp, ctx):
+ "If any value is a non-empty string or non-empty list, then T else F."
+ (valrefs, t_section, f_section) = args
+ value = 0
+ for valref in valrefs:
+ if _get_value(valref, ctx):
+ value = 1
+ break
+ self._do_if(value, t_section, f_section, fp, ctx)
+
+ def _cmd_if_index(self, args, fp, ctx):
+ ((valref, value), t_section, f_section) = args
+ list, idx = ctx.for_index[valref[0]]
+ if value == 'even':
+ value = idx % 2 == 0
+ elif value == 'odd':
+ value = idx % 2 == 1
+ elif value == 'first':
+ value = idx == 0
+ elif value == 'last':
+ value = idx == len(list)-1
+ else:
+ value = idx == int(value)
+ self._do_if(value, t_section, f_section, fp, ctx)
+
+ def _cmd_is(self, args, fp, ctx):
+ ((left_ref, right_ref), t_section, f_section) = args
+ value = _get_value(right_ref, ctx)
+ value = string.lower(_get_value(left_ref, ctx)) == string.lower(value)
+ self._do_if(value, t_section, f_section, fp, ctx)
+
+ def _do_if(self, value, t_section, f_section, fp, ctx):
+ if t_section is None:
+ t_section = f_section
+ f_section = None
+ if value:
+ section = t_section
+ else:
+ section = f_section
+ if section is not None:
+ self._execute(section, fp, ctx)
+
+ def _cmd_for(self, args, fp, ctx):
+ ((valref,), unused, section) = args
+ list = _get_value(valref, ctx)
+ if isinstance(list, StringType):
+ raise NeedSequenceError()
+ refname = valref[0]
+ ctx.for_index[refname] = idx = [ list, 0 ]
+ for item in list:
+ self._execute(section, fp, ctx)
+ idx[1] = idx[1] + 1
+ del ctx.for_index[refname]
+
+ def _cmd_define(self, args, fp, ctx):
+ ((name,), unused, section) = args
+ valfp = cStringIO.StringIO()
+ if section is not None:
+ self._execute(section, valfp, ctx)
+ ctx.defines[name] = valfp.getvalue()
+
+def boolean(value):
+ "Return a value suitable for [if-any bool_var] usage in a template."
+ if value:
+ return 'yes'
+ return None
+
+
+def _prepare_ref(refname, for_names, file_args):
+ """refname -> a string containing a dotted identifier. example:"foo.bar.bang"
+ for_names -> a list of active for sequences.
+
+ Returns a `value reference', a 3-tuple made out of (refname, start, rest),
+ for fast access later.
+ """
+ # is the reference a string constant?
+ if refname[0] == '"':
+ return None, refname[1:-1], None
+
+ parts = string.split(refname, '.')
+ start = parts[0]
+ rest = parts[1:]
+
+ # if this is an include-argument, then just return the prepared ref
+ if start[:3] == 'arg':
+ try:
+ idx = int(start[3:])
+ except ValueError:
+ pass
+ else:
+ if idx < len(file_args):
+ orig_refname, start, more_rest = file_args[idx]
+ if more_rest is None:
+ # the include-argument was a string constant
+ return None, start, None
+
+ # prepend the argument's "rest" for our further processing
+ rest[:0] = more_rest
+
+ # rewrite the refname to ensure that any potential 'for' processing
+ # has the correct name
+ ### this can make it hard for debugging include files since we lose
+ ### the 'argNNN' names
+ if not rest:
+ return start, start, [ ]
+ refname = start + '.' + string.join(rest, '.')
+
+ if for_names:
+ # From last to first part, check if this reference is part of a for loop
+ for i in range(len(parts), 0, -1):
+ name = string.join(parts[:i], '.')
+ if name in for_names:
+ return refname, name, parts[i:]
+
+ return refname, start, rest
+
+def _get_value((refname, start, rest), ctx):
+ """(refname, start, rest) -> a prepared `value reference' (see above).
+ ctx -> an execution context instance.
+
+ Does a name space lookup within the template name space. Active
+ for blocks take precedence over data dictionary members with the
+ same name.
+ """
+ if rest is None:
+ # it was a string constant
+ return start
+
+ # get the starting object
+ if ctx.for_index.has_key(start):
+ list, idx = ctx.for_index[start]
+ ob = list[idx]
+ elif ctx.defines.has_key(start):
+ ob = ctx.defines[start]
+ elif hasattr(ctx.data, start):
+ ob = getattr(ctx.data, start)
+ else:
+ raise UnknownReference(refname)
+
+ # walk the rest of the dotted reference
+ for attr in rest:
+ try:
+ ob = getattr(ob, attr)
+ except AttributeError:
+ raise UnknownReference(refname)
+
+ # make sure we return a string instead of some various Python types
+ if isinstance(ob, IntType) \
+ or isinstance(ob, LongType) \
+ or isinstance(ob, FloatType):
+ return str(ob)
+ if ob is None:
+ return ''
+
+ # string or a sequence
+ return ob
+
+def _write_value(valrefs, fp, ctx, format=lambda s: s):
+ value = _get_value(valrefs[0], ctx)
+ args = map(lambda valref, ctx=ctx: _get_value(valref, ctx), valrefs[1:])
+
+ # if the value has a 'read' attribute, then it is a stream: copy it
+ if hasattr(value, 'read'):
+ while 1:
+ chunk = value.read(16384)
+ if not chunk:
+ break
+ fp.write(format(chunk))
+
+ # value is a callback function: call with file pointer and extra args
+ elif callable(value):
+ apply(value, [fp] + args)
+
+ # value is a substitution pattern
+ elif args:
+ parts = _re_subst.split(value)
+ for i in range(len(parts)):
+ piece = parts[i]
+ if i%2 == 1 and piece != '%':
+ idx = int(piece)
+ if idx < len(args):
+ piece = args[idx]
+ else:
+ piece = '<undef>'
+ if format:
+ fp.write(format(piece))
+
+ # plain old value, write to output
+ else:
+ fp.write(format(value))
+
+
+class _context:
+ """A container for the execution context"""
+
+
+class Reader:
+ "Abstract class which allows EZT to detect Reader objects."
+
+class _FileReader(Reader):
+ """Reads templates from the filesystem."""
+ def __init__(self, fname):
+ self.text = open(fname, 'rb').read()
+ self._dir = os.path.dirname(fname)
+ def read_other(self, relative):
+ return _FileReader(os.path.join(self._dir, relative))
+
+class _TextReader(Reader):
+ """'Reads' a template from provided text."""
+ def __init__(self, text):
+ self.text = text
+ def read_other(self, relative):
+ raise BaseUnavailableError()
+
+
+class EZTException(Exception):
+ """Parent class of all EZT exceptions."""
+
+class ArgCountSyntaxError(EZTException):
+ """A bracket directive got the wrong number of arguments."""
+
+class UnknownReference(EZTException):
+ """The template references an object not contained in the data dictionary."""
+
+class NeedSequenceError(EZTException):
+ """The object dereferenced by the template is no sequence (tuple or list)."""
+
+class UnclosedBlocksError(EZTException):
+ """This error may be simply a missing [end]."""
+
+class UnmatchedEndError(EZTException):
+ """This error may be caused by a misspelled if directive."""
+
+class BaseUnavailableError(EZTException):
+ """Base location is unavailable, which disables includes."""
+
+class BadFormatConstantError(EZTException):
+ """Format specifiers must be string constants."""
+
+class UnknownFormatConstantError(EZTException):
+ """The format specifier is an unknown value."""
+
+
+# --- standard test environment ---
+def test_parse():
+ assert _re_parse.split('[a]') == ['', '[a]', None, '']
+ assert _re_parse.split('[a] [b]') == \
+ ['', '[a]', None, ' ', '[b]', None, '']
+ assert _re_parse.split('[a c] [b]') == \
+ ['', '[a c]', None, ' ', '[b]', None, '']
+ assert _re_parse.split('x [a] y [b] z') == \
+ ['x ', '[a]', None, ' y ', '[b]', None, ' z']
+ assert _re_parse.split('[a "b" c "d"]') == \
+ ['', '[a "b" c "d"]', None, '']
+ assert _re_parse.split(r'["a \"b[foo]" c.d f]') == \
+ ['', '["a \\"b[foo]" c.d f]', None, '']
+
+def _test(argv):
+ import doctest, ezt
+ verbose = "-v" in argv
+ return doctest.testmod(ezt, verbose=verbose)
+
+if __name__ == "__main__":
+ # invoke unit test for this module:
+ import sys
+ sys.exit(_test(sys.argv)[0])
diff --git a/website/templates/base.ezt b/website/templates/base.ezt
new file mode 100644
index 00000000..e42c1c87
--- /dev/null
+++ b/website/templates/base.ezt
@@ -0,0 +1,71 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Lasso[if-any title] - [title][end]</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<link rel="stylesheet" type="text/css" href="/css/leaf-style.css" />
+[is section "buildbox"]
+<link rel="stylesheet" type="text/css" href="/css/buildbox.css" />
+[end]
+[is section "documentation"]
+<link rel="stylesheet" href="/documentation/default.css" type="text/css" />
+[end]
+<link rel="meta" title="DOAP" type="application/rdf+xml" href="http://lasso.entrouvert.org/doap.rdf"/>
+</head>
+<body>
+ <div id="shadow-wrapper">
+ <div id="page"[is section "buildbox"] class="buildbox"[end]>
+ <div id="header">
+ <h1><img src="/css/lasso.png" alt="Lasso"/></h1>
+ <span>Free Liberty Alliance Implementation</span>
+ </div>
+
+ <div id="navbar">
+ <ul>
+ <li><a[is section "index"] class="here"[end]
+ href="/">Home</a></li>
+ <li><a[is section "documentation"] class="here"[end]
+ href="/documentation/">Documentation</a></li>
+ <li><a[is section "download"] class="here"[end]
+ href="/download/">Download</a></li>
+ <li><a href="http://www.entrouvert.com">Entr'ouvert</a></li>
+ </ul>
+ </div>
+
+<div id="quicklinks">
+<div id="morelinks">
+ <h2>Resources</h2>
+ <ul>
+ <li[is section "mailinglists"] id="current"[end]>
+ <a href="/mailinglists/">Mailing Lists</a></li>
+ <li[is section "buildbox"] id="current"[end]>
+ <a href="/buildbox">CVS Status</a></li>
+ <li[is section "links"] id="current"[end]>
+ <a href="/links">Related Links</a></li>
+ <li><a href="http://labs.libre-entreprise.org/tracker/?atid=206&amp;group_id=31&amp;func=browse">Bug
+ reports</a></li>
+ </ul>
+</div>
+
+ [is section "index"]
+ <div id="news">
+ <h2>News</h2>
+ [news]
+ </div>
+ [end]
+</div>
+
+ <div id="content">
+ [is section "buildbox"]<h1>CVS Status</h1>[end]
+ [body]
+
+ <div id="copyright">
+ Copyright © 2004, 2005, 2006 Entr'ouvert
+ </div>
+
+ </div>
+
+ </div> <!-- page -->
+ </div> <!-- shadowwrapper -->
+
+ </body>
+</html>
diff --git a/website/templates/buildlog.ezt b/website/templates/buildlog.ezt
new file mode 100644
index 00000000..d9b1d3e0
--- /dev/null
+++ b/website/templates/buildlog.ezt
@@ -0,0 +1,85 @@
+<table>
+<thead>
+ <tr>
+ <th rowspan="2">Build time</th>
+ <th colspan="3">Changes</th>
+ <th colspan="2">Compilation</th>
+ <th colspan="6">Components</th>
+ <th colspan="3">Tests</th>
+ </tr>
+ <tr id="line2">
+ <th>Nb</th> <th>Log</th> <th>Guilty<a href="#note-guilty">*</a></th>
+ <th>Duration</th> <th>Build log</th>
+ <th>Lib C</th> <th>Python</th> <th>PHP</th> <th>Perl</th> <th>Java</th> <th>C#</th>
+ <th>Lib C</th> <th>Python</th> <th><a href="/souk/">Souk</a></th>
+ </tr>
+</thead>
+<tbody>
+ [for build]
+ <tr class="[if-index build even]even[else]odd[end]">
+ <td class="buildtime">
+ [build.display_date]&nbsp;[build.display_hour]
+ </td>
+ <td>
+ [if-any build.changelog][build.nb_commits][else] [end]
+ </td>
+ <td>
+ [if-any build.changelog]<a href="[build.changelog]">C</a>[else] [end]
+ </td>
+ <td>
+ [if-any build.changelog][build.last_commit_author][else] [end]
+ </td>
+ <td>[build.duration]</td>
+ <td>
+ [if-any build.buildlog] <a href="[build.buildlog]">3.3</a>&nbsp;[end][if-any build.buildlog295]&nbsp;/&nbsp;<a href="[build.buildlog295]">2.95</a> [end]
+ </td>
+ <td class="[build.liblasso_status]">
+ [is build.liblasso_status "ok"] [is build.liblasso295_status "ok"]  [else]
+ <a href="[build.liblasso295_href]">L</a> [end]
+ [else] <a href="[build.liblasso_href]">L</a> [end]
+ </td>
+ [if-any build.python_status]
+ <td class="[build.python_status]">
+ [is build.python_status "ok"] [else] <a href="[build.python_href]">L</a> [end]
+ </td>[else]<td> </td>[end]
+ [if-any build.php_status]
+ <td class="[build.php_status]">
+ [is build.php_status "ok"] [else] <a href="[build.php_href]">L</a> [end]
+ </td>[else]<td> </td>[end]
+ [if-any build.perl_status]
+ <td class="[build.perl_status]">
+ [is build.perl_status "ok"] [else] <a href="[build.perl_href]">L</a> [end]
+ </td>[else]<td> </td>[end]
+ [if-any build.java_status]
+ <td class="[build.java_status]">
+ [is build.java_status "ok"] [else] <a href="[build.java_href]">L</a> [end]
+ </td>[else]<td> </td>[end]
+ [if-any build.csharp_status]
+ <td class="[build.csharp_status]">
+ [is build.csharp_status "ok"] [else] <a href="[build.csharp_href]">L</a> [end]
+ </td>[else]<td> </td>[end]
+
+ <!-- tests -->
+
+ [if-any build.tests_c_status]
+ <td class="[build.tests_c_status]">
+ [is build.tests_c_status "ok"] [else] <a href="[build.tests_c_href]">L</a> [end]
+ </td>[else]<td> </td>[end]
+
+ [if-any build.tests_python_status]
+ <td class="[build.tests_python_status]">
+ [is build.tests_python_status "ok"] [else] <a href="[build.tests_python_href]">L</a> [end]
+ </td>[else]<td> </td>[end]
+
+ [if-any build.tests_souk_status]
+ <td class="[build.tests_souk_status]">
+ [is build.tests_souk_status "ok"] [else] <a href="[build.tests_souk_href]">L</a> [end]
+ </td>[else]<td> </td>[end]
+ </tr>
+ [end]
+</tbody>
+</table>
+<p id="note-guilty">
+ <strong>Note:</strong> the "guilty" columns only gives the name of the most
+ recent commiter for the time period.
+</p>
diff --git a/website/templates/changelog.ezt b/website/templates/changelog.ezt
new file mode 100644
index 00000000..69235cf7
--- /dev/null
+++ b/website/templates/changelog.ezt
@@ -0,0 +1,19 @@
+ <h1>ChangeLog</h1>
+
+ <table>
+ [for entry]
+ <tr class="[if-index entry even]even[else]odd[end]">
+ <td>[entry.time]</td>
+ <td>[entry.author]</td>
+ <td>
+ [for entry.file]
+ <span class="file"><a href="http://labs.libre-entreprise.org/plugins/scmcvs/cvsweb.php/lasso/[entry.file.name]?cvsroot=lasso#rev[entry.file.revision]">[entry.file.name]</a> ([entry.file.revision])</span>
+ [end]
+ </td>
+ <td>
+ [entry.msg]
+ </td>
+ </tr>
+ [end]
+ </table>
+
diff --git a/website/templates/tests.ezt b/website/templates/tests.ezt
new file mode 100644
index 00000000..187a6ff8
--- /dev/null
+++ b/website/templates/tests.ezt
@@ -0,0 +1,23 @@
+<h1>Test suite ([title])</h1>
+
+<p>Executed on [datetime]</p>
+
+[for suite]
+ [if-any suite.title]<h2>[suite.title]</h2>[end]
+ <table>
+ [for suite.test]
+ <tr>
+ <td class="test-description">[suite.test.description]</td>
+ <td class="[suite.test.result]"> </td>
+ </tr>
+ [end]
+ <tfoot>
+ <tr>
+ <td colspan="2">
+ [suite.len_tests] tests
+ [if-any suite.duration]executed in [suite.duration]s[end]
+ </td>
+ </tr>
+ </tfoot>
+ </table>
+[end]
diff --git a/website/web/buildbox.xml b/website/web/buildbox.xml
new file mode 100644
index 00000000..659d12f1
--- /dev/null
+++ b/website/web/buildbox.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<catalog xmlns="http://www.entrouvert.org/namespaces/expression/0.0">
+ <rootElementName>summary</rootElementName>
+ <rootElementNamespace>http://www.0d.be/ns/build</rootElementNamespace>
+ <root>build-logs</root>
+ <contentElementName>build</contentElementName>
+ <minModificationTime type="rel">-192800</minModificationTime>
+ <sort>build:date</sort>
+</catalog>
diff --git a/website/web/css/buildbox.css b/website/web/css/buildbox.css
new file mode 100644
index 00000000..56c9e67c
--- /dev/null
+++ b/website/web/css/buildbox.css
@@ -0,0 +1,88 @@
+div#banner {
+ background: white url(Insect.png) top left no-repeat;
+}
+
+div#banner h1 {
+ padding-left: 80px;
+ border-bottom: 1px solid #999;
+ min-height: 35px;
+}
+
+table td {
+ border: 1px solid black;
+ padding: 0 1ex;
+ text-align: center;
+}
+
+td.ok, td.ok295, td.success { background: #b5e42e; }
+td.missing, td.failure, td.error { background: #e42237; }
+td.gcc295, td.gcc295-failure, td.failure295 { background: #e4c02e; }
+
+tr.even {
+ background: #eee;
+}
+
+td.buildtime {
+ text-align: right;
+}
+
+th {
+ padding: 0 1ex;
+ vertical-align: top;
+}
+
+td.ok a:link, td.failure a:link {
+ color: black;
+}
+
+a:visited {
+ color: #800;
+}
+
+ul#system {
+ list-style: circle;
+ font-size: 80%;
+}
+
+span.file {
+ display: block;
+}
+
+td.test-description {
+ text-align: left;
+}
+
+tfoot {
+ font-weight: bold;
+}
+
+th[colspan] {
+ border: 1px solid black;
+ border-bottom: 0px;
+}
+
+tr#line2 th {
+ font-size: 90%;
+}
+
+pre {
+ white-space: -moz-pre-wrap;
+}
+
+pre span.stdin {
+ font-weight: bold;
+}
+
+pre span.warning {
+ color: #a00;
+}
+
+pre span.error {
+ color: #f00;
+ font-weight: bold;
+}
+
+td.test-description {
+ width: 50em;
+}
+
diff --git a/website/web/css/lasso.css b/website/web/css/lasso.css
new file mode 100644
index 00000000..0345676a
--- /dev/null
+++ b/website/web/css/lasso.css
@@ -0,0 +1,186 @@
+html, body {
+ font-family: sans-serif;
+ margin: 0;
+}
+
+div.note, div.warning {
+ padding: 0.3ex;
+ padding-left: 60px;
+ min-height: 50px;
+ margin: 1ex 1em;
+}
+
+div.note {
+ background: #ffd url(note.png) top left no-repeat;
+}
+
+div.warning {
+ background: #ffd url(warning.png) top left no-repeat;
+}
+
+div#head h1 {
+ text-indent: -9000px;
+ background: url(lasso.png);
+ width: 233px;
+ height: 66px;
+ margin: 0;
+}
+
+div#sidebar ul {
+ padding: 0;
+ margin: 0;
+ float: left;
+ width: 100%;
+ background: #b5e42e;
+ border: 1px solid black;
+ border-width: 1px 0px;
+ list-style: none;
+}
+
+div#sidebar ul li {
+ display: inline;
+}
+
+div#sidebar ul li a {
+ padding: 0.1em 1em;
+ float: left;
+ border-right: 1px solid black;
+ text-decoration: none;
+ color: black;
+ font-weight: bold;
+}
+
+div#sidebar ul li#current a {
+ background: #e42237;
+}
+
+div#sidebar ul li a:hover {
+ background: #e42237;
+ color: white;
+}
+
+div#sidebar {
+ margin-bottom: 1em;
+}
+
+div#content {
+ clear: both;
+ margin: 1em;
+ margin-top: 2em;
+}
+
+div#footer {
+ background: #b5e42e;
+ border: 1px solid black;
+ border-width: 1px 0px;
+ margin: 1em 0;
+ text-align: center;
+ font-size: 80%;
+}
+
+pre {
+ background: #eee;
+ border: 1px inset black;
+ padding: 2px;
+}
+
+/*
+table#matrix td {
+ border: 1px solid black;
+ padding: 0 1ex;
+}
+*/
+
+tr.even {
+ background: #eee;
+}
+
+
+table.matrix td, table.matrix th {
+ border: 1px solid #444;
+}
+
+table.matrix thead th {
+ background: #b5e42e;
+ font-style: italic;
+ padding: 0 2ex;
+}
+
+table.matrix {
+ caption-side: bottom;
+}
+
+table.matrix caption {
+ font-size: 90%;
+}
+
+table.matrix th {
+ padding: 0 1.5ex;
+}
+
+table.matrix td {
+ padding: 0 0.3ex;
+ text-align: center;
+}
+
+table.matrix td.prof {
+ text-align: left;
+ padding: 0 0.5ex;
+}
+
+table.benchs tr.labels td {
+ text-align: center;
+}
+
+table.benchs tr>th:first-child { padding-right: 2em; }
+
+table.benchs td { padding: 0 0.7em; text-align: right; }
+
+table.benchs thead, table.benchs th {
+ background: #eee;
+}
+
+ol.test-machines > li {
+ margin-bottom: 1em;
+ border-left: 1px solid #888;
+}
+
+p.details-configuration {
+ margin-top: 3em;
+}
+
+div#news {
+ float: right;
+ margin: 1em 3em;
+ border: 1px solid #333;
+ padding: 2px;
+ width: 20em;
+}
+
+div#news p {
+ margin: 0.2em;
+ font-size: 90%;
+}
+
+div#news div {
+ margin-bottom: 0.5em;
+}
+
+div#news h2 {
+ margin: 0;
+ font-size: 110%;
+ background: #b5e42e;
+ padding: 0px 3px;
+ border: 1px solid black;
+ text-align: center;
+}
+
+div#news h2 a {
+ color: inherit;
+}
+
+div#content {
+ margin-top: 3em;
+ clear: none;
+}
+
diff --git a/website/web/css/lasso.png b/website/web/css/lasso.png
new file mode 100644
index 00000000..8ffc7223
--- /dev/null
+++ b/website/web/css/lasso.png
Binary files differ
diff --git a/website/web/css/leaf-style.css b/website/web/css/leaf-style.css
new file mode 100644
index 00000000..0351fd23
--- /dev/null
+++ b/website/web/css/leaf-style.css
@@ -0,0 +1,276 @@
+/* adapted from Localize template published on oswd */
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: sans-serif;
+ color: #666;
+ text-align: center;
+ background-color: #ddd;
+}
+
+p {
+ margin: 0.2em 0 1.2em 0;
+ padding: 0.3em;
+}
+
+h1 {
+ padding: 0;
+ margin: 0;
+ font-size: 180%;
+ font-weight: normal;
+ font-style: italic;
+ color: #8CD749;
+}
+
+h2, h3 {
+ background: #d0d0d0;
+ color: #3B4471;
+ font-size: 100%;
+ font-weight: normal;
+ margin: 0.2em;
+ padding: 0;
+ font-style: italic;
+}
+
+h3 {
+ background: #dddddd;
+}
+
+a:link, a:visited {
+ color: #8CD749;
+ text-decoration: underline;
+}
+
+a:hover {
+ color: #3B4471;
+ text-decoration: none;
+}
+
+a:active {
+ color: #8CD749;
+ text-decoration: underline;
+}
+
+
+div#page {
+ background: white;
+ margin: 0 auto;
+ width: 70%;
+}
+
+div#header {
+ padding: 1em 2em;
+ text-align: right;
+ background: white url(my-leaf.jpeg) no-repeat left center;
+}
+
+#header span {
+ display: block;
+ color: #3B4471;
+ font-size: 80%;
+}
+
+
+div#navbar ul {
+ font-size: 80%;
+ list-style-type: none;
+ float: left;
+ display: block;
+ width: 100%;
+ line-height: 1.5em;
+ clear: both;
+ margin: 0;
+ padding: 0;
+ background-color: #999999;
+}
+
+div#navbar ul li {
+ display: inline;
+}
+
+div#navbar a {
+ display: block;
+ float: left;
+ width: 24.5%;
+ padding: 1.2em 0 1em 0;
+ margin: 0;
+ text-decoration: none;
+}
+
+div#navbar a:link, div#navbar a:visited, div#navbar a:active {
+ background: #999;
+ color: white;
+ border-bottom: 3px solid transparent;
+}
+
+div#navbar a:hover, div#navbar a.here {
+ background: #8CD749;
+}
+
+div#navbar a.here {
+ border-bottom: 3px solid #489302;
+}
+
+div#quicklinks {
+ float: right;
+ clear: both;
+ width: 13em;
+ margin-top: 1em;
+ padding: 0;
+ font-size: 90%;
+ text-align: center;
+}
+
+div#morelinks,
+div#news,
+div#download,
+div#documentation,
+div#contact {
+ background: white;
+ margin: 0.5em;
+ padding: 0.3em;
+ border: 1px solid #999999;
+}
+
+#quicklinks h2, #quicklinks h3 {
+ text-align: left;
+ padding-left: 1.5em;
+}
+
+#quicklinks ul {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+#content {
+ clear: left;
+ text-align: left;
+ margin: 1.2em 1em 0 0;
+ padding: 1em 1ex 1em 1.5ex;
+}
+
+#content.large {
+ margin-right: 1.2em;
+}
+
+#content h2, #content h3 {
+ text-indent: 2em;
+}
+
+#copyright {
+ color: #999;
+ font-size: 80%;
+ margin: 2.5em 0.2em 0.5em 0.5em;
+ padding: 0.8em;
+ border-top: 1px solid #999;
+ text-align: left;
+ clear: both;
+}
+
+
+div#news a {
+ display: block;
+}
+
+div#news p.changes {
+ font-size: 80%;
+}
+
+
+table.matrix td, table.matrix th {
+ border: 1px solid #444;
+}
+
+table.matrix thead th {
+ background: #8CD749;
+ font-style: italic;
+ padding: 0 2ex;
+}
+
+table.matrix {
+ caption-side: bottom;
+}
+
+table.matrix caption {
+ font-size: 90%;
+}
+
+table.matrix th {
+ padding: 0 1.5ex;
+}
+
+table.matrix td {
+ padding: 0 0.3ex;
+ text-align: center;
+}
+
+table.matrix td.prof {
+ text-align: left;
+ padding: 0 0.5ex;
+}
+
+table.benchs tr.labels td {
+ text-align: center;
+}
+
+table.benchs tr>th:first-child { padding-right: 2em; }
+
+table.benchs td { padding: 0 0.7em; text-align: right; }
+
+table.benchs thead, table.benchs th {
+ background: #eee;
+}
+
+ol.test-machines > li {
+ margin-bottom: 1em;
+ border-left: 1px solid #888;
+}
+
+p.details-configuration {
+ margin-top: 3em;
+}
+
+pre {
+ background: #eee;
+ border: 1px inset black;
+ padding: 2px;
+ overflow: auto;
+}
+
+div#page.buildbox {
+ width: 90%;
+}
+
+div#page.buildbox div#content {
+ margin: 1.2em 0.2em 0 0;
+}
+
+div#page.buildbox div#content h1 {
+ margin-bottom: 1em;
+}
+
+div#page.buildbox table {
+ font-size: 90%;
+}
+
+div#page.buildbox div#quicklinks {
+ display: none;
+}
+
+p.warning {
+ color: black;
+ font-weight: bold;
+ background: white url(warning.png) 2px 2px no-repeat;
+ padding-left: 55px;
+ min-height: 48px;
+ margin: 2em 0;
+ border: 1px solid #800;
+}
+
+ul.errornotes {
+ font-size: 90%;
+ margin-left: 2em;
+}
+
diff --git a/website/web/css/my-leaf.jpeg b/website/web/css/my-leaf.jpeg
new file mode 100644
index 00000000..4b3fa081
--- /dev/null
+++ b/website/web/css/my-leaf.jpeg
Binary files differ
diff --git a/website/web/css/note.png b/website/web/css/note.png
new file mode 100644
index 00000000..df1e0a92
--- /dev/null
+++ b/website/web/css/note.png
Binary files differ
diff --git a/website/web/css/warning.png b/website/web/css/warning.png
new file mode 100644
index 00000000..3c8a37df
--- /dev/null
+++ b/website/web/css/warning.png
Binary files differ
diff --git a/website/web/devnotes/id-wsf-stating.html b/website/web/devnotes/id-wsf-stating.html
new file mode 100644
index 00000000..03c1c27b
--- /dev/null
+++ b/website/web/devnotes/id-wsf-stating.html
@@ -0,0 +1,472 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<link media="all" href="_files/styles" rel="stylesheet" type="text/css">
+<title>Lasso Liberty ID-WSF State at 24 / 02 /2005</title></head>
+
+<body>
+<div id="header">
+<form method="get" action="/Search">
+<table border="0" width="100%">
+<tbody>
+
+<h2>Lasso Liberty ID-WSF State at 24 / 02 /2005</h2>
+
+</p><h2> Discovery Service</h2>
+
+<p>
+
+</p><h3> Common Type</h3>
+
+<p>
+
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td> Service type </td><td>
+ OK </td><td>
+</td></tr>
+
+<tr><td> <a href="http://localhost:8000/ResourceID">ResourceID</a> </td><td>
+ OK </td><td>
+</td></tr>
+
+<tr><td> <a href="http://localhost:8000/EncryptedResourceID">EncryptedResourceID</a> </td><td>
+ A Faire </td><td>
+</td></tr>
+
+<tr><td> <a href="http://localhost:8000/StatusCode">StatusCode</a> </td><td>
+ OK </td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><h3> Service Instance Description</h3>
+
+<p>
+
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td><a href="http://localhost:8000/WSDLRef">WSDLRef</a> Group </td><td>
+A Faire</td><td>
+</td></tr>
+
+<tr><td><a href="http://localhost:8000/BriefSoapHttpDescription">BriefSoapHttpDescription</a> Group</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><h3> <a href="http://localhost:8000/ResourceOffering">ResourceOffering</a></h3>
+<table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td><a href="http://localhost:8000/ResourceOffering">ResourceOffering</a> Element</td><td>
+ ok </td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><h3> Discovery Service</h3>
+
+<p>
+
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>Discovery Lookup Query </td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>Discovery Lookup <a href="http://localhost:8000/QueryResponse">QueryResponse</a></td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>Processing rules</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>Discovery Update Modify </td><td>
+Ok</td><td>
+</td></tr>
+
+<tr><td>Directives </td><td>
+ A Faire</td><td>
+</td></tr>
+
+<tr><td>Discovery Update <a href="http://localhost:8000/ModifyResponse">ModifyResponse</a></td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>Processing rules </td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><h3> SAML <a href="http://localhost:8000/AttributeDesignator">AttributeDesignator</a> for Discovery <a href="http://localhost:8000/ResourceOffering">ResourceOffering</a></h3>
+
+<p>
+
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td><a href="http://localhost:8000/AttributeStatement">AttributeStatement</a></td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td><a href="http://localhost:8000/AttributeName">AttributeName</a></td><td>
+ A Faire</td><td>
+</td></tr>
+
+<tr><td><a href="http://localhost:8000/AttributeNamespace">AttributeNamespace</a></td><td>
+A Faire</td><td>
+</td></tr>
+
+<tr><td><a href="http://localhost:8000/AttributeValue">AttributeValue</a></td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td><a href="http://localhost:8000/ResourceOffering">ResourceOffering</a> / <a href="http://localhost:8000/CredentialRef">CredentialRef</a> elements</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><h3> Option Value for Response Authentication</h3>
+
+<p>
+
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>Option Value </td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><h3> Including keys in <a href="http://localhost:8000/ModifyResponse">ModifyResponse</a></h3>
+<table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>Keys in <a href="http://localhost:8000/ModifyResponse">ModifyResponse</a></td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><h2> Data Service Template</h2>
+
+<p>
+
+</p><h3> Data Model</h3>
+
+<p>
+
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>Guideline for schema</td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>Extending a service</td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>Time Values and Synchronization</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+- Common Attributes
+
+</p><p>
+
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>The commonAttributes Attribute Grou</td><td>
+A Faire</td><td>
+</td></tr>
+
+<tr><td>The leafAttributes Attribute Group</td><td>
+A Faire</td><td>
+</td></tr>
+
+<tr><td>The localized<a href="http://localhost:8000/LeafAttributes">LeafAttributes</a> Attribute Group</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>Common Data Types</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><h3> Message Interface</h3>
+
+<p>
+
+- Common parts
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td><a href="http://localhost:8000/ResourceID">ResourceID</a></td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td><a href="http://localhost:8000/EncryptedResourceID">EncryptedResourceID</a></td><td>
+A Faire</td><td>
+</td></tr>
+
+<tr><td>Select</td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>Status</td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>Linking with ids</td><td>
+A Faire</td><td>
+</td></tr>
+
+<tr><td>The timeStamp Attribute</td><td>
+A Faire</td><td>
+</td></tr>
+
+<tr><td>Extension</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+- Querying Data
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>Query</td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td><a href="http://localhost:8000/QueryResponse">QueryResponse</a> </td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>processing rules</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+- Modifying Data
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>Modify</td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td><a href="http://localhost:8000/ModifyResponse">ModifyResponse</a></td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>processing rules</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+- Checklist for Service Specifications
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>Checklist</td><td>
+A Voir</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><h2> Interaction Service</h2>
+
+<p>
+
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td><a href="http://localhost:8000/UserInteraction">UserInteraction</a> element</td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>processing rules </td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+- <a href="http://localhost:8000/RedirectRequest">RedirectRequest</a> Protocol
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td><a href="http://localhost:8000/RedirectRequest">RedirectRequest</a> Element</td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>processing rules</td><td>
+A Faire</td><td>
+</td></tr>
+
+<tr><td>profile</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+- Interaction service
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td><a href="http://localhost:8000/InteractionRequest">InteractionRequest</a></td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>Inquiry</td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>Help</td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td><a href="http://localhost:8000/InquiryElement">InquiryElement</a></td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>processing rules</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td><a href="http://localhost:8000/InteractionResponse">InteractionResponse</a></td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>processing rules</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>Security Consideration</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><h2> Authentication Service</h2>
+
+<p>
+
+- Authentication Protocol
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>SOAP headers / binding</td><td>
+A Faire</td><td>
+</td></tr>
+
+<tr><td>SASL Profile Particulars</td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td><a href="http://localhost:8000/SASLRequest">SASLRequest</a> </td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td><a href="http://localhost:8000/SASLResponse">SASLResponse</a></td><td>
+A Finir (voir xml/sa_sasl_response.*)</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>Sequencing Authentication Exchange</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+- Authentication Service
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>Service Type Declaration</td><td>
+OK</td><td>
+</td></tr>
+
+<tr><td>Rules for Authentication Service Providers</td><td>
+A Faire</td><td>
+</td></tr>
+
+<tr><td>Rules for Authentication Service Consumers</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+- Single Sign-On Service A Faire
+</p><table class="wikitable" cellpadding="4" cellspacing="0">
+<tbody><tr><td>Service Type Declaration</td><td>
+A Faire</td><td>
+</td></tr>
+
+<tr><td>Rules for SSO Service Providers</td><td>
+A Faire</td><td>
+</td></tr>
+
+<tr><td>The <a href="http://localhost:8000/PasswordTransforms">PasswordTransforms</a> Element</td><td>
+A Faire</td><td>
+</td></tr>
+
+<tr><td>Rules for SSO Service Consumers</td><td>
+A Faire</td><td>
+</td></tr>
+
+</tbody></table>
+
+<p>
+
+</p><h1> ID-SIS</h1>
+
+<p>
+
+</p><h2> Personal Profile Service</h2>
+
+<p>
+
+</p><h2> Employe Profile Service</h2>
+
+</body></html> \ No newline at end of file
diff --git a/website/web/doap.rdf b/website/web/doap.rdf
new file mode 120000
index 00000000..a6260bc0
--- /dev/null
+++ b/website/web/doap.rdf
@@ -0,0 +1 @@
+../../doap.rdf \ No newline at end of file
diff --git a/website/web/doap.rdf.config.xml b/website/web/doap.rdf.config.xml
new file mode 100644
index 00000000..b74684b7
--- /dev/null
+++ b/website/web/doap.rdf.config.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<configuration xmlns="http://www.entrouvert.org/namespaces/expression/0.0">
+ <inode mimeType="text/html">
+ <pythonClass>expression.core.dataholders.StaticDataHolder</pythonClass>
+ </inode>
+</configuration>
diff --git a/website/web/documentation/default.css b/website/web/documentation/default.css
new file mode 100644
index 00000000..ba1d47fa
--- /dev/null
+++ b/website/web/documentation/default.css
@@ -0,0 +1,126 @@
+body {
+ font-family: sans-serif;
+}
+
+
+h1 a, h2 a, h3 a, h4 a {
+ text-decoration: inherit;
+ color: inherit;
+}
+
+pre.literal-block {
+ background: #eee;
+ border: 1px inset black;
+ padding: 2px;
+ margin: auto 10px;
+ overflow: auto;
+}
+
+h1.title {
+}
+
+
+div.document {
+ margin-top: 1em;
+}
+
+div#table-of-contents {
+ float: right;
+ border: 1px solid black;
+ margin: 1em;
+ background: #eef;
+ max-width: 33%;
+}
+
+div#building-liberty-services-with-lasso div#table-of-contents {
+ max-width: inherit;
+ float: none;
+ background: transparent url(/figures/lasso.png) bottom right no-repeat;
+}
+
+div#table-of-contents ul {
+ padding-left: 1em;
+ list-style: none;
+}
+
+div#table-of-contents p {
+ background: #ddf;
+ text-align: center;
+ border-bottom: 1px solid black;
+ margin: 0;
+}
+
+th.docinfo-name {
+ text-align: right;
+ padding-right: 0.5em;
+}
+
+dd {
+ margin-bottom: 1ex;
+}
+
+table.table {
+ margin: 1ex 0;
+ border-spacing: 0px;
+}
+
+
+table.table th {
+ padding: 0px 1ex;
+ background: #eef;
+ font-weight: normal;
+}
+
+
+table.table td {
+ padding: 0 0.5ex;
+}
+
+div.note, div.warning {
+ padding: 0.3ex;
+ padding-left: 60px;
+ min-height: 50px;
+ margin: 1ex 1em;
+}
+
+div.note {
+ background: #ffd url(/figures/note.png) top left no-repeat;
+}
+
+div.warning {
+ background: #ffd url(/figures/warning.png) top left no-repeat;
+}
+
+p.admonition-title {
+ font-weight: bold;
+ display: inline;
+ display: none;
+ padding-right: 1em;
+}
+
+div.document {
+ padding-bottom: 30px;
+ background: transparent url(/figures/lasso.png) bottom right no-repeat;
+}
+
+div.figure {
+ margin: 0 auto;
+ width: 70%;
+ text-align: center;
+}
+
+p.caption {
+ border: 1px solid black;
+ border-top: 0px;
+}
+
+div.section h1 {
+ margin-top: 1em;
+ font-size: 130%;
+}
+
+div.section h1 a,
+div.section h2 a {
+ color: inherit;
+ text-decoration: none;
+}
diff --git a/website/web/documentation/index.xml b/website/web/documentation/index.xml
new file mode 100644
index 00000000..3cad3db0
--- /dev/null
+++ b/website/web/documentation/index.xml
@@ -0,0 +1,47 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>Documentation</title>
+ </head>
+ <body>
+ <h1>Documentation</h1>
+
+ <ul>
+ <li><a href="writing-a-c-sp.html">Writing a Liberty service provider in C</a></li>
+ <li><a href="writing-a-php-sp.html">Writing a Liberty service provider in PHP</a></li>
+ <li><a href="writing-a-java-sp.html">Writing a Liberty service provider in Java</a></li>
+ <li><a href="book.html">Building Liberty Services with Lasso</a> (work
+ stopped for the time being)</li>
+ </ul>
+
+ <ul>
+ <li><a href="interoperability">Interoperability with other Liberty and
+ SAML 2.0 implementations</a></li>
+ </ul>
+
+ <ul>
+ <li><a href="api-reference/index.html">API Reference</a></li>
+ </ul>
+
+
+ <h2>Benchmarks</h2>
+
+ <ul>
+ <li><a href="perfs">Benchmarking service provider SSO tasks</a></li>
+ </ul>
+
+ <h2>Slides</h2>
+
+ <ul>
+ <li><a
+ href="/documentation/slides/20050201-lasso-solutions-linux.pdf">General
+ presentation</a> given February 1st 2005 in the "Identity Management" track
+ of <a href="http://www.solutionslinux.fr">Solutions Linux</a> in Paris.
+ (in French)
+ </li>
+ </ul>
+
+ </body>
+</html>
+
diff --git a/website/web/documentation/interoperability.xml b/website/web/documentation/interoperability.xml
new file mode 100644
index 00000000..78bb3286
--- /dev/null
+++ b/website/web/documentation/interoperability.xml
@@ -0,0 +1,392 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>Liberty Alliance &amp; SAML 2.0 Interoperability</title>
+ </head>
+ <body>
+
+ <h1>Interoperability</h1>
+
+ <h2>SAML 2.0 Conformance Event</h2>
+
+ <p>Lasso participated in the conformance event organized by the
+ <a href="http://www.projectliberty.org">Liberty Alliance</a> and hosted
+ at <a href="http://www.etsi.org">ETSI</a> in December 2006. During a
+ week Lasso and other implementations were tested together and Lasso was
+ then recognized as conformant ot SAML 2.0 specifications.
+ </p>
+
+ <h2>ID-FF 1.2 Conformance Event</h2>
+
+ <p>To achieve Liberty Alliance certification a solution must be
+ successfully tested against several others during a workshop week.
+ In order to achieve the interoperability certification for a single
+ role/profile, an implementation must complete the test sequence in
+ conjunction with at least two other implementations in each of the
+ complementary roles.
+ </p>
+
+ <p>
+ In May 2005 Lasso has passed these series of comprehensive interoperability
+ conformance tests. It is therefore part of Liberty Alliance Project <a
+ href="http://projectliberty.org/liberty_interoperable/interoperable_products/id_ff_1_2_interoperable_product_table">interoperable
+ products</a> list.
+ </p>
+
+ <h2><del>Work in progress:</del> SAML 2.0 support</h2>
+
+ <p>
+ Development of SAML 2.0 support is ongoing and, thanks to the general
+ availability of a few implementations, some tests have been done.
+ </p>
+
+ <h3>OpenSSO</h3>
+
+ <p>
+ Access Manager is listed as a certified SAML 2.0 implementation and
+ OpenSSO code is said to be Access Manager code but OpenSSO did not
+ have any federation or cross-domain SSO support. Federation support
+ is part of Sun Java System Federation Manager, which was not
+ available as open source by the time of those tests.
+ </p>
+
+ <p>
+ Sun Java System Federation Manager has been integrated into OpenSSO
+ (as openfm) on November 6th 2006. It has been added to our testing agenda.
+ </p>
+
+ <h3>Lightbulb</h3>
+
+ <p>
+ Aside OpenSSO is a small project, <a
+ href="http://blogs.sun.com/superpat/entry/switching_on_the_lightbulb">lightbulb</a>,
+ which aims to implement SAML 2.0 support in pure PHP. It is not certified
+ and only implements SAML 2.0 SSO POST.
+ </p>
+
+ <p>
+ Those tests have last been conducted on November 2nd 2006.
+ </p>
+
+ <table class="matrix">
+ <caption>Lasso / Lightbulb Compatibility Matrix</caption>
+ <thead>
+ <tr>
+ <th>Protocol</th> <th>SP</th> <th>IdP</th> <th>Initiated by</th> <th>Profile</th> <th>Test</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th rowspan="1">Single Sign-On &amp; Federation</th>
+ <td rowspan="1">Lightbulb</td>
+ <td rowspan="1">Lasso</td>
+ <td rowspan="1">SP</td>
+ <td class="prof">redirect/post/federated</td> <td>OK</td>
+ </tr>
+ </tbody>
+ </table>
+
+ <h3>zxid</h3>
+
+ <p>
+ <a href="http://www.zxid.org">zxid</a> is different things, including a
+ SAML 2.0 service provider as CGI program. It is free software (license
+ is <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License
+ 2.0</a> and is developed by Sampo Kellomäki, of Symlabs fame.
+ </p>
+
+ <p>
+ Those tests have last been conducted on November 6th 2006.
+ </p>
+
+ <table class="matrix">
+ <caption>Lasso / zxid Compatibility Matrix</caption>
+ <thead>
+ <tr>
+ <th>Protocol</th> <th>SP</th> <th>IdP</th> <th>Initiated by</th> <th>Profile</th> <th>Test</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th rowspan="6">Single Sign-On &amp; Federation</th>
+ <td rowspan="6">zxid</td>
+ <td rowspan="6">Lasso</td>
+ <td rowspan="6">SP</td>
+ <td class="prof">redirect/artifact/federated</td> <td>OK</td>
+ </tr>
+ <tr> <td class="prof">redirect/artifact/none</td> <td>Not tested</td> </tr>
+ <tr> <td class="prof">post/artifact/federated</td> <td>N/I</td> </tr>
+ <tr> <td class="prof">post/artifact/none</td> <td>N/I</td> </tr>
+ <tr> <td class="prof">redirect/post/federated</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect/post/none</td> <td>Not tested</td> </tr>
+
+ <tr>
+ <th rowspan="5">Single Logout</th>
+ <td rowspan="5">zxid</td>
+ <td rowspan="5">Lasso</td>
+ <td rowspan="2">SP</td>
+ <td class="prof">SOAP</td> <td>OK</td>
+ </tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td rowspan="3">IdP</td>
+ <td class="prof">SOAP</td> <td><a href="#zxid-2">Error</a></td></tr>
+ <tr> <td class="prof">redirect</td> <td>Not tested</td> </tr>
+ <tr> <td class="prof">get</td> <td>Not tested</td> </tr>
+
+ <tr>
+ <th rowspan="4">Name ID Management (only federation termination in zxid)</th>
+ <td rowspan="4">zxid</td>
+ <td rowspan="4">Lasso</td>
+ <td rowspan="2">SP</td>
+ <td class="prof">SOAP</td> <td>OK</td>
+ </tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td rowspan="2">IdP</td>
+ <td class="prof">SOAP</td> <td><a href="#zxid-1">Error</a></td></tr>
+ <tr> <td class="prof">redirect</td> <td>Not tested</td> </tr>
+ </tbody>
+ </table>
+
+ <ul class="errornotes">
+ <li>
+ <a name="zxid-1">Error with federation termination requested from Lasso
+ to zxid</a> : SOAP message POSTed to correct URL (zxid?o=S) but HTML
+ document answer from this URL.
+ </li>
+ <li>
+ <a name="zxid-2">Error with single logout requested from Lasso
+ to zxid</a> : SOAP message POSTed to correct URL (zxid?o=S) but HTML
+ document answer from this URL.
+ </li>
+ </ul>
+
+ <h3>Symlabs Federated Identity Access Manager</h3>
+
+ <p>
+ <a href="http://www.symlabs.com">Symlabs</a> <a
+ href="http://www.symlabs.com/Products/SFIAM.html">FIAM</a> is a complete
+ identity management solution, certified as SAML 2.0 conformant in July
+ 2005. There is a free evaluation version available on their website.
+ </p>
+
+ <p>
+ Those tests have last been conducted on December 2nd 2006.
+ </p>
+
+
+ <table class="matrix">
+ <caption>Lasso / SFIAM Compatibility Matrix</caption>
+ <thead>
+ <tr>
+ <th>Protocol</th> <th>SP</th> <th>IdP</th> <th>Initiated by</th> <th>Profile</th> <th>Test</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th rowspan="16">Single Sign-On &amp; Federation</th>
+ <td rowspan="6">Lasso</td>
+ <td rowspan="6">SFIAM</td>
+ <td rowspan="4">SP</td>
+ <td class="prof">redirect/artifact/federated</td> <td>OK</td>
+ </tr>
+ <tr> <td class="prof">redirect/artifact/transient</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect/post/federated</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect/post/transient</td> <td>OK</td> </tr>
+ <tr> <td rowspan="2">IdP</td>
+ <td class="prof">redirect/artifact/federated</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect/post/federated</td> <td>OK</td> </tr>
+
+ <tr>
+ <td rowspan="10">SFIAM</td>
+ <td rowspan="10">Lasso</td>
+ <td rowspan="6">SP</td>
+ <td class="prof">redirect/artifact/federated</td> <td>OK</td>
+ </tr>
+ <tr> <td class="prof">redirect/artifact/transient</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect/artifact/encrypted</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect/post/federated</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect/post/transient</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect/post/encrypted</td> <td>OK</td> </tr>
+ <tr> <td rowspan="4">IdP</td>
+ <td class="prof">redirect/artifact/federated</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect/artifact/encrypted</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect/post/federated</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect/post/encrypted</td> <td>OK</td> </tr>
+
+ <tr>
+ <th rowspan="10">Single Logout</th>
+ <td rowspan="5">Lasso</td>
+ <td rowspan="5">SFIAM</td>
+ <td rowspan="2">SP</td>
+ <td class="prof">SOAP</td> <td>OK</td>
+ </tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td rowspan="3">IdP</td>
+ <td class="prof">SOAP</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td class="prof">get</td> <td>OK</td> </tr>
+
+ <tr>
+ <td rowspan="5">SFIAM</td>
+ <td rowspan="5">Lasso</td>
+ <td rowspan="2">SP</td>
+ <td class="prof">SOAP</td> <td>OK</td>
+ </tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td rowspan="3">IdP</td>
+ <td class="prof">SOAP</td> <td>OK</td></tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td class="prof">get</td> <td>OK</td> </tr>
+
+ <tr>
+ <th rowspan="8">Name ID Management</th>
+ <td rowspan="4">Lasso</td>
+ <td rowspan="4">SFIAM</td>
+ <td rowspan="2">SP</td>
+ <td class="prof">SOAP</td> <td>Not tested</td> </tr>
+ <tr> <td class="prof">redirect</td> <td>Not tested</td> </tr>
+ <tr> <td rowspan="2">IdP</td>
+ <td class="prof">SOAP</td> <td>Not tested</td></tr>
+ <tr> <td class="prof">redirect</td> <td>Not tested</td> </tr>
+ <tr> <td rowspan="4">SFIAM</td> <td rowspan="4">Lasso</td>
+ <td rowspan="2">SP</td>
+ <td class="prof">SOAP</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td rowspan="2">IdP</td>
+ <td class="prof">SOAP</td> <td>OK</td></tr>
+ <tr> <td class="prof">redirect</td> <td>Not tested</td></tr>
+
+ </tbody>
+ </table>
+
+
+
+ <h2>Old tests</h2>
+
+ <h3>ID-FF 1.2 against SourceID</h3>
+
+ <p>
+ Prior to the conformance event we tested Lasso ID-FF support against SourceID.
+ </p>
+
+ <p>
+ SourceID is an open source multi-protocol project for enabling identity
+ federation and cross-boundary security. It implements ID-FF 1.2 and has
+ been stamped as "Liberty Interoperable". Web site: <a
+ href="http://www.sourceid.org">www.sourceid.org</a>.
+ Lasso interoperability
+ last tested with Lasso 0.6.0 on January 24th.
+ </p>
+
+ <table class="matrix">
+ <caption>Lasso / SourceID Compatibility Matrix</caption>
+ <thead>
+ <tr>
+ <th>Protocol</th>
+ <th>SP</th>
+ <th>IdP</th>
+ <th>Initiated by</th>
+ <th>Profile</th>
+ <th>Test</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th rowspan="12">Single Sign-On &amp; Federation</th>
+ <td rowspan="9">Lasso</td>
+ <td rowspan="9">SourceID</td>
+ <td rowspan="8">SP</td>
+ <td class="prof">redirect/artifact/federated</td> <td>OK</td>
+ </tr>
+ <tr> <td class="prof">redirect/artifact/none</td> <td>OK</td> </tr>
+ <tr> <td class="prof">post/artifact/federated</td> <td>OK</td> </tr>
+ <tr> <td class="prof">post/artifact/none</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect/post/federated</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect/post/none</td> <td>OK</td> </tr>
+ <tr> <td class="prof">post/post/federated</td> <td>OK</td> </tr>
+ <tr> <td class="prof">post/post/none</td> <td>OK</td> </tr>
+ <tr> <td>IdP</td> <td class="prof">artifact/any</td> <td>OK</td> </tr>
+ <tr>
+ <td rowspan="3">SourceID</td>
+ <td rowspan="3">Lasso</td>
+ <td rowspan="2">SP</td>
+ <td class="prof">redirect/artifact/federated</td> <td>OK</td>
+ </tr>
+ <tr>
+ <td class="prof">post/post/federated</td> <td>OK</td>
+ </tr>
+ <tr>
+ <td>IdP</td> <td class="prof">artifact/any</td> <td>OK</td>
+ </tr>
+
+ <tr>
+ <th rowspan="10">Single Logout</th>
+ <td rowspan="5">Lasso</td>
+ <td rowspan="5">SourceID</td>
+ <td rowspan="2">SP</td>
+ <td class="prof">SOAP</td> <td>OK</td>
+ </tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td rowspan="3">IdP</td>
+ <td class="prof">SOAP</td> <td>OK</td></tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td class="prof">get</td> <td>OK</td> </tr>
+ <tr>
+ <td rowspan="5">SourceID</td>
+ <td rowspan="5">Lasso</td>
+ <td rowspan="2">SP</td>
+ <td class="prof">SOAP</td> <td>OK</td>
+ </tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td rowspan="3">IdP</td>
+ <td class="prof">SOAP</td> <td>OK</td></tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td class="prof">get</td> <td>OK</td> </tr>
+
+ <tr>
+ <th rowspan="8">Federation Termination</th>
+ <td rowspan="4">Lasso</td>
+ <td rowspan="4">SourceID</td>
+ <td rowspan="2">SP</td>
+ <td class="prof">SOAP</td> <td>OK</td>
+ </tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td rowspan="2">IdP</td>
+ <td class="prof">SOAP</td> <td>OK</td></tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr>
+ <td rowspan="4">SourceID</td>
+ <td rowspan="4">Lasso</td>
+ <td rowspan="2">SP</td>
+ <td class="prof">SOAP</td> <td>OK</td>
+ </tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td rowspan="2">IdP</td>
+ <td class="prof">SOAP</td> <td>OK</td></tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+
+ <tr>
+ <th rowspan="8">Register Name Identifier</th>
+ <td rowspan="4">Lasso</td>
+ <td rowspan="4">SourceID</td>
+ <td rowspan="2">SP</td>
+ <td class="prof">SOAP</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td rowspan="2">IdP</td>
+ <td class="prof">SOAP</td> <td>OK</td></tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr>
+ <td rowspan="4">SourceID</td>
+ <td rowspan="4">Lasso</td>
+ <td rowspan="2">SP</td>
+ <td class="prof">SOAP</td> <td>OK</td> </tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ <tr> <td rowspan="2">IdP</td>
+ <td class="prof">SOAP</td> <td>OK</td></tr>
+ <tr> <td class="prof">redirect</td> <td>OK</td> </tr>
+ </tbody>
+ </table>
+
+ </body>
+</html>
diff --git a/website/web/documentation/perfs.xml b/website/web/documentation/perfs.xml
new file mode 100644
index 00000000..f2deb120
--- /dev/null
+++ b/website/web/documentation/perfs.xml
@@ -0,0 +1,171 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+<head>
+ <title>Benchmarking service provider SSO tasks</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+</head>
+<body>
+<h1>Benchmarking service provider SSO tasks</h1>
+
+<h2>&#8220;AuthenticationRequest&#8221; generation</h2>
+
+<pre>
+lasso_login_init_authn_request(login, "https://idp1/metadata", LASSO_HTTP_METHOD_REDIRECT);
+request = LASSO_LIB_AUTHN_REQUEST(LASSO_PROFILE(login)-&gt;request);
+request-&gt;IsPassive = 0;
+request-&gt;NameIDPolicy = g_strdup(LASSO_LIB_NAMEID_POLICY_TYPE_FEDERATED);
+request-&gt;consent = g_strdup(LASSO_LIB_CONSENT_OBTAINED);
+request-&gt;ProtocolProfile = g_strdup(LASSO_LIB_PROTOCOL_PROFILE_BRWS_POST);
+lasso_login_build_authn_request_msg(login);
+</pre>
+
+<table class="benchs">
+<thead>
+<tr>
+<td></td>
+<th colspan="2">100 reqs</th>
+<th colspan="2">1000 reqs</th>
+<th colspan="2">10000 reqs</th>
+</tr>
+<tr class="labels">
+<td></td> <td>time</td> <td>req/s</td> <td>time</td> <td>req/s</td> <td>time</td> <td>req/s</td>
+</tr>
+</thead>
+<tbody>
+
+<tr>
+<th>Intel® Pentium® M processor 1500Mhz</th>
+ <td>2.993</td> <td>33.414</td>
+ <td>29.932</td> <td>33.409</td>
+ <td>300.877</td> <td>33.236</td>
+</tr>
+
+<tr>
+<th>AMD Opteron™ Processor 242 (1.6Ghz)</th>
+ <td>0.716</td> <td>139.734</td>
+ <td>7.136</td> <td>140.136</td>
+ <td>71.213</td> <td>140.425</td>
+</tr>
+
+<tr>
+<th>Intel® Xeon™ CPU 2.80GHz</th>
+ <td>2.785</td> <td>35.909</td>
+ <td>27.94</td> <td>35.785</td>
+ <td>280.440</td> <td>35.658</td>
+</tr>
+</tbody>
+</table>
+
+<h2>&#8220;AuthenticationResponse&#8221; consuming</h2>
+
+<pre>
+lasso_login_process_authn_response_msg(login, authn_response_msg);
+lasso_login_accept_sso(login);
+</pre>
+
+<table class="benchs">
+<thead>
+<tr>
+<td></td>
+<th colspan="2">100 reqs</th>
+<th colspan="2">1000 reqs</th>
+<th colspan="2">10000 reqs</th>
+</tr>
+<tr class="labels">
+<td></td> <td>time</td> <td>req/s</td> <td>time</td> <td>req/s</td> <td>time</td> <td>req/s</td>
+</tr>
+</thead>
+<tbody>
+
+<tr>
+<th>Intel® Pentium® M processor 1500Mhz</th>
+ <td>0.572</td> <td>174.840</td>
+ <td>5.788</td> <td>172.766</td>
+ <td>58.249</td> <td>171.677</td>
+</tr>
+
+<tr>
+<th>AMD Opteron™ Processor 242 (1.6Ghz)</th>
+ <td>0.303</td> <td>329.710</td>
+ <td>3.022</td> <td>330.899</td>
+ <td>30.454</td> <td>328.368</td>
+</tr>
+
+<tr>
+<th>Intel® Xeon™ CPU 2.80GHz</th>
+ <td>0.609</td> <td>164.218</td>
+ <td>6.179</td> <td>161.835</td>
+ <td>62.457</td> <td>160.108</td>
+</tr>
+
+</tbody>
+</table>
+
+<p class="details-configuration">
+ Results last updated on January 25th, with Lasso almost 0.6.0. Tests systems
+ were:
+</p>
+
+<ol class="test-machines">
+
+<li> <ul>
+ <li>Intel® Pentium® M processor 1500Mhz</li>
+ <li>1Gb RAM</li>
+ <li>Debian GNU/Linux "sid"
+ <ul>
+ <li>libxml2 2.6.11</li>
+ <li>XMLSec 1.2.6</li>
+ <li>OpenSSL 0.9.7e</li>
+ </ul></li>
+</ul> </li>
+
+<li> <ul>
+ <li>AMD Opteron™ Processor 242 (1.6Ghz)</li>
+ <li>2Gb RAM</li>
+ <li>Debian GNU/Linux "sarge" (unreleased AMD-64 version)
+ <ul>
+ <li>libxml2 2.6.11</li>
+ <li>XMLSec 1.2.6</li>
+ <li>OpenSSL 0.9.7e</li>
+ </ul></li>
+</ul> </li>
+
+<li> <ul>
+ <li>Intel® Xeon™ CPU 2.80GHz</li>
+ <li>512Mb RAM</li>
+ <li>Debian GNU/Linux "sarge"
+ <ul>
+ <li>libxml2 2.6.11</li>
+ <li>XMLSec 1.2.6</li>
+ <li>OpenSSL 0.9.7d</li>
+ </ul></li>
+</ul> </li>
+
+</ol>
+
+<h2>Library Usage</h2>
+
+<p>
+ Calculated with valgrind on test system #1 with 30 iterations; this shows
+ most time in those tests is spent in OpenSSL.
+</p>
+
+<p>
+<img src="/figures/perfs-sp-libs.png"
+ alt="Most time is spent in OpenSSL" />
+</p>
+
+
+<h2>Performance Stability</h2>
+
+<p>
+ Performance doesn't degrade when increasing the number of requests.
+</p>
+
+<p>
+ <img src="/figures/perfs-sp-stability.png" alt=""/>
+</p>
+
+</body>
+</html>
diff --git a/website/web/documentation/slides/20050201-lasso-solutions-linux.pdf b/website/web/documentation/slides/20050201-lasso-solutions-linux.pdf
new file mode 100644
index 00000000..0982f431
--- /dev/null
+++ b/website/web/documentation/slides/20050201-lasso-solutions-linux.pdf
Binary files differ
diff --git a/website/web/download/index.xml b/website/web/download/index.xml
new file mode 100644
index 00000000..34ce9a5e
--- /dev/null
+++ b/website/web/download/index.xml
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>Download</title>
+ </head>
+ <body>
+ <h1>Download</h1>
+
+ <p>
+ Lasso is licensed under the GNU GPL and the latest release
+ is available here as a gzipped tarball:
+ <a
+ href="http://labs.libre-entreprise.org/frs/download.php/520/lasso-2.0.0.tar.gz">lasso-2.0.0.tar.gz</a>
+ </p>
+
+
+ <h2>Binary Downloads</h2>
+
+ <h3>Debian Packages</h3>
+
+ <p>
+ Debian packages are available in the official Debian distribution,
+ they are included in the current testing and development versions
+ (<i>etch</i> and <i>sid</i>).
+ </p>
+
+ <p>
+ Additionnaly there are <i>sarge</i> packages and there may be more
+ uptodate packages available in our local apt repository. Pick the
+ one appropriate for your distribution:
+ </p>
+
+ <pre>
+deb http://deb.entrouvert.org sarge main
+deb http://deb.entrouvert.org etch main
+</pre>
+
+ <p>
+ Available packages are:
+ </p>
+
+ <ul>
+ <li>liblasso3: runtime library</li>
+ <li>liblasso3-dev: C development kit</li>
+ <li>python2.3-lasso: Python 2.3 bindings</li>
+ <li>php4-lasso: PHP bindings</li>
+ <li>liblasso-java: JAVA bindings</li>
+ <li>liblasso-perl: Perl bindings</li>
+ <!--<li>liblasso-cil: .NET bindings</li>-->
+ </ul>
+
+ <p>
+ You can also browse the repository on <a
+ href="http://deb.entrouvert.org">deb.entrouvert.org</a>
+ </p>
+
+
+ <h3>Fedora Core Packages</h3>
+
+ <p>
+ There are RPM packages built on Fedora Core 6.
+ </p>
+
+ <ul>
+ <li><a
+ href="http://labs.libre-entreprise.org/frs/download.php/527/lasso-2.0.0-1.i386.rpm">lasso-2.0.0-1.i386.rpm</a></li>
+ <li><a
+ href="http://labs.libre-entreprise.org/frs/download.php/528/lasso-devel-2.0.0-1.i386.rpm">lasso-devel-2.0.0-1.i386.rpm</a></li>
+ <li><a
+ href="http://labs.libre-entreprise.org/frs/download.php/529/lasso-java-2.0.0-1.i386.rpm">lasso-java-2.0.0-1.i386.rpm</a></li>
+ <li><a
+ href="http://labs.libre-entreprise.org/frs/download.php/530/lasso-perl-2.0.0-1.i386.rpm">lasso-perl-2.0.0-1.i386.rpm</a></li>
+ <li><a
+ href="http://labs.libre-entreprise.org/frs/download.php/531/lasso-python-2.0.0-1.i386.rpm">lasso-python-2.0.0-1.i386.rpm</a></li>
+ </ul>
+
+
+ <h3>Microsoft Windows Installer Packages</h3>
+
+ <p>
+ The following Microsoft Windows installer packages are available
+ for this release:
+ </p>
+
+ <ul>
+ <li><a
+ href="http://labs.libre-entreprise.org/frs/download.php/524/Install-lite-2_0_0.exe">[lite]</a>
+ Installer with Lasso library</li>
+ <li><a
+ href="http://labs.libre-entreprise.org/frs/download.php/522/Install-full-2_0_0.exe">[full]</a>
+ Installer with Lasso library as well as dependencies</li>
+ <li><a
+ href="http://labs.libre-entreprise.org/frs/download.php/523/Install-java-lite-2.0.0.exe">[java
+ lite]</a> Installer with Java binding for Lasso library</li>
+ <li><a
+ href="https://labs.libre-entreprise.org/frs/download.php/521/Install-deps-2_0_0.exe">[deps]</a>
+ Installer with dependencies only</li>
+ </ul>
+
+
+ <h2>CVS</h2>
+
+ <p>
+ Lasso is also available through CVS; you can checkout source code
+ (see below) or browse source files online with <a
+ href="http://labs.libre-entreprise.org/plugins/scmcvs/cvsweb.php/lasso/?cvsroot=lasso">CVSWeb</a>.
+ </p>
+
+ <pre>
+cvs -d:pserver:anonymous@cvs.labs.libre-entreprise.org:/cvsroot/lasso login
+ # just press enter when it asks for a password
+cvs -z3 -d:pserver:anonymous@cvs.labs.libre-entreprise.org:/cvsroot/lasso checkout lasso
+</pre>
+
+ </body>
+</html>
+
diff --git a/website/web/figures/caution.png b/website/web/figures/caution.png
new file mode 100644
index 00000000..e3897db8
--- /dev/null
+++ b/website/web/figures/caution.png
Binary files differ
diff --git a/website/web/figures/important.png b/website/web/figures/important.png
new file mode 100644
index 00000000..2e1a2a36
--- /dev/null
+++ b/website/web/figures/important.png
Binary files differ
diff --git a/website/web/figures/lasso.png b/website/web/figures/lasso.png
new file mode 100644
index 00000000..084349fa
--- /dev/null
+++ b/website/web/figures/lasso.png
Binary files differ
diff --git a/website/web/figures/note.png b/website/web/figures/note.png
new file mode 100644
index 00000000..df1e0a92
--- /dev/null
+++ b/website/web/figures/note.png
Binary files differ
diff --git a/website/web/figures/perfs-sp-libs-large.png b/website/web/figures/perfs-sp-libs-large.png
new file mode 100644
index 00000000..1d12bbe6
--- /dev/null
+++ b/website/web/figures/perfs-sp-libs-large.png
Binary files differ
diff --git a/website/web/figures/perfs-sp-libs.png b/website/web/figures/perfs-sp-libs.png
new file mode 100644
index 00000000..4abff7be
--- /dev/null
+++ b/website/web/figures/perfs-sp-libs.png
Binary files differ
diff --git a/website/web/figures/perfs-sp-stability-large.png b/website/web/figures/perfs-sp-stability-large.png
new file mode 100644
index 00000000..d2d0d5d3
--- /dev/null
+++ b/website/web/figures/perfs-sp-stability-large.png
Binary files differ
diff --git a/website/web/figures/perfs-sp-stability.png b/website/web/figures/perfs-sp-stability.png
new file mode 100644
index 00000000..d4cbf2c4
--- /dev/null
+++ b/website/web/figures/perfs-sp-stability.png
Binary files differ
diff --git a/website/web/figures/perfs-sp-stability.svg b/website/web/figures/perfs-sp-stability.svg
new file mode 100644
index 00000000..e2c38877
--- /dev/null
+++ b/website/web/figures/perfs-sp-stability.svg
@@ -0,0 +1,568 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="706.113"
+ height="312.773"
+ id="svg1"
+ sodipodi:version="0.32"
+ inkscape:version="0.43"
+ sodipodi:docname="perfs-sp-stability.svg"
+ sodipodi:docbase="/home/fred/src/expression/website-lasso/web-static/figures"
+ inkscape:export-filename="/tmp/lasso-performances-stability-grid.png"
+ inkscape:export-xdpi="142.94000"
+ inkscape:export-ydpi="142.94000">
+ <metadata
+ id="metadata140">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="1.0000000"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.3085725"
+ inkscape:cx="364.5989"
+ inkscape:cy="137.21493"
+ inkscape:window-width="1022"
+ inkscape:window-height="720"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:current-layer="svg1" />
+ <defs
+ id="defs2">
+ <linearGradient
+ id="linearGradient6639">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6641" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="1"
+ id="stop6643" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4883">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4885" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4887" />
+ </linearGradient>
+ <clipPath
+ id="clip1">
+ <rect
+ x="0"
+ y="19"
+ width="706.113"
+ height="293.773"
+ id="rect4" />
+ </clipPath>
+ <clipPath
+ id="clip2">
+ <rect
+ x="559.669"
+ y="152.103"
+ width="142.661"
+ height="27.5666"
+ id="rect6" />
+ </clipPath>
+ <linearGradient
+ id="grad0"
+ gradientUnits="objectBoundingBox"
+ spreadMethod="pad"
+ x1="0"
+ y1="0"
+ x2="0"
+ y2="1">
+ <stop
+ offset="0"
+ stop-color="#ffffff"
+ id="stop8" />
+ <stop
+ offset="1"
+ stop-color="#ffffff"
+ id="stop9" />
+ </linearGradient>
+ <clipPath
+ id="clip3">
+ <rect
+ x="149.023"
+ y="27.7833"
+ width="406.406"
+ height="253.967"
+ id="rect11" />
+ </clipPath>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6639"
+ id="linearGradient6645"
+ x1="197.85365"
+ y1="195.21671"
+ x2="197.85365"
+ y2="188.97398"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <path
+ d="M149.023 27.7833L149.023 281.75L555.429 281.75L555.429 27.7833L149.023 27.7833z"
+ id="path24"
+ style="fill:#e5e5e5;stroke:#848284;stroke-width:0.23999999;fill-opacity:1"
+ stroke-width="0.24"
+ stroke="#848284"
+ fill="url(#grad0)" />
+ <path
+ d="M149.023 281.75L555.429 281.75"
+ fill="none"
+ stroke-width="0.1"
+ stroke="#000000"
+ id="path61"
+ style="fill:none;stroke:#000000;stroke-width:0.10000000;" />
+ <path
+ d="M149.023 253.532L555.429 253.532"
+ fill="none"
+ stroke-width="0.1"
+ stroke="#000000"
+ id="path62"
+ style="fill:none;stroke:#000000;stroke-width:0.10000000;" />
+ <path
+ d="M149.023 225.313L555.429 225.313"
+ fill="none"
+ stroke-width="0.1"
+ stroke="#000000"
+ id="path63"
+ style="fill:none;stroke:#000000;stroke-width:0.10000000;" />
+ <path
+ d="M149.023 197.095L555.429 197.095"
+ fill="none"
+ stroke-width="0.1"
+ stroke="#000000"
+ id="path64"
+ style="fill:none;stroke:#000000;stroke-width:0.10000000;" />
+ <path
+ d="M149.023 168.876L555.429 168.876"
+ fill="none"
+ stroke-width="0.1"
+ stroke="#000000"
+ id="path65"
+ style="fill:none;stroke:#000000;stroke-width:0.10000000;" />
+ <path
+ d="M149.023 140.657L555.429 140.657"
+ fill="none"
+ stroke-width="0.1"
+ stroke="#000000"
+ id="path66"
+ style="fill:none;stroke:#000000;stroke-width:0.10000000;" />
+ <path
+ d="M149.023 112.439L555.429 112.439"
+ fill="none"
+ stroke-width="0.1"
+ stroke="#000000"
+ id="path67"
+ style="fill:none;stroke:#000000;stroke-width:0.10000000;" />
+ <path
+ d="M149.023 84.2204L555.429 84.2204"
+ fill="none"
+ stroke-width="0.1"
+ stroke="#000000"
+ id="path68"
+ style="fill:none;stroke:#000000;stroke-width:0.10000000;" />
+ <path
+ d="M149.023 56.0018L555.429 56.0018"
+ fill="none"
+ stroke-width="0.1"
+ stroke="#000000"
+ id="path69"
+ style="fill:none;stroke:#000000;stroke-width:0.10000000;" />
+ <path
+ d="M149.023 27.7833L555.429 27.7833"
+ fill="none"
+ stroke-width="0.1"
+ stroke="#000000"
+ id="path70"
+ style="fill:none;stroke:#000000;stroke-width:0.10000000;" />
+ <text
+ x="297.72601"
+ y="305.98999"
+ font-size="10"
+ id="text71"
+ style="font-size:8.0000000;font-family:Sans;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;text-anchor:start;writing-mode:lr;"
+ transform="translate(0.746420,-3.732098)"
+ sodipodi:linespacing="100%">Number of requests</text>
+ <path
+ d="M148.903 281.75L555.549 281.75"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path73"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="149.023"
+ y="289.87"
+ text-anchor="middle"
+ font-family="Sans"
+ font-size="8"
+ id="text74"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:middle;">10</text>
+ <path
+ d="M189.664 285.87L189.664 281.75"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path76"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="190.178"
+ y="289.87"
+ text-anchor="middle"
+ font-family="Sans"
+ font-size="8"
+ id="text77"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:middle;">410</text>
+ <path
+ d="M230.819 285.87L230.819 281.75"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path79"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="231.333"
+ y="289.87"
+ text-anchor="middle"
+ font-family="Sans"
+ font-size="8"
+ id="text80"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:middle;">810</text>
+ <path
+ d="M271.974 285.87L271.974 281.75"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path82"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="272.488"
+ y="289.87"
+ text-anchor="middle"
+ font-family="Sans"
+ font-size="8"
+ id="text83"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:middle;">1210</text>
+ <path
+ d="M313.129 285.87L313.129 281.75"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path85"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="313.643"
+ y="289.87"
+ text-anchor="middle"
+ font-family="Sans"
+ font-size="8"
+ id="text86"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:middle;">1610</text>
+ <path
+ d="M354.284 285.87L354.284 281.75"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path88"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="354.798"
+ y="289.87"
+ text-anchor="middle"
+ font-family="Sans"
+ font-size="8"
+ id="text89"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:middle;">2010</text>
+ <path
+ d="M395.439 285.87L395.439 281.75"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path91"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="395.953"
+ y="289.87"
+ text-anchor="middle"
+ font-family="Sans"
+ font-size="8"
+ id="text92"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:middle;">2410</text>
+ <path
+ d="M436.594 285.87L436.594 281.75"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path94"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="437.108"
+ y="289.87"
+ text-anchor="middle"
+ font-family="Sans"
+ font-size="8"
+ id="text95"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:middle;">2810</text>
+ <path
+ d="M477.749 285.87L477.749 281.75"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path97"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="478.263"
+ y="289.87"
+ text-anchor="middle"
+ font-family="Sans"
+ font-size="8"
+ id="text98"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:middle;">3210</text>
+ <path
+ d="M518.904 285.87L518.904 281.75"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path100"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="519.418"
+ y="289.87"
+ text-anchor="middle"
+ font-family="Sans"
+ font-size="8"
+ id="text101"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:middle;">3610</text>
+ <text
+ x="3.7833099"
+ y="158.267"
+ font-size="10"
+ id="text103"
+ style="font-size:8.0000000;font-family:Sans;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;text-anchor:start;writing-mode:lr;"
+ transform="matrix(0.000000,-1.000000,1.000000,0.000000,-33.90846,207.6909)"
+ sodipodi:linespacing="100%">Requests per seconds</text>
+ <path
+ d="M149.023 281.87L149.023 27.6633"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path105"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <path
+ d="M144.903 281.75L149.023 281.75"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path106"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="143.903"
+ y="284.75"
+ text-anchor="end"
+ font-family="Sans"
+ font-size="8"
+ id="text107"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:end;">0</text>
+ <path
+ d="M144.903 253.532L149.023 253.532"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path109"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="143.903"
+ y="256.532"
+ text-anchor="end"
+ font-family="Sans"
+ font-size="8"
+ id="text110"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:end;">20</text>
+ <path
+ d="M144.903 225.313L149.023 225.313"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path112"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="143.903"
+ y="228.313"
+ text-anchor="end"
+ font-family="Sans"
+ font-size="8"
+ id="text113"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:end;">40</text>
+ <path
+ d="M144.903 197.095L149.023 197.095"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path115"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="143.903"
+ y="200.095"
+ text-anchor="end"
+ font-family="Sans"
+ font-size="8"
+ id="text116"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:end;">60</text>
+ <path
+ d="M144.903 168.876L149.023 168.876"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path118"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="143.903"
+ y="171.876"
+ text-anchor="end"
+ font-family="Sans"
+ font-size="8"
+ id="text119"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:end;">80</text>
+ <path
+ d="M144.903 140.657L149.023 140.657"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path121"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="143.903"
+ y="143.657"
+ text-anchor="end"
+ font-family="Sans"
+ font-size="8"
+ id="text122"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:end;">100</text>
+ <path
+ d="M144.903 112.439L149.023 112.439"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path124"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="143.903"
+ y="115.439"
+ text-anchor="end"
+ font-family="Sans"
+ font-size="8"
+ id="text125"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:end;">120</text>
+ <path
+ d="M144.903 84.2204L149.023 84.2204"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path127"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="143.903"
+ y="87.2204"
+ text-anchor="end"
+ font-family="Sans"
+ font-size="8"
+ id="text128"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:end;">140</text>
+ <path
+ d="M144.903 56.0018L149.023 56.0018"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path130"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="143.903"
+ y="59.0018"
+ text-anchor="end"
+ font-family="Sans"
+ font-size="8"
+ id="text131"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:end;">160</text>
+ <path
+ d="M144.903 27.7833L149.023 27.7833"
+ fill="none"
+ stroke-width="0.24"
+ stroke="#000000"
+ id="path133"
+ style="fill:none;stroke:#000000;stroke-width:0.23999999;" />
+ <text
+ x="143.903"
+ y="30.7833"
+ text-anchor="end"
+ font-family="Sans"
+ font-size="8"
+ id="text134"
+ style="font-size:8.0000000;font-family:Sans;text-anchor:end;">180</text>
+ <path
+ d="M149.023 234.751L149.023 234.751L150.052 234.79L151.081 235.98L152.11 234.664L153.139 234.9L154.168 234.533L155.197 234.456L156.225 234.528L157.254 234.681L158.283 234.65L159.312 234.628L160.341 234.578L161.37 234.633L162.399 234.554L163.428 234.557L164.456 234.609L165.485 234.573L166.514 234.621L167.543 234.613L168.572 234.687L169.601 234.62L170.63 234.597L171.659 234.548L172.687 234.603L173.716 234.606L174.745 234.785L175.774 234.655L176.803 234.64L177.832 234.61L178.861 234.634L179.89 234.619L180.918 234.593L181.947 234.614L182.976 234.654L184.005 234.574L185.034 234.661L186.063 234.63L187.092 234.637L188.121 234.626L189.149 234.647L190.178 234.659L191.207 234.664L192.236 234.604L193.265 234.669L194.294 234.653L195.323 234.718L196.352 234.647L197.38 234.638L198.409 234.631L199.438 234.621L200.467 234.663L201.496 234.65L202.525 234.668L203.554 234.674L204.583 234.632L205.611 234.656L206.64 234.652L207.669 234.629L208.698 234.634L209.727 234.635L210.756 234.485L211.785 234.587L212.814 234.345L213.842 234.343L214.871 234.367L215.9 234.365L216.929 234.368L217.958 234.35L218.987 234.342L220.016 234.358L221.045 234.366L222.073 234.359L223.102 234.371L224.131 234.339L225.16 234.361L226.189 234.373L227.218 234.355L228.247 234.347L229.276 234.344L230.304 234.35L231.333 234.337L232.362 234.359L233.391 234.344L234.42 234.348L235.449 234.352L236.478 234.37L237.507 234.339L238.535 234.378L239.564 234.377L240.593 234.339L241.622 234.359L242.651 234.331L243.68 234.386L244.709 234.36L245.738 234.345L246.766 234.41L247.795 234.352L248.824 234.368L249.853 234.351L250.882 234.359L251.911 234.37L252.94 234.337L253.969 234.339L254.997 234.35L256.026 234.342L257.055 234.367L258.084 234.364L259.113 234.35L260.142 234.354L261.171 234.361L262.2 234.523L263.228 234.349L264.257 234.35L265.286 234.354L266.315 234.367L267.344 234.348L268.373 234.35L269.402 234.368L270.431 234.369L271.459 234.355L272.488 234.349L273.517 234.378L274.546 234.349L275.575 234.362L276.604 234.352L277.633 234.373L278.662 234.379L279.69 234.358L280.719 234.376L281.748 234.363L282.777 234.345L283.806 234.362L284.835 234.373L285.864 234.353L286.893 234.339L287.921 234.36L288.95 234.368L289.979 234.345L291.008 234.353L292.037 234.37L293.066 234.332L294.095 234.345L295.124 234.358L296.152 234.361L297.181 234.347L298.21 234.345L299.239 234.343L300.268 234.364L301.297 234.342L302.326 234.449L303.355 234.357L304.383 234.351L305.412 234.345L306.441 234.352L307.47 234.343L308.499 234.361L309.528 234.354L310.557 234.343L311.586 234.361L312.614 234.343L313.643 234.346L314.672 234.362L315.701 234.34L316.73 234.353L317.759 234.351L318.788 234.367L319.817 234.347L320.845 234.357L321.874 234.344L322.903 234.359L323.932 234.352L324.961 234.339L325.99 234.356L327.019 234.354L328.048 234.34L329.076 234.355L330.105 234.345L331.134 234.353L332.163 234.348L333.192 234.424L334.221 234.344L335.25 234.342L336.279 234.341L337.307 234.341L338.336 234.344L339.365 234.336L340.394 234.343L341.423 234.353L342.452 234.355L343.481 234.35L344.51 234.345L345.538 234.347L346.567 234.335L347.596 234.353L348.625 234.343L349.654 234.348L350.683 234.344L351.712 234.355L352.741 234.336L353.769 234.343L354.798 234.341L355.827 234.339L356.856 234.355L357.885 234.34L358.914 234.335L359.943 234.345L360.972 234.356L362 234.346L363.029 234.348L364.058 234.358L365.087 234.34L366.116 234.344L367.145 234.344L368.174 234.348L369.203 234.355L370.231 234.347L371.26 234.343L372.289 234.349L373.318 234.352L374.347 234.35L375.376 234.348L376.405 234.355L377.434 234.346L378.462 234.347L379.491 234.349L380.52 234.358L381.549 234.344L382.578 234.34L383.607 234.344L384.636 234.403L385.665 234.336L386.693 234.343L387.722 234.348L388.751 234.335L389.78 234.35L390.809 234.339L391.838 234.353L392.867 234.348L393.896 234.346L394.924 234.339L395.953 234.357L396.982 234.341L398.011 234.355L399.04 234.348L400.069 234.361L401.098 234.349L402.127 234.346L403.155 234.355L404.184 234.355L405.213 234.341L406.242 234.415L407.271 234.345L408.3 234.34L409.329 234.34L410.358 234.364L411.386 234.351L412.415 234.359L413.444 234.345L414.473 234.356L415.502 234.351L416.531 234.345L417.56 234.338L418.589 234.35L419.617 234.351L420.646 234.35L421.675 234.346L422.704 234.343L423.733 234.351L424.762 234.345L425.791 234.398L426.82 234.349L427.848 234.348L428.877 234.34L429.906 234.358L430.935 234.351L431.964 234.352L432.993 234.35L434.022 234.35L435.051 234.347L436.079 234.348L437.108 234.345L438.137 234.361L439.166 234.342L440.195 234.348L441.224 234.349L442.253 234.351L443.282 234.342L444.31 234.396L445.339 234.359L446.368 234.341L447.397 234.347L448.426 234.368L449.455 234.346L450.484 234.336L451.513 234.349L452.541 234.348L453.57 234.351L454.599 234.347L455.628 234.345L456.657 234.347L457.686 234.342L458.715 234.349L459.744 234.343L460.772 234.345L461.801 234.356L462.83 234.352L463.859 234.356L464.888 234.359L465.917 234.345L466.946 234.357L467.975 234.346L469.003 234.348L470.032 234.404L471.061 234.343L472.09 234.351L473.119 234.357L474.148 234.348L475.177 234.35L476.206 234.346L477.234 234.35L478.263 234.346L479.292 234.392L480.321 234.348L481.35 234.349L482.379 234.352L483.408 234.348L484.437 234.354L485.465 234.345L486.494 234.342L487.523 234.354L488.552 234.347L489.581 234.351L490.61 234.344L491.639 234.343L492.668 234.341L493.696 234.347L494.725 234.385L495.754 234.351L496.783 234.35L497.812 234.351L498.841 234.359L499.87 234.338L500.899 234.346L501.927 234.348L502.956 234.354L503.985 234.364L505.014 234.353L506.043 234.346L507.072 234.34L508.101 234.346L509.13 234.351L510.158 234.393L511.187 234.344L512.216 234.361L513.245 234.345L514.274 234.345L515.303 234.356L516.332 234.349L517.361 234.352L518.389 234.346L519.418 234.359L520.447 234.344L521.476 234.342L522.505 234.345L523.534 234.35L524.563 234.388L525.592 234.366L526.62 234.348L527.649 234.352L528.678 234.343L529.707 234.349L530.736 234.342L531.765 234.346L532.794 234.346L533.823 234.352L534.851 234.349L535.88 234.379L536.909 235.593L537.938 235.442L538.967 234.426L539.996 234.415L541.025 234.541L542.053 234.399L543.082 234.413L544.111 234.405L545.14 234.421L546.169 234.415L547.198 234.419L548.227 234.436L549.256 234.415L550.284 234.424L551.313 234.472L552.342 234.438L553.371 234.464L554.4 234.459L555.429 234.425"
+ fill="none"
+ stroke-width="2.5"
+ stroke="#b5e42e"
+ id="path137"
+ style="fill:none;stroke:#73d216;stroke-width:1.8750000;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ d="M149.023 34.6526L149.023 34.6526L150.052 45.0174L151.081 57.1994L152.11 37.01L153.139 35.0846L154.168 42.61L155.197 40.9189L156.225 40.8749L157.254 36.3716L158.283 34.4794L159.312 36.5266L160.341 35.2642L161.37 37.8075L162.399 39.8276L163.428 36.4853L164.456 39.1144L165.485 37.6203L166.514 35.1804L167.543 38.9936L168.572 35.0199L169.601 37.6653L170.63 38.5631L171.659 38.085L172.687 38.0843L173.716 38.4198L174.745 35.6968L175.774 37.8639L176.803 35.5918L177.832 37.149L178.861 37.814L179.89 37.7949L180.918 37.922L181.947 36.862L182.976 36.1831L184.005 37.4157L185.034 37.6334L186.063 36.3716L187.092 36.3379L188.121 37.309L189.149 36.9463L190.178 36.3299L191.207 37.6351L192.236 37.3895L193.265 36.9811L194.294 38.0574L195.323 37.2129L196.352 37.2131L197.38 37.3192L198.409 37.3518L199.438 37.1458L200.467 37.0641L201.496 37.4826L202.525 37.31L203.554 36.9392L204.583 37.4069L205.611 37.1085L206.64 37.5933L207.669 37.0027L208.698 37.2508L209.727 37.1232L210.756 34.8157L211.785 35.9717L212.814 36.7976L213.842 35.8169L214.871 34.8721L215.9 34.528L216.929 35.7266L217.958 35.243L218.987 34.9846L220.016 35.06L221.045 35.0968L222.073 34.6045L223.102 35.6857L224.131 36.0077L225.16 34.9638L226.189 35.3397L227.218 35.8884L228.247 36.0593L229.276 35.5586L230.304 35.853L231.333 35.1804L232.362 35.3L233.391 35.6134L234.42 35.7144L235.449 34.8866L236.478 35.1698L237.507 35.3866L238.535 34.7509L239.564 35.4088L240.593 35.5342L241.622 35.6708L242.651 35.795L243.68 35.6536L244.709 35.5059L245.738 35.3204L246.766 35.4255L247.795 35.1602L248.824 35.0142L249.853 35.1586L250.882 35.3775L251.911 35.4129L252.94 35.5319L253.969 35.7194L254.997 35.2131L256.026 35.4946L257.055 35.6326L258.084 35.2216L259.113 35.3359L260.142 35.4717L261.171 35.5229L262.2 35.1856L263.228 35.2116L264.257 35.0197L265.286 35.1602L266.315 34.9646L267.344 35.6373L268.373 35.5298L269.402 34.9822L270.431 35.2005L271.459 35.5151L272.488 35.5257L273.517 35.1694L274.546 35.3962L275.575 35.3278L276.604 35.3431L277.633 34.8345L278.662 34.8501L279.69 34.9228L280.719 35.6449L281.748 35.1642L282.777 35.4954L283.806 35.3652L284.835 35.2207L285.864 35.6209L286.893 35.1581L287.921 35.0656L288.95 35.355L289.979 35.3593L291.008 35.3945L292.037 35.1246L293.066 35.1885L294.095 34.8536L295.124 35.3196L296.152 35.6195L297.181 35.6247L298.21 35.2558L299.239 35.111L300.268 35.6167L301.297 35.261L302.326 35.6182L303.355 35.7283L304.383 35.2264L305.412 35.2423L306.441 35.8189L307.47 35.2598L308.499 35.1565L309.528 35.4631L310.557 35.3246L311.586 34.9381L312.614 34.8985L313.643 34.8004L314.672 34.7221L315.701 34.939L316.73 35.0925L317.759 35.129L318.788 34.7777L319.817 35.0639L320.845 35.0564L321.874 35.2096L322.903 34.9755L323.932 34.7917L324.961 34.7985L325.99 34.8725L327.019 34.8911L328.048 35.3775L329.076 35.5639L330.105 35.0188L331.134 35.1839L332.163 34.5849L333.192 35.0774L334.221 35.3726L335.25 35.0111L336.279 35.1765L337.307 34.9556L338.336 35.1382L339.365 34.9663L340.394 35.4576L341.423 34.793L342.452 34.6984L343.481 35.13L344.51 35.0891L345.538 35.0307L346.567 35.1449L347.596 35.3045L348.625 35.1023L349.654 35.166L350.683 34.9466L351.712 34.9386L352.741 35.3184L353.769 34.8126L354.798 35.2497L355.827 35.2872L356.856 35.0485L357.885 35.4076L358.914 35.0657L359.943 36.812L360.972 35.0534L362 35.1447L363.029 34.9318L364.058 35.0127L365.087 35.5355L366.116 35.05L367.145 35.2424L368.174 35.1732L369.203 35.4031L370.231 35.2602L371.26 34.6805L372.289 35.3079L373.318 34.9999L374.347 34.6664L375.376 34.9616L376.405 35.0438L377.434 34.8562L378.462 35.1828L379.491 35.2225L380.52 34.8459L381.549 35.4715L382.578 34.9768L383.607 35.3931L384.636 35.2813L385.665 35.0697L386.693 35.1627L387.722 35.4284L388.751 34.9316L389.78 35.3174L390.809 35.0353L391.838 35.1264L392.867 34.9994L393.896 35.1532L394.924 34.795L395.953 34.8894L396.982 35.122L398.011 34.9621L399.04 34.6828L400.069 34.8168L401.098 34.9829L402.127 35.0043L403.155 35.0533L404.184 35.1642L405.213 35.1208L406.242 34.7715L407.271 34.9065L408.3 35.3366L409.329 35.317L410.358 35.3431L411.386 35.1419L412.415 35.3511L413.444 35.2867L414.473 35.0979L415.502 35.6093L416.531 35.4393L417.56 35.2031L418.589 34.8433L419.617 35.1287L420.646 35.0293L421.675 34.9467L422.704 35.0248L423.733 35.2631L424.762 34.9643L425.791 34.8688L426.82 34.8393L427.848 35.1829L428.877 34.9518L429.906 34.9114L430.935 34.8947L431.964 34.9017L432.993 35.1017L434.022 34.8066L435.051 34.8882L436.079 35.5765L437.108 34.8773L438.137 35.1885L439.166 35.3054L440.195 34.9479L441.224 34.9892L442.253 34.9971L443.282 35.0891L444.31 34.7728L445.339 35.1771L446.368 35.3371L447.397 34.7582L448.426 34.9605L449.455 34.8577L450.484 34.9922L451.513 35.2818L452.541 34.787L453.57 35.2036L454.599 35.0122L455.628 35.0457L456.657 35.1952L457.686 36.1999L458.715 35.3114L459.744 35.0988L460.772 35.1725L461.801 36.3897L462.83 34.9295L463.859 34.7541L464.888 34.9277L465.917 35.0511L466.946 35.1166L467.975 35L469.003 35.0556L470.032 35.0915L471.061 34.8509L472.09 34.9408L473.119 35.0177L474.148 35.0928L475.177 35.0032L476.206 35.136L477.234 35.0833L478.263 34.9166L479.292 35.0779L480.321 34.9537L481.35 35.0207L482.379 34.9771L483.408 35.0304L484.437 34.9975L485.465 35.2081L486.494 35.0033L487.523 35.3261L488.552 35.2929L489.581 35.2027L490.61 35.497L491.639 35.0136L492.668 35.6587L493.696 35.2885L494.725 35.2445L495.754 35.4439L496.783 35.1291L497.812 35.0453L498.841 35.0353L499.87 35.1413L500.899 35.1123L501.927 35.0834L502.956 34.7868L503.985 34.9537L505.014 34.8806L506.043 35.097L507.072 34.8855L508.101 35.1868L509.13 34.7463L510.158 34.8099L511.187 34.9648L512.216 35.137L513.245 35.0968L514.274 35.1258L515.303 35.6895L516.332 35.371L517.361 35.0546L518.389 35.2606L519.418 35.2088L520.447 34.9833L521.476 35.4144L522.505 35.1142L523.534 34.8836L524.563 35.1353L525.592 35.0458L526.62 35.0799L527.649 35.1594L528.678 35.2186L529.707 35.3145L530.736 35.3278L531.765 35.1054L532.794 35.5622L533.823 36.2064L534.851 35.1545L535.88 35.0526L536.909 36.3727L537.938 35.5604L538.967 35.9756L539.996 36.6356L541.025 35.7938L542.053 35.8758L543.082 35.5621L544.111 35.6556L545.14 35.7053L546.169 35.6904L547.198 35.827L548.227 36.0145L549.256 35.6395L550.284 35.4843L551.313 37.0825L552.342 36.3075L553.371 36.8364L554.4 35.614L555.429 36.2195"
+ fill="none"
+ stroke-width="2.5"
+ stroke="#e42237"
+ id="path138"
+ style="fill:none;stroke:#729fcf;stroke-width:1.8750000;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ d="M 412.00165,250.00397 L 412.00165,277.33097 L 558.89367,277.33097 L 558.89367,250.00397 L 412.00165,250.00397 z "
+ id="path17"
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.24373804" />
+ <path
+ d="M 563.45200,159.43000 L 584.71200,159.43000"
+ id="path18"
+ style="fill:none;stroke:#73d216;stroke-width:2.5000000;stroke-opacity:1"
+ transform="translate(-147.7911,97.78097)" />
+ <text
+ x="587.547"
+ y="163.88699"
+ font-size="8"
+ id="text19"
+ style="font-size:8.0000000;font-family:Sans;"
+ transform="translate(-147.7911,97.78097)">AuthnRequest generation</text>
+ <path
+ d="M 563.45200,169.43000 L 584.71200,169.43000"
+ id="path21"
+ style="fill:none;stroke:#729fcf;stroke-width:2.5000000;stroke-opacity:1"
+ transform="translate(-147.7911,97.78097)" />
+ <text
+ x="587.547"
+ y="173.88699"
+ font-size="8"
+ id="text22"
+ style="font-size:8.0000000;font-family:Sans;"
+ transform="translate(-147.7911,97.78097)">AuthnResponse consumption</text>
+</svg>
diff --git a/website/web/figures/tip.png b/website/web/figures/tip.png
new file mode 100644
index 00000000..33aa88b5
--- /dev/null
+++ b/website/web/figures/tip.png
Binary files differ
diff --git a/website/web/figures/warning.png b/website/web/figures/warning.png
new file mode 100644
index 00000000..3c8a37df
--- /dev/null
+++ b/website/web/figures/warning.png
Binary files differ
diff --git a/website/web/index.xml b/website/web/index.xml
new file mode 100644
index 00000000..e5ccf4ad
--- /dev/null
+++ b/website/web/index.xml
@@ -0,0 +1,169 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>Liberty Alliance Single Sign On</title>
+ </head>
+ <body>
+
+ <p>
+ <acronym title="Liberty Alliance Single Sign On">Lasso</acronym> is a free
+ software C library aiming to implement the <a
+ href="http://www.projectliberty.org">Liberty Alliance</a> standards; it
+ defines processes for federated identities, single sign-on and related
+ protocols. Lasso is built on top of <a href="http://www.xmlsoft.org">libxml2</a>,
+ <a href="http://www.aleksey.com/xmlsec/">XMLSec</a> and <a
+ href="http://www.openssl.org">OpenSSL</a> and is licensed under the <a
+ href="/license">GNU General Public License</a>
+ (with an <a href="/license#openssl">OpenSSL exception</a>).
+ </p>
+
+ <p>
+ We strongly recommend the use of the <a href="/license">GNU General Public
+ License</a> each time it is possible. But for proprietary projects, that
+ wouldn't want to use it, we designed a <a
+ href="http://www.entrouvert.com/en/digital-identity/license-and-support">commercial
+ license</a>.
+ </p>
+
+ <p>
+ Lasso first focused on implementing the Liberty Alliance <acronym
+ title="IDentity Federation Framework">ID-FF</acronym> 1.2 protocols.
+ It now supports a good part of <acronym title="IDentity Web Services
+ Framework">ID-WSF</acronym> and SAML 2.0 support has also been completed.
+ </p>
+
+ <p>
+ <a href="http://www.swig.org">SWIG</a> is used to provide high-level
+ bindings for other languages. Currently tested and distributed bindings are
+ Python, Perl, Java and PHP as well as preliminary .NET assemblies (for C# and
+ the .NET runtime environment).
+ </p>
+
+ <p>
+ It is primarly developed on GNU/Linux and works on many UNIX environments
+ (including Apple MacOS X) and on Microsoft Windows.
+ </p>
+
+ <p>
+ The most recent version of Lasso is <strong>2.0.0</strong>. You can
+ <a
+ href="http://labs.libre-entreprise.org/frs/download.php/520/lasso-2.0.0.tar.gz">download
+ the 2.0.0 tarball here</a> or get more options on the general <a
+ href="/download/">download</a> page.
+ </p>
+
+ <!-- XXX note about different architectures -->
+
+ <h2>Support Matrix</h2>
+
+ <p>
+ Lasso is just a library, it is up to the applications to use it to implement
+ profiles defined by the Liberty Alliance. Lasso currently provides support
+ for the following profiles:
+ </p>
+
+ <table class="matrix">
+ <caption>Supported Liberty protocol profiles</caption>
+ <thead>
+ <tr>
+ <th>Feature</th>
+ <th><acronym title="Identity Provider">IdP</acronym></th>
+ <th><acronym title="Service Provider">SP</acronym></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Single Sign-On using Artifact Profile</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr>
+ <td>Single Sign-On using Browser POST Profile</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr>
+ <td>Single Sign-On using LECP Profile</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr class="even">
+ <td>Register Name Identifier - (IdP Initiated) - HTTP-Redirect</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr class="even">
+ <td>Register Name Identifier - (IdP Initiated) - SOAP/HTTP</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr class="even">
+ <td>Register Name Identifier - (SP Initiated) - HTTP-Redirect</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr class="even">
+ <td>Register Name Identifier - (SP Initiated) - SOAP/HTTP</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr>
+ <td>Federation Termination Notification (IdP Initiated) - HTTP-Redirect</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr>
+ <td>Federation Termination Notification (IdP Initiated) - SOAP/HTTP</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr>
+ <td>Federation Termination Notification (SP Initiated) - HTTP-Redirect</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr>
+ <td>Federation Termination Notification (SP Initiated) - SOAP/HTTP</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr class="even">
+ <td>Single Logout (IdP Initiated) ­ HTTP-Redirect</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr class="even">
+ <td>Single Logout (IdP Initiated) ­ HTTP-GET</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr class="even">
+ <td>Single Logout (IdP Initiated) ­ SOAP</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr class="even">
+ <td>Single Logout (SP Initiated) ­ HTTP-Redirect</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr class="even">
+ <td>Single Logout (SP Initiated) ­ SOAP</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr>
+ <td>Identity Provider Introduction (cookie)</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ </tbody>
+ </table>
+
+
+ <!-- XXX note about professional services -->
+
+ </body>
+</html>
+
diff --git a/website/web/license.xml b/website/web/license.xml
new file mode 100644
index 00000000..3458af8d
--- /dev/null
+++ b/website/web/license.xml
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>Copyright and License</title>
+ </head>
+ <body>
+
+ <h1>Copyright and License</h1>
+
+ <p>
+ Lasso is copyright © 2004, 2005 Entr'ouvert. The Lasso logo, copyright © 2004,
+ Entr'ouvert and Florent Monnier.
+ </p>
+
+ <p>
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the <a href="http://www.gnu.org/copyleft/gpl.html">GNU
+ General Public License</a> as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+ </p>
+
+ <p>
+ This program is distributed in the hope that it will be useful, but
+ <strong>without any warranty</strong>; without even the implied warranty of
+ <strong>merchantability</strong> or <strong>fitness for a particular
+ purpose</strong>. See the GNU General Public License for more details.
+ </p>
+
+ <p>
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ </p>
+
+ <p id="openssl">
+ In addition, as a special exception, Entr'ouvert gives permission to link
+ the code of its release of Lasso with the OpenSSL project's "OpenSSL"
+ library (or with modified versions of it that use the same license as the
+ "OpenSSL" library), and distribute the linked executables. You must obey
+ the GNU General Public License in all respects for all of the code used
+ other than "OpenSSL". If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do so.
+ If you do not wish to do so, delete this exception statement from your
+ version.
+ </p>
+
+ </body>
+</html>
+
diff --git a/website/web/links.xml b/website/web/links.xml
new file mode 100644
index 00000000..0a35761b
--- /dev/null
+++ b/website/web/links.xml
@@ -0,0 +1,62 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>Related Links</title>
+ </head>
+ <body>
+
+ <h1>Related Links</h1>
+
+ <h2>Lasso</h2>
+
+ <p>
+ <a href="http://authentic.labs.libre-entreprise.org">Authentic</a> is a
+ full-featured Liberty-compliant identity provider aiming to address a broad
+ range of needs, from simple to complex setups. (GNU GPL)
+ </p>
+
+ <p>
+ <a href="http://idpc.labs.libre-entreprise.org">IdPC</a> is a minimalist Liberty
+ identity provider written as a set of CGI scripts using Lasso. (GNU GPL)
+ </p>
+
+ <p>
+ <a href="http://labs.libre-entreprise.org/projects/liberatedav/">Liberate DAV!</a> is
+ a free (GPL) Liberty Alliance ID-FF single sign-on module for WebDAV Apache2 servers.
+ </p>
+
+ <p>
+ Lasso is used in the French <i>"Carte de Vie Quotidienne"</i> and
+ <i>"Services de Vie Quotidienne"</i> projects; the Lasso Python
+ bindings are used to run the identity provider (<a
+ href="https://macommune.identification.svq.fr">macommune.identification.svq.fr</a>)
+ and two service providers (<a
+ href="https://macommune.formulaires.svq.fr">macommune.formulaires.svq.fr</a>
+ and <a
+ href="https://macommune.consultation.svq.fr">macommune.consultation.svq.fr</a>).
+ The straight C library is used in the home-banking service provider.
+ </p>
+
+ <p>
+ <a href="souk/">Souk</a> is a Liberty Alliance
+ framework written in Python. It served as test platform to pass the Liberty
+ Conformance event. (GNU GPL, no longer maintained).
+ </p>
+
+ <p>
+ Free (GPL) PHP code, that was initially designed to ease implementation of Lasso in
+ services providers: <a
+ href="http://cvs.labs.libre-entreprise.org/cgi-bin/cvsweb.cgi/sp-kit/?cvsroot=lasso">
+ LASSO Service Provider Kit</a>. This "kit" is no more maintained.
+ </p>
+
+ <h2>Not Lasso</h2>
+
+ <p>
+ <a href="http://www.sourceid.org">SourceID</a> is an open source (custom license)
+ implementation of the Liberty Alliance ID-FF 1.2 protocols in Java.
+ </p>
+
+ </body>
+</html>
diff --git a/website/web/mailinglists/index.xml b/website/web/mailinglists/index.xml
new file mode 100644
index 00000000..c5c36407
--- /dev/null
+++ b/website/web/mailinglists/index.xml
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>Mailing Lists</title>
+ </head>
+ <body>
+ <h1>Mailing Lists</h1>
+
+ <p>
+ There are currently two mailing lists for Lasso.
+ </p>
+
+ <ul>
+ <li><a href="http://lists.labs.libre-entreprise.org/mailman/listinfo/lasso-devel">lasso-devel</a>:
+ main development mailing list (<a
+ href="http://lists.labs.libre-entreprise.org/pipermail/lasso-devel/">archives</a>)</li>
+
+ <li><a href="http://lists.labs.libre-entreprise.org/mailman/listinfo/lasso-cvs-commits">lasso-cvs-commits</a>:
+ CVS commits are sent here (<a
+ href="http://lists.labs.libre-entreprise.org/pipermail/lasso-cvs-commits/">archives</a>)</li>
+ </ul>
+
+ </body>
+</html>
+
diff --git a/website/web/news/00-release-0.6.0.xml b/website/web/news/00-release-0.6.0.xml
new file mode 100644
index 00000000..a6fd7e29
--- /dev/null
+++ b/website/web/news/00-release-0.6.0.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<div xmlns="http://www.w3.org/1999/xhtml">
+ <h3>2005-01-17: Released 0.6.0</h3>
+
+ <p>
+ I am pleased to announce the release of Lasso 0.6.0.
+ <a href="/download/">Download it now</a>
+ </p>
+
+ <p class="changes">
+ <strong>What changed ?</strong> Library internals were rewritten to use
+ standard structures instead of libxml2 nodes; this allows <a
+ href="/perfs">faster processing</a>,
+ more flexibility and better support for language bindings. All the <a
+ href="/documentation/api-reference/index.html">API
+ functions</a> were documented. And many fixes and improvements found their way.
+ </p>
+
+</div>
diff --git a/website/web/news/01-release-0.6.1.xml b/website/web/news/01-release-0.6.1.xml
new file mode 100644
index 00000000..01bd08bd
--- /dev/null
+++ b/website/web/news/01-release-0.6.1.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<div xmlns="http://www.w3.org/1999/xhtml">
+ <h3>2005-02-22: Released 0.6.1</h3>
+
+ <p>
+ Lasso 0.6.1 has been released.
+ <a href="/download/">Download it now</a>
+ </p>
+
+ <p class="changes">
+ <strong>What changed ?</strong> &lt;lib:Extension&gt; support has been
+ completed as well as full bidirectional query string support
+ for AuthnContextStatementRef, AuthnContextClassRef and
+ AuthnContextComparison. Bugs were fixed and Lasso got working support for
+ Microsoft compiler and tools.
+ </p>
+
+</div>
diff --git a/website/web/news/02-slides-solution-linux.xml b/website/web/news/02-slides-solution-linux.xml
new file mode 100644
index 00000000..bdf042c5
--- /dev/null
+++ b/website/web/news/02-slides-solution-linux.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<div xmlns="http://www.w3.org/1999/xhtml">
+ <h3>2005-02-01: Conference at <a href="http://www.solutionslinux.fr">Solutions Linux</a></h3>
+
+ <p>
+ Lasso made a remarked appearance in the "Identity management" track. <a
+ href="/documentation/slides/20050201-lasso-solutions-linux.pdf">Slides are
+ available here</a> (in French).
+ </p>
+
+</div>
diff --git a/website/web/news/03-release-0.6.2.xml b/website/web/news/03-release-0.6.2.xml
new file mode 100644
index 00000000..c4cef910
--- /dev/null
+++ b/website/web/news/03-release-0.6.2.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<div xmlns="http://www.w3.org/1999/xhtml">
+ <h3>2005-05-26: Released 0.6.2</h3>
+
+ <p>
+ Lasso 0.6.2 has been released.
+ <a href="/download/">Download it now</a>
+ </p>
+
+ <p class="changes">
+ <strong>What changed ?</strong>
+ Fixed usage of NameIdentifiers after calls to Register Name Identifier
+ profile, improved robustness against other Liberty implementations, improved
+ loading of metadata, fixed minor bugs and memory leaks. Continued work on
+ ID-WSF support, still partial and disabled by default.
+ </p>
+
+</div>
diff --git a/website/web/news/04-release-0.6.3.xml b/website/web/news/04-release-0.6.3.xml
new file mode 100644
index 00000000..ab353367
--- /dev/null
+++ b/website/web/news/04-release-0.6.3.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<div xmlns="http://www.w3.org/1999/xhtml">
+ <h3>2005-09-30: Released 0.6.3</h3>
+
+ <p>
+ Lasso 0.6.3 has been released.
+ <a href="/download/">Download it now</a>
+ </p>
+
+ <p class="changes">
+ <strong>What changed ?</strong>
+ Improved behaviour when confronted to other Liberty providers that do not
+ implement all the mandatory Liberty requirements, improved error status code
+ reporting, completed support for public keys embedded in metadata files,
+ fixed a few corner case bugs. Also continued work on ID-WSF support,
+ implementing Discovery and DST services but still considered experimental
+ and disabled by default.
+ </p>
+
+</div>
diff --git a/website/web/news/05-release-0.6.4.xml b/website/web/news/05-release-0.6.4.xml
new file mode 100644
index 00000000..b9ba3067
--- /dev/null
+++ b/website/web/news/05-release-0.6.4.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<div xmlns="http://www.w3.org/1999/xhtml">
+ <h3>2006-03-08: Released 0.6.4</h3>
+
+ <p>
+ Lasso 0.6.4 has been released.
+ <a href="/download/">Download it now</a>
+ </p>
+
+ <p class="changes">
+ <strong>What changed ?</strong>
+Added first draft of ID-WSF Interaction Service support, added message
+signatures to ID-WSF messages, added first draft of SAML 2 support (only
+Web-SSO and part of Single Logout for the moment), fixed some corner cases,
+improved error detection in different places, upgraded SWIG support to 1.3.28
+and generally improved the bindings.
+ </p>
+
+</div>
diff --git a/website/web/news/06-release-0.6.5.xml b/website/web/news/06-release-0.6.5.xml
new file mode 100644
index 00000000..ae2cc28b
--- /dev/null
+++ b/website/web/news/06-release-0.6.5.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<div xmlns="http://www.w3.org/1999/xhtml">
+ <h3>2006-03-21: Released 0.6.5</h3>
+
+ <p>
+ Lasso 0.6.5 has been released.
+ <a href="/download/">Download it now</a>
+ </p>
+
+ <p class="changes">
+ <strong>What changed ?</strong>
+Fixed support for SWIG 1.3.28 (now required), fixed a win3 build issue, fixed
+documentation.
+ </p>
+
+</div>
diff --git a/website/web/news/07-saml2.xml b/website/web/news/07-saml2.xml
new file mode 100644
index 00000000..14a286dc
--- /dev/null
+++ b/website/web/news/07-saml2.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<div xmlns="http://www.w3.org/1999/xhtml">
+ <h3>2006-11-05: SAML 2.0 interoperability</h3>
+
+ <p>
+ Interoperability tests with other SAML 2.0 implementations has turned
+ serious, see current
+ <a href="/documentation/interoperability">interoperability results</a>
+ </p>
+
+</div>
diff --git a/website/web/news/08-release-2.0.0.xml b/website/web/news/08-release-2.0.0.xml
new file mode 100644
index 00000000..2342f809
--- /dev/null
+++ b/website/web/news/08-release-2.0.0.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<div xmlns="http://www.w3.org/1999/xhtml">
+ <h3>2007-01-16: Released 2.0.0</h3>
+
+ <p>
+ Lasso 2.0.0 has been released.
+ <a href="/download/">Download it now</a>
+ </p>
+
+ <p class="changes">
+ <strong>What changed ?</strong>
+Completed SAMLv2 support, passed conformance event organized by the Liberty
+Alliance from December 4th to 8th 2006. Gratuitous giant version bump to
+mark this step. Fixed memory leaks and potential segmentation faults.
+ </p>
+
+</div>
diff --git a/website/web/news/index.xml b/website/web/news/index.xml
new file mode 100644
index 00000000..7631f35d
--- /dev/null
+++ b/website/web/news/index.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<catalog xmlns="http://www.entrouvert.org/namespaces/expression/0.0">
+ <rootElementName>div</rootElementName>
+ <rootElementNamespace>http://www.w3.org/1999/xhtml</rootElementNamespace>
+ <contentElementName>div</contentElementName>
+ <root rel="relative"/>
+ <sort reverse="true">html:h2</sort>
+ <count>2</count>
+</catalog>
+
diff --git a/website/web/souk/example-schema.png b/website/web/souk/example-schema.png
new file mode 100644
index 00000000..0c093170
--- /dev/null
+++ b/website/web/souk/example-schema.png
Binary files differ
diff --git a/website/web/souk/index.xml b/website/web/souk/index.xml
new file mode 100644
index 00000000..11836333
--- /dev/null
+++ b/website/web/souk/index.xml
@@ -0,0 +1,197 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>Souk</title>
+ </head>
+ <body>
+
+ <h1>Souk</h1>
+
+ <p class="warning">
+ Souk is no longer maintained. If you are looking for an Identity Provider,
+ you should look at <a
+ href="http://authentic.labs.libre-entreprise.org">Authentic</a>.
+ </p>
+
+ <p>
+ Souk is a free software Python framework that implements the <a
+ href="http://www.projectliberty.org">Liberty Alliance</a> <acronym
+ title="IDentity Federation Framework">ID-FF</acronym> 1.2 protocols.
+ It allows to build full-featured identity providers, service providers and
+ proxies and includes sample code for all these servers (See
+ <a href="#examples">examples below</a>).
+ </p>
+
+ <img alt="Screenshot of Liberty Alliance single sign-on using one of Souk."
+ src="sp1-sso.png" />
+
+ <p>
+ Initially, Souk has been developped as a test environment for <a
+ href="http://lasso.entrouvert.org">Lasso</a> (See last column in <a
+ href="http://lasso.entrouvert.org/buildbox">CVS Status table</a>).
+ </p>
+
+ <p>
+ It is built on top of <a href="http://lasso.entrouvert.org">Lasso</a>,
+ <a href="http://www.xmlsoft.org">libxml2 &amp; libxslt</a> and <a
+ href="http://www.openssl.org">OpenSSL</a> and is developed on
+ GNU/Linux.
+ </p>
+
+
+ <h2>License</h2>
+
+
+ <p>
+ Souk is Free Software licensed under the <a href="/license">GNU
+ General Public License</a> (with an <a href="/license#openssl"
+ >OpenSSL exception</a>).
+ </p>
+
+ <p>Copyright © 2004, 2005 <a href="http://www.entrouvert.com">Entr'ouvert</a></p>
+
+
+ <h2>Download</h2>
+
+
+ <h3>Source</h3>
+
+ <p>
+ The latest Souk release is available as a gzipped tarball: <a
+ href="http://labs.libre-entreprise.org/download.php/361/souk-0.6.0.tar.gz"
+ >souk-0.6.0.tar.gz</a>
+ </p>
+
+ <p>
+ This version of Souk is designed to be used with Lasso 0.6.0 or greater.
+ </p>
+
+ <h3>Packages</h3>
+
+<!--
+ <p>
+ Debian packages are available, they are included in the current
+ development version (<i>sid</i>) and packages for the current
+ stable version (<i>sarge</i>) are available in this apt repository:
+ </p>
+
+ <pre>
+deb http://www.entrouvert.org ./debian/souk/
+</pre>
+-->
+
+ <p>
+ Since version 0.6.0, Souk has been ported to Windows and an installer is available from the
+ <a href="http://labs.libre-entreprise.org/project/showfiles.php?group_id=57">GForge project
+ page</a>.
+ </p>
+
+ <h2>Install</h2>
+
+
+ <pre class="literal-block">
+ python setup.py build
+ python setup.py install
+</pre>
+
+
+ <h2 id="examples">Examples</h2>
+
+ <p>
+ One of the Souk examples features 2 service providers, 2 different kinds of proxies
+ and 2 identity providers.
+ </p>
+
+ <img alt="2 service providers, 1 passive proxy, 1 dynamic proxy and 2 identity providers"
+ src="example-schema.png" />
+
+
+ <p>
+ To test it, add the following lines to your <code>/etc/hosts</code> file:
+ </p>
+
+ <pre class="literal-block">
+127.0.0.1 idp1.lasso.lan idp2.lasso.lan
+127.0.0.1 proxy1.lasso.lan proxy2.lasso.lan
+127.0.0.1 sp1.lasso.lan sp2.lasso.lan
+</pre>
+
+ <p>
+ Enter the <code>examples/lasso.lan</code> directory.
+ </p>
+
+ <p>
+ Launch each server below in a different terminal:
+ </p>
+
+ <pre class="literal-block">
+./sp1.py
+./sp2.py
+./proxy1.py
+./proxy2.py
+./idp1.py
+./idp2.py
+</pre>
+
+ <p>
+ Restart your web browser to take care of the changes in <code>/etc/hosts</code>.
+ Then you can use it to connect to the following URLs:
+ </p>
+
+ <ul>
+ <li>https://sp1.lasso.lan:2006</li>
+ <li>https://sp2.lasso.lan:2008</li>
+ <li>https://proxy1.lasso.lan:2014</li>
+ <li>https://proxy2.lasso.lan:2016</li>
+ <li>https://idp1.lasso.lan:1998</li>
+ <li>https://idp2.lasso.lan:2000</li>
+ </ul>
+
+ <p>
+ At startup, there exists 4 accounts on each service and identity provider.
+ Their login begins with "alice", "bob", "charlie" &amp; "david" and are
+ suffixed using "-sp1", "-sp2", "-idp1" &amp; "-idp2". For example the login
+ for Bob on service provider 2 is "bob-sp2".
+ </p>
+
+ <div class="warning">
+
+ <p class="admonition-title first">
+ Warning
+ </p>
+
+ <p>
+ Initially there is no identity federation between accounts. So the first time
+ you attempt to single sign-on, don't forget to set "Name ID Policy" to
+ "Federated", otherwise the authentication will fail.
+ </p>
+
+ </div>
+
+ <div class="warning">
+
+ <p class="admonition-title first">
+ Warning
+ </p>
+
+ <p>
+ Each server stores everything in RAM. It doesn't remember anything once it is
+ stopped; even identity federations are lost.
+ </p>
+
+ </div>
+
+
+ <h2>Mailing-Lists, Bugs Reports...</h2>
+
+
+ <p>
+ Everything is on our <a href="http://gforge.org">GForge</a> site: <a
+ href="http://labs.libre-entreprise.org/projects/souk/"
+ >http://labs.libre-entreprise.org/projects/souk/</a>.
+ </p>
+
+ </body>
+</html>
+
diff --git a/website/web/souk/sp1-sso.png b/website/web/souk/sp1-sso.png
new file mode 100644
index 00000000..e5ab2cb9
--- /dev/null
+++ b/website/web/souk/sp1-sso.png
Binary files differ