Merge pull request #27 from dv10den/master
Added documentation structure
This commit is contained in:
BIN
doc/_static/ViewmeonGitHub.png
vendored
Normal file
BIN
doc/_static/ViewmeonGitHub.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.0 KiB |
23
doc/conf.py
23
doc/conf.py
@@ -12,6 +12,7 @@
|
||||
# serve to show the default.
|
||||
|
||||
import sys, os
|
||||
import alabaster
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
@@ -25,7 +26,7 @@ import sys, os
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode']
|
||||
extensions = ['alabaster', 'sphinx.ext.autodoc', 'sphinx.ext.viewcode']
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
@@ -91,7 +92,25 @@ pygments_style = 'sphinx'
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
html_theme = 'default'
|
||||
html_theme_path = [alabaster.get_path()]
|
||||
html_theme = 'alabaster'
|
||||
html_sidebars = {
|
||||
'**': [
|
||||
'about.html',
|
||||
'navigation.html',
|
||||
'searchbox.html',
|
||||
'donate.html',
|
||||
]
|
||||
}
|
||||
|
||||
html_theme_options = {
|
||||
'description': '',
|
||||
'github_button': False,
|
||||
'github_user': 'its-dirg',
|
||||
'github_repo': 'IdProxy',
|
||||
'github_banner': False,
|
||||
|
||||
}
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
|
||||
@@ -206,7 +206,7 @@ Running the script testing an IDP
|
||||
Synopsis::
|
||||
|
||||
$ idp_testdrv.py --help
|
||||
usage: idp_testdrv.py [-h] [-d] [-H] [-i] [-C CA_CERTS] [-J TT_CONFIG_FILE] [-m] [-l]
|
||||
usage: idp_testdrv.py [-h] [-d] [-H] [-C CA_CERTS] [-J TT_CONFIG_FILE] [-m] [-l]
|
||||
[-c TD_CONFIG]
|
||||
[oper]
|
||||
|
||||
@@ -215,15 +215,14 @@ Synopsis::
|
||||
|
||||
optional arguments:
|
||||
-C CA_CERTS CA certs to use to verify HTTPS server certificates, if
|
||||
HTTPS is used and server certs are passed with -C then
|
||||
the default cert verification will be done using keys/cacert.pem,
|
||||
which is derived from Mozilla's ca_bundle.crt.
|
||||
HTTPS is used and no server CA certs are defined then
|
||||
no cert verification will be done. For a generic validation you may use the ca_bundle.crt
|
||||
file that comes with Mozilla.
|
||||
-c TD_CONFIG, --config Test driver configuration module at the current directory or the path specified
|
||||
with the -P option. Do not use relative paths or the .py filename extension
|
||||
-d, --debug Print debug information to stderr
|
||||
-H, --prettyprint Human readable status output
|
||||
-h, --help show this help message and exit
|
||||
-i, --insecure do not check TLS certificate (overriding -C option)
|
||||
-J TT_CONFIG_FILE Test target configuration in JSON format
|
||||
-L, --log Print HTTP log information # TODO: update documentation
|
||||
-l, --list List all the test operations as a JSON object
|
||||
@@ -242,22 +241,20 @@ Running the script testing an SP
|
||||
Synopsis::
|
||||
|
||||
$ sp_testdrv.py --help
|
||||
usage: sp_testdrv.py [-h] [-d] [-C CA_CERTS] [-i] [-J TT_CONFIG_FILE] [-m] [-l] [-c TD_CONFIG] [-t TEST_PACKAGE] [oper]
|
||||
usage: sp_testdrv.py [-h] [-d] [-C CA_CERTS] [-J TT_CONFIG_FILE] [-m] [-l] [-c TD_CONFIG] [oper]
|
||||
|
||||
positional arguments:
|
||||
oper Which test to run (mandatory except for options -h, -l and -m)
|
||||
|
||||
optional arguments:
|
||||
-C CA_CERTS CA certs to use to verify HTTPS server certificates, if
|
||||
HTTPS is used and server certs are passed with -C then
|
||||
the default cert verification will be done using keys/cacert.pem,
|
||||
which is derived from Mozilla's ca_bundle.crt.
|
||||
HTTPS is used and no server CA certs are defined then
|
||||
no cert verification will be done. For a generic validation you may use the ca_bundle.crt
|
||||
file that comes with Mozilla.
|
||||
-c TD_CONFIG, --config Test driver configuration module at the current directory or the path specified
|
||||
with the -P option. Do not use relative paths or filename extension
|
||||
-d, --debug Print debug information to stderr
|
||||
-H, --prettyprint Human readable status output
|
||||
-h, --help show this help message and exit
|
||||
-i, --insecure do not check TLS certificate (overriding -C option)
|
||||
-J TT_CONFIG_FILE Test target configuration in JSON format
|
||||
-L, --log Print HTTP log information # TODO: update documentation
|
||||
-l, --list List all the test flows as a JSON object
|
||||
|
||||
@@ -18,6 +18,7 @@ Contents:
|
||||
|
||||
howto
|
||||
install
|
||||
saml2test
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
@@ -26,3 +27,8 @@ Indices and tables
|
||||
* :ref:`modindex`
|
||||
* :ref:`search`
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<a href="https://github.com/rohe/saml2test" class="github" target="_blank">
|
||||
<img style="position: absolute; top: 0; right: 0; border: 0;" src="_static/ViewmeonGitHub.png" alt="Fork me on GitHub" class="github"/>
|
||||
</a>
|
||||
5
doc/make.sh
Executable file
5
doc/make.sh
Executable file
@@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
rm -f saml2test*
|
||||
sphinx-apidoc -F -o ../doc/ ../src/saml2test
|
||||
make clean
|
||||
make html
|
||||
@@ -1,8 +1,9 @@
|
||||
#!/usr/bin/env python
|
||||
__author__ = 'rohe0002'
|
||||
|
||||
from sp_test import tests
|
||||
from sp_test import Client
|
||||
from sp_test.check import factory
|
||||
|
||||
cli = Client(factory)
|
||||
cli.run()
|
||||
cli = Client(tests, factory)
|
||||
cli.run()
|
||||
7
setup.py
7
setup.py
@@ -21,19 +21,18 @@ __author__ = 'rohe0002'
|
||||
|
||||
setup(
|
||||
name="saml2test",
|
||||
version="0.5.0beta",
|
||||
version="0.4.3",
|
||||
description="SAML2 test tool",
|
||||
author = "Roland Hedberg",
|
||||
author_email = "roland.hedberg@adm.umu.se",
|
||||
license="Apache 2.0",
|
||||
packages=["idp_test", "idp_test/package", "saml2test", "sp_test",
|
||||
"sp_test/test_suites"],
|
||||
packages=["idp_test", "idp_test/package", "saml2test", "sp_test"],
|
||||
package_dir = {"": "src"},
|
||||
classifiers = [
|
||||
"Development Status :: 4 - Beta",
|
||||
"License :: OSI Approved :: Apache Software License",
|
||||
"Topic :: Software Development :: Libraries :: Python Modules"],
|
||||
install_requires = ["pysaml2 >= 2",
|
||||
install_requires = ["pysaml2",
|
||||
"mechanize",
|
||||
"argparse",
|
||||
"beautifulsoup4",
|
||||
|
||||
@@ -19,10 +19,9 @@ from saml2.mdstore import MetaData
|
||||
from saml2test import FatalError, OperationError
|
||||
from saml2test import exception_trace
|
||||
from saml2test import ContextFilter
|
||||
from saml2test import JSON_DUMPS_ARGS
|
||||
|
||||
from base import Conversation
|
||||
from check import CheckSaml2IntMetaData
|
||||
from idp_test.base import Conversation
|
||||
from idp_test.check import CheckSaml2IntMetaData
|
||||
|
||||
# Schemas supported
|
||||
from saml2 import md
|
||||
@@ -40,12 +39,10 @@ SCHEMA = [dri, idpdisc, md, mdattr, mdui, saml, ui, xmldsig, xmlenc]
|
||||
|
||||
__author__ = 'rolandh'
|
||||
|
||||
#logger = logging.getLogger("")
|
||||
#logger.setLevel(logging.DEBUG)
|
||||
#formatter = logging.Formatter("%(asctime)s %(name)s:%(levelname)s "
|
||||
#"%(message)s")
|
||||
formatter_2 = logging.Formatter("%(delta).6f - %(levelname)s - [%(name)s] "
|
||||
"%(message)s")
|
||||
logger = logging.getLogger("")
|
||||
logger.setLevel(logging.DEBUG)
|
||||
#formatter = logging.Formatter("%(asctime)s %(name)s:%(levelname)s %(message)s")
|
||||
formatter_2 = logging.Formatter("%(delta).6f - %(levelname)s - [%(name)s] %(message)s")
|
||||
|
||||
cf = ContextFilter()
|
||||
cf.start()
|
||||
@@ -53,20 +50,12 @@ cf.start()
|
||||
streamhandler = logging.StreamHandler(sys.stderr)
|
||||
streamhandler.setFormatter(formatter_2)
|
||||
|
||||
memoryhandler = logging.handlers.MemoryHandler(1024 * 10, logging.DEBUG)
|
||||
memoryhandler = logging.handlers.MemoryHandler(1024*10, logging.DEBUG)
|
||||
memoryhandler.addFilter(cf)
|
||||
|
||||
#saml2testlog = logging.getLogger("saml2test")
|
||||
#saml2testlog.addHandler(memoryhandler)
|
||||
#saml2testlog.setLevel(logging.DEBUG)
|
||||
logger = logging.getLogger("saml2test")
|
||||
logger.setLevel(logging.DEBUG)
|
||||
logger.addHandler(memoryhandler)
|
||||
# The streamhandler variable should be added to the logger if
|
||||
# you want to see the log messages as they are printed instead
|
||||
# of afterwards (mostly useful during debugging
|
||||
#logger.addHandler(streamhandler)
|
||||
logger.setLevel(logging.DEBUG)
|
||||
saml2testlog = logging.getLogger("saml2test")
|
||||
saml2testlog.addHandler(memoryhandler)
|
||||
saml2testlog.setLevel(logging.DEBUG)
|
||||
|
||||
|
||||
def recursive_find_module(name, path=None):
|
||||
@@ -116,9 +105,9 @@ class SAML2client(object):
|
||||
self._parser.add_argument('-L', dest='log', action='store_true',
|
||||
help="Print log information")
|
||||
self._parser.add_argument(
|
||||
'-C', dest="ca_certs",
|
||||
help=("CA certs to use to verify HTTPS server certificates, "
|
||||
"if HTTPS is used and no server CA certs are defined then "
|
||||
'-C', dest="§",
|
||||
help=("CA certs to use to verify HTTPS server certificates, ",
|
||||
"if HTTPS is used and no server CA certs are defined then ",
|
||||
"no cert verification will be done"))
|
||||
self._parser.add_argument('-J', dest="json_config_file",
|
||||
help="Script configuration")
|
||||
@@ -151,7 +140,6 @@ class SAML2client(object):
|
||||
self.constraints = {}
|
||||
self.operations = None
|
||||
self.args = None
|
||||
self.client = None
|
||||
|
||||
def json_config_file(self):
|
||||
if self.args.json_config_file == "-":
|
||||
@@ -219,7 +207,7 @@ class SAML2client(object):
|
||||
try:
|
||||
self.entity_id = _jc["entity_id"]
|
||||
# Verify its the correct metadata
|
||||
assert self.entity_id in md.entity.keys(), "Entityid {0} not found in {1}".format(self.entity_id, ', '.join(md.entity.keys()))
|
||||
assert self.entity_id in md.entity.keys()
|
||||
except KeyError:
|
||||
if len(md.entity.keys()) == 1:
|
||||
self.entity_id = md.entity.keys()[0]
|
||||
@@ -296,34 +284,15 @@ class SAML2client(object):
|
||||
self.setup()
|
||||
except (AttributeError, ToOld), err:
|
||||
print >> sys.stdout, "Configuration Error: %s" % err
|
||||
return
|
||||
|
||||
self.client = Saml2Client(self.sp_config)
|
||||
conv = None
|
||||
|
||||
if self.args.pretty:
|
||||
pp = pprint.PrettyPrinter(indent=4)
|
||||
else:
|
||||
pp = None
|
||||
|
||||
conv = None
|
||||
|
||||
try:
|
||||
self.client = Saml2Client(self.sp_config)
|
||||
except Exception, err:
|
||||
if conv:
|
||||
self.test_log = conv.test_output
|
||||
self.test_log.append(exception_trace("RUN", err))
|
||||
else:
|
||||
self.test_log = exception_trace("RUN", err)
|
||||
tsum = self.test_summation(self.args.oper)
|
||||
|
||||
if pp:
|
||||
pp.pprint(tsum)
|
||||
else:
|
||||
print >> sys.stdout, json.dumps(tsum, **JSON_DUMPS_ARGS)
|
||||
|
||||
if tsum["status"] > 1 or self.args.debug or err:
|
||||
self.output_log(memoryhandler, streamhandler)
|
||||
return
|
||||
|
||||
try:
|
||||
try:
|
||||
oper = self.operations.OPERATIONS[self.args.oper]
|
||||
@@ -369,7 +338,7 @@ class SAML2client(object):
|
||||
if pp:
|
||||
pp.pprint(tsum)
|
||||
else:
|
||||
print >> sys.stdout, json.dumps(tsum, **JSON_DUMPS_ARGS)
|
||||
print >> sys.stdout, json.dumps(tsum)
|
||||
|
||||
if tsum["status"] > 1 or self.args.debug or err:
|
||||
self.output_log(memoryhandler, streamhandler)
|
||||
@@ -416,7 +385,7 @@ class SAML2client(object):
|
||||
|
||||
lista.append(item)
|
||||
|
||||
print json.dumps(lista, **JSON_DUMPS_ARGS)
|
||||
print json.dumps(lista)
|
||||
|
||||
def _get_operation(self, operation):
|
||||
return self.operations.OPERATIONS[operation]
|
||||
@@ -430,7 +399,7 @@ class SAML2client(object):
|
||||
mod = import_module("config")
|
||||
_res = dict([(key, cnf["description"]) for key, cnf in
|
||||
mod.CONFIG.items()])
|
||||
print json.dumps(_res, **JSON_DUMPS_ARGS)
|
||||
print json.dumps(_res)
|
||||
|
||||
def verify_metadata(self):
|
||||
self.json_config = self.json_config_file()
|
||||
|
||||
@@ -5,16 +5,14 @@ import urllib
|
||||
import cookielib
|
||||
|
||||
from saml2 import BINDING_HTTP_REDIRECT, BINDING_URI
|
||||
from saml2 import BINDING_HTTP_POST, BINDING_SOAP
|
||||
from saml2 import httpbase
|
||||
from saml2 import BINDING_HTTP_POST
|
||||
from saml2 import BINDING_SOAP
|
||||
|
||||
from saml2.mdstore import REQ2SRV
|
||||
from saml2.pack import http_redirect_message
|
||||
from saml2.pack import http_form_post_message
|
||||
from saml2.pack import http_redirect_message, http_form_post_message
|
||||
from saml2.s_utils import rndstr
|
||||
|
||||
from saml2test import tool
|
||||
from saml2test import OperationError
|
||||
from saml2test import FatalError
|
||||
|
||||
__author__ = 'rohe0002'
|
||||
@@ -82,14 +80,7 @@ class Conversation(tool.Conversation):
|
||||
|
||||
response = None
|
||||
for srv in srvs:
|
||||
try:
|
||||
response = self._send(srv)
|
||||
except httpbase.ConnectionError, err:
|
||||
logger.debug("IO error: %s" % err)
|
||||
raise OperationError("IO error: %s" % err)
|
||||
except Exception, err:
|
||||
raise
|
||||
|
||||
response = self._send(srv)
|
||||
if response is not None:
|
||||
break
|
||||
|
||||
@@ -105,7 +96,7 @@ class Conversation(tool.Conversation):
|
||||
try:
|
||||
req = self.oper.args["message"]
|
||||
except KeyError:
|
||||
req_id, req = self.qfunc(**self.qargs)
|
||||
req = self.qfunc(**self.qargs)
|
||||
|
||||
self.request = self.oper.pre_processing(req, self.args)
|
||||
str_req = "%s" % self.request
|
||||
@@ -193,9 +184,9 @@ class Conversation(tool.Conversation):
|
||||
# remove args the create function can't handle
|
||||
fargs = inspect.getargspec(self.qfunc).args
|
||||
if _oper._class:
|
||||
fargs.extend([p for p, _c, _r in
|
||||
fargs.extend([p for p, c, r in
|
||||
_oper._class.c_attributes.values()])
|
||||
fargs.extend([p for p, _c in _oper._class.c_children.values()])
|
||||
fargs.extend([p for p, c in _oper._class.c_children.values()])
|
||||
for arg in qargs.keys():
|
||||
if arg not in fargs:
|
||||
del qargs[arg]
|
||||
@@ -203,7 +194,7 @@ class Conversation(tool.Conversation):
|
||||
self.qargs = qargs
|
||||
|
||||
def my_endpoints(self):
|
||||
return [e for e, _b in self.client.config.getattr("endpoints", "sp")[
|
||||
return [e for e, b in self.client.config.getattr("endpoints", "sp")[
|
||||
"assertion_consumer_service"]]
|
||||
|
||||
def handle_result(self):
|
||||
@@ -249,4 +240,4 @@ class Conversation(tool.Conversation):
|
||||
logger.error("Exception %s" % err)
|
||||
self.err_check("exception", err)
|
||||
|
||||
return True
|
||||
return True
|
||||
@@ -19,13 +19,20 @@ from saml2.samlp import Response
|
||||
from saml2.sigver import cert_from_key_info_dict
|
||||
from saml2.sigver import key_from_key_value_dict
|
||||
|
||||
# Import the status codes used indicate the test results
|
||||
from saml2test.status import OK, CRITICAL, WARNING
|
||||
|
||||
from saml2.time_util import str_to_time
|
||||
|
||||
__author__ = 'rolandh'
|
||||
|
||||
INFORMATION = 0
|
||||
OK = 1
|
||||
WARNING = 2
|
||||
ERROR = 3
|
||||
CRITICAL = 4
|
||||
INTERACTION = 5
|
||||
|
||||
STATUSCODE = ["INFORMATION", "OK", "WARNING", "ERROR", "CRITICAL",
|
||||
"INTERACTION"]
|
||||
|
||||
PREFIX = "-----BEGIN CERTIFICATE-----"
|
||||
POSTFIX = "-----END CERTIFICATE-----"
|
||||
|
||||
@@ -56,8 +63,7 @@ class CheckSaml2IntMetaData(Check):
|
||||
|
||||
# contact person
|
||||
if "contact_person" not in idpsso and "contact_person" not in ed:
|
||||
self._message = "Metadata should contain contact person "
|
||||
"information"
|
||||
self._message = "Metadata should contain contact person information"
|
||||
self._status = WARNING
|
||||
return res
|
||||
else:
|
||||
@@ -251,15 +257,14 @@ class CheckSubjectNameIDFormat(Check):
|
||||
"""
|
||||
The <NameIDPolicy> element tailors the name identifier in the subjects of
|
||||
assertions resulting from an <AuthnRequest>.
|
||||
When this element is used, if the content is not understood by or
|
||||
acceptable to the identity provider, then a <Response> message element MUST
|
||||
be returned with an error <Status>, and MAY contain a second-level
|
||||
When this element is used, if the content is not understood by or acceptable
|
||||
to the identity provider, then a <Response> message element MUST be
|
||||
returned with an error <Status>, and MAY contain a second-level
|
||||
<StatusCode> of urn:oasis:names:tc:SAML:2.0:status:InvalidNameIDPolicy.
|
||||
If the Format value is omitted or set to
|
||||
urn:oasis:names:tc:SAML:2.0:nameid-format:unspecified, then the identity
|
||||
provider is free to return any kind of identifier, subject to any
|
||||
additional constraints due to the content of this element or the policies
|
||||
of the identity provider or principal.
|
||||
If the Format value is omitted or set to urn:oasis:names:tc:SAML:2.0:nameid-
|
||||
format:unspecified, then the identity provider is free to return any kind
|
||||
of identifier, subject to any additional constraints due to the content of
|
||||
this element or the policies of the identity provider or principal.
|
||||
"""
|
||||
cid = "check-saml2int-nameid-format"
|
||||
msg = "Attribute error"
|
||||
@@ -460,7 +465,7 @@ class VerifyFunctionality(Check):
|
||||
md = conv.client.metadata
|
||||
entity = md[conv.entity_id]
|
||||
for desc in ["idpsso_descriptor", "attribute_authority_descriptor",
|
||||
"authn_authority_descriptor"]:
|
||||
"auth_authority_descriptor"]:
|
||||
try:
|
||||
srvgrps = entity[desc]
|
||||
except KeyError:
|
||||
@@ -497,8 +502,8 @@ class VerifyFunctionality(Check):
|
||||
if self._status != OK:
|
||||
return res
|
||||
|
||||
res = self._binding_support(conv, oper.request,
|
||||
args["request_binding"], "idpsso")
|
||||
res = self._binding_support(conv, oper.request, args["request_binding"],
|
||||
"idpsso")
|
||||
if self._status != OK:
|
||||
return res
|
||||
|
||||
@@ -513,9 +518,7 @@ class VerifyFunctionality(Check):
|
||||
pass
|
||||
else:
|
||||
res = self._nameid_format_support(conv,
|
||||
args[
|
||||
"name_id_policy"
|
||||
].format)
|
||||
args["name_id_policy"].format)
|
||||
|
||||
return res
|
||||
|
||||
@@ -634,7 +637,7 @@ CLASS_CACHE = {}
|
||||
def factory(cid, classes=CLASS_CACHE):
|
||||
if len(classes) == 0:
|
||||
check.factory(cid, classes)
|
||||
for _name, obj in inspect.getmembers(sys.modules[__name__]):
|
||||
for name, obj in inspect.getmembers(sys.modules[__name__]):
|
||||
if inspect.isclass(obj):
|
||||
try:
|
||||
classes[obj.cid] = obj
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from saml2test import JSON_DUMPS_ARGS
|
||||
|
||||
__author__ = 'rohe0002'
|
||||
|
||||
import json
|
||||
@@ -14,7 +12,6 @@ from mechanize._form import ListControl
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def pick_interaction(interactions, _base="", content="", req=None):
|
||||
unic = content
|
||||
if content:
|
||||
@@ -63,7 +60,7 @@ class FlowException(Exception):
|
||||
self.url = url
|
||||
|
||||
def __str__(self):
|
||||
return json.dumps(self.__dict__, **JSON_DUMPS_ARGS)
|
||||
return json.dumps(self.__dict__)
|
||||
|
||||
|
||||
class RResponse():
|
||||
@@ -278,6 +275,7 @@ def select_form(httpc, orig_response, **kwargs):
|
||||
return do_click(httpc, form, **kwargs)
|
||||
|
||||
|
||||
#noinspection PyUnusedLocal
|
||||
def chose(httpc, orig_response, path, **kwargs):
|
||||
"""
|
||||
Sends a HTTP GET to a url given by the present url and the given
|
||||
@@ -289,6 +287,7 @@ def chose(httpc, orig_response, path, **kwargs):
|
||||
:return: The response do_click() returns
|
||||
"""
|
||||
|
||||
|
||||
if not path.startswith("http"):
|
||||
try:
|
||||
_url = orig_response.url
|
||||
@@ -325,6 +324,7 @@ def NoneFunc():
|
||||
return None
|
||||
|
||||
|
||||
#noinspection PyUnusedLocal
|
||||
def parse(httpc, orig_response, **kwargs):
|
||||
# content is a form from which I get the SAMLResponse
|
||||
response = RResponse(orig_response)
|
||||
@@ -338,6 +338,7 @@ def parse(httpc, orig_response, **kwargs):
|
||||
"RelayState": form["RelayState"]}
|
||||
|
||||
|
||||
#noinspection PyUnusedLocal
|
||||
def interaction(args):
|
||||
_type = args["type"]
|
||||
if _type == "form":
|
||||
|
||||
@@ -6,7 +6,6 @@ __author__ = 'rolandh'
|
||||
|
||||
from idp_test.saml2base import AuthnRequest
|
||||
|
||||
|
||||
class DummyExtension(SamlBase):
|
||||
"""The urn:mace:umu.se:SAML:2.0:extension:foo element """
|
||||
|
||||
@@ -18,14 +17,12 @@ class DummyExtension(SamlBase):
|
||||
c_child_order = SamlBase.c_child_order[:]
|
||||
c_cardinality = SamlBase.c_cardinality.copy()
|
||||
|
||||
|
||||
class AuthnRequest_UnknownIssuer(AuthnRequest):
|
||||
def pre_processing(self, message, args):
|
||||
_issuer = message.issuer
|
||||
_issuer.text = "https://www.example.com/foobar.xml"
|
||||
return message
|
||||
|
||||
|
||||
class AuthnRequest_UnknownExtension(AuthnRequest):
|
||||
def pre_processing(self, message, args):
|
||||
message.extension = ExtensionContainer()
|
||||
@@ -49,4 +46,4 @@ OPERATIONS = {
|
||||
"tests": {"pre": [CheckSaml2IntMetaData],
|
||||
"post": [CheckSaml2IntAttributes]}
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,14 @@
|
||||
from saml2 import samlp
|
||||
from saml2 import BINDING_HTTP_ARTIFACT, BINDING_HTTP_POST
|
||||
from saml2 import BINDING_HTTP_REDIRECT, BINDING_PAOS, BINDING_SOAP
|
||||
from saml2 import BINDING_HTTP_ARTIFACT
|
||||
from saml2 import BINDING_HTTP_POST
|
||||
from saml2 import BINDING_HTTP_REDIRECT
|
||||
from saml2 import BINDING_PAOS
|
||||
from saml2 import BINDING_SOAP
|
||||
from saml2 import BINDING_URI
|
||||
from saml2.saml import NAMEID_FORMAT_PERSISTENT, NAMEID_FORMAT_UNSPECIFIED
|
||||
from saml2.saml import NAMEID_FORMAT_TRANSIENT, NAMEID_FORMAT_EMAILADDRESS
|
||||
from saml2.saml import NAMEID_FORMAT_PERSISTENT
|
||||
from saml2.saml import NAMEID_FORMAT_UNSPECIFIED
|
||||
from saml2.saml import NAMEID_FORMAT_TRANSIENT
|
||||
from saml2.saml import NAMEID_FORMAT_EMAILADDRESS
|
||||
|
||||
from idp_test.check import CheckLogoutSupport
|
||||
from idp_test.check import CheckSaml2IntAttributes
|
||||
@@ -366,7 +371,7 @@ OPERATIONS = {
|
||||
"sequence": [AuthnRequest],
|
||||
"tests": {"pre": [CheckSaml2IntMetaData],
|
||||
"post": []},
|
||||
"depend": ["verify"]
|
||||
"depend":["verify"]
|
||||
},
|
||||
'authn-nid_transient': {
|
||||
"tc_id": "S2c-10",
|
||||
@@ -375,7 +380,7 @@ OPERATIONS = {
|
||||
"sequence": [AuthnRequestNID_Transient],
|
||||
"tests": {"pre": [CheckSaml2IntMetaData],
|
||||
"post": []},
|
||||
"depend": ["authn"]
|
||||
"depend":["authn"]
|
||||
},
|
||||
'authn-nid_email': {
|
||||
"tc_id": "S2c-20",
|
||||
@@ -384,7 +389,7 @@ OPERATIONS = {
|
||||
"sequence": [AuthnRequestNID_Email],
|
||||
"tests": {"pre": [CheckSaml2IntMetaData],
|
||||
"post": []},
|
||||
"depend": ["authn"]
|
||||
"depend":["authn"]
|
||||
},
|
||||
'authn-nid_no': {
|
||||
"tc_id": "S2c-21",
|
||||
@@ -393,7 +398,7 @@ OPERATIONS = {
|
||||
"sequence": [AuthnRequestNID_no],
|
||||
"tests": {"pre": [CheckSaml2IntMetaData],
|
||||
"post": []},
|
||||
"depend": ["authn"]
|
||||
"depend":["authn"]
|
||||
},
|
||||
'authn-nid_unspecified': {
|
||||
"tc_id": "S2c-21",
|
||||
@@ -402,7 +407,7 @@ OPERATIONS = {
|
||||
"sequence": [AuthnRequestNID_Unspecified],
|
||||
"tests": {"pre": [CheckSaml2IntMetaData],
|
||||
"post": []},
|
||||
"depend": ["authn"]
|
||||
"depend":["authn"]
|
||||
},
|
||||
'authn-post': {
|
||||
"tc_id": "S2c-08",
|
||||
@@ -411,7 +416,7 @@ OPERATIONS = {
|
||||
"sequence": [AuthnRequestPost],
|
||||
"tests": {"pre": [CheckSaml2IntMetaData],
|
||||
"post": []},
|
||||
"depend": ["authn"]
|
||||
"depend":["authn"]
|
||||
},
|
||||
'authn-post-transient': {
|
||||
"tc_id": "S2c-09",
|
||||
@@ -420,48 +425,48 @@ OPERATIONS = {
|
||||
"sequence": [AuthnRequestPostNID_Transient],
|
||||
"tests": {"pre": [CheckSaml2IntMetaData],
|
||||
"post": []},
|
||||
"depend": ["authn-post"]
|
||||
"depend":["authn-post"]
|
||||
},
|
||||
'attribute-query': {
|
||||
'attribute-query':{
|
||||
"tc_id": "S2c-01",
|
||||
"name": "",
|
||||
"sequence": [AuthnRequest, AttributeQuery],
|
||||
"depend": ["authn"]
|
||||
"sequence":[AuthnRequest, AttributeQuery],
|
||||
"depend":["authn"]
|
||||
},
|
||||
'attribute-query-transient': {
|
||||
'attribute-query-transient':{
|
||||
"tc_id": "S2c-20",
|
||||
"name": "",
|
||||
"sequence": [AuthnRequestNID_Transient, AttributeQuery],
|
||||
"depend": ["authn"]
|
||||
"sequence":[AuthnRequestNID_Transient, AttributeQuery],
|
||||
"depend":["authn"]
|
||||
},
|
||||
'authn_endpoint_index': {
|
||||
"tc_id": "S2c-03",
|
||||
"name": '',
|
||||
"descr": '',
|
||||
"sequence": [AuthnRequestEndpointIndex],
|
||||
"depend": ["authn"]
|
||||
"depend":["authn"]
|
||||
},
|
||||
'authn_endpoint_index-transient': {
|
||||
"tc_id": "S2c-03",
|
||||
"name": '',
|
||||
"descr": '',
|
||||
"sequence": [AuthnRequestEndpointIndexNIDTransient],
|
||||
"depend": ["authn"]
|
||||
"depend":["authn"]
|
||||
},
|
||||
'authn_specified_endpoint': {
|
||||
"tc_id": "S2c-04",
|
||||
"name": '',
|
||||
"descr": '',
|
||||
"sequence": [AuthnRequestSpecEndpoint],
|
||||
"depend": ["authn"]
|
||||
"depend":["authn"]
|
||||
},
|
||||
'authn-artifact': {
|
||||
'authn-artifact':{
|
||||
'tc_id': "S2c-05",
|
||||
"name": "SAML2 AuthnRequest using an artifact",
|
||||
"descr": ('AuthnRequest using HTTP-redirect and artifact'),
|
||||
"sequence": [AuthnRequest_using_Artifact]
|
||||
},
|
||||
'authn-artifact_nid-transient': {
|
||||
'authn-artifact_nid-transient':{
|
||||
'tc_id': "S2c-05",
|
||||
"name": "SAML2 AuthnRequest expecting artifact response",
|
||||
"descr": ('AuthnRequest using HTTP-redirect and artifact'),
|
||||
@@ -473,7 +478,7 @@ OPERATIONS = {
|
||||
"descr": 'AuthnRequest followed by an AssertionIDRequest',
|
||||
"sequence": [AuthnRequest, AssertionIDRequest],
|
||||
"tests": {"pre": [CheckSaml2IntMetaData], "post": []},
|
||||
"depend": ["authn"]
|
||||
"depend":["authn"]
|
||||
},
|
||||
'authn-nid_transient-assertion_id_request': {
|
||||
"tc_id": "S2c-26",
|
||||
@@ -481,7 +486,7 @@ OPERATIONS = {
|
||||
"descr": 'AuthnRequest followed by an AssertionIDRequest',
|
||||
"sequence": [AuthnRequestNID_Transient, AssertionIDRequest],
|
||||
"tests": {"pre": [CheckSaml2IntMetaData], "post": []},
|
||||
"depend": ["authn"]
|
||||
"depend":["authn"]
|
||||
},
|
||||
'authn-with-name_id_policy': {
|
||||
"tc_id": "S2c-11",
|
||||
@@ -489,7 +494,7 @@ OPERATIONS = {
|
||||
"descr": 'AuthnRequest with specific NameIDPolicy',
|
||||
"sequence": [AuthnRequest_NameIDPolicy1],
|
||||
"tests": {"pre": [CheckSaml2IntMetaData], "post": []},
|
||||
"depend": ["authn"]
|
||||
"depend":["authn"]
|
||||
},
|
||||
'authn-with-name_id_policy_nid-transient': {
|
||||
"tc_id": "S2c-31",
|
||||
@@ -497,13 +502,13 @@ OPERATIONS = {
|
||||
"descr": 'AuthnRequest with specific NameIDPolicy',
|
||||
"sequence": [AuthnRequest_NameIDPolicy1Transient],
|
||||
"tests": {"pre": [CheckSaml2IntMetaData], "post": []},
|
||||
"depend": ["authn"]
|
||||
"depend":["authn"]
|
||||
},
|
||||
'ecp_authn': {
|
||||
'tc_id': "S2c-12",
|
||||
"name": "SAML2 AuthnRequest using ECP and PAOS",
|
||||
"descr": "SAML2 AuthnRequest using ECP and PAOS",
|
||||
"sequence": [ECP_AuthnRequest]
|
||||
"sequence":[ECP_AuthnRequest]
|
||||
},
|
||||
'log-in-out': {
|
||||
"tc_id": "S2c-13",
|
||||
@@ -511,31 +516,31 @@ OPERATIONS = {
|
||||
"descr": 'AuthnRequest using HTTP-redirect followed by a logout',
|
||||
"sequence": [AuthnRequest, LogOutRequest],
|
||||
"tests": {"pre": [CheckSaml2IntMetaData], "post": []},
|
||||
"depend": ["authn"]
|
||||
"depend":["authn"]
|
||||
},
|
||||
'manage_nameid': {
|
||||
'manage_nameid':{
|
||||
"tc_id": "S2c-14",
|
||||
"name": "Setting the SP provided ID by using ManageNameID",
|
||||
"sequence": [AuthnRequest, ManageNameIDRequest],
|
||||
"depend": ["authn"]
|
||||
"sequence":[AuthnRequest, ManageNameIDRequest],
|
||||
"depend":["authn"]
|
||||
},
|
||||
'manage_nameid_nid-transient': {
|
||||
'manage_nameid_nid-transient':{
|
||||
"tc_id": "S2c-14",
|
||||
"name": "Setting the SP provided ID by using ManageNameID",
|
||||
"sequence": [AuthnRequestNID_Transient, ManageNameIDRequest],
|
||||
"depend": ["authn"]
|
||||
"sequence":[AuthnRequestNID_Transient, ManageNameIDRequest],
|
||||
"depend":["authn"]
|
||||
},
|
||||
'nameid-mapping': {
|
||||
'nameid-mapping':{
|
||||
"tc_id": "S2c-15",
|
||||
"name": "Simple NameIDMapping request",
|
||||
"sequence": [AuthnRequest, NameIDMappingRequest],
|
||||
"depend": ["authn"]
|
||||
"sequence":[AuthnRequest, NameIDMappingRequest],
|
||||
"depend":["authn"]
|
||||
},
|
||||
'authn-authn_query': {
|
||||
"name": 'AuthnRequest and then an AuthnQuery',
|
||||
"descr": 'AuthnRequest followed by an AuthnQuery',
|
||||
"sequence": [AuthnRequest, AuthnQuery],
|
||||
"tests": {"pre": [CheckSaml2IntMetaData], "post": []},
|
||||
"depend": ["authn"]
|
||||
"depend":["authn"]
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -12,8 +12,6 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
__author__ = 'rolandh'
|
||||
|
||||
JSON_DUMPS_ARGS = {"indent": 4, "sort_keys": True}
|
||||
|
||||
|
||||
class FatalError(Exception):
|
||||
pass
|
||||
@@ -23,7 +21,7 @@ class CheckError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class HttpError(Exception):
|
||||
class HTTP_ERROR(Exception):
|
||||
pass
|
||||
|
||||
|
||||
@@ -40,15 +38,11 @@ class ContextFilter(logging.Filter):
|
||||
This is a filter which injects time laps information into the log.
|
||||
"""
|
||||
|
||||
def __init__(self, name=""):
|
||||
logging.Filter.__init__(self, name)
|
||||
self._start = 0
|
||||
|
||||
def start(self):
|
||||
self._start = time.time()
|
||||
self.start = time.time()
|
||||
|
||||
def filter(self, record):
|
||||
record.delta = time.time() - self._start
|
||||
record.delta = time.time() - self.start
|
||||
return True
|
||||
|
||||
|
||||
@@ -64,7 +58,7 @@ def stop_script_by_name(name):
|
||||
import os
|
||||
|
||||
p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
|
||||
out, _err = p.communicate()
|
||||
out, err = p.communicate()
|
||||
|
||||
for line in out.splitlines():
|
||||
if name in line:
|
||||
@@ -84,7 +78,7 @@ def get_page(url):
|
||||
if resp.status_code == 200:
|
||||
return resp.text
|
||||
else:
|
||||
raise HttpError(resp.status)
|
||||
raise HTTP_ERROR(resp.status)
|
||||
|
||||
|
||||
def exception_trace(tag, exc, log=None):
|
||||
@@ -100,4 +94,4 @@ def exception_trace(tag, exc, log=None):
|
||||
|
||||
def ip_addresses():
|
||||
return [ip for ip in socket.gethostbyname_ex(socket.gethostname())[2]
|
||||
if not ip.startswith("127.")]
|
||||
if not ip.startswith("127.")]
|
||||
@@ -1,13 +1,21 @@
|
||||
import inspect
|
||||
import json
|
||||
import traceback
|
||||
import sys
|
||||
# Import the status codes used indicate the test results
|
||||
from saml2test.status import INFORMATION, OK, ERROR, CRITICAL
|
||||
|
||||
|
||||
__author__ = 'rolandh'
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
|
||||
INFORMATION = 0
|
||||
OK = 1
|
||||
WARNING = 2
|
||||
ERROR = 3
|
||||
CRITICAL = 4
|
||||
INTERACTION = 5
|
||||
|
||||
STATUSCODE = ["INFORMATION", "OK", "WARNING", "ERROR", "CRITICAL",
|
||||
"INTERACTION"]
|
||||
|
||||
CONT_JSON = "application/json"
|
||||
CONT_JWT = "application/jwt"
|
||||
|
||||
@@ -145,7 +153,7 @@ class VerifyError(Error):
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
item, _msg = conv.protocol_response[-1]
|
||||
item, msg = conv.protocol_response[-1]
|
||||
try:
|
||||
assert item.type().endswith("ErrorResponse")
|
||||
except AssertionError:
|
||||
@@ -239,10 +247,9 @@ class Parse(CriticalError):
|
||||
|
||||
return {}
|
||||
|
||||
|
||||
def factory(cid, classes):
|
||||
if len(classes) == 0:
|
||||
for _name, obj in inspect.getmembers(sys.modules[__name__]):
|
||||
for name, obj in inspect.getmembers(sys.modules[__name__]):
|
||||
if inspect.isclass(obj):
|
||||
try:
|
||||
classes[obj.cid] = obj
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from saml2test import JSON_DUMPS_ARGS
|
||||
|
||||
__author__ = 'rohe0002'
|
||||
|
||||
import json
|
||||
@@ -25,7 +23,7 @@ class FlowException(Exception):
|
||||
self.url = url
|
||||
|
||||
def __str__(self):
|
||||
return json.dumps(self.__dict__, **JSON_DUMPS_ARGS)
|
||||
return json.dumps(self.__dict__)
|
||||
|
||||
|
||||
class InteractionNeeded(Exception):
|
||||
@@ -389,8 +387,7 @@ class Action(object):
|
||||
except (KeyError, AttributeError):
|
||||
_args = {}
|
||||
|
||||
_args.update({"location": location, "features": features,
|
||||
"conv": conv})
|
||||
_args.update({"location": location, "features": features, "conv": conv})
|
||||
|
||||
logger.info("<-- FUNCTION: %s" % function.__name__)
|
||||
logger.info("<-- ARGS: %s" % _args)
|
||||
|
||||
@@ -6,8 +6,6 @@ from urlparse import urlparse
|
||||
from mechanize import ParseResponseEx
|
||||
from mechanize._form import ControlNotFoundError, AmbiguityError
|
||||
from mechanize._form import ListControl
|
||||
from saml2test import JSON_DUMPS_ARGS
|
||||
|
||||
|
||||
__author__ = 'rohe0002'
|
||||
|
||||
@@ -22,7 +20,7 @@ class FlowException(Exception):
|
||||
self.url = url
|
||||
|
||||
def __str__(self):
|
||||
return json.dumps(self.__dict__, **JSON_DUMPS_ARGS)
|
||||
return json.dumps(self.__dict__)
|
||||
|
||||
|
||||
class DResponse():
|
||||
|
||||
@@ -7,7 +7,7 @@ from urlparse import parse_qs
|
||||
from saml2test.opfunc import Operation
|
||||
from saml2test import FatalError
|
||||
from saml2test.check import ExpectedError, ERROR
|
||||
from saml2test.status import INTERACTION
|
||||
from saml2test.check import INTERACTION
|
||||
from saml2test.interaction import Interaction
|
||||
from saml2test.interaction import Action
|
||||
from saml2test.interaction import InteractionNeeded
|
||||
@@ -61,7 +61,7 @@ class Conversation(object):
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
raise OperationError
|
||||
raise FatalError
|
||||
|
||||
def do_check(self, test, **kwargs):
|
||||
if isinstance(test, basestring):
|
||||
@@ -128,7 +128,7 @@ class Conversation(object):
|
||||
self.client.cookiejar = self.cjar["rp"]
|
||||
for_me = True
|
||||
try:
|
||||
_base, query = url.split("?")
|
||||
base, query = url.split("?")
|
||||
except ValueError:
|
||||
pass
|
||||
else:
|
||||
@@ -300,8 +300,8 @@ class Conversation(object):
|
||||
break
|
||||
except (FatalError, OperationError):
|
||||
raise
|
||||
except Exception, _err:
|
||||
#self.err_check("exception", _err)
|
||||
except Exception, err:
|
||||
#self.err_check("exception", err)
|
||||
raise
|
||||
|
||||
try:
|
||||
|
||||
@@ -13,18 +13,16 @@ from saml2.server import Server
|
||||
from saml2.config import IdPConfig
|
||||
from saml2.config import logging
|
||||
|
||||
from base import Conversation
|
||||
from sp_test.base import Conversation
|
||||
|
||||
from saml2test import FatalError
|
||||
from saml2test import CheckError
|
||||
from saml2test import ContextFilter
|
||||
from saml2test import exception_trace
|
||||
from saml2test import JSON_DUMPS_ARGS
|
||||
|
||||
__author__ = 'rolandh'
|
||||
|
||||
#formatter =
|
||||
# logging.Formatter("%(asctime)s %(name)s:%(levelname)s %(message)s")
|
||||
#formatter = logging.Formatter("%(asctime)s %(name)s:%(levelname)s %(message)s")
|
||||
formatter_2 = logging.Formatter(
|
||||
"%(delta).6f - %(levelname)s - [%(name)s] %(message)s")
|
||||
|
||||
@@ -40,87 +38,44 @@ memoryhandler.addFilter(cf)
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.setLevel(logging.DEBUG)
|
||||
logger.addHandler(memoryhandler)
|
||||
|
||||
# The streamhandler variable should be added to the logger if
|
||||
# you want to see the log messages as they are printed instead
|
||||
# of afterwards (mostly useful during debugging
|
||||
#logger.addHandler(streamhandler)
|
||||
logger.setLevel(logging.DEBUG)
|
||||
|
||||
|
||||
class Client(object):
|
||||
"""
|
||||
This is the SP testing client for saml2test. It contains the methods that
|
||||
are required to set up and run the tests you request.
|
||||
"""
|
||||
def __init__(self, check_factory):
|
||||
"""
|
||||
Creates a new SP testing client.
|
||||
|
||||
@param self: this SP testing client
|
||||
@param check_factory: the factory containing the checks that are needed
|
||||
during the SP test
|
||||
"""
|
||||
|
||||
self.testsuite = None
|
||||
def __init__(self, operations, check_factory):
|
||||
self.operations = operations
|
||||
self.tests = None
|
||||
self.check_factory = check_factory
|
||||
|
||||
self._parser = argparse.ArgumentParser()
|
||||
self._parser.add_argument("-c",
|
||||
dest="config",
|
||||
default="config",
|
||||
self._parser.add_argument("-c", dest="config", default="config",
|
||||
help="Configuration file for the IdP")
|
||||
self._parser.add_argument('-C',
|
||||
dest="ca_certs",
|
||||
help="CA certs to use to verify HTTPS "
|
||||
"server certificates, if HTTPS is used and "
|
||||
"no server CA certs are defined then no "
|
||||
"cert verification will be done")
|
||||
self._parser.add_argument('-d',
|
||||
dest='debug',
|
||||
action='store_true',
|
||||
self._parser.add_argument(
|
||||
'-C', dest="ca_certs",
|
||||
help=("CA certs to use to verify HTTPS server certificates, ",
|
||||
"if HTTPS is used and no server CA certs are defined then ",
|
||||
"no cert verification will be done"))
|
||||
self._parser.add_argument('-d', dest='debug', action='store_true',
|
||||
help="Print debug information")
|
||||
self._parser.add_argument("-H",
|
||||
dest="pretty",
|
||||
action='store_true',
|
||||
help="Human readable status output")
|
||||
self._parser.add_argument("-i",
|
||||
dest="insecure",
|
||||
action='store_true',
|
||||
help="do not verify TLS certificates")
|
||||
self._parser.add_argument('-J',
|
||||
dest="json_config_file",
|
||||
self._parser.add_argument("-H", dest="pretty", action='store_true')
|
||||
self._parser.add_argument("-i", dest="insecure", action='store_true')
|
||||
self._parser.add_argument('-J', dest="json_config_file",
|
||||
help="Script configuration")
|
||||
self._parser.add_argument("-l",
|
||||
dest="list",
|
||||
action="store_true",
|
||||
help="List all the test flows as a JSON "
|
||||
"object")
|
||||
self._parser.add_argument('-m',
|
||||
dest="metadata",
|
||||
action='store_true',
|
||||
self._parser.add_argument(
|
||||
"-l", dest="list", action="store_true",
|
||||
help="List all the test flows as a JSON object")
|
||||
self._parser.add_argument('-m', dest="metadata", action='store_true',
|
||||
help="Return the IdP metadata")
|
||||
self._parser.add_argument("-P",
|
||||
dest="configpath",
|
||||
default=".",
|
||||
help="Path to the configuration file for "
|
||||
"the IdP")
|
||||
self._parser.add_argument("-t",
|
||||
dest="testsuite",
|
||||
default="basicTests",
|
||||
help="Specifies the test suite from which "
|
||||
"you wish to run tests")
|
||||
self._parser.add_argument('-v',
|
||||
dest='verbose',
|
||||
action='store_true',
|
||||
self._parser.add_argument(
|
||||
"-P", dest="configpath", default=".",
|
||||
help="Path to the configuration file for the IdP")
|
||||
self._parser.add_argument("-t", dest="testpackage",
|
||||
help="Module describing tests")
|
||||
self._parser.add_argument('-v', dest='verbose', action='store_true',
|
||||
help="Print runtime information")
|
||||
self._parser.add_argument("-Y",
|
||||
dest="pysamllog",
|
||||
action='store_true',
|
||||
self._parser.add_argument("-Y", dest="pysamllog", action='store_true',
|
||||
help="Print PySAML2 logs")
|
||||
self._parser.add_argument("oper",
|
||||
nargs="?",
|
||||
help="Which test to run")
|
||||
self._parser.add_argument("oper", nargs="?", help="Which test to run")
|
||||
|
||||
self.interactions = None
|
||||
self.entity_id = None
|
||||
@@ -188,9 +143,6 @@ class Client(object):
|
||||
root_logger.addHandler(memoryhandler)
|
||||
root_logger.setLevel(logging.DEBUG)
|
||||
|
||||
self.testsuite = import_module("sp_test.test_suites.%s" %
|
||||
self.args.testsuite)
|
||||
|
||||
if self.args.metadata:
|
||||
return self.make_meta()
|
||||
elif self.args.list:
|
||||
@@ -205,15 +157,18 @@ class Client(object):
|
||||
|
||||
self.setup()
|
||||
|
||||
if self.testsuite:
|
||||
try:
|
||||
oper = self.testsuite.testcases[self.args.oper]
|
||||
except ValueError:
|
||||
try:
|
||||
oper = self.operations.OPERATIONS[self.args.oper]
|
||||
except KeyError:
|
||||
if self.tests:
|
||||
try:
|
||||
oper = self.tests.OPERATIONS[self.args.oper]
|
||||
except ValueError:
|
||||
print >> sys.stderr, "Undefined testcase"
|
||||
return
|
||||
else:
|
||||
print >> sys.stderr, "Undefined testcase"
|
||||
return
|
||||
else:
|
||||
print >> sys.stderr, "Undefined testcase"
|
||||
return
|
||||
|
||||
opers = oper["sequence"]
|
||||
|
||||
@@ -254,7 +209,7 @@ class Client(object):
|
||||
if pp:
|
||||
pp.pprint(tsum)
|
||||
else:
|
||||
print >> sys.stdout, json.dumps(tsum, **JSON_DUMPS_ARGS)
|
||||
print >> sys.stdout, json.dumps(tsum)
|
||||
|
||||
if tsum["status"] > 1 or self.args.debug or err:
|
||||
self.output_log(memoryhandler, streamhandler)
|
||||
@@ -280,10 +235,14 @@ class Client(object):
|
||||
self.idp.metadata = metadata
|
||||
#self.idp_config.metadata = metadata
|
||||
|
||||
if self.args.testpackage:
|
||||
self.tests = import_module("sp_test.package.%s" %
|
||||
self.args.testpackage)
|
||||
|
||||
try:
|
||||
self.entity_id = _jc["entity_id"]
|
||||
# Verify its the correct metadata
|
||||
assert self.entity_id in md.entity.keys(), "Entityid {0} not found in {1}".format(self.entity_id, ', '.join(md.entity.keys()))
|
||||
assert self.entity_id in md.entity.keys()
|
||||
except KeyError:
|
||||
if len(md.entity.keys()) == 1:
|
||||
self.entity_id = md.entity.keys()[0]
|
||||
@@ -300,10 +259,10 @@ class Client(object):
|
||||
|
||||
def list_operations(self):
|
||||
res = []
|
||||
for key, val in self.testsuite.testcases.items():
|
||||
for key, val in self.operations.OPERATIONS.items():
|
||||
res.append({"id": key, "name": val["name"]})
|
||||
|
||||
print json.dumps(res, **JSON_DUMPS_ARGS)
|
||||
print json.dumps(res)
|
||||
|
||||
def verify_metadata(self):
|
||||
pass
|
||||
|
||||
@@ -14,11 +14,14 @@ from saml2.sigver import signed_instance_factory, pre_signature_part
|
||||
from saml2test import CheckError, FatalError
|
||||
from saml2test.check import Check
|
||||
from saml2test.check import ExpectedError
|
||||
from saml2test.status import INTERACTION, STATUSCODE
|
||||
from saml2test.check import INTERACTION
|
||||
from saml2test.check import STATUSCODE
|
||||
from saml2test.interaction import Action
|
||||
from saml2test.interaction import Interaction
|
||||
from saml2test.interaction import InteractionNeeded
|
||||
|
||||
from sp_test.tests import ErrorResponse
|
||||
|
||||
__author__ = 'rolandh'
|
||||
|
||||
import logging
|
||||
@@ -119,8 +122,8 @@ class Conversation():
|
||||
for serv in ["aa", "aq", "idp"]:
|
||||
endpoints = self._config.getattr("endpoints", serv)
|
||||
if endpoints:
|
||||
for _typ, spec in endpoints.items():
|
||||
for url, _binding in spec:
|
||||
for typ, spec in endpoints.items():
|
||||
for url, binding in spec:
|
||||
yield url
|
||||
|
||||
def which_endpoint(self, url):
|
||||
@@ -165,11 +168,11 @@ class Conversation():
|
||||
|
||||
_txt = self.last_response.content
|
||||
if self.last_response.status_code >= 400:
|
||||
raise FatalError("Unexpected error")
|
||||
raise FatalError("Did not expected error")
|
||||
|
||||
def handle_redirect(self):
|
||||
try:
|
||||
_url, query = self.last_response.headers["location"].split("?")
|
||||
url, query = self.last_response.headers["location"].split("?")
|
||||
except KeyError:
|
||||
return
|
||||
|
||||
@@ -250,7 +253,7 @@ class Conversation():
|
||||
if param in self.json_config:
|
||||
args[param] = self.json_config[param]
|
||||
|
||||
if getattr(resp, "_send_error", False) == True:
|
||||
if resp == ErrorResponse:
|
||||
func = getattr(self.instance, "create_error_response")
|
||||
else:
|
||||
_op = camel2underscore.sub(r'_\1', req._class.c_tag).lower()
|
||||
@@ -312,27 +315,13 @@ class Conversation():
|
||||
Un-solicited starts with the IDP sending something.
|
||||
"""
|
||||
if len(flow) >= 3:
|
||||
logger.info("TEST FLOW: Start by GET-ing the page")
|
||||
self.wb_send()
|
||||
logger.info("TEST FLOW: Continuing with: %s" % flow[0].__name__)
|
||||
self.intermit(flow[0]._interaction)
|
||||
logger.info("TEST FLOW: Handling redirect")
|
||||
self.handle_redirect()
|
||||
logger.info("TEST FLOW: Sending IdP Response with expected request"
|
||||
" %s and response to be used %s" %
|
||||
(flow[1].__name__, flow[2].__name__))
|
||||
self.send_idp_response(flow[1], flow[2])
|
||||
if len(flow) == 4:
|
||||
if flow[3] is None:
|
||||
flowName = "None"
|
||||
else:
|
||||
flowName = flow[3].__name__
|
||||
logger.info("TEST FLOW Handling result with HTTP Response check"
|
||||
" for %s" % flowName)
|
||||
self.handle_result(flow[3])
|
||||
else:
|
||||
logger.info("TEST FLOW: Handling result (without HTTP Response "
|
||||
"check)")
|
||||
self.handle_result()
|
||||
|
||||
def do_sequence(self, oper, tests=None):
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import inspect
|
||||
import sys
|
||||
# Import the status codes used indicate the test results
|
||||
from saml2test.status import CRITICAL
|
||||
|
||||
from saml2test.check import Check
|
||||
from saml2test.check import CRITICAL
|
||||
from saml2test import check
|
||||
from saml2test.interaction import Interaction
|
||||
|
||||
@@ -45,6 +45,8 @@ class ErrorResponse(Check):
|
||||
self._status = CRITICAL
|
||||
return {}
|
||||
|
||||
# =============================================================================
|
||||
|
||||
|
||||
CLASS_CACHE = {}
|
||||
|
||||
@@ -52,7 +54,7 @@ CLASS_CACHE = {}
|
||||
def factory(cid, classes=CLASS_CACHE):
|
||||
if len(classes) == 0:
|
||||
check.factory(cid, classes)
|
||||
for _name, obj in inspect.getmembers(sys.modules[__name__]):
|
||||
for name, obj in inspect.getmembers(sys.modules[__name__]):
|
||||
if inspect.isclass(obj):
|
||||
try:
|
||||
classes[obj.cid] = obj
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
# Group of test suites
|
||||
@@ -1,21 +1,16 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import copy
|
||||
from saml2 import samlp
|
||||
from saml2 import samlp, SamlBase
|
||||
from saml2 import NAMEID_FORMAT_EMAILADDRESS
|
||||
from saml2 import BINDING_HTTP_REDIRECT
|
||||
from saml2 import BINDING_HTTP_POST
|
||||
from saml2.s_utils import rndstr
|
||||
|
||||
from saml2.saml import SCM_BEARER
|
||||
from saml2.saml import Condition
|
||||
from saml2.saml import XSI_TYPE
|
||||
from saml2.saml import Audience
|
||||
from saml2.saml import SCM_BEARER, Condition, XSI_TYPE, Audience
|
||||
from saml2.saml import NAMEID_FORMAT_PERSISTENT
|
||||
from saml2.saml import SCM_SENDER_VOUCHES
|
||||
from saml2.saml import ConditionAbstractType_
|
||||
from saml2.samlp import STATUS_AUTHN_FAILED
|
||||
from saml2.time_util import in_a_while
|
||||
from saml2.time_util import a_while_ago
|
||||
from saml2.time_util import in_a_while, a_while_ago
|
||||
from sp_test.check import VerifyContent
|
||||
from sp_test import check
|
||||
from saml2test import ip_addresses
|
||||
@@ -40,10 +35,10 @@ class TimeRestriction(ConditionAbstractType_):
|
||||
|
||||
c_tag = 'TimeRestriction'
|
||||
c_namespace = "urn:mace:umu.se:sso"
|
||||
c_children = copy.copy(ConditionAbstractType_.c_children)
|
||||
c_attributes = copy.copy(ConditionAbstractType_.c_attributes)
|
||||
c_children = ConditionAbstractType_.c_children.copy()
|
||||
c_attributes = ConditionAbstractType_.c_attributes.copy()
|
||||
c_child_order = ConditionAbstractType_.c_child_order[:]
|
||||
c_cardinality = copy.copy(ConditionAbstractType_.c_cardinality)
|
||||
c_cardinality = ConditionAbstractType_.c_cardinality.copy()
|
||||
c_attributes['StartTime'] = ('start_time', 'time', False)
|
||||
c_attributes['EndTime'] = ('end_time', 'time', False)
|
||||
|
||||
@@ -116,7 +111,6 @@ class ErrorResponse(Response):
|
||||
"info": (STATUS_AUTHN_FAILED, "Unknown user")
|
||||
}
|
||||
_binding = BINDING_HTTP_POST
|
||||
_send_error = True
|
||||
|
||||
|
||||
class LogoutResponse(Response):
|
||||
@@ -157,7 +151,7 @@ class AuthnResponse_NameIDformat_foo(AuthnResponse):
|
||||
|
||||
class AuthnResponse_without_SubjectConfirmationData_1(AuthnResponse):
|
||||
def pre_processing(self, message, **kwargs):
|
||||
_confirmation = message.assertion.subject.subject_confirmation[0]
|
||||
_confirmation = message.assertion.subject.subject_confirmation
|
||||
_confirmation.subject_confirmation_data = None
|
||||
_confirmation.method = SCM_SENDER_VOUCHES
|
||||
return message
|
||||
@@ -177,11 +171,9 @@ class AuthnResponse_rnd_Response_inresponseto(AuthnResponse):
|
||||
return message
|
||||
|
||||
|
||||
class AuthnResponse_rnd_SubjectConfirmationData_inresponseto(AuthnResponse):
|
||||
class AuthnResponse_rnd_Response_assertion_inresponseto(AuthnResponse):
|
||||
def pre_processing(self, message, **kwargs):
|
||||
_scs = message.assertion.subject.subject_confirmation
|
||||
for _sc in _scs:
|
||||
_sc.subject_confirmation_data.in_response_to = rndstr(16)
|
||||
message.assertion.in_response_to = rndstr(16)
|
||||
return message
|
||||
|
||||
|
||||
@@ -206,6 +198,13 @@ class AuthnResponse_missing_Recipient(AuthnResponse):
|
||||
return message
|
||||
|
||||
|
||||
class AuthnResponse_missing_Recipient(AuthnResponse):
|
||||
def pre_processing(self, message, **kwargs):
|
||||
_confirmation = message.assertion.subject.subject_confirmation
|
||||
_confirmation[0].subject_confirmation_data.recipient = None
|
||||
return message
|
||||
|
||||
|
||||
class AuthnResponse_broken_destination(AuthnResponse):
|
||||
def pre_processing(self, message, **kwargs):
|
||||
message.destination = "NotAUrl"
|
||||
@@ -359,7 +358,12 @@ class AuthnResponse_AudienceRestriction_appended_audience(AuthnResponse):
|
||||
conditions.audience_restriction[0].audience.append(extra)
|
||||
return message
|
||||
|
||||
testcases = {
|
||||
|
||||
PHASES = {
|
||||
"login_redirect": (Login, AuthnRequest, AuthnResponse_redirect),
|
||||
}
|
||||
|
||||
OPERATIONS = {
|
||||
'sp-00': {
|
||||
"name": 'Basic Login test',
|
||||
"descr": 'Basic Login test',
|
||||
@@ -375,8 +379,7 @@ testcases = {
|
||||
'FL03': {
|
||||
"name": """SP should not accept a Response as valid, when the
|
||||
StatusCode is not success""",
|
||||
"sequence": [(Login, AuthnRequest, ErrorResponse,
|
||||
check.ErrorResponse)],
|
||||
"sequence": [(Login, AuthnRequest, ErrorResponse, check.ErrorResponse)],
|
||||
"tests": {"pre": [], "post": []}
|
||||
},
|
||||
'FL04': {
|
||||
@@ -417,7 +420,7 @@ StatusCode is not success""",
|
||||
"name": ("SP should not accept an assertion InResponseTo ",
|
||||
"which is chosen randomly"),
|
||||
"sequence": [(Login, AuthnRequest,
|
||||
AuthnResponse_rnd_SubjectConfirmationData_inresponseto,
|
||||
AuthnResponse_rnd_Response_assertion_inresponseto,
|
||||
check.ErrorResponse)],
|
||||
"tests": {"pre": [], "post": []}
|
||||
},
|
||||
@@ -516,8 +519,8 @@ StatusCode is not success""",
|
||||
"tests": {"pre": [], "post": []}
|
||||
},
|
||||
'FL29': {
|
||||
"name": "Reject a Response with a "
|
||||
"SubjectConfirmationData@NotOnOrAfter in the past",
|
||||
"name": "Reject a Response with a SubjectConfirmationData@NotOnOrAfter "
|
||||
"in the past",
|
||||
"sequence": [(Login, AuthnRequest,
|
||||
AuthnResponse_past_SubjectConfirmationData_NotOnOrAfter,
|
||||
check.ErrorResponse)],
|
||||
@@ -700,4 +703,4 @@ StatusCode is not success""",
|
||||
# in separate session, no session-cookies)
|
||||
# SP MUST accept an LogoutRequest with two sesionindexes (second valid) (
|
||||
# sent in separate session, no session-cookies)
|
||||
# Session fixtation check
|
||||
# Session fixtation check
|
||||
@@ -323,4 +323,4 @@ MAP = {
|
||||
'x121Address': 'urn:mace:dir:attribute-def:x121Address',
|
||||
'x500UniqueIdentifier': 'urn:mace:dir:attribute-def:x500UniqueIdentifier',
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,230 +12,230 @@ SCHAC = "urn:oid:1.3.6.1.4.1.25178.2."
|
||||
MAP = {
|
||||
"identifier": "urn:oasis:names:tc:SAML:2.0:attrname-format:uri",
|
||||
"fro": {
|
||||
EDUPERSON_OID + '2': 'eduPersonNickname',
|
||||
EDUPERSON_OID + '9': 'eduPersonScopedAffiliation',
|
||||
EDUPERSON_OID + '11': 'eduPersonAssurance',
|
||||
EDUPERSON_OID + '10': 'eduPersonTargetedID',
|
||||
EDUPERSON_OID + '4': 'eduPersonOrgUnitDN',
|
||||
NOREDUPERSON_OID + '6': 'norEduOrgAcronym',
|
||||
NOREDUPERSON_OID + '7': 'norEduOrgUniqueIdentifier',
|
||||
NOREDUPERSON_OID + '4': 'norEduPersonLIN',
|
||||
EDUPERSON_OID + '1': 'eduPersonAffiliation',
|
||||
NOREDUPERSON_OID + '2': 'norEduOrgUnitUniqueNumber',
|
||||
NETSCAPE_LDAP + '40': 'userSMIMECertificate',
|
||||
NOREDUPERSON_OID + '1': 'norEduOrgUniqueNumber',
|
||||
NETSCAPE_LDAP + '241': 'displayName',
|
||||
UCL_DIR_PILOT + '37': 'associatedDomain',
|
||||
EDUPERSON_OID + '6': 'eduPersonPrincipalName',
|
||||
NOREDUPERSON_OID + '8': 'norEduOrgUnitUniqueIdentifier',
|
||||
NOREDUPERSON_OID + '9': 'federationFeideSchemaVersion',
|
||||
X500ATTR_OID + '53': 'deltaRevocationList',
|
||||
X500ATTR_OID + '52': 'supportedAlgorithms',
|
||||
X500ATTR_OID + '51': 'houseIdentifier',
|
||||
X500ATTR_OID + '50': 'uniqueMember',
|
||||
X500ATTR_OID + '19': 'physicalDeliveryOfficeName',
|
||||
X500ATTR_OID + '18': 'postOfficeBox',
|
||||
X500ATTR_OID + '17': 'postalCode',
|
||||
X500ATTR_OID + '16': 'postalAddress',
|
||||
X500ATTR_OID + '15': 'businessCategory',
|
||||
X500ATTR_OID + '14': 'searchGuide',
|
||||
EDUPERSON_OID + '5': 'eduPersonPrimaryAffiliation',
|
||||
X500ATTR_OID + '12': 'title',
|
||||
X500ATTR_OID + '11': 'ou',
|
||||
X500ATTR_OID + '10': 'o',
|
||||
X500ATTR_OID + '37': 'cACertificate',
|
||||
X500ATTR_OID + '36': 'userCertificate',
|
||||
X500ATTR_OID + '31': 'member',
|
||||
X500ATTR_OID + '30': 'supportedApplicationContext',
|
||||
X500ATTR_OID + '33': 'roleOccupant',
|
||||
X500ATTR_OID + '32': 'owner',
|
||||
NETSCAPE_LDAP + '1': 'carLicense',
|
||||
PKCS_9 + '1': 'email',
|
||||
NETSCAPE_LDAP + '3': 'employeeNumber',
|
||||
NETSCAPE_LDAP + '2': 'departmentNumber',
|
||||
X500ATTR_OID + '39': 'certificateRevocationList',
|
||||
X500ATTR_OID + '38': 'authorityRevocationList',
|
||||
NETSCAPE_LDAP + '216': 'userPKCS12',
|
||||
EDUPERSON_OID + '8': 'eduPersonPrimaryOrgUnitDN',
|
||||
X500ATTR_OID + '9': 'street',
|
||||
X500ATTR_OID + '8': 'st',
|
||||
NETSCAPE_LDAP + '39': 'preferredLanguage',
|
||||
EDUPERSON_OID + '7': 'eduPersonEntitlement',
|
||||
X500ATTR_OID + '2': 'knowledgeInformation',
|
||||
X500ATTR_OID + '7': 'l',
|
||||
X500ATTR_OID + '6': 'c',
|
||||
X500ATTR_OID + '5': 'serialNumber',
|
||||
X500ATTR_OID + '4': 'sn',
|
||||
UCL_DIR_PILOT + '60': 'jpegPhoto',
|
||||
X500ATTR_OID + '65': 'pseudonym',
|
||||
NOREDUPERSON_OID + '5': 'norEduPersonNIN',
|
||||
UCL_DIR_PILOT + '3': 'mail',
|
||||
UCL_DIR_PILOT + '25': 'dc',
|
||||
X500ATTR_OID + '40': 'crossCertificatePair',
|
||||
X500ATTR_OID + '42': 'givenName',
|
||||
X500ATTR_OID + '43': 'initials',
|
||||
X500ATTR_OID + '44': 'generationQualifier',
|
||||
X500ATTR_OID + '45': 'x500UniqueIdentifier',
|
||||
X500ATTR_OID + '46': 'dnQualifier',
|
||||
X500ATTR_OID + '47': 'enhancedSearchGuide',
|
||||
X500ATTR_OID + '48': 'protocolInformation',
|
||||
X500ATTR_OID + '54': 'dmdName',
|
||||
NETSCAPE_LDAP + '4': 'employeeType',
|
||||
X500ATTR_OID + '22': 'teletexTerminalIdentifier',
|
||||
X500ATTR_OID + '23': 'facsimileTelephoneNumber',
|
||||
X500ATTR_OID + '20': 'telephoneNumber',
|
||||
X500ATTR_OID + '21': 'telexNumber',
|
||||
X500ATTR_OID + '26': 'registeredAddress',
|
||||
X500ATTR_OID + '27': 'destinationIndicator',
|
||||
X500ATTR_OID + '24': 'x121Address',
|
||||
X500ATTR_OID + '25': 'internationaliSDNNumber',
|
||||
X500ATTR_OID + '28': 'preferredDeliveryMethod',
|
||||
X500ATTR_OID + '29': 'presentationAddress',
|
||||
EDUPERSON_OID + '3': 'eduPersonOrgDN',
|
||||
NOREDUPERSON_OID + '3': 'norEduPersonBirthDate',
|
||||
UMICH + '57': 'labeledURI',
|
||||
UCL_DIR_PILOT + '1': 'uid',
|
||||
SCHAC + '1': 'schacMotherTongue',
|
||||
SCHAC + '2': 'schacGender',
|
||||
SCHAC + '3': 'schacDateOfBirth',
|
||||
SCHAC + '4': 'schacPlaceOfBirth',
|
||||
SCHAC + '5': 'schacCountryOfCitizenship',
|
||||
SCHAC + '6': 'schacSn1',
|
||||
SCHAC + '7': 'schacSn2',
|
||||
SCHAC + '8': 'schacPersonalTitle',
|
||||
SCHAC + '9': 'schacHomeOrganization',
|
||||
SCHAC + '10': 'schacHomeOrganizationType',
|
||||
SCHAC + '11': 'schacCountryOfResidence',
|
||||
SCHAC + '12': 'schacUserPresenceID',
|
||||
SCHAC + '13': 'schacPersonalPosition',
|
||||
SCHAC + '14': 'schacPersonalUniqueCode',
|
||||
SCHAC + '15': 'schacPersonalUniqueID',
|
||||
SCHAC + '17': 'schacExpiryDate',
|
||||
SCHAC + '18': 'schacUserPrivateAttribute',
|
||||
SCHAC + '19': 'schacUserStatus',
|
||||
SCHAC + '20': 'schacProjectMembership',
|
||||
SCHAC + '21': 'schacProjectSpecificRole',
|
||||
EDUPERSON_OID+'2': 'eduPersonNickname',
|
||||
EDUPERSON_OID+'9': 'eduPersonScopedAffiliation',
|
||||
EDUPERSON_OID+'11': 'eduPersonAssurance',
|
||||
EDUPERSON_OID+'10': 'eduPersonTargetedID',
|
||||
EDUPERSON_OID+'4': 'eduPersonOrgUnitDN',
|
||||
NOREDUPERSON_OID+'6': 'norEduOrgAcronym',
|
||||
NOREDUPERSON_OID+'7': 'norEduOrgUniqueIdentifier',
|
||||
NOREDUPERSON_OID+'4': 'norEduPersonLIN',
|
||||
EDUPERSON_OID+'1': 'eduPersonAffiliation',
|
||||
NOREDUPERSON_OID+'2': 'norEduOrgUnitUniqueNumber',
|
||||
NETSCAPE_LDAP+'40': 'userSMIMECertificate',
|
||||
NOREDUPERSON_OID+'1': 'norEduOrgUniqueNumber',
|
||||
NETSCAPE_LDAP+'241': 'displayName',
|
||||
UCL_DIR_PILOT+'37': 'associatedDomain',
|
||||
EDUPERSON_OID+'6': 'eduPersonPrincipalName',
|
||||
NOREDUPERSON_OID+'8': 'norEduOrgUnitUniqueIdentifier',
|
||||
NOREDUPERSON_OID+'9': 'federationFeideSchemaVersion',
|
||||
X500ATTR_OID+'53': 'deltaRevocationList',
|
||||
X500ATTR_OID+'52': 'supportedAlgorithms',
|
||||
X500ATTR_OID+'51': 'houseIdentifier',
|
||||
X500ATTR_OID+'50': 'uniqueMember',
|
||||
X500ATTR_OID+'19': 'physicalDeliveryOfficeName',
|
||||
X500ATTR_OID+'18': 'postOfficeBox',
|
||||
X500ATTR_OID+'17': 'postalCode',
|
||||
X500ATTR_OID+'16': 'postalAddress',
|
||||
X500ATTR_OID+'15': 'businessCategory',
|
||||
X500ATTR_OID+'14': 'searchGuide',
|
||||
EDUPERSON_OID+'5': 'eduPersonPrimaryAffiliation',
|
||||
X500ATTR_OID+'12': 'title',
|
||||
X500ATTR_OID+'11': 'ou',
|
||||
X500ATTR_OID+'10': 'o',
|
||||
X500ATTR_OID+'37': 'cACertificate',
|
||||
X500ATTR_OID+'36': 'userCertificate',
|
||||
X500ATTR_OID+'31': 'member',
|
||||
X500ATTR_OID+'30': 'supportedApplicationContext',
|
||||
X500ATTR_OID+'33': 'roleOccupant',
|
||||
X500ATTR_OID+'32': 'owner',
|
||||
NETSCAPE_LDAP+'1': 'carLicense',
|
||||
PKCS_9+'1': 'email',
|
||||
NETSCAPE_LDAP+'3': 'employeeNumber',
|
||||
NETSCAPE_LDAP+'2': 'departmentNumber',
|
||||
X500ATTR_OID+'39': 'certificateRevocationList',
|
||||
X500ATTR_OID+'38': 'authorityRevocationList',
|
||||
NETSCAPE_LDAP+'216': 'userPKCS12',
|
||||
EDUPERSON_OID+'8': 'eduPersonPrimaryOrgUnitDN',
|
||||
X500ATTR_OID+'9': 'street',
|
||||
X500ATTR_OID+'8': 'st',
|
||||
NETSCAPE_LDAP+'39': 'preferredLanguage',
|
||||
EDUPERSON_OID+'7': 'eduPersonEntitlement',
|
||||
X500ATTR_OID+'2': 'knowledgeInformation',
|
||||
X500ATTR_OID+'7': 'l',
|
||||
X500ATTR_OID+'6': 'c',
|
||||
X500ATTR_OID+'5': 'serialNumber',
|
||||
X500ATTR_OID+'4': 'sn',
|
||||
UCL_DIR_PILOT+'60': 'jpegPhoto',
|
||||
X500ATTR_OID+'65': 'pseudonym',
|
||||
NOREDUPERSON_OID+'5': 'norEduPersonNIN',
|
||||
UCL_DIR_PILOT+'3': 'mail',
|
||||
UCL_DIR_PILOT+'25': 'dc',
|
||||
X500ATTR_OID+'40': 'crossCertificatePair',
|
||||
X500ATTR_OID+'42': 'givenName',
|
||||
X500ATTR_OID+'43': 'initials',
|
||||
X500ATTR_OID+'44': 'generationQualifier',
|
||||
X500ATTR_OID+'45': 'x500UniqueIdentifier',
|
||||
X500ATTR_OID+'46': 'dnQualifier',
|
||||
X500ATTR_OID+'47': 'enhancedSearchGuide',
|
||||
X500ATTR_OID+'48': 'protocolInformation',
|
||||
X500ATTR_OID+'54': 'dmdName',
|
||||
NETSCAPE_LDAP+'4': 'employeeType',
|
||||
X500ATTR_OID+'22': 'teletexTerminalIdentifier',
|
||||
X500ATTR_OID+'23': 'facsimileTelephoneNumber',
|
||||
X500ATTR_OID+'20': 'telephoneNumber',
|
||||
X500ATTR_OID+'21': 'telexNumber',
|
||||
X500ATTR_OID+'26': 'registeredAddress',
|
||||
X500ATTR_OID+'27': 'destinationIndicator',
|
||||
X500ATTR_OID+'24': 'x121Address',
|
||||
X500ATTR_OID+'25': 'internationaliSDNNumber',
|
||||
X500ATTR_OID+'28': 'preferredDeliveryMethod',
|
||||
X500ATTR_OID+'29': 'presentationAddress',
|
||||
EDUPERSON_OID+'3': 'eduPersonOrgDN',
|
||||
NOREDUPERSON_OID+'3': 'norEduPersonBirthDate',
|
||||
UMICH+'57': 'labeledURI',
|
||||
UCL_DIR_PILOT+'1': 'uid',
|
||||
SCHAC+'1': 'schacMotherTongue',
|
||||
SCHAC+'2': 'schacGender',
|
||||
SCHAC+'3': 'schacDateOfBirth',
|
||||
SCHAC+'4': 'schacPlaceOfBirth',
|
||||
SCHAC+'5': 'schacCountryOfCitizenship',
|
||||
SCHAC+'6': 'schacSn1',
|
||||
SCHAC+'7': 'schacSn2',
|
||||
SCHAC+'8': 'schacPersonalTitle',
|
||||
SCHAC+'9': 'schacHomeOrganization',
|
||||
SCHAC+'10': 'schacHomeOrganizationType',
|
||||
SCHAC+'11': 'schacCountryOfResidence',
|
||||
SCHAC+'12': 'schacUserPresenceID',
|
||||
SCHAC+'13': 'schacPersonalPosition',
|
||||
SCHAC+'14': 'schacPersonalUniqueCode',
|
||||
SCHAC+'15': 'schacPersonalUniqueID',
|
||||
SCHAC+'17': 'schacExpiryDate',
|
||||
SCHAC+'18': 'schacUserPrivateAttribute',
|
||||
SCHAC+'19': 'schacUserStatus',
|
||||
SCHAC+'20': 'schacProjectMembership',
|
||||
SCHAC+'21': 'schacProjectSpecificRole',
|
||||
},
|
||||
"to": {
|
||||
'roleOccupant': X500ATTR_OID + '33',
|
||||
'gn': X500ATTR_OID + '42',
|
||||
'norEduPersonNIN': NOREDUPERSON_OID + '5',
|
||||
'title': X500ATTR_OID + '12',
|
||||
'facsimileTelephoneNumber': X500ATTR_OID + '23',
|
||||
'mail': UCL_DIR_PILOT + '3',
|
||||
'postOfficeBox': X500ATTR_OID + '18',
|
||||
'fax': X500ATTR_OID + '23',
|
||||
'telephoneNumber': X500ATTR_OID + '20',
|
||||
'norEduPersonBirthDate': NOREDUPERSON_OID + '3',
|
||||
'rfc822Mailbox': UCL_DIR_PILOT + '3',
|
||||
'dc': UCL_DIR_PILOT + '25',
|
||||
'countryName': X500ATTR_OID + '6',
|
||||
'emailAddress': PKCS_9 + '1',
|
||||
'employeeNumber': NETSCAPE_LDAP + '3',
|
||||
'organizationName': X500ATTR_OID + '10',
|
||||
'eduPersonAssurance': EDUPERSON_OID + '11',
|
||||
'norEduOrgAcronym': NOREDUPERSON_OID + '6',
|
||||
'registeredAddress': X500ATTR_OID + '26',
|
||||
'physicalDeliveryOfficeName': X500ATTR_OID + '19',
|
||||
'associatedDomain': UCL_DIR_PILOT + '37',
|
||||
'l': X500ATTR_OID + '7',
|
||||
'stateOrProvinceName': X500ATTR_OID + '8',
|
||||
'federationFeideSchemaVersion': NOREDUPERSON_OID + '9',
|
||||
'pkcs9email': PKCS_9 + '1',
|
||||
'givenName': X500ATTR_OID + '42',
|
||||
'givenname': X500ATTR_OID + '42',
|
||||
'x500UniqueIdentifier': X500ATTR_OID + '45',
|
||||
'eduPersonNickname': EDUPERSON_OID + '2',
|
||||
'houseIdentifier': X500ATTR_OID + '51',
|
||||
'street': X500ATTR_OID + '9',
|
||||
'supportedAlgorithms': X500ATTR_OID + '52',
|
||||
'preferredLanguage': NETSCAPE_LDAP + '39',
|
||||
'postalAddress': X500ATTR_OID + '16',
|
||||
'email': PKCS_9 + '1',
|
||||
'norEduOrgUnitUniqueIdentifier': NOREDUPERSON_OID + '8',
|
||||
'eduPersonPrimaryOrgUnitDN': EDUPERSON_OID + '8',
|
||||
'c': X500ATTR_OID + '6',
|
||||
'teletexTerminalIdentifier': X500ATTR_OID + '22',
|
||||
'o': X500ATTR_OID + '10',
|
||||
'cACertificate': X500ATTR_OID + '37',
|
||||
'telexNumber': X500ATTR_OID + '21',
|
||||
'ou': X500ATTR_OID + '11',
|
||||
'initials': X500ATTR_OID + '43',
|
||||
'eduPersonOrgUnitDN': EDUPERSON_OID + '4',
|
||||
'deltaRevocationList': X500ATTR_OID + '53',
|
||||
'norEduPersonLIN': NOREDUPERSON_OID + '4',
|
||||
'supportedApplicationContext': X500ATTR_OID + '30',
|
||||
'eduPersonEntitlement': EDUPERSON_OID + '7',
|
||||
'generationQualifier': X500ATTR_OID + '44',
|
||||
'eduPersonAffiliation': EDUPERSON_OID + '1',
|
||||
'edupersonaffiliation': EDUPERSON_OID + '1',
|
||||
'eduPersonPrincipalName': EDUPERSON_OID + '6',
|
||||
'edupersonprincipalname': EDUPERSON_OID + '6',
|
||||
'localityName': X500ATTR_OID + '7',
|
||||
'owner': X500ATTR_OID + '32',
|
||||
'norEduOrgUnitUniqueNumber': NOREDUPERSON_OID + '2',
|
||||
'searchGuide': X500ATTR_OID + '14',
|
||||
'certificateRevocationList': X500ATTR_OID + '39',
|
||||
'organizationalUnitName': X500ATTR_OID + '11',
|
||||
'userCertificate': X500ATTR_OID + '36',
|
||||
'preferredDeliveryMethod': X500ATTR_OID + '28',
|
||||
'internationaliSDNNumber': X500ATTR_OID + '25',
|
||||
'uniqueMember': X500ATTR_OID + '50',
|
||||
'departmentNumber': NETSCAPE_LDAP + '2',
|
||||
'enhancedSearchGuide': X500ATTR_OID + '47',
|
||||
'userPKCS12': NETSCAPE_LDAP + '216',
|
||||
'eduPersonTargetedID': EDUPERSON_OID + '10',
|
||||
'norEduOrgUniqueNumber': NOREDUPERSON_OID + '1',
|
||||
'x121Address': X500ATTR_OID + '24',
|
||||
'destinationIndicator': X500ATTR_OID + '27',
|
||||
'eduPersonPrimaryAffiliation': EDUPERSON_OID + '5',
|
||||
'surname': X500ATTR_OID + '4',
|
||||
'jpegPhoto': UCL_DIR_PILOT + '60',
|
||||
'eduPersonScopedAffiliation': EDUPERSON_OID + '9',
|
||||
'edupersonscopedaffiliation': EDUPERSON_OID + '9',
|
||||
'protocolInformation': X500ATTR_OID + '48',
|
||||
'knowledgeInformation': X500ATTR_OID + '2',
|
||||
'employeeType': NETSCAPE_LDAP + '4',
|
||||
'userSMIMECertificate': NETSCAPE_LDAP + '40',
|
||||
'member': X500ATTR_OID + '31',
|
||||
'streetAddress': X500ATTR_OID + '9',
|
||||
'dmdName': X500ATTR_OID + '54',
|
||||
'postalCode': X500ATTR_OID + '17',
|
||||
'pseudonym': X500ATTR_OID + '65',
|
||||
'dnQualifier': X500ATTR_OID + '46',
|
||||
'crossCertificatePair': X500ATTR_OID + '40',
|
||||
'eduPersonOrgDN': EDUPERSON_OID + '3',
|
||||
'authorityRevocationList': X500ATTR_OID + '38',
|
||||
'displayName': NETSCAPE_LDAP + '241',
|
||||
'businessCategory': X500ATTR_OID + '15',
|
||||
'serialNumber': X500ATTR_OID + '5',
|
||||
'norEduOrgUniqueIdentifier': NOREDUPERSON_OID + '7',
|
||||
'st': X500ATTR_OID + '8',
|
||||
'carLicense': NETSCAPE_LDAP + '1',
|
||||
'presentationAddress': X500ATTR_OID + '29',
|
||||
'sn': X500ATTR_OID + '4',
|
||||
'domainComponent': UCL_DIR_PILOT + '25',
|
||||
'labeledURI': UMICH + '57',
|
||||
'uid': UCL_DIR_PILOT + '1',
|
||||
'schacMotherTongue': SCHAC + '1',
|
||||
'schacGender': SCHAC + '2',
|
||||
'schacDateOfBirth': SCHAC + '3',
|
||||
'schacPlaceOfBirth': SCHAC + '4',
|
||||
'schacCountryOfCitizenship': SCHAC + '5',
|
||||
'schacSn1': SCHAC + '6',
|
||||
'schacSn2': SCHAC + '7',
|
||||
'schacPersonalTitle': SCHAC + '8',
|
||||
'schacHomeOrganization': SCHAC + '9',
|
||||
'schacHomeOrganizationType': SCHAC + '10',
|
||||
'schacCountryOfResidence': SCHAC + '11',
|
||||
'schacUserPresenceID': SCHAC + '12',
|
||||
'schacPersonalPosition': SCHAC + '13',
|
||||
'schacPersonalUniqueCode': SCHAC + '14',
|
||||
'schacPersonalUniqueID': SCHAC + '15',
|
||||
'schacExpiryDate': SCHAC + '17',
|
||||
'schacUserPrivateAttribute': SCHAC + '18',
|
||||
'schacUserStatus': SCHAC + '19',
|
||||
'schacProjectMembership': SCHAC + '20',
|
||||
'schacProjectSpecificRole': SCHAC + '21',
|
||||
'roleOccupant': X500ATTR_OID+'33',
|
||||
'gn': X500ATTR_OID+'42',
|
||||
'norEduPersonNIN': NOREDUPERSON_OID+'5',
|
||||
'title': X500ATTR_OID+'12',
|
||||
'facsimileTelephoneNumber': X500ATTR_OID+'23',
|
||||
'mail': UCL_DIR_PILOT+'3',
|
||||
'postOfficeBox': X500ATTR_OID+'18',
|
||||
'fax': X500ATTR_OID+'23',
|
||||
'telephoneNumber': X500ATTR_OID+'20',
|
||||
'norEduPersonBirthDate': NOREDUPERSON_OID+'3',
|
||||
'rfc822Mailbox': UCL_DIR_PILOT+'3',
|
||||
'dc': UCL_DIR_PILOT+'25',
|
||||
'countryName': X500ATTR_OID+'6',
|
||||
'emailAddress': PKCS_9+'1',
|
||||
'employeeNumber': NETSCAPE_LDAP+'3',
|
||||
'organizationName': X500ATTR_OID+'10',
|
||||
'eduPersonAssurance': EDUPERSON_OID+'11',
|
||||
'norEduOrgAcronym': NOREDUPERSON_OID+'6',
|
||||
'registeredAddress': X500ATTR_OID+'26',
|
||||
'physicalDeliveryOfficeName': X500ATTR_OID+'19',
|
||||
'associatedDomain': UCL_DIR_PILOT+'37',
|
||||
'l': X500ATTR_OID+'7',
|
||||
'stateOrProvinceName': X500ATTR_OID+'8',
|
||||
'federationFeideSchemaVersion': NOREDUPERSON_OID+'9',
|
||||
'pkcs9email': PKCS_9+'1',
|
||||
'givenName': X500ATTR_OID+'42',
|
||||
'givenname': X500ATTR_OID+'42',
|
||||
'x500UniqueIdentifier': X500ATTR_OID+'45',
|
||||
'eduPersonNickname': EDUPERSON_OID+'2',
|
||||
'houseIdentifier': X500ATTR_OID+'51',
|
||||
'street': X500ATTR_OID+'9',
|
||||
'supportedAlgorithms': X500ATTR_OID+'52',
|
||||
'preferredLanguage': NETSCAPE_LDAP+'39',
|
||||
'postalAddress': X500ATTR_OID+'16',
|
||||
'email': PKCS_9+'1',
|
||||
'norEduOrgUnitUniqueIdentifier': NOREDUPERSON_OID+'8',
|
||||
'eduPersonPrimaryOrgUnitDN': EDUPERSON_OID+'8',
|
||||
'c': X500ATTR_OID+'6',
|
||||
'teletexTerminalIdentifier': X500ATTR_OID+'22',
|
||||
'o': X500ATTR_OID+'10',
|
||||
'cACertificate': X500ATTR_OID+'37',
|
||||
'telexNumber': X500ATTR_OID+'21',
|
||||
'ou': X500ATTR_OID+'11',
|
||||
'initials': X500ATTR_OID+'43',
|
||||
'eduPersonOrgUnitDN': EDUPERSON_OID+'4',
|
||||
'deltaRevocationList': X500ATTR_OID+'53',
|
||||
'norEduPersonLIN': NOREDUPERSON_OID+'4',
|
||||
'supportedApplicationContext': X500ATTR_OID+'30',
|
||||
'eduPersonEntitlement': EDUPERSON_OID+'7',
|
||||
'generationQualifier': X500ATTR_OID+'44',
|
||||
'eduPersonAffiliation': EDUPERSON_OID+'1',
|
||||
'edupersonaffiliation': EDUPERSON_OID+'1',
|
||||
'eduPersonPrincipalName': EDUPERSON_OID+'6',
|
||||
'edupersonprincipalname': EDUPERSON_OID+'6',
|
||||
'localityName': X500ATTR_OID+'7',
|
||||
'owner': X500ATTR_OID+'32',
|
||||
'norEduOrgUnitUniqueNumber': NOREDUPERSON_OID+'2',
|
||||
'searchGuide': X500ATTR_OID+'14',
|
||||
'certificateRevocationList': X500ATTR_OID+'39',
|
||||
'organizationalUnitName': X500ATTR_OID+'11',
|
||||
'userCertificate': X500ATTR_OID+'36',
|
||||
'preferredDeliveryMethod': X500ATTR_OID+'28',
|
||||
'internationaliSDNNumber': X500ATTR_OID+'25',
|
||||
'uniqueMember': X500ATTR_OID+'50',
|
||||
'departmentNumber': NETSCAPE_LDAP+'2',
|
||||
'enhancedSearchGuide': X500ATTR_OID+'47',
|
||||
'userPKCS12': NETSCAPE_LDAP+'216',
|
||||
'eduPersonTargetedID': EDUPERSON_OID+'10',
|
||||
'norEduOrgUniqueNumber': NOREDUPERSON_OID+'1',
|
||||
'x121Address': X500ATTR_OID+'24',
|
||||
'destinationIndicator': X500ATTR_OID+'27',
|
||||
'eduPersonPrimaryAffiliation': EDUPERSON_OID+'5',
|
||||
'surname': X500ATTR_OID+'4',
|
||||
'jpegPhoto': UCL_DIR_PILOT+'60',
|
||||
'eduPersonScopedAffiliation': EDUPERSON_OID+'9',
|
||||
'edupersonscopedaffiliation': EDUPERSON_OID+'9',
|
||||
'protocolInformation': X500ATTR_OID+'48',
|
||||
'knowledgeInformation': X500ATTR_OID+'2',
|
||||
'employeeType': NETSCAPE_LDAP+'4',
|
||||
'userSMIMECertificate': NETSCAPE_LDAP+'40',
|
||||
'member': X500ATTR_OID+'31',
|
||||
'streetAddress': X500ATTR_OID+'9',
|
||||
'dmdName': X500ATTR_OID+'54',
|
||||
'postalCode': X500ATTR_OID+'17',
|
||||
'pseudonym': X500ATTR_OID+'65',
|
||||
'dnQualifier': X500ATTR_OID+'46',
|
||||
'crossCertificatePair': X500ATTR_OID+'40',
|
||||
'eduPersonOrgDN': EDUPERSON_OID+'3',
|
||||
'authorityRevocationList': X500ATTR_OID+'38',
|
||||
'displayName': NETSCAPE_LDAP+'241',
|
||||
'businessCategory': X500ATTR_OID+'15',
|
||||
'serialNumber': X500ATTR_OID+'5',
|
||||
'norEduOrgUniqueIdentifier': NOREDUPERSON_OID+'7',
|
||||
'st': X500ATTR_OID+'8',
|
||||
'carLicense': NETSCAPE_LDAP+'1',
|
||||
'presentationAddress': X500ATTR_OID+'29',
|
||||
'sn': X500ATTR_OID+'4',
|
||||
'domainComponent': UCL_DIR_PILOT+'25',
|
||||
'labeledURI': UMICH+'57',
|
||||
'uid': UCL_DIR_PILOT+'1',
|
||||
'schacMotherTongue':SCHAC+'1',
|
||||
'schacGender': SCHAC+'2',
|
||||
'schacDateOfBirth':SCHAC+'3',
|
||||
'schacPlaceOfBirth': SCHAC+'4',
|
||||
'schacCountryOfCitizenship':SCHAC+'5',
|
||||
'schacSn1': SCHAC+'6',
|
||||
'schacSn2': SCHAC+'7',
|
||||
'schacPersonalTitle':SCHAC+'8',
|
||||
'schacHomeOrganization': SCHAC+'9',
|
||||
'schacHomeOrganizationType': SCHAC+'10',
|
||||
'schacCountryOfResidence': SCHAC+'11',
|
||||
'schacUserPresenceID': SCHAC+'12',
|
||||
'schacPersonalPosition': SCHAC+'13',
|
||||
'schacPersonalUniqueCode': SCHAC+'14',
|
||||
'schacPersonalUniqueID': SCHAC+'15',
|
||||
'schacExpiryDate': SCHAC+'17',
|
||||
'schacUserPrivateAttribute': SCHAC+'18',
|
||||
'schacUserStatus': SCHAC+'19',
|
||||
'schacProjectMembership': SCHAC+'20',
|
||||
'schacProjectSpecificRole': SCHAC+'21',
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,182 +9,182 @@ UMICH = "urn:oid:1.3.6.1.4.1.250.1.57."
|
||||
MAP = {
|
||||
"identifier": "urn:mace:shibboleth:1.0:attributeNamespace:uri",
|
||||
"fro": {
|
||||
EDUPERSON_OID + '2': 'eduPersonNickname',
|
||||
EDUPERSON_OID + '9': 'eduPersonScopedAffiliation',
|
||||
EDUPERSON_OID + '11': 'eduPersonAssurance',
|
||||
EDUPERSON_OID + '10': 'eduPersonTargetedID',
|
||||
EDUPERSON_OID + '4': 'eduPersonOrgUnitDN',
|
||||
NOREDUPERSON_OID + '6': 'norEduOrgAcronym',
|
||||
NOREDUPERSON_OID + '7': 'norEduOrgUniqueIdentifier',
|
||||
NOREDUPERSON_OID + '4': 'norEduPersonLIN',
|
||||
EDUPERSON_OID + '1': 'eduPersonAffiliation',
|
||||
NOREDUPERSON_OID + '2': 'norEduOrgUnitUniqueNumber',
|
||||
NETSCAPE_LDAP + '40': 'userSMIMECertificate',
|
||||
NOREDUPERSON_OID + '1': 'norEduOrgUniqueNumber',
|
||||
NETSCAPE_LDAP + '241': 'displayName',
|
||||
UCL_DIR_PILOT + '37': 'associatedDomain',
|
||||
EDUPERSON_OID + '6': 'eduPersonPrincipalName',
|
||||
NOREDUPERSON_OID + '8': 'norEduOrgUnitUniqueIdentifier',
|
||||
NOREDUPERSON_OID + '9': 'federationFeideSchemaVersion',
|
||||
X500ATTR + '53': 'deltaRevocationList',
|
||||
X500ATTR + '52': 'supportedAlgorithms',
|
||||
X500ATTR + '51': 'houseIdentifier',
|
||||
X500ATTR + '50': 'uniqueMember',
|
||||
X500ATTR + '19': 'physicalDeliveryOfficeName',
|
||||
X500ATTR + '18': 'postOfficeBox',
|
||||
X500ATTR + '17': 'postalCode',
|
||||
X500ATTR + '16': 'postalAddress',
|
||||
X500ATTR + '15': 'businessCategory',
|
||||
X500ATTR + '14': 'searchGuide',
|
||||
EDUPERSON_OID + '5': 'eduPersonPrimaryAffiliation',
|
||||
X500ATTR + '12': 'title',
|
||||
X500ATTR + '11': 'ou',
|
||||
X500ATTR + '10': 'o',
|
||||
X500ATTR + '37': 'cACertificate',
|
||||
X500ATTR + '36': 'userCertificate',
|
||||
X500ATTR + '31': 'member',
|
||||
X500ATTR + '30': 'supportedApplicationContext',
|
||||
X500ATTR + '33': 'roleOccupant',
|
||||
X500ATTR + '32': 'owner',
|
||||
NETSCAPE_LDAP + '1': 'carLicense',
|
||||
PKCS_9 + '1': 'email',
|
||||
NETSCAPE_LDAP + '3': 'employeeNumber',
|
||||
NETSCAPE_LDAP + '2': 'departmentNumber',
|
||||
X500ATTR + '39': 'certificateRevocationList',
|
||||
X500ATTR + '38': 'authorityRevocationList',
|
||||
NETSCAPE_LDAP + '216': 'userPKCS12',
|
||||
EDUPERSON_OID + '8': 'eduPersonPrimaryOrgUnitDN',
|
||||
X500ATTR + '9': 'street',
|
||||
X500ATTR + '8': 'st',
|
||||
NETSCAPE_LDAP + '39': 'preferredLanguage',
|
||||
EDUPERSON_OID + '7': 'eduPersonEntitlement',
|
||||
X500ATTR + '2': 'knowledgeInformation',
|
||||
X500ATTR + '7': 'l',
|
||||
X500ATTR + '6': 'c',
|
||||
X500ATTR + '5': 'serialNumber',
|
||||
X500ATTR + '4': 'sn',
|
||||
UCL_DIR_PILOT + '60': 'jpegPhoto',
|
||||
X500ATTR + '65': 'pseudonym',
|
||||
NOREDUPERSON_OID + '5': 'norEduPersonNIN',
|
||||
UCL_DIR_PILOT + '3': 'mail',
|
||||
UCL_DIR_PILOT + '25': 'dc',
|
||||
X500ATTR + '40': 'crossCertificatePair',
|
||||
X500ATTR + '42': 'givenName',
|
||||
X500ATTR + '43': 'initials',
|
||||
X500ATTR + '44': 'generationQualifier',
|
||||
X500ATTR + '45': 'x500UniqueIdentifier',
|
||||
X500ATTR + '46': 'dnQualifier',
|
||||
X500ATTR + '47': 'enhancedSearchGuide',
|
||||
X500ATTR + '48': 'protocolInformation',
|
||||
X500ATTR + '54': 'dmdName',
|
||||
NETSCAPE_LDAP + '4': 'employeeType',
|
||||
X500ATTR + '22': 'teletexTerminalIdentifier',
|
||||
X500ATTR + '23': 'facsimileTelephoneNumber',
|
||||
X500ATTR + '20': 'telephoneNumber',
|
||||
X500ATTR + '21': 'telexNumber',
|
||||
X500ATTR + '26': 'registeredAddress',
|
||||
X500ATTR + '27': 'destinationIndicator',
|
||||
X500ATTR + '24': 'x121Address',
|
||||
X500ATTR + '25': 'internationaliSDNNumber',
|
||||
X500ATTR + '28': 'preferredDeliveryMethod',
|
||||
X500ATTR + '29': 'presentationAddress',
|
||||
EDUPERSON_OID + '3': 'eduPersonOrgDN',
|
||||
NOREDUPERSON_OID + '3': 'norEduPersonBirthDate',
|
||||
EDUPERSON_OID+'2': 'eduPersonNickname',
|
||||
EDUPERSON_OID+'9': 'eduPersonScopedAffiliation',
|
||||
EDUPERSON_OID+'11': 'eduPersonAssurance',
|
||||
EDUPERSON_OID+'10': 'eduPersonTargetedID',
|
||||
EDUPERSON_OID+'4': 'eduPersonOrgUnitDN',
|
||||
NOREDUPERSON_OID+'6': 'norEduOrgAcronym',
|
||||
NOREDUPERSON_OID+'7': 'norEduOrgUniqueIdentifier',
|
||||
NOREDUPERSON_OID+'4': 'norEduPersonLIN',
|
||||
EDUPERSON_OID+'1': 'eduPersonAffiliation',
|
||||
NOREDUPERSON_OID+'2': 'norEduOrgUnitUniqueNumber',
|
||||
NETSCAPE_LDAP+'40': 'userSMIMECertificate',
|
||||
NOREDUPERSON_OID+'1': 'norEduOrgUniqueNumber',
|
||||
NETSCAPE_LDAP+'241': 'displayName',
|
||||
UCL_DIR_PILOT+'37': 'associatedDomain',
|
||||
EDUPERSON_OID+'6': 'eduPersonPrincipalName',
|
||||
NOREDUPERSON_OID+'8': 'norEduOrgUnitUniqueIdentifier',
|
||||
NOREDUPERSON_OID+'9': 'federationFeideSchemaVersion',
|
||||
X500ATTR+'53': 'deltaRevocationList',
|
||||
X500ATTR+'52': 'supportedAlgorithms',
|
||||
X500ATTR+'51': 'houseIdentifier',
|
||||
X500ATTR+'50': 'uniqueMember',
|
||||
X500ATTR+'19': 'physicalDeliveryOfficeName',
|
||||
X500ATTR+'18': 'postOfficeBox',
|
||||
X500ATTR+'17': 'postalCode',
|
||||
X500ATTR+'16': 'postalAddress',
|
||||
X500ATTR+'15': 'businessCategory',
|
||||
X500ATTR+'14': 'searchGuide',
|
||||
EDUPERSON_OID+'5': 'eduPersonPrimaryAffiliation',
|
||||
X500ATTR+'12': 'title',
|
||||
X500ATTR+'11': 'ou',
|
||||
X500ATTR+'10': 'o',
|
||||
X500ATTR+'37': 'cACertificate',
|
||||
X500ATTR+'36': 'userCertificate',
|
||||
X500ATTR+'31': 'member',
|
||||
X500ATTR+'30': 'supportedApplicationContext',
|
||||
X500ATTR+'33': 'roleOccupant',
|
||||
X500ATTR+'32': 'owner',
|
||||
NETSCAPE_LDAP+'1': 'carLicense',
|
||||
PKCS_9+'1': 'email',
|
||||
NETSCAPE_LDAP+'3': 'employeeNumber',
|
||||
NETSCAPE_LDAP+'2': 'departmentNumber',
|
||||
X500ATTR+'39': 'certificateRevocationList',
|
||||
X500ATTR+'38': 'authorityRevocationList',
|
||||
NETSCAPE_LDAP+'216': 'userPKCS12',
|
||||
EDUPERSON_OID+'8': 'eduPersonPrimaryOrgUnitDN',
|
||||
X500ATTR+'9': 'street',
|
||||
X500ATTR+'8': 'st',
|
||||
NETSCAPE_LDAP+'39': 'preferredLanguage',
|
||||
EDUPERSON_OID+'7': 'eduPersonEntitlement',
|
||||
X500ATTR+'2': 'knowledgeInformation',
|
||||
X500ATTR+'7': 'l',
|
||||
X500ATTR+'6': 'c',
|
||||
X500ATTR+'5': 'serialNumber',
|
||||
X500ATTR+'4': 'sn',
|
||||
UCL_DIR_PILOT+'60': 'jpegPhoto',
|
||||
X500ATTR+'65': 'pseudonym',
|
||||
NOREDUPERSON_OID+'5': 'norEduPersonNIN',
|
||||
UCL_DIR_PILOT+'3': 'mail',
|
||||
UCL_DIR_PILOT+'25': 'dc',
|
||||
X500ATTR+'40': 'crossCertificatePair',
|
||||
X500ATTR+'42': 'givenName',
|
||||
X500ATTR+'43': 'initials',
|
||||
X500ATTR+'44': 'generationQualifier',
|
||||
X500ATTR+'45': 'x500UniqueIdentifier',
|
||||
X500ATTR+'46': 'dnQualifier',
|
||||
X500ATTR+'47': 'enhancedSearchGuide',
|
||||
X500ATTR+'48': 'protocolInformation',
|
||||
X500ATTR+'54': 'dmdName',
|
||||
NETSCAPE_LDAP+'4': 'employeeType',
|
||||
X500ATTR+'22': 'teletexTerminalIdentifier',
|
||||
X500ATTR+'23': 'facsimileTelephoneNumber',
|
||||
X500ATTR+'20': 'telephoneNumber',
|
||||
X500ATTR+'21': 'telexNumber',
|
||||
X500ATTR+'26': 'registeredAddress',
|
||||
X500ATTR+'27': 'destinationIndicator',
|
||||
X500ATTR+'24': 'x121Address',
|
||||
X500ATTR+'25': 'internationaliSDNNumber',
|
||||
X500ATTR+'28': 'preferredDeliveryMethod',
|
||||
X500ATTR+'29': 'presentationAddress',
|
||||
EDUPERSON_OID+'3': 'eduPersonOrgDN',
|
||||
NOREDUPERSON_OID+'3': 'norEduPersonBirthDate',
|
||||
},
|
||||
"to": {
|
||||
'roleOccupant': X500ATTR + '33',
|
||||
'gn': X500ATTR + '42',
|
||||
'norEduPersonNIN': NOREDUPERSON_OID + '5',
|
||||
'title': X500ATTR + '12',
|
||||
'facsimileTelephoneNumber': X500ATTR + '23',
|
||||
'mail': UCL_DIR_PILOT + '3',
|
||||
'postOfficeBox': X500ATTR + '18',
|
||||
'fax': X500ATTR + '23',
|
||||
'telephoneNumber': X500ATTR + '20',
|
||||
'norEduPersonBirthDate': NOREDUPERSON_OID + '3',
|
||||
'rfc822Mailbox': UCL_DIR_PILOT + '3',
|
||||
'dc': UCL_DIR_PILOT + '25',
|
||||
'countryName': X500ATTR + '6',
|
||||
'emailAddress': PKCS_9 + '1',
|
||||
'employeeNumber': NETSCAPE_LDAP + '3',
|
||||
'organizationName': X500ATTR + '10',
|
||||
'eduPersonAssurance': EDUPERSON_OID + '11',
|
||||
'norEduOrgAcronym': NOREDUPERSON_OID + '6',
|
||||
'registeredAddress': X500ATTR + '26',
|
||||
'physicalDeliveryOfficeName': X500ATTR + '19',
|
||||
'associatedDomain': UCL_DIR_PILOT + '37',
|
||||
'l': X500ATTR + '7',
|
||||
'stateOrProvinceName': X500ATTR + '8',
|
||||
'federationFeideSchemaVersion': NOREDUPERSON_OID + '9',
|
||||
'pkcs9email': PKCS_9 + '1',
|
||||
'givenName': X500ATTR + '42',
|
||||
'x500UniqueIdentifier': X500ATTR + '45',
|
||||
'eduPersonNickname': EDUPERSON_OID + '2',
|
||||
'houseIdentifier': X500ATTR + '51',
|
||||
'street': X500ATTR + '9',
|
||||
'supportedAlgorithms': X500ATTR + '52',
|
||||
'preferredLanguage': NETSCAPE_LDAP + '39',
|
||||
'postalAddress': X500ATTR + '16',
|
||||
'email': PKCS_9 + '1',
|
||||
'norEduOrgUnitUniqueIdentifier': NOREDUPERSON_OID + '8',
|
||||
'eduPersonPrimaryOrgUnitDN': EDUPERSON_OID + '8',
|
||||
'c': X500ATTR + '6',
|
||||
'teletexTerminalIdentifier': X500ATTR + '22',
|
||||
'o': X500ATTR + '10',
|
||||
'cACertificate': X500ATTR + '37',
|
||||
'telexNumber': X500ATTR + '21',
|
||||
'ou': X500ATTR + '11',
|
||||
'initials': X500ATTR + '43',
|
||||
'eduPersonOrgUnitDN': EDUPERSON_OID + '4',
|
||||
'deltaRevocationList': X500ATTR + '53',
|
||||
'norEduPersonLIN': NOREDUPERSON_OID + '4',
|
||||
'supportedApplicationContext': X500ATTR + '30',
|
||||
'eduPersonEntitlement': EDUPERSON_OID + '7',
|
||||
'generationQualifier': X500ATTR + '44',
|
||||
'eduPersonAffiliation': EDUPERSON_OID + '1',
|
||||
'eduPersonPrincipalName': EDUPERSON_OID + '6',
|
||||
'localityName': X500ATTR + '7',
|
||||
'owner': X500ATTR + '32',
|
||||
'norEduOrgUnitUniqueNumber': NOREDUPERSON_OID + '2',
|
||||
'searchGuide': X500ATTR + '14',
|
||||
'certificateRevocationList': X500ATTR + '39',
|
||||
'organizationalUnitName': X500ATTR + '11',
|
||||
'userCertificate': X500ATTR + '36',
|
||||
'preferredDeliveryMethod': X500ATTR + '28',
|
||||
'internationaliSDNNumber': X500ATTR + '25',
|
||||
'uniqueMember': X500ATTR + '50',
|
||||
'departmentNumber': NETSCAPE_LDAP + '2',
|
||||
'enhancedSearchGuide': X500ATTR + '47',
|
||||
'userPKCS12': NETSCAPE_LDAP + '216',
|
||||
'eduPersonTargetedID': EDUPERSON_OID + '10',
|
||||
'norEduOrgUniqueNumber': NOREDUPERSON_OID + '1',
|
||||
'x121Address': X500ATTR + '24',
|
||||
'destinationIndicator': X500ATTR + '27',
|
||||
'eduPersonPrimaryAffiliation': EDUPERSON_OID + '5',
|
||||
'surname': X500ATTR + '4',
|
||||
'jpegPhoto': UCL_DIR_PILOT + '60',
|
||||
'eduPersonScopedAffiliation': EDUPERSON_OID + '9',
|
||||
'protocolInformation': X500ATTR + '48',
|
||||
'knowledgeInformation': X500ATTR + '2',
|
||||
'employeeType': NETSCAPE_LDAP + '4',
|
||||
'userSMIMECertificate': NETSCAPE_LDAP + '40',
|
||||
'member': X500ATTR + '31',
|
||||
'streetAddress': X500ATTR + '9',
|
||||
'dmdName': X500ATTR + '54',
|
||||
'postalCode': X500ATTR + '17',
|
||||
'pseudonym': X500ATTR + '65',
|
||||
'dnQualifier': X500ATTR + '46',
|
||||
'crossCertificatePair': X500ATTR + '40',
|
||||
'eduPersonOrgDN': EDUPERSON_OID + '3',
|
||||
'authorityRevocationList': X500ATTR + '38',
|
||||
'displayName': NETSCAPE_LDAP + '241',
|
||||
'businessCategory': X500ATTR + '15',
|
||||
'serialNumber': X500ATTR + '5',
|
||||
'norEduOrgUniqueIdentifier': NOREDUPERSON_OID + '7',
|
||||
'st': X500ATTR + '8',
|
||||
'carLicense': NETSCAPE_LDAP + '1',
|
||||
'presentationAddress': X500ATTR + '29',
|
||||
'sn': X500ATTR + '4',
|
||||
'domainComponent': UCL_DIR_PILOT + '25',
|
||||
"to":{
|
||||
'roleOccupant': X500ATTR+'33',
|
||||
'gn': X500ATTR+'42',
|
||||
'norEduPersonNIN': NOREDUPERSON_OID+'5',
|
||||
'title': X500ATTR+'12',
|
||||
'facsimileTelephoneNumber': X500ATTR+'23',
|
||||
'mail': UCL_DIR_PILOT+'3',
|
||||
'postOfficeBox': X500ATTR+'18',
|
||||
'fax': X500ATTR+'23',
|
||||
'telephoneNumber': X500ATTR+'20',
|
||||
'norEduPersonBirthDate': NOREDUPERSON_OID+'3',
|
||||
'rfc822Mailbox': UCL_DIR_PILOT+'3',
|
||||
'dc': UCL_DIR_PILOT+'25',
|
||||
'countryName': X500ATTR+'6',
|
||||
'emailAddress': PKCS_9+'1',
|
||||
'employeeNumber': NETSCAPE_LDAP+'3',
|
||||
'organizationName': X500ATTR+'10',
|
||||
'eduPersonAssurance': EDUPERSON_OID+'11',
|
||||
'norEduOrgAcronym': NOREDUPERSON_OID+'6',
|
||||
'registeredAddress': X500ATTR+'26',
|
||||
'physicalDeliveryOfficeName': X500ATTR+'19',
|
||||
'associatedDomain': UCL_DIR_PILOT+'37',
|
||||
'l': X500ATTR+'7',
|
||||
'stateOrProvinceName': X500ATTR+'8',
|
||||
'federationFeideSchemaVersion': NOREDUPERSON_OID+'9',
|
||||
'pkcs9email': PKCS_9+'1',
|
||||
'givenName': X500ATTR+'42',
|
||||
'x500UniqueIdentifier': X500ATTR+'45',
|
||||
'eduPersonNickname': EDUPERSON_OID+'2',
|
||||
'houseIdentifier': X500ATTR+'51',
|
||||
'street': X500ATTR+'9',
|
||||
'supportedAlgorithms': X500ATTR+'52',
|
||||
'preferredLanguage': NETSCAPE_LDAP+'39',
|
||||
'postalAddress': X500ATTR+'16',
|
||||
'email': PKCS_9+'1',
|
||||
'norEduOrgUnitUniqueIdentifier': NOREDUPERSON_OID+'8',
|
||||
'eduPersonPrimaryOrgUnitDN': EDUPERSON_OID+'8',
|
||||
'c': X500ATTR+'6',
|
||||
'teletexTerminalIdentifier': X500ATTR+'22',
|
||||
'o': X500ATTR+'10',
|
||||
'cACertificate': X500ATTR+'37',
|
||||
'telexNumber': X500ATTR+'21',
|
||||
'ou': X500ATTR+'11',
|
||||
'initials': X500ATTR+'43',
|
||||
'eduPersonOrgUnitDN': EDUPERSON_OID+'4',
|
||||
'deltaRevocationList': X500ATTR+'53',
|
||||
'norEduPersonLIN': NOREDUPERSON_OID+'4',
|
||||
'supportedApplicationContext': X500ATTR+'30',
|
||||
'eduPersonEntitlement': EDUPERSON_OID+'7',
|
||||
'generationQualifier': X500ATTR+'44',
|
||||
'eduPersonAffiliation': EDUPERSON_OID+'1',
|
||||
'eduPersonPrincipalName': EDUPERSON_OID+'6',
|
||||
'localityName': X500ATTR+'7',
|
||||
'owner': X500ATTR+'32',
|
||||
'norEduOrgUnitUniqueNumber': NOREDUPERSON_OID+'2',
|
||||
'searchGuide': X500ATTR+'14',
|
||||
'certificateRevocationList': X500ATTR+'39',
|
||||
'organizationalUnitName': X500ATTR+'11',
|
||||
'userCertificate': X500ATTR+'36',
|
||||
'preferredDeliveryMethod': X500ATTR+'28',
|
||||
'internationaliSDNNumber': X500ATTR+'25',
|
||||
'uniqueMember': X500ATTR+'50',
|
||||
'departmentNumber': NETSCAPE_LDAP+'2',
|
||||
'enhancedSearchGuide': X500ATTR+'47',
|
||||
'userPKCS12': NETSCAPE_LDAP+'216',
|
||||
'eduPersonTargetedID': EDUPERSON_OID+'10',
|
||||
'norEduOrgUniqueNumber': NOREDUPERSON_OID+'1',
|
||||
'x121Address': X500ATTR+'24',
|
||||
'destinationIndicator': X500ATTR+'27',
|
||||
'eduPersonPrimaryAffiliation': EDUPERSON_OID+'5',
|
||||
'surname': X500ATTR+'4',
|
||||
'jpegPhoto': UCL_DIR_PILOT+'60',
|
||||
'eduPersonScopedAffiliation': EDUPERSON_OID+'9',
|
||||
'protocolInformation': X500ATTR+'48',
|
||||
'knowledgeInformation': X500ATTR+'2',
|
||||
'employeeType': NETSCAPE_LDAP+'4',
|
||||
'userSMIMECertificate': NETSCAPE_LDAP+'40',
|
||||
'member': X500ATTR+'31',
|
||||
'streetAddress': X500ATTR+'9',
|
||||
'dmdName': X500ATTR+'54',
|
||||
'postalCode': X500ATTR+'17',
|
||||
'pseudonym': X500ATTR+'65',
|
||||
'dnQualifier': X500ATTR+'46',
|
||||
'crossCertificatePair': X500ATTR+'40',
|
||||
'eduPersonOrgDN': EDUPERSON_OID+'3',
|
||||
'authorityRevocationList': X500ATTR+'38',
|
||||
'displayName': NETSCAPE_LDAP+'241',
|
||||
'businessCategory': X500ATTR+'15',
|
||||
'serialNumber': X500ATTR+'5',
|
||||
'norEduOrgUniqueIdentifier': NOREDUPERSON_OID+'7',
|
||||
'st': X500ATTR+'8',
|
||||
'carLicense': NETSCAPE_LDAP+'1',
|
||||
'presentationAddress': X500ATTR+'29',
|
||||
'sn': X500ATTR+'4',
|
||||
'domainComponent': UCL_DIR_PILOT+'25',
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,12 +14,12 @@ BASE = "http://lingon.ladok.umu.se:8087"
|
||||
#BASE = "http://localhost:8087"
|
||||
|
||||
CONFIG = {
|
||||
"entityid": "%s/sp.xml" % BASE,
|
||||
"name": "SAML2 test tool",
|
||||
"entityid" : "%s/sp.xml" % BASE,
|
||||
"name" : "SAML2 test tool",
|
||||
"description": "Simplest possible",
|
||||
"service": {
|
||||
"sp": {
|
||||
"endpoints": {
|
||||
"endpoints":{
|
||||
"assertion_consumer_service": [
|
||||
("%s/acs/post" % BASE, BINDING_HTTP_POST),
|
||||
("%s/acs/redirect" % BASE, BINDING_HTTP_REDIRECT),
|
||||
@@ -30,27 +30,27 @@ CONFIG = {
|
||||
"single_logout_service": [
|
||||
("%s/sls" % BASE, BINDING_SOAP)
|
||||
],
|
||||
"artifact_resolution_service": [
|
||||
"artifact_resolution_service":[
|
||||
("%s/ars" % BASE, BINDING_SOAP)
|
||||
],
|
||||
"manage_name_id_service": [
|
||||
"manage_name_id_service":[
|
||||
("%s/mni" % BASE, BINDING_HTTP_POST),
|
||||
("%s/mni" % BASE, BINDING_HTTP_REDIRECT),
|
||||
("%s/mni" % BASE, BINDING_SOAP),
|
||||
("%s/acs/artifact" % BASE, BINDING_HTTP_ARTIFACT)
|
||||
],
|
||||
"discovery_response": [
|
||||
"discovery_response":[
|
||||
("%s/disco" % BASE, BINDING_DISCO)
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"key_file": "keys/mykey.pem",
|
||||
"cert_file": "keys/mycert.pem",
|
||||
"xmlsec_binary": XMLSEC_BINARY,
|
||||
"key_file" : "keys/mykey.pem",
|
||||
"cert_file" : "keys/mycert.pem",
|
||||
"xmlsec_binary" : XMLSEC_BINARY,
|
||||
"subject_data": "subject_data.db",
|
||||
"accepted_time_diff": 60,
|
||||
"attribute_map_dir": "attributemaps",
|
||||
"attribute_map_dir" : "attributemaps",
|
||||
"organization": {
|
||||
"name": ("AB Exempel", "se"),
|
||||
"display_name": ("AB Exempel", "se"),
|
||||
@@ -68,3 +68,4 @@ CONFIG = {
|
||||
"secret": "0123456789",
|
||||
"only_use_keys_in_metadata": False
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/usr/bin/env python
|
||||
from saml2.saml import NAME_FORMAT_URI
|
||||
from saml2test import JSON_DUMPS_ARGS
|
||||
|
||||
__author__ = 'rolandh'
|
||||
|
||||
@@ -75,4 +74,4 @@ info = {
|
||||
"name_format": NAME_FORMAT_URI
|
||||
}
|
||||
|
||||
print json.dumps(info, **JSON_DUMPS_ARGS)
|
||||
print json.dumps(info)
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/usr/bin/env python
|
||||
from saml2.saml import NAME_FORMAT_URI
|
||||
from saml2test import JSON_DUMPS_ARGS
|
||||
|
||||
__author__ = 'rolandh'
|
||||
|
||||
@@ -65,4 +64,4 @@ info = {
|
||||
"name_format": NAME_FORMAT_URI
|
||||
}
|
||||
|
||||
print json.dumps(info, **JSON_DUMPS_ARGS)
|
||||
print json.dumps(info)
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/usr/bin/env python
|
||||
from saml2.saml import AUTHN_PASSWORD
|
||||
from saml2test import JSON_DUMPS_ARGS
|
||||
|
||||
__author__ = 'rolandh'
|
||||
|
||||
@@ -41,4 +40,4 @@ info = {
|
||||
"userid": "roland"
|
||||
}
|
||||
|
||||
print json.dumps(info, **JSON_DUMPS_ARGS)
|
||||
print json.dumps(info)
|
||||
Reference in New Issue
Block a user