Re: [regext] Review of draft-ietf-regext-rdap-redacted-09

Jasdip Singh <jasdips@arin.net> Thu, 15 December 2022 20:38 UTC

Return-Path: <jasdips@arin.net>
X-Original-To: regext@ietfa.amsl.com
Delivered-To: regext@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 28A26C1516F1; Thu, 15 Dec 2022 12:38:02 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -6.896
X-Spam-Level:
X-Spam-Status: No, score=-6.896 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_HI=-5, 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
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 gA37O6N0_Hmg; Thu, 15 Dec 2022 12:37:56 -0800 (PST)
Received: from smtp4.arin.net (smtp4.arin.net [IPv6:2001:500:4:201::54]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 31A32C1522D2; Thu, 15 Dec 2022 12:37:56 -0800 (PST)
Received: from CAS01CHA.corp.arin.net (cas01cha.corp.arin.net [10.1.30.62]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by smtp4.arin.net (Postfix) with ESMTPS id BAB9D1075743; Thu, 15 Dec 2022 15:37:53 -0500 (EST)
Received: from CAS02CHA.corp.arin.net (10.1.30.63) by CAS01CHA.corp.arin.net (10.1.30.62) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Thu, 15 Dec 2022 15:37:52 -0500
Received: from CAS02CHA.corp.arin.net ([fe80::7578:cc42:d6f6:9bb0]) by CAS02CHA.corp.arin.net ([fe80::7578:cc42:d6f6:9bb0%17]) with mapi id 15.00.1497.000; Thu, 15 Dec 2022 15:37:52 -0500
From: Jasdip Singh <jasdips@arin.net>
To: "Gould, James" <jgould@verisign.com>, "Keathley, Daniel" <dkeathley@verisign.com>, "andy@hxr.us" <andy@hxr.us>, "mario.loffredo@iit.cnr.it" <mario.loffredo@iit.cnr.it>
CC: "jkolker@godaddy.com" <jkolker@godaddy.com>, "jgould=40verisign.com@dmarc.ietf.org" <jgould=40verisign.com@dmarc.ietf.org>, "draft-ietf-regext-rdap-redacted@ietf.org" <draft-ietf-regext-rdap-redacted@ietf.org>, "regext@ietf.org" <regext@ietf.org>
Thread-Topic: [regext] Review of draft-ietf-regext-rdap-redacted-09
Thread-Index: AQHZEMUajrScMyH6lU+i9FPD24066A==
Date: Thu, 15 Dec 2022 20:37:51 +0000
Message-ID: <EA1E8CB1-B407-4DB5-8087-8AC73F90A2D5@arin.net>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
x-ms-exchange-messagesentrepresentingtype: 1
x-ms-exchange-transport-fromentityheader: Hosted
x-originating-ip: [192.136.136.37]
Content-Type: multipart/alternative; boundary="_000_EA1E8CB1B4074DB580878AC73F90A2D5arinnet_"
MIME-Version: 1.0
Archived-At: <https://mailarchive.ietf.org/arch/msg/regext/GPiFKjbK60b41CN59euB5xYMUhw>
Subject: Re: [regext] Review of draft-ietf-regext-rdap-redacted-09
X-BeenThere: regext@ietf.org
X-Mailman-Version: 2.1.39
Precedence: list
List-Id: Registration Protocols Extensions <regext.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/regext>, <mailto:regext-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/regext/>
List-Post: <mailto:regext@ietf.org>
List-Help: <mailto:regext-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/regext>, <mailto:regext-request@ietf.org?subject=subscribe>
X-List-Received-Date: Thu, 15 Dec 2022 20:38:02 -0000

James,

+1 for option #1. :)

Jasdip

From: "Gould, James" <jgould@verisign.com>
Date: Thursday, December 15, 2022 at 3:33 PM
To: "Keathley, Daniel" <dkeathley@verisign.com>, Andy Newton <andy@hxr.us>, "mario.loffredo@iit.cnr.it" <mario.loffredo@iit.cnr.it>
Cc: "jkolker@godaddy.com" <jkolker@godaddy.com>, "jgould=40verisign.com@dmarc.ietf.org" <jgould=40verisign.com@dmarc.ietf.org>, Jasdip Singh <jasdips@arin.net>, "draft-ietf-regext-rdap-redacted@ietf.org" <draft-ietf-regext-rdap-redacted@ietf.org>, "regext@ietf.org" <regext@ietf.org>
Subject: Re: Re: [regext] Review of draft-ietf-regext-rdap-redacted-09


Thanks everyone that provided their preference for the options on the use of redaction by placeholder text.  The following is a breakdown of the preferences (first - #1, second - #2, and third - #3) based on the responses received:



  1.  Keep MUST NOT
     *   Jim Gould #1
     *   Jody Kolker #1
     *   Jasdip Singh #1 – Please confirm this is your true #1, since elements of option 5 were also referenced in your response
     *   Mario Loffredo #1
     *   Andy Newton #1
     *   Dan Keathley #1
  2.  Change MUST NOT to SHOULD NOT
     *   None
  3.  Remove the normative language
     *   Pawel Kowalik #1
     *   Jody Kolker #2
     *   Jim Gould #3
  4.  Remove reference to placeholder text use for redaction
     *   Pawel Kowalik #2
  5.  Keep MUST NOT with Transition Considerations section
     *   Jim Gould #2
     *   Jasdip Singh #2



At this point draft-ietf-regext-rdap-redacted-10 will keep the MUST NOT language, pending any additional responses or options.  draft-ietf-regext-rdap-redacted-10 will be posted that includes Pawel Kowalik’s feedback and Mario Loffredo’s feedback.  The new “Redaction by Partial Value Method” will be added based on Mario Loffredo’s feedback.



Thanks,





--



JG







James Gould

Fellow Engineer

jgould@Verisign.com <applewebdata://13890C55-AAE8-4BF3-A6CE-B4BA42740803/jgould@Verisign.com>



703-948-3271

12061 Bluemont Way

Reston, VA 20190



Verisign.com <http://verisigninc.com/>



On 12/14/22, 4:57 PM, "Keathley, Daniel" <dkeathley@verisign.com> wrote:



    +1 for option 1.



    --Dan



    On 12/13/22, 9:31 AM, "regext on behalf of Andrew Newton" <regext-bounces@ietf.org on behalf of andy@hxr.us> wrote:



        Caution: This email originated from outside the organization. Do not click links or open attachments unless you recognize the sender and know the content is safe.



        I think Jody captured my thoughts. Option 1 is my preference.



        -andy





        On Fri, Dec 9, 2022 at 12:33 PM Mario Loffredo

        <mario.loffredo@iit.cnr.it> wrote:

        >

        > Hi James and others,

        >

        > I prefer option 1 too.

        >

        > With regard to the transition period, think it can't really be implemented since this specification doesn't describe features for a server to swtich from one way to and back from the other on demand until the old way is completely deprecated. As opposed to the replacement of jCard with JSContact, in this case it's not worth it because basically it doesn't make much difference for a client if an RDAP field is missing or contains a placeholder value.

       >

        > What a server can do is to notify the clients about the imminent change of redaction strategy and then make the switch when it's time.

        >

        > Best,

        >

        > Mario

        >

        > Il 09/12/2022 15:30, Gould, James ha scritto:

        >

        > Jasdip,

        >

        >

        >

        > Agreed.  If providing clarity around transitioning to the old way to the new way makes sense to keep the MUST NOT language, then that can certainly be done.  The transition considerations section could include an overlap period that supports a soft cutover.  A similar kind of section can be found for the Secure Authorization Information for Transfer RFC 9154 (https://secure-web.cisco.com/1W2fXVOH_5_TikpsQ6Z8tBYK_87TJMLAKMNijY5Q1PGkDrUWmCrx8F9cJt5du66V0ULUGUpdgkMTOSUBoDaPsh6htrVn6XxNJYcqcqnu_nMBKp8ASBJGsDg8KX82CO3_EK6UbxXDf-XNDIoosqRc5Nh_TigXNN58U5lg9nevht7BmHW6YWjIbTMWsuV_sc7JIUZOaPmegkJ7S2vYWtq--wN4BFB-Kf3Wr_UrIcvCRJSrsdI-sIk_V0poe945FEcJiRg7LpTIoc2R8rvPsCSoX2iRYEmEcnH0NEkDcTfODYSE/https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc9154%23section-6); although the redaction transition section would be much simpler.  With that I’ll add back in inclusion of the MUST NOT language and the transition considerations section to the list of options, as option 5.

        >

        >

        >

        > 1.      Keep MUST NOT – The Section 3 sentence is “The use of placeholder text for the values of the RDAP fields, such as the placeholder text "XXXX", MUST NOT be used for redaction.”.

        >

        > 2.  Change MUST NOT to SHOULD NOT – This enables the draft to recommend that placeholder text not be used for redaction, but still enable the server to support it in parallel with the redaction methods defined in the extension.  The Section 3 sentence would become “The use of placeholder text for the values of the RDAP fields, such as the placeholder text "XXXX", SHOULD NOT be used for redaction.”.

        >

        > 3.  Remove the normative language – Change the Section 3 sentence to “The use of placeholder text for the values of the RDAP fields, such as the placeholder text "XXXX", has been used for redaction.”.

        >

        > 4.  Remove reference to placeholder text use for redaction – Just lead Section 3 with the sentence “This section covers the redaction methods that can be used with the redaction signaling defined in Section 4.2.”.

        >

        > 5.  Keep MUST NOT with Transition Considerations section – Same as option 1, but with the addition of a Transition Considerations section that provides guidance on transition of the use of placeholder text redaction to the use of the redaction extension.

        >

        >

        >

        > My preference order would be Option 1, Option 5, and then Option 3 as a fallback.

        >

        >

        >

        > Thanks,

        >

        >

        >

        > --

        >

        >

        >

        > JG

        >

        >

        >

        >

        > James Gould

        > Fellow Engineer

        > jgould@Verisign.com

        >

        > 703-948-3271

        > 12061 Bluemont Way

        > Reston, VA 20190

        >

        > Verisign.com

        >

        >

        >

        > From: Jasdip Singh <jasdips@arin.net>

        > Date: Friday, December 9, 2022 at 9:02 AM

        > To: "Gould, James" <jgould=40verisign.com@dmarc.ietf.org>, Jody Kolker <jkolker@godaddy.com>, "kowalik@denic.de" <kowalik@denic.de>, "draft-ietf-regext-rdap-redacted@ietf.org" <draft-ietf-regext-rdap-redacted@ietf.org>

        > Cc: "regext@ietf.org" <regext@ietf.org>

        > Subject: [EXTERNAL] Re: [regext] Review of draft-ietf-regext-rdap-redacted-09

        > Resent-From: <alias-bounces@ietf.org>

        > Resent-To: David Smith <dsmith@verisign.com>, Roger Carney <rcarney@godaddy.com>, James Gould <jgould@verisign.com>, Jody Kolker <jkolker@godaddy.com>

        > Resent-Date: Friday, December 9, 2022 at 9:02 AM

        >

        >

        >

        > Hello James,

        >

        >

        >

        > Since we are trying to get away for the placeholder text "XXXX" with this standards-track proposal, agree option #1 makes sense to discourage such practice. Further, agree with Jody that returning the "redacted" rdapConformance should make it ample clear when an RDAP server switches to the new way. That said, perhaps, we could add a section concerning the transition from the old way to the new way if that helps clarify.

        >

        >

        >

        > Thanks,

        >

        > Jasdip

        >

        >

        >

        > From: regext <regext-bounces@ietf.org> on behalf of "Gould, James" <jgould=40verisign.com@dmarc.ietf.org>

        > Date: Friday, December 9, 2022 at 8:38 AM

        > To: "jkolker@godaddy.com" <jkolker@godaddy.com>, "kowalik@denic.de" <kowalik@denic.de>, "draft-ietf-regext-rdap-redacted@ietf.org" <draft-ietf-regext-rdap-redacted@ietf.org>

        > Cc: "regext@ietf.org" <regext@ietf.org>

        > Subject: Re: [regext] Review of draft-ietf-regext-rdap-redacted-09

        >

        >

        >

        > Jody,

        >

        >

        >

        > I thought adding the transition period to the MUST NOT would provide for some flexibility for those that need to transition from placeholder redaction to draft-ietf-regext-rdap-redacted, but I believe a server would implement a hard cutover (e.g., supporting the draft with no other form of redaction).  With that in mind, I’ll modify option 1 to be simply MUST NOT without any reference to a transition period.

        >

        >

        >

        > 1.      Keep MUST NOT – The Section 3 sentence is “The use of placeholder text for the values of the RDAP fields, such as the placeholder text "XXXX", MUST NOT be used for redaction.”.

        >

        > 2.  Change MUST NOT to SHOULD NOT – This enables the draft to recommend that placeholder text not be used for redaction, but still enable the server to support it in parallel with the redaction methods defined in the extension.  The Section 3 sentence would become “The use of placeholder text for the values of the RDAP fields, such as the placeholder text "XXXX", SHOULD NOT be used for redaction.”.

        >

        > 3.  Remove the normative language – Change the Section 3 sentence to “The use of placeholder text for the values of the RDAP fields, such as the placeholder text "XXXX", has been used for redaction.”.

        >

        > 4.  Remove reference to placeholder text use for redaction – Just lead Section 3 with the sentence “This section covers the redaction methods that can be used with the redaction signaling defined in Section 4.2.”.

        >

        >

        >

        > My preference is option 1 (“Keep MUST NOT”), and I agree that if the normative language cannot remain that option 3 (“Remove the normative language”) is the best alternative.

        >

        >

        >

        > Can others from the working group provide their preferred option to address Pawel’s last open feedback item?  All of Pawel’s feedback will be incorporated in draft-ietf-regext-rdap-redacted-10.

        >

        >

        >

        > Thanks,

        >

        >

        >

        > --

        >

        >

        >

        > JG

        >

        >

        >

        >

        > James Gould

        > Fellow Engineer

        > jgould@Verisign.com

        >

        > 703-948-3271

        > 12061 Bluemont Way

        > Reston, VA 20190

        >

        > Verisign.com

        >

        >

        >

        > From: Jody Kolker <jkolker@godaddy.com>

        > Date: Friday, December 2, 2022 at 2:27 PM

        > To: Pawel Kowalik <kowalik@denic.de>, James Gould <jgould@verisign.com>, "draft-ietf-regext-rdap-redacted@ietf.org" <draft-ietf-regext-rdap-redacted@ietf.org>

        > Cc: "regext@ietf.org" <regext@ietf.org>

        > Subject: [EXTERNAL] RE: Review of draft-ietf-regext-rdap-redacted-09

        >

        >

        >

        > My preference would be that if the server is supporting this draft that placeholder text is not allowed to be returned for any redacted field.  I'm not sure what a transition period would look like.  It seems to me that a server is either supporting the draft with an "rdapConformance" value of "redacted" or it's not supporting the draft and does not return the "redacted" value in the “rdapConformance” value.  If "redacted" is returned, placeholder text should not be used.

        >

        >

        >

        > I would support option #1 without a transition period.  Servers are free to continue with the responses used today that do not include the “redacted”  “rdapConformance” value if the server is returning placeholder text.  One the draft is supported without placeholder text, the “redacted” “rdapConformance” value can be returned in the responses.

        >

        >

        >

        > However, I can live with Option #3 where the RFC acknowledges that placeholder text has been used in the past.

        >

        >

        >

        > Thanks,

        >

        > Jody Kolker.

        >

        >

        >

        > From: Pawel Kowalik <kowalik@denic.de>

        > Sent: Friday, November 25, 2022 1:50 AM

        > To: Gould, James <jgould@verisign.com>; draft-ietf-regext-rdap-redacted@ietf.org

        > Cc: regext@ietf.org

        > Subject: Re: Review of draft-ietf-regext-rdap-redacted-09

        >

        >

        >

        > Caution: This email is from an external sender. Please do not click links or open attachments unless you recognize the sender and know the content is safe. Forward suspicious emails to isitbad@.

        >

        >

        >

        > Hi James,

        >

        >

        >

        > Thanks for that.

        >

        > My preference would be 3 or 4, to focus the draft on signaling, allowing the clients to recognize redacted fields.

        >

        >

        >

        > Kind Regards,

        >

        > Pawel

        >

        >

        >

        > Am 23.11.22 um 16:57 schrieb Gould, James:

        >

        > Pawel,

        >

        >

        >

        > I add responses embedded below with “JG4 – “.

        >

        >

        >

        > For the WG, I’m including one discussion topic at the top for consideration:

        >

        >

        >

        > Section 3 currently states “The use of placeholder text for the values of the RDAP fields, such as the placeholder text "XXXX", MUST NOT be used for redaction.”  Pawel raised an issue with the MUST NOT language and proposed to use SHOULD NOT.  I view the use of placeholder text redaction as an anti-pattern that should be disallowed when implementing draft-ietf-regext-rdap-redacted, but I do recognize the potential need for a transition period.  I summarize the options below:

        >

        >

        >

        > 1.  Keep MJST NOT with Transition Period – Formally define the transition period that is based on server policy in a new Transition Considerations section.

        >

        > 2.  Change MUST NOT to SHOULD NOT – This enables the draft to recommend that placeholder text not be used for redaction, but still enable the server to support it in parallel with the redaction methods defined in the extension.

        >

        > 3.  Remove the normative language – Change “The use of placeholder text for the values of the RDAP fields, such as the placeholder text "XXXX", MUST NOT be used for redaction.”  To “The use of placeholder text for the values of the RDAP fields, such as the placeholder text "XXXX", has been used for redaction.  …”.

        >

        > 4.  Remove reference to placeholder text use for redaction – Just lead section 3 with the sentence “This section covers the redaction methods that can be used with the redaction signaling defined in Section 4.2.”.

        >

        >

        >

        > Please respond to the mailing list with your thoughts on the options or if you have any additional options.   My preferred option is option 1 “Keep MJST NOT with Transition Period”.

        >

        >

        >

        > Thanks,

        >

        >

        >

        > --

        >

        >

        >

        > JG

        >

        >

        >

        >

        > James Gould

        > Fellow Engineer

        > jgould@Verisign.com

        >

        > 703-948-3271

        > 12061 Bluemont Way

        > Reston, VA 20190

        >

        > Verisign.com

        >

        >

        >

        > From: Pawel Kowalik <kowalik@denic.de>

        > Date: Wednesday, November 23, 2022 at 9:23 AM

        > To: James Gould <jgould@verisign.com>, "draft-ietf-regext-rdap-redacted@ietf.org" <draft-ietf-regext-rdap-redacted@ietf.org>

        > Cc: "regext@ietf.org" <regext@ietf.org>

        > Subject: [EXTERNAL] Re: Review of draft-ietf-regext-rdap-redacted-09

        >

        >

        >

        > Hi James,

        >

        > My comments below.

        >

        > Am 23.11.22 um 14:17 schrieb Gould, James:

        >

        > [...]

        >

        > JG3 – What triggered the creation of this extension was a proposal to use placeholder text for redaction, which in my opinion is an anti-pattern that needs to be directly addressed.  I believe that you see the need to support a transition period that would be up to server policy.  See my comment below related to creating a Transition Considerations section to make this explicit.  The draft can define the methods for redaction, disallow the use of placeholder text for redaction outside of a transition period, and add explicit support for a transition period with a set of considerations.  Does this meet your needs?

        >

        > [PK3] OK, please include also this part in the Abstract and Introduction, that the draft also defines certain rules for redaction to mitigate the anti-patterns, if there is a consensus in WG to mandate how redaction is done.

        >

        >

        >

        > JG4 – I’m raising the options for discussion in the WG to hopefully find a consensus option.

        >

        > Populating the existing value with a static placeholder value as a signal for redaction is different from what is defined for the "Redaction by Replacement Value Method", which changes the value to a non-static value or moves the location of the value.

        >

        > [PK2] I believe it should be perfectly valid to replace one email with another email (for example privacy proxy email) without moving it, shouldn't it? For me it would be "Redaction by Replacement Value Method" where both paths are same.

        >

        > JG3 – Yes, use of a privacy proxy email is a form of "Redaction by Replacement Value Method", since the real value is not being provided but a replacement value is being used instead.  In this case the “method” value is “replacementValue” and the “replacementPath” is not used.  Does this need to be clarified in the draft, since the intent is to support replacing the value in place or replacing the value using an alternate field, such as the replacement with the “contact—uri” property?

        >

        > [PK3] Now I see it from examples that replacementPath might be omitted. It would be good to have some normative text defining that.

        >

        > JG4 – Ok, I’ll look to add clarification text.

        >

        >

        >

        > [...]

        >

        > JG3 – Ok, that helps.  I believe the biggest issue from a client perspective is when they expect a non-empty value, and the server implements the Redaction by Empty Value Method and then returns an empty value.  The use of the placeholder redaction text can be used in parallel with draft-ietf-regext-rdap-redacted during a transition period.  The duration of the transition period would be up to server policy.  What I don’t want to introduce is parallel forms of redaction for beyond a transition period.  How about including the definition of a transition period in a Transition Considerations section and updating the MUST NOT language to “The use of placeholder text … MUST NOT be used for redaction outside of a transition period defined in Section X . In the Transition Considerations section, it can define that placeholder redaction text may exist and may overlap with this extension during a transition period that is up to server policy.  Then there can be a set of considerations for the server and client in making the transition.  I believe this would address the transition more explicitly and leave the timing of the transition up to server policy.  Do you agree?

        >

        > [PK3] If the WG is in consensus to keep "MUST NOT" then Transition Considerations is a good way to cover the smooth transition.

        >

        > JG4 – I’m raising the options for discussion in the WG to hopefully find a consensus option.

        >

        >

        >

        > [...]

        >

        >     Another approach would be to define a way of interpreting the JSONPath

        >

        >     so that it is reversible or even defining a subset of JSONPath which is

        >

        >     reversible in the narrower RDAP context.

        >

        >

        >

        > JG2 - I'm not sure what is meant by JSONPath that is reversable.  I believe that JSONPath needs to be used as defined.

        >

        > [PK2] Reversable means that you can unambiguously re-create the original object structure based on the path. Normalized JSONPath have this property (see 2.8 of JSONPath draft) but may not be the best in case of array members identified by a property value of array member, like in jCard. The expressions like $.entities[?(@.roles[0]=='registrant')] can be also reversible, but this is not true for just any JSONPath expression. If we would define a narrowed down definition of JSONPath expressions which are allowed, we could achieve the property of reversibility and maybe even that one kind of object or property would have exactly one and only possible JSONPath describing it. Again - it's just an idea how to deal with removed paths. It may be also not worth following if we assume "redacted name" would be the leading property (see below).

        >

        >

        >

        > JG3 – Thanks for the reference, I’ll review it and see whether something can be used.  My initial thought is that it’s going to be too complex and won’t cover the broad set of use cases in RDAP.  Right now, we’ll assume that it can’t be used in draft-ietf-regext-rdap-redacted, but it’s being reviewed.

        >

        >

        >

        >     In the end, implementing a client, I would rather want to rely on the

        >

        >     "redacted name" from the "JSON Values Registry" for paths which have

        >

        >     been deleted, and treating the path member as only informative.

        >

        >

        >

        >     If you agree for such processing by the client I suggest to put it down

        >

        >     in the chapter 5 (maybe splitting it into server and client side)