<?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-lopresti-open-cloud-mesh-08" 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="11"/>

    <area>Security</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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
mq9mmRvs9dPr9Uhbif47PbTaEwv3AAA=

-->

</rfc>

