website import

This commit is contained in:
Frédéric Péters 2007-03-26 12:58:33 +00:00
parent 6b77c53a27
commit ec6e0af2b1
51 changed files with 4342 additions and 0 deletions

View File

@ -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

739
website/ezt.py Normal file
View File

@ -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])

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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]

9
website/web/buildbox.xml Normal file
View File

@ -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>

View File

@ -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;
}

186
website/web/css/lasso.css Normal file
View File

@ -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;
}

BIN
website/web/css/lasso.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -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;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
website/web/css/note.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
website/web/css/warning.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -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>

1
website/web/doap.rdf Symbolic link
View File

@ -0,0 +1 @@
../../doap.rdf

View File

@ -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>

View File

@ -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;
}

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 28 KiB

BIN
website/web/figures/tip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

169
website/web/index.xml Normal file
View File

@ -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>

51
website/web/license.xml Normal file
View File

@ -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>

62
website/web/links.xml Normal file
View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

197
website/web/souk/index.xml Normal file
View File

@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB