<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.2.9) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-ietf-ocm-open-cloud-mesh-00" category="std" consensus="true" submissionType="IETF">
  <front>
    <title>Open Cloud Mesh</title>

    <author initials="G." surname="Lo Presti" fullname="Giuseppe Lo Presti">
      <organization>CERN</organization>
      <address>
        <email>giuseppe.lopresti@cern.ch</email>
        <uri>http://cern.ch/lopresti</uri>
      </address>
    </author>
    <author initials="M. B." surname="de Jong" fullname="Michiel de Jong">
      <organization>Ponder Source</organization>
      <address>
        <email>michiel@pondersource.org</email>
        <uri>https://pondersource.com</uri>
      </address>
    </author>
    <author initials="M." surname="Baghbani" fullname="Mahdi Baghbani">
      <organization>Ponder Source</organization>
      <address>
        <email>mahdi@pondersource.org</email>
        <uri>https://pondersource.com</uri>
      </address>
    </author>
    <author initials="M." surname="Nordin" fullname="Micke Nordin">
      <organization>SUNET</organization>
      <address>
        <email>kano@sunet.se</email>
        <uri>https://code.smolnet.org/micke</uri>
      </address>
    </author>

    <date year="2025" month="November" day="25"/>

    <area>Applications and Real-Time</area>
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 38?>

<t>Open Cloud Mesh (OCM) is a server federation protocol that is used to
notify a Receiving Party that they have been granted access to some
Resource.  It has similarities with authorization flows such as
OAuth, as well as with social internet protocols such as ActivityPub
and email.</t>

<t>A core use case of OCM is when a user (e.g., Alice on System A) wishes
to share a resource (e.g., a file) with another user (e.g., Bob on
System B) without transferring the resource itself or requiring Bob to
log in to System A.</t>

<t>While this scenario is illustrative, OCM is designed to support a
broader range of interactions, including but not limited to file
transfers.</t>

<t>Open Cloud Mesh handles interactions only up to the point where the
Receiving Party is informed of their access to the Resource.  Actual
Resource access is subsequently managed by other protocols, such as
WebDAV.</t>



    </abstract>



  </front>

  <middle>


<?line 60?>

<section anchor="introduction"><name>Introduction</name>

<t>Open Cloud Mesh was initially conceived of in 2015 and has been deployed
since 2016.  OCM has been implemented by several platforms, including
CERNBox, Nextcloud, OpenCloud, ownCloud, and Seafile.</t>

<t>The goal of OCM is to provide a secure, scalable, and flexible
infrastructure for securely sharing and collaborating on resources and
has seen wide adoption, not least in the academic sector.</t>

<t>The core idea of OCM is to make it simple for users to do the right
thing.  This is achieved by providing a protocol that abstracts away
security and authentication details from the users to the servers acting
on behalf of the users.  Another important point of the protocol is the
invitation mechanism that lets users connect over established human
relationships and uses those connections to establish contact between
their respective OCM servers.</t>

</section>
<section anchor="terms"><name>Terms</name>

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 [RFC2119] [RFC8174] when, and only when,
they appear in all capitals, as shown here.</t>

<t>We define the following concepts, with some non-normative references to
related concepts from OAuth [RFC6749] and elsewhere:</t>

<t><list style="symbols">
  <t><strong>Resource</strong> - The piece of data or interaction to which access is
being granted, including but not limited to: a file or folder, a video
call, a contact, a printer queue, etc.</t>
  <t><strong>Remote Resource</strong> - A Resource provided by the Sending Server.</t>
  <t><strong>Shared Resource</strong> - A Resource shared by an OCM Server, becoming a
Remote Resource if accepted by the Invite Receiver OCM Server.</t>
  <t><strong>Share</strong> - A policy rule stating that certain actors have specific
access rights to a Resource; it MAY also refer to a record in a
database representing this rule.</t>
  <t><strong>Sending Party</strong> - A person or party who is authorized to create
Shares; similar to "Resource Owner" in OAuth [RFC6749], identified by
its OCM Address.</t>
  <t><strong>Receiving Party</strong> - A person, group or party who is granted access
to the Resource through the Share; similar to "Requesting Party / RqP"
in OAuth-UMA, identified by its OCM Address.</t>
  <t><strong>Share Creation Notification</strong> - A server-to-server request from the
sending server to the receiving server, notifying the receiving server
that a Share has been created.</t>
  <t><strong>Sending Server</strong> - The server that:
  <list style="symbols">
      <t>holds the Resource ("file server" or "Entreprise File Sync and Share
(EFSS) server" role),</t>
      <t>provides access to it (by exposing at least one "API"),</t>
      <t>takes the decision to create the Share based on user interface
gestures from the Sending Party (the "Authorization Server" role in
OAuth [RFC6749]),</t>
      <t>takes the decision about authorizing attempts to access the Resource
(the "Resource Server" role in OAuth [RFC6749]),</t>
      <t>sends out Share Creation Notifications when appropriate (see below).</t>
    </list></t>
  <t><strong>Receiving Server</strong> - The server that:
  <list style="symbols">
      <t>receives Share Creation Notifications (see below),</t>
      <t>actively or passively notifies the receiving user or group of any
incoming Share Creation Notification,</t>
      <t>acts as an API client, allowing the receiving user to access the
Resource through an API (e.g., WebDAV [RFC4918]) of the sending
server.</t>
    </list></t>
  <t><strong>Sending Gesture</strong> - A user interface interaction from the Sending
Party to the Sending Server, conveying the intention to create a
Share.</t>
  <t><strong>Share Creation</strong> - The addition of a Share to the database state of
the Sending Server, in response to a successful Sending Gesture or for
another reason.</t>
  <t><strong>Sharing User</strong> - A user providing access to a Resource through a
Share.</t>
  <t><strong>FQDN</strong> - Fully Qualified Domain Name, such as <spanx style="verb">"cloud.example.com"</spanx>.</t>
  <t><strong>OCM Server</strong> - A server that supports OCM.</t>
  <t><strong>OCM API Discovery</strong> - Process of evaluating properties of a Remote
Resource, after establishing contact with an OCM Server.</t>
  <t><strong>Discovering Server</strong> - A server that tries to obtain information in
OCM API Discovery.</t>
  <t><strong>Discoverable Server</strong> - A server that tries to supply information in
OCM API Discovery.</t>
  <t><strong>OCM Address</strong> - identifies a user or group "at" an OCM Server.
The OCM Address contains a server specific Party identifier, a host
locating the OCM Server and an optional port. The OCM Address is not a
URI as it does not have scheme and the identifier may contain reserved
characters.  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  ocm-address = identifier "@" host [ ":" port]
]]></artwork></figure>
  <vspace blankLines='1'/>
The identifier is an opaque, case-sensitive UTF-8 string. It is 
  separated from the host by the last "@" in the OCM Address. It is
  possible to have multiple @-signs in a OCM-address, e.g. when an 
  email address is the local part of the address like 
  <spanx style="verb">nomen.nescio@example.org@ocm.example.org</spanx>.  <vspace blankLines='1'/>
host is an IP literal encapsulated within square brackets, an IPv4 
  address in dotted decimal form, or a registered name as described in
  [RFC3986].  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  host = IP-literal / IPv4address / reg-name
]]></artwork></figure>
  <vspace blankLines='1'/>
The optional port subcomponent can be used to specify a port to use
  for discovery (see Discovery Process).  <vspace blankLines='1'/>
The OCM Server MUST be discoverable at the given host and optional 
  port via the Well-Known [RFC8615] path <spanx style="verb">/.well-known/ocm</spanx>. The OCM 
  Address MUST NOT contain a path.</t>
  <t><strong>OCM Notification</strong> - A message from the Receiving Server to the
Sending Server or vice versa, using the OCM Notifications endpoint.</t>
  <t><strong>Invite Message</strong> - Out-of-band message used to establish contact
between parties and servers in the Invite Flow, containing an Invite
Token (see below) and the Invite Sender's OCM Address.</t>
  <t><strong>Invite Sender</strong> - The party sending an Invite, identified by its
OCM Address.</t>
  <t><strong>Invite Receiver</strong> - The party receiving an Invite, identified by its
OCM Address.</t>
  <t><strong>Invite Sender OCM Server</strong> - The server holding an address book
used by the Invite Sender, to which details of the Invite Receiver are
to be added.</t>
  <t><strong>Invite Receiver OCM Server</strong> - The server holding an address book
used by the Invite Receiver, to which details of the Invite Sender are
to be added.</t>
  <t><strong>Invite Token</strong> - A hard-to-guess string used in the Invite Flow,
generated by the Invite Sender OCM Server and linked uniquely to the
Invite Sender's OCM Address.</t>
  <t><strong>Invite String</strong> - A base64 encoded string containing an Invite Token
and the FQDN of an Invite Sender OCM Server joined by an <spanx style="verb">@</spanx>-sign.</t>
  <t><strong>Invite Creation Gesture</strong> - Gesture from the Invite Sender to the
Invite Sender OCM Server, resulting in the creation of an Invite
Token.</t>
  <t><strong>Invite Acceptance Gesture</strong> - Gesture from the Invite Receiver to
the Invite Receiver OCM Server, supplying the Invite Token as well as
the OCM Address of the Invite Sender, effectively allowlisting the
Invite Sender OCM Server for sending Share Creation Notifications to
the Invite Receiver OCM Server.</t>
  <t><strong>Invite Acceptance Request</strong> - API call from the Invite Receiver OCM
Server to the Invite Sender OCM Server, supplying the Invite Token as
well as the OCM Address of the Invite Receiver, effectively
allowlisting the Invite Sender OCM Server for sending Share Creation
Notifications to the Invite Receiver OCM Server.</t>
  <t><strong>Invite Acceptance Response</strong> - HTTP response to the Invite
Acceptance Request.</t>
  <t><strong>Share Name</strong> - A human-readable string, provided by the Sending
Party or the Sending Server, to help the Receiving Party understand
which Resource the Share grants access to.</t>
  <t><strong>Share Permissions</strong> - protocol-specific allowances granted to the
Receiving Party on the modes of accessing the Resource.</t>
  <t><strong>Share Requirements</strong> - Protocol-specific restrictions on the modes
of accessing the Resource.</t>
  <t><strong>Trusted Server</strong> - An OCM Server that is considered trustworthy by
  another OCM Server, based on out-of-band information, federation
  membership or prior interactions, SHOULD be recorded in an internal
  registry of trusted servers, that SHOULD be updated over time based
  on new information. The registry SHOULD include the FQDN of the 
  trusted server and the Public Key used for HTTP Signatures. It MAY
  also include additional metadata such as the inviteAcceptDialog URL
  or supported capabilities.</t>
  <t><strong>WAYF Page</strong> - A Where-Are-You-From page is a discovery service used
to identify the OCM Server of an Invite Receiver.</t>
  <t><strong>Directory Service</strong> - A third-party service that exposes a list of
trusted OCM Servers.</t>
</list></t>

</section>
<section anchor="general-flow"><name>General Flow</name>

<t>The lifecycle of an Open Cloud Mesh Share starts with prerequisites such
as establishing trust, establishing contact, and OCM API Discovery.</t>

<t>Then the share creation involves the Sending Party making a Sending
Gesture to the Sending Server, the Sending Server carrying out the
actual Share Creation, and the Sending Server sending a Share Creation
Notification to the Receiving Server.</t>

<t>After this, the Receiving Server MAY notify the Receiving Party and/or
the Sending Server, and will act as an API client through which the
Receiving Party can access the Resource.  The Receiving Party or
the Sending Party MAY then update or delete the Share: the respective
Server MAY send a Notification to the other party about the change.</t>

</section>
<section anchor="establishing-contact"><name>Establishing Contact</name>

<t>Before the Sending Server can send a Share Creation Notification to the
Receiving Server, it MUST establish the Receiving Party's OCM
Address (containing the Receiving Server's FQDN, and the Receiving
Party's identifier), among other things.  Some steps may preceed the
Sending Gesture, allowing the Sending Party to establish (with some
level of trust) the OCM Address of the Receiving Party.  In other cases,
establishing the OCM Address of the Receiving Party happens as part of
the Sending Gesture.</t>

<section anchor="direct-entry"><name>Direct Entry</name>

<t>The simplest way for this is if the Receiving Party shares their OCM
Address with the Sending Party through some out-of-band means, and the
Sending Party enters this string into the user interface of the Sending
Server, by means of typing or pasting into an HTML form, or clicking a
link to a URL that includes the string in some form.</t>

</section>
<section anchor="address-books"><name>Address books</name>

<t>The Sending Server MAY offer the Sending Party an address book tool,
where OCM Addresses can be stored over time in a labeled and/or
searchable way.  This decouples the act by which the OCM Address string
is passed into the Sending Server's database from the selection of the
Receiving Party in preparation for Share Creation.</t>

</section>
<section anchor="public-link-flow"><name>Public Link Flow</name>

<t>An interface for anonymously viewing a Resource on the Sending Server
MAY allow any internet user to type or paste an OCM address into an HTML
form, as a Sending Gesture.  This means that the Sending Party and the
Receiving Party could be the same person, so contact between them does
not need to be explicitly established.</t>

</section>
<section anchor="public-invite-flow"><name>Public Invite Flow</name>

<t>Similarly, an interface on the Sending Server MAY allow any internet
user to type or paste an OCM address into an HTML form, as a Sending
Gesture for a given Resource, without itself providing a way to access
that particular Resource.  A link to this interface could then for
instance be shared on a mailing list, allowing all subscribers to
effectively request access to the Resource by making a Sending Gesture
to the Sending Server with their own OCM Address.</t>

</section>
<section anchor="invite-flow"><name>Invite Flow</name>

<section anchor="rationale"><name>Rationale</name>

<t>Many methods for establishing contact allow unsolicited contact with the
prospective Receiving Party whenever that party's OCM Address is known.
The Invite Flow requires the Receiving Party to explicitly accept it
before it can be used, which establishes bidirectional trust between the
two parties involved.</t>

<t>OCM Servers MAY enforce a policy to only accept Shares between such
trusted contacts, or MAY display a warning to the Receiving Party when a
Share Creation Notification from an unknown Sending Party is received</t>

</section>
<section anchor="steps"><name>Steps</name>

<t><list style="symbols">
  <t>the Invite Sender OCM Server generates a unique Invite Token and helps
the Invite Sender to create the Invite Message</t>
  <t>the Invite Sender uses some out-of-band communication to send the
Invite Message, containing the Invite Token and the Invite Sender OCM
Server FQDN, to the Invite Receiver</t>
  <t>the Invite Receiver navigates to the Invite Receiver OCM Server and
makes the Invite Acceptance Gesture.  This step MAY be facilitated if
the Invite Sender OCM Server implements a WAYF Page, such that the
Invite Message would include a link to it for the Invite Receiver to
navigate to: the Invite Receiver would then be able to indicate their
OCM Server and proceed with the Invite Acceptance Gsture without
manually copying the Invite Token.</t>
  <t>the Invite Receiver OCM Server discovers the OCM API of the Invite
Sender OCM Server using generic OCM API Discovery (see section below)</t>
  <t>the Invite Receiver OCM Server sends the Invite Acceptance Request to
the Invite Sender OCM Server</t>
</list></t>

</section>
<section anchor="invite-acceptance-request-details"><name>Invite Acceptance Request Details</name>

<t>Whereas the precise syntax of the Invite Message and the Invite
Acceptance Gesture will differ between implementations, the Invite
Acceptance Request SHOULD be a HTTP POST request:</t>

<t><list style="symbols">
  <t>to the <spanx style="verb">/invite-accepted</spanx> path in the Invite Sender OCM Server's OCM
API</t>
  <t>using <spanx style="verb">application/json</spanx> as the <spanx style="verb">Content-Type</spanx> HTTP request header</t>
  <t>its request body containing a JSON document representing an object
with the following string fields:
  <list style="symbols">
      <t>REQUIRED: <spanx style="verb">recipientProvider</spanx> - FQDN of the Invite Receiver OCM
Server.</t>
      <t>REQUIRED: <spanx style="verb">token</spanx> - The Invite Token.  The Invite Sender OCM Server
SHOULD recall which Invite Sender OCM Address this token was linked
to.</t>
      <t>REQUIRED: <spanx style="verb">userID</spanx> - The Invite Receiver's identifier at their OCM
Server.</t>
      <t>REQUIRED: <spanx style="verb">email</spanx> - Non-normative / informational; an email address
for the Invite Receiver.  Not necessarily at the same FQDN as their
OCM Server.</t>
      <t>REQUIRED: <spanx style="verb">name</spanx> - Human-readable name of the Invite Receiver, as a
suggestion for display in the Invite Sender's address book</t>
    </list></t>
  <t>using TLS</t>
  <t>using httpsig [RFC9421]</t>
</list></t>

<t>The Invite Receiver OCM Server SHOULD apply its own policies for
trusting the Invite Sender OCM Server before making the Invite
Acceptance Request.</t>

<t>Since the Invite Flow does not require either Party to type or remember
the <spanx style="verb">userID</spanx>, this string does not need to be human-memorable.  Even if
the Invite Receiver has a memorable username at the Invite Receiver OCM
Server, this <spanx style="verb">userID</spanx> that forms part of their OCM Address does not need
to match it.</t>

<t>Also, a different <spanx style="verb">userID</spanx> could be given out to each contact, to avoid
correlation of identities.</t>

<t>If the Invite Sender OCM Server implements a WAYF Page, such a page MAY
include a fixed list of servers, in addition to, or instead of, a
free-text input where any OCM Server can be entered.  This is especially
useful if the Invite Sender is part of a federation of associated OCM
Servers.  In order to populate the list of associated OCM Servers, the
Invite Sender's server MAY make use of a Directory Service, which is
expected to follow the specification detailed in Appendix C.</t>

<t>Implementors that provide a WAYF Page SHOULD make the URL for the API
endpoint of such a Directory Service configurable, allowing the OCM
Server to be part of a network of associated OCM Servers.  The
configuration mechanism MAY allow an OCM Server to be part of multiple
networks, thus displaying a union of multiple lists in its WAYF Page.</t>

</section>
<section anchor="invite-acceptance-response-details"><name>Invite Acceptance Response Details</name>

<t>The Invite Acceptance Response SHOULD be a HTTP response:</t>

<t><list style="symbols">
  <t>in response to the Invite Acceptance Request</t>
  <t>using <spanx style="verb">application/json</spanx> as the <spanx style="verb">Content-Type</spanx> HTTP response header</t>
  <t>its response body containing a JSON document representing an object
with the following string fields:
  <list style="symbols">
      <t>REQUIRED: <spanx style="verb">userID</spanx> - the Invite Sender's identifier at their OCM
Server</t>
      <t>REQUIRED: <spanx style="verb">email</spanx> - non-normative / informational; an email address
for the Invite Sender.  Not necessarily at the same FQDN as their
OCM Server</t>
      <t>REQUIRED: <spanx style="verb">name</spanx> - human-readable name of the Invite Sender, as a
suggestion for display in the Invite Receiver's address book</t>
    </list></t>
</list></t>

<t>A 200 response status means the Invite Acceptance Request was
successful.
A 400 response status means the Invite Token is invalid or does not
exist.
A 403 response status means the Invite Receiver OCM Server is not
trusted to accept this Invite.
A 409 response status means the Invite was already accepted.</t>

<t>The Invite Sender OCM Server SHOULD verify the HTTP Signature on the
Invite Acceptance Request and apply its own policies for trusting the
Invite Receiver OCM Server before processing the Invite Acceptance
Request and sending the Invite Acceptance Response.</t>

<t>As with the <spanx style="verb">userID</spanx> in the Invite Acceptance Request, the one in the
Response also doesn't need to be human-memorable, doesn't need to match
the Invite Sender's username at their OCM Server.</t>

</section>
<section anchor="addition-into-address-books"><name>Addition into address books</name>

<t>Following these step, both servers MAY display the <spanx style="verb">name</spanx> of the other
party as a trusted or allowlisted contact, and enable selecting them as
a Receiving Party.  OCM Servers MAY enforce a policy to only accept
Share Creation Notifications from such trusted contacts, or MAY display
a warning to users when a Share Creation Notification from an unknown
party is received.</t>

<t>Both servers MAY also allowlist each other as a server with which at
least one of their users wishes to interact.</t>

<t>In addition, if the identity provider of either server supports the
registration of external users, it may happen that the just received
email contact from the other party matches an external user already
known in the local identity provider, and therefore already present
in the address book.  In such a case, implementers MAY support linking
of the two identities belonging to that same user, so that when a Share
Creation gesture is made to that recipient, both a regular share and an
OCM Share Creation Notification are issued.</t>

<t>Note that Invites act symmetrically, so once contact has been
established, both the Invite Sender and the Invite Receiver MAY take on
either the Sending Party or the Receiving Party role in subsequent
Share Creation events.</t>

<t>Both parties MAY delete the other party from their address book at any
time without notifying them.</t>

</section>
<section anchor="invite-format"><name>Invite format</name>
<t>To accept an invite, two pieces of information are required: a <spanx style="verb">token</spanx>
and a <spanx style="verb">provider</spanx>. There are two recognized formats:</t>

<t><list style="symbols">
  <t><strong>Invite string format:</strong>
A base64-encoded string containing the token and the provider’s FQDN,
joined by an <spanx style="verb">@</spanx> sign. Example:  <vspace blankLines='1'/>
If the <spanx style="verb">token</spanx> is <spanx style="verb">a55a966e-15c1-4cb9-a39d-4e4c54399baf</spanx> and the
<spanx style="verb">provider</spanx> is <spanx style="verb">my-cloud-storage.org</spanx>, the combined string is
<spanx style="verb">a55a966e-15c1-4cb9-a39d-4e4c54399baf@my-cloud-storage.org</spanx>,
which when base64-encoded becomes
<spanx style="verb">YTU1YTk2NmUtMTVjMS00Y2I5LWEzOWQtNGU0YzU0Mzk5YmFmQG15LWNsb3VkLXN0b
3JhZ2Uub3Jn</spanx>.  <vspace blankLines='1'/>
When parsing an invite string, implementors must base64-decode it,
then split on the last <spanx style="verb">@</spanx> sign, taking care to allow multiple <spanx style="verb">@</spanx>
characters in the token part.</t>
  <t><strong>Link format:</strong>
If the inviting OCM Server supports a WAYF page, the invite may be
provided as a link with the token as a request parameter. Example:  <vspace blankLines='1'/>
<spanx style="verb">https://my-cloud-storage.org/wayf?token=
a55a966e-15c1-4cb9-a39d-4e4c54399baf</spanx></t>
</list></t>

<t>Implementations MUST be able to accept invites in the invite string
format.  This format is considered canonical.  The link format is only
useful if the Receiving OCM Server exposes the <spanx style="verb">inviteAcceptDialog</spanx>
in its Discovery endpoint.  Implmentations SHOULD support the link
format when they implement a WAYF Page that leverages those
<spanx style="verb">inviteAcceptDialog</spanx> targets.</t>

</section>
<section anchor="security-advantages"><name>Security Advantages</name>

<t>It is important to underscore the value of the Invite in this scenario,
as it provides four important security advantages.  First of all, if the
Receiving Server blocks Share Creation Notifications from Sending
Parties who are not in the address book of the Receiving Party, then
this protects the Receiving Party from receiving unsolicited Shares.  An
attacker could still send the Receiving Party an unsolicited Share, but
they would first need to convince the Receiving Party through an
out-of-band communication channel to accept their invite.  In many use
cases, the Receiving Party has had other forms of contact with the
Sending Party (e.g., in-person or email back-and-forth).  The
out-of-band Invite Message thus leverages the filters and context which
the Receiving Party may already benefit from in that out-of-band
communication.  For instance, a careful Receiving Party MAY choose to
only accept Invites that reach them via a private or moderated
messaging platform.</t>

<t>Second, when the Receiving Party accepts the Invite, the Receiving
Server knows that the Sending Server they are about to interact with is
trusted by the Sending Party, which in turn is trusted by the Receiving
Party, which in turn is trusted by them.  In other words, one of their
users is requesting the allowlisting of a server they wish to interact
with, in order to interact with a party they know out-of-band.  This
gives the Receiving Server reason to put more trust in the Sending
Server than it would put into an arbitrary internet-hosted server.</t>

<t>Third, equivalently, the Sending Server knows it is essentially
registering the Receiving Server as an API client at the request of the
Receiving Party, to whom the right to request this has been traceably
delegated by the Sending Party, which is one of its registered users.</t>

<t>Fourth, related to the second one, it removes the partial 'open relay'
problem that exists when the Sending Server is allowed to include any
Receiving Server FQDN in the Sending Gesture.  Without the use of
Invites, a Distributed Denial of Service attack could be organised if
many internet users collude to flood a given OCM Server with Share
Creation Notifications which will be hard to distinguish from
legitimate requests without human interaction.  An unsolicited (invalid)
Invite Acceptance Request is much easier to filter out than an
unsolicited (possibly valid, possibly invalid) Share Creation
Notification Request, since the Invite Acceptance Request needs to
contain an Invite Token that was previously uniquely generated at the
Invite Sender OCM server.</t>

</section>
</section>
</section>
<section anchor="ocm-api-discovery"><name>OCM API Discovery</name>

<section anchor="introduction-1"><name>Introduction</name>

<t>After establishing contact as discussed in the previous section, the
Sharing User MAY send the Share Creation Gesture to the Sending Server.
The Sharing User MUST provide the following information:</t>

<t><list style="symbols">
  <t>Resource to be shared</t>
  <t>Protocol to be offered for access</t>
  <t>Sending Party's identifier</t>
  <t>Receiving Party's identifier</t>
  <t>Receiving Server FQDN</t>
  <t>OPTIONAL: Share Requirements</t>
  <t>OPTIONAL: Share Name</t>
  <t>OPTIONAL: Share Permissions</t>
</list></t>

<t>The next step is for the Sending Server to additionally discover:</t>

<t><list style="symbols">
  <t>if the Receiving Server is trusted</t>
  <t>if the Receiving Server supports OCM</t>
  <t>if so, which version and with which optional functionality</t>
  <t>at which URL</t>
  <t>the public key the Receiving Server will use for HTTP Signatures (if
any)</t>
</list></t>

<t>The Sending Server MAY first perform denylist and allowlist checks on
the FQDN.</t>

<t>If a finite allowlist of Receiving Servers exists on the Sending Server
side, then this list MAY already contain all necessary information.</t>

<t>If the FQDN passes the denylist and/or allowlist checks, but no details
about its OCM API are known, the Sending Server can use the following
process to try to fetch this information from the Receiving Server.</t>

<t>This process MAY be influenced by a VPN connection and/or IP
allowlisting.</t>

<t>When OCM API Discovery can occur in preparation of a Share Creation
Notification, the Sending Server takes on the 'Discovering Server' role
and the Receiving Server plays the role of 'Discoverable Server'.</t>

</section>
<section anchor="process"><name>Process</name>

<t>At the start of the process, the Discovering Server has either an OCM
Address, or just an FQDN from for instance the <spanx style="verb">recipientProvider</spanx>
field of an Invite Acceptance Request.</t>

<t>Step 1: In case it has an OCM Address, it SHOULD first extract <spanx style="verb">&lt;fqdn&gt;</spanx>
from it (the part after the last <spanx style="verb">@</spanx> sign).
Step 2: The Discovering Server SHOULD attempt OCM API Discovery via a
HTTP GET request to <spanx style="verb">https://&lt;fqdn&gt;/.well-known/ocm</spanx>.
Step 3: If that results in a valid HTTP response with a valid JSON
response body within reasonable time, go to step 7.
Step 4: If not, try a HTTP GET with <spanx style="verb">https://&lt;fqdn&gt;/ocm-provider</spanx> as
the URL instead.
Step 5: If that results in a valid HTTP response with a valid JSON
response body within reasonable time, go to step 7.
Step 6: If not, fail. Implementations MAY fallback to HTTP instead
of HTTPS in testing setups and retry steps 2-5, in particular when
an optional port is given in the address.
Step 7: The JSON response body is the data that was discovered.</t>

</section>
<section anchor="fields"><name>Fields</name>

<t>The JSON response body offered by the Discoverable Server SHOULD
contain the following information about its OCM API:</t>

<t><list style="symbols">
  <t>REQUIRED: enabled (boolean) - Whether the OCM service is enabled at
this endpoint</t>
  <t>REQUIRED: apiVersion (string) - The OCM API version this endpoint
supports.  Example: <spanx style="verb">"1.2.2"</spanx></t>
  <t>REQUIRED: endPoint (string) - The URI of the OCM API available at
this endpoint.  Example: <spanx style="verb">"https://my-cloud-storage.org/ocm"</spanx></t>
  <t>OPTIONAL: provider (string) - A friendly branding name of this
endpoint.  Example: <spanx style="verb">"MyCloudStorage"</spanx></t>
  <t>REQUIRED: resourceTypes (array) - A list of all resource types this
server supports in both the Sending Server role and the Receiving
Server role, with their access protocols.  Each item in this list
MUST itself be an object containing the following fields:
  <list style="symbols">
      <t>name (string) - A supported resource type (file, calendar,
contact, ...).
Implementations MUST offer support for at least one
resource type, where <spanx style="verb">file</spanx> is the commonly supported
one.  Each resource type is identified by its <spanx style="verb">name</spanx>:
the list MUST NOT contain more than one resource type
object per given <spanx style="verb">name</spanx>.</t>
      <t>shareTypes (array of string) -
The supported recipient share types.  MUST contain
<spanx style="verb">"user"</spanx> at a minimum, plus optionally <spanx style="verb">"group"</spanx> and
<spanx style="verb">"federation"</spanx>.
Example: <spanx style="verb">["user"]</spanx></t>
      <t>protocols (object) - The supported protocols for accessing Shared
Resources of this type.
Implementations that offer <spanx style="verb">file</spanx> Resources MUST
support at least <spanx style="verb">webdav</spanx>,
any other combination of Resources and protocols is
optional.  Example:
<spanx style="verb">json
        {
          "webdav": "/remote/dav/ocm/",
          "webapp": "/app/ocm/",
          "talk": "/apps/spreed/api/"
        }
        </spanx>
Fields:
      <list style="symbols">
          <t>webdav (string) - The top-level WebDAV [RFC4918] path at this
endpoint.  In order to access a Remote Resource, implementations
MAY use this path as a prefix, or as the full path (see sharing
examples).</t>
          <t>webapp (string) - The top-level path for web apps at this
endpoint.  This value is provided for documentation
purposes, and it SHOULD NOT be intended as a prefix
for share requests.</t>
          <t>datatx (string) - The top-level path used for data transfers.
This value is provided for documentation purposes,
and it SHOULD NOT be intended as a prefix.  In
addition, implementations are expected to execute
the transfer using WebDAV [RFC4918] as the wire protocol.</t>
          <t>Any additional protocol supported for this Resource type MAY be
advertised here, where the value MAY correspond to
a top-level URI to be used for that protocol.</t>
        </list></t>
    </list></t>
  <t>OPTIONAL: capabilities (array of string) - The optional capabilities
supported by this OCM Server.
As implementations MUST accept Share Creation Notifications
to be compliant, it is not necessary to expose that as a
capability.
Example: <spanx style="verb">["exchange-token", "webdav-uri"]</spanx>.  The array MAY
include for instance:
_ <spanx style="verb">"enforce-mfa"</spanx> - to indicate that this OCM Server can apply a
Sending Server's MFA requirements for a Share on their behalf.
_ <spanx style="verb">"webdav-uri"</spanx> - to indicate that this OCM Server can append a
relative URI to the path listed for WebDAV [RFC4918] in the
appropriate <spanx style="verb">resourceTypes</spanx> entry <spanx style="verb">"protocol-object"</spanx> - to
indicate that this OCM Server can receive a Share Creation
Notification whose <spanx style="verb">protocol</spanx> object contains one property per
supported protocol instead of containing the standard <spanx style="verb">name</spanx> and
<spanx style="verb">options</spanx> properties.
_ <spanx style="verb">"invites"</spanx> - to indicate the server would support acting as an
Invite Sender or Invite Receiver OCM Server.  This might be useful
for suggesting to a user that existing contacts might be upgraded
to the more secure (and possibly required) invite flow.
_ <spanx style="verb">"exchange-token"</spanx> - to indicate that this OCM Server exposes a
[RFC6749]-compliant endpoint, which allows to exchange a secret
received in the protocol properties of a Share Creation Notification
for a short-lived bearer token.
_ <spanx style="verb">"invite-wayf"</spanx> - to indicate that this OCM Server exposes a WAYF
Page to facilitate the Invite flow.</t>
  <t>OPTIONAL: criteria (array of string) - The criteria for accepting a
Share Creation Notification.
As all Receiving Servers SHOULD require the use of TLS in API
calls, it is not necessary to expose that as a criterium.
Example: <spanx style="verb">["http-request-signatures"]</spanx>.  The array MAY include
for instance:
_ <spanx style="verb">"http-request-signatures"</spanx> - to indicate that API requests
without http signatures will be rejected.
_ <spanx style="verb">"token-exchange"</spanx> - to indicate that API requests without
token exchange will be rejected (see the <xref target="code-flow">Code Flow</xref>
section).
_ <spanx style="verb">"denylist"</spanx> - some servers MAY be blocked based on their IP
address
_ <spanx style="verb">"allowlist"</spanx> - unknown servers MAY be blocked based on their IP
address * <spanx style="verb">"invite"</spanx> - an invite MUST have been exchanged between the
sender and the receiver before a Share Creation Notification can be
sent</t>
  <t>OPTIONAL: publicKey (object) - The signatory used to sign outgoing
request to confirm its origin.
 The signatory is optional, but if present, it MUST contain
two string fields, <spanx style="verb">id</spanx> and <spanx style="verb">publicKeyPem</spanx>.
properties:
  <list style="symbols">
      <t>REQUIRED keyId (string) unique id of the key in URI format.  The
hostname set the origin of the request and MUST be
identical to the current discovery endpoint.
Example: https://my-cloud-storage.org/ocm#signature</t>
      <t>REQUIRED publicKeyPem (string) - PEM-encoded version of the public
key.
Example:
"----BEGIN PUBLIC KEY----\n...\n----END PUBLIC KEY----\n"</t>
    </list></t>
  <t>OPTIONAL: inviteAcceptDialog (string) - URL path of a web page where
a user can accept an invite, when query parameters <spanx style="verb">"token"</spanx> and
<spanx style="verb">"providerDomain"</spanx> are provided.  Implementations that offer the
<spanx style="verb">"invites"</spanx> capability SHOULD provide this URL as well in order to
enhance the UX of the Invite Flow.  If for example
<spanx style="verb">"/index.php/apps/sciencemesh/accept"</spanx> is specified here then a WAYF
Page SHOULD redirect the end-user to
<spanx style="verb">/index.php/apps/sciencemesh/accept?token=zi5kooKu3ivohr9a&amp;providerDomain=example.com</spanx>.</t>
  <t>OPTIONAL: tokenEndPoint (string) - URL of the token endpoint where the
Sending Server can exchange a secret for a short-lived bearer token.
Implementations that offer the <spanx style="verb">"exchange-token"</spanx> capability MUST
provide this URL as well.
Example: <spanx style="verb">"https://my-cloud-storage.org/ocm/token"</spanx>.</t>
</list></t>

</section>
</section>
<section anchor="share-creation-notification"><name>Share Creation Notification</name>

<t>To create a Share, the Sending Server SHOULD make a HTTP POST request</t>

<t><list style="symbols">
  <t>to the <spanx style="verb">/shares</spanx> path in the Receiving Server's OCM API</t>
  <t>using <spanx style="verb">application/json</spanx> as the <spanx style="verb">Content-Type</spanx> HTTP request header</t>
  <t>its request body containing a JSON document representing an object
with the fields as described below</t>
  <t>using TLS</t>
  <t>using httpsig [RFC9421]</t>
</list></t>

<section anchor="fields-1"><name>Fields</name>

<t><list style="symbols">
  <t>REQUIRED shareWith (string)
OCM Address of the user, group or federation the provider
wants to share the Resource with.  This MUST be known
in advance, either via a previous Invitation or through
other means.
Example: "51dc30ddc473d43a6011e9ebba6ca770@geant.org"</t>
  <t>REQUIRED name (string)
Name of the Resource (file or folder).
Example: "resource.txt"</t>
  <t>OPTIONAL description (string)
Optional description of the Resource (file or folder).
Example: "This is the Open API Specification file (in YAML
format) of the Open Cloud Mesh API."</t>
  <t>REQUIRED providerId (string)
Opaque value to identify the Shared Resource at the provider side.
This MUST be unique per Resource and per share, such that multiple
shares of a given Resource are guaranteed to get different values.
Example: 7c084226-d9a1-11e6-bf26-cec0c932ce01</t>
  <t>REQUIRED owner (string) -
OCM Address of the user who owns the
Resource.
Example: "6358b71804dfa8ab069cf05ed1b0ed2a@apiwise.nl"</t>
  <t>REQUIRED sender (string) -
OCM Address of the user that wants to share
the Resource.
Example: "527bd5b5d689e2c32ae974c6229ff785@apiwise.nl"</t>
  <t>OPTIONAL ownerDisplayName (string)
Display name of the owner of the Resource
Example: "Dimitri"</t>
  <t>OPTIONAL senderDisplayName (string)
Display name of the user that wants to share the Resource
Example: "John Doe"</t>
  <t>REQUIRED shareType (string)
SHOULD have a value of "user", "group", or "federation", to
indicate that the first part of the <spanx style="verb">shareWith</spanx> OCM Address refers
to a Receiving Party who is a single user of the Receiving Server,
a group of users at the Receiving Server, or a group of users that
spans multiple OCM Servers belonging to a federation as exposed by
a Directory Service, including at least one user at the Receiving
Server.
In the federation case, OCM Servers MAY resolve the actual
recipients by either querying external AAI systems, or exchanging
the groups' metadata between themselves.  Such exchange is out of
scope for this version of the this specification.
Alternatively, the Receiving Server MAY hold the federated groups'
metadata and act as an OCM proxy, forwarding the OCM requests to
the actual members of the federation.</t>
  <t>REQUIRED resourceType (string)
Resource type (file, folder, calendar, contact, ...).  If the
Resource is a folder, implementations SHOULD advertise it as
<spanx style="verb">folder</spanx> rather than <spanx style="verb">file</spanx>, in order to streamline the processing
by the Receiving Server.</t>
  <t>OPTIONAL expiration (integer)
The expiration time for the OCM share, in seconds
of UTC time since Unix epoch.  If omitted, it is assumed
that the share does not expire.</t>
  <t>REQUIRED protocol (object)
JSON object with specific options for each protocol.
The supported protocols are: - <spanx style="verb">webdav</spanx>, to access the data -
<spanx style="verb">webapp</spanx>, to access remote web applications - <spanx style="verb">datatx</spanx>, to transfer
the data to the remote endpoint.  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
    Other custom protocols might be added in the future.

    In case a single protocol is offered, there are three ways to
    specify this object:
    Option 1: Set the `name` field to the name of the protocol,
    and put the protocol details in a field named `options`.
    Option 2: Set the `name` field to the name of the protocol,
    and put the protocol details in a field carrying the name of
    the protocol.
    Option 3: Set the `name` field to `multi`, and put the
    protocol details in a field carrying the name of the protocol.

          Option 1 using the `options` field is now deprecated.
          Implementations are encouraged to transition to the new
          optional properties defined below, such that this field
          may be removed in a future major version of the spec.

    When specifying more than one protocol as different ways to
    access the Share, the `name` field needs to be set to `multi`.
]]></artwork></figure>
  </t>
</list></t>

<t>If <spanx style="verb">multi</spanx> is given, one or more protocol
endpoints are expected to be defined according to the
optional properties specified below.
Otherwise, at least <spanx style="verb">webdav</spanx> is expected to be
supported, and its options MAY be given in the opaque
<spanx style="verb">options</spanx> payload for compatibility with v1.0
implementations (see examples).  Note though that this
format is deprecated.
Warning: client implementers should be aware that v1.1
servers MAY support both <spanx style="verb">webdav</spanx> and <spanx style="verb">multi</spanx>, but v1.0
servers MAY only support <spanx style="verb">webdav</spanx>.</t>

<t><list style="symbols">
  <t>Protocol details for <spanx style="verb">webdav</spanx> MAY contain:
  <list style="symbols">
      <t>REQUIRED uri (string)
A URI to access the Remote Resource.  The URI
SHOULD be relative, in which case the prefix
exposed by the <spanx style="verb">/.well-known/ocm</spanx> endpoint MUST
be used.  Absolute URIs are deprecated.</t>
      <t>REQUIRED sharedSecret (string)
A secret to be used to access the Resource, such as
a bearer token.  To prevent leaking it in logs it
MUST NOT appear in any URI.</t>
      <t>OPTIONAL permissions (array of strings) -
The permissions granted to the sharee.  A subset
of: - <spanx style="verb">read</spanx> allows read-only access including
download of a copy.  - <spanx style="verb">write</spanx> allows create, update, and delete
rights on the Resource.  - <spanx style="verb">share</spanx> allows re-share rights on the
Resource.</t>
      <t>OPTIONAL requirements (array of strings) -
The requirements that the sharee MUST fulfill to
access the Resource.  A subset of: - <spanx style="verb">must-use-mfa</spanx> requires the
consumer to be MFA-authenticated.  This MAY be used if the
recipient provider exposes the <spanx style="verb">enforce-mfa</spanx>
capability.  - <spanx style="verb">must-exchange-token</spanx> requires the recipient to
exchange the given <spanx style="verb">sharedSecret</spanx> via a signed HTTPS request
to the Sending Server's {tokenEndPoint} [RFC6749].
This MAY be used if the recipient provider exposes the
<spanx style="verb">exchange-token</spanx> capability.</t>
    </list></t>
  <t>Protocol details for <spanx style="verb">webapp</spanx> MAY contain:
  <list style="symbols">
      <t>REQUIRED uri (string)
A URI to a client-browsable view of the Shared
Resource, such that users MAY use the web
applications available at the site.  The URI SHOULD
be relative, in which case the prefix exposed by
the <spanx style="verb">/.well-known/ocm</spanx> endpoint MUST be used.
Absolute URIs are deprecated.</t>
      <t>REQUIRED viewMode (string)
The permissions granted to the sharee.  A subset of: - <spanx style="verb">view</spanx>
allows access to the web app in view-only mode.  - <spanx style="verb">read</spanx> allows
read and download access via the web app.  - <spanx style="verb">write</spanx> allows full
editing rights via the web app.</t>
      <t>OPTIONAL sharedSecret (string)
An optional secret to be used to access the remote
web app, for example in the form of a bearer token.</t>
    </list></t>
  <t>Protocol details for <spanx style="verb">datatx</spanx> MAY contain:
  <list style="symbols">
      <t>REQUIRED srcUri (string)
A URI to access the Remote Resource.  The URI
SHOULD be relative, in which case the prefix
exposed by the <spanx style="verb">/.well-known/ocm</spanx> endpoint MUST be
used.  Absolute URIs are deprecated.</t>
      <t>OPTIONAL sharedSecret (string)
An optional secret to be used to access the
Resource, for example in the form of a bearer
token.  To prevent leaking it in logs it MUST NOT
appear in any URI.</t>
      <t>OPTIONAL size (integer)
The size of the file to be transferred from the
sending server.</t>
    </list></t>
</list></t>

</section>
<section anchor="decision-to-discard"><name>Decision to Discard</name>

<t>The Receiving Server MAY discard the notification if any of the
following hold true:</t>

<t><list style="symbols">
  <t>the HTTP Signature is missing but the Sending Server does expose a
keypair discoverable from the FQDN part of the <spanx style="verb">sender</spanx> field in the
request body</t>
  <t>the HTTP Signature is missing</t>
  <t>the HTTP Signature is not valid</t>
  <t>no keypair is trusted or discoverable from the FQDN part of the
<spanx style="verb">sender</spanx> field in the request body</t>
  <t>the keypair used to generate the HTTP Signature doesn't match the one
trusted or discoverable from the FQDN part of the <spanx style="verb">sender</spanx> field
in the request body</t>
  <t>the Sending Server is denylisted</t>
  <t>the Sending Server is not allowlisted</t>
  <t>the Sending Party is not trusted by the Receiving Party (e.g., no
Invite was exchanged and/or the Sending Party's OCM Address does not
appear in the Receiving Party's address book)</t>
  <t>the Receiving Server is unable to act as an API client for (any of)
the protocol(s) listed for accessing the Resource</t>
  <t>an initial check shows that the Resource cannot successfully be
accessed through (any of) the protocol(s) listed</t>
</list></t>

</section>
</section>
<section anchor="receiving-party-notification"><name>Receiving Party Notification</name>

<t>If the Share Creation Notification is not discarded by the Receiving
Server, they MAY notify the Receiving Party passively by adding the
Share to some inbox list, and MAY also notify them actively through for
instance a push notification or an email message.</t>

<t>They could give the Receiving Party the option to accept or reject the
share, or add the share automatically and only send an informational
notification that this happened.</t>

</section>
<section anchor="share-acceptance-notification"><name>Share Acceptance Notification</name>

<t>In response to a Share Creation Notification, the Receiving Server MAY
discover the OCM API of the Sending Server, starting from the <spanx style="verb">&lt;fqdn&gt;</spanx>
part of the <spanx style="verb">sender</spanx> field in the Share Creation Notification.</t>

<t>If the OCM API of the Sending Server is successfully discovered, the
Receiving Server MAY make a HTTP POST request</t>

<t><list style="symbols">
  <t>to the <spanx style="verb">/notifications</spanx> path in the Sending Server's OCM API</t>
  <t>using <spanx style="verb">application/json</spanx> as the <spanx style="verb">Content-Type</spanx> HTTP request header</t>
  <t>its request body containing a JSON document representing an object
with the fields as described below</t>
  <t>using TLS</t>
  <t>using httpsig [RFC9421]</t>
</list></t>

<section anchor="fields-2"><name>Fields</name>

<t><list style="symbols">
  <t>REQUIRED notificationType (string) - in a Share Acceptance
Notification it MUST be one of:
  <list style="symbols">
      <t>'SHARE_ACCEPTED'</t>
      <t>'SHARE_DECLINED'</t>
    </list></t>
  <t>REQUIRED providerId (string) - copied from the Share Creation
Notification for the Share this notification is about</t>
  <t>OPTIONAL resourceType (string) - copied from the Share Creation
Notification for the Share this notification is about</t>
  <t>OPTIONAL notification (object) - optional additional parameters,
depending on the notification and the resource type</t>
</list></t>

<t>For example, a notification MAY be sent by a recipient to let the
provider know that the recipient declined a share.  In this case, the
provider site MAY mark the share as declined for its user(s).
Similarly, it MAY be sent by a provider to let the recipient know that
the provider removed a given share, such that the recipient MAY clean
it up from its database.  A notification MAY also be sent to let a
recipient know that the provider removed that recipient from the list
of trusted users, along with any related share.  The recipient MAY
reciprocally remove that provider from the list of trusted users, along
with any related share.</t>

<t>Notifications from Sending Server to Receiving Server SHOULD use
httpsig [RFC9421] so the Receiving Server can authenticate the origin
of the notification.  Receiving Servers SHOULD decline notifications
from Sending Servers without httpsig as it can't identify where the 
notification is coming from.</t>

<section anchor="receiving-party-notification-1"><name>Receiving Party Notification</name>

<t>If the Share Creation Notification is not discarded by the Receiving
Server, they MAY notify the Receiving Party passively by adding the
Share to some inbox list, and MAY also notify them actively through for
instance a push notification or an email message.</t>

<t>They could give the Receiving Party the option to accept or reject the
Share, or add the Share automatically and only send an informational
notification that this happened.</t>

</section>
</section>
</section>
<section anchor="resource-access"><name>Resource Access</name>

<t>To access the Resource, the Receiving Server MAY use multiple ways,
depending on the body of the Share Creation Notification and the
protocol required for access.  The procedure is as follows:</t>

<t><list style="numbers" type="1">
  <t>The receiver MUST extract the OCM Server FQDN from the <spanx style="verb">sender</spanx>
field of the received share, and MUST query the
<xref target="ocm-api-discovery">Discovery</xref> endpoint at that address: let
<spanx style="verb">&lt;sender-ocm-path&gt;</spanx> be the <spanx style="verb">resourceTypes[0].protocols.webdav</spanx> value
to be used later, if defined.</t>
  <t>If <spanx style="verb">protocol.name</spanx> is <spanx style="verb">multi</spanx>, the receiver MUST inspect the
<spanx style="verb">protocol.{protocolName}</spanx> properties corresponding to the protocol
of concern, and act according to its semantics.  For the specific
case where <spanx style="verb">protocol.webdav</spanx> is available and the receiver wants
to use it, the following steps are to be followed.</t>
  <t>The <spanx style="verb">protocol.webdav.requirements</spanx> MUST be inspected:
3.1. If it includes <spanx style="verb">must-exchange-token</spanx>, the receiver MUST make a
 signed POST request to the path in the Sending Server’s
 {tokenEndPoint}, to exchange the <spanx style="verb">protocol.webdav.sharedSecret</spanx>
 token for a short-lived bearer token, and then use that bearer
 token to access the Resource (See the <xref target="code-flow">Code Flow</xref>
 section).
3.2. If it includes <spanx style="verb">must-use-mfa</spanx>, the Receiving Server MUST ensure
 that the Receiving Party has been authenticated with MFA, or prompt
 the consumer in order to elevate their session, if applicable.</t>
  <t>The <spanx style="verb">protocol.webdav.uri</spanx> property MUST now be inspected: if it's a
complete URI, the receiver MUST make a HTTP PROPFIND request against
it to access the Remote Resource, otherwise it is to be taken as an
identifier <spanx style="verb">&lt;id&gt;</spanx>, in which case the receiver MUST make a HTTP
PROPFIND request to: <spanx style="verb">https://&lt;sender-host&gt;&lt;sender-ocm-path&gt;/&lt;id&gt;</spanx>
in order to access to the Remote Resource.  The receiver MUST pass
an <spanx style="verb">Authorization: bearer</spanx> header with either the short-lived bearer
token obtained in step 3.1., if applicable, or the
<spanx style="verb">protocol.webdav.sharedSecret</spanx> value.</t>
  <t>Otherwise, if <spanx style="verb">protocol.name</spanx> is <spanx style="verb">webdav</spanx> the receiver SHOULD inspect
the <spanx style="verb">protocol.options</spanx> property: if <spanx style="verb">protocol.options.sharedSecret</spanx>
is defined, then the receiver SHOULD make a HTTP PROPFIND request to
<spanx style="verb">https://&lt;sharedSecret&gt;:@&lt;sender-host&gt;&lt;sender-ocm-path&gt;</spanx>.  Note that
this access method, based on Basic Auth, is <em>deprecated</em> and may be
removed in a future release of the Protocol.  If a secret cannot be
identified (e.g. because <spanx style="verb">protocol.options</spanx> is undefined), then
the receiver SHOULD discard the share as invalid.</t>
</list></t>

<t>In all cases, in case the Shared Resource is a folder and the Receiving
Server accesses a Resource within that shared folder, it SHOULD append
its relative path to that URL.  In other words, the Sending Server
SHOULD support requests to URLs such as
<spanx style="verb">https://&lt;sender-host&gt;&lt;sender-ocm-path&gt;/path/to/resource.txt</spanx>.</t>

</section>
<section anchor="code-flow"><name>Code Flow</name>

<t>This section defines the procedure for issuing short-lived bearer access
tokens for use by the Receiving Server when accessing a resource shared
through OCM.  The mechanism is aligned with the OAuth 2.0
<em>authorization_code</em> grant type but is performed entirely as a
server to server interaction between the Sending and Receiving Servers.
No user interaction or redirect is involved. [RFC6749]</t>

<section anchor="token-request"><name>Token Request</name>

<t>To obtain an access token, the Receiving Server MUST send an HTTP POST
request to the Sending Server’s {tokenEndPoint} as discovered in the
OCM provider metadata, following section 4.4.2 of [RFC6749].  Here
follows an example of such POST request:</t>

<t>```
POST {tokenEndPoint} HTTP/1.1
Host: my-cloud-storage.org
Date: Wed, 05 Nov 2025 14:00:00 GMT
Content-Type: application/x-www-form-urlencoded
Digest: SHA-256=ok6mQ3WZzKc8nb7s/Jt2yY1uK7d2n8Zq7dhl3Q0s1xk=
Content-Length: 101
Signature-Input: 
    sig1=("@method" "@target-uri" "content-digest" "date"); \
    created=1730815200; keyid="receiver.example.org#2025"; \
    alg="rsa-sha256"
Signature: sig1=:
    bM2sV2a4oM8pWc4Q8r9Zb8bQ7a2vH1kR9xT0yJ3uE4wO5lV6bZ1cP2rN3qD4tR5hC=:</t>

<t>grant_type=authorization_code&amp;
client_id=receiver.example.org&amp;
code=my_secret_code
```</t>

<t>The request MUST be signed using an HTTP Message Signature
[RFC9421].  The <spanx style="verb">client_id</spanx> identifies the Receiving Server and MUST be
set to its fully qualified domain name.  The <spanx style="verb">code</spanx> parameter carries
the authorization secret that was issued by the Sending Server in the
Share Creation Notification.  It is allowed to send the additional
parameters defined in [RFC6749] for the <spanx style="verb">authorization_code</spanx> grant type,
but they MUST be ignored.</t>

</section>
<section anchor="token-response"><name>Token Response</name>

<t>If the request is valid and the code is accepted, the Sending Server
MUST respond with HTTP 200 OK and a OAuth-compliant JSON object
containing the issued token:</t>

<t><spanx style="verb">
{
  "access_token": "8f3d3f26-f1e6-4b47-9e3e-9af6c0d4ad8b",
  "token_type": "Bearer",
  "expires_in": 300
}
</spanx></t>

<t>The <spanx style="verb">access_token</spanx> is an opaque bearer credential with no internal
structure visible to the Receiving Server.  The token authorizes the
Receiving Server to access the shared resource using the appropriate
transport protocol (e.g., WebDAV).  The <spanx style="verb">expires_in</spanx> value indicates
the token lifetime in seconds.  No <spanx style="verb">refresh_token</spanx> is issued, instead
the same request to the {tokenEndPoint} MUST be repeated before the
<spanx style="verb">access_token</spanx> has expired, to recieve a new <spanx style="verb">access_token</spanx> that can
then be used in the same manner.</t>

</section>
<section anchor="error-responses"><name>Error Responses</name>

<t>If the request is invalid, the Sending Server MUST return an HTTP 400
response with a JSON object containing an OAuth 2.0 error code
[RFC6749]:
<spanx style="verb">
{ "error": "invalid_request" }
</spanx></t>

<t>Permitted error codes are <spanx style="verb">invalid_request</spanx>, <spanx style="verb">invalid_client</spanx>,
<spanx style="verb">invalid_grant</spanx>, <spanx style="verb">unauthorized_client</spanx> and <spanx style="verb">unsupported_grant_type</spanx>.</t>

</section>
</section>
<section anchor="share-deletion"><name>Share Deletion</name>

<t>A <spanx style="verb">"SHARE_ACCEPTED"</spanx> notification followed by a <spanx style="verb">"SHARE_UNSHARED"</spanx>
notification is equivalent to a <spanx style="verb">"SHARE_DECLINED"</spanx> notification.</t>

<t>Note that the Sending Server MAY at any time revoke access to a
Resource (effectively undoing or deleting the Share) without notifying
the Receiving Server.</t>

</section>
<section anchor="share-updating"><name>Share Updating</name>

<t>Some implementations have experimented with a
<spanx style="verb">"RESHARE_CHANGE_PERMISSION"</spanx>notification, but the payload and side
effects such a notification may have are out of scope of this version
of this specification.
The Receiving Party sending such a notification has no way of knowing
if the Sending Party understood and processed the reshare request
or not.</t>

</section>
<section anchor="resharing"><name>Resharing</name>

<t>The <spanx style="verb">"REQUEST_RESHARE"</spanx> and <spanx style="verb">"RESHARE_UNDO"</spanx> notification types MAY be
used by the Receiving Server to persuade the Sending Server to share the
same Resource with another Receiving Party.
The details of the payload and side effects such a notification may
have are out of scope of this version of this specification.
Note that the Receiving Party sending such a notification has no way of
knowing if the Sending Party understood and processed the reshare
request or not.  In all cases, the Receiving Server MUST NOT reshare
a Resource without an explicit grant from the Sending Server.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<section anchor="well-known-uri-for-the-discovery"><name>Well-Known URI for the Discovery</name>

<t>The following value is to be registered in the "Well-Known URIs"
registry (using the template from [RFC5785]):
   URI suffix: ocm
   Change controller: IETF
   Specification document(s): the present Draft, once in RFC form
   Related information: N/A</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="trust"><name>Trust</name>

<t>There are several areas that are not covered by this specification.
Most importantly we do not provide a way of establishing trust between
servers, even though some features of the protocol rely on trust, such
as the <spanx style="verb">mfa-enforced</spanx> requirement.</t>

<t>Trust needs to be established out of band, but there are some features
of the protocol that <em>can</em> be used to assist operators in establishing
trust.  For instance, invite flow can be used to establish that users
know and have out of band connections with other users on an OCM server.</t>

<t>Further more the Directory Service feature can be used to establish a
trusted federation, where a central authority can be trusted to
implement measures for auditing and adding only trusted servers into the
discovery service.</t>

<section anchor="httpsig"><name>httpsig</name>

<t>It is RECOMMENDED to use signed messages, "httpsig" [RFC9421], to
verify that an OCM server is the server you expect it to be, and SHOULD
be done unless you have a niche use case.</t>

</section>
</section>
<section anchor="legacy-shared-secrets"><name>Legacy shared secrets</name>

<t>The legacy format of an OCM Share Notification with shared secrets is
only provided for backwards compatibility with existing implementations.
Implementers SHOULD NOT use it and prefer short-lived tokens instead.</t>

</section>
<section anchor="code-flow-1"><name>Code Flow</name>

<t>All <spanx style="verb">{tokenEndPoint}</spanx> requests MUST be transmitted over HTTPS and
signed using HTTP Signatures.  Bearer tokens MUST be treated as 
confidential and never logged, persisted beyond their lifetime, or
transmitted over unsecured channels.</t>

</section>
</section>
<section anchor="references"><name>References</name>

<section anchor="normative-references"><name>Normative References</name>

<t>[RFC2119] Bradner, S. "<eref target="https://datatracker.ietf.org/doc/html/rfc2119">Key words for use in RFCs to Indicate
Requirement Levels</eref>",
March 1997.</t>

<t>[RFC4918] Dusseault, L. M. "<eref target="https://datatracker.ietf.org/html/rfc4918/">HTTP Extensions for Web Distributed
Authoring and Versioning</eref>",
June 2007.</t>

<t>[RFC8174] Leiba, B. "<eref target="https://datatracker.ietf.org/html/rfc8174">Ambiguity of Uppercase vs Lowercase in RFC 2119
Key Words</eref>", May 2017.</t>

<t>[RFC9421] Backman, A., Richer, J. and Sporny, M. "<eref target="https://tools.ietf.org/html/rfc9421">HTTP Message
Signatures</eref>", February 2024.</t>

<t>[RFC3986] Berners-Lee, T., Fielding, R. and Masinter, L. 
"<eref target="https://datatracker.ietf.org/doc/html/rfc3986">Uniform Resource Identifier (URI): Generic Syntax
</eref>", January 2005</t>

<t>[RFC6749] Hardt, D. (ed), "<eref target="https://datatracker.ietf.org/html/rfc6749">The OAuth 2.0 Authorization Framework</eref>", October 2012.</t>

<t>[RFC8615] Nottingham, M. "<eref target="https://datatracker.ietf.org/doc/html/rfc8615">Well-Known Uniform Resource Identifiers 
(URIs)</eref>", May 2019</t>

</section>
</section>
<section anchor="appendix-a-multi-factor-authentication"><name>Appendix A: Multi-factor Authentication</name>

<t>If a Receiving Server exposes the capability <spanx style="verb">enforce-mfa</spanx>, it
indicates that it will try and comply with a MFA requirement set on a
Share.  If the Sending Server trusts the Receiving Server, the Sending
Server MAY set the requirement <spanx style="verb">mfa-enforced</spanx> on a Share, which the
Receiving Server MUST honor.  A compliant Receiving Server that signals
that it is MFA-capable MUST NOT allow access to a Resource protected
with the <spanx style="verb">mfa-enforced</spanx> requirement, if the Receiving Party has not
provided a second factor to establish their identity with greater
confidence.</t>

<t>Since there is no way to guarantee that the Receiving Server will
actually enforce the MFA requirement, it is up to the Sending Server to
establish a trust with the Receiving Server such that it is reasonable
to assume that the Receiving Server will honor the MFA requirement.
This establishment of trust will inevitably be implementation
dependent, and can be done for example using a pre approved allow list
of trusted Receiving Servers.  The procedure of establishing trust is
out of scope for this specification: a mechanism similar to the
<eref target="https://sciencemesh.io">ScienceMesh</eref> integration for the
<xref target="invite-flow">Invite</xref> capability may be envisaged.</t>

</section>
<section anchor="appendix-b-request-signing"><name>Appendix B: Request Signing</name>

<t>A request is signed by adding the signature in the headers.  The sender
also needs to expose the public key used to generate the signature.  The
receiver can then validate the signature and therefore the origin of
the request.
To help debugging, it is RECOMMENDED to also add all properties used in
the signature as headers, even if they can easily be re-generated from
the payload.</t>

<t>Note: Signed requests prove the identity of the sender but do not
encrypt nor affect its payload.</t>

<t>Here is an example of headers needed to sign a request.</t>

<t><spanx style="verb">
  {
    "@request-target": "post /path",
    "content-length": 380,
    "date": "Mon, 08 Jul 2024 14:16:20 GMT",
    "content-digest": "SHA-256=U7gNVUQiixe5BRbp4...",
    "host": "hostname.of.the.recipient",
    "Signature": "keyId=\"https://author.hostname/key\",algorithm=
      \"rsa-sha256\",headers=\"content-length date digest host\",
      signature=\"DzN12OCS1rsA[...]o0VmxjQooRo6HHabg==\""
  }
</spanx></t>

<t><list style="symbols">
  <t>'@request-target' (optional) contains the reached endpoint and
the used method,</t>
  <t>'content-length' is the total length of the payload of the
request,</t>
  <t>'date' is the date and time when the request has been
sent,</t>
  <t>'content-digest' is a checksum of the payload of the
request,</t>
  <t>'host' is the hostname of the recipient of the request (remote when
signing outgoing request, local on incoming request),</t>
  <t>'Signature' contains the signature generated using the private key
and details on its generation:
  <list style="symbols">
      <t>'keyId' is a unique id, formatted as an url; hostname is used to
retrieve the public key via custom discovery</t>
      <t>'algorithm' specify the algorithm used to generate signature</t>
      <t>'headers' specify the properties used when generating the
signature</t>
      <t>'signature' the signature of an array containing the properties
listed in 'headers'.  Some properties like content-length, date,
content-digest, and host are mandatory to protect against
authenticity override.</t>
    </list></t>
</list></t>

<section anchor="how-to-generate-the-signature-for-outgoing-request"><name>How to generate the Signature for outgoing request</name>

<t>After properties are set in the headers, the Signature is generated and
added to the list.</t>

<t>This is a pseudo-code example for generating the <spanx style="verb">Signature</spanx> header for
outgoing requests:</t>

<t>```
headers = {
  'content-length': length_of(payload),
  # Use a function to get the current GMT date as 'D, d M Y H:i:s T'
  'date': current_gmt_datetime(),
  'content-digest': 'SHA-256=' + base64_encode(hash('sha256',
        utf8_encode(payload))),
  'host': 'recipient-fqdn',
}</t>

<t>signed = ssl_sign(concatenate_with_newlines(headers),
    private_key, 'sha256')
signature = {
    'keyId': 'sender.fqdn',  # The sending server's FQDN
    'algorithm': 'rsa-sha256',
    'headers': 'content-length date content-digest host',
    'signature': signed,
}</t>

<t>headers['Signature'] = format_signature(signature)
```</t>

</section>
<section anchor="how-to-confirm-signature-on-incoming-request"><name>How to confirm Signature on incoming request</name>

<t>The first step would be to confirm the validity of each
properties:</t>

<t><list style="symbols">
  <t><spanx style="verb">content-length</spanx> and <spanx style="verb">content-digest</spanx> can be regenerated and compared
from the payload of the request,</t>
  <t>a maximum TTL MUST be applied to <spanx style="verb">date</spanx> and current
timestamp,</t>
  <t>regarding data contained in the <spanx style="verb">Signature</spanx>
header:
  <list style="symbols">
      <t>using <spanx style="verb">keyId</spanx> to get the public key from remote
signatory,</t>
      <t><spanx style="verb">headers</spanx> is used to generate the clear version of the
signature and MUST contain at least <spanx style="verb">content-length</spanx>, <spanx style="verb">date</spanx>,
<spanx style="verb">content-digest</spanx> and <spanx style="verb">host</spanx>,</t>
      <t><spanx style="verb">signature</spanx> is the encrypted version of the
signature.</t>
    </list></t>
</list></t>

<t>Here is an example of how to verify the signature using the headers,
the signature and the public key:</t>

<t>```
clear = {
    'content-length': length_of(payload),
    'date': 'Mon, 08 Jul 2024 14:16:20 GMT',
    'content-digest': 'SHA-256=' + base64_encode(hash('sha256',
          utf8_encode(payload))),  # Recompute digest for verification
    'host': 'sender-fqdn',
}</t>

<t>signed = headers['Signature']
verification_result = ssl_verify(concatenate_with_newlines(clear),
                                 signed, public_key, 'sha256')</t>

<t>if not verification_result then
    raise InvalidSignatureException
```</t>

</section>
<section anchor="validating-the-payload"><name>Validating the payload</name>

<t>Following the validation of the signature, the host SHOULD also confirm
the validity of the payload, that is ensuring that the actions implied
in the payload actually initiated on behalf of the source of the
request.</t>

<t>As an example, if the payload is about initiating a new share, the file
owner has to be an account from the instance at the origin of the
request.</t>

</section>
</section>
<section anchor="appendix-c-directory-service"><name>Appendix C: Directory Service</name>

<t>A third-party Directory Service is a back-end service used to federate
multiple OCM Servers and facilitate the Invite flow.  It is expected to
expose, via anonymous HTTP GET, a JSON document with the following
format:</t>

<t><list style="symbols">
  <t>REQUIRED: <spanx style="verb">federation</spanx> - a human-readable name for the list of OCM
Servers exposed by the Directory Service</t>
  <t>REQUIRED: <spanx style="verb">servers</spanx> - a JSON array of objects to describe the list
of OCM Servers with the following string fields:
  <list style="symbols">
      <t>REQUIRED: <spanx style="verb">url</spanx> - an absolute URL identifying the
OCM Server.  It MUST:
      <list style="symbols">
          <t>include scheme: either <spanx style="verb">https://</spanx> or
(for testing purposes) <spanx style="verb">http://</spanx></t>
          <t>include host (either a FQDN or an IP address)</t>
          <t>MAY include a non-default port</t>
          <t>MUST NOT include a base path (e.g., <spanx style="verb">/ocm</spanx>)</t>
          <t>MUST NOT include userinfo, query, or fragment</t>
        </list></t>
      <t>REQUIRED: <spanx style="verb">displayName</spanx> - a human-readable name
for the OCM Server
Example:</t>
    </list></t>
</list></t>

<t><spanx style="verb">json
{
  "federation": "The ScienceMesh Directory",
  "servers": [
    {
      "url": "https://ocm-server-1.example.org",
      "displayName": "OCM Server 1"
    },
    {
      "url": "https://ocm-server-2.example.org:4443",
      "displayName": "OCM Server 2"
    },
    {
      "url": "http://192.168.1.1:8080",
      "displayName": "OCM Server 3"
    }
  ]
}
</spanx></t>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>Our deepest thanks and appreciation go to the people who started the
work on what would become this specification in 2015.  In particular we
want to thank (in alphabetical order) Guido Aben, Russell Albert,
Holger Angenent, David Antoš, Hrachya Astsatryan, Kurt Bauer,
Charles du Jeu, Andreas Eckey, David Gillard, Andranik Hayrapetyan Wahi,
Dimitri van Hees, Christoph Herzog, David Jericho, Frank Karlitschek,
Christian Kracher, Ralph Krimmel, Massimo Lamanna, Simon Leinen,
Jari Miettinen, Jakub Moscicki, Frederik Orellana, Vlad Roman,
Christian Schmitz, Woojin Seok, Rogier Spoor, Christian Sprajc,
Peter Szegedi, Ron Trompert, Benedikt Wegmann and Jonathan Xu.</t>

<t>We would also like to thank Ishank Arora, Gianmaria Del Monte,
Jörn Friedrich Dreyer, Richard Freitag, Hugo González Labrador,
Matthias Kraus, Maxence Lange, Lovisa Lugnegård, Sandro Mesterheide,
Antoon Prins and Björn Schießle for their direct contributions
to the specification.</t>

<t>Over the years many more people have been involved in the development
of OCM.  We would like to thank all of them for their contributions,
including Jean-Thomas Acquaviva, Samuel Alfageme Sainz,
Karsten Asshauer, Miroslav Bauer, Felix Böhm, Maciej Brzeźniak,
Diogo Castro, Gavin Charles Kennedy, Jarosław Czub, Milan Danecek,
Michael D'Silva, Lukasz Dutka, Pedro Ferreira, Renato Furter,
Klaas Freitag, Raman Ganguly, Eva Gergely, Hilary Goodson, Daniel Halbe,
Dave Heyns, Jan Holesovsky, Jan Hornicek, Carina Kemp, Fergus Kerins,
Andreas Klotz, Matthias Knoll, Christian Kracher, Mario Lassnig,
Claudius Laumanns, Anthony Leroy, Patrick Maier, Vladislav Makarenko,
Anna Manou, Rita Meneses, Zheng Meyer-Zhao, Crystal Michelle Chua,
Yoann Moulin, Daniel Müller, Frederik Müller, Rasmus Munk,
Michał Orzechowski, Jacek Pawel Kitowski, Iosif Peterfi,
Alessandro Petraro, Rene Ranger, Angelo Romasanta, David Rousse,
Carla Sauvanaud, Klaus Scheibenberger, Marcin Sieprawski,
Tilo Steiger, C.D. Tiwari, Alejandro Unger and Tom Wezepoel.</t>

</section>


  </middle>

  <back>








  </back>

<!-- ##markdown-source:
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

-->

</rfc>

