idnits 2.17.1 draft-newton-rdap-jcr-06.txt: Checking boilerplate required by RFC 5378 and the IETF Trust (see https://trustee.ietf.org/license-info): ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/1id-guidelines.txt: ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/checklist : ---------------------------------------------------------------------------- ** The document seems to lack a Security Considerations section. ** The document seems to lack an IANA Considerations section. (See Section 2.2 of https://www.ietf.org/id-info/checklist for how to handle the case when there are no actions for IANA.) Miscellaneous warnings: ---------------------------------------------------------------------------- == The copyright year in the IETF Trust and authors Copyright Line does not match the current year -- The document date (January 22, 2018) is 2286 days in the past. Is this intentional? -- Found something which looks like a code comment -- if you have code sections in the document, please surround them with '' and '' lines. Checking references for intended status: Informational ---------------------------------------------------------------------------- ** Obsolete normative reference: RFC 5988 (Obsoleted by RFC 8288) ** Obsolete normative reference: RFC 7159 (Obsoleted by RFC 8259) ** Obsolete normative reference: RFC 7483 (Obsoleted by RFC 9083) Summary: 5 errors (**), 0 flaws (~~), 1 warning (==), 2 comments (--). Run idnits with the --verbose option for more detailed information about the items above. -------------------------------------------------------------------------------- 2 Network Working Group A. Newton 3 Internet-Draft ARIN 4 Intended status: Informational January 22, 2018 5 Expires: July 26, 2018 7 A Description of RDAP JSON Messages Using JSON Content Rules 8 draft-newton-rdap-jcr-06 10 Abstract 12 This document describes the JSON responses in the Registration Data 13 Access Protocol with the formal notation of JSON Content Rules. 15 Status of This Memo 17 This Internet-Draft is submitted in full conformance with the 18 provisions of BCP 78 and BCP 79. 20 Internet-Drafts are working documents of the Internet Engineering 21 Task Force (IETF). Note that other groups may also distribute 22 working documents as Internet-Drafts. The list of current Internet- 23 Drafts is at https://datatracker.ietf.org/drafts/current/. 25 Internet-Drafts are draft documents valid for a maximum of six months 26 and may be updated, replaced, or obsoleted by other documents at any 27 time. It is inappropriate to use Internet-Drafts as reference 28 material or to cite them other than as "work in progress." 30 This Internet-Draft will expire on July 26, 2018. 32 Copyright Notice 34 Copyright (c) 2018 IETF Trust and the persons identified as the 35 document authors. All rights reserved. 37 This document is subject to BCP 78 and the IETF Trust's Legal 38 Provisions Relating to IETF Documents 39 (https://trustee.ietf.org/license-info) in effect on the date of 40 publication of this document. Please review these documents 41 carefully, as they describe your rights and restrictions with respect 42 to this document. Code Components extracted from this document must 43 include Simplified BSD License text as described in Section 4.e of 44 the Trust Legal Provisions and are provided without warranty as 45 described in the Simplified BSD License. 47 Table of Contents 49 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 50 2. Response . . . . . . . . . . . . . . . . . . . . . . . . . . 3 51 3. Object Classes . . . . . . . . . . . . . . . . . . . . . . . 4 52 3.1. Entity Object Class . . . . . . . . . . . . . . . . . . . 4 53 3.2. Nameserver Object Class . . . . . . . . . . . . . . . . . 15 54 3.3. Domain Object Class . . . . . . . . . . . . . . . . . . . 15 55 3.4. IP Network Object Class . . . . . . . . . . . . . . . . . 16 56 3.5. Autnum Object Class . . . . . . . . . . . . . . . . . . . 17 57 4. Search Results . . . . . . . . . . . . . . . . . . . . . . . 17 58 5. Error Response . . . . . . . . . . . . . . . . . . . . . . . 18 59 6. Common Structures . . . . . . . . . . . . . . . . . . . . . . 18 60 6.1. RDAP Conformance . . . . . . . . . . . . . . . . . . . . 19 61 6.2. Links . . . . . . . . . . . . . . . . . . . . . . . . . . 19 62 6.3. Notices And Remarks . . . . . . . . . . . . . . . . . . . 19 63 6.4. Language Identifier . . . . . . . . . . . . . . . . . . . 20 64 6.5. Events . . . . . . . . . . . . . . . . . . . . . . . . . 20 65 6.6. Status . . . . . . . . . . . . . . . . . . . . . . . . . 21 66 6.7. Port 43 . . . . . . . . . . . . . . . . . . . . . . . . . 21 67 6.8. Public IDs . . . . . . . . . . . . . . . . . . . . . . . 22 68 7. Validating Responses . . . . . . . . . . . . . . . . . . . . 22 69 8. Stricter Validation . . . . . . . . . . . . . . . . . . . . . 22 70 9. Complete Rulesets for RDAP . . . . . . . . . . . . . . . . . 30 71 10. Normative References . . . . . . . . . . . . . . . . . . . . 50 72 Appendix A. Acknowledgements . . . . . . . . . . . . . . . . . . 51 73 Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 51 75 1. Introduction 77 The JSON [RFC7159] responses of the Registration Data Access Protocol 78 [RFC7483] are officially defined with English prose. Those 79 definitions contain imprecise or ambiguous JSON structures and 80 require lengthy, tedious examples in the attempt to offer 81 clarification. The English prose can be difficult for non-native 82 English readers, and the examples create their own confusion. 84 This document describes the JSON found in RDAP with JSON Content 85 Rules [I-D.newton-json-content-rules] (JCR). 87 JCR overcomes some of the obstacles of describing JSON with English 88 prose, reducing the tediousness of the prose and accompanying lengthy 89 examples to understandable data structures. Additionally, JCR has 90 mechanisms which can be used by software developers to create test 91 harnesses and technology compatibility kits. 93 Though this document describes all of the JSON found in [RFC7483], it 94 presents the structures in a different order. The rules defined here 95 use the JCR mixin style of specification, where common structures are 96 defined in group rules instead of separately, distinct objects. 98 2. Response 100 [RFC7483] describes ten distinct JSON response: five entity class 101 response, an error response, a help response, and three search 102 responses. 104 @{root} $entity_response = { 105 $response_mixin, 106 $entity_mixin 107 } 109 @{root} $nameserver_response = { 110 $response_mixin, 111 $nameserver_mixin 112 } 114 @{root} $domain_response = { 115 $response_mixin, 116 $domain_mixin 117 } 119 @{root} $network_response = { 120 $response_mixin, 121 $network_mixin 122 } 124 @{root} $autnum_response = { 125 $response_mixin, 126 $autnum_mixin 127 } 129 @{root} $error_response = { 130 $response_mixin, 131 $error_mixin 132 } 134 @{root} $help_response = { 135 $response_mixin, 136 $lang ? 137 } 139 @{root} $domainSearch_response = { 140 $response_mixin, 141 $lang ?, 142 $domainSearchResult 144 } 146 @{root} $nameserverSearch_response = { 147 $response_mixin, 148 $lang ?, 149 $nameserverSearchResult 150 } 152 @{root} $entitySearch_response = { 153 $response_mixin, 154 $lang ?, 155 $entitySearchResult 156 } 158 Figure 1 160 All of the responses have a common set of object members described by 161 response_mixin. 163 $response_mixin = ( 164 $rdapConformance ?, 165 "notices" : $notices ? 166 ) 168 Figure 2 170 3. Object Classes 172 The primary data structures in RDAP are called object classes. These 173 are first order object instances with identifiers. They are JSON 174 objects which contain other JSON data types. 176 3.1. Entity Object Class 178 The Entity object class represents persons or organizations. 180 $entities = "entities" : [ $entity_oc * ] 182 $entity_oc = { 183 $entity_mixin 184 } 186 $entity_mixin = ( 187 "objectClassName" : "entity", 188 $common_mixin, 189 "vcardArray" : [ "vcard", $vcard * ] ?, 190 "asEventActor" : [ $noActorEvent * ] ?, 191 $roles ?, 192 $publicIds ?, 193 $entities ?, 194 "networks" : [ $network_oc * ] ?, 195 "autnums" : [ $autnum_oc * ] ? 196 ) 198 $roles = "roles" : [ string * ] 200 Figure 3 202 The Entity object class incorporates jCard [RFC7095] (vCard in JSON) 203 for contact information. 205 Each jCard is made up of vCard properties in an array. The very 206 first property must be "version", and the "fn" property must appear 207 once and only once. 209 $vcard = [ 210 [ "version", {}, "text", "4.0" ], 211 $vcard_not_fn_properties * , 212 [ "fn", { $vcard_type_param?, $vcard_language_param? , 213 $vcard_altid_param? , $vcard_pid_param? , 214 $vcard_pref_param?, $vcard_any_param? }, 215 "text", string ], 216 $vcard_not_fn_properties * 217 ] 219 $vcard_not_fn_properties = 220 ( 221 $vcard_source | 222 $vcard_kind | 223 $vcard_n | 224 $vcard_nicname | 225 $vcard_photo | 226 $vcard_bday | 227 $vcard_anniversary | 228 $vcard_gender | 229 $vcard_adr | 230 $vcard_tel | 231 $vcard_email | 232 $vcard_impp | 233 $vcard_lang | 234 $vcard_tz | 235 $vcard_geo | 236 $vcard_title | 237 $vcard_role | 238 $vcard_logo | 239 $vcard_org | 240 $vcard_member | 241 $vcard_related | 242 $vcard_categories | 243 $vcard_note | 244 $vcard_prodid | 245 $vcard_rev | 246 $vcard_sound | 247 $vcard_uid | 248 $vcard_clientpidmap | 249 $vcard_url | 250 $vcard_key | 251 $vcard_fburl | 252 $vcard_caladruri | 253 $vcard_caluri | 254 $vcard_x10 255 ) 256 Figure 4 258 Each vCard property is composed of a property name, a set of 259 parameters, and data values. 261 $vcard_source = [ "source", $vcard_source_prop ] 262 $vcard_source_prop = ( 263 { $vcard_pid_param? , $vcard_pref_param?, $vcard_altid_param? , 264 $vcard_mediatype_param?, $vcard_any_param? } , 265 "uri", uri 266 ) 268 $vcard_kind = [ "kind", $vcard_kind_prop ] 269 $vcard_kind_prop = ( 270 { $vcard_any_param? }, 271 "text", $vcard_kind_type 272 ) 274 $vcard_n = [ "n", $vcard_n_prop ] 275 $vcard_n_prop = ( 276 { $vcard_sort_as_param? , $vcard_language_param? , 277 $vcard_altid_param? , $vcard_any_param? }, 278 "text", $vcard_string_type_array 279 ) 281 $vcard_nicname = [ "nicname", $vcard_nicname_prop ] 282 $vcard_nicname_prop = ( 283 { $vcard_type_param? , $vcard_language_param? , 284 $vcard_altid_param? , $vcard_pid_param? , 285 $vcard_pref_param? , $vcard_any_param ? }, 286 "text", $vcard_string_type_array 287 ) 289 $vcard_photo = [ "photo", $vcard_photo_prop ] 290 $vcard_photo_prop = ( 291 { $vcard_altid_param? , $vcard_type_param? , 292 $vcard_mediatype_param? , $vcard_pref_param? , 293 $vcard_pid_param? , $vcard_any_param? }, 294 "uri", uri 295 ) 297 $vcard_bday = [ "bday", $vcard_bday_prop ] 298 $vcard_bday_prop = ( 299 ( { $vcard_language_param?, $vcard_altid_param?, 300 $vcard_calscale_param?, $vcard_any_param? }, 301 "text", string 302 ) | 303 ( { $vcard_altid_param?, $vcard_calscale_param?, 304 $vcard_any_param? }, 305 "date-and-or-time", $vcard_date_and_or_time_type 306 ) 307 ) 309 $vcard_anniversary = [ "anniversary", $vcard_anniversary_prop ] 310 $vcard_anniversary_prop = ( 311 { $vcard_altid_param?, $vcard_calscale_param?, $vcard_any_param? }, 312 "date-and-or-time", $vcard_date_and_or_time_type 313 ) 315 $vcard_gender = [ "gender", $vcard_gender_prop ] 316 $vcard_gender_prop = ( 317 { $vcard_any_param? }, 318 "text", 319 ( $vcard_gender_type | [ $vcard_gender_type, string + ] ) 320 ) 322 $vcard_adr = [ "adr", $vcard_adr_prop ] 323 $vcard_adr_prop = ( 324 { $vcard_label_param? , $vcard_language_param? , 325 $vcard_geo_param ? , $vcard_tz_param? , 326 $vcard_altid_param? , $vcard_pid_param? , 327 $vcard_pref_param? , $vcard_type_param? , 328 $vcard_any_param? }, 329 "text", $vcard_string_type_array 330 ) 332 $vcard_tel = [ "tel", $vcard_tel_prop ] 333 $vcard_tel_prop = ( 334 ( { $vcard_type_param? , $vcard_pid_param? , $vcard_pref_param? , 335 $vcard_altid_param?, $vcard_any_param? }, "text", string 336 ) | 337 ( { $vcard_type_param? , $vcard_pid_param? , $vcard_pref_param? , 338 $vcard_altid_param?, $vcard_mediatype_param?, 339 $vcard_any_param? }, 340 "uri", uri..tel 341 ) 342 ) 344 $vcard_email = [ "email", $vcard_email_prop ] 345 $vcard_email_prop = ( 346 { $vcard_pid_param? , $vcard_pref_param? , $vcard_type_param? , 347 $vcard_altid_param? , $vcard_any_param ? }, 348 "text", string 349 ) 351 $vcard_impp = [ "impp", $vcard_impp_prop ] 352 $vcard_impp_prop = ( 353 { $vcard_pid_param? , $vcard_pref_param? , $vcard_type_param? , 354 $vcard_mediatype_param? , $vcard_altid_param? , 355 $vcard_any_param }, 356 "uri", uri..impp 357 ) 359 $vcard_lang = [ "lang", $vcard_lang_prop ] 360 $vcard_lang_prop = ( 361 { $vcard_pid_param? , $vcard_pref_param? , $vcard_altid_param? , 362 $vcard_type_param? , $vcard_any_param? }, 363 "language-tag", $vcard_language_tag_type 364 ) 366 $vcard_tz = [ "tz", $vcard_tz_prop ] 367 $vcard_tz_prop = ( 368 { $vcard_altid_param?, $vcard_pid_param? , $vcard_pref_param? , 369 $vcard_type_param? , $vcard_mediatype_param?, 370 $vcard_any_param? }, 371 ( ( "text", string ) | 372 ( "uri" , uri ) | 373 ( "utc-offset" , $vcard_utc_offset_type ) ) 374 ) 376 $vcard_geo = [ "geo", $vcard_geo_prop ] 377 $vcard_geo_prop = ( 378 { $vcard_pid_param? , $vcard_pref_param? , $vcard_type_param? , 379 $vcard_mediatype_param? , $vcard_altid_param? , 380 $vcard_any_param? }, 381 "uri", uri..geo 382 ) 384 $vcard_title = [ "title", $vcard_title_prop ] 385 $vcard_title_prop = ( 386 { $vcard_language_param? , $vcard_pid_param? , $vcard_pref_param? , 387 $vcard_altid_param? , $vcard_type_param? , $vcard_any_param? }, 388 "text", string 389 ) 391 $vcard_role = [ "role", $vcard_role_prop ] 392 $vcard_role_prop = ( 393 { $vcard_language_param? , $vcard_pid_param? , $vcard_pref_param? , 394 $vcard_altid_param? , $vcard_type_param? , $vcard_any_param? }, 395 "text", string 396 ) 398 $vcard_logo = [ "logo", $vcard_logo_prop ] 399 $vcard_logo_prop = ( 400 { $vcard_altid_param? , $vcard_type_param? , 401 $vcard_mediatype_param? , $vcard_pref_param? , 402 $vcard_pid_param? , $vcard_language_param? , 403 $vcard_any_param? }, 404 "uri", uri 405 ) 407 $vcard_org = [ "org", $vcard_org_prop ] 408 $vcard_org_prop = ( 409 { $vcard_sort_as_param? , $vcard_language_param? , 410 $vcard_pid_param? , $vcard_pref_param? , $vcard_altid_param? , 411 $vcard_type_param? , $vcard_any_param? }, 412 "text", $vcard_string_type_array 413 ) 415 $vcard_member = [ "member", $vcard_member_prop ] 416 $vcard_member_prop = ( 417 { $vcard_altid_param? , $vcard_mediatype_param? , 418 $vcard_pref_param? , $vcard_pid_param? , $vcard_any_param? }, 419 "uri", uri 420 ) 422 $vcard_related = [ "related", $vcard_related_prop ] 423 $vcard_related_prop = ( 424 ( { $vcard_mediatype_param? , $vcard_pref_param? , 425 $vcard_altid_param? , $vcard_type_param? , 426 $vcard_any_param? }, 427 "uri", uri 428 ) | 429 ( { $vcard_language_param? , $vcard_pref_param? , 430 $vcard_altid_param? , $vcard_type_param? , 431 $vcard_any_param? }, 432 "text", $vcard_related_type_array 433 ) 434 ) 436 $vcard_categories = [ "categories", $vcard_categories_prop ] 437 $vcard_categories_prop = ( 438 { $vcard_pid_param? , $vcard_pref_param? , $vcard_type_param ?, 439 $vcard_altid_param? , $vcard_any_param? }, 440 "text", $vcard_string_type_array 441 ) 443 $vcard_note = [ "note", $vcard_note_prop ] 444 $vcard_note_prop = ( 445 { $vcard_language_param? , $vcard_pid_param? , 446 $vcard_pref_param? , $vcard_type_param? , 447 $vcard_altid_param? , $vcard_any_param ? }, 449 "text", string 450 ) 452 $vcard_prodid = [ "prodid", $vcard_prodid_prop ] 453 $vcard_prodid_prop = ( { $vcard_any_param ? }, "text", string ) 455 $vcard_rev = [ "rev", $vcard_rev_prop ] 456 $vcard_rev_prop = ( 457 { $vcard_any_param ? }, "timestamp", datetime 458 ) 460 $vcard_sound = [ "sound", $vcard_sound_prop ] 461 $vcard_sound_prop = ( 462 { $vcard_altid_param? , $vcard_mediatype_param? , 463 $vcard_language_param? , $vcard_pref_param? , 464 $vcard_pid_param? , $vcard_any_param? }, 465 "uri", uri 466 ) 468 $vcard_uid = [ "uid", $vcard_uid_prop ] 469 $vcard_uid_prop = ( 470 ( { $vcard_any_param? }, "uri", uri ) | 471 ( { $vcard_any_param? }, "text", string ) 472 ) 474 $vcard_clientpidmap = [ "clientpidmap", $vcard_clientpidmap_prop ] 475 $vcard_clientpidmap_prop = ( {}, "text", [ /^[0-9]+$/, uri ] ) 477 $vcard_url = [ "url", $vcard_url_prop ] 478 $vcard_url_prop = ( 479 { $vcard_altid_param? , $vcard_mediatype_param? , 480 $vcard_pref_param? , $vcard_pid_param? , $vcard_any_param? }, 481 "uri", uri 482 ) 484 $vcard_key = [ "key", $vcard_key_prop ] 485 $vcard_key_prop = ( 486 ( { $vcard_mediatype_param? , $vcard_pref_param? , 487 $vcard_altid_param? , $vcard_type_param? , 488 $vcard_any_param? }, 489 "uri", uri 490 ) | 491 ( { $vcard_pref_param? , $vcard_altid_param? , 492 $vcard_type_param? , $vcard_any_param? }, 493 "text", string 494 ) 495 ) 496 $vcard_fburl = [ "fburl", $vcard_fburl_prop ] 497 $vcard_fburl_prop = ( 498 { $vcard_altid_param? , $vcard_mediatype_param? , 499 $vcard_altid_param? , $vcard_pref_param? , 500 $vcard_pid_param? , $vcard_any_param? }, 501 "uri", uri 502 ) 504 $vcard_caladruri = [ "caladruri", $vcard_caladruri_prop ] 505 $vcard_caladruri_prop = ( 506 { $vcard_altid_param? , $vcard_mediatype_param? , 507 $vcard_altid_param? , $vcard_pref_param? , 508 $vcard_pid_param? , $vcard_any_param? }, 509 "uri", uri 510 ) 512 $vcard_caluri = [ "caluri", $vcard_caluri_prop ] 513 $vcard_caluri_prop = ( 514 { $vcard_altid_param? , $vcard_mediatype_param? , 515 $vcard_altid_param? , $vcard_pref_param? , 516 $vcard_pid_param? , $vcard_any_param? }, 517 "uri", uri 518 ) 520 $vcard_x10 = [ $vcard_x_name_type, $vcard_x10_prop ] 521 $vcard_x10_prop = ( 522 { $vcard_language_param? , $vcard_pref_param? , 523 $vcard_altid_param? , $vcard_pid_param? , 524 $vcard_type_param? , $vcard_mediatype_param? , 525 $vcard_calscale_param? , $vcard_sort_as_param? , 526 $vcard_geo_param? , $vcard_tz_param? , 527 $vcard_label_param? , $vcard_any_param? }, 528 $vcard_x_name_type, $vcard_string_type_array 529 ) 531 Figure 5 533 vCard parameters are grouped into a JSON object, where each member of 534 the object is a parameter. 536 $vcard_language_param = "language" : $vcard_language_tag_type 537 $vcard_pref_param = "pref" : $vcard_pref_type 538 $vcard_altid_param = "altid" : string 539 $vcard_pid_param = "pid" : $vcard_pid_type_array 540 $vcard_type_param = "type" : $vcard_type_type_array 541 $vcard_mediatype_param = "mediatype" : $vcard_mediatype_type 542 $vcard_calscale_param = "calscale" : $vcard_calscale_type 543 $vcard_sort_as_param = "sort-as" : $vcard_string_type_array 544 $vcard_geo_param = "geo" : uri..geo 545 $vcard_tz_param = "tz" : $vcard_utc_offset_type 546 $vcard_label_param = "label" : $vcard_string_type_array 547 $vcard_any_param = /^x\-[A-Za-z0-9\-]*$/ : $vcard_string_type_array 549 Figure 6 551 vCard values are determined by a string denoting the value type, 552 followed by the value or an array of those values. 554 $vcard_string_type_array = 555 ( string | [ ( string | [ string * ] ) * ] ) 556 $vcard_language_tag_type =: 557 /[a-z]{2}(-[A-Z][a-zA-Z]*(\-[A-Z]{2})?)?/ 558 $vcard_mediatype_type =: /^\w+\/[\-.\w]+(?:\+[\-.\w]+)?$/ 559 $vcard_utc_offset_type =: /^(([\-\+]\d{1,2}):?(\d{2})?)?$/ 560 $vcard_date_or_time =: ( 561 /^(\d{4})-?(\d{2})-?(\d{2})$/ | 562 /^(\d{4})$/ | 563 /^--(\d{2})-?(\d{2})$/ | 564 /^--(\d{2})$/ | 565 /^---(\d{2})$/ | 566 /^(\d{2})(([-+]\d{1,2}):?(\d{2})?)?$/ | 567 /^(\d{2}):?(\d{2})(([\-\+]\d{1,2}):?(\d{2})?)?$/ | 568 /^(\d{2}):?(\d{2}):?(\d{2})(Z|([\-\+]\d{1,2}):?(\d{2})?)?$/ | 569 /^-(\d{2}):?(\d{2})(Z|([\-\+]\d{1,2}):?(\d{2})?)?$/ | 570 /^-(\d{2})(([\-\+]\d{1,2}):?(\d{2})?)?$/ | 571 /^--(\d{2})(([\-\+]\d{1,2}):?(\d{2})?)?$/ 572 ) 573 $vcard_date_and_or_time_type =: ( 574 datetime | $vcard_date_or_time 575 ) 576 $vcard_group_type =: /^[a-zA-Z0-9\-]+$/ 577 $vcard_type_type =: ( 578 "home" | "work" | $vcard_tel_type | $vcard_related_type | 579 $vcard_x_name_type 581 ) 582 $vcard_type_type_array = ( 583 $vcard_type_type | [ $vcard_type_type * ] 584 ) 585 $vcard_tel_type =: ( 586 "text" | "voice" | "fax" | "cell" | "video" | 587 "pager" | "textphone" | "main-number" 588 ) 589 $vcard_tel_type_array = ( $vcard_tel_type | [ $vcard_tel_type * ] ) 590 $vcard_related_type =: ( 591 "contact" | "acquaintance" | "friend" | "met" | 592 "co-worker" | "colleague" | "co-resident" | 593 "neighbor" | "child" | "parent" | "sibling" | 594 "spouse" | "kin" | "muse" | "crush" | "date" | 595 "sweetheart" | "me" | "agent" | "emergency" 596 ) 597 $vcard_related_type_array = ( 598 $vcard_related_type | [ $vcard_related_type * ] 599 ) 600 $vcard_index_type =: /^[1-9]?[0-9]*$/ 601 $vcard_expertise_level_type =: ( 602 "beginner" | "average" | "expert" 603 ) 604 $vcard_hobby_type =: ( "high" | "medium" | "low" ) 605 $vcard_pref_type =: /^[1-9]?[0-9]{1}$|^100$/ 606 $vcard_pid_type =: /^[0-9]+(\.[0-9]+)?$/ 607 $vcard_pid_type_array = ( 608 $vcard_pid_type | [ $vcard_pid_type * ] 609 ) 610 $vcard_gender_type =: ( "M" | "F" | "O" | "N" | "U" ) 611 $vcard_gender_type_array = ( 612 $vcard_gender_type | [ $vcard_gender_type * ] 613 ) 614 $vcard_kind_type =: ( 615 "individual" | "group" | "org" | "location" | 616 "application" | "device" 617 ) 618 $vcard_iana_token_type =: /^[A-Za-z0-9\-]*$/ 619 $vcard_x_name_type =: /^x\-[A-Za-z0-9\-]*$/ 620 $vcard_calscale_type =: ( 621 "gregorian" | $vcard_iana_token_type | $vcard_x_name_type 622 ) 624 Figure 7 626 3.2. Nameserver Object Class 628 The nameserver object class represents DNS nameservers in registries. 630 $nameservers = "nameservers" : [ $nameserver_oc * ] 632 $nameserver_oc = { 633 $nameserver_mixin 634 } 636 $nameserver_mixin = ( 637 "objectClassName" : "nameserver", 638 $common_mixin, 639 "ldhName" : fqdn, 640 "unicodeName" : idn ?, 641 "ipAddresses" : { 642 "v4" : [ ipv4 + ] ?, 643 "v6" : [ ipv6 + ] ? 644 } ?, 645 $entities ? 646 ) 648 Figure 8 650 3.3. Domain Object Class 652 The Domain object class is the most complex of all the object classes 653 defined in RDAP. It represents both forward and reverse DNS 654 delegations. It's complexity is mostly due to the DNSSEC provisions 655 of the object class. 657 $domain_oc = { 658 $domain_mixin 659 } 661 $domain_mixin = ( 662 "objectClassName" : "domain", 663 $common_mixin, 664 "ldhName" : fqdn, 665 "unicodeName" : idn ?, 666 "variants" : [ $variant * ] ?, 667 $nameservers ?, 668 $secureDNS ?, 669 $entities ?, 670 $publicIds ?, 671 "network" : $network_oc ? 672 ) 673 $variant = { 674 $variantRelation ?, 675 "relation" : [ string * ] ?, 676 "idnTable" : string ?, 677 "variantNames" : [ 678 { "ldhName" : fqdn, "unicodeName" : idn } * 679 ] 680 } 682 $variantRelation = "relation" : [ string * ] 684 $secureDNS = "secureDNS" : { 685 "zoneSigned" : boolean ?, 686 "delegationSigned" : boolean ?, 687 "maxSigLife" : integer ?, 688 "dsData" : [ $dsData_obj * ] ?, 689 "keyData" : [ $keyData_obj * ] ? 690 } 692 $dsData_obj = { 693 "keyTag" : integer, 694 "algorithm" : integer, 695 "digest" : string, 696 "digestType" : integer, 697 $events ?, 698 $links ? 699 } 701 $keyData_obj = { 702 "flags" : integer, 703 "protocol" : integer, 704 "publicKey" : string, 705 "algorithm" : integer, 706 $events ?, 707 $links ? 708 } 710 Figure 9 712 3.4. IP Network Object Class 714 The IP Network object class represents IP network registrations in 715 RIRs. 717 $network_oc = { 718 $network_mixin 719 } 721 $network_mixin = ( 722 "objectClassName" : "ip network", 723 $common_mixin, 724 "startAddress" : ( ipv4 | ipv6 ) ?, 725 "endAddres" : ( ipv4 | ipv6 ) ?, 726 "ipVersion" : ( "v4" | "v6" ) ?, 727 "name" : string ?, 728 "type" : string ?, 729 "country" : /[A-Z]{2}/ ?, 730 "parentHandle" : string ?, 731 $entities ? 732 ) 734 Figure 10 736 3.5. Autnum Object Class 738 The Autnum object class represents an autonomous system number or 739 blocks of autonomous system numbers in an RIR. 741 $autnum_oc = { 742 $autnum_mixin 743 } 745 $autnum_mixin = ( 746 "objectClassName" : "autnum", 747 $common_mixin, 748 "startAutnum" : int32 ?, 749 "endAutnum" : int32 ?, 750 "name" : string ?, 751 "type" : string ?, 752 "country" : string ?, 753 $entities ? 754 ) 756 Figure 11 758 4. Search Results 760 Search results in RDAP are merely arrays of object classes. 762 $domainSearchResult = 763 "domainSearchResults" : [ $domain_oc + ] 765 $nameserverSearchResult = 766 "nameserverSearchResults" : [ $nameserver_oc + ] 768 $entitySearchResult = 769 "entitySearchResults" : [ $entity_oc + ] 771 Figure 12 773 5. Error Response 775 Section 6 of [RFC7483] describes RDAP error responses. 777 $error_mixin = ( 778 "errorCode" : integer, 779 "title" : string ?, 780 "description" : [ string * ] ? 781 ) 783 Figure 13 785 6. Common Structures 787 Section 4 of [RFC7483] describes eight common structures used 788 throughout the JSON in RDAP. 790 Most of these common structures are grouped together in a rule called 791 common_mixin. 793 $common_mixin = ( 794 "handle" : string ?, 795 "remarks" : [ $notice * ] ?, 796 $links ?, 797 $events ?, 798 $status ?, 799 $port43 ?, 800 $lang ? 801 ) 803 Figure 14 805 6.1. RDAP Conformance 807 The rdapConformance array is the versioning and capabilities 808 negotiation mechanism of RDAP. 810 $rdapConformance = "rdapConformance" : [ string * ] 812 Figure 15 814 6.2. Links 816 Structures in RDAP may link to information in other data systems 817 using links. Additionally, RDAP uses "self" links to identify 818 instances of RDAP object classes. The data found in each link is 819 described by [RFC5988]. 821 RDAP links are an array of distinct objects, each representing a 822 separate link. 824 $links = ( "links" : [ $link * ] ) 826 ; see RFC 5988 827 $link = { 828 "value" : uri ?, 829 "rel" : string ?, 830 "href" : uri, 831 "hreflang" : [ $lang_value * ] ?, 832 "title" : string ?, 833 "media" : string ?, 834 "type" : 835 /[a-zA-Z][a-zA-Z0-9]*\/[a-zA-Z][a-zA-Z0-9]*/ ? 836 } 838 Figure 16 840 6.3. Notices And Remarks 842 In RDAP, notices and remarks share the same structure. The 843 difference is that notices are meta-data regarding the entirety of a 844 response whereas remarks are meta-data covering a specific instance 845 of an object class. 847 $notices = [ $notice * ] 849 $notice = { 850 "title" : string ?, 851 "description" : [ string * ], 852 $noticeRemarkType ?, 853 $links ?, 854 $lang ? 855 } 857 $noticeRemarkType = "type" : string 859 Figure 17 861 6.4. Language Identifier 863 The "lang" member occurs many RDAP data structures. And the same 864 construct is used in the links structures. 866 ; the language value as defined in RFC 5646 867 $lang_value =: /[a-z]{2}(\-[A-Z][a-zA-Z]*(\-[A-Z]{2})?)?/ 869 $lang = ( "lang" : $lang_value ) 871 Figure 18 873 6.5. Events 875 RDAP events note when a specific action has occured on an object 876 instance, and by whom. The same structure appears in all object 877 classes, as well as being re-used by entities embedded by other 878 objects. 880 $events = "events" : [ $event * ] 882 $noActorEvent_mixin = ( 883 $eventAction, 884 "eventDate" : datetime, 885 $links ?, 886 $lang ? 887 ) 889 $eventAction = "eventAction" : string 891 $noActorEvent = { 892 $noActorEvent_mixin 893 } 895 $event = { 896 $noActorEvent_mixin, 897 "eventActor" : string ? 898 } 900 Figure 19 902 6.6. Status 904 The status of RDAP object instances is indicated by an array of 905 strings, where the value of the strings are registered in an IANA 906 registry. 908 $status = "status" : [ string * ] 910 Figure 20 912 6.7. Port 43 914 RDAP object classes reference their corresponding Whois 915 representation using the "port43" object member. This is simply a 916 string holding the hostname of the Whois service. 918 $port43 = "port43" : string 920 Figure 21 922 6.8. Public IDs 924 Some RDAP services are required to identify entities and domains by 925 public identifiers, such as ICANN Registrar IDs. The publicIds 926 object member is an array of objects to represent these identifiers. 928 $publicIds = "publicIds" : [ $publicId * ] 930 $publicId = { 931 "type" : string, 932 "identifier" : string 933 } 935 Figure 22 937 7. Validating Responses 939 Many JSON roots for RDAP are defined in Figure 1. For applications 940 where an RDAP query must yield a specific response, the appropriate 941 root must be used for validating the response. 943 For example, if the RDAP query https://example.com/rdap/ 944 ip/2001:db8::0 is expected to yield an IP network response, then the 945 validation must only use the $network_response root. 947 8. Stricter Validation 949 RDAP has a very lenient JSON model where information and structures 950 not strictly forbidden are allowed. However, this lenient model 951 allows information from RDAP help and error responses to be found in 952 other responses, and responses for single objects to be found in 953 responses from searches. 955 For applications where these structures cannot be mixed and 956 validation is desired, override rules may be used. 958 For readability, two new rules are created to group the single 959 objects and the search results. 961 The responses with a single object returned represented by mixins. 962 This rule groups those mixins. 964 $object_class = ( 965 $entity_mixin | 966 $nameserver_mixin | 967 $domain_mixin | 968 $network_mixin | 969 $autnum_mixin 970 ) 972 Figure 23 974 The responses to searches are objects containing a single search 975 member which is an array containing the object class mixins. This 976 rule groups the search members. 978 $search_results = ( 979 $domainSearchResult | 980 $nameserverSearchResult | 981 $entitySearchResult 982 ) 984 Figure 24 986 Using the new rules in Figure 23 and Figure 24, override rules (rules 987 rewriting existing rules) can be written for greater strictness. 989 These rules for single object responses prevent search and error 990 response elements to be present. 992 @{root} $entity_response = { 993 $response_mixin, 994 $entity_mixin, 995 @{not} $error_mixin, 996 @{not} $search_results 997 } 999 @{root} $nameserver_response = { 1000 $response_mixin, 1001 $nameserver_mixin, 1002 @{not} $error_mixin, 1003 @{not} $search_results 1004 } 1006 @{root} $domain_response = { 1007 $response_mixin, 1008 $domain_mixin, 1009 @{not} $error_mixin, 1010 @{not} $search_results 1011 } 1013 @{root} $network_response = { 1014 $response_mixin, 1015 $network_mixin, 1016 @{not} $error_mixin, 1017 @{not} $search_results 1018 } 1020 @{root} $autnum_response = { 1021 $response_mixin, 1022 $autnum_mixin, 1023 @{not} $error_mixin, 1024 @{not} $search_results 1025 } 1027 Figure 25 1029 These rules for help and error responses prevent single object and 1030 search arrays. 1032 @{root} $error_response = { 1033 $response_mixin, 1034 $error_mixin, 1035 @{not} $object_class, 1036 @{not} $search_results 1037 } 1039 @{root} $help_response = { 1040 $response_mixin, 1041 $lang ?, 1042 @{not} $error_mixin, 1043 @{not} $object_class, 1044 @{not} $search_results 1045 } 1047 Figure 26 1049 These rules for search responses prevent single object and error data 1050 structures. 1052 @{root} $domainSearch_response = { 1053 $response_mixin, 1054 $lang ?, 1055 $domainSearchResult, 1056 @{not} $error_mixin, 1057 @{not} $object_class 1058 } 1060 @{root} $nameserverSearch_response = { 1061 $response_mixin, 1062 $lang ?, 1063 $nameserverSearchResult, 1064 @{not} $error_mixin, 1065 @{not} $object_class 1066 } 1068 @{root} $entitySearch_response = { 1069 $response_mixin, 1070 $lang ?, 1071 $entitySearchResult, 1072 @{not} $error_mixin, 1073 @{not} $object_class 1074 } 1076 Figure 27 1078 Stricter validation is also possible by overriding rules that take 1079 generic strings and overriding them with enumerated lists of values 1080 from the RDAP JSON values registry. 1082 These rules override the generic domain variant relations in RDAP 1083 with values found in the IANA registry. 1085 $variantRelation = "relation" : [ $variantRelation_values * ] 1087 $variantRelation_values = ( 1088 "registered" | 1089 "unregistered" | 1090 "registration restricted" | 1091 "open registration" | 1092 "conjoined" 1093 ) 1095 Figure 28 1097 These rules override the generic event actions in RDAP with values 1098 found in the IANA registry. 1100 $eventAction = "eventAction" : $eventAction_values 1102 $eventAction_values = ( 1103 "registration" | 1104 "reregistration" | 1105 "last changed" | 1106 "expiration" | 1107 "deletion" | 1108 "reinstantiation" | 1109 "transfer" | 1110 "locked" | 1111 "unlocked" | 1112 "last update of RDAP database" | 1113 "registrar expiration" | 1114 "enum validation expiration" 1115 ) 1117 Figure 29 1119 These rules override the generic notice and remark types in RDAP with 1120 values found in the IANA registry. 1122 $noticeRemarkType = "type" : $noticeRemarkType_values 1124 $noticeRemarkType_values = ( 1125 "result set truncated due to authorization" | 1126 "result set truncated due to excessive load" | 1127 "result set truncated due to unexplainable reasons" | 1128 "object truncated due to authorization" | 1129 "object truncated due to excessive load" | 1130 "object truncated due to unexplainable reasons" 1131 ) 1133 Figure 30 1135 These rules override the generic entity roles in RDAP with values 1136 found in the IANA registry. 1138 $roles = "roles" : [ $role_values * ] 1140 $role_values = ( 1141 "registrant" | 1142 "technical" | 1143 "administrative" | 1144 "abuse" | 1145 "billing" | 1146 "registrar" | 1147 "reseller" | 1148 "sponsor" | 1149 "proxy" | 1150 "notifications" | 1151 "noc" 1152 ) 1154 Figure 31 1156 These rules override the generic status values in RDAP with values 1157 found in the IANA registry. 1159 $status = "status" : [ $status_values * ] 1161 $status_values = ( 1162 "validated" | 1163 "renew prohibited" | 1164 "update prohibited" | 1165 "transfer prohibited" | 1166 "delete prohibited" | 1167 "proxy" | 1168 "private" | 1169 "removed" | 1170 "obscured" | 1171 "associated" | 1172 "active" | 1173 "inactive" | 1174 "locked" | 1175 "pending create" | 1176 "pending renew" | 1177 "pending transfer" | 1178 "pending update" | 1179 "pending delete" | 1180 "add period" | 1181 "auto renew period" | 1182 "client delete prohibited" | 1183 "client hold" | 1184 "client renew prohibited" | 1185 "client transfer prohibited" | 1186 "client update prohibited" | 1187 "pending restore" | 1188 "redemption period" | 1189 "renew period" | 1190 "server delete prohibited" | 1191 "server renew prohibited" | 1192 "server transfer prohibited" | 1193 "server update prohibited" | 1194 "server hold" | 1195 "transfer period" 1196 ) 1198 Figure 32 1200 9. Complete Rulesets for RDAP 1202 The following rulesets, along with a test framework and examples of 1203 good and bad RDAP JSON instances, may be found at 1204 . 1206 The following is the complete ruleset of JSON Content Rules for RDAP. 1208 ; 1209 ; JSON Content Rules (JCR) ruleset 1210 ; for the Registry Data Access Protocol (RDAP) 1211 ; 1212 ; Specified in RFC 7483 1213 ; 1215 # ruleset-id rdap_level_0 1217 ; 1218 ; The various types of responses 1219 ; 1221 @{root} $entity_response = { 1222 $response_mixin, 1223 $entity_mixin 1224 } 1226 @{root} $nameserver_response = { 1227 $response_mixin, 1228 $nameserver_mixin 1229 } 1231 @{root} $domain_response = { 1232 $response_mixin, 1233 $domain_mixin 1234 } 1236 @{root} $network_response = { 1237 $response_mixin, 1238 $network_mixin 1239 } 1241 @{root} $autnum_response = { 1242 $response_mixin, 1243 $autnum_mixin 1244 } 1246 @{root} $error_response = { 1247 $response_mixin, 1248 $error_mixin 1249 } 1251 @{root} $help_response = { 1252 $response_mixin, 1253 $lang ? 1254 } 1256 @{root} $domainSearch_response = { 1257 $response_mixin, 1258 $lang ?, 1259 $domainSearchResult 1260 } 1262 @{root} $nameserverSearch_response = { 1263 $response_mixin, 1264 $lang ?, 1265 $nameserverSearchResult 1266 } 1268 @{root} $entitySearch_response = { 1269 $response_mixin, 1270 $lang ?, 1271 $entitySearchResult 1272 } 1274 $response_mixin = ( 1275 $rdapConformance ?, 1276 "notices" : $notices ? 1277 ) 1279 ; 1280 ; RFC 7483 Section 4.1 - RDAP Conformance 1281 ; 1283 $rdapConformance = "rdapConformance" : [ string * ] 1285 ; 1286 ; RFC 7483 Section 4.2 - Links 1287 ; 1289 $links = ( "links" : [ $link * ] ) 1291 ; see RFC 5988 1292 $link = { 1293 "value" : uri ?, 1294 "rel" : string ?, 1295 "href" : uri, 1296 "hreflang" : [ $lang_value * ] ?, 1297 "title" : string ?, 1298 "media" : string ?, 1299 "type" : 1300 /[a-zA-Z][a-zA-Z0-9]*\/[a-zA-Z][a-zA-Z0-9]*/ ? 1301 } 1303 ; 1304 ; RFC 7483 Section 4.3 - Notices 1305 ; 1307 $notices = [ $notice * ] 1309 $notice = { 1310 "title" : string ?, 1311 "description" : [ string * ], 1312 $noticeRemarkType ?, 1313 $links ?, 1314 $lang ? 1315 } 1317 $noticeRemarkType = "type" : string 1319 ; 1320 ; RFC 7483 Section 4.4 - Language Identifier 1321 ; 1323 ; the language value as defined in RFC 5646 1324 $lang_value =: /[a-z]{2}(\-[A-Z][a-zA-Z]*(\-[A-Z]{2})?)?/ 1326 $lang = ( "lang" : $lang_value ) 1328 ; 1329 ; RFC 7483 Section 4.5 - Events 1330 ; 1332 $events = "events" : [ $event * ] 1334 $noActorEvent_mixin = ( 1335 $eventAction, 1336 "eventDate" : datetime, 1337 $links ?, 1338 $lang ? 1339 ) 1341 $eventAction = "eventAction" : string 1343 $noActorEvent = { 1344 $noActorEvent_mixin 1345 } 1347 $event = { 1348 $noActorEvent_mixin, 1349 "eventActor" : string ? 1350 } 1352 ; 1353 ; RFC 7483 Section 4.6 - Status 1354 ; 1356 $status = "status" : [ string * ] 1358 ; 1359 ; RFC 7483 Section 4.7 - Port43 1360 ; 1362 $port43 = "port43" : string 1364 ; 1365 ; RFC 7482 Section 4.8 - Public Ids 1366 ; 1368 $publicIds = "publicIds" : [ $publicId * ] 1370 $publicId = { 1371 "type" : string, 1372 "identifier" : string 1373 } 1375 ; 1376 ; Common Object Class Structures 1377 ; 1379 $common_mixin = ( 1380 "handle" : string ?, 1381 "remarks" : [ $notice * ] ?, 1382 $links ?, 1383 $events ?, 1384 $status ?, 1385 $port43 ?, 1386 $lang ? 1387 ) 1389 ; 1390 ; RFC 7483 Section 5.1 - Entity Object Class 1391 ; 1393 $entities = "entities" : [ $entity_oc * ] 1395 $entity_oc = { 1396 $entity_mixin 1397 } 1399 $entity_mixin = ( 1400 "objectClassName" : "entity", 1401 $common_mixin, 1402 "vcardArray" : [ "vcard", $vcard * ] ?, 1403 "asEventActor" : [ $noActorEvent * ] ?, 1404 $roles ?, 1405 $publicIds ?, 1406 $entities ?, 1407 "networks" : [ $network_oc * ] ?, 1408 "autnums" : [ $autnum_oc * ] ? 1409 ) 1411 $roles = "roles" : [ string * ] 1413 ; jCard (see RFC 7095) is an algorithm for converting 1414 ; vCard to JSON. Each jCard is represented by an array of 1415 ; vCard properties. The "version" property must be the 1416 ; first property, and there must be one and only one "fn" 1417 ; property in some part of the array. 1418 ; 1419 ; Here we represent this by an ordered array, with "version" 1420 ; being the first property, then listing all the properties 1421 ; that match by property name, then matching 1422 ; the "fn" property, then matching any other property again. 1423 $vcard = [ 1424 [ "version", {}, "text", "4.0" ], 1425 $vcard_not_fn_properties * , 1426 [ "fn", { $vcard_type_param?, $vcard_language_param? , 1427 $vcard_altid_param? , $vcard_pid_param? , 1428 $vcard_pref_param?, $vcard_any_param? }, 1429 "text", string ], 1430 $vcard_not_fn_properties * 1431 ] 1433 $vcard_not_fn_properties = 1434 ( 1435 $vcard_source | 1436 $vcard_kind | 1437 $vcard_n | 1438 $vcard_nicname | 1439 $vcard_photo | 1440 $vcard_bday | 1441 $vcard_anniversary | 1442 $vcard_gender | 1443 $vcard_adr | 1444 $vcard_tel | 1445 $vcard_email | 1446 $vcard_impp | 1447 $vcard_lang | 1448 $vcard_tz | 1449 $vcard_geo | 1450 $vcard_title | 1451 $vcard_role | 1452 $vcard_logo | 1453 $vcard_org | 1454 $vcard_member | 1455 $vcard_related | 1456 $vcard_categories | 1457 $vcard_note | 1458 $vcard_prodid | 1459 $vcard_rev | 1460 $vcard_sound | 1461 $vcard_uid | 1462 $vcard_clientpidmap | 1463 $vcard_url | 1464 $vcard_key | 1465 $vcard_fburl | 1466 $vcard_caladruri | 1467 $vcard_caluri | 1468 $vcard_x10 1469 ) 1471 ; vCard properties. Each one is defined with a common 1472 ; definition, and then a group that matches the property name. 1473 $vcard_source = [ "source", $vcard_source_prop ] 1474 $vcard_source_prop = ( 1475 { $vcard_pid_param? , $vcard_pref_param?, $vcard_altid_param? , 1476 $vcard_mediatype_param?, $vcard_any_param? } , 1477 "uri", uri 1478 ) 1480 $vcard_kind = [ "kind", $vcard_kind_prop ] 1481 $vcard_kind_prop = ( 1482 { $vcard_any_param? }, 1483 "text", $vcard_kind_type 1484 ) 1486 $vcard_n = [ "n", $vcard_n_prop ] 1487 $vcard_n_prop = ( 1488 { $vcard_sort_as_param? , $vcard_language_param? , 1489 $vcard_altid_param? , $vcard_any_param? }, 1490 "text", $vcard_string_type_array 1491 ) 1493 $vcard_nicname = [ "nicname", $vcard_nicname_prop ] 1494 $vcard_nicname_prop = ( 1495 { $vcard_type_param? , $vcard_language_param? , 1496 $vcard_altid_param? , $vcard_pid_param? , 1497 $vcard_pref_param? , $vcard_any_param ? }, 1498 "text", $vcard_string_type_array 1499 ) 1501 $vcard_photo = [ "photo", $vcard_photo_prop ] 1502 $vcard_photo_prop = ( 1503 { $vcard_altid_param? , $vcard_type_param? , 1504 $vcard_mediatype_param? , $vcard_pref_param? , 1505 $vcard_pid_param? , $vcard_any_param? }, 1506 "uri", uri 1507 ) 1509 $vcard_bday = [ "bday", $vcard_bday_prop ] 1510 $vcard_bday_prop = ( 1511 ( { $vcard_language_param?, $vcard_altid_param?, 1512 $vcard_calscale_param?, $vcard_any_param? }, 1513 "text", string 1514 ) | 1515 ( { $vcard_altid_param?, $vcard_calscale_param?, 1516 $vcard_any_param? }, 1517 "date-and-or-time", $vcard_date_and_or_time_type 1518 ) 1519 ) 1521 $vcard_anniversary = [ "anniversary", $vcard_anniversary_prop ] 1522 $vcard_anniversary_prop = ( 1523 { $vcard_altid_param?, $vcard_calscale_param?, $vcard_any_param? }, 1524 "date-and-or-time", $vcard_date_and_or_time_type 1525 ) 1527 $vcard_gender = [ "gender", $vcard_gender_prop ] 1528 $vcard_gender_prop = ( 1529 { $vcard_any_param? }, 1530 "text", 1531 ( $vcard_gender_type | [ $vcard_gender_type, string + ] ) 1532 ) 1534 $vcard_adr = [ "adr", $vcard_adr_prop ] 1535 $vcard_adr_prop = ( 1536 { $vcard_label_param? , $vcard_language_param? , 1537 $vcard_geo_param ? , $vcard_tz_param? , 1538 $vcard_altid_param? , $vcard_pid_param? , 1539 $vcard_pref_param? , $vcard_type_param? , 1540 $vcard_any_param? }, 1541 "text", $vcard_string_type_array 1542 ) 1544 $vcard_tel = [ "tel", $vcard_tel_prop ] 1545 $vcard_tel_prop = ( 1546 ( { $vcard_type_param? , $vcard_pid_param? , $vcard_pref_param? , 1547 $vcard_altid_param?, $vcard_any_param? }, "text", string 1548 ) | 1549 ( { $vcard_type_param? , $vcard_pid_param? , $vcard_pref_param? , 1550 $vcard_altid_param?, $vcard_mediatype_param?, 1551 $vcard_any_param? }, 1552 "uri", uri..tel 1553 ) 1554 ) 1556 $vcard_email = [ "email", $vcard_email_prop ] 1557 $vcard_email_prop = ( 1558 { $vcard_pid_param? , $vcard_pref_param? , $vcard_type_param? , 1559 $vcard_altid_param? , $vcard_any_param ? }, 1560 "text", string 1561 ) 1563 $vcard_impp = [ "impp", $vcard_impp_prop ] 1564 $vcard_impp_prop = ( 1565 { $vcard_pid_param? , $vcard_pref_param? , $vcard_type_param? , 1566 $vcard_mediatype_param? , $vcard_altid_param? , 1567 $vcard_any_param }, 1568 "uri", uri..impp 1569 ) 1571 $vcard_lang = [ "lang", $vcard_lang_prop ] 1572 $vcard_lang_prop = ( 1573 { $vcard_pid_param? , $vcard_pref_param? , $vcard_altid_param? , 1574 $vcard_type_param? , $vcard_any_param? }, 1575 "language-tag", $vcard_language_tag_type 1576 ) 1578 $vcard_tz = [ "tz", $vcard_tz_prop ] 1579 $vcard_tz_prop = ( 1580 { $vcard_altid_param?, $vcard_pid_param? , $vcard_pref_param? , 1581 $vcard_type_param? , $vcard_mediatype_param?, 1582 $vcard_any_param? }, 1584 ( ( "text", string ) | 1585 ( "uri" , uri ) | 1586 ( "utc-offset" , $vcard_utc_offset_type ) ) 1587 ) 1589 $vcard_geo = [ "geo", $vcard_geo_prop ] 1590 $vcard_geo_prop = ( 1591 { $vcard_pid_param? , $vcard_pref_param? , $vcard_type_param? , 1592 $vcard_mediatype_param? , $vcard_altid_param? , 1593 $vcard_any_param? }, 1594 "uri", uri..geo 1595 ) 1597 $vcard_title = [ "title", $vcard_title_prop ] 1598 $vcard_title_prop = ( 1599 { $vcard_language_param? , $vcard_pid_param? , $vcard_pref_param? , 1600 $vcard_altid_param? , $vcard_type_param? , $vcard_any_param? }, 1601 "text", string 1602 ) 1604 $vcard_role = [ "role", $vcard_role_prop ] 1605 $vcard_role_prop = ( 1606 { $vcard_language_param? , $vcard_pid_param? , $vcard_pref_param? , 1607 $vcard_altid_param? , $vcard_type_param? , $vcard_any_param? }, 1608 "text", string 1609 ) 1611 $vcard_logo = [ "logo", $vcard_logo_prop ] 1612 $vcard_logo_prop = ( 1613 { $vcard_altid_param? , $vcard_type_param? , 1614 $vcard_mediatype_param? , $vcard_pref_param? , 1615 $vcard_pid_param? , $vcard_language_param? , 1616 $vcard_any_param? }, 1617 "uri", uri 1618 ) 1620 $vcard_org = [ "org", $vcard_org_prop ] 1621 $vcard_org_prop = ( 1622 { $vcard_sort_as_param? , $vcard_language_param? , 1623 $vcard_pid_param? , $vcard_pref_param? , $vcard_altid_param? , 1624 $vcard_type_param? , $vcard_any_param? }, 1625 "text", $vcard_string_type_array 1626 ) 1628 $vcard_member = [ "member", $vcard_member_prop ] 1629 $vcard_member_prop = ( 1630 { $vcard_altid_param? , $vcard_mediatype_param? , 1631 $vcard_pref_param? , $vcard_pid_param? , $vcard_any_param? }, 1633 "uri", uri 1634 ) 1636 $vcard_related = [ "related", $vcard_related_prop ] 1637 $vcard_related_prop = ( 1638 ( { $vcard_mediatype_param? , $vcard_pref_param? , 1639 $vcard_altid_param? , $vcard_type_param? , 1640 $vcard_any_param? }, 1641 "uri", uri 1642 ) | 1643 ( { $vcard_language_param? , $vcard_pref_param? , 1644 $vcard_altid_param? , $vcard_type_param? , 1645 $vcard_any_param? }, 1646 "text", $vcard_related_type_array 1647 ) 1648 ) 1650 $vcard_categories = [ "categories", $vcard_categories_prop ] 1651 $vcard_categories_prop = ( 1652 { $vcard_pid_param? , $vcard_pref_param? , $vcard_type_param ?, 1653 $vcard_altid_param? , $vcard_any_param? }, 1654 "text", $vcard_string_type_array 1655 ) 1657 $vcard_note = [ "note", $vcard_note_prop ] 1658 $vcard_note_prop = ( 1659 { $vcard_language_param? , $vcard_pid_param? , 1660 $vcard_pref_param? , $vcard_type_param? , 1661 $vcard_altid_param? , $vcard_any_param ? }, 1662 "text", string 1663 ) 1665 $vcard_prodid = [ "prodid", $vcard_prodid_prop ] 1666 $vcard_prodid_prop = ( { $vcard_any_param ? }, "text", string ) 1668 $vcard_rev = [ "rev", $vcard_rev_prop ] 1669 $vcard_rev_prop = ( 1670 { $vcard_any_param ? }, "timestamp", datetime 1671 ) 1673 $vcard_sound = [ "sound", $vcard_sound_prop ] 1674 $vcard_sound_prop = ( 1675 { $vcard_altid_param? , $vcard_mediatype_param? , 1676 $vcard_language_param? , $vcard_pref_param? , 1677 $vcard_pid_param? , $vcard_any_param? }, 1678 "uri", uri 1679 ) 1680 $vcard_uid = [ "uid", $vcard_uid_prop ] 1681 $vcard_uid_prop = ( 1682 ( { $vcard_any_param? }, "uri", uri ) | 1683 ( { $vcard_any_param? }, "text", string ) 1684 ) 1686 $vcard_clientpidmap = [ "clientpidmap", $vcard_clientpidmap_prop ] 1687 $vcard_clientpidmap_prop = ( {}, "text", [ /^[0-9]+$/, uri ] ) 1689 $vcard_url = [ "url", $vcard_url_prop ] 1690 $vcard_url_prop = ( 1691 { $vcard_altid_param? , $vcard_mediatype_param? , 1692 $vcard_pref_param? , $vcard_pid_param? , $vcard_any_param? }, 1693 "uri", uri 1694 ) 1696 $vcard_key = [ "key", $vcard_key_prop ] 1697 $vcard_key_prop = ( 1698 ( { $vcard_mediatype_param? , $vcard_pref_param? , 1699 $vcard_altid_param? , $vcard_type_param? , 1700 $vcard_any_param? }, 1701 "uri", uri 1702 ) | 1703 ( { $vcard_pref_param? , $vcard_altid_param? , 1704 $vcard_type_param? , $vcard_any_param? }, 1705 "text", string 1706 ) 1707 ) 1709 $vcard_fburl = [ "fburl", $vcard_fburl_prop ] 1710 $vcard_fburl_prop = ( 1711 { $vcard_altid_param? , $vcard_mediatype_param? , 1712 $vcard_altid_param? , $vcard_pref_param? , 1713 $vcard_pid_param? , $vcard_any_param? }, 1714 "uri", uri 1715 ) 1717 $vcard_caladruri = [ "caladruri", $vcard_caladruri_prop ] 1718 $vcard_caladruri_prop = ( 1719 { $vcard_altid_param? , $vcard_mediatype_param? , 1720 $vcard_altid_param? , $vcard_pref_param? , 1721 $vcard_pid_param? , $vcard_any_param? }, 1722 "uri", uri 1723 ) 1725 $vcard_caluri = [ "caluri", $vcard_caluri_prop ] 1726 $vcard_caluri_prop = ( 1727 { $vcard_altid_param? , $vcard_mediatype_param? , 1728 $vcard_altid_param? , $vcard_pref_param? , 1729 $vcard_pid_param? , $vcard_any_param? }, 1730 "uri", uri 1731 ) 1733 $vcard_x10 = [ $vcard_x_name_type, $vcard_x10_prop ] 1734 $vcard_x10_prop = ( 1735 { $vcard_language_param? , $vcard_pref_param? , 1736 $vcard_altid_param? , $vcard_pid_param? , 1737 $vcard_type_param? , $vcard_mediatype_param? , 1738 $vcard_calscale_param? , $vcard_sort_as_param? , 1739 $vcard_geo_param? , $vcard_tz_param? , 1740 $vcard_label_param? , $vcard_any_param? }, 1741 $vcard_x_name_type, $vcard_string_type_array 1742 ) 1744 ; Each vCard property can have parameters. 1745 $vcard_language_param = "language" : $vcard_language_tag_type 1746 $vcard_pref_param = "pref" : $vcard_pref_type 1747 $vcard_altid_param = "altid" : string 1748 $vcard_pid_param = "pid" : $vcard_pid_type_array 1749 $vcard_type_param = "type" : $vcard_type_type_array 1750 $vcard_mediatype_param = "mediatype" : $vcard_mediatype_type 1751 $vcard_calscale_param = "calscale" : $vcard_calscale_type 1752 $vcard_sort_as_param = "sort-as" : $vcard_string_type_array 1753 $vcard_geo_param = "geo" : uri..geo 1754 $vcard_tz_param = "tz" : $vcard_utc_offset_type 1755 $vcard_label_param = "label" : $vcard_string_type_array 1756 $vcard_any_param = /^x\-[A-Za-z0-9\-]*$/ : $vcard_string_type_array 1758 ; Each vCard property has a value type. 1759 $vcard_string_type_array = 1760 ( string | [ ( string | [ string * ] ) * ] ) 1761 $vcard_language_tag_type =: 1762 /[a-z]{2}(-[A-Z][a-zA-Z]*(\-[A-Z]{2})?)?/ 1763 $vcard_mediatype_type =: /^\w+\/[\-.\w]+(?:\+[\-.\w]+)?$/ 1764 $vcard_utc_offset_type =: /^(([\-\+]\d{1,2}):?(\d{2})?)?$/ 1765 $vcard_date_or_time =: ( 1766 /^(\d{4})-?(\d{2})-?(\d{2})$/ | 1767 /^(\d{4})$/ | 1768 /^--(\d{2})-?(\d{2})$/ | 1769 /^--(\d{2})$/ | 1770 /^---(\d{2})$/ | 1771 /^(\d{2})(([-+]\d{1,2}):?(\d{2})?)?$/ | 1772 /^(\d{2}):?(\d{2})(([\-\+]\d{1,2}):?(\d{2})?)?$/ | 1773 /^(\d{2}):?(\d{2}):?(\d{2})(Z|([\-\+]\d{1,2}):?(\d{2})?)?$/ | 1774 /^-(\d{2}):?(\d{2})(Z|([\-\+]\d{1,2}):?(\d{2})?)?$/ | 1775 /^-(\d{2})(([\-\+]\d{1,2}):?(\d{2})?)?$/ | 1776 /^--(\d{2})(([\-\+]\d{1,2}):?(\d{2})?)?$/ 1777 ) 1778 $vcard_date_and_or_time_type =: ( 1779 datetime | $vcard_date_or_time 1780 ) 1781 $vcard_group_type =: /^[a-zA-Z0-9\-]+$/ 1782 $vcard_type_type =: ( 1783 "home" | "work" | $vcard_tel_type | $vcard_related_type | 1784 $vcard_x_name_type 1785 ) 1786 $vcard_type_type_array = ( 1787 $vcard_type_type | [ $vcard_type_type * ] 1788 ) 1789 $vcard_tel_type =: ( 1790 "text" | "voice" | "fax" | "cell" | "video" | 1791 "pager" | "textphone" | "main-number" 1792 ) 1793 $vcard_tel_type_array = ( $vcard_tel_type | [ $vcard_tel_type * ] ) 1794 $vcard_related_type =: ( 1795 "contact" | "acquaintance" | "friend" | "met" | 1796 "co-worker" | "colleague" | "co-resident" | 1797 "neighbor" | "child" | "parent" | "sibling" | 1798 "spouse" | "kin" | "muse" | "crush" | "date" | 1799 "sweetheart" | "me" | "agent" | "emergency" 1800 ) 1801 $vcard_related_type_array = ( 1802 $vcard_related_type | [ $vcard_related_type * ] 1803 ) 1804 $vcard_index_type =: /^[1-9]?[0-9]*$/ 1805 $vcard_expertise_level_type =: ( 1806 "beginner" | "average" | "expert" 1807 ) 1808 $vcard_hobby_type =: ( "high" | "medium" | "low" ) 1809 $vcard_pref_type =: /^[1-9]?[0-9]{1}$|^100$/ 1810 $vcard_pid_type =: /^[0-9]+(\.[0-9]+)?$/ 1811 $vcard_pid_type_array = ( 1812 $vcard_pid_type | [ $vcard_pid_type * ] 1813 ) 1814 $vcard_gender_type =: ( "M" | "F" | "O" | "N" | "U" ) 1815 $vcard_gender_type_array = ( 1816 $vcard_gender_type | [ $vcard_gender_type * ] 1817 ) 1818 $vcard_kind_type =: ( 1819 "individual" | "group" | "org" | "location" | 1820 "application" | "device" 1821 ) 1822 $vcard_iana_token_type =: /^[A-Za-z0-9\-]*$/ 1823 $vcard_x_name_type =: /^x\-[A-Za-z0-9\-]*$/ 1824 $vcard_calscale_type =: ( 1825 "gregorian" | $vcard_iana_token_type | $vcard_x_name_type 1826 ) 1828 ; 1829 ; RFC 7483 Section 5.2 - Nameserver Object Class 1830 ; 1832 $nameservers = "nameservers" : [ $nameserver_oc * ] 1834 $nameserver_oc = { 1835 $nameserver_mixin 1836 } 1838 $nameserver_mixin = ( 1839 "objectClassName" : "nameserver", 1840 $common_mixin, 1841 "ldhName" : fqdn, 1842 "unicodeName" : idn ?, 1843 "ipAddresses" : { 1844 "v4" : [ ipv4 + ] ?, 1845 "v6" : [ ipv6 + ] ? 1846 } ?, 1847 $entities ? 1848 ) 1850 ; 1851 ; RFC 7483 Section 5.3 - Domain Object Class 1852 ; 1854 $domain_oc = { 1855 $domain_mixin 1856 } 1858 $domain_mixin = ( 1859 "objectClassName" : "domain", 1860 $common_mixin, 1861 "ldhName" : fqdn, 1862 "unicodeName" : idn ?, 1863 "variants" : [ $variant * ] ?, 1864 $nameservers ?, 1865 $secureDNS ?, 1866 $entities ?, 1867 $publicIds ?, 1868 "network" : $network_oc ? 1869 ) 1871 $variant = { 1872 $variantRelation ?, 1873 "relation" : [ string * ] ?, 1874 "idnTable" : string ?, 1875 "variantNames" : [ 1876 { "ldhName" : fqdn, "unicodeName" : idn } * 1877 ] 1878 } 1880 $variantRelation = "relation" : [ string * ] 1882 $secureDNS = "secureDNS" : { 1883 "zoneSigned" : boolean ?, 1884 "delegationSigned" : boolean ?, 1885 "maxSigLife" : integer ?, 1886 "dsData" : [ $dsData_obj * ] ?, 1887 "keyData" : [ $keyData_obj * ] ? 1888 } 1890 $dsData_obj = { 1891 "keyTag" : integer, 1892 "algorithm" : integer, 1893 "digest" : string, 1894 "digestType" : integer, 1895 $events ?, 1896 $links ? 1897 } 1899 $keyData_obj = { 1900 "flags" : integer, 1901 "protocol" : integer, 1902 "publicKey" : string, 1903 "algorithm" : integer, 1904 $events ?, 1905 $links ? 1906 } 1908 ; 1909 ; RFC 7483 Section 5.4 - IP Network Object Class 1910 ; 1912 $network_oc = { 1913 $network_mixin 1914 } 1916 $network_mixin = ( 1917 "objectClassName" : "ip network", 1918 $common_mixin, 1919 "startAddress" : ( ipv4 | ipv6 ) ?, 1920 "endAddres" : ( ipv4 | ipv6 ) ?, 1921 "ipVersion" : ( "v4" | "v6" ) ?, 1922 "name" : string ?, 1923 "type" : string ?, 1924 "country" : /[A-Z]{2}/ ?, 1925 "parentHandle" : string ?, 1926 $entities ? 1927 ) 1929 ; 1930 ; RFC 7483 Section 5.5 - Autnum Object Class 1931 ; 1933 $autnum_oc = { 1934 $autnum_mixin 1935 } 1937 $autnum_mixin = ( 1938 "objectClassName" : "autnum", 1939 $common_mixin, 1940 "startAutnum" : int32 ?, 1941 "endAutnum" : int32 ?, 1942 "name" : string ?, 1943 "type" : string ?, 1944 "country" : string ?, 1945 $entities ? 1946 ) 1948 ; 1949 ; RFC 7483 Section 6 - Error 1950 ; 1952 $error_mixin = ( 1953 "errorCode" : integer, 1954 "title" : string ?, 1955 "description" : [ string * ] ? 1956 ) 1958 ; 1959 ; RFC 7483 Section 8 - Search Results 1960 ; 1962 $domainSearchResult = 1963 "domainSearchResults" : [ $domain_oc + ] 1965 $nameserverSearchResult = 1966 "nameserverSearchResults" : [ $nameserver_oc + ] 1968 $entitySearchResult = 1969 "entitySearchResults" : [ $entity_oc + ] 1971 Figure 33: Complete Ruleset for RDAP 1973 The following is the complete ruleset of override rules for stricter 1974 validation of RDAP. 1976 ; 1977 ; Override rules for strict RDAP checking. 1978 ; 1980 ; 1981 ; Object class response 1982 ; 1984 @{root} $entity_response = { 1985 $response_mixin, 1986 $entity_mixin, 1987 @{not} $error_mixin, 1988 @{not} $search_results 1989 } 1991 @{root} $nameserver_response = { 1992 $response_mixin, 1993 $nameserver_mixin, 1994 @{not} $error_mixin, 1995 @{not} $search_results 1996 } 1998 @{root} $domain_response = { 1999 $response_mixin, 2000 $domain_mixin, 2001 @{not} $error_mixin, 2002 @{not} $search_results 2003 } 2005 @{root} $network_response = { 2006 $response_mixin, 2007 $network_mixin, 2008 @{not} $error_mixin, 2009 @{not} $search_results 2010 } 2012 @{root} $autnum_response = { 2013 $response_mixin, 2014 $autnum_mixin, 2015 @{not} $error_mixin, 2016 @{not} $search_results 2017 } 2018 ; 2019 ; Help and error response 2020 ; 2022 @{root} $error_response = { 2023 $response_mixin, 2024 $error_mixin, 2025 @{not} $object_class, 2026 @{not} $search_results 2027 } 2029 @{root} $help_response = { 2030 $response_mixin, 2031 $lang ?, 2032 @{not} $error_mixin, 2033 @{not} $object_class, 2034 @{not} $search_results 2035 } 2036 ; 2037 ; Search responses 2038 ; 2040 @{root} $domainSearch_response = { 2041 $response_mixin, 2042 $lang ?, 2043 $domainSearchResult, 2044 @{not} $error_mixin, 2045 @{not} $object_class 2046 } 2048 @{root} $nameserverSearch_response = { 2049 $response_mixin, 2050 $lang ?, 2051 $nameserverSearchResult, 2052 @{not} $error_mixin, 2053 @{not} $object_class 2054 } 2056 @{root} $entitySearch_response = { 2057 $response_mixin, 2058 $lang ?, 2059 $entitySearchResult, 2060 @{not} $error_mixin, 2061 @{not} $object_class 2062 } 2063 ; 2064 ; Object class mixins 2065 ; 2067 $object_class = ( 2068 $entity_mixin | 2069 $nameserver_mixin | 2070 $domain_mixin | 2071 $network_mixin | 2072 $autnum_mixin 2073 ) 2074 ; 2075 ; All search results 2076 ; 2078 $search_results = ( 2079 $domainSearchResult | 2080 $nameserverSearchResult | 2081 $entitySearchResult 2082 ) 2083 ; 2084 ; IANA Status Values 2085 ; 2087 $status = "status" : [ $status_values * ] 2089 $status_values = ( 2090 "validated" | 2091 "renew prohibited" | 2092 "update prohibited" | 2093 "transfer prohibited" | 2094 "delete prohibited" | 2095 "proxy" | 2096 "private" | 2097 "removed" | 2098 "obscured" | 2099 "associated" | 2100 "active" | 2101 "inactive" | 2102 "locked" | 2103 "pending create" | 2104 "pending renew" | 2105 "pending transfer" | 2106 "pending update" | 2107 "pending delete" | 2108 "add period" | 2109 "auto renew period" | 2110 "client delete prohibited" | 2111 "client hold" | 2112 "client renew prohibited" | 2113 "client transfer prohibited" | 2114 "client update prohibited" | 2115 "pending restore" | 2116 "redemption period" | 2117 "renew period" | 2118 "server delete prohibited" | 2119 "server renew prohibited" | 2120 "server transfer prohibited" | 2121 "server update prohibited" | 2122 "server hold" | 2123 "transfer period" 2124 ) 2125 ; 2126 ; IANA Notice and Remark Types 2127 ; 2129 $noticeRemarkType = "type" : $noticeRemarkType_values 2131 $noticeRemarkType_values = ( 2132 "result set truncated due to authorization" | 2133 "result set truncated due to excessive load" | 2134 "result set truncated due to unexplainable reasons" | 2135 "object truncated due to authorization" | 2136 "object truncated due to excessive load" | 2137 "object truncated due to unexplainable reasons" 2138 ) 2139 ; 2140 ; IANA Roles 2141 ; 2143 $roles = "roles" : [ $role_values * ] 2145 $role_values = ( 2146 "registrant" | 2147 "technical" | 2148 "administrative" | 2149 "abuse" | 2150 "billing" | 2151 "registrar" | 2152 "reseller" | 2153 "sponsor" | 2154 "proxy" | 2155 "notifications" | 2156 "noc" 2157 ) 2158 ; 2159 ; IANA Domain Variant Relations 2160 ; 2162 $variantRelation = "relation" : [ $variantRelation_values * ] 2164 $variantRelation_values = ( 2165 "registered" | 2166 "unregistered" | 2167 "registration restricted" | 2168 "open registration" | 2169 "conjoined" 2170 ) 2171 ; 2172 ; IANA Event Actions 2173 ; 2175 $eventAction = "eventAction" : $eventAction_values 2177 $eventAction_values = ( 2178 "registration" | 2179 "reregistration" | 2180 "last changed" | 2181 "expiration" | 2182 "deletion" | 2183 "reinstantiation" | 2184 "transfer" | 2185 "locked" | 2186 "unlocked" | 2187 "last update of RDAP database" | 2188 "registrar expiration" | 2189 "enum validation expiration" 2190 ) 2192 Figure 34: Override Ruleset for RDAP 2194 10. Normative References 2196 [I-D.newton-json-content-rules] 2197 Newton, A. and P. Cordell, "A Language for Rules 2198 Describing JSON Content", draft-newton-json-content- 2199 rules-09 (work in progress), September 2017. 2201 [RFC5988] Nottingham, M., "Web Linking", RFC 5988, 2202 DOI 10.17487/RFC5988, October 2010, 2203 . 2205 [RFC7095] Kewisch, P., "jCard: The JSON Format for vCard", RFC 7095, 2206 DOI 10.17487/RFC7095, January 2014, 2207 . 2209 [RFC7159] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data 2210 Interchange Format", RFC 7159, DOI 10.17487/RFC7159, March 2211 2014, . 2213 [RFC7483] Newton, A. and S. Hollenbeck, "JSON Responses for the 2214 Registration Data Access Protocol (RDAP)", RFC 7483, 2215 DOI 10.17487/RFC7483, March 2015, 2216 . 2218 Appendix A. Acknowledgements 2220 Bernhard Reutner-Fischer and participants of the IETF REGEXT mailing 2221 list contributed to the JCR found in this document. 2223 Mario Laffredo provided significant feedback on the rulesets in this 2224 document, especially with regard to jCard validation, and provided 2225 helpful guidance on validation based on his own experience with the 2226 implementation of an RDAP validator. 2228 Author's Address 2230 Andrew Lee Newton 2231 American Registry for Internet Numbers 2232 3635 Concorde Parkway 2233 Chantilly, VA 20151 2234 US 2236 Email: andy@arin.net 2237 URI: http://www.arin.net