website import
|
@ -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
|
||||
|
|
@ -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
|
||||
" and >)
|
||||
"""
|
||||
#
|
||||
# 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])
|
|
@ -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&group_id=31&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>
|
|
@ -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] [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> [end][if-any build.buildlog295] / <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>
|
|
@ -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>
|
||||
|
|
@ -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]
|
|
@ -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>
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
After Width: | Height: | Size: 13 KiB |
|
@ -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;
|
||||
}
|
||||
|
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 3.2 KiB |
|
@ -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>
|
|
@ -0,0 +1 @@
|
|||
../../doap.rdf
|
|
@ -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>
|
|
@ -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;
|
||||
}
|
|
@ -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>
|
||||
|
|
@ -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 & 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 & 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 & 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 & 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 & 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>
|
|
@ -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>“AuthenticationRequest” generation</h2>
|
||||
|
||||
<pre>
|
||||
lasso_login_init_authn_request(login, "https://idp1/metadata", LASSO_HTTP_METHOD_REDIRECT);
|
||||
request = LASSO_LIB_AUTHN_REQUEST(LASSO_PROFILE(login)->request);
|
||||
request->IsPassive = 0;
|
||||
request->NameIDPolicy = g_strdup(LASSO_LIB_NAMEID_POLICY_TYPE_FEDERATED);
|
||||
request->consent = g_strdup(LASSO_LIB_CONSENT_OBTAINED);
|
||||
request->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>“AuthenticationResponse” 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>
|
|
@ -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>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 7.1 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 3.2 KiB |
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
@ -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>
|
|
@ -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> <lib:Extension> 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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||
|
After Width: | Height: | Size: 45 KiB |
|
@ -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 & 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" & "david" and are
|
||||
suffixed using "-sp1", "-sp2", "-idp1" & "-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>
|
||||
|
After Width: | Height: | Size: 58 KiB |