def get_host_meta(): """ This function services the well-known host-meta XRD data for RESTCONF API root discovery. """ if args.verbose > 0: print 'get_host_meta: entry' xrd_obj = XRD() # Add a few extra elements and links before RESTCONF to help make sure # the parsing/XPATH is correct xrd_obj.elements.append(Element('hm:Host', 'testDevice')) xrd_obj.links.append(Link(rel='license', href='http://www.apache.org/licenses/LICENSE-2.0')) xrd_obj.links.append(Link(rel='author', href='http://bcsw.net')) # Add the link for RESTCONF xrd_obj.links.append(Link(rel='restconf', href=args.root_resource)) # Add some extra links here as well xrd_obj.links.append(Link(rel='testPath', href='this/does/not/exist')) xrd_obj.links.append(Link(rel='http://oexchange.org/spec/0.8/rel/resident-target', type_='application/xrd+xml', href='http://twitter.com/oexchange.xrd')) # Convert to XML, pretty-print it to aid in debugging xrd_doc = xrd_obj.to_xml() return Response(xrd_doc.toprettyxml(indent=' '), mimetype='application/xrd+xml')
def testComplexLinks(self): xrd = XRD('9876') xrd.properties.append(('mimetype', 'text/plain')) # This tests Issue #2 lnk = Link(rel='http://spec.example.net/photo/1.0', type_='image/jpeg', href='http://photos.example.com/gpburdell.jpg') lnk.properties.append(('http://spec.example.net/created/1.0', '1970-01-01')) xrd.links.append(lnk) xrd.to_xml()
class TestXRDSerialization(unittest.TestCase): def setUp(self): self.xrd = XRD('9876') self.xrd.properties.append(('mimetype', 'text/plain')) self.xrd.properties.append('none') self.xrd.links.append(Link(template="http://google.com/{uri}")) self.doc = self.xrd.to_xml().documentElement def testxmlid(self): self.assertEqual(self.doc.getAttribute('xml:id'), '9876') def testproperty(self): prop = self.doc.getElementsByTagName('Property')[0] self.assertEqual(prop.getAttribute('type'), 'mimetype') self.assertEqual(_get_text(prop), 'text/plain') def testnilproperty(self): prop = self.doc.getElementsByTagName('Property')[1] self.assertEqual(prop.getAttribute('type'), 'none') self.assertEqual(prop.getAttribute('xsi:nil'), 'true') self.assertTrue(_get_text(prop) is None) def testlink(self): link = self.doc.getElementsByTagName('Link')[0] self.assertEqual(link.getAttribute('template'), "http://google.com/{uri}")
def parse_diaspora_webfinger(document: str) -> Dict: """ Parse Diaspora webfinger which is either in JSON format (new) or XRD (old). https://diaspora.github.io/diaspora_federation/discovery/webfinger.html """ webfinger = { "hcard_url": None, } # noinspection PyBroadException try: doc = json.loads(document) for link in doc["links"]: if link["rel"] == "http://microformats.org/profile/hcard": webfinger["hcard_url"] = link["href"] break else: logger.warning("parse_diaspora_webfinger: found JSON webfinger but it has no hcard href") raise ValueError except Exception: try: xrd = XRD.parse_xrd(document) webfinger["hcard_url"] = xrd.find_link(rels="http://microformats.org/profile/hcard").href except (xml.parsers.expat.ExpatError, TypeError): logger.warning("parse_diaspora_webfinger: found XML webfinger but it fails to parse") pass return webfinger
def setUp(self): self.xrd = XRD.parse_xrd("""<?xml version="1.0" ?> <XRD xml:id="1234" xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"> <Property type="mimetype">text/plain</Property> <Property type="none"></Property> <Link template="http://google.com/{uri}"> <Title xml:lang="en_us">this is my rel</Title> </Link> </XRD> """)
class XRDResponse(HttpResponse): def __init__(self, subject=None, **kwargs): from django.conf import settings content_type = 'text/plain' if settings.DEBUG else 'application/xrd+xml' super(XRDResponse, self).__init__(content_type=content_type, **kwargs) self._xrd = XRD() def __iter__(self): content = self._xrd.to_xml().toxml() self._iterator = iter((content),) return self
def retrieve_diaspora_host_meta(host): """ Retrieve a remote Diaspora host-meta document. :arg host: Host to retrieve from :returns: ``XRD`` instance """ document, code, exception = fetch_document(host=host, path="/.well-known/host-meta") if exception: return None xrd = XRD.parse_xrd(document) return xrd
class XRDResponse(HttpResponse): def __init__(self, subject=None, **kwargs): content_type = 'application/xrd+xml' super(XRDResponse, self).__init__(content_type=content_type, **kwargs) self._xrd = XRD() def __iter__(self): content = self._xrd.to_xml() xml = content.toprettyxml(indent=' ') expr = re.compile(r'>\n\s+([^<>\s].*?)\n\s+</', re.DOTALL) content = expr.sub(r'>\g<1></', xml) self._iterator = iter((content), ) return self
def setUp(self): self.xrd = XRD.parse_jrd("""{ "link": [ { "template": "http://google.com/{uri}", "title": [ { "en_us": "this is my rel" } ] } ], "property": [ { "mimetype": "text/plain" } ] }""")
class XRDResponse(HttpResponse): def __init__(self, subject=None, **kwargs): content_type = 'application/xrd+xml' super(XRDResponse, self).__init__(content_type=content_type, **kwargs) self._xrd = XRD() def __iter__(self): content = self._xrd.to_xml() xml = content.toprettyxml(indent=' ') expr = re.compile(r'>\n\s+([^<>\s].*?)\n\s+</', re.DOTALL) content = expr.sub(r'>\g<1></', xml) self._iterator = iter((content),) return self
def get_host_meta(): """ This function services the well-known host-meta XRD data for RESTCONF API root discovery. """ if args.verbose > 0: print 'get_host_meta: entry' xrd_obj = XRD() # Add a few extra elements and links before RESTCONF to help make sure # the parsing/XPATH is correct xrd_obj.elements.append(Element('hm:Host', 'testDevice')) xrd_obj.links.append( Link(rel='license', href='http://www.apache.org/licenses/LICENSE-2.0')) xrd_obj.links.append(Link(rel='author', href='http://bcsw.net')) # Add the link for RESTCONF xrd_obj.links.append(Link(rel='restconf', href=args.root_resource)) # Add some extra links here as well xrd_obj.links.append(Link(rel='testPath', href='this/does/not/exist')) xrd_obj.links.append( Link(rel='http://oexchange.org/spec/0.8/rel/resident-target', type_='application/xrd+xml', href='http://twitter.com/oexchange.xrd')) # Convert to XML, pretty-print it to aid in debugging xrd_doc = xrd_obj.to_xml() return Response(xrd_doc.toprettyxml(indent=' '), mimetype='application/xrd+xml')
def retrieve_diaspora_host_meta(host): """ Retrieve a remote Diaspora host-meta document. Args: host (str) - Host to retrieve from Returns: XRD """ document, code, exception = fetch_document(host=host, path="/.well-known/host-meta") if exception: return None xrd = XRD.parse_xrd(document) return xrd
def retrieve_diaspora_webfinger(handle): """ Retrieve a remote Diaspora webfinger document. :arg handle: Remote handle to retrieve :returns: ``XRD`` instance """ hostmeta = retrieve_diaspora_host_meta(handle.split("@")[1]) if not hostmeta: return None url = hostmeta.find_link(rels="lrdd").template.replace("{uri}", quote(handle)) document, code, exception = fetch_document(url) if exception: return None xrd = XRD.parse_xrd(document) return xrd
class TestJRDSerialization(unittest.TestCase): def setUp(self): self.xrd = XRD() self.xrd.properties.append(('mimetype', 'text/plain')) self.xrd.links.append(Link(template="http://google.com/{uri}")) self.doc = json.loads(self.xrd.to_json()) def testproperty(self): prop = self.doc['property'][0] self.assertEqual(prop.keys()[0], 'mimetype') self.assertEqual(prop.values()[0], 'text/plain') def testlink(self): link = self.doc['link'][0] self.assertEqual(link['template'], "http://google.com/{uri}")
def retrieve_diaspora_webfinger(handle): """ Retrieve a remote Diaspora webfinger document. :arg handle: Remote handle to retrieve :returns: ``XRD`` instance """ hostmeta = retrieve_diaspora_host_meta(handle.split("@")[1]) if not hostmeta: return None url = hostmeta.find_link(rels="lrdd").template.replace("{uri}", quote(handle)) document, code, exception = fetch_document(url) if exception: return None try: xrd = XRD.parse_xrd(document) except xml.parsers.expat.ExpatError: return None return xrd
def xrd(self, url, raw=False): conn = self._opener.open(url) response = conn.read() conn.close() return response if raw else XRD.parse(response)
def setUp(self): self.xrd = XRD('9876') self.xrd.properties.append(('mimetype', 'text/plain')) self.xrd.properties.append('none') self.xrd.links.append(Link(template="http://google.com/{uri}")) self.doc = self.xrd.to_xml().documentElement
def __init__(self, subject=None, **kwargs): from django.conf import settings content_type = 'text/plain' if settings.DEBUG else 'application/xrd+xml' super(XRDResponse, self).__init__(content_type=content_type, **kwargs) self._xrd = XRD()
def setUp(self): self.xrd = XRD() self.xrd.properties.append(('mimetype', 'text/plain')) self.xrd.links.append(Link(template="http://google.com/{uri}")) self.doc = json.loads(self.xrd.to_json())
class BaseHostMeta(object): def __init__(self, *args, **kwargs): self.xrd = XRD() def render(self): return self.xrd.to_xml().toprettyxml(indent=" ", encoding="UTF-8")
def __init__(self, *args, **kwargs): self.xrd = XRD()
class BaseHostMeta: def __init__(self, *args, **kwargs): self.xrd = XRD() def render(self): return self.xrd.to_xml().toprettyxml(indent=" ", encoding="UTF-8")
def __init__(self, subject=None, **kwargs): content_type = 'application/xrd+xml' super(XRDResponse, self).__init__(content_type=content_type, **kwargs) self._xrd = XRD()