From orie@transmute.industries  Fri Apr 12 08:06:38 2024
Return-Path: <orie@transmute.industries>
X-Original-To: jmap@ietfa.amsl.com
Delivered-To: jmap@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1])
 by ietfa.amsl.com (Postfix) with ESMTP id 152CDC14F68F
 for <jmap@ietfa.amsl.com>; Fri, 12 Apr 2024 08:06:38 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.096
X-Spam-Level: 
X-Spam-Status: No, score=-2.096 tagged_above=-999 required=5
 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1,
 DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001,
 RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_ZEN_BLOCKED_OPENDNS=0.001,
 SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_DBL_BLOCKED_OPENDNS=0.001,
 URIBL_ZEN_BLOCKED_OPENDNS=0.001]
 autolearn=unavailable autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key)
 header.d=transmute.industries
Received: from mail.ietf.org ([50.223.129.194])
 by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id sLVH1Rj8N4-U for <jmap@ietfa.amsl.com>;
 Fri, 12 Apr 2024 08:06:33 -0700 (PDT)
Received: from mail-pg1-x529.google.com (mail-pg1-x529.google.com
 [IPv6:2607:f8b0:4864:20::529])
 (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)
 key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256)
 (No client certificate requested)
 by ietfa.amsl.com (Postfix) with ESMTPS id B9D25C14F6AA
 for <jmap@ietf.org>; Fri, 12 Apr 2024 08:06:33 -0700 (PDT)
Received: by mail-pg1-x529.google.com with SMTP id
 41be03b00d2f7-5e8470c1cb7so731017a12.2
 for <jmap@ietf.org>; Fri, 12 Apr 2024 08:06:33 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=transmute.industries; s=google; t=1712934393; x=1713539193; darn=ietf.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=qnpV/Ce4RLhlwWXZ0xOPC/1FWwJcHefgITWzr6g24Uc=;
 b=Kk3K9ZgDd7s99Lo56SQeysBDf1b9Az3izUzE3ezSscLRZNUpDnMSRW73qCjOZdXXh+
 KJRskJWRBT4KMReiHdG6bhd/pzWNiekfkpWIhvmxo3oRcQdSFXjK55fHC0Mm9wDDuKiw
 a7bBiqZNWGX56vyZ1IPvYJpwn5CAvppDTFDgvOGOlT0ghRrDZddC5pbkg3CvmSTfCZXs
 qCQTRDfaGZ/a890lkhX1DJzvtIHCV7Swi8+aANMF7xH84Q5iCEQRuxhITb4qnujB7Ntm
 cAlPaJql7jZcEgm+ug8t6zvjN/3p5pwQVejaSQNES/UJ+zy3fw0X4aDPdvjdwsmxdxsN
 A0eQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1712934393; x=1713539193;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id
 :reply-to;
 bh=qnpV/Ce4RLhlwWXZ0xOPC/1FWwJcHefgITWzr6g24Uc=;
 b=UbHkm1mEldlzuGWBkU/P0Dv49pBiTg2vAw48QtRLCYH1Da+GduFbdX7SEK64Ap+FNB
 9fHd4sqQQQUeLwrpnTGjNAuyW9g8VaQrLuQlEyOYGfbCD4HtCCq7QJE+K5nn52Q2ko6N
 mIpDa/8G+KOaWMy3ow1IshAW1GKBuJ5A2mZx3w4aCGbBXtz/60RpXemnBp91nDIqra2u
 C54uu2D5+NKtfPYnPK43u0eJKGWNS6iRLRHY9EWCaiCnYzrupOQJD1WbVehx+g79X8+U
 7gKyX09duaUtV1fpSFYt6XPKBjz7HHquzsrTRDQPs9ecjll/s3Zb8KgDaZmjz5MUdM76
 9vmw==
X-Forwarded-Encrypted: i=1;
 AJvYcCV4/pGgpt6fhKG/PqLLu8frIf8YAX+CqcOHG398I5E0tZiJcPDBEow4oVER8ra9JN7MZZkN5iQq+EHilWh+
X-Gm-Message-State: AOJu0YxChk97I6e7VB/b0EMX485W+2/ZsozCjLjNPvSmP6siNQAETw6U
 zVbeAAt0eBY4Z7Q6BNIPDDegNaz+w5azL6ZBMoVZ1g1NoagxOWlWNLojVNeCT4kh9IP6GDPNTyQ
 /NOwSBc7RHWvCQXEWOv57hz4fGFhFr47MiwKA3w==
X-Google-Smtp-Source: AGHT+IGzaEbNRc9aX6Xxbzdn/pOd7GYTt1fvmUNnVWbN5/Nvk0veJvvApjSP0JJ6IoCx7kZJTwvWAZHwf0WKqRuZTV8=
X-Received: by 2002:a17:90b:3b48:b0:2a2:8ed7:da34 with SMTP id
 ot8-20020a17090b3b4800b002a28ed7da34mr2599375pjb.1.1712934392818; Fri, 12 Apr
 2024 08:06:32 -0700 (PDT)
MIME-Version: 1.0
References: <171261811964.2420.13803806575481214175@ietfa.amsl.com>
 <029d16f4-4f5a-49da-ad5f-2a0f538f9d9d@dogfoodapp.fastmail.com>
In-Reply-To: <029d16f4-4f5a-49da-ad5f-2a0f538f9d9d@dogfoodapp.fastmail.com>
From: Orie Steele <orie@transmute.industries>
Date: Fri, 12 Apr 2024 10:06:21 -0500
Message-ID: <CAN8C-_J6NkaA+Lp495o+=so_GKdheaZuW5iWtPTaGLX=RXC0Qg@mail.gmail.com>
To: Neil Jenkins <neilj@fastmailteam.com>
Cc: iesg <iesg@ietf.org>, draft-ietf-jmap-sharing@ietf.org,
 jmap-chairs@ietf.org, 
 IETF JMAP Mailing List <jmap@ietf.org>, Bron Gondwana <brong@fastmailteam.com>,
 arnt.gulbrandsen@icann.org
Content-Type: multipart/alternative; boundary="000000000000020d780615e79ee9"
Archived-At: <https://mailarchive.ietf.org/arch/msg/jmap/JLX1pJPLi0p31SMAdUr5tWJHmhQ>
Subject: Re: [Jmap] Orie Steele's Discuss on draft-ietf-jmap-sharing-07:
 (with DISCUSS and COMMENT)
X-BeenThere: jmap@ietf.org
X-Mailman-Version: 2.1.39
Precedence: list
List-Id: JSON Message Access Protocol <jmap.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/jmap>,
 <mailto:jmap-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/jmap/>
List-Post: <mailto:jmap@ietf.org>
List-Help: <mailto:jmap-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/jmap>,
 <mailto:jmap-request@ietf.org?subject=subscribe>
X-List-Received-Date: Fri, 12 Apr 2024 15:06:38 -0000

--000000000000020d780615e79ee9
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Hi Neil,

Thanks for your updates, there are is only 1 remaining discussion point,
which will repeat here:

" The server MAY limit the maximum number of notifications it will ..." -
denial of service / resource exhaustion ?

See comments inline for the rest:

On Thu, Apr 11, 2024 at 10:12=E2=80=AFPM Neil Jenkins <neilj@fastmailteam.c=
om>
wrote:

> Hi Orie,
>
> Thank you for your review. I have published an updated draft
> <https://www.ietf.org/archive/id/draft-ietf-jmap-sharing-08.html>
> addressing your comments, as detailed below.
>
> The repeated '*' make this section difficult to read, I initially assumed
> this
> syntax indicated the field is not optional.
>
> After reviewing RFC8620, it seems to simply be a "bolding" / "emphasis"
> effect.
>
>
> That's correct. In the HTML version of the document I think this makes it
> clearer, but in the plain text version I agree it's more confusing. I wou=
ld
> probably defer to whatever the RFC Editors think is the best option here.
> (Ideally in my mind, it keeps the bold for the HTML version but doesn't
> wrap it in the asterisks for the plain text, if that's possible.)
>
> This section (and similar ones) contain many instances of "String" which =
is
> defined in https://datatracker.ietf.org/doc/html/rfc8620#section-1.1
>
> As has been discussed on the list regarding a related document:
> https://mailarchive.ietf.org/arch/msg/jmap/nEumbk7DKcV6AOg6q-7yD_qetU0/
>
> Unicode / i18n processing of these fields is possibly non trivial...
> The document would be greatly improved by a section commenting on what
> kinds of
> JSON Strings / UTF-8 strings must remain supported. Examples in an append=
ix
> demonstrating interesting edge cases / unicode characters might help.
>
>
> I have added an Internationalisation Considerations section, with the
> following text:
>
> Experience has shown that unrestricted use of Unicode can lead to problem=
s
> such as inconsistent rendering, users reading text and interpreting it
> differently than intended, and unexpected results when copying text from
> one location to another. Servers MAY choose to mitigate this by restricti=
ng
> the set of characters allowed in otherwise unconstrained String fields.
> The FreeformClass, as documented in [RFC7564
> <https://author-tools.ietf.org/api/export/75dc1bfd-a43e-4f48-a1e9-9622161=
dd7aa/sharing.html#RFC7564>
> ], Section 4.3 <https://rfc-editor.org/rfc/rfc7564#section-4.3> may be a
> good starting point for this.
>
> Attempts to set a value containing code points outside of the permissible
> set can be handled in a few ways by the server. The first option is to
> simply strip the forbidden characters and store the resulting string. Thi=
s
> is likely to be appropriate for control characters for example, where the=
y
> can end up in data accidentally due to copy-and-paste issues, and are
> probably invisible to the end user. JMAP allows the server to transform
> data on create/update, as long as any changed properties are returned to
> the client in the /set response, so it knows what has changed, as per [
> RFC8620
> <https://author-tools.ietf.org/api/export/75dc1bfd-a43e-4f48-a1e9-9622161=
dd7aa/sharing.html#RFC8620>
> ], Section 5.3 <https://rfc-editor.org/rfc/rfc8620#section-5.3>.
> Alternatively, the server MAY just reject the create/update with an
> invalidProperties SetError.
>

"Section 4.3 may be a good starting point for this." -> "Section 4.3 might
be a good starting point for this."

It's a nit, but "might be..." avoids the lower case "may".

Thanks for adding this section, it addresses most of my discuss.


> ```
> 310        *  *accountIds*: String[]
> 311           A list of account ids.  The Principal matches if any of the
> ids in
> 312           this list are keys in the Principal's "accounts" property
> (i.e.,
> 313           if any of the account ids belong to the principal).
> ```
>
> Should this not be Id[] ? Is full UTF-8 equality check expected here?
>
>
> It should indeed be Id[], thanks for spotting, I've fixed this.
>
> ```
> 354        The server MAY limit the maximum number of notifications it wi=
ll
> 355        store for a user.  When the limit is reached, any new
> notification
> 356        will cause the previously oldest notification to be
> automatically
> 357        deleted.
> ```
>
> Why not SHOULD or MUST? What happens if there is no limit?
>
>
> You could end up with a lot of notifications. This is not necessarily a
> problem as long as your server and client are well architected. The point
> of this text was mainly to make it permissible for servers to choose not =
to
> store all the notifications if it thinks it's not required.
>

My concern was denial of service / resource exhaustion.
I'd prefer a "SHOULD, unless" framing instead of MAY here, but it's up to
you.


>
> ```
> 359        The server MAY coalesce notifications if appropriate, or remov=
e
> 360        notifications that it deems are no longer relevant or after a
> certain
> 361        period of time.  The server SHOULD automatically destroy a
> 362        notification about an object if the user subscribes to that
> object.
> ```
> Why not MUST? Should 362 say "unsubscribes" ?
>
>
> The original intention here was "subscribe" =E2=80=94 if the notification=
 was
> telling you that you now have access to an object and the user subscribes
> to it, they know it exists and so don't need the notification. Upon
> reflection though, I think this is more something a user presentation
> issue, and something a client should handle (when subscribing, it could
> choose to destroy the notification), so I have just removed this sentence=
.
>

Thanks.


>
> ```
> 439        *  *objectAccountId*: String
> 440           The objectAccountId value must be identical to the given
> value to
> 441           match the condition.
> ```
>
> Should this be `*objectAccountId*: Id` ?
>
>
> Yes, thanks. Fixed.
>
> ```
> 173        The server MAY reject the user's attempt to subscribe to some
> 174        resources even if they have permission to access them, e.g., a
> 175        calendar representing a location.
> ```
>
> Can this be strengthened to a SHOULD with clear conditions for when the
> server
> MUST allow subscription?
>
>
> Not really, it's dependent on the implementation. For example, with JMAP
> calendars, the client MUST be allowed to set their own sort order and a f=
ew
> other properties on subscribed calendars, so if the server can't support
> this for some calendars (e.g. a calendar representing a room that's
> actually auto-generated from another backend booking system) it must reje=
ct
> the subscription attempt. While the calendars spec also notes the server
> may reject the subscription, I think it's worth having up front as a
> general thing here too so they can't be seen as in conflict.
>

Ok.


>
> ```
> 177        A user may query the set of Principals they have access to wit=
h
> 178        "Principal/query" (see Section 2.4).  The Principal object may
> then
> 179        provide Account objects if the user has permission to access
> data for
> 180        that principal, even if they are not yet subscribed.
> ```
>
> Can this be strengthened with normative language?
> For example:
> The Principle object MUST contain / provide when...
> The Principle object MUST NOT contain / provide when...
>
>
> I have rewritten this as:
>
> *The Principal object will contain an Account object for all accounts
> where the user has permission to access data for that principal, even if
> they are not yet subscribed.*
>
> I don't think the normative MUST is appropriate here as this is simply a
> statement of the structure of the object. It should avoid any hint that
> there is any kind of choice here!
>

Thanks.


>
> ```
> 295        However, the server may reject this change, and probably will
> reject
> 296        any other change, with a forbidden SetError.  Managing
> principals is
> 297        likely tied to a directory service or some other vendor-specif=
ic
> 298        solution, and may occur out-of-band, or via an additional
> capability
> 299        defined elsewhere.
> ```
>
> Can this language be strengthened?
>
> For example: When the server rejects updates it MUST use a SetError of ty=
pe
> forbidden as described in Section 5.3 of RFC8620.
>
>
> I have rewritten this as:
>
> *Managing principals is likely tied to a directory service or some other
> vendor-specific solution and may occur out-of-band, or via an additional
> capability defined elsewhere. Allowing direct user modification of
> properties has security considerations, as noted in **Section 5*
> <https://author-tools.ietf.org/api/export/f6ba9860-9013-488b-8553-0f520ec=
cc727/sharing.html#security-considerations>*.
> Servers MUST reject any change it doesn=E2=80=99t allow with a **forbidde=
n**
> SetError.*
>

Thanks.


>
>
> ```
> 314        *  *email*: String
> 315           Looks for the text in the email property.
> ```
>
> I suggest a stronger reference for IDNA compatible email identifiers.
> There are many combinations of unicode characters that will not result in=
 a
> valid email address. Consider:
> https://datatracker.ietf.org/doc/html/rfc6531 If
> this field is not required to be a well formed email (possibly one build
> of an
> IDNA), perhaps note that directly.
>
>
> I have added to the "email" property definition:
>
> *If given, the value MUST be conform with the "addr-spec" syntax, as
> defined in **[**RFC5322*
> <https://author-tools.ietf.org/api/export/4a43b11b-ad50-4bc3-90cd-0c00e02=
ce767/sharing.html#RFC5322>*],
> **Section 3.4.1* <https://rfc-editor.org/rfc/rfc5322#section-3.4.1>*.*
>

This reads awkwardly, I suggest:

If present, the value MUST conform to the "addr-spec" syntax, as defined
in [RFC5322
<https://author-tools.ietf.org/api/export/4a43b11b-ad50-4bc3-90cd-0c00e02ce=
767/sharing.html#RFC5322>
], Section 3.4.1 <https://rfc-editor.org/rfc/rfc5322#section-3.4.1>.


>
> ```
> 318        *  *text* String
> 319           Looks for the text in the name, email, and description
> properties.
> ```
>
> The use of the word text is slightly misleading here without inclusion of
> the
> charset, since strictly speaking this is filtering on octets (encoding so=
me
> UTF-8 string), correct?
>
> Thanks to Yaron Sheffer for his comments to this effect in the SEC DIR
> review.
>
>
> I have updated this wording to address Yaron's comments.
>

Thanks


>
> ```
> 347        The server SHOULD create a ShareNotification whenever the user=
's
> 348        permissions change on an object.  It SHOULD NOT create a
> notification
> 349        for permission changes to a group principal, even if the user
> is in
> 350        the group.
> ```
>
> Why not MUST? The way this is written, an implementation could easily
> decide to
> reverse these recommendations.
>
>
> The SHOULD is in recognition that this API is often going to be an
> interface onto an existing directory management system (unlike most other
> JMAP APIs, where we can be more proscriptive).
>

Ok.


>
> ```
> 614     5.  Security Considerations
> ```
>
> Please consider adding security considerations regarding deceptive use of
> unicode characters, perhaps drawing from previous work, for example from:
> https://datatracker.ietf.org/doc/html/rfc5894#section-1.4
>
> """
>    The introduction of the larger repertoire of characters
>    potentially makes the set of misspellings larger, especially given
>    that in some cases the same appearance, for example on a business
>    card, might visually match several Unicode code points or several
>    sequences of code points.
> """
>
>
> I have added into the security considerations:
>
> *Note that simply forbidding the use of a name already in the system is
> insufficient protection, as a malicious user could still change their nam=
e
> to something easily confused with the existing name by using trivial
> misspellings or visually similar unicode characters.*
>
>
Thanks

> ```
> 639        The set of principals within a shared environment SHOULD be
> strictly
> 640        controlled.  If adding a new principal is open to the public,
> risks
> 641        include:
> ```
>
> Why not MUST?
>
>
> This should be a MUST, I've changed it.
>
> Is consent from existing principles required or recommended when adding
> new principles?
>
>
> Not normally, no. Think of a standard office environment, where the
> principals correspond to employees.
>
> ## Nits
>
> ```
> 536        "u12345678": {
> 537            "name": "jane.doe@example.com"
> 538            "isPersonal": true
> 539            "isReadOnly": false
> 540            "accountCapabilities": {
> 541                "urn:com.example:jmap:todo": {},
> 542                "urn:ietf:params:jmap:principals:owner": {
> 543                    accountIdForPrincipal: "u33084183",
> 544                    principalId: "P105aga511jaa"
> 545                }
> 546            }
> 547        }
> ```
>
> This example is malformed JSON. accountIdForPrincipal and principalId are
> missing quotes, and the there is no indication of elision, consider
> starting
> with { ... "u12345678": ... }
>
>
> Thanks, I've fixed this.
>
> Its also strange that "name" is an email in this example
>
>
> I used this because the account name is most commonly the email address o=
f
> the owner of the account.
>

Ok


>
> Cheers,
> Neil.
>


--=20


OS, ART AD

--000000000000020d780615e79ee9
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div>Hi Neil,<br><br>Thanks for your updates, there are is=
 only 1 remaining discussion point, which will repeat here:<br><br>&quot; T=
he server MAY limit the maximum number of notifications it will ...&quot; -=
 denial=C2=A0of service / resource exhaustion ?<br><br>See comments inline =
for the rest:</div><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D=
"gmail_attr">On Thu, Apr 11, 2024 at 10:12=E2=80=AFPM Neil Jenkins &lt;<a h=
ref=3D"mailto:neilj@fastmailteam.com">neilj@fastmailteam.com</a>&gt; wrote:=
<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8=
ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class=3D"m=
sg4988845756529120018"><u></u><div><div>Hi Orie,<br></div><div><br></div><d=
iv>Thank you for your review.=C2=A0I have <a href=3D"https://www.ietf.org/a=
rchive/id/draft-ietf-jmap-sharing-08.html" target=3D"_blank">published an u=
pdated draft</a> addressing your comments, as detailed below.<br></div><div=
><br></div><blockquote type=3D"cite" id=3D"m_4988845756529120018qt"><div>Th=
e repeated &#39;*&#39; make this section difficult to read, I initially ass=
umed this<br></div><div>syntax indicated the field is not optional.<br></di=
v><div><br></div><div>After reviewing RFC8620, it seems to simply be a &quo=
t;bolding&quot; / &quot;emphasis&quot; effect.<br></div></blockquote><div><=
br></div><div>That&#39;s correct. In the HTML version of the document I thi=
nk this makes it clearer, but in the plain text version I agree it&#39;s mo=
re confusing. I would probably defer to whatever the RFC Editors think is t=
he best option here. (Ideally in my mind, it keeps the bold for the HTML ve=
rsion but doesn&#39;t wrap it in the asterisks for the plain text, if that&=
#39;s possible.)<br></div><div><br></div><blockquote type=3D"cite" id=3D"m_=
4988845756529120018qt"><div>This section (and similar ones) contain many in=
stances of &quot;String&quot; which is<br></div><div>defined in=C2=A0<a hre=
f=3D"https://datatracker.ietf.org/doc/html/rfc8620#section-1.1" target=3D"_=
blank">https://datatracker.ietf.org/doc/html/rfc8620#section-1.1</a><br></d=
iv><div><br></div><div>As has been discussed on the list regarding a relate=
d document:<br></div><div><a href=3D"https://mailarchive.ietf.org/arch/msg/=
jmap/nEumbk7DKcV6AOg6q-7yD_qetU0/" target=3D"_blank">https://mailarchive.ie=
tf.org/arch/msg/jmap/nEumbk7DKcV6AOg6q-7yD_qetU0/</a><br></div><div><br></d=
iv><div>Unicode / i18n processing of these fields is possibly non trivial..=
.<br></div><div>The document would be greatly improved by a section comment=
ing on what kinds of<br></div><div>JSON Strings / UTF-8 strings must remain=
 supported. Examples in an appendix<br></div><div>demonstrating interesting=
 edge cases / unicode characters might help.<br></div></blockquote><div><br=
></div><div>I have added an Internationalisation Considerations section, wi=
th the following text:<br></div><div><br></div><div>Experience has shown th=
at unrestricted use of Unicode can lead to problems such as inconsistent re=
ndering, users reading text and interpreting it differently than intended, =
and unexpected results when copying text from one location to another. Serv=
ers MAY choose to mitigate this by restricting the set of characters allowe=
d in otherwise unconstrained<span>=C2=A0</span><code style=3D"background-co=
lor:rgb(248,248,248);font-size:13.3px">String</code><span>=C2=A0</span>fiel=
ds. The FreeformClass, as documented in<span>=C2=A0</span><span>[<a href=3D=
"https://author-tools.ietf.org/api/export/75dc1bfd-a43e-4f48-a1e9-9622161dd=
7aa/sharing.html#RFC7564" target=3D"_blank">RFC7564</a>],<span>=C2=A0</span=
><a href=3D"https://rfc-editor.org/rfc/rfc7564#section-4.3" target=3D"_blan=
k">Section 4.3</a></span><span>=C2=A0</span>may be a good starting point fo=
r this.<br></div><div><br></div><div>Attempts to set a value containing cod=
e points outside of the permissible set can be handled in a few ways by the=
 server. The first option is to simply strip the forbidden characters and s=
tore the resulting string. This is likely to be appropriate for control cha=
racters for example, where they can end up in data accidentally due to copy=
-and-paste issues, and are probably invisible to the end user. JMAP allows =
the server to transform data on create/update, as long as any changed prope=
rties are returned to the client in the<span>=C2=A0</span><code style=3D"bo=
rder-width:1px;border-style:solid;border-color:rgb(204,204,204);border-radi=
us:3px;background-color:rgb(246,246,246);background-repeat:repeat;backgroun=
d-image:none;background-size:auto;background-origin:padding-box;background-=
clip:border-box;font-family:menlo,consolas,monospace;font-size:90%;padding:=
1px 3px">/set</code><span>=C2=A0</span>response, so it knows what has chang=
ed, as per<span>=C2=A0</span><span>[<a href=3D"https://author-tools.ietf.or=
g/api/export/75dc1bfd-a43e-4f48-a1e9-9622161dd7aa/sharing.html#RFC8620" tar=
get=3D"_blank">RFC8620</a>],<span>=C2=A0</span><a href=3D"https://rfc-edito=
r.org/rfc/rfc8620#section-5.3" target=3D"_blank">Section 5.3</a></span>. Al=
ternatively, the server MAY just reject the create/update with an<span>=C2=
=A0</span><code style=3D"border-width:1px;border-style:solid;border-color:r=
gb(204,204,204);border-radius:3px;background-color:rgb(246,246,246);backgro=
und-repeat:repeat;background-image:none;background-size:auto;background-ori=
gin:padding-box;background-clip:border-box;font-family:menlo,consolas,monos=
pace;font-size:90%;padding:1px 3px">invalidProperties</code><span>=C2=A0</s=
pan>SetError.<br></div></div></div></blockquote><div><br></div><div>&quot;S=
ection 4.3 may be a good starting point for this.&quot; -&gt; &quot;Section=
 4.3 might be a good starting point for this.&quot;<br><br>It&#39;s a nit, =
but &quot;might be...&quot; avoids the lower case &quot;may&quot;.<br><br>T=
hanks for adding this section, it addresses most of my discuss.<br><br></di=
v><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;borde=
r-left:1px solid rgb(204,204,204);padding-left:1ex"><div class=3D"msg498884=
5756529120018"><div><div></div><div><br></div><blockquote type=3D"cite" id=
=3D"m_4988845756529120018qt"><div>```<br></div><div>310=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0 *=C2=A0 *accountIds*: String[]<br></div><div>311=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 A list of acco=
unt ids.=C2=A0 The Principal matches if any of the ids in<br></div><div>312=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 this list are =
keys in the Principal&#39;s &quot;accounts&quot; property (i.e.,<br></div><=
div>313=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if any =
of the account ids belong to the principal).<br></div><div>```<br></div><di=
v><br></div><div>Should this not be Id[] ? Is full UTF-8 equality check exp=
ected here?<br></div></blockquote><div><br></div><div>It should indeed be <=
code style=3D"border-width:1px;border-style:solid;border-color:rgb(204,204,=
204);border-radius:3px;background-color:rgb(246,246,246);background-repeat:=
repeat;background-image:none;background-size:auto;background-origin:padding=
-box;background-clip:border-box;font-family:menlo,consolas,monospace;font-s=
ize:90%;padding:1px 3px">Id[]</code>, thanks for spotting, I&#39;ve fixed t=
his.<br></div><div><br></div><blockquote type=3D"cite" id=3D"m_498884575652=
9120018qt"><div>```<br></div><div>354=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0 The server MAY limit the maximum number of notifications it will<br>=
</div><div>355=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 store for a user.=
=C2=A0 When the limit is reached, any new notification<br></div><div>356=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 will cause the previously oldest no=
tification to be automatically<br></div><div>357=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 deleted.<br></div><div>```<br></div><div><br></div><div>Why=
 not SHOULD or MUST? What happens if there is no limit?<br></div></blockquo=
te><div><br></div><div>You could end up with a lot of notifications. This i=
s not necessarily a problem as long as your server and client are well arch=
itected. The point of this text was mainly to make it permissible for serve=
rs to choose not to store all the notifications if it thinks it&#39;s not r=
equired.<br></div></div></div></blockquote><div><br>My concern was denial o=
f service / resource exhaustion.<br>I&#39;d prefer a &quot;SHOULD, unless&q=
uot; framing instead of MAY here, but it&#39;s up to you.<br>=C2=A0</div><b=
lockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-le=
ft:1px solid rgb(204,204,204);padding-left:1ex"><div class=3D"msg4988845756=
529120018"><div><div></div><div><br></div><blockquote type=3D"cite" id=3D"m=
_4988845756529120018qt"><div>```<br></div><div>359=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 The server MAY coalesce notifications if appropriate, or=
 remove<br></div><div>360=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 notific=
ations that it deems are no longer relevant or after a certain<br></div><di=
v>361=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 period of time.=C2=A0 The s=
erver SHOULD automatically destroy a<br></div><div>362=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 notification about an object if the user subscribes t=
o that object.<br></div><div>```<br></div><div>Why not MUST? Should 362 say=
 &quot;unsubscribes&quot; ?<br></div></blockquote><div><br></div><div>The o=
riginal intention here was &quot;subscribe&quot; =E2=80=94 if the notificat=
ion was telling you that you now have access to an object and the user subs=
cribes to it, they know it exists and so don&#39;t need the notification. U=
pon reflection though, I think this is more something a user presentation i=
ssue, and something a client should handle (when subscribing, it could choo=
se to destroy the notification), so I have just removed this sentence.<br><=
/div></div></div></blockquote><div><br>Thanks.<br>=C2=A0</div><blockquote c=
lass=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px soli=
d rgb(204,204,204);padding-left:1ex"><div class=3D"msg4988845756529120018">=
<div><div></div><div><br></div><blockquote type=3D"cite" id=3D"m_4988845756=
529120018qt"><div>```<br></div><div>439=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0 *=C2=A0 *objectAccountId*: String<br></div><div>440=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 The objectAccountId value mus=
t be identical to the given value to<br></div><div>441=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 match the condition.<br></div><div>=
```<br></div><div><br></div><div>Should this be `*objectAccountId*: Id` ?<b=
r></div></blockquote><div><br></div><div>Yes, thanks. Fixed.<br></div><div>=
<br></div><blockquote type=3D"cite" id=3D"m_4988845756529120018qt"><div>```=
<br></div><div>173=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 The server MAY=
 reject the user&#39;s attempt to subscribe to some<br></div><div>174=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 resources even if they have permission=
 to access them, e.g., a<br></div><div>175=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 calendar representing a location.<br></div><div>```<br></div><div=
><br></div><div>Can this be strengthened to a SHOULD with clear conditions =
for when the server<br></div><div>MUST allow subscription?<br></div></block=
quote><div><br></div><div>Not really, it&#39;s dependent on the implementat=
ion. For example, with JMAP calendars, the client MUST be allowed to set th=
eir own sort order and a few other properties on subscribed calendars, so i=
f the server can&#39;t support this for some calendars (e.g. a calendar rep=
resenting a room that&#39;s actually auto-generated from another backend bo=
oking system) it must reject the subscription attempt. While the calendars =
spec also notes the server may reject the subscription, I think it&#39;s wo=
rth having up front as a general thing here too so they can&#39;t be seen a=
s in conflict.<br></div></div></div></blockquote><div><br></div><div>Ok.</d=
iv><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0=
px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div =
class=3D"msg4988845756529120018"><div><div></div><div><br></div><blockquote=
 type=3D"cite" id=3D"m_4988845756529120018qt"><div>```<br></div><div>177=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 A user may query the set of Princip=
als they have access to with<br></div><div>178=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 &quot;Principal/query&quot; (see Section 2.4).=C2=A0 The Pr=
incipal object may then<br></div><div>179=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 provide Account objects if the user has permission to access data=
 for<br></div><div>180=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 that princ=
ipal, even if they are not yet subscribed.<br></div><div>```<br></div><div>=
<br></div><div>Can this be strengthened with normative language?<br></div><=
div>For example:<br></div><div>The Principle object MUST contain / provide =
when...<br></div><div>The Principle object MUST NOT contain / provide when.=
..<br></div></blockquote><div><br></div><div>I have rewritten this as:<br><=
/div><div><br></div><div><i>The Principal object will contain an Account ob=
ject for all accounts where the user has permission to access data for that=
 principal, even if they are not yet subscribed.</i><br></div><div><br></di=
v><div>I don&#39;t think the normative MUST is appropriate here as this is =
simply a statement of the structure of the object. It should avoid any hint=
 that there is any kind of choice here!<br></div></div></div></blockquote><=
div><br></div><div>Thanks.</div><div>=C2=A0</div><blockquote class=3D"gmail=
_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204=
,204);padding-left:1ex"><div class=3D"msg4988845756529120018"><div><div></d=
iv><div><br></div><blockquote type=3D"cite" id=3D"m_4988845756529120018qt">=
<div>```<br></div><div>295=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Howeve=
r, the server may reject this change, and probably will reject<br></div><di=
v>296=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 any other change, with a fo=
rbidden SetError.=C2=A0 Managing principals is<br></div><div>297=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 likely tied to a directory service or som=
e other vendor-specific<br></div><div>298=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 solution, and may occur out-of-band, or via an additional capabil=
ity<br></div><div>299=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 defined els=
ewhere.<br></div><div>```<br></div><div><br></div><div>Can this language be=
 strengthened?<br></div><div><br></div><div>For example: When the server re=
jects updates it MUST use a SetError of type<br></div><div>forbidden as des=
cribed in Section 5.3 of RFC8620.<br></div></blockquote><div><br></div><div=
>I have rewritten this as:<br></div><div><br></div><div><i>Managing princip=
als is likely tied to a directory service or some other=20
vendor-specific solution and may occur out-of-band, or via an additional
 capability defined elsewhere. Allowing direct user modification of=20
properties has security considerations, as noted in </i><a href=3D"https://=
author-tools.ietf.org/api/export/f6ba9860-9013-488b-8553-0f520eccc727/shari=
ng.html#security-considerations" target=3D"_blank"><i>Section 5</i></a><i>.=
 Servers MUST reject any change it doesn=E2=80=99t allow with a </i><code><=
i>forbidden</i></code><i> SetError.</i></div></div></div></blockquote><div>=
<br>Thanks.<br>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margi=
n:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex=
"><div class=3D"msg4988845756529120018"><div><div><br></div><div><br></div>=
<blockquote type=3D"cite" id=3D"m_4988845756529120018qt"><div>```<br></div>=
<div>314=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 *=C2=A0 *email*: String<=
br></div><div>315=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0 Looks for the text in the email property.<br></div><div>```<br></div><d=
iv><br></div><div>I suggest a stronger reference for IDNA compatible email =
identifiers.<br></div><div>There are many combinations of unicode character=
s that will not result in a<br></div><div>valid email address. Consider:=C2=
=A0<a href=3D"https://datatracker.ietf.org/doc/html/rfc6531" target=3D"_bla=
nk">https://datatracker.ietf.org/doc/html/rfc6531</a> If<br></div><div>this=
 field is not required to be a well formed email (possibly one build of an<=
br></div><div>IDNA), perhaps note that directly.<br></div></blockquote><div=
><br></div><div>I have added to the &quot;email&quot; property definition:<=
br></div><div><br></div><div><i>If given, the value MUST be conform with th=
e &quot;addr-spec&quot; syntax, as defined in </i><span><i>[</i><a href=3D"=
https://author-tools.ietf.org/api/export/4a43b11b-ad50-4bc3-90cd-0c00e02ce7=
67/sharing.html#RFC5322" target=3D"_blank"><i>RFC5322</i></a><i>], </i><a h=
ref=3D"https://rfc-editor.org/rfc/rfc5322#section-3.4.1" target=3D"_blank">=
<i>Section 3.4.1</i></a></span><i>.</i></div></div></div></blockquote><div>=
<br>This reads awkwardly, I suggest:<br><br>If present, the value MUST conf=
orm to the &quot;addr-spec&quot; syntax, as defined in=C2=A0[<a href=3D"htt=
ps://author-tools.ietf.org/api/export/4a43b11b-ad50-4bc3-90cd-0c00e02ce767/=
sharing.html#RFC5322" target=3D"_blank">RFC5322</a>],=C2=A0<a href=3D"https=
://rfc-editor.org/rfc/rfc5322#section-3.4.1" target=3D"_blank">Section 3.4.=
1</a>.<br><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0=
px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div =
class=3D"msg4988845756529120018"><div><div><br></div><div><br></div><blockq=
uote type=3D"cite" id=3D"m_4988845756529120018qt"><div>```<br></div><div>31=
8=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 *=C2=A0 *text* String<br></div>=
<div>319=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Looks =
for the text in the name, email, and description properties.<br></div><div>=
```<br></div><div><br></div><div>The use of the word text is slightly misle=
ading here without inclusion of the<br></div><div>charset, since strictly s=
peaking this is filtering on octets (encoding some<br></div><div>UTF-8 stri=
ng), correct?<br></div><div><br></div><div>Thanks to Yaron Sheffer for his =
comments to this effect in the SEC DIR review.<br></div></blockquote><div><=
br></div><div>I have updated this wording to address Yaron&#39;s comments.<=
br></div></div></div></blockquote><div><br>Thanks<br>=C2=A0</div><blockquot=
e class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px s=
olid rgb(204,204,204);padding-left:1ex"><div class=3D"msg498884575652912001=
8"><div><div></div><div><br></div><blockquote type=3D"cite" id=3D"m_4988845=
756529120018qt"><div>```<br></div><div>347=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 The server SHOULD create a ShareNotification whenever the user&#3=
9;s<br></div><div>348=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 permissions=
 change on an object.=C2=A0 It SHOULD NOT create a notification<br></div><d=
iv>349=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 for permission changes to =
a group principal, even if the user is in<br></div><div>350=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0 the group.<br></div><div>```<br></div><div><br>=
</div><div>Why not MUST? The way this is written, an implementation could e=
asily decide to<br></div><div>reverse these recommendations.<br></div></blo=
ckquote><div><br></div><div>The SHOULD is in recognition that this API is o=
ften going to be an interface onto an existing directory management system =
(unlike most other JMAP APIs, where we can be more proscriptive).<br></div>=
</div></div></blockquote><div><br>Ok.<br>=C2=A0</div><blockquote class=3D"g=
mail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204=
,204,204);padding-left:1ex"><div class=3D"msg4988845756529120018"><div><div=
></div><div><br></div><blockquote type=3D"cite" id=3D"m_4988845756529120018=
qt"><div>```<br></div><div>614=C2=A0=C2=A0=C2=A0=C2=A0 5.=C2=A0 Security Co=
nsiderations<br></div><div>```<br></div><div><br></div><div>Please consider=
 adding security considerations regarding deceptive use of<br></div><div>un=
icode characters, perhaps drawing from previous work, for example from:<br>=
</div><div><a href=3D"https://datatracker.ietf.org/doc/html/rfc5894#section=
-1.4" target=3D"_blank">https://datatracker.ietf.org/doc/html/rfc5894#secti=
on-1.4</a><br></div><div><br></div><div>&quot;&quot;&quot;<br></div><div>=
=C2=A0=C2=A0 The introduction of the larger repertoire of characters<br></d=
iv><div>=C2=A0=C2=A0 potentially makes the set of misspellings larger, espe=
cially given<br></div><div>=C2=A0=C2=A0 that in some cases the same appeara=
nce, for example on a business<br></div><div>=C2=A0=C2=A0 card, might visua=
lly match several Unicode code points or several<br></div><div>=C2=A0=C2=A0=
 sequences of code points.<br></div><div>&quot;&quot;&quot;<br></div></bloc=
kquote><div><br></div><div>I have added into the security considerations:<b=
r></div><div><br></div><div><i>Note that simply forbidding the use of a nam=
e already in the system is insufficient protection, as a malicious user cou=
ld still change their name to something easily confused with the existing n=
ame by using trivial misspellings or visually similar unicode characters.</=
i><i></i><br></div><div><br></div></div></div></blockquote><div><br></div><=
div>Thanks=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0px=
 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><di=
v class=3D"msg4988845756529120018"><div><div></div><blockquote type=3D"cite=
" id=3D"m_4988845756529120018qt"><div>```<br></div><div>639=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0 The set of principals within a shared environme=
nt SHOULD be strictly<br></div><div>640=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0 controlled.=C2=A0 If adding a new principal is open to the public, r=
isks<br></div><div>641=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 include:<b=
r></div><div>```<br></div><div><br></div><div>Why not MUST?<br></div></bloc=
kquote><div><br></div><div>This should be a MUST, I&#39;ve changed it.<br><=
/div><div><br></div><blockquote type=3D"cite" id=3D"m_4988845756529120018qt=
"><div>Is consent from existing principles required or recommended when add=
ing new principles?<br></div></blockquote><div><br></div><div>Not normally,=
 no. Think of a standard office environment, where the principals correspon=
d to employees.<br></div><div><br></div><blockquote type=3D"cite" id=3D"m_4=
988845756529120018qt"><div>## Nits<br></div><div><br></div><div>```<br></di=
v><div>536=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &quot;u12345678&quot;:=
 {<br></div><div>537=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0 &quot;name&quot;: &quot;<a href=3D"mailto:jane.doe@example.com=
" target=3D"_blank">jane.doe@example.com</a>&quot;<br></div><div>538=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &quot;isPerson=
al&quot;: true<br></div><div>539=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0 &quot;isReadOnly&quot;: false<br></div><div>540=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &quot;accou=
ntCapabilities&quot;: {<br></div><div>541=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &quot;urn:com.exa=
mple:jmap:todo&quot;: {},<br></div><div>542=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &quot;urn:ietf=
:params:jmap:principals:owner&quot;: {<br></div><div>543=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 accountIdForPrincipal: &quot;u33084183&quot;,<br></di=
v><div>544=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 principalId: &quot;P105=
aga511jaa&quot;<br></div><div>545=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }<br></div><div>546=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }<br></div><di=
v>547=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }<br></div><div>```<br></di=
v><div><br></div><div>This example is malformed JSON. accountIdForPrincipal=
 and principalId are<br></div><div>missing quotes, and the there is no indi=
cation of elision, consider starting<br></div><div>with { ... &quot;u123456=
78&quot;: ... }<br></div></blockquote><div><br></div><div>Thanks, I&#39;ve =
fixed this.<br></div><div><br></div><blockquote type=3D"cite" id=3D"m_49888=
45756529120018qt"><div>Its also strange that &quot;name&quot; is an email i=
n this example<br></div></blockquote><div><br></div><div>I used this becaus=
e the account name is most commonly the email address of the owner of the a=
ccount.<br></div></div></div></blockquote><div><br></div><div>Ok</div><div>=
=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0=
.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class=3D=
"msg4988845756529120018"><div><div></div><div><br></div><div id=3D"m_498884=
5756529120018sig64588216"><div>Cheers,<br></div><div>Neil.<br></div></div><=
/div></div></blockquote></div><br clear=3D"all"><div><br></div><span class=
=3D"gmail_signature_prefix">-- </span><br><div dir=3D"ltr" class=3D"gmail_s=
ignature"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"lt=
r"><div dir=3D"ltr"><span><p style=3D"line-height:1.38;margin-top:0pt;margi=
n-bottom:0pt"><br>OS, ART AD</p></span></div></div></div></div></div></div>=
</div>

--000000000000020d780615e79ee9--

