aboutsummaryrefslogtreecommitdiff
path: root/gnunet/gns.py
blob: b46b68146f635d210459483b0bb13d95fb7bd7e8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import dbus

from . import *
from . import crypto
from . import gnsrecord

from ._dbus_utils import *


def lookup(name, zone, record_type, only_cached):
    name = str(name)
    zone = dbusize(crypto.EcdsaPublicKey(zone), True)
    if record_type not in gnsrecord.TYPES:
        raise ValueError("'record_type' must be one of %s" % gnsrecord.TYPES)
    # record_type = dbus.UInt32(gnsrecord.TYPES[record_type], variant_level=1)
    record_type = dbus.String(record_type, variant_level=1)
    only_cached = dbus.Boolean(only_cached)

    try:
        results = sysbus.get_object("gnu.gnunet.gns", "/").lookup(name, zone,
                                                                  record_type,
                                                                  only_cached)
    except dbus.DBusException as e:
        handle_exception(e, "gns", "gnu.gnunet.gns")

    ret = []
    for r in results:
        record_type = str(r[0])
        private = False
        pending = False
        shadow = False
        relative = False
        for f in r[1]:
            if f == "private":
                private = True
            if f == "pending":
                pending = True
            if f == "shadow":
                shadow = True
            if f == "relative_expiration":
                relative = True
        data = str(r[2])
        expiration_time = None
        if relative:
            expiration_time = pythonize(r[3], datetime.timedelta)
        else:
            expiration_time = pythonize(r[3], datetime.datetime)
        ret.append(gnsrecord.Data(record_type, data, expiration_time,
                                  private, pending, shadow))

    return ret