<?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.39 (Ruby 3.2.11) -->


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

]>


<rfc ipr="trust200902" docName="draft-ietf-ocm-open-cloud-mesh-05" 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>https://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="2026" month="June" day="23"/>

    <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 use 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.org"</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>Federation</strong> - A group of OCM Providers that have established
mutual trust and agree on certain policies for interaction.  A
Federation MAY be facilitated by a Directory Service.</t>
  <t><strong>FQDN</strong> - Fully Qualified Domain Name, such as <spanx style="verb">"cloud.example.com"</spanx>.</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 Response</strong> - HTTP response to the Invite
Acceptance Request.</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 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 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 Receiver</strong> - The party receiving an Invite, identified by its
OCM Address.</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 Sender</strong> - The party sending 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 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 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>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@cloud.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 API Discovery</strong> - Process of evaluating properties of a Remote
Resource, after establishing contact with an OCM Server.</t>
  <t><strong>OCM Server</strong> - A server that has the OCM Provider function.</t>
  <t><strong>Discovering Server</strong> - A server that tries to obtain information in
OCM API Discovery.</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>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>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>Remote Resource</strong> - A Resource provided by the Sending Server.</t>
  <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>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>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>Sending Server</strong> - The server that:
  <list style="symbols">
      <t>holds the Resource for instance, a file server,</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>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>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>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>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>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>Sharing User</strong> - A user providing access to a Resource through a
Share.</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>
</list></t>

<section anchor="functions"><name>Functions</name>

<t>Open Cloud Mesh defines distinct functions.  It is not necessary for an
implementation to provide all of them.  In fact, it may be useful to
have separate implementations for different functions.</t>

<section anchor="ocm-provider"><name>OCM Provider</name>

<t>An OCM Provider is an entity that can take on the two <em>roles</em> of a
<em>Sending Server</em> and a <em>Receiving Server</em>.  An OCM Provider MUST be a
<em>Discoverable Server</em> and SHOULD be able to receive <em>Notifications</em>.</t>

</section>
<section anchor="ocm-directory-service"><name>OCM Directory Service</name>

<t>An OCM Directory Service is an entity that exposes information about a
<em>Federation</em> of OCM Providers.</t>

</section>
</section>
<section anchor="roles"><name>Roles</name>

<t>Open Cloud Mesh defines two distinct roles that an OCM Provider MUST
take on: the <em>Sending Server</em> role and the <em>Receiving Server</em> role.</t>

<section anchor="sending-server"><name>Sending Server</name>

<t>A Sending Server is an OCM Provider that holds Resources and exposes
APIs to allow access to them.  It allows its users to create <em>Shares</em>
to give other users access to those Resources.  A Sending Server MAY
provide its users with the ability to generate <em>Invites</em> to establish
contact with other users on other OCM Providers.  When doing so it MAY
provide a <em>WAYF Page</em> to facilitate the Invite Flow.  The WAYF page MAY
be limited to a set of trusted OCM Providers, for instance those in the
same <em>Federation</em>.</t>

</section>
<section anchor="receiving-server"><name>Receiving Server</name>

<t>A Receiving Server is an OCM Provider that receives <em>Share</em> Creation
Notifications from Sending Servers, notifies its users about incoming
<em>Shares</em>, and acts as an API client to allow its users to access Remote
Resources.  It MAY provide its users with an <em>Address Book</em> of
<em>Contacts</em> and the ability to accept <em>Invites</em>.</t>

<t>In Appendix D, an object model is presented as a non-normative guide for
implementers to understand the relationships between these terms.</t>

</section>
</section>
</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="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">cloud.example.org</spanx>, the combined string is
<spanx style="verb">a55a966e-15c1-4cb9-a39d-4e4c54399baf@cloud.example.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://cloud.example.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 5.
Step 4: If not, fail.  Implementations MAY fallback to HTTP instead
of HTTPS in testing setups and retry steps 2-3, in particular when
an optional port is given in the address.
Step 5: 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.4.0"</spanx></t>
  <t>REQUIRED: endPoint (string) - The URI of the OCM API available at
this endpoint.  Example: <spanx style="verb">"https://cloud.example.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:      <vspace blankLines='1'/>
        <figure type="json"><artwork><![CDATA[
        {
          "webdav": "/remote/dav/ocm/",
          "webdav-receive": { "uri": "absolute" },
          "webapp": {},
          "webapp-receive": { "targets": ["blank", "iframe"] },
          "talk": "/apps/spreed/api/"
        }
]]></artwork></figure>
      <vspace blankLines='1'/>
The <spanx style="verb">protocols</spanx> object distinguishes a server's role for each
protocol: a property named after the protocol (e.g. <spanx style="verb">webdav</spanx>,
<spanx style="verb">webapp</spanx>, <spanx style="verb">ssh</spanx>) advertises support for acting as a Sending
Server, while a property suffixed with <spanx style="verb">-receive</spanx> (e.g.
<spanx style="verb">webdav-receive</spanx>, <spanx style="verb">webapp-receive</spanx>, <spanx style="verb">ssh-receive</spanx>) advertises
support for acting as a Receiving Server.      <vspace blankLines='1'/>
Fields:
- webdav (string) - The top-level WebDAV [RFC4918] path at this
  endpoint.  In order to access a Remote Resource, implementations
  SHOULD use this path as a prefix (see sharing examples).
- webdav-receive (object) - Advertised by implementations that
  support receiving WebDAV shares.  It contains a <spanx style="verb">uri</spanx> property
  whose value MUST be either <spanx style="verb">"absolute"</spanx> or <spanx style="verb">"relative"</spanx>,
  signalling the URI format this endpoint accepts.  Note that
  older implementations MAY not support this property.
- webapp (object) - Advertised, as an empty object, by
  implementations that support sending WebApp shares.
- webapp-receive (object) - Advertised by implementations that
  support receiving WebApp shares.  It contains a <spanx style="verb">targets</spanx>
  array listing the ways this endpoint is able to present a
  WebApp share to the user.  A subset of:
  - <spanx style="verb">blank</spanx> - the endpoint can open the URI in a top-level
    browsing context, such as a new window or tab, or a full page
    navigation in the current window.
  - <spanx style="verb">iframe</spanx> - the endpoint can embed the URI in an iframe
    within its own UI, when the Sending Server allows framing
    by this receiver.
- ssh (string) - The top-level address in the form <spanx style="verb">host:port</spanx>
  of an endpoint that supports ssh and scp with a public/private
  key based authentication.
- ssh-receive (object) - Advertised, as an empty object, by
  implementations that support receiving SSH shares.
- 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.  Similarly,
  additional receiving capabilities for custom protocols SHOULD
  be advertised using a <spanx style="verb">-receive</spanx> suffixed property.</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", "protocol-object"]</spanx>.  The array MAY
include one or more of the following items:
  <list style="symbols">
      <t><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.</t>
      <t><spanx style="verb">"exchange-token"</spanx> - to indicate that this OCM Server supports the
OCM code flow via an [RFC6749]-compliant token endpoint.  When this
OCM Server acts as Sending Server, it hosts <spanx style="verb">tokenEndPoint</spanx>.  When it
acts as Receiving Server, it can honor inbound shares that require
token exchange.</t>
      <t><spanx style="verb">"http-sig"</spanx> - to indicate that this OCM Server supports
[RFC9421] HTTP Message Signatures and advertises public keys in the
format specified by [RFC7517] at the <spanx style="verb">/.well-known/jwks.json</spanx>
endpoint for signature verification.</t>
      <t><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.</t>
      <t><spanx style="verb">"notifications"</spanx> - to indicate that this OCM Server handles
notifications to exchange updates on shares and invites.</t>
      <t><spanx style="verb">"invite-wayf"</spanx> - to indicate that this OCM Server exposes a WAYF
Page to facilitate the Invite flow.</t>
      <t><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.</t>
    </list></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">["must-use-http-sig"]</spanx>.  The array MAY include
for instance:
  <list style="symbols">
      <t><spanx style="verb">"must-use-http-sig"</spanx> - to indicate that API requests
without http signatures will be rejected.</t>
      <t><spanx style="verb">"must-exchange-token"</spanx> - to indicate that when this OCM Server
acts as Receiving Server, it requires the code flow for all inbound
shares.  Shares that do not include <spanx style="verb">must-exchange-token</spanx> in
the requirements of each protocol offered for access will be
rejected.  An
OCM Server advertising this criterium MUST also expose the
<spanx style="verb">exchange-token</spanx> capability.  See the <xref target="code-flow">Code Flow</xref>
section.</t>
      <t><spanx style="verb">"denylist"</spanx> - some servers MAY be blocked based on their IP
address</t>
      <t><spanx style="verb">"allowlist"</spanx> - unknown servers MAY be blocked based on their IP
address</t>
      <t><spanx style="verb">"must-invite"</spanx> - an invite MUST have been exchanged between the
sender and the receiver before a Share Creation Notification can be
sent</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=cloud.example.org</spanx>.</t>
  <t>OPTIONAL: tokenEndPoint (string) - URL of the token endpoint hosted by
this OCM Server.  When this OCM Server acts as Sending Server, the
Receiving Server POSTs here to exchange a <spanx style="verb">sharedSecret</spanx> 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://cloud.example.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>

<t>Before constructing the notification, the Sending Server MUST query
the Receiving Server's OCM API Discovery endpoint.  If the Receiving
Server advertises <spanx style="verb">must-exchange-token</spanx> in its <spanx style="verb">criteria</spanx> and the
Sending Server exposes the <spanx style="verb">exchange-token</spanx> capability with a
<spanx style="verb">tokenEndPoint</spanx>, the Sending Server MUST include <spanx style="verb">must-exchange-token</spanx>
in the requirements of each protocol offered for access and MUST NOT
fall back to legacy shared-secret access.  If the Receiving
Server advertises <spanx style="verb">must-exchange-token</spanx> but the Sending Server does
not expose the <spanx style="verb">exchange-token</spanx> capability or does not have a
<spanx style="verb">tokenEndPoint</spanx>, the Sending Server MUST NOT create the share, 
as the Receiving Server would reject any notification that lacks 
the code-flow requirement.
If the Receiving Server does not advertise <spanx style="verb">must-exchange-token</spanx> in its
<spanx style="verb">criteria</spanx>, the Sending Server MAY still include <spanx style="verb">must-exchange-token</spanx>
voluntarily.</t>

<t>When the notification includes <spanx style="verb">protocol.webapp</spanx>, the Sending Server
MUST expose the <spanx style="verb">exchange-token</spanx> capability and a <spanx style="verb">tokenEndPoint</spanx>,
because WebApp access requires the Receiving Server to exchange
<spanx style="verb">protocol.webapp.sharedSecret</spanx> before presenting the WebApp to the
browser.  If the Sending Server cannot offer this code flow, it MUST NOT
include <spanx style="verb">protocol.webapp</spanx> in the notification.  A Sending Server MAY
serve Web apps either from the same hosting infrastructure or from
external servers in the same organization: to facilitate the integration
of external servers, the RECOMMENDED reference implementation is
described in [OCM-IP].</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@cloud.example.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@cloud.example.org"</t>
  <t>REQUIRED sender (string) -
OCM Address of the user that wants to share
the Resource.
Example: "527bd5b5d689e2c32ae974c6229ff785@cloud.example.org"</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.  For the latter, the
RECOMMENDED implementation is based on the MLS protocol and it is
described in [OCM-MLS].
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.  A sender server MAY use it to signal that
the resource represents a cached copy of a dataset that was made
available for an efficient data transfer to the destination server.</t>
  <t>REQUIRED protocol (object)
JSON object with specific options for each protocol.
The supported protocols are:
  <list style="symbols">
      <t><spanx style="verb">webdav</spanx>, to access the data via HTTP WebDAV.</t>
      <t><spanx style="verb">webapp</spanx>, to access remote web applications.</t>
      <t><spanx style="verb">ssh</spanx>, to access the data via a public/private key pair.
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 <spanx style="verb">name</spanx> field to the name of the protocol,
and put the protocol details in a field named <spanx style="verb">options</spanx>.
Option 2: Set the <spanx style="verb">name</spanx> 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 <spanx style="verb">name</spanx> field to <spanx style="verb">multi</spanx>, and put the
protocol details in a field carrying the name of the protocol.
Option 1 using the <spanx style="verb">options</spanx> 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 <spanx style="verb">name</spanx> field needs to be set to <spanx style="verb">multi</spanx>.
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>
    </list></t>
  <t>Protocol details for <spanx style="verb">webdav</spanx> MAY contain:
  <list style="symbols">
      <t>OPTIONAL accessTypes (array of strings) - The type of access
being granted to the remote resource.  If omitted, it defaults to
<spanx style="verb">['remote']</spanx>.  A subset of:
      <list style="symbols">
          <t><spanx style="verb">remote</spanx> signals the recipient that the resource is available
for remote access and interactive browsing.</t>
          <t><spanx style="verb">datatx</spanx> signals the recipient that the resource is
available for data transfer.  If no expiration is given, the share
is suitable e.g. for sync use-cases, whereas if an expiration date
is set, the above clause MAY apply and the recipient SHOULD notify
the sender upon completing the data transfer, in order to ease
cache operations on the Sending Server.  The recipient MAY delegate
a third-party service to execute the data transfer on their behalf.</t>
        </list></t>
      <t>REQUIRED uri (string)
A URI to access the Remote Resource.  The URI MAY be relative,
such as a key or a UUID, in which case the prefix exposed by the
<spanx style="verb">/.well-known/ocm</spanx> endpoint MUST be used to access the Resource,
or it MAY be absolute, including a hostname.  In all cases, for a
<spanx style="verb">folder</spanx> Resource, the composed URI acts as the root path, such
that other files located within it MUST be accessible by
appending their relative path to that URI.</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:
      <list style="symbols">
          <t><spanx style="verb">read</spanx> allows read-only access including download of a copy.</t>
          <t><spanx style="verb">write</spanx> allows create, update, and delete rights on the Resource.</t>
          <t><spanx style="verb">share</spanx> allows re-share rights on the Resource.</t>
        </list></t>
      <t>OPTIONAL requirements (array of strings) -
The requirements that the sharee MUST fulfill to
access the Resource.  A subset of:
      <list style="symbols">
          <t><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 Sending Server exposes the
<spanx style="verb">exchange-token</spanx> capability and <spanx style="verb">tokenEndPoint</spanx>, and MUST be
included when the Receiving Server advertises <spanx style="verb">must-exchange-token</spanx>
in criteria.</t>
          <t><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.</t>
        </list></t>
      <t>OPTIONAL size (integer)
The size of the resource to be transferred, useful
especially in case of <spanx style="verb">datatx</spanx> access type.</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 a web application available at the Sending
Server.  The URI MUST be absolute, including a hostname.  In
case the underlying Resource is a folder, the URI MUST act as a
root path, such that files located within the folder are made
accessible in the web app by appending their relative path to
the URI.</t>
      <t>REQUIRED targets (array of strings) - How the recipient SHOULD
present the URI to the user.  The <spanx style="verb">targets</spanx> array MUST NOT be
empty.  A subset of:
      <list style="symbols">
          <t><spanx style="verb">blank</spanx> signals the recipient to open the URI in a top-level
browsing context chosen by the receiver, such as a new window or
tab, or a full page navigation in the current window.</t>
          <t><spanx style="verb">iframe</spanx> signals the recipient to embed the URI in an iframe
within its own UI, when the Sending Server allows framing by
this receiver.
A Sending Server MUST NOT offer a target that the recipient did
not advertise in its <spanx style="verb">webapp-receive</spanx> discovery property.</t>
        </list></t>
      <t>REQUIRED permissions (array of strings) -
The permissions granted to the sharee.  MUST NOT be empty.
A subset of:
      <list style="symbols">
          <t><spanx style="verb">view</spanx> allows access to the web app in view-only mode.</t>
          <t><spanx style="verb">read</spanx> allows read and download access via the web app.</t>
          <t><spanx style="verb">write</spanx> allows full editing rights via the web app.</t>
          <t><spanx style="verb">share</spanx> allows re-share rights on the Resource.  This only
applies to web apps that provide a mechanism for re-sharing.</t>
        </list></t>
      <t>REQUIRED requirements (array of strings) -
The requirements that the sharee MUST fulfill to
access the Resource.  The requirements MUST at least include
<spanx style="verb">must-exchange-token</spanx>.  If multiple protocols are present in the
share payload, the requirements for the different protocols MUST
agree.  For example, if a webapp share is sent in the same payload
as a webdav share, both protocols MUST carry the same
requirements, and both requirement arrays MUST include
<spanx style="verb">must-exchange-token</spanx>.</t>
      <t>REQUIRED sharedSecret (string)
A secret for accessing the remote web app.  To give access to the
remote app, the receiver MUST first exchange this value at the
Sending Server's {tokenEndPoint} using the Code Flow, then perform
an HTTP POST request to the given <spanx style="verb">uri</spanx> with the resulting bearer
token in a form field named <spanx style="verb">access_token</spanx> (see
<xref target="resource-access">Resource Access</xref>).  The shared secret MUST NOT
be exposed to the browser and MUST NOT appear in any URI.</t>
      <t>OPTIONAL appName (string)
A human-friendly name of the web application, to be used in user
interfaces when referring to this Share.</t>
      <t>OPTIONAL appIconHint (string)
A string in the form of a media type (MIME type) that describes the
share as a whole, primarily intended as a way for the receiving
server to select an appropriate local icon for the share.  This is
display metadata and MUST NOT be interpreted as fetchable or
executable content.  It does not need to appear in <spanx style="verb">mediaTypes</spanx>, but
SHOULD describe the primary shared resource. [RFC6838]</t>
      <t>OPTIONAL mediaTypes (array of strings)
An array of media types (MIME types) the webapp server can handle.
This can be any media type entries from the IANA Media Type
registry.  The receiver MAY use this as a hint for UI or routing
decisions, and MAY ignore values it does not understand.  Unlike
<spanx style="verb">appIconHint</spanx>, this describes formats the webapp can open rather
than the share-level icon hint. [RFC6838]</t>
    </list></t>
  <t>Protocol details for <spanx style="verb">ssh</spanx> MAY contain:
  <list style="symbols">
      <t>OPTIONAL accessTypes (array of strings) - The type of access
being granted to the remote resource.  If omitted, it defaults to
<spanx style="verb">['remote']</spanx>.  A subset of:
      <list style="symbols">
          <t><spanx style="verb">remote</spanx> signals the recipient that
the resource is available for remote access, e.g. via sshfs.</t>
          <t><spanx style="verb">datatx</spanx> signals the recipient to transfer the resource
from the given URI via scp.  The recipient MAY delegate a
third-party service to execute the data transfer on their behalf.</t>
        </list></t>
      <t>REQUIRED uri (string)
The full address to be used for ssh or scp access, in the form
<spanx style="verb">username@host.fqdn:port/resource/path</spanx>, where the <spanx style="verb">username</spanx> is
chosen by the Sending Server and does not necessarily need to match
the recipient's OCM Address.  Authentication is expected to take
place via public/private key: the Receiving Server MUST reply to
such a Share Creation Notification by sending back their public
key, for the Sender Server to authorize access to the Resource.</t>
    </list></t>
</list></t>

</section>
<section anchor="response"><name>Response</name>

<t>The Share Creation Notification Response SHOULD be a HTTP response:</t>

<t><list style="symbols">
  <t>in response to the Share Creation Notification Request</t>
  <t>using <spanx style="verb">application/json</spanx> as the <spanx style="verb">Content-Type</spanx> HTTP response header</t>
</list></t>

<t>A 201 response status means the Share Creation Notification Request was
successful.  In this case, the response body MUST contain a JSON
document representing an object with the following string fields:
  - REQUIRED: <spanx style="verb">recipientDisplayName</spanx> - the Recipient's display name.
  - OPTIONAL: <spanx style="verb">recipientPublicKeys</spanx> - the Recipient's public key(s).
    This property MUST be returned when the protocol of the incoming
    share was <spanx style="verb">ssh</spanx>.
A 400 response status means some parameters were invalid or missing.
A 401 response status means the Sender cannot be authenticated as
a trusted service.
A 403 response status means the Sender is not authorized to create
shares.
A 501 response status means either the Receiver does not support
incoming external shares, or the share type or the resource type
are not supported.
A 503 response status means that the Receiver is temporary unavailable.</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 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>
<section anchor="request-for-a-share"><name>Request for a Share</name>

<t>If the Receiving Party knows of a resource that has not yet
been shared, the Receiving Party MAY make an HTTP POST request</t>

<t><list style="symbols">
  <t>to the <spanx style="verb">/request-share</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 owner (string)
OCM Address of the user who will be requested to share
the resource.</t>
  <t>REQUIRED shareWith (string)
OCM Address of the user, group or federation that wants to
receive a share of the resource.
Example: "51dc30ddc473d43a6011e9ebba6ca770@cloud.example.org"</t>
  <t>REQUIRED share (string)
A unique identifier for the resource.
Example: 1234567890abcdef or https://cloud.example.org/files/data.txt</t>
</list></t>

<t>After receiving a request for a Share, the Sending Party MAY
send a Share Creation Notification to the Receiving Party
using the OCM address in the shareWith field.</t>

</section>
</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-3"><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>
</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 only use that bearer
 token to access the Resource (See the <xref target="code-flow">Code Flow</xref>
 section).  If the <spanx style="verb">must-exchange-token</spanx> requirement is not present
 and the discovery inspected at step 1 exposes the <spanx style="verb">exchange-token</spanx>
 capability with a <spanx style="verb">tokenEndPoint</spanx>, the receiver MAY attempt the
 token exchange as above, but it MUST fall back to the following
 steps should the process fail.
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>
  <t>For the specific case where <spanx style="verb">protocol.webapp</spanx> is available and the
receiver wants to use it, the receiver MUST present the web app to
the user by opening <spanx style="verb">protocol.webapp.uri</spanx> using a target selected
from the intersection of <spanx style="verb">protocol.webapp.targets</spanx> and the targets
advertised in the receiver's <spanx style="verb">webapp-receive</spanx> discovery property.
If this intersection is empty, the receiver MUST treat the <spanx style="verb">webapp</spanx>
option as unusable for this Share.  If the selected target is
<spanx style="verb">blank</spanx>, the receiver MAY use <spanx style="verb">_blank</spanx> or <spanx style="verb">_top</spanx> according to its
local presentation policy.  The receiver MUST inspect
<spanx style="verb">protocol.webapp.requirements</spanx>: 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.  The receiver MUST NOT place the
<spanx style="verb">protocol.webapp.sharedSecret</spanx> in the URI and MUST NOT expose it to
the browser.  Instead, the receiver MUST first exchange it at the
Sending Server's {tokenEndPoint} using the Code Flow, then deliver
the resulting bearer token to the web app via an HTTP POST to
<spanx style="verb">protocol.webapp.uri</spanx> with the token carried in a form field named
<spanx style="verb">access_token</spanx> along with another form field named
<spanx style="verb">expired_session_redirect_uri</spanx>.  The
<spanx style="verb">expired_session_redirect_uri</spanx> value MUST be an absolute HTTPS URI
controlled by the Receiving Server.  The Sending WebApp MAY navigate
the browser to this URI when the posted session expires so that the
Receiving Server can restart access and obtain a fresh token; it
MUST NOT place the shared secret or access token in that URI.
Sending WebApps that do not support session refresh MAY ignore this
field.  This is typically achieved with an auto-submitting
HTML form whose <spanx style="verb">target</spanx> attribute selects the chosen
presentation (e.g. an iframe name, <spanx style="verb">_blank</spanx>, or <spanx style="verb">_top</spanx>).</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].  The
request payload MUST be in <spanx style="verb">x-www-form-urlencoded</spanx> form, as shown
in the following example (with line breaks in the Signature headers
for display purposes only):</t>

<sourcecode type="http">
POST {tokenEndPoint} HTTP/1.1
Host: cloud.example.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:
  ocm=("@method" "@target-uri" "content-digest" "date");
  created=1730815200;
  keyid="receiver.example.org#key1";
  alg="ed25519"
Signature: ocm=:bM2sV2a4oM8pWc4Q8r9Zb8bQ7a2vH1kR9xT0yJ3uE4wO5lV6bZ1cP
  2rN3qD4tR5hC=:

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

<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>

<figure type="json"><artwork><![CDATA[
{
  "access_token": "8f3d3f26-f1e6-4b47-9e3e-9af6c0d4ad8b",
  "token_type": "Bearer",
  "expires_in": 300
}
]]></artwork></figure>

<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]:</t>

<figure type="json"><artwork><![CDATA[
{ "error": "invalid_request" }
]]></artwork></figure>

<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 anchor="decision-table"><name>Decision Table</name>

<t>The directional contract depends first on whether the share is strict.
For strict shares, the Receiving Server's advertised behavior determines
whether the Sending Server can require code flow.  For non-strict
shares, the Sending Server's advertised behavior determines whether
token exchange is available in addition to legacy access.</t>

<t><list style="numbers" type="1">
  <t>If the Sending Server includes <spanx style="verb">must-exchange-token</spanx> in
<spanx style="verb">protocol.webdav.requirements</spanx> and the Receiving Server exposes the
<spanx style="verb">exchange-token</spanx> capability, strict token exchange is required
before the Resource is accessed.</t>
  <t>If the Sending Server includes <spanx style="verb">must-exchange-token</spanx> and the
Receiving Server does not expose the <spanx style="verb">exchange-token</spanx> capability,
the Sending Server SHOULD NOT include that requirement, because the
Receiving Server may be unable to complete the exchange.</t>
  <t>If the Sending Server omits <spanx style="verb">must-exchange-token</spanx> and exposes the
<spanx style="verb">exchange-token</spanx> capability with a <spanx style="verb">tokenEndPoint</spanx>, the Receiving
Server MAY attempt token exchange first and MUST fall back to legacy
shared-secret access if that exchange fails.</t>
  <t>If the Sending Server omits <spanx style="verb">must-exchange-token</spanx> and does not
expose the <spanx style="verb">exchange-token</spanx> capability, only legacy shared-secret
access is available.</t>
</list></t>

<t>The following examples illustrate typical end-to-end outcomes:</t>

<t><list style="numbers" type="1">
  <t>Strict required code flow: Provider A acts as Sending Server and
exposes the <spanx style="verb">exchange-token</spanx> capability with a <spanx style="verb">tokenEndPoint</spanx>.
Provider B acts as Receiving Server and advertises both
<spanx style="verb">exchange-token</spanx> and <spanx style="verb">must-exchange-token</spanx>.  After discovering B's
<spanx style="verb">must-exchange-token</spanx> criteria, A MUST include <spanx style="verb">must-exchange-token</spanx>
in <spanx style="verb">protocol.webdav.requirements</spanx>.  B MUST exchange the
<spanx style="verb">sharedSecret</spanx> at A's <spanx style="verb">tokenEndPoint</spanx> and then use only the bearer
token to access the Resource.</t>
  <t>Optional exchange with fallback: Provider A acts as Sending Server
and exposes the <spanx style="verb">exchange-token</spanx> capability with a <spanx style="verb">tokenEndPoint</spanx>.
Provider B does not advertise <spanx style="verb">must-exchange-token</spanx>, so A sends a
share without <spanx style="verb">must-exchange-token</spanx>.  When B later accesses the
Resource, it MAY attempt the token exchange at A's <spanx style="verb">tokenEndPoint</spanx>,
but if that exchange fails it MUST fall back to the legacy
<spanx style="verb">sharedSecret</spanx>.</t>
  <t>Legacy share to a code-flow-capable peer: Provider A does not
expose the <spanx style="verb">exchange-token</spanx> capability.  Provider B does expose
<spanx style="verb">exchange-token</spanx>, so B is capable of honoring strict inbound shares
from other peers.  Because A does not advertise a <spanx style="verb">tokenEndPoint</spanx>,
A can only send a legacy share and B can only use legacy
shared-secret access for that share.</t>
  <t>Asymmetric role behavior: Provider A exposes <spanx style="verb">exchange-token</spanx> and
<spanx style="verb">must-exchange-token</spanx>, so it can require code flow for inbound
shares when it acts as Receiving Server.  When A later acts as
Sending Server toward Provider B, and B does not advertise
<spanx style="verb">must-exchange-token</spanx>, A MAY omit <spanx style="verb">must-exchange-token</spanx>.  B may then
attempt token exchange against A's <spanx style="verb">tokenEndPoint</spanx> or fall back to
legacy access.  A therefore accepts strict inbound shares while
still choosing a legacy-compatible outbound share.</t>
</list></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 [RFC8615]):
   URI suffix: ocm
   Change controller: IETF
   Specification document(s): the present Draft, once in RFC form
   Related information: N/A</t>

</section>
<section anchor="jscontact-types-registry"><name>JSContact Types Registry</name>

<t>The following entry is to be registered in the "JSContact Types"
registry (using the template from [RFC9553]):
   Type Name: ocmAddress
   Intended Usage: common
   Since Version: 1.0
   Until Version: N/A
   Change Controller: IETF
   Reference or Description:</t>

<t>An object representing an OCM address.  The object contains:</t>

<figure><artwork><![CDATA[
 - "address" (String, required): The OCM federated address in format
   "user@provider" where provider is the FQDN of an OCM-capable
   server.
 - "trusted" (Boolean, optional): Whether shares from this address
   are automatically accepted.  Default: false.
 - "source" (String, optional): How this address was established.
   See "JSContact Enum Values" registry for allowed values.
 - "label" (String, optional): Human-readable label for this
   address.
]]></artwork></figure>

</section>
<section anchor="jscontact-properties-registry"><name>JSContact Properties Registry</name>

<t>The following entry is to be registered in the "JSContact Properties"
registry (using the template from [RFC9553]):
   Property Name: ietf.org:ocmAddresses
   Property Type: String[ocmAddress]
   Property Context: Card
   Intended Usage: common
   Since Version: 1.0
   Until Version: N/A
   Change Controller: IETF
   Reference or Description:</t>

<t>A map of OCM addresses for a contact.  The keys are arbitrary
   identifiers (e.g., "primary", "work") and the values are ocmAddress
   objects as defined in the JSContact Types Registry.</t>

</section>
<section anchor="jscontact-enum-values-registry"><name>JSContact Enum Values Registry</name>

<t>The following entries are to be registered in the "JSContact Enum
Values" registry (using the template from [RFC9553]).
   Property Name: ietf.org:ocmAddresses/source
   Context: Card
   Since Version: 1.0
   Until Version: N/A
   Change Controller: IETF
   Reference or Description:</t>

<t>Values indicating how an OCM address was established.</t>

<t>Initial Contents:</t>

<figure><artwork><![CDATA[
   +==============+==========================================+
   | Enum Value   | Reference/Description                    |
   +==============+==========================================+
   | invite       | Address established via OCM invite flow  |
   |--------------|------------------------------------------|
   | share        | Address established by receiving a share |
   |--------------|------------------------------------------|
   | direct entry | Address added directly by the user       |
   |--------------|------------------------------------------|
]]></artwork></figure>

</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">must-use-mfa</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="copying-conditions"><name>Copying conditions</name>

<t>The author(s) agree to grant third parties the irrevocable right to
copy, use and distribute the work, with or without modification, in
any medium, without royalty, provided that, unless separate permission
is granted, redistributed modified works do not contain misleading
author, version, name of work, or endorsement information.</t>

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

<t>[RFC6838] Freed, N., Klensin, J., Hansen, T. "<eref target="https://datatracker.ietf.org/html/rfc6838">Media Type
Specifications and Registration Procedures
</eref>", January 2013.</t>

<t>[RFC7515] Jones, M., Bradley, J., Sakimura, N., "<eref target="https://datatracker.ietf.org/doc/html/rfc7515">JSON Web Signature
(JWS)</eref>", May 2015.</t>

<t>[RFC7517] Jones, M., "<eref target="https://datatracker.ietf.org/doc/html/rfc7517">JSON Web Key (JWK)</eref>", May 2015.</t>

<t>[RFC8032] Josefsson, S., Liusvaara, I., "<eref target="https://datatracker.ietf.org/doc/html/rfc8032">Edwards-Curve Digital
Signature Algorithm (EdDSA)</eref>", January 2017.</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>[RFC8615] Nottingham, M. "<eref target="https://datatracker.ietf.org/doc/html/rfc8615">Well-Known Uniform Resource Identifiers
(URIs)</eref>", May 2019</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>[RFC9530] Polli, R., Marwood, D., "<eref target="https://datatracker.ietf.org/doc/html/rfc9530">Digest Fields</eref>", February 2024.</t>

<t>[RFC9553] Stepanek, R., Loffredo, M., "<eref target="https://datatracker.ietf.org/doc/html/rfc9553">JSContact: A JSON
Representation of Contact Data</eref>, May 2024"</t>

</section>
<section anchor="informative-references"><name>Informative References</name>

<t>[OCM-IP] Nordin, M., Lo Presti, G., and Baghbani, M. "<eref target="https://datatracker.ietf.org/doc/draft-nordin-ocm-integration-protocol/">Open
Cloud Mesh Integration
Protocol</eref>",
Work in Progress, Internet-Draft.</t>

<t>[OCM-MLS] Nordin, M., Lo Presti, G., and Baghbani, M. "<eref target="https://datatracker.ietf.org/doc/draft-nordin-ocm-mls-federated-groups/">Federated
Groups in Open Cloud Mesh using Messaging Layer
Security</eref>",
Work in Progress, Internet-Draft.</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">must-use-mfa</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">must-use-mfa</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-jwks-and-http-signature-examples"><name>Appendix B: JWKS and HTTP Signature Examples</name>

<section anchor="jwks-endpoint"><name>JWKS Endpoint</name>

<t>An OCM Server that advertises the <spanx style="verb">http-sig</spanx> capability MUST expose its
public keys at <spanx style="verb">/.well-known/jwks.json</spanx> in the format specified by
[RFC7517].  Here is an example response from
<spanx style="verb">https://sender.example.org/.well-known/jwks.json</spanx>:</t>

<figure type="json"><artwork><![CDATA[
{
  "keys": [
    {
      "kty": "OKP",
      "crv": "Ed25519",
      "kid": "sender.example.org#key1",
      "x": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo"
    }
  ]
}
]]></artwork></figure>

</section>
<section anchor="signing-a-request-sender"><name>Signing a Request (Sender)</name>

<t>Given a Share Creation Notification request:</t>

<sourcecode type="http">
POST /ocm/shares HTTP/1.1
Host: receiver.example.org
Date: Fri, 16 Jan 2026 13:37:00 GMT
Content-Type: application/json
Content-Digest: sha-256=:LkpHyFOVbBDPxc7YbHDOWNzAv88qWuVfLNf4TUf9Uo8=:

{
  "shareWith": "marie@receiver.example.org",
  "name": "spec.yaml",
  "providerId": "7c084226-d9a1-11e6-bf26-cec0c932ce01",
  "owner": "einstein@sender.example.org",
  "sender": "einstein@sender.example.org",
  "ownerDisplayName": "Albert Einstein",
  "senderDisplayName": "Albert Einstein",
  "shareType": "user",
  "resourceType": "file",
  "protocol": {
    "name": "multi",
    "webdav": {
      "uri": "spec.yaml",
      "sharedSecret": "hfiuhworzwnur98d3wjiwhr",
      "permissions": ["read", "write"]
    }
  }
}
</sourcecode>

<t>The signature base is constructed according to [RFC9421] (with line
breaks in @signature-params for display purposes only):</t>

<sourcecode type="http">
"@method": POST
"@target-uri": https://receiver.example.org/ocm/shares
"content-digest": sha-256=:[digest-value]:
"content-length": [body-length]
"date": [date]
"@signature-params": ("@method" "@target-uri" "content-digest"
    "content-length" "date");
    created=[timestamp];
    keyid="sender.example.org#key1";
    alg="ed25519"
</sourcecode>

<t>Sign this base using for example Ed25519 ([RFC8032]) to produce the
signature, using the <spanx style="verb">ocm</spanx> label, and then add headers (line breaks
for display purposes only):</t>

<sourcecode type="http">
Content-Digest: sha-256=:[digest-value]:
Content-Length: [body-length]
Date: [date]
Signature-Input: ocm=("@method" "@target-uri" "content-digest"
    "content-length" "date");
  created=[timestamp];
  keyid="sender.example.org#key1";
  alg="ed25519"
Signature: ocm=:[signature-value]=:
</sourcecode>

<t>A signed request MUST cover at least the following Signature-Input
components:</t>

<t><list style="symbols">
  <t>"@method"             - HTTP method</t>
  <t>"@target-uri"         - full request URI (scheme, authority,
                        path, query)</t>
  <t>"content-digest"      - [RFC9530] digest of the body</t>
  <t>"content-length"      - bound message size</t>
  <t>"date"                - bound clock time</t>
</list></t>

<t>The Signature-Input parameters MUST include <spanx style="verb">created</spanx>.  Verifiers MUST
reject signatures that omit any of the above components or the <spanx style="verb">created</spanx>
parameter, and MUST reject signatures whose <spanx style="verb">created</spanx> value is more than
a small implementation-defined skew tolerance in the future, or older
than the verifier's freshness window.</t>

<t>A <spanx style="verb">Content-Digest</spanx> header value carrying multiple algorithms MUST have
every recognised digest match the body; a single match alongside a
recognised mismatch MUST be treated as an integrity failure.</t>

<t>A request signed in the context of OCM MUST include one and only one
signature with the label <spanx style="verb">ocm</spanx> in its Signature and Signature-Input
headers.</t>

<t>A symmetric signing algorithm MUST NOT be used to sign the
request, as the Receiving Server would not be able to verify the
signature without having access to the shared secret in advance.</t>

</section>
<section anchor="verifying-a-signature-receiver"><name>Verifying a Signature (Receiver)</name>

<t>Verifiers MUST locate the ocm-labeled entry and verify only that one.
If multiple <spanx style="verb">ocm</spanx> signatures are present, the entire message MUST be
rejected.  Verifiers MUST reject requests for which no ocm-labeled entry
is present.  Other labels MAY coexist (e.g. proxy-attached signatures)
but verifiers MUST NOT process them as part of OCM signature
processing.</t>

<t>To verify an incoming signed request:</t>

<t><list style="numbers" type="1">
  <t>Extract the provider domain from the <spanx style="verb">sender</spanx> field in the
request body</t>
  <t>Fetch the public key from
<spanx style="verb">https://&lt;provider-domain&gt;/.well-known/jwks.json</spanx></t>
  <t>Locate the unique signature with the label <spanx style="verb">ocm</spanx> in the
<spanx style="verb">Signature-Input</spanx> header</t>
  <t>Extract <spanx style="verb">keyid</spanx> from <spanx style="verb">Signature-Input</spanx> header and find the key
matching the <spanx style="verb">kid</spanx> value in the [RFC7517] response</t>
  <t>Reconstruct the signature base from the request using the
components listed in <spanx style="verb">Signature-Input</spanx> as specified in [RFC9421]</t>
  <t>Verify the signature using the appropriate algorithm
(e.g., Ed25519 [RFC8032])</t>
</list></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 HTTPS GET, a signed JWS document [RFC7515], where
the signing key MUST be made available offline and the payload MUST
adhere to 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>

<figure type="json"><artwork><![CDATA[
{
  "payload": {
    "federation": "The ScienceMesh Directory",
    "servers": [
      {
        "url": "https://ocm-server.example.org",
        "displayName": "OCM Server 1"
      },
      {
        "url": "https://ocm-server.example.com:4443",
        "displayName": "OCM Server 2"
      },
      {
        "url": "http://192.168.1.1:8080",
        "displayName": "OCM Server 3"
      }
    ]
  },
  "protected": {"alg": "ES256"},
  "signature": "..."
}
]]></artwork></figure>

</section>
<section anchor="appendix-d-object-models"><name>Appendix D: Object models</name>

<t>An implementor of OCM MAY choose any internal object model to represent
an <em>Address Book</em>, a <em>Contact</em>, an <em>Invite</em>, a <em>Provider</em>, a <em>Share</em>,
and a <em>User</em>.  The following diagrams are provided to clarify
the concepts and their relationships, as a guide for implementors.</t>

<section anchor="address-book"><name>Address Book</name>

<t>An <em>OCM Provider</em> MAY offer its <em>Users</em> 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 <em>Receiving
Party</em> in preparation for Share Creation.</t>

<t>The Address Book entity maintains a collection of contacts for a user
within the OCM provider.  It serves as the primary mechanism for
managing federated relationships between users across different OCM
Servers. <em>Contacts</em> may be added to the Address Book through the Invite
flow or direct entry.  It provides a convenient way for users to
organize and access their federated contacts, and MAY allow users to
generate <em>Invites</em>.</t>

<figure><artwork><![CDATA[
+-----------------+
|  Address Book   |
|                 |
| - owner: User   |--------+
| - contacts: []  |        |
+-----------------+        |
       |                   |
       | contains          | generates
       | 0..*              |
       v                   v
+-----------------+  +----------------+
|    Contact      |  |    Invites     |
+-----------------+  +----------------+
]]></artwork></figure>

<section anchor="properties"><name>Properties</name>

<t><list style="symbols">
  <t><strong>owner</strong>: Reference to the User who owns this address book</t>
  <t><strong>contacts</strong>: Array of Contact objects stored in the address book</t>
</list></t>

</section>
<section anchor="relationships"><name>Relationships</name>

<t><list style="symbols">
  <t>An Address Book belongs one or more Users.</t>
  <t>An Address Book contains zero or more Contacts.</t>
  <t>An Address Book MAY allow its owner to generate Invites.</t>
</list></t>

</section>
</section>
<section anchor="contact"><name>Contact</name>
<t>A Contact represents a federated user relationship established through
the OCM protocol.  Contacts are stored in <em>Address Books</em> and may be
created through the Invite process or via direct entry.  A Contact MAY
of course contain much more detailed information about the referenced
user such as if it was added via <em>Invites</em> or direct entry.</t>

<figure><artwork><![CDATA[
+-----------------+
|    Contact      |
+-----------------+
| - addedDate     |
| - email         |
| - name          |
| - provider      |
| - userID        |
+-----------------+
       ^
       | referenced by
       |
+-----------------+
|  Address Book   |
+-----------------+
]]></artwork></figure>

<section anchor="properties-1"><name>Properties</name>

<t><list style="symbols">
  <t><strong>addedDate</strong>: Timestamp of when contact was added</t>
  <t><strong>email</strong>: Contact email address (informational)</t>
  <t><strong>name</strong>: Human-readable display name</t>
  <t><strong>userID</strong>: The identifier of the contact at their OCM Server</t>
  <t><strong>provider</strong>: The FQDN of the contact's OCM Server</t>
</list></t>

</section>
<section anchor="relationships-1"><name>Relationships</name>

<t><list style="symbols">
  <t>A Contact may be referenced by one or more Address Books.</t>
</list></t>

</section>
</section>
<section anchor="invite"><name>Invite</name>

<t>The Invite entity represents the bidirectional trust establishment
mechanism in OCM.  It facilitates secure contact exchange between users
on different OCM Servers.</t>

<figure><artwork><![CDATA[
+-----------------+
|     Invite      |
+-----------------+
| - acceptedTime  |
| - createdTime   |
| - sender: User  |
| - token         |
+-----------------+
       |
       | generated by
       v
+-----------------+
|   Address Book  |
+-----------------+

]]></artwork></figure>

<section anchor="properties-2"><name>Properties</name>

<t><list style="symbols">
  <t><strong>acceptedTime</strong>: Timestamp of invite acceptance (if accepted)</t>
  <t><strong>createdTime</strong>: Timestamp of invite creation</t>
  <t><strong>sender</strong>: Reference to the User who sent the Invite</t>
  <t><strong>token</strong>: Unique, hard-to-guess string generated by Invite Sender
           OCM Server</t>
</list></t>

</section>
<section anchor="relationships-2"><name>Relationships</name>

<t><list style="symbols">
  <t>An Invite is generated by an Address Book entry action.</t>
  <t>An Invite is associated with exactly one User as the sender.</t>
</list></t>

</section>
</section>
<section anchor="provider"><name>Provider</name>

<t>The Provider entity represents an OCM Server's capabilities and
configuration as discovered through the OCM API Discovery process.  It
represents both the Sending Server and Receiving Server roles, and an
implementor might find it useful to have a Provider object model to
store the discovered information about federation peers or other remote
OCM Providers.</t>

<t>The following diagram is illustrative and non-exhaustive.  The single
source of truth for Provider properties is the OCM API Discovery Fields
section; for the box contents below, see the Properties subsection and
the normative capability, criteria, and resource type definitions in
that section.</t>

<figure><artwork><![CDATA[
            +-----------------------+
            |      Provider         |
            |    (OCM Server)       |
            +-----------------------+
            | - apiVersion          |
            | - enabled             |
            | - endPoint            |
            | - inviteAcceptDialog  |
            | - provider            |
            | - tokenEndPoint       |
            | - ...                 |
            +-----------------------+
                   |
                   | exposes
                   |
         +---------+---------+----------------------+
         |                   |                      |
         v                   v                      |
+------------------+  +------------------+          |
| ResourceTypes[]  |  | Capabilities[]   |          |
+------------------+  +------------------+          |
| - name           |  | - enforce-mfa    |          |
| - shareTypes[]   |  | - exchange-token |          |
| - protocols{}    |  | - http-sig       |          |
| - ...            |  | - invites        |          |
+------------------+  | - notifications  |          |
       |              | - protocol-object|          |
       |              | - ...            |          |
       |              +------------------+          |
       |                                            |
       |                           +----------------+
       |                           |
       |                           v
       |              +--------------------------+
       |              |    Criteria[]            |
       |              +--------------------------+
       |              | - allowlist              |
       |              | - denylist               |
       |              | - must-use-http-sig      |
       |              | - must-invite            |
       |              | - must-exchange-token    |
       |              | - ...                    |
       |              +--------------------------+
       |
       | supports
       v
+------------------+
|   Protocols      |
+------------------+
| - ssh            |
| - ssh-receive    |
| - webapp         |
| - webapp-receive |
| - webdav         |
| - webdav-receive |
| - ...            |
+------------------+
]]></artwork></figure>

<section anchor="properties-3"><name>Properties</name>

<t><list style="symbols">
  <t><strong>apiVersion</strong>: Version string of supported OCM API</t>
  <t><strong>capabilities</strong>: Optional features supported</t>
  <t><strong>criteria</strong>: Requirements for accepting Share Creation Notifications</t>
  <t><strong>enabled</strong>: Boolean indicating if OCM service is active</t>
  <t><strong>endPoint</strong>: Base URI for OCM API endpoints</t>
  <t><strong>provider</strong>: Friendly branding name</t>
  <t><strong>resourceTypes</strong>: Array of supported resource types with protocols</t>
</list></t>

</section>
</section>
<section anchor="share"><name>Share</name>

<t>The Share entity represents a policy granting access to a <em>Resource</em>
from a Sending Party to a Receiving Party.</t>

<figure><artwork><![CDATA[
+-----------------+                      +------------------+
|  Sending Party  |                      | Receiving Party  |
+-----------------+                      +------------------+
       |                                        |
       | creates                                | accesses
       v                                        v
+------------------+     notification    +------------------+
|     Share        |-------------------->| Receiving Server |
+------------------+                     +------------------+
| - expiration     |                            |
| - name           |                            | mediates access to
| - owner          |                            v
| - protocol       |                     +------------------+
| - providerId     |                     | Resource (remote)|
| - requirements[] |                     +------------------+
| - resourceType   |
| - sender         |
| - shareType      |
| - shareWith      |
| - state          |
+------------------+
       |
       | governs access to
       v
+-----------------+
|    Resource     |
+-----------------+
]]></artwork></figure>

<section anchor="properties-4"><name>Properties</name>

<t><list style="symbols">
  <t><strong>expiration</strong>: Optional expiration timestamp</t>
  <t><strong>name</strong>: Human-readable name of the shared Resource</t>
  <t><strong>owner</strong>: OCM Address of the Resource owner</t>
  <t><strong>protocol</strong>: Access protocol name and details (webdav, ssh, webapp)</t>
  <t><strong>providerId</strong>: Unique identifier for the Share at the provider</t>
  <t><strong>requirements</strong>: Array of access requirements (must-use-mfa,
                  must-exchange-token)</t>
  <t><strong>resourceType</strong>: Type of resource (file, folder, calendar, etc.)</t>
  <t><strong>sender</strong>: OCM Address of the party creating the Share</t>
  <t><strong>shareType</strong>: Type of recipient (user, group, federation)</t>
  <t><strong>shareWith</strong>: OCM Address of the Receiving Party</t>
  <t><strong>state</strong>: Current state of the Share (accepted, pending, deleted)</t>
</list></t>

<section anchor="share-states"><name>Share States</name>

<t><list style="symbols">
  <t><strong>Accepted</strong>: Share accepted, Resource accessible</t>
  <t><strong>Deleted</strong>: Share removed or expired</t>
  <t><strong>Pending</strong>: Awaiting acceptance by Receiving Party</t>
</list></t>

</section>
</section>
<section anchor="relationships-3"><name>Relationships</name>

<t><list style="symbols">
  <t>A Share is created by a User (local).</t>
  <t>A Share is received by a User (remote).</t>
  <t>A Share governs access to a Resource.</t>
</list></t>

</section>
</section>
<section anchor="user"><name>User</name>

<t>The User entity represents the party in OCM who can send and receive
Shares and Invites and manage Contacts, and interact with Resources.</t>

<figure><artwork><![CDATA[
                +-----------------------+
                |        User           |
                +-----------------------+
                | - email               |
                | - name                |
                | - ocmAddress          |
                | - uid                 |
                +-----------------------+
                            |
                  +---------+---------+
                  |                   |
                  | owns              | participates in
                  v                   v
         +------------------+  +------------------+
         |  Address Book    |  |    Shares        |
         +------------------+  +------------------+
         | - contacts[]     |  | - receiving[]    |
         +------------------+  | - sending[]      |
                  |            +------------------+
                  |
                  | issues
                  v
         +------------------+
         |    Invites       |
         +------------------+
         | - sent[]         |
         +------------------+
]]></artwork></figure>

<section anchor="properties-5"><name>Properties</name>

<t><list style="symbols">
  <t><strong>email</strong>: User's email address</t>
  <t><strong>name</strong>: Human-readable display name</t>
  <t><strong>ocmAddress</strong>: Full OCM Address</t>
  <t><strong>uid</strong>: Unique identifier within the OCM Provider</t>
</list></t>

</section>
<section anchor="relationships-4"><name>Relationships</name>

<t><list style="symbols">
  <t>A User owns one or more Address Book(s).</t>
  <t>A User issues zero or more Invites.</t>
  <t>A User participates in zero or more Shares as Sending or Receiving
Party.</t>
</list></t>

</section>
</section>
<section anchor="resource"><name>Resource</name>

<t>The Resource entity represents the data or service being shared between
OCM Providers.  It is the target of Shares and is accessed by the
Receiving Party through the Sending Server's API.  In general a Resource
is a much more complex entity, but for the purpose of OCM we only need
to model a few key properties.</t>

<figure><artwork><![CDATA[
+-----------------+
|    Resource     |
+-----------------+
| - location      |
| - owner: User   |
| - resourceID    |
| - type          |
+-----------------+
       ^
       |
       | accessed via
       |
       v
+------------------+
|     Share        |
+------------------+
]]></artwork></figure>

<section anchor="properties-6"><name>Properties</name>

<t><list style="symbols">
  <t><strong>location</strong>: URI or path to access the Resource</t>
  <t><strong>owner</strong>: Reference to the User who owns the Resource</t>
  <t><strong>resourceID</strong>: Unique identifier of the Resource</t>
  <t><strong>type</strong>: Type of Resource (file, folder, calendar, etc.)</t>
</list></t>

</section>
</section>
</section>
<section anchor="changes"><name>Changes</name>

<t>This section collects the changes with respect to the previous
version in the IETF datatracker.  It is meant to ease the review
process and it shall be removed when going to RFC last call.
The complete changelog is updated in the OCM-API GitHub repository.</t>

<section anchor="version-05"><name>Version 05</name>
<t><list style="symbols">
  <t>Introduced a <spanx style="verb">/request-share</spanx> endpoint to request a user of an
OCM server to share a resource.</t>
  <t>Refactored the <spanx style="verb">webapp</spanx> protocol to align it to the new security
standard, by means of POST requests and the Code Flow.</t>
  <t>Introduced new <spanx style="verb">&lt;protocol&gt;-receive</spanx> protocols in the Discovery
endpoint, to signal the ability to receive an OCM share carrying
that protocol.</t>
  <t>Introduced new Internet-Draft specifications to cover optional
parts of the protocol related to webapp integrations and federated
groups.</t>
  <t>Renamed some requirements and criteria to improve consistency.</t>
  <t>On a Share Creation Notification, made the <spanx style="verb">sharedSecret</spanx>
a required parameter for all protocol payloads that specify it.</t>
  <t>Fixed all example URIs to use <spanx style="verb">example.org</spanx> across the spec.</t>
  <t>Improved the JWKS-related text and fixed obsoleted references.</t>
  <t>Removed the already deprecated <spanx style="verb">/ocm-provider</spanx> endpoint and the
draft-cavage public key advertisement in the OCM Discovery endpoint
as all known implementations have migrated to the recommended
alternatives.</t>
</list></t>

</section>
<section anchor="version-04"><name>Version 04</name>
<t><list style="symbols">
  <t>Clarified that the diagrams in Appendix D are illustrative and
not normative.</t>
  <t>Minor formatting fixes.</t>
</list></t>

</section>
<section anchor="version-03"><name>Version 03</name>
<t><list style="symbols">
  <t>Fixed formatting of artworks, code blocks and bullet lists.</t>
</list></t>

</section>
<section anchor="version-02"><name>Version 02</name>
<t><list style="symbols">
  <t>Added the <em>Changes</em> section.</t>
</list></t>

</section>
<section anchor="version-01"><name>Version 01</name>
<t><list style="symbols">
  <t>Introduced functions, roles, and object models to the specification.</t>
  <t>Added support for SSH as a share access method.</t>
  <t>Introduced <spanx style="verb">accessType</spanx> property in shares and removed the datatx
"protocol" in favor of a cleaner access model.</t>
  <t>Improved resource access description with token exchange, and
specified request payload format for the <spanx style="verb">/token</spanx> endpoint.</t>
  <t>Added RFC 9421 HTTP Message Signatures support via <spanx style="verb">http-sig</spanx>
capability and RFC 7515 (JWS) compliant JWKS and prescribed use of
JWS for the Directory Service.</t>
  <t>Updated and homogenized capabilities across the specification.</t>
  <t>Added JSContact extension to IANA Considerations.</t>
  <t>Changed example domain to use cloud.example.org per RFC 2606.</t>
</list></t>

</section>
</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, Enrique Pérez Arnaud, 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>

<t>Work on this document has been partially funded over the years by
multiple projects and funding agencies:</t>

<t><list style="symbols">
  <t>The <eref target="https://cs3mesh4eosc.eu/">CS3MESH4EOSC</eref> project "Interactive and agile/responsive
sharing mesh of storage, data and applications for EOSC", whose key
result was <eref target="https://cs3mesh4eosc.eu/science-mesh">Science Mesh</eref>, received funding from the
European Union's Horizon 2020 research and innovation programme under
Grant Agreement no. <eref target="https://cordis.europa.eu/project/id/863353">863353</eref>.</t>
  <t><eref target="https://www.nlnet.nl/">NLnet</eref> through the <eref target="https://www.nlnet.nl/core">NGI0 Core Fund</eref>, with
financial support from the European Commission's
<eref target="https://ngi.eu/">Next Generation Internet</eref> programme under grant agreement
No. <eref target="https://cordis.europa.eu/project/id/101092990">101092990</eref>.</t>
  <t>The <eref target="https://www.eosc-data-commons.eu/">EOSC Data Commons</eref> project "Services for inter- and
cross-disciplinary data discovery, access, sharing and reuse in the
EOSC Federation", received funding from the European Union under Grant
Agreement no. <eref target="https://cordis.europa.eu/project/id/101188179">101188179</eref>.</t>
  <t><eref target="https://www.sovereign.tech/">Sovereign Tech Agency</eref> through the <eref target="https://www.sovereign.tech/programs/fund">Tech Fund</eref>, with
a specific <eref target="https://www.sovereign.tech/tech/open-cloud-mesh">project</eref>.</t>
</list></t>

</section>


  </middle>

  <back>








  </back>

<!-- ##markdown-source:
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
UwLlq8/mrpvW2BTBuVIRXqngb+2BCkMwkAEA

-->

</rfc>

