Coder Social home page Coder Social logo

matrix-spec-proposals's Introduction

Matrix Specification Proposals

This repository contains proposals for changes to the Matrix Protocol, aka "Matrix Spec Changes" (MSCs). The proposals directory contains MSCs which have been accepted.

See below for instructions for creating new proposals. See also https://spec.matrix.org/proposals/ for more information on the MSC process, in particular https://spec.matrix.org/proposals/#process.

The source of the Matrix specification itself is maintained at https://github.com/matrix-org/matrix-spec.

The Matrix Spec Process

An MSC is meant to be a technical document that unambiguously describes a change to the Matrix Spec, while also justifying why the change should be made.

The document is used both to judge whether the change should be made as described and by developers to actually implement the changes. This is why it's important for an MSC to be fully fleshed out in technical detail, as once merged it's immediately part of the formal spec (even though it still needs to be transcribed into the actual spec itself).

What changes need to follow this process?

In most cases a change to the Matrix protocol will require an MSC. Changes that would not require an MSC are typically small and uncontentious, or are simply clarifications to the spec. Fixing typos in the spec do not require an MSC. In most cases, removing ambiguities do not either. The exception may be if implementations in the ecosystem have differing views on clarifying the ambiguity. In that case, an MSC is typically the best place to reach consensus.

Ultimately, the Spec Core Team have the final say on this, but generally if the change would require updates to a non-insignificant portion of the Matrix implementation ecosystem or would be met with contention, an MSC is the best route to take. You can also ask in the Matrix Spec or Office of the Spec Core Team Matrix rooms for clarification.

Summary of the process

The MSC process consists of three basic steps:

  1. Write up the proposal in a markdown document. (There's a proposal template, but don't feel bound by it.)
  2. Submit it as a Pull Request to this repo, marking it as a draft until it's ready for wider review.
  3. Seek review from the community. Once people are generally happy with it, ask the Spec Core Team to look at it in the Office of the SCT Matrix room. When the SCT are happy with the proposal, and after a successful voting process, your pull request is merged and the MSC is now officially accepted as part of the Matrix Spec and can be used 🎉

For simple changes this is really all you need to know. For larger or more controversial changes, getting an MSC merged can take more time and effort, but the overall process remains the same.

Below is various guidance to try and help make the experience smoother.

Guidance on the process

1. Writing the proposal

Come up with an idea. The idea can be for anything, but the solution (MSC) needs to benefit the Matrix ecosystem rather than yourself (or your company) specifically. Sometimes this means that the solution needs to be more generic than the specific itch that you are trying to scratch.

Remember that an MSC is a formal technical document which will be used by others in the wider community to judge if the proposal should be accepted and to actually implement the changes in clients and servers. This means that for an MSC to be accepted it should include justifications and describe the technical changes unambiguously, including specifying what happens in any and all edge cases.

There's a proposal template under docs/0000-proposal.md, but you don't necessarily need to use it. Covering the same major points is fine.

  • Note: At this stage, you won't have an MSC number, so feel free to use 0000, XXXX, or whatever other placeholder you feel comfortable with.

Some tips for MSC writing:

  • Please wrap your lines to 120 characters maximum. This allows readers to review your markdown without needing to horizontally scroll back and forth. Many markdown text editors have this feature.
  • If you are referencing an existing endpoint in the spec, or another MSC, it is very helpful to add a link to them so the reader does not need to search themselves. Examples:
    • "This MSC proposals an alternative to MSC3030."
    • "A new field will be added to the response body of /_matrix/client/v3/sync".
      • Note: it is best to link to the latest stable version of the spec (e.g. /v1.3, not /latest) - failing that, /unstable if the change is not yet in a released spec version.
  • GitHub supports rendering fancy diagrams from text with very little effort using Mermaid. See this guide for more information.
  • Take a look at the MSC Checklist. When it comes time for the Spec Core Team to review your MSC for acceptance, they'll use the items on this checklist as a guide.

2. Submitting a Pull Request

  1. Open a Pull Request to add your proposal document to the proposals directory. Note that this will require a GitHub account.
  2. The MSC number is the number of the pull request that is automatically assigned by GitHub. Go back through and edit the document accordingly. Don't forget the file name itself!
  3. Edit the pull request title to fit the format "MSC1234: Your proposal title".
  4. Once your proposal is correctly formatted and ready for review from the wider ecosystem, take your Pull Request out of draft status.

The Spec Core Team will notice this and apply various labels/status tracking to your MSC, which will announce it to the wider world.

3. Seeking review

Seek review from the Matrix community. Generally this will happen naturally, but if you feel that your proposal is lacking review then ask for people's opinion in the Matrix Spec room on Matrix.

Reviews can take many forms, and do not need to be done solely by members of the Spec Core Team. Getting other people who are familiar with the area of Matrix you are proposing changes to is a great first step; especially those who may be implementing these changes in clients and/or homeservers.

While the proposal is a work in progress, it's fine for it to be high level and hand-wavy in places, but remember that before it can be accepted it needs to be expanded to fully flesh out all the technical detail and edge cases.

At this stage the proposal should also be implemented as a proof of concept somewhere to show that it actually works in practice. This can be done on any client or server and doesn't need to be merged or released.

4. Entering Final Comment Period

After the MSC has been implemented, fully fleshed out, and generally feels ready for final review, you should ask a member of the Spec Core Team to review it in the public Spec Core Team Office room on Matrix. Someone from the SCT will then review it, and if all looks well will propose FCP to start.

At this point, other members of the SCT will look at the proposal and consider it for inclusion in the spec.

After enough SCT members have approved the proposal, the MSC will enter something called Final Comment Period. This is a 5 calendar day countdown to give anyone one last chance to raise any blockers or concerns about the proposed change. Typically MSCs pass this stage without incident, but it nevertheless serves as a safeguard.

5. The MSC is accepted

Once FCP has ended and the MSC pull request is merged, the proposed change is considered officially part of the spec. Congratulations!

Clients and servers can now start using the change, even though at this stage it still needs to be transcribed into the spec document. This happens over in https://github.com/matrix-org/matrix-spec/ and you are very welcome to do it yourself! Otherwise it will be handled by a Spec Core Team member. If you would like help with writing spec PRs, feel free to join and ask questions in the Matrix Spec and Docs Authoring Room on Matrix.

Other useful information

Unstable prefixes

"Unstable prefixes" are the namespaces which are used by implementations while an MSC is not yet accepted.

For instance, an MSC might propose that a m.space event type or an /_matrix/client/v1/account/whoami endpoint should exist. However, implementations cannot use these stable identifiers until the MSC has been accepted, as the underlying design may change at any time; the design is unstable.

Instead, an MSC can define a namespace such as org.matrix.msc1234 (using the real MSC number once known) which is added to the stable identifier, allowing for breaking changes between edits of the MSC itself, and preventing clashes with other MSCs that might attempt to add the same stable identifiers.

For the above examples, this would mean using org.matrix.msc1234.space and /_matrix/client/unstable/org.matrix.msc1234/account/whoami. It is also fine to use more traditional forms of namespace prefixes, such as com.example.* (e.g. com.example.space).

Note: not all MSCs need to make use of unstable prefixes. They are only needed if implementations of your MSC need to exist in the wild before your MSC is accepted, and the MSC defines new endpoints, field names, etc.

Unstable feature flags

It is common when implementing support for an MSC that a client may wish to check if the homeserver it is communicating with supports an MSC. Typically, this is handled by the MSC defining an entry in the unstable_features dictionary of the /_matrix/client/versions endpoint, in the form of a new entry:

{
  "unstable_features": {
    "org.matrix.msc1234": true
  }
}

... with a value of true indicating that the feature is supported, and false or lack of the field altogether indicating the feature is not supported.

When can I use stable identifiers?

According to the spec process: once an MSC has been accepted, implementations are allowed to switch to stable identifiers. However, the MSC is still not yet part of a released spec version.

In most cases, this is not an issue. For instance, if your MSC specifies a new event type, you can now start sending events with those types!

Some MSCs introduce functionality where coordination between implementations is needed. For instance, a client may want to know whether a homeserver supports the stable version of a new endpoint before actually attempting to request it. Or perhaps the new event type you're trying to send relies on the homeserver recognising that new event type, and doing some work when it sees it.

At this point, it may be best to wait until a new spec version is released with your changes. Homeservers that support the changes will eventually advertise that spec version under /versions, and your client can check for that.

But if you really can't wait, then there is another option: the homeserver can tell clients that it supports stable indentifiers for your MSC before it enters a spec version, using yet another unstable_features flag:

{
  "unstable_features": {
    "org.matrix.msc1234": true,
    "org.matrix.msc1234.stable": true
  }
}

If a client sees that org.matrix.msc1234.stable is true, it knows that it can start using stable identifiers for the new MSC, and the homeserver will accept and act on them accordingly.

Note: While the general pattern of using the text ".stable" has emerged from previous MSCs, you can pick any name you like. You need only to clearly state their meaning, usually under an "Unstable prefixes" header in your MSC.

See MSC3827 for a good example of an MSC that wanted to use such a flag to speed up implementation rollout, and how it did so.

Room versions

To summarize the spec on room versions: they are how servers agree upon algorithms in a decentralized world like ours. Examples of changes that require a new room version include anything that changes:

Unstable prefixes (see above) for room versions work the same as they do for other identifiers; your unstable room version may be called "org.matrix.msc1234".

In order for the changes to end up in a "real" room version (the ones listed in the spec), it will need a second MSC which aggregates a bunch of functionality from various MSCs into a single room version. Typically these sorts of curating MSCs are written by the Spec Core Team given the complexity in wording, but you're more than welcome to bring an MSC forward which makes the version real.

For an example of what introducing a new room version-required feature can look like, see MSC3667. For an example of what making a new "real" room version looks like, see MSC3604.

Ownership of MSCs and closing them

If an author decides that they would no longer like to pursue their MSC, they can either pass ownership of it off to someone else, or close it themselves.

  • The author of an MSC can close their MSC at any time before FCP by simply closing the pull request.

  • To appoint another user as an author of the MSC (either to replace the author entirely or to provide additional help), make a note in the MSC's PR description by writing the following on its own line:

    Author: @username
    

    where @username is a valid GitHub username. Multiple such lines can be added.

    Finally, give that user access to write to your fork of matrix-spec-proposals on GitHub, which your PR originates from. This will allow them to change the text of your MSC.

Similar to accepting an MSC, the Spec Core Team may propose a Final Comment Period with a disposition of "close". This can happen if the MSC appears abandoned by its author, or the idea is widely rejected by the community. A vote and final comment period will still be required for the motion to pass.

Additionally, FCP can be also proposed with a disposition of "postpone". This may be done for MSCs for which the proposed changes do not make sense for the current state of the ecosystem, but may make sense further down the road.

Asking for help

The Matrix community and members of the Spec Core Team are here to help guide you through the process!

If you'd just like to get initial feedback about an idea that's not fully fleshed out yet, creating an issue at https://github.com/matrix-org/matrix-spec/issues is a great place to start. Be sure to search for any existing issues first to see if someone has already had the same idea!

A few official rooms exist on Matrix where your questions can be answered, or feedback on your proposal can be requested:

matrix-spec-proposals's People

Contributors

aaronraimist avatar afranke avatar anoadragon453 avatar ara4n avatar babolivier avatar benparsons avatar clokep avatar dbkr avatar deepbluev7 avatar erikjohnston avatar half-shot avatar iinuwa avatar illicitonion avatar jimmycuadra avatar kegsay avatar kitsuneral avatar leonerd avatar lukaslihotzki avatar negativemjark avatar neilisfragile avatar oddvar avatar reivilibre avatar richvdh avatar sorunome avatar t3chguy avatar tulir avatar turt2live avatar uhoreg avatar wbamberg avatar zil0 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

matrix-spec-proposals's Issues

Directory-service "list" verb (SPEC-71)

Add a property to room alias mappings to store whether they are "listed":

  PUT .../directory/room/:alias
  { room_id: "!foobar:example.org", listed: true }

Add a "list" verb to retrieve only those aliases marked as listed:

  GET .../directory/rooms

This might then serve as a replacement of, or at least in addition to, the current /publicRooms URL, which seems somewhat at odds with the unrelated concept of a room being "public"; which there relates to permission to join without an invite.

(Imported from https://matrix.org/jira/browse/SPEC-71)

(Reported by @leonerd)

We need to define the validation rules applied to federation events. (SPEC-27)

My notes from talking to Mjark yesterday:

  • Rules that we apply to check whether things aren't valid. Too loose, we risk spoofing - too tight, we risk DoS (perhaps)

A main question: should you reject stuff which is included in a transaction from a server, but isn't originally from that server, and is invalid? Answer: probably. However you need to check you can't engineer a state where a malicious server encourages a legitimate server to accept an invalid message.

(Imported from https://matrix.org/jira/browse/SPEC-27)

(Reported by @ara4n)

We need a way of defining groups that users belong to. (SPEC-107)

We need to somehow define & maintain decentralised lists of users. These would be useful for:

  • Letting users declare affiliation to certain organisations/groups/guilds/whatever in their profiles. (e.g. so that @​matthew:matrix.org can prove that he's an official member of the Matrix.org team, or that @​stalund:matrix.org can prove he's an official OpenWebRTC team member, or whatever)
  • Applying ACLs per group rather than per user

Suggestions on a postcard...

(Imported from https://matrix.org/jira/browse/SPEC-107)

(Reported by @ara4n)

We need an access control model for room aliases. (SPEC-90)

Split out from SYN-2.

In the current model, room aliases reside logically on directory servers, and we don't specify any way of controlling who is allowed to edit them.

This is a security concern, as we need to define who has permission to delete aliases (SYN-2). The problem of repointing an alias is equivalent to deleting & then recreating it.

We could let the directory server specify its own rules for who can modify aliases - but explaining to users how a custom permission model works, and providing a standard interface in their client to edit that permission model, feels both fragmented and confusing. Forcing the user to manipulate a custom out-of-band permissions model seems wrong and confusing when Matrix already has its own permissions model built in (power levels).

Therefore, I propose that directory servers must always be associated with a homeserver - and thus be able to correlate the aliases they advertise with the room in question on said homeserver. This then allows you to use the power levels for the users in that room to decide who is allowed to edit the alias.

So, you could set a state key of m.room.edit_alias_level, and mandate that a user needs a power level of at least X in the room to change that room's aliases. The DS would then enforce this behaviour. This means that clients can leverage their existing power-level management APIs to control who can edit room aliases, rather than having to go out-of-band to a potentially alternative ACL system to manage them.

(Imported from https://matrix.org/jira/browse/SPEC-90)

(Reported by @ara4n)

End-to-End Crypto (SPEC-162)

update April 2017: we now have more-or-less operational E2E encryption in matrix. The work remaining on this issue is to specify it.


End-to-end encryption in Matrix is currently a work-in-progress. A draft of the specification is being prepared on the drafts/e2e branch of matrix-doc. The purpose of this issue is to provide an overview of the work that is outstanding.

An audit of the Olm library, and Olm's use in matrix

Matrix's cryptographic support has been designed according to our understanding of the latest security research and algorithms. However, none of the matrix.org team are trained security experts.

We would welcome an independent audit of our designs and implementations, to highlight any potential vulnerabilities.

(update: NCC group carried out a review on the olm and megolm protocols, and the libolm implementations in November 2016: https://www.nccgroup.trust/us/our-research/matrix-olm-cryptographic-review/)

New device handling (SPEC-271)

We need better support for adding new devices to conversations.

Protocol support for out-of-room messages (#443), and implementations in homeservers and clients

Once all recipients have received encrypted data, it is useless (even to the original recipients), because nobody can decrypt it. There is no point keeping such history in a DAG forever. Good security practice dictates that we destroy the ciphertext even if we are confident in the security of the encryption.

Group chat support (#589)

m.room.encrypted events are a valid proof-of-concept to show that we can transmit encrypted data between clients; however this does not scale beyond a few users, and does not give a good user experience. #589 considers how this can be improved.

Encryption controls on rooms (#590)

Not every room will need or want the same level of security. We need to define some controls for room administrators to use.

Support for encryption of attachments (#461)

This might become obvious after #589, but we should remember to make sure that uploaded files can be encrypted as well as messages.

(Imported from https://matrix.org/jira/browse/SPEC-162)

(Reported by @ara4n)

Homeservers as OAuth authorization endpoints (resource owners) (SPEC-206)

Documentation: https://docs.google.com/document/d/1vEPFlX79oa1foBmar6i8nvw-hB4SXfVqg6o6Wsdl1kQ/edit
Author: @kegsay

We want third parties (ASes, random web apps which use OAuth to login as someone) to be able to act on behalf of real matrix users. Currently, they simply can't, as they can't authenticate as a given user_id.

We should probably expose a CS HTTP API endpoint /oauth which expects to be hit with a redirect_uri, scopes, etc and ideally a browser-sent access_token from the redirect (obviously not automatic given the token is a query param and not a Cookie :( ). If not logged in, you'd need to login as usual for that HS (e.g. m.login.password) and then go to the "Accept scopes" page. This will then return a token which the 3rd party service can use as an access_token.

Note that this is completely different to the role HSes play during reg/login where we ARE the "web app" wanting to authenticate on another 3rd party (FB/G+/etc).

This is becoming increasingly important as more services wish to authenticate as existing user IDs rather than having user ID fragmentation/namespace hell.

(Imported from https://matrix.org/jira/browse/SPEC-206)

(Reported by @kegsay)

Support for HSes (or ASes) to participate in a room irrespective of whether members are present (SPEC-160)

Currently, a room can only be replicated on a HS if that HS has a user present in the room. This introduces some potential limitations:

  • You can't deliberately replicate a room over a cluster of HSes for HA
  • The HS (or AS) can't participate in a room as an admin superuser as suggested in https://github.com/matrix-org/matrix-doc/issues/498, to ensure there's always a 'god' user present in case of disaster.
  • You can't have invisible AS users
  • ...probably others i've forgotten.

(Imported from https://matrix.org/jira/browse/SPEC-160)

(Reported by @ara4n)

AS URI format (SPEC-124)

Context: http://matrix.org/docs/spec/#user-ids

We need to specify the API for how Application Services can register for URI queries (from the URI -> user_id/alias lookup API). Most likely this will be an extra key in /register e.g. uris, but what does it look like?

uris: [
     {
       "scheme": "irc",
       "hierarchical_regex": ".*",
       "query_regex": ".*",
       "fragment_regex": ".*"
     },
   ]

Or just a blunt regex?

uris: [
     {
       "regex": "irc://.*"
     }
   ]

How do we handle clashes? We need to return exactly one ID in response to the URI request, so presumably say "It's up to the server admin not to install clashing ASes, HSes SHOULD just invoke the first match found: if there are multiple which one is returned is undefined"?

(Imported from https://matrix.org/jira/browse/SPEC-124)

(Reported by @kegsay)

v2 - Relates to (SPEC-98)

bq. Should be able to specify more relationship info other than just the event type. Forcing that m.room.message A "relates_to" another m.room.message B means that A is a threaded conversation reply to B is needlessly restrictive. What if A and B relate to each other by some other metric (e.g. they are part of a group rather than a thread? or we distinguish mail-style threading from multithreaded-IM threading for the same set of messages? etc)? E.g.

"relates_to" : [["in_reply_to", "$event_id1"], ["another_type_of_relation", "$event_id2"]]

(Imported from https://matrix.org/jira/browse/SPEC-98)

(Reported by @kegsay)

Consider the implications of which server creates the event ID as part of the make_join/send_join dance (SPEC-242)

In the subtle multi-way handshake that is federation's make_join+send_join dance to join a new user on there are two candidate ways that the event ID of the newly-created m.room.member event gets specified.

  1. The assisting server returns one in the protoevent returned by make_join
  2. The joining server sets one when it makes the final event and posts it to send_join

Provided that event ID is domained to either of the servers, and is thus covered by the signatures when both sign the event, it at first doesn't appear to matter which server's choice of ID actually gets persisted in the final version of the event.

We might want to carefully consider the implications of either choice and make a requirement in the specification, when it gets documented. (See also #554)

(Imported from https://matrix.org/jira/browse/SPEC-242)

(Reported by @leonerd)

Consider factoring out event content into 'blobs' separate from graphs (SPEC-139)

There are various scenarios where we might want to share a single event between multiple rooms:

  • If we 'fork' a room in order to change visibility rules (as per Dave's proposal in SPEC-17)
  • If we build a twitter clone where messages get stored in multiple rooms (per-hashtag, per-mention, etc) for ease of indexing/consumption
  • If we want to easily move threads between rooms in a forum-per-room forum scenario

I wonder if it'd be worth considering going further towards a git-style data model sooner than later where events are stored and referred separately from event graphs, allowing them to be easily factored out between multiple graphs.

(Imported from https://matrix.org/jira/browse/SPEC-139)

(Reported by @ara4n)

Ability to send out-of-band events (SPEC-138)

We need the ability to send messages outside the context of a room; this is useful for things like sharing keys for group chats (#589).

What are out-of-band events?

  • They events are deleted from a server when they have been downloaded by all recipients.
    *- The sender HS will need to store the event until the recipient HSes have received the event.
    *- A recipient HS will need to store the event until the recipient devices have received the event.
  • Presumably they are never received via pagination calls, so are never elided from a sync.

What changes are needed in matrix to support them?

  • New C-S API for sending events: needs:
    *- the list of recipients
    *- list of devices (which might be all (to make sure it goes to all devices) or any (which indicates that sending it to a single device is adequate))
  • New S-S semantics for sending events.
    *- The existing S-S federation assumes that events are part of a persistent DAG.
  • New C-S semantics for receiving messages:
    *- Need to send out-of-band events down the sync pipe
    *- Clients need to tell the server that they have received a message so that the server can delete the message. Possibly we can infer this if the client sends another sync.

Implementation Questions:

  • How does the HS know when it can delete an event? (we probably need the ability to flag old devices as inactive)

(Imported from https://matrix.org/jira/browse/SPEC-138)

(Reported by @ara4n)

Support for Reactions / Aggregations

Documentation: https://docs.google.com/document/d/1CnNbYSSea0KcyhEI6-rB8R8u6DCZyZv-Pv4hhoXJHSE/edit
Author: @pik
Shepherd: @ara4n
Date: 25/12/2016
See also: matrix-org/synapse#1633

Currently we have no good way to model 'voting' metadata about messages (e.g. FB likes or Reddit/Slashcode up/downvotes). The best we can do is to synchronise around 'update' messages in the v2 CS-API - this could get very noisy and heavyweight for a typical FB-style "1M likes!" scenario.

We could help mitigate this by coalescing certain updates into the original event - both for server->client and server->server synchronisation. However, this can never work in an E2E crypto world (unless we don't encrypt the vote, which doesn't seem great). Worth noting that an E2E room with lots of participants becomes increasingly insecure to the point that it might as well not be E2E, as the room is only as safe as the security of the clients connected to it, so we might be able to sidestep this in practice somehow. Alternatively, we could try to fix the scalability implications of syncing all these 'like' events by somehow QoSing them: federating them at lower priority; having them semi-ephemeral and parented only to the event they describe to avoid disrupting the main message graph; putting them in a separate message graph; etc.

In a non-e2e world, we could coalesce... I believe having a HS say "150 users Liked this message" is no more open to abuse than trusting a HS to accurately report /any/ message from its users. But then we need a mechanism to de-coalesce on demand (e.g. to actually start paginating through the list of 1M users who hit 'Like').

(Imported from https://matrix.org/jira/browse/SPEC-135)

(Reported by @ara4n)

Format for rich text messages (SPEC-48)

Currently, m.text just supports a raw string. Whilst we have solved the attachment use case (via m.image, m.video and so on), we have no current way to specify markup for raw text.

After doing some research, there are a handful of options here:

  • Roll our own format e.g.
  spans: [ 
    { type: bold, start: 4, end: 9 }, 
    { type: italic, start: 15, end: 21 } 
  ]

  • Use XHTML tags (and strip the nasty ones)
  • Use BBCode
  • Use Markdown
  • Use reStructured Text (RST)

I would prefer that we didn't re-invent the wheel on this, so I'm against rolling our own format. Using XHTML tags would be fine, but the kicker is that there are unsafe tags which we'd want to strip (akin to XEP-0071). Clients may be lazy and not strip bad tags, and everything goes into a mess. For these reasons, I'm against using XHTML as the markup for this.

This leave BBCode and Markdown/RST. BBCode has been around for a long time, has easy regex parsing to map directly to HTML, though there are odd quirks with it such as ambiguous markup syntax. Markdown/RST have a lot of libraries for different languages to map to HTML, and provide a richer feature set than BBCode. As such, I'd prefer either Markdown or RST.

Without getting into the holy war of RST vs Markdown, RST is more mature at the moment since there is a well-defined spec http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html and not many different fragmented versions (unlike Markdown). That being said, this will be fixed in the future http://commonmark.org/ - I hold no real preference as to which we should use. It seems Markdown has a slightly nicer syntax and is geared more towards generating HTML possibly, which I feel may be more aligned with what we actually want from a markup language.

Thoughts welcome.

(Imported from https://matrix.org/jira/browse/SPEC-48)

(Reported by @kegsay)

Generalized presence lists (SPEC-46)

(migrated from matrix-org/synapse#3)

KoFish commented 2014/09/04:

Rather than only storing one list per user on a HS the concept of lists could be abstracted into just having lists that certain users (private/public) can subscribe too. Similar to lists on twitter or facebook.

These would then work similar to how rooms work but instead just passing along the listed users presence events.

(Imported from https://matrix.org/jira/browse/SPEC-46)

(Reported by @leonerd)

Clarification needed of where aliases are stored (SPEC-66)

The current documentation fails to mention how the room aliases are to be managed. It's implied that it would be possible for a homeserver to manage aliases for other homeservers and there is a mention of a directory server and the /directory/room/ API but neither really describes how a homeserver should store and manage aliases it knows about or that have been resolved.

(Imported from https://matrix.org/jira/browse/SPEC-66)

(Reported by Krister Svanlund)

Invite spam control (SPEC-96)

See SPEC-60 for room knock support.

There are outstanding issues with inviting users to rooms, namely:

  • Clients need to know why they are being invited (e.g. a reason key, just like for kicks/bans). However, this opens up a spam vector where any user can send any other user a string. Do we really want to do that?
  • It may be useful to send other state information such as the room name, topic, etc. How is this specified in this request? Does the inviter even specify this, or is it a room config option which fields are shared? This has a lot of parallels with the published room API which exposes some state events.
    • How do we prevent spam attacks via the room name/topic? The spam attack vector may be something we're just going to have to deal with. Ultimately, we need to expose more data about the room. This data is going to be set by the client. Compromises like "just give the event type" don't really fix the problem "because.my.event.type.could.be.like.this".

(Imported from https://matrix.org/jira/browse/SPEC-96)

(Reported by @kegsay)

Support for discovering API endpoints via .well-known URIs (SPEC-121)

Documentation: https://docs.google.com/document/d/1OdEj06qA7diURofyonIMgTR3fB_pWf12Txye41qd-U4/edit, https://docs.google.com/document/d/1vF-uWlUYmf1Xo161m871H1upJbwiIPeikWGWzaE_lrU/edit#
Author: @maxidor, others
Shepherd: @uhoreg
PRs: #1359

We have several reasons why we might want to use .well-known URIs to discover API endpoints:

  • Clients which can't query SRV records (e.g. webclients trying to discover the C-S API for a given user ID's domain)
  • Admins who don't want to use the /_matrix convention, and adhere to RFC5785 instead
  • Admins who can't create SRV records
  • Dynamic .well-known URIs to help discover nomadic homeservers

See also SYWEB-224 and SYN-167

We should just get on and do it. Unsure whether SRV should trump .well-known URIs or not for server-server traffic.

(Imported from https://matrix.org/jira/browse/SPEC-121)

(Reported by @ara4n)

An explicit websocket (or web push) profile for the client-server API (SPEC-81)

Something that has come up repeatedly in recent WebRTC conferences (San Jose and Paris) is that whilst folks understand and respect the decision to have REST as the only mandatory baseline C-S API, they'd still really really like an optional stream-oriented API of some flavour like Web Sockets to avoid having to poll and potential battery-life/bandwidth implications. And they reason that this optional API should be specified by Matrix to avoid fragmentation.

So we should do it.

(Imported from https://matrix.org/jira/browse/SPEC-81)

(Reported by @ara4n)

Federation API for canonicalising MXIDs

Documentation: https://docs.google.com/document/d/1B7q_3ruJzeQTg-uJHe1UScxbVLzgm451c25OjpYcojI/edit#
Author: @ara4n

I'm seeing more and more disasters with people failing to identify users correctly due to case sensitive IDs. For instance Amandine's business cards say @​amandine:matrix.org whereas she's registered as @​Amandine:matrix.org.

Splitting this out from matrix-org/synapse#1220

(Imported from https://matrix.org/jira/browse/SPEC-289)

(Reported by @ara4n)

Ability to blacklist users from contacting you. (SPEC-123)

We currently have no way of asking you server to blacklist groups of users from ever trying to contact you. This is a pretty important abuse avoidance metric.

Open questions include:

  • Per-user or per-group (need a generic way to manage lists of users then, but we kinda need that anyway)
  • Ignore invites, or all traffic from these users?
  • Can we build this into reputation analysis?

The use case here is that someone invites you to a chat, either with a nasty name or nasty contents after you accept the invite, and you never want to see them again.

(Imported from https://matrix.org/jira/browse/SPEC-123)

(Reported by @ara4n)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.