예제 #1
0
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')
예제 #2
0
파일: tests.py 프로젝트: kalfa/python-xrd
    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()
예제 #3
0
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}")
예제 #4
0
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
예제 #5
0
 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>
         """)
예제 #6
0
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
예제 #7
0
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
예제 #8
0
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
예제 #9
0
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
예제 #10
0
 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" }
         ]
     }""")
예제 #11
0
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
예제 #12
0
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')
예제 #13
0
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
예제 #14
0
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
예제 #15
0
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}")
예제 #16
0
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
예제 #17
0
 def xrd(self, url, raw=False):
     conn = self._opener.open(url)
     response = conn.read()
     conn.close()
     return response if raw else XRD.parse(response)
예제 #18
0
 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
예제 #19
0
 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()
예제 #20
0
 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())
예제 #21
0
class BaseHostMeta(object):
    def __init__(self, *args, **kwargs):
        self.xrd = XRD()

    def render(self):
        return self.xrd.to_xml().toprettyxml(indent="  ", encoding="UTF-8")
예제 #22
0
 def __init__(self, *args, **kwargs):
     self.xrd = XRD()
예제 #23
0
 def xrd(self, url, raw=False):
     conn = self._opener.open(url)
     response = conn.read()
     conn.close()
     return response if raw else XRD.parse(response)
예제 #24
0
 def __init__(self, *args, **kwargs):
     self.xrd = XRD()
예제 #25
0
class BaseHostMeta:
    def __init__(self, *args, **kwargs):
        self.xrd = XRD()

    def render(self):
        return self.xrd.to_xml().toprettyxml(indent="  ", encoding="UTF-8")
예제 #26
0
 def __init__(self, subject=None, **kwargs):
     content_type = 'application/xrd+xml'
     super(XRDResponse, self).__init__(content_type=content_type, **kwargs)
     self._xrd = XRD()
예제 #27
0
 def __init__(self, subject=None, **kwargs):
     content_type = 'application/xrd+xml'
     super(XRDResponse, self).__init__(content_type=content_type, **kwargs)
     self._xrd = XRD()