Blocked on support from synapse (https://github.com/matrix-org/synapse/issues/1473)
I have no idea why we've never done this; it should be trivial - surely we just delete the 3PID invite from the DAG. Does it even need synapse changes?
yeah, i just deleted a stuck one via /devtools by setting the body of the 3pid invite state event to {} and it dutifully disappeared. the only nastiness is that you end up with

in the timeline, plus the empty state event obviously hangs around forever, but that's a problem of https://github.com/matrix-org/matrix-doc/issues/456
Wouldn't you'd also need to invalidate the invite in the IS so it doesn't try and say the user can join?
You could, but i'm not sure it's the end of the world, given the IS will try exchange the 3pid invite for a real invite, which will fail because the 3pid invite will have been deleted (aka replaced by {})
Any update on this?
This is an important security feature actually, as 3PID unaccepted invites hang around forever and are impossible to revoke currently. So if a user wishes to disinvite a user that never had a chance to accept, he/she can't and a user who should not have access to a room can join undesired at any time.
Most helpful comment
This is an important security feature actually, as 3PID unaccepted invites hang around forever and are impossible to revoke currently. So if a user wishes to disinvite a user that never had a chance to accept, he/she can't and a user who should not have access to a room can join undesired at any time.