@@ -779,32 +779,52 @@ def load(self, *args, **kwargs):
779779
780780
781781class 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/
783786 """
784787
785788 @staticmethod
786789 def sha1_entity_transform (entity_id ):
787790 return "{{sha1}}{}" .format (
788791 hashlib .sha1 (entity_id .encode ("utf-8" )).hexdigest ())
789792
790- def __init__ (self , url , entity_transform = None ):
793+ def __init__ (self , url = None , security = None , cert = None ,
794+ entity_transform = None , ** kwargs ):
791795 """
792796 :params url: mdx service url
797+ :params security: SecurityContext()
798+ :params cert: certificate used to check signature of signed metadata
793799 :params entity_transform: function transforming (e.g. base64,
794800 sha1 hash or URL quote
795801 hash) the entity id. It is applied to the entity id before it is
796802 concatenated with the request URL sent to the MDX server. Defaults to
797803 sha1 transformation.
798804 """
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+
800809 self .url = url .rstrip ('/' )
801810
802811 if entity_transform :
803812 self .entity_transform = entity_transform
804813 else :
805-
806814 self .entity_transform = MetaDataMDX .sha1_entity_transform
807815
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+
808828 def load (self , * args , ** kwargs ):
809829 # Do nothing
810830 pass
@@ -906,8 +926,17 @@ def load(self, *args, **kwargs):
906926 key = args [1 ]
907927 _md = MetaDataLoader (self .attrc , args [1 ], ** _args )
908928 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 )
911940 else :
912941 raise SAMLError ("Unknown metadata type '%s'" % typ )
913942 _md .load ()
0 commit comments