@@ -779,32 +779,52 @@ def load(self, *args, **kwargs):
779
779
780
780
781
781
class MetaDataMDX (InMemoryMetaData ):
782
- """ Uses the md protocol to fetch entity information
782
+ """
783
+ Uses the MDQ protocol to fetch entity information.
784
+ The protocol is defined at:
785
+ https://datatracker.ietf.org/doc/draft-young-md-query-saml/
783
786
"""
784
787
785
788
@staticmethod
786
789
def sha1_entity_transform (entity_id ):
787
790
return "{{sha1}}{}" .format (
788
791
hashlib .sha1 (entity_id .encode ("utf-8" )).hexdigest ())
789
792
790
- def __init__ (self , url , entity_transform = None ):
793
+ def __init__ (self , url = None , security = None , cert = None ,
794
+ entity_transform = None , ** kwargs ):
791
795
"""
792
796
:params url: mdx service url
797
+ :params security: SecurityContext()
798
+ :params cert: certificate used to check signature of signed metadata
793
799
:params entity_transform: function transforming (e.g. base64,
794
800
sha1 hash or URL quote
795
801
hash) the entity id. It is applied to the entity id before it is
796
802
concatenated with the request URL sent to the MDX server. Defaults to
797
803
sha1 transformation.
798
804
"""
799
- super (MetaDataMDX , self ).__init__ (None , '' )
805
+ super (MetaDataMDX , self ).__init__ (None , ** kwargs )
806
+ if not url :
807
+ raise SAMLError ('URL for MDQ server not specified.' )
808
+
800
809
self .url = url .rstrip ('/' )
801
810
802
811
if entity_transform :
803
812
self .entity_transform = entity_transform
804
813
else :
805
-
806
814
self .entity_transform = MetaDataMDX .sha1_entity_transform
807
815
816
+ self .cert = cert
817
+ self .security = security
818
+
819
+ # We assume that the MDQ server will return a single entity
820
+ # described by a single <EntityDescriptor> element. The protocol
821
+ # does allow multiple entities to be returned in an
822
+ # <EntitiesDescriptor> element but we will not currently support
823
+ # that use case since it is unlikely to be leveraged for most
824
+ # flows.
825
+ self .node_name = "%s:%s" % (md .EntityDescriptor .c_namespace ,
826
+ md .EntityDescriptor .c_tag )
827
+
808
828
def load (self , * args , ** kwargs ):
809
829
# Do nothing
810
830
pass
@@ -906,8 +926,17 @@ def load(self, *args, **kwargs):
906
926
key = args [1 ]
907
927
_md = MetaDataLoader (self .attrc , args [1 ], ** _args )
908
928
elif typ == "mdq" :
909
- key = args [1 ]
910
- _md = MetaDataMDX (args [1 ])
929
+ if 'url' in kwargs :
930
+ key = kwargs ['url' ]
931
+ url = kwargs ['url' ]
932
+ cert = kwargs .get ('cert' )
933
+ security = self .security
934
+ entity_transform = kwargs .get ('entity_transform' , None )
935
+ _md = MetaDataMDX (url , security , cert , entity_transform )
936
+ else :
937
+ key = args [1 ]
938
+ url = args [1 ]
939
+ _md = MetaDataMDX (url )
911
940
else :
912
941
raise SAMLError ("Unknown metadata type '%s'" % typ )
913
942
_md .load ()
0 commit comments