From 107bbe310aadfb6f11f68aa7c688758f81dc4c2d Mon Sep 17 00:00:00 2001 From: Brendan Abolivier Date: Tue, 18 Oct 2022 12:57:44 +0100 Subject: [PATCH 01/13] MSCXXXX: Relation-based redactions --- proposals/XXXX-relation-based-redaction.md | 117 +++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 proposals/XXXX-relation-based-redaction.md diff --git a/proposals/XXXX-relation-based-redaction.md b/proposals/XXXX-relation-based-redaction.md new file mode 100644 index 00000000000..a0899718065 --- /dev/null +++ b/proposals/XXXX-relation-based-redaction.md @@ -0,0 +1,117 @@ +# MSCXXXX: Relation-based redaction + +There are cases where, when redacting an event, it would make sense to also +redact all events that relate to it in a certain way. A few examples of this +are: + +* Edits: when redacting a message that has been edited, also redacting its edits + would ensure that none of the information in the original message leaks + through them. +* Live location sharing (from + [MSC3489](https://github.com/matrix-org/matrix-spec-proposals/pull/3489)): the + user streaming its live location might want to delete their location history + once they have stopped sharing it. +* Moderation: a room's moderator might want to delete an entire thread from a + room, a poll with all its answers, etc. + +Currently, the only way to do this is for the client to keep track of each +individual event and redact them itself. This is cumbersome because it might +require clients to work around their own limits on how much history is stored +for a given room, and might cause them to hit rate limits when attempting to +send redactions, which would translate into general slowness for the user (since +their other actions would also be prevented by rate limiters as a result). + +## Proposal + +We add a new optional `with_relations` property to the body of the [`PUT +/_matrix/client/v3/rooms/{roomId}/redact/{eventId}/{txnId}`](https://spec.matrix.org/latest/client-server-api/#put_matrixclientv3roomsroomidredacteventidtxnid) +requests. This property is a list of relation types. If an event relates to the +event specified in the `{eventId}` parameter with a relation type specified in +this `with_relations` property, the server also redacts it on behalf of the user +performing the redaction. The response body of this endpoint does not change. + +For example, let's consider the following message: + +```json +{ + "type": "m.room.message", + "content": { + "body": "Hello", + "msgtype": "m.text", + "m.relates_to": { + "rel_type": "m.replace", + "event_id": "$some_event_id" + } + }, + "event_id": "$a" +} +``` + +And its edit: + +```json +{ + "type": "m.room.message", + "content": { + "body": "* Hello world!", + "msgtype": "m.text", + "m.new_content": { + "body": "Hello world!", + "msgtype": "m.text" + }, + "m.relates_to": { + "rel_type": "m.replace", + "event_id": "$a" + } + }, + "event_id": "$b" +} +``` + +Then the request: + +``` +PUT /_matrix/client/v3/rooms/!someroom:example.com/redact/$a/foo + +{ + "with_relations": ["m.replace"] +} +``` + +Causes events `$a` and `$b` to both get redacted. + +If the `with_relations` property is absent from the request body, only the event refered to by the `{eventId}` parameter (`$a` in the example above) is redacted. Same goes if `with_relations` is an empty list. + +If an event that matches the redaction criteria (i.e. relates to the event +that's being redacted with one of the relation types specified in the request) +cannot be redacted by the user sending the redaction request (because of +insufficient permissions), it is ignored. Clients may attempt to detect cases +where a user would not be able to redact some events matching the redaction +criteria (e.g. matching `m.reference` relations when redacting a `m.poll.start` +event, matching `m.thread` relations, etc., with an insufficient power level to +delete other users' events) and display a warning to the user in this case. + +If an event that matches the redaction criteria comes down federation after +redaction requests has completed, the server must attempt to redact it on behalf +of the redaction request's sender. + +### Unstable feature in `/version` + +Homeservers which support this MSC should indicate it by adding +`org.matrix.mscXXXX` and `org.matrix.mscXXXX.stable` in the response to `GET +/_matrix/client/versions` requests. + + +## Alternatives + +The server could respond to the client with some information about whether some +events could not be redacted due to insufficient permissions. However, this +could lead to confusing user experience, wherein the server responds by telling +the client all events could be redacted, but another event comes down federation +shortly afterwards that cannot be redacted. + + +## Unstable prefixes + +Until this proposal is stabilised, `org.matrix.mscXXXX.with_relations` should be +used instead of `with_relations`. \ No newline at end of file From 09cf8c03b9a7b204ba37424236f5734e8623b18a Mon Sep 17 00:00:00 2001 From: Brendan Abolivier Date: Tue, 18 Oct 2022 12:59:13 +0100 Subject: [PATCH 02/13] MSC number --- ...-based-redaction.md => 3912-relation-based-redaction.md} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename proposals/{XXXX-relation-based-redaction.md => 3912-relation-based-redaction.md} (96%) diff --git a/proposals/XXXX-relation-based-redaction.md b/proposals/3912-relation-based-redaction.md similarity index 96% rename from proposals/XXXX-relation-based-redaction.md rename to proposals/3912-relation-based-redaction.md index a0899718065..46b31f122bf 100644 --- a/proposals/XXXX-relation-based-redaction.md +++ b/proposals/3912-relation-based-redaction.md @@ -1,4 +1,4 @@ -# MSCXXXX: Relation-based redaction +# MSC3912: Relation-based redaction There are cases where, when redacting an event, it would make sense to also redact all events that relate to it in a certain way. A few examples of this @@ -98,7 +98,7 @@ of the redaction request's sender. ### Unstable feature in `/version` Homeservers which support this MSC should indicate it by adding -`org.matrix.mscXXXX` and `org.matrix.mscXXXX.stable` in the response to `GET +`org.matrix.msc3912` and `org.matrix.msc3912.stable` in the response to `GET /_matrix/client/versions` requests. @@ -113,5 +113,5 @@ shortly afterwards that cannot be redacted. ## Unstable prefixes -Until this proposal is stabilised, `org.matrix.mscXXXX.with_relations` should be +Until this proposal is stabilised, `org.matrix.msc3912.with_relations` should be used instead of `with_relations`. \ No newline at end of file From f966734686867f2a555c25bc0a2fec0a76760fab Mon Sep 17 00:00:00 2001 From: Brendan Abolivier Date: Tue, 18 Oct 2022 12:59:56 +0100 Subject: [PATCH 03/13] Typo --- proposals/3912-relation-based-redaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/3912-relation-based-redaction.md b/proposals/3912-relation-based-redaction.md index 46b31f122bf..93228aa4593 100644 --- a/proposals/3912-relation-based-redaction.md +++ b/proposals/3912-relation-based-redaction.md @@ -80,7 +80,7 @@ PUT /_matrix/client/v3/rooms/!someroom:example.com/redact/$a/foo Causes events `$a` and `$b` to both get redacted. -If the `with_relations` property is absent from the request body, only the event refered to by the `{eventId}` parameter (`$a` in the example above) is redacted. Same goes if `with_relations` is an empty list. +If the `with_relations` property is absent from the request body, only the event referred to by the `{eventId}` parameter (`$a` in the example above) is redacted. Same goes if `with_relations` is an empty list. If an event that matches the redaction criteria (i.e. relates to the event that's being redacted with one of the relation types specified in the request) From 8a21053b4fde06b9365a2f27c124ab023edba10e Mon Sep 17 00:00:00 2001 From: Brendan Abolivier Date: Wed, 19 Oct 2022 11:37:11 +0100 Subject: [PATCH 04/13] Add missing alternative --- proposals/3912-relation-based-redaction.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/proposals/3912-relation-based-redaction.md b/proposals/3912-relation-based-redaction.md index 93228aa4593..b1f9d826b41 100644 --- a/proposals/3912-relation-based-redaction.md +++ b/proposals/3912-relation-based-redaction.md @@ -110,6 +110,14 @@ could lead to confusing user experience, wherein the server responds by telling the client all events could be redacted, but another event comes down federation shortly afterwards that cannot be redacted. +An alternative proposal would be specifying a static list of relation types to +consider when redacting a message. However, this would not work well with more +generic ones such as `m.reference`, and would restrict clients in the UX they +offer to users (e.g. a client might want to show a checkbox to a user offering +them to redact a whole thread when redacting the thread's root, if this user is +a room moderator). This could still be helpful for some relation types (e.g. +`m.replaces`) but clients are likely better positioned to make this decision +given they have more control over feature UX. ## Unstable prefixes From 85b270a46201475ce006a778324ef82715f702af Mon Sep 17 00:00:00 2001 From: Brendan Abolivier Date: Thu, 20 Oct 2022 10:38:58 +0100 Subject: [PATCH 05/13] Add mention of MSC2244, and tweak the MSC to make it easier on server implems --- proposals/3912-relation-based-redaction.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/proposals/3912-relation-based-redaction.md b/proposals/3912-relation-based-redaction.md index b1f9d826b41..01920c13a63 100644 --- a/proposals/3912-relation-based-redaction.md +++ b/proposals/3912-relation-based-redaction.md @@ -80,6 +80,11 @@ PUT /_matrix/client/v3/rooms/!someroom:example.com/redact/$a/foo Causes events `$a` and `$b` to both get redacted. +A server may wish to leverage +[MSC2244](https://github.com/matrix-org/matrix-doc/pull/2244) (mass redactions) +to redact all events targetted by the redaction request if supports it, however this is not a +requirement. + If the `with_relations` property is absent from the request body, only the event referred to by the `{eventId}` parameter (`$a` in the example above) is redacted. Same goes if `with_relations` is an empty list. If an event that matches the redaction criteria (i.e. relates to the event @@ -95,6 +100,16 @@ If an event that matches the redaction criteria comes down federation after redaction requests has completed, the server must attempt to redact it on behalf of the redaction request's sender. +Servers may wish to copy the `with_relations` property into the +`m.room.redaction` event's `unsigned` object in order to facilitate watching for +new events to redact once the redaction request has completed. Servers must +ignore `with_relations` properties in the `unsigned` object of redaction events that were not sent by a local user. + +Since the response format to the `PUT +/_matrix/client/v3/rooms/{roomId}/redact/{eventId}/{txnId}` does not change as a +result of this proposal, servers may respond to the request once the event referenced to by the `{eventId}` parameter is redacted, and redact events that relate to it in the background. + + ### Unstable feature in `/version` Homeservers which support this MSC should indicate it by adding From 9fd9f64cf971649ce4bd6de442f250f64fc1d3e6 Mon Sep 17 00:00:00 2001 From: Brendan Abolivier Date: Thu, 20 Oct 2022 10:55:39 +0100 Subject: [PATCH 06/13] Typo --- proposals/3912-relation-based-redaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/3912-relation-based-redaction.md b/proposals/3912-relation-based-redaction.md index 01920c13a63..65911841d1e 100644 --- a/proposals/3912-relation-based-redaction.md +++ b/proposals/3912-relation-based-redaction.md @@ -82,7 +82,7 @@ Causes events `$a` and `$b` to both get redacted. A server may wish to leverage [MSC2244](https://github.com/matrix-org/matrix-doc/pull/2244) (mass redactions) -to redact all events targetted by the redaction request if supports it, however this is not a +to redact all events targeted by the redaction request if supports it, however this is not a requirement. If the `with_relations` property is absent from the request body, only the event referred to by the `{eventId}` parameter (`$a` in the example above) is redacted. Same goes if `with_relations` is an empty list. From b2ec8476241b945ae4ba75c11cd2428635db3b7b Mon Sep 17 00:00:00 2001 From: Brendan Abolivier Date: Thu, 20 Oct 2022 10:58:42 +0100 Subject: [PATCH 07/13] Wrap --- proposals/3912-relation-based-redaction.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/proposals/3912-relation-based-redaction.md b/proposals/3912-relation-based-redaction.md index 65911841d1e..1b0edf0d098 100644 --- a/proposals/3912-relation-based-redaction.md +++ b/proposals/3912-relation-based-redaction.md @@ -82,8 +82,8 @@ Causes events `$a` and `$b` to both get redacted. A server may wish to leverage [MSC2244](https://github.com/matrix-org/matrix-doc/pull/2244) (mass redactions) -to redact all events targeted by the redaction request if supports it, however this is not a -requirement. +to redact all events targeted by the redaction request if supports it, however +this is not a requirement. If the `with_relations` property is absent from the request body, only the event referred to by the `{eventId}` parameter (`$a` in the example above) is redacted. Same goes if `with_relations` is an empty list. From 84a20ed90d21b910c4a4fda9689e230a45233a4f Mon Sep 17 00:00:00 2001 From: Brendan Abolivier Date: Thu, 20 Oct 2022 11:41:30 +0100 Subject: [PATCH 08/13] Wrap more --- proposals/3912-relation-based-redaction.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/proposals/3912-relation-based-redaction.md b/proposals/3912-relation-based-redaction.md index 1b0edf0d098..29c7c10d893 100644 --- a/proposals/3912-relation-based-redaction.md +++ b/proposals/3912-relation-based-redaction.md @@ -103,11 +103,14 @@ of the redaction request's sender. Servers may wish to copy the `with_relations` property into the `m.room.redaction` event's `unsigned` object in order to facilitate watching for new events to redact once the redaction request has completed. Servers must -ignore `with_relations` properties in the `unsigned` object of redaction events that were not sent by a local user. +ignore `with_relations` properties in the `unsigned` object of redaction events +that were not sent by a local user. Since the response format to the `PUT /_matrix/client/v3/rooms/{roomId}/redact/{eventId}/{txnId}` does not change as a -result of this proposal, servers may respond to the request once the event referenced to by the `{eventId}` parameter is redacted, and redact events that relate to it in the background. +result of this proposal, servers may respond to the request once the event +referenced to by the `{eventId}` parameter is redacted, and redact events that +relate to it in the background. ### Unstable feature in `/version` From 5823324ae696f13ab37e45b2b4f8ca138110153f Mon Sep 17 00:00:00 2001 From: Brendan Abolivier Date: Fri, 21 Oct 2022 17:40:11 +0100 Subject: [PATCH 09/13] Incorporate review --- proposals/3912-relation-based-redaction.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/proposals/3912-relation-based-redaction.md b/proposals/3912-relation-based-redaction.md index 29c7c10d893..4cbe470cd15 100644 --- a/proposals/3912-relation-based-redaction.md +++ b/proposals/3912-relation-based-redaction.md @@ -100,14 +100,8 @@ If an event that matches the redaction criteria comes down federation after redaction requests has completed, the server must attempt to redact it on behalf of the redaction request's sender. -Servers may wish to copy the `with_relations` property into the -`m.room.redaction` event's `unsigned` object in order to facilitate watching for -new events to redact once the redaction request has completed. Servers must -ignore `with_relations` properties in the `unsigned` object of redaction events -that were not sent by a local user. - -Since the response format to the `PUT -/_matrix/client/v3/rooms/{roomId}/redact/{eventId}/{txnId}` does not change as a +Since the response format to `PUT +/_matrix/client/v3/rooms/{roomId}/redact/{eventId}/{txnId}` requests does not change as a result of this proposal, servers may respond to the request once the event referenced to by the `{eventId}` parameter is redacted, and redact events that relate to it in the background. @@ -120,6 +114,17 @@ Homeservers which support this MSC should indicate it by adding /_matrix/client/versions` requests. +## Potential issues + +Since all the redactions are sent on behalf of the user who sent the original +`PUT /_matrix/client/v3/rooms/{roomId}/redact/{eventId}/{txnId}` request, if +this user leaves the room the server is no longer able to send redactions on +their behalf. However, the author considers this a small edge case which is +unlikely to happen in practice, and can be worked around by another user (with +permissions to delete the new events) sending another `PUT +/_matrix/client/v3/rooms/{roomId}/redact/{eventId}/{txnId}`. + + ## Alternatives The server could respond to the client with some information about whether some From 7fe8d6f83cda2f89829bd6962336d1a8da977d75 Mon Sep 17 00:00:00 2001 From: Giom Foret Date: Thu, 4 May 2023 17:09:29 +0200 Subject: [PATCH 10/13] Incorporate review - Update title - Correct the provided example, and clarify some use cases --- proposals/3912-relation-based-redaction.md | 57 +++++++++++++++++++--- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/proposals/3912-relation-based-redaction.md b/proposals/3912-relation-based-redaction.md index 4cbe470cd15..ea7fe07917d 100644 --- a/proposals/3912-relation-based-redaction.md +++ b/proposals/3912-relation-based-redaction.md @@ -1,4 +1,4 @@ -# MSC3912: Relation-based redaction +# MSC3912: Redaction of related events There are cases where, when redacting an event, it would make sense to also redact all events that relate to it in a certain way. A few examples of this @@ -37,11 +37,7 @@ For example, let's consider the following message: "type": "m.room.message", "content": { "body": "Hello", - "msgtype": "m.text", - "m.relates_to": { - "rel_type": "m.replace", - "event_id": "$some_event_id" - } + "msgtype": "m.text" }, "event_id": "$a" } @@ -106,6 +102,55 @@ result of this proposal, servers may respond to the request once the event referenced to by the `{eventId}` parameter is redacted, and redact events that relate to it in the background. +This is important to note that we do not consider parent events. In the previous example, +a redaction of `$b` would not cause `$a` to be redacted. The following request: + +``` +PUT /_matrix/client/v3/rooms/!someroom:example.com/redact/$b/foo + +{ + "with_relations": ["m.replace"] +} +``` + +Causes only event `$b` to get redacted. + +The redaction will be limited to the events which meet the validity requirements of the +selected relationship types, for example [these requirements](https://spec.matrix.org/v1.6/client-server-api/#validity-of-replacement-events) for edited events. +In case of the previous example, let's consider this additional event `$c`: + +```json +{ + "type": "m.room.message", + "content": { + "body": "* Hello world2!", + "msgtype": "m.text", + "m.new_content": { + "body": "Hello world2!", + "msgtype": "m.text" + }, + "m.relates_to": { + "rel_type": "m.replace", + "event_id": "$b" + } + }, + "event_id": "$c" +} +``` + +This edit event is invalid because we must not edit an edit (We were supposed to refer to the +original event: `$a`) +Then the request: + +``` +PUT /_matrix/client/v3/rooms/!someroom:example.com/redact/$a/foo + +{ + "with_relations": ["m.replace"] +} +``` + +Causes events `$a` and `$b` to get redacted, but no `$c` ### Unstable feature in `/version` From 55060fc3b4634215d417b4cf280e8cda1bb64613 Mon Sep 17 00:00:00 2001 From: Giom Foret Date: Mon, 29 May 2023 14:58:02 +0200 Subject: [PATCH 11/13] Apply 2 changes for which the current server and client implementation must be updated - rename the new property `with_relations` with `with_rel_types` (to prevent us from introducing a new term ("relations") to refer to event relationships). Only the stable name is changed, we keep the existing unstable one. - introduce a catch-all `"*"` value, which if found in the list means "any relation type" --- proposals/3912-relation-based-redaction.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/proposals/3912-relation-based-redaction.md b/proposals/3912-relation-based-redaction.md index ea7fe07917d..d4fa3fbdf52 100644 --- a/proposals/3912-relation-based-redaction.md +++ b/proposals/3912-relation-based-redaction.md @@ -23,13 +23,17 @@ their other actions would also be prevented by rate limiters as a result). ## Proposal -We add a new optional `with_relations` property to the body of the [`PUT +We add a new optional `with_rel_types` property to the body of the [`PUT /_matrix/client/v3/rooms/{roomId}/redact/{eventId}/{txnId}`](https://spec.matrix.org/latest/client-server-api/#put_matrixclientv3roomsroomidredacteventidtxnid) requests. This property is a list of relation types. If an event relates to the event specified in the `{eventId}` parameter with a relation type specified in -this `with_relations` property, the server also redacts it on behalf of the user +this `with_rel_types` property, the server also redacts it on behalf of the user performing the redaction. The response body of this endpoint does not change. +The client may not be aware of the relation types associated with an event (for +example in the case of moderation). That's why we introduce a catch-all `"*"` value, +which if found in the list means "any relation type". + For example, let's consider the following message: ```json @@ -70,7 +74,7 @@ Then the request: PUT /_matrix/client/v3/rooms/!someroom:example.com/redact/$a/foo { - "with_relations": ["m.replace"] + "with_rel_types": ["m.replace"] } ``` @@ -81,7 +85,7 @@ A server may wish to leverage to redact all events targeted by the redaction request if supports it, however this is not a requirement. -If the `with_relations` property is absent from the request body, only the event referred to by the `{eventId}` parameter (`$a` in the example above) is redacted. Same goes if `with_relations` is an empty list. +If the `with_rel_types` property is absent from the request body, only the event referred to by the `{eventId}` parameter (`$a` in the example above) is redacted. Same goes if `with_rel_types` is an empty list. If an event that matches the redaction criteria (i.e. relates to the event that's being redacted with one of the relation types specified in the request) @@ -109,7 +113,7 @@ a redaction of `$b` would not cause `$a` to be redacted. The following request: PUT /_matrix/client/v3/rooms/!someroom:example.com/redact/$b/foo { - "with_relations": ["m.replace"] + "with_rel_types": ["m.replace"] } ``` @@ -146,7 +150,7 @@ Then the request: PUT /_matrix/client/v3/rooms/!someroom:example.com/redact/$a/foo { - "with_relations": ["m.replace"] + "with_rel_types": ["m.replace"] } ``` @@ -190,4 +194,4 @@ given they have more control over feature UX. ## Unstable prefixes Until this proposal is stabilised, `org.matrix.msc3912.with_relations` should be -used instead of `with_relations`. \ No newline at end of file +used instead of `with_rel_types`. \ No newline at end of file From 938e3ef1813006236433cabe71c4110c08d1edae Mon Sep 17 00:00:00 2001 From: giomfo Date: Mon, 12 Jun 2023 15:30:50 +0200 Subject: [PATCH 12/13] Update proposals/3912-relation-based-redaction.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3912-relation-based-redaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/3912-relation-based-redaction.md b/proposals/3912-relation-based-redaction.md index d4fa3fbdf52..c6c9dd68712 100644 --- a/proposals/3912-relation-based-redaction.md +++ b/proposals/3912-relation-based-redaction.md @@ -156,7 +156,7 @@ PUT /_matrix/client/v3/rooms/!someroom:example.com/redact/$a/foo Causes events `$a` and `$b` to get redacted, but no `$c` -### Unstable feature in `/version` +### Unstable feature in `/versions` Homeservers which support this MSC should indicate it by adding `org.matrix.msc3912` and `org.matrix.msc3912.stable` in the response to `GET From 1b3176cfe105a8d572ce27052f3b9e5e44cc0d9c Mon Sep 17 00:00:00 2001 From: Giom Foret Date: Mon, 12 Jun 2023 16:55:07 +0200 Subject: [PATCH 13/13] Update the "Unstable feature in `/versions`" section --- proposals/3912-relation-based-redaction.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/proposals/3912-relation-based-redaction.md b/proposals/3912-relation-based-redaction.md index c6c9dd68712..6d790be05be 100644 --- a/proposals/3912-relation-based-redaction.md +++ b/proposals/3912-relation-based-redaction.md @@ -158,10 +158,11 @@ Causes events `$a` and `$b` to get redacted, but no `$c` ### Unstable feature in `/versions` -Homeservers which support this MSC should indicate it by adding -`org.matrix.msc3912` and `org.matrix.msc3912.stable` in the response to `GET +While this MSC is unstable, homeservers which support this MSC should indicate it by adding +`org.matrix.msc3912` flag in the `unstable_features` array of the response to `GET /_matrix/client/versions` requests. - +Once this MSC becomes a part of a spec version, clients should rely on the presence of the spec +version, that supports the MSC, in versions on /versions, to determine support. ## Potential issues