Skip to content

Regression in 2.2.0 when parsing vcard phone numbers #905

@kesselb

Description

@kesselb

Users of Nextcloud Calendar reported that after upgrading to 7.2.0 (with ical.js 2.2.0) for some contacts the phone numbers are missing: nextcloud/contacts#4564.

I can confirm that problem with the provided sample vcard:

BEGIN:VCARD
VERSION:3.0
N:Name;1. Vorname;2. Vorname;;
FN:1. Vorname Name
ADR;TYPE=HOME:;;...;....;;....;
TEL;TYPE=WORK;VALUE=UNKNOWN:+49 162 1234567
TEL;TYPE=HOME;VALUE=UNKNOWN:+49 30 12345678
TEL;TYPE=work:+49 30 123456
TEL;TYPE=home:+49 30 1234567
X-MOZILLA-HTML:FALSE
EMAIL;TYPE=WORK:[email protected]
REV:20220109T132031Z
CATEGORIES:A,B,C
ORG:Company;
END:VCARD

For displaying the phone numbers, we rely on property.getDefaultType() which returns "uri" for ical.js 2.1.0, but "unknown" for ical.js 2.2.0. That looks like a regression of #680. The tel property seems missing in the vcard3 design set. I'm seeing a definition in the code though (

tel: { defaultType: "phone-number" },
) and therefore find it a bit surprising to miss the tel property 🤷

ical.js 2.2.0 designSet

{
  "name": "vcard3",
  "value": {
    "binary": {},
    "date": {},
    "date-time": {},
    "phone-number": {},
    "uri": {},
    "text": {
      "matches": {}
    },
    "time": {},
    "vcard": {
      "matches": {}
    },
    "utc-offset": {},
    "boolean": {
      "values": [
        "TRUE",
        "FALSE"
      ]
    },
    "float": {
      "matches": {}
    },
    "integer": {}
  },
  "param": {
    "type": {
      "valueType": "text",
      "multiValue": ",",
      "multiValueSeparateDQuote": false
    },
    "value": {
      "values": [
        "text",
        "uri",
        "date",
        "date-time",
        "phone-number",
        "time",
        "boolean",
        "integer",
        "float",
        "utc-offset",
        "vcard",
        "binary"
      ],
      "allowXName": true,
      "allowIanaToken": true
    }
  },
  "property": {
    "fn": {
      "defaultType": "text"
    },
    "n": {
      "defaultType": "text",
      "structuredValue": ";",
      "multiValue": ","
    },
    "nickname": {
      "defaultType": "text",
      "multiValue": ","
    },
    "photo": {
      "defaultType": "binary",
      "allowedTypes": [
        "binary",
        "uri"
      ]
    },
    "bday": {
      "defaultType": "date-time",
      "allowedTypes": [
        "date-time",
        "date"
      ]
    },
    "adr": {
      "defaultType": "text",
      "structuredValue": ";",
      "multiValue": ","
    },
    "label": {
      "defaultType": "text"
    },
    "email": {
      "defaultType": "text"
    },
    "mailer": {
      "defaultType": "text"
    },
    "tz": {
      "defaultType": "utc-offset",
      "allowedTypes": [
        "utc-offset",
        "text"
      ]
    },
    "geo": {
      "defaultType": "float",
      "structuredValue": ";"
    },
    "title": {
      "defaultType": "text"
    },
    "role": {
      "defaultType": "text"
    },
    "logo": {
      "defaultType": "binary",
      "allowedTypes": [
        "binary",
        "uri"
      ]
    },
    "agent": {
      "defaultType": "vcard",
      "allowedTypes": [
        "vcard",
        "text",
        "uri"
      ]
    },
    "org": {
      "defaultType": "text",
      "structuredValue": ";"
    },
    "note": {
      "defaultType": "text",
      "multiValue": ","
    },
    "prodid": {
      "defaultType": "text"
    },
    "rev": {
      "defaultType": "date-time",
      "allowedTypes": [
        "date-time",
        "date"
      ]
    },
    "sort-string": {
      "defaultType": "text"
    },
    "sound": {
      "defaultType": "binary",
      "allowedTypes": [
        "binary",
        "uri"
      ]
    },
    "class": {
      "defaultType": "text"
    },
    "key": {
      "defaultType": "binary",
      "allowedTypes": [
        "binary",
        "text"
      ]
    },
    "categories": {
      "defaultType": "text",
      "multiValue": ","
    },
    "url": {
      "defaultType": "uri"
    },
    "version": {
      "defaultType": "text"
    },
    "uid": {
      "defaultType": "text"
    }
  },
  "propertyGroups": true
}

ical 2.1.0 designSet

{
  "value": {
    "text": {
      "matches": {}
    },
    "uri": {
      "matches": {}
    },
    "date": {},
    "time": {},
    "date-time": {},
    "date-and-or-time": {},
    "timestamp": {},
    "language-tag": {
      "matches": {}
    },
    "phone-number": {},
    "boolean": {
      "values": [
        "TRUE",
        "FALSE"
      ]
    },
    "float": {
      "matches": {}
    },
    "integer": {},
    "utc-offset": {}
  },
  "param": {
    "type": {
      "valueType": "text",
      "multiValue": ",",
      "multiValueSeparateDQuote": false
    },
    "value": {
      "values": [
        "text",
        "uri",
        "date",
        "time",
        "date-time",
        "date-and-or-time",
        "timestamp",
        "boolean",
        "integer",
        "float",
        "utc-offset",
        "language-tag"
      ],
      "allowXName": true,
      "allowIanaToken": true
    }
  },
  "property": {
    "adr": {
      "defaultType": "text",
      "structuredValue": ";",
      "multiValue": ","
    },
    "anniversary": {
      "defaultType": "date-and-or-time",
      "allowedTypes": [
        "date-time",
        "date",
        "text"
      ]
    },
    "bday": {
      "defaultType": "date-and-or-time",
      "allowedTypes": [
        "date-time",
        "date",
        "text"
      ]
    },
    "caladruri": {
      "defaultType": "uri"
    },
    "caluri": {
      "defaultType": "uri"
    },
    "clientpidmap": {
      "defaultType": "text",
      "structuredValue": ";"
    },
    "email": {
      "defaultType": "text"
    },
    "fburl": {
      "defaultType": "uri"
    },
    "fn": {
      "defaultType": "text"
    },
    "gender": {
      "defaultType": "text",
      "structuredValue": ";"
    },
    "geo": {
      "defaultType": "uri"
    },
    "impp": {
      "defaultType": "uri"
    },
    "key": {
      "defaultType": "uri"
    },
    "kind": {
      "defaultType": "text"
    },
    "lang": {
      "defaultType": "language-tag"
    },
    "logo": {
      "defaultType": "uri"
    },
    "member": {
      "defaultType": "uri"
    },
    "n": {
      "defaultType": "text",
      "structuredValue": ";",
      "multiValue": ","
    },
    "nickname": {
      "defaultType": "text",
      "multiValue": ","
    },
    "note": {
      "defaultType": "text"
    },
    "org": {
      "defaultType": "text",
      "structuredValue": ";"
    },
    "photo": {
      "defaultType": "uri"
    },
    "related": {
      "defaultType": "uri"
    },
    "rev": {
      "defaultType": "timestamp"
    },
    "role": {
      "defaultType": "text"
    },
    "sound": {
      "defaultType": "uri"
    },
    "source": {
      "defaultType": "uri"
    },
    "tel": {
      "defaultType": "uri",
      "allowedTypes": [
        "uri",
        "text"
      ]
    },
    "title": {
      "defaultType": "text"
    },
    "tz": {
      "defaultType": "text",
      "allowedTypes": [
        "text",
        "utc-offset",
        "uri"
      ]
    },
    "xml": {
      "defaultType": "text"
    },
    "categories": {
      "defaultType": "text",
      "multiValue": ","
    },
    "url": {
      "defaultType": "uri"
    },
    "version": {
      "defaultType": "text"
    },
    "uid": {
      "defaultType": "text"
    }
  },
  "propertyGroups": true
}

Contacts 7.2.0 with ical.js 2.2.0

Image

Contacts 7.2.0 with ical.js 2.1.0

Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions