From 5119d271fb6129bc71296fab7f1fc92a135cf533 Mon Sep 17 00:00:00 2001 From: Stefan Pratter Date: Mon, 25 Mar 2024 15:49:57 +0000 Subject: [PATCH 1/5] fixes lost emails due to early exit on org entity match --- rdap/objects.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rdap/objects.py b/rdap/objects.py index a34c8de..91b25dc 100644 --- a/rdap/objects.py +++ b/rdap/objects.py @@ -100,6 +100,7 @@ def _parse(self): emails = set() org_name = "" org_address = "" + org_name_final = False for ent in self._data.get("entities", []): vcard = self._parse_vcard(ent) @@ -113,7 +114,7 @@ def _parse(self): handle_url = self._rdapc.get_entity_url(handle) if "registrant" in roles: - if "fn" in vcard: + if "fn" in vcard and not org_name_final: org_name = vcard["fn"] if "adr" in vcard: org_address = vcard["adr"] @@ -135,8 +136,8 @@ def _parse(self): except RdapHTTPError: if not self._rdapc.config.get("ignore_recurse_errors"): raise - if "org" in kind: - break + if "org" in kind and org_name: + org_name_final = True # WORKAROUND APNIC keeps org info in remarks if "apnic" in self._data.get("port43", ""): From 11268fc4a346f50367522a797068ea6808079c72 Mon Sep 17 00:00:00 2001 From: Stefan Pratter Date: Mon, 25 Mar 2024 16:05:14 +0000 Subject: [PATCH 2/5] org_name_final moved into conditional --- rdap/objects.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rdap/objects.py b/rdap/objects.py index 91b25dc..94a05a2 100644 --- a/rdap/objects.py +++ b/rdap/objects.py @@ -116,6 +116,8 @@ def _parse(self): if "registrant" in roles: if "fn" in vcard and not org_name_final: org_name = vcard["fn"] + if "org" in kind: + org_name_final = True if "adr" in vcard: org_address = vcard["adr"] @@ -136,8 +138,6 @@ def _parse(self): except RdapHTTPError: if not self._rdapc.config.get("ignore_recurse_errors"): raise - if "org" in kind and org_name: - org_name_final = True # WORKAROUND APNIC keeps org info in remarks if "apnic" in self._data.get("port43", ""): From a4486d25225c4f259d07faec1cd88e632288c74d Mon Sep 17 00:00:00 2001 From: Stefan Pratter Date: Mon, 25 Mar 2024 16:27:44 +0000 Subject: [PATCH 3/5] changelog --- CHANGELOG.md | 2 ++ CHANGELOG.yaml | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c59b8eb..46748a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +### Fixed +- issue introduced in 1.5.1 that could cause some contact points to be lost ## 1.5.1 diff --git a/CHANGELOG.yaml b/CHANGELOG.yaml index a073510..a31d6db 100644 --- a/CHANGELOG.yaml +++ b/CHANGELOG.yaml @@ -1,6 +1,7 @@ Unreleased: added: [] - fixed: [] + fixed: + - issue introduced in 1.5.1 that could cause some contact points to be lost changed: [] deprecated: [] removed: [] From b14010d2f13606efb334dd4e7e5fe5c2c7a77407 Mon Sep 17 00:00:00 2001 From: Stefan Pratter Date: Mon, 25 Mar 2024 16:31:50 +0000 Subject: [PATCH 4/5] handle org address the same way --- rdap/objects.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rdap/objects.py b/rdap/objects.py index 94a05a2..e197021 100644 --- a/rdap/objects.py +++ b/rdap/objects.py @@ -101,6 +101,7 @@ def _parse(self): org_name = "" org_address = "" org_name_final = False + org_address_final = False for ent in self._data.get("entities", []): vcard = self._parse_vcard(ent) @@ -118,8 +119,10 @@ def _parse(self): org_name = vcard["fn"] if "org" in kind: org_name_final = True - if "adr" in vcard: + if "adr" in vcard and not org_address_final: org_address = vcard["adr"] + if "org" in kind: + org_address_final = True # check nested entities for nent in ent.get("entities", []): From b926b873bcc83edd8503508020f7d4976447edc4 Mon Sep 17 00:00:00 2001 From: Stefan Pratter Date: Mon, 25 Mar 2024 17:49:19 +0000 Subject: [PATCH 5/5] fix test data --- tests/data/rdap/autnum/205697.expected | 1 + tests/data/rdap/autnum/205726.expected | 1 + tests/data/rdap/autnum/206050.expected | 1 + tests/data/rdap/autnum/2914.expected | 1 + tests/data/rdap/autnum/37271.expected | 3 +- tests/data/rdap/autnum/49037.expected | 4 +- tests/data/rdap/autnum/8283.expected | 8 +- tests/data/rdap/autnum/9269.expected | 1 + tests/data/rdap/entity/BRI2.input | 1 + tests/data/rdap/entity/SD12478-RIPE.input | 67 ++++++++++++++++ tests/data/rdap/entity/WA2477-RIPE.input | 77 +++++++++++++++++++ .../data/rdap/rdap/entity/PP17-AFRINIC.input | 1 + tests/data/rdap/rdap/entity/WOL-AFRINIC.input | 1 + 13 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 tests/data/rdap/entity/BRI2.input create mode 100644 tests/data/rdap/entity/SD12478-RIPE.input create mode 100644 tests/data/rdap/entity/WA2477-RIPE.input create mode 100644 tests/data/rdap/rdap/entity/PP17-AFRINIC.input create mode 100644 tests/data/rdap/rdap/entity/WOL-AFRINIC.input diff --git a/tests/data/rdap/autnum/205697.expected b/tests/data/rdap/autnum/205697.expected index 3160db8..747278b 100644 --- a/tests/data/rdap/autnum/205697.expected +++ b/tests/data/rdap/autnum/205697.expected @@ -1,6 +1,7 @@ { "name": "ALOJALIA", "emails": [ + "abuse@alojalia.com", "alejandro@alojalia.com", "angel@alojalia.com" ], diff --git a/tests/data/rdap/autnum/205726.expected b/tests/data/rdap/autnum/205726.expected index 144e342..2eacf59 100644 --- a/tests/data/rdap/autnum/205726.expected +++ b/tests/data/rdap/autnum/205726.expected @@ -1,6 +1,7 @@ { "name": "Vusam", "emails": [ + "abuse@vusam.com", "daan.vangorkum@vusam.com", "support@vusam.com" ], diff --git a/tests/data/rdap/autnum/206050.expected b/tests/data/rdap/autnum/206050.expected index 1f74cc1..ae066b8 100644 --- a/tests/data/rdap/autnum/206050.expected +++ b/tests/data/rdap/autnum/206050.expected @@ -1,6 +1,7 @@ { "name": "elitnet-tr", "emails": [ + "abuse@geoipa.com", "mehmet@elitnet.net.tr" ], "org_name": "ELITNET TELEKOMUNIKASYON INTERNET VE ILETISIM HIZ.TIC LTD.STI.", diff --git a/tests/data/rdap/autnum/2914.expected b/tests/data/rdap/autnum/2914.expected index c6921ce..1df7aef 100644 --- a/tests/data/rdap/autnum/2914.expected +++ b/tests/data/rdap/autnum/2914.expected @@ -4,6 +4,7 @@ "abuse@ntt.net", "ipr@gin.ntt.net", "massimo@ntt.net", + "peering@ntt.net", "support@us.ntt.net" ], "org_name": "NTT America, Inc.", diff --git a/tests/data/rdap/autnum/37271.expected b/tests/data/rdap/autnum/37271.expected index b2128cf..9f8fa5e 100644 --- a/tests/data/rdap/autnum/37271.expected +++ b/tests/data/rdap/autnum/37271.expected @@ -3,7 +3,8 @@ "emails": [ "abuse@workonline.africa", "communications@workonline.africa", - "noc@workonline.africa" + "noc@workonline.africa", + "peterp@workonline.africa" ], "org_name": "Workonline Communications(Pty) Ltd", "org_address": "114 West St\nJohannesburg 2196" diff --git a/tests/data/rdap/autnum/49037.expected b/tests/data/rdap/autnum/49037.expected index 54aadbd..a4cefe2 100644 --- a/tests/data/rdap/autnum/49037.expected +++ b/tests/data/rdap/autnum/49037.expected @@ -1,7 +1,9 @@ { "name": "PG19", "emails": [ - "mikhail.majorov@gmail.com" + "abuse@webrocket.am", + "mikhail.majorov@gmail.com", + "ripe@webrocket.am" ], "org_name": "PROSTIE RESHENIA LLC, ****************** Routing Policy *******************", "org_address": "ST. MOVSESA HORENACI, 14/20\n1109\nVAGARSHAPAT\nARMENIA" diff --git a/tests/data/rdap/autnum/8283.expected b/tests/data/rdap/autnum/8283.expected index c42f5ff..97d22ee 100644 --- a/tests/data/rdap/autnum/8283.expected +++ b/tests/data/rdap/autnum/8283.expected @@ -2,8 +2,14 @@ "name": "COLOCLUE-AS", "emails": [ "abuse@coloclue.net", + "contact@cybertinus.nl", + "hostmaster@bytepark.net", + "hostmaster@luje.net", + "menno@someones.net", "ops@coloclue.net", - "routers@coloclue.net" + "ripe@jurrian.vaniersel.net", + "routers@coloclue.net", + "weerd@weirdnet.nl" ], "org_name": "Netwerkvereniging Coloclue, Netwerkvereniging Coloclue, Amsterdam, Netherlands", "org_address": "Frans Duwaerstraat 34\n1318 AC\nAlmere\nNETHERLANDS" diff --git a/tests/data/rdap/autnum/9269.expected b/tests/data/rdap/autnum/9269.expected index 54c4bab..d09476b 100644 --- a/tests/data/rdap/autnum/9269.expected +++ b/tests/data/rdap/autnum/9269.expected @@ -1,6 +1,7 @@ { "name": "HKBN-AS-AP", "emails": [ + "abuse@hkbn.com.hk", "abuse@hkbn.net", "hostmaster@hkbn.com.hk", "nocsn@hkbn.com.hk" diff --git a/tests/data/rdap/entity/BRI2.input b/tests/data/rdap/entity/BRI2.input new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/tests/data/rdap/entity/BRI2.input @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/tests/data/rdap/entity/SD12478-RIPE.input b/tests/data/rdap/entity/SD12478-RIPE.input new file mode 100644 index 0000000..f780050 --- /dev/null +++ b/tests/data/rdap/entity/SD12478-RIPE.input @@ -0,0 +1,67 @@ +{ + "handle" : "SD12478-RIPE", + "vcardArray" : [ "vcard", [ [ "version", { }, "text", "4.0" ], [ "fn", { }, "text", "Yavuz Selim MALKOC" ], [ "kind", { }, "text", "individual" ], [ "adr", { + "label" : "Sultan Orhan Mah. Ilyasbey Cad, 1812 Sk.\n41400\nKocaeli\nTURKEY" + }, "text", [ "", "", "", "", "", "", "" ] ], [ "tel", { + "type" : "voice" + }, "text", "+902626446663" ] ] ], + "entities" : [ { + "handle" : "mnt-tr-internetten-1", + "vcardArray" : [ "vcard", [ [ "version", { }, "text", "4.0" ], [ "fn", { }, "text", "mnt-tr-internetten-1" ], [ "kind", { }, "text", "individual" ] ] ], + "roles" : [ "registrant" ], + "links" : [ { + "value" : "https://rdap.db.ripe.net/entity/SD12478-RIPE", + "rel" : "self", + "href" : "https://rdap.db.ripe.net/entity/mnt-tr-internetten-1" + }, { + "value" : "http://www.ripe.net/data-tools/support/documentation/terms", + "rel" : "copyright", + "href" : "http://www.ripe.net/data-tools/support/documentation/terms" + } ], + "objectClassName" : "entity" + } ], + "links" : [ { + "value" : "https://rdap.db.ripe.net/entity/SD12478-RIPE", + "rel" : "self", + "href" : "https://rdap.db.ripe.net/entity/SD12478-RIPE" + }, { + "value" : "http://www.ripe.net/data-tools/support/documentation/terms", + "rel" : "copyright", + "href" : "http://www.ripe.net/data-tools/support/documentation/terms" + } ], + "events" : [ { + "eventAction" : "registration", + "eventDate" : "2019-09-27T12:14:59Z" + }, { + "eventAction" : "last changed", + "eventDate" : "2019-09-30T13:41:16Z" + } ], + "rdapConformance" : [ "cidr0", "rdap_level_0", "nro_rdap_profile_0", "redacted" ], + "notices" : [ { + "title" : "Filtered", + "description" : [ "This output has been filtered." ] + }, { + "title" : "Whois Inaccuracy Reporting", + "description" : [ "If you see inaccuracies in the results, please visit:" ], + "links" : [ { + "value" : "https://rdap.db.ripe.net/entity/SD12478-RIPE", + "rel" : "inaccuracy-report", + "href" : "https://www.ripe.net/contact-form?topic=ripe_dbm&show_form=true", + "type" : "text/html" + } ] + }, { + "title" : "Source", + "description" : [ "Objects returned came from source", "RIPE" ] + }, { + "title" : "Terms and Conditions", + "description" : [ "This is the RIPE Database query service. The objects are in RDAP format." ], + "links" : [ { + "value" : "https://rdap.db.ripe.net/entity/SD12478-RIPE", + "rel" : "terms-of-service", + "href" : "http://www.ripe.net/db/support/db-terms-conditions.pdf", + "type" : "application/pdf" + } ] + } ], + "port43" : "whois.ripe.net", + "objectClassName" : "entity" +} \ No newline at end of file diff --git a/tests/data/rdap/entity/WA2477-RIPE.input b/tests/data/rdap/entity/WA2477-RIPE.input new file mode 100644 index 0000000..b674a26 --- /dev/null +++ b/tests/data/rdap/entity/WA2477-RIPE.input @@ -0,0 +1,77 @@ +{ + "handle" : "WA2477-RIPE", + "vcardArray" : [ "vcard", [ [ "version", { }, "text", "4.0" ], [ "fn", { }, "text", "WEBROCKET SUPPORT TEAM" ], [ "kind", { }, "text", "group" ], [ "adr", { + "label" : "st. Movsesa Horenaci 14/20, Vagharshapat, Armavir, Armenia, 1101" + }, "text", [ "", "", "", "", "", "", "" ] ], [ "email", { + "type" : "abuse" + }, "text", "abuse@webrocket.am" ] ] ], + "entities" : [ { + "handle" : "WEBROCKET-MNT", + "vcardArray" : [ "vcard", [ [ "version", { }, "text", "4.0" ], [ "fn", { }, "text", "WEBROCKET-MNT" ], [ "kind", { }, "text", "individual" ] ] ], + "roles" : [ "registrant" ], + "links" : [ { + "value" : "https://rdap.db.ripe.net/entity/WA2477-RIPE", + "rel" : "self", + "href" : "https://rdap.db.ripe.net/entity/WEBROCKET-MNT" + }, { + "value" : "http://www.ripe.net/data-tools/support/documentation/terms", + "rel" : "copyright", + "href" : "http://www.ripe.net/data-tools/support/documentation/terms" + } ], + "objectClassName" : "entity" + } ], + "links" : [ { + "value" : "https://rdap.db.ripe.net/entity/WA2477-RIPE", + "rel" : "self", + "href" : "https://rdap.db.ripe.net/entity/WA2477-RIPE" + }, { + "value" : "http://www.ripe.net/data-tools/support/documentation/terms", + "rel" : "copyright", + "href" : "http://www.ripe.net/data-tools/support/documentation/terms" + } ], + "events" : [ { + "eventAction" : "registration", + "eventDate" : "2023-07-01T14:23:57Z" + }, { + "eventAction" : "last changed", + "eventDate" : "2023-07-01T14:33:34Z" + } ], + "rdapConformance" : [ "cidr0", "rdap_level_0", "nro_rdap_profile_0", "redacted" ], + "notices" : [ { + "title" : "Filtered", + "description" : [ "This output has been filtered." ] + }, { + "title" : "Whois Inaccuracy Reporting", + "description" : [ "If you see inaccuracies in the results, please visit:" ], + "links" : [ { + "value" : "https://rdap.db.ripe.net/entity/WA2477-RIPE", + "rel" : "inaccuracy-report", + "href" : "https://www.ripe.net/contact-form?topic=ripe_dbm&show_form=true", + "type" : "text/html" + } ] + }, { + "title" : "Source", + "description" : [ "Objects returned came from source", "RIPE" ] + }, { + "title" : "Terms and Conditions", + "description" : [ "This is the RIPE Database query service. The objects are in RDAP format." ], + "links" : [ { + "value" : "https://rdap.db.ripe.net/entity/WA2477-RIPE", + "rel" : "terms-of-service", + "href" : "http://www.ripe.net/db/support/db-terms-conditions.pdf", + "type" : "application/pdf" + } ] + } ], + "port43" : "whois.ripe.net", + "objectClassName" : "entity", + "redacted" : [ { + "name" : { + "description" : "Personal e-mail information" + }, + "reason" : { + "description" : "Personal data" + }, + "prePath" : "$.vcardArray[1][?(@[0]=='e-mail')]", + "method" : "removal" + } ] +} \ No newline at end of file diff --git a/tests/data/rdap/rdap/entity/PP17-AFRINIC.input b/tests/data/rdap/rdap/entity/PP17-AFRINIC.input new file mode 100644 index 0000000..97a53a3 --- /dev/null +++ b/tests/data/rdap/rdap/entity/PP17-AFRINIC.input @@ -0,0 +1 @@ +{"rdapConformance":["rdap_level_0","nro_rdap_profile_0"],"notices":[{"title":"ABOUT","description":["This is the AfriNIC RDAP server."],"links":[{"value":"https://rdap.afrinic.net/rdap/entity/PP17-AFRINIC","rel":"describedby","href":"https://www.afrinic.net/support/whois-db/reference-manual","hreflang":["en"],"type":"text/html","title":"AFRINIC Database Reference Manual","media":"screen"}]},{"title":"Terms and Conditions","description":["This is the AFRINIC Database query service. The objects are in RDAP format."],"links":[{"value":"https://rdap.afrinic.net/rdap/entity/PP17-AFRINIC","rel":"terms-of-service","href":"https://afrinic.net/whois/terms","type":"text/html"}]},{"title":"Whois Inaccuracy Reporting","description":["If you see inaccuracies in the results, please visit: "],"links":[{"value":"https://rdap.afrinic.net/rdap/entity/PP17-AFRINIC","rel":"inaccuracy-report","href":"https://www.afrinic.net/support/whois-db/reference-manual","type":"text/html","title":"AFRINIC WHOIS Inaccuracy Report"}]},{"title":"jCard sunset end","description":["2023-12-31T23:59:59Z"],"links":[{"value":"https://rdap.afrinic.net/rdap/entity/PP17-AFRINIC","rel":"related","href":"https://www.ietf.org/id/draft-ietf-regext-rdap-jscontact-12.html","type":"text/html","title":"jCard deprecation and replacement with JSContact Card"},{"value":"https://rdap.afrinic.net/rdap/entity/PP17-AFRINIC","rel":"alternate","href":"https://rdap.afrinic.net/rdap/entity/PP17-AFRINIC?jscard=1","type":"application/rdap+json","title":"JSContact Card version"}]},{"title":"jCard deprecation end","description":["2022-12-31T23:59:59Z"],"links":[{"value":"https://rdap.afrinic.net/rdap/entity/PP17-AFRINIC","rel":"related","href":"https://www.ietf.org/id/draft-ietf-regext-rdap-jscontact-12.html","type":"text/html","title":"jCard deprecation and replacement with JSContact Card"},{"value":"https://rdap.afrinic.net/rdap/entity/PP17-AFRINIC","rel":"alternate","href":"https://rdap.afrinic.net/rdap/entity/PP17-AFRINIC?jscard=1","type":"application/rdap+json","title":"JSContact Card version"}]}],"lang":"en","links":[{"value":"https://rdap.afrinic.net/rdap/entity/PP17-AFRINIC","rel":"self","href":"https://rdap.afrinic.net/rdap/entity/PP17-AFRINIC"}],"handle":"PP17-AFRINIC","status":["active"],"port43":"whois.afrinic.net","vcardArray":["vcard",[["version",{},"text","4.0"],["kind",{},"text","individual"],["fn",{},"text","Peter Peele"],["tel",{"type":"work"},"text","tel:+27-82-064-3322"],["email",{},"text","peterp@workonline.africa"],["adr",{"label":"114 West Street\nSandton\nSouth Africa\nPostal Code 2066"},"text",["114 West Street","Sandton","South Africa","Postal Code 2066","","",""]]]],"objectClassName":"entity"} \ No newline at end of file diff --git a/tests/data/rdap/rdap/entity/WOL-AFRINIC.input b/tests/data/rdap/rdap/entity/WOL-AFRINIC.input new file mode 100644 index 0000000..16b4940 --- /dev/null +++ b/tests/data/rdap/rdap/entity/WOL-AFRINIC.input @@ -0,0 +1 @@ +{"rdapConformance":["rdap_level_0","nro_rdap_profile_0"],"notices":[{"title":"ABOUT","description":["This is the AfriNIC RDAP server."],"links":[{"value":"https://rdap.afrinic.net/rdap/entity/WOL-AFRINIC","rel":"describedby","href":"https://www.afrinic.net/support/whois-db/reference-manual","hreflang":["en"],"type":"text/html","title":"AFRINIC Database Reference Manual","media":"screen"}]},{"title":"Terms and Conditions","description":["This is the AFRINIC Database query service. The objects are in RDAP format."],"links":[{"value":"https://rdap.afrinic.net/rdap/entity/WOL-AFRINIC","rel":"terms-of-service","href":"https://afrinic.net/whois/terms","type":"text/html"}]},{"title":"Whois Inaccuracy Reporting","description":["If you see inaccuracies in the results, please visit: "],"links":[{"value":"https://rdap.afrinic.net/rdap/entity/WOL-AFRINIC","rel":"inaccuracy-report","href":"https://www.afrinic.net/support/whois-db/reference-manual","type":"text/html","title":"AFRINIC WHOIS Inaccuracy Report"}]},{"title":"jCard sunset end","description":["2023-12-31T23:59:59Z"],"links":[{"value":"https://rdap.afrinic.net/rdap/entity/WOL-AFRINIC","rel":"related","href":"https://www.ietf.org/id/draft-ietf-regext-rdap-jscontact-12.html","type":"text/html","title":"jCard deprecation and replacement with JSContact Card"},{"value":"https://rdap.afrinic.net/rdap/entity/WOL-AFRINIC","rel":"alternate","href":"https://rdap.afrinic.net/rdap/entity/WOL-AFRINIC?jscard=1","type":"application/rdap+json","title":"JSContact Card version"}]},{"title":"jCard deprecation end","description":["2022-12-31T23:59:59Z"],"links":[{"value":"https://rdap.afrinic.net/rdap/entity/WOL-AFRINIC","rel":"related","href":"https://www.ietf.org/id/draft-ietf-regext-rdap-jscontact-12.html","type":"text/html","title":"jCard deprecation and replacement with JSContact Card"},{"value":"https://rdap.afrinic.net/rdap/entity/WOL-AFRINIC","rel":"alternate","href":"https://rdap.afrinic.net/rdap/entity/WOL-AFRINIC?jscard=1","type":"application/rdap+json","title":"JSContact Card version"}]}],"lang":"en","links":[{"value":"https://rdap.afrinic.net/rdap/entity/WOL-AFRINIC","rel":"self","href":"https://rdap.afrinic.net/rdap/entity/WOL-AFRINIC"}],"handle":"WOL-AFRINIC","status":["active"],"port43":"whois.afrinic.net","vcardArray":["vcard",[["version",{},"text","4.0"],["kind",{},"text","group"],["fn",{},"text","Workonline NOC"],["tel",{"type":"work"},"text","tel:+27-21-200-9009"],["email",{},"text","noc@workonline.africa"],["adr",{"label":"114 West St\nJohannesburg 2196\nSouth Africa"},"text",["114 West St","Johannesburg 2196","South Africa","","","",""]]]],"entities":[{"lang":"en","remarks":[{"title":"Remark","description":["Ben Maddison"]}],"links":[{"value":"https://rdap.afrinic.net/rdap/entity/BM15-AFRINIC","rel":"self","href":"https://rdap.afrinic.net/rdap/entity/BM15-AFRINIC"}],"handle":"BM15-AFRINIC","status":["active"],"port43":"whois.afrinic.net","vcardArray":["vcard",[["version",{},"text","4.0"],["kind",{},"text","individual"],["fn",{},"text","Ben Maddison"],["tel",{"type":"work"},"text","tel:+27-21-200-9000"],["email",{},"text","benm@workonline.africa"],["adr",{"label":"114 West St\nJohannesburg 2916\nSouth Africa"},"text",["114 West St","Johannesburg 2916","South Africa","","","",""]]]],"roles":["administrative","technical"],"objectClassName":"entity"},{"lang":"en","links":[{"value":"https://rdap.afrinic.net/rdap/entity/ORG-WCL1-AFRINIC","rel":"self","href":"https://rdap.afrinic.net/rdap/entity/ORG-WCL1-AFRINIC"}],"handle":"ORG-WCL1-AFRINIC","status":["active"],"port43":"whois.afrinic.net","vcardArray":["vcard",[["version",{},"text","4.0"],["kind",{},"text","org"],["fn",{},"text","Workonline Communications(Pty) Ltd"],["tel",{"type":"work"},"text","tel:+27-21-200-9000"],["tel",{"type":"work"},"text","tel:+27-21-200-9009"],["email",{},"text","noc@workonline.africa"],["email",{},"text","abuse@workonline.africa"],["email",{},"text","communications@workonline.africa"],["adr",{"label":"114 West St\nJohannesburg 2196"},"text",["114 West St","Johannesburg 2196","","","","",""]]]],"roles":["organisation"],"objectClassName":"entity"}],"objectClassName":"entity"} \ No newline at end of file