|
2 | 2 | import logging
|
3 | 3 | import re
|
4 | 4 | import argparse
|
| 5 | +from saml2.extension.pefim import SPCertEnc |
5 | 6 | import service_conf
|
6 | 7 |
|
7 | 8 | from Cookie import SimpleCookie
|
8 | 9 | from urlparse import parse_qs
|
9 | 10 | import sys
|
10 | 11 |
|
11 |
| -from saml2 import BINDING_HTTP_REDIRECT |
| 12 | +from saml2 import BINDING_HTTP_REDIRECT, element_to_extension_element |
12 | 13 | from saml2 import BINDING_SOAP
|
13 | 14 | from saml2 import time_util
|
14 | 15 | from saml2 import ecp
|
|
33 | 34 | from saml2.s_utils import sid
|
34 | 35 | from saml2.s_utils import rndstr
|
35 | 36 | #from srtest import exception_trace
|
| 37 | +from saml2.md import Extensions |
| 38 | +import xmldsig as ds |
36 | 39 |
|
37 | 40 | logger = logging.getLogger("")
|
38 | 41 | hdlr = logging.FileHandler('spx.log')
|
@@ -152,6 +155,7 @@ def __init__(self):
|
152 | 155 | self.uid2user = {}
|
153 | 156 | self.cookie_name = "spauthn"
|
154 | 157 | self.outstanding_queries = {}
|
| 158 | + self.outstanding_certs = {} |
155 | 159 | self.relay_state = {}
|
156 | 160 | self.user = {}
|
157 | 161 | self.result = {}
|
@@ -348,7 +352,7 @@ def do(self, response, binding, relay_state="", mtype="response"):
|
348 | 352 |
|
349 | 353 | try:
|
350 | 354 | self.response = self.sp.parse_authn_request_response(
|
351 |
| - response, binding, self.outstanding_queries) |
| 355 | + response, binding, self.outstanding_queries, self.cache.outstanding_certs) |
352 | 356 | except UnknownPrincipal, excp:
|
353 | 357 | logger.error("UnknownPrincipal: %s" % (excp,))
|
354 | 358 | resp = ServiceError("UnknownPrincipal: %s" % (excp,))
|
@@ -551,13 +555,31 @@ def redirect_to_auth(self, _cli, entity_id, came_from):
|
551 | 555 | "assertion_consumer_service"]
|
552 | 556 | # just pick one
|
553 | 557 | endp, return_binding = acs[0]
|
| 558 | + |
| 559 | + extensions = None |
| 560 | + cert = None |
| 561 | + if _cli.config.generate_cert_func is not None: |
| 562 | + cert_str, req_key_str = _cli.config.generate_cert_func() |
| 563 | + cert = { |
| 564 | + "cert": cert_str, |
| 565 | + "key": req_key_str |
| 566 | + } |
| 567 | + spcertenc = SPCertEnc(x509_data=ds.X509Data( |
| 568 | + x509_certificate=ds.X509Certificate(text=cert_str))) |
| 569 | + extensions = Extensions(extension_elements=[ |
| 570 | + element_to_extension_element(spcertenc)]) |
| 571 | + |
554 | 572 | req_id, req = _cli.create_authn_request(destination,
|
555 |
| - binding=return_binding) |
| 573 | + binding=return_binding, extensions=extensions) |
556 | 574 | _rstate = rndstr()
|
557 | 575 | self.cache.relay_state[_rstate] = came_from
|
558 | 576 | ht_args = _cli.apply_binding(_binding, "%s" % req, destination,
|
559 | 577 | relay_state=_rstate)
|
560 | 578 | _sid = req_id
|
| 579 | + |
| 580 | + if cert is not None: |
| 581 | + self.cache.outstanding_certs[_sid] = cert |
| 582 | + |
561 | 583 | except Exception, exc:
|
562 | 584 | logger.exception(exc)
|
563 | 585 | resp = ServiceError(
|
|
0 commit comments