<?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.31 (Ruby 3.2.10) -->


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

]>


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

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

    <date year="2026" month="February" day="17"/>

    <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@ocm.example.org</spanx>.  <vspace blankLines='1'/>
host is an IP literal encapsulated within square brackets, an IPv4
  address in dotted decimal form, or a registered name as described in
  [RFC3986].  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  host = IP-literal / IPv4address / reg-name
]]></artwork></figure>
  <vspace blankLines='1'/>
The optional port subcomponent can be used to specify a port to use
  for discovery (see Discovery Process).  <vspace blankLines='1'/>
The OCM Server MUST be discoverable at the given host and optional
  port via the Well-Known [RFC8615] path <spanx style="verb">/.well-known/ocm</spanx>.  The OCM
  Address MUST NOT contain a path.</t>
  <t><strong>OCM 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 7.
Step 4: If not, try a HTTP GET with <spanx style="verb">https://&lt;fqdn&gt;/ocm-provider</spanx> as
the URL instead.
Step 5: If that results in a valid HTTP response with a valid JSON
response body within reasonable time, go to step 7.
Step 6: If not, fail.  Implementations MAY fallback to HTTP instead
of HTTPS in testing setups and retry steps 2-5, in particular when
an optional port is given in the address.
Step 7: The JSON response body is the data that was discovered.</t>

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

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

<t><list style="symbols">
  <t>REQUIRED: enabled (boolean) - Whether the OCM service is enabled at
this endpoint</t>
  <t>REQUIRED: apiVersion (string) - The OCM API version this endpoint
supports.  Example: <spanx style="verb">"1.3.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/",
          "webapp": "/app/ocm/",
          "talk": "/apps/spreed/api/"
        }
]]></artwork></figure>
      <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).
- webapp (string) - The top-level path for web apps at this
  endpoint.  In order to access a remote web app, implementations
  SHOULD use this path as a prefix (see sharing examples).
- 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.
- Any additional protocol supported for this Resource type MAY be
  advertised here, where the value MAY correspond to
  a top-level URI to be used for that protocol.</t>
    </list></t>
  <t>OPTIONAL: capabilities (array of string) - The optional capabilities
supported by this OCM Server.
As implementations MUST accept Share Creation Notifications
to be compliant, it is not necessary to expose that as a
capability.
Example: <spanx style="verb">["exchange-token", "webdav-uri"]</spanx>.  The array MAY
include 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 exposes a
[RFC6749]-compliant endpoint, which allows to exchange a secret
received in the protocol properties of a Share Creation Notification
for a short-lived bearer token.</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">"webdav-uri"</spanx> - to indicate that this OCM Server can append a
relative URI to the path listed for WebDAV [RFC4918] in the
appropriate <spanx style="verb">resourceTypes</spanx> entry <spanx style="verb">"protocol-object"</spanx> - to
indicate that this OCM Server can receive a Share Creation
Notification whose <spanx style="verb">protocol</spanx> object contains one property per
supported protocol instead of containing the standard <spanx style="verb">name</spanx> and
<spanx style="verb">options</spanx> properties.</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">["http-request-signatures"]</spanx>.  The array MAY include
for instance:
  <list style="symbols">
      <t><spanx style="verb">"http-request-signatures"</spanx> - to indicate that API requests
without http signatures will be rejected.</t>
      <t><spanx style="verb">"token-exchange"</spanx> - to indicate that API requests without
token exchange will be rejected (see the <xref target="code-flow">Code Flow</xref>
section).</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">"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>DEPRECATED: publicKey (object) - Use public keys at
<spanx style="verb">/.well-known/jwks.json</spanx> instead for RFC 9421 support.</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 where the
Sending Server can exchange a secret for a short-lived bearer token.
Implementations that offer the <spanx style="verb">"exchange-token"</spanx> capability MUST
provide this URL as well.
Example: <spanx style="verb">"https://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>

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

<t><list style="symbols">
  <t>REQUIRED shareWith (string)
OCM Address of the user, group or federation the provider
wants to share the Resource with.  This MUST be known
in advance, either via a previous Invitation or through
other means.
Example: "51dc30ddc473d43a6011e9ebba6ca770@geant.org"</t>
  <t>REQUIRED name (string)
Name of the Resource (file or folder).
Example: "resource.txt"</t>
  <t>OPTIONAL description (string)
Optional description of the Resource (file or folder).
Example: "This is the Open API Specification file (in YAML
format) of the Open Cloud Mesh API."</t>
  <t>REQUIRED providerId (string)
Opaque value to identify the Shared Resource at the provider side.
This MUST be unique per Resource and per share, such that multiple
shares of a given Resource are guaranteed to get different values.
Example: 7c084226-d9a1-11e6-bf26-cec0c932ce01</t>
  <t>REQUIRED owner (string) -
OCM Address of the user who owns the
Resource.
Example: "6358b71804dfa8ab069cf05ed1b0ed2a@apiwise.nl"</t>
  <t>REQUIRED sender (string) -
OCM Address of the user that wants to share
the Resource.
Example: "527bd5b5d689e2c32ae974c6229ff785@apiwise.nl"</t>
  <t>OPTIONAL ownerDisplayName (string)
Display name of the owner of the Resource
Example: "Dimitri"</t>
  <t>OPTIONAL senderDisplayName (string)
Display name of the user that wants to share the Resource
Example: "John Doe"</t>
  <t>REQUIRED shareType (string)
SHOULD have a value of "user", "group", or "federation", to
indicate that the first part of the <spanx style="verb">shareWith</spanx> OCM Address refers
to a Receiving Party who is a single user of the Receiving Server,
a group of users at the Receiving Server, or a group of users that
spans multiple OCM Servers belonging to a federation as exposed by
a Directory Service, including at least one user at the Receiving
Server.
In the federation case, OCM Servers MAY resolve the actual
recipients by either querying external AAI systems, or exchanging
the groups' metadata between themselves.  Such exchange is out of
scope for this version of the this specification.
Alternatively, the Receiving Server MAY hold the federated groups'
metadata and act as an OCM proxy, forwarding the OCM requests to
the actual members of the federation.</t>
  <t>REQUIRED resourceType (string)
Resource type (file, folder, calendar, contact, ...).  If the
Resource is a folder, implementations SHOULD advertise it as
<spanx style="verb">folder</spanx> rather than <spanx style="verb">file</spanx>, in order to streamline the processing
by the Receiving Server.</t>
  <t>OPTIONAL expiration (integer)
The expiration time for the OCM share, in seconds
of UTC time since Unix epoch.  If omitted, it is assumed that the
share does not expire.  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: - <spanx style="verb">webdav</spanx>, to access the data -
<spanx style="verb">webapp</spanx>, to access remote web applications - <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>
  <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: - <spanx style="verb">remote</spanx> signals the recipient that
the resource is available for remote access and interactive
browsing.  - <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>
      <t>REQUIRED uri (string)
A URI to access the Remote Resource.  The URI
SHOULD be relative, in which case the prefix
exposed by the <spanx style="verb">/.well-known/ocm</spanx> endpoint MUST
be used.  Absolute URIs are deprecated.</t>
      <t>REQUIRED sharedSecret (string)
A secret to be used to access the Resource, such as
a bearer token.  To prevent leaking it in logs it
MUST NOT appear in any URI.</t>
      <t>OPTIONAL permissions (array of strings) -
The permissions granted to the sharee.  A subset
of: - <spanx style="verb">read</spanx> allows read-only access including
download of a copy.  - <spanx style="verb">write</spanx> allows create, update, and delete
rights on the Resource.  - <spanx style="verb">share</spanx> allows re-share rights on the
Resource.</t>
      <t>OPTIONAL requirements (array of strings) -
The requirements that the sharee MUST fulfill to
access the Resource.  A subset of: - <spanx style="verb">must-use-mfa</spanx> requires the
consumer to be MFA-authenticated.  This MAY be used if the
recipient provider exposes the <spanx style="verb">enforce-mfa</spanx>
capability.  - <spanx style="verb">must-exchange-token</spanx> requires the recipient to
exchange the given <spanx style="verb">sharedSecret</spanx> via a signed HTTPS request
to the Sending Server's {tokenEndPoint} [RFC6749].
This MAY be used if the recipient provider exposes the
<spanx style="verb">exchange-token</spanx> capability.</t>
      <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 the web
applications available at the site.  The URI SHOULD
be relative, in which case the prefix exposed by
the <spanx style="verb">/.well-known/ocm</spanx> endpoint MUST be used.
Absolute URIs are deprecated.</t>
      <t>REQUIRED viewMode (string)
The permissions granted to the sharee.  A subset of: - <spanx style="verb">view</spanx>
allows access to the web app in view-only mode.  - <spanx style="verb">read</spanx> allows
read and download access via the web app.  - <spanx style="verb">write</spanx> allows full
editing rights via the web app.</t>
      <t>OPTIONAL sharedSecret (string)
An optional secret to be used to access the remote
web app, for example in the form of a bearer token.</t>
    </list></t>
  <t>Protocol details for <spanx style="verb">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: - <spanx style="verb">remote</spanx> signals the recipient that
the resource is available for remote access, e.g. via sshfs.
      <list style="symbols">
          <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="share-acceptance-notification"><name>Share Acceptance Notification</name>

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

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

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

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

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

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

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

</section>
</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 endpoint inspected at step 1. exposes the
 <spanx style="verb">token-exchange</spanx> capability, the receiver MAY attempt to perform
 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>
</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:
  sig1=("@method" "@target-uri" "content-digest" "date");
  created=1730815200;
  keyid="receiver.example.org#key1";
  alg="rsa-sha256"
Signature: sig1=: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>
<section anchor="share-deletion"><name>Share Deletion</name>

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

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

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

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

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

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

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

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

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

</section>
<section 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:
   +==============+==========================================+
   | 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       |
   |--------------|------------------------------------------|</t>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t>[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>[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>[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>
<section anchor="appendix-a-multi-factor-authentication"><name>Appendix A: Multi-factor Authentication</name>

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

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

</section>
<section anchor="appendix-b-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]=:
"@signature-params": ("@method" "@target-uri" "content-digest");
    created=[timestamp];
    keyid="sender.example.org#key1";
    alg="ed25519"
</sourcecode>

<t>Sign this base using for example Ed25519 ([RFC8032]) to produce the
signature, then add headers (line breaks for display purposes only):</t>

<sourcecode type="http">
Signature-Input: sig1=("@method" "@target-uri" "content-digest");
  created=[timestamp];
  keyid="sender.example.org#key1";
  alg="ed25519"
Signature: sig1=:[signature-value]=:
</sourcecode>

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

<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>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-1.example.org",
        "displayName": "OCM Server 1"
      },
      {
        "url": "https://ocm-server-2.example.org:4443",
        "displayName": "OCM Server 2"
      },
      {
        "url": "http://192.168.1.1:8080",
        "displayName": "OCM Server 3"
      }
    ]
  },
  "protected": {"alg": "RS256"},
  "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>

<figure><artwork><![CDATA[
            +-----------------------+
            |      Provider         |
            |    (OCM Server)       |
            +-----------------------+
            | - apiVersion          |
            | - enabled             |
            | - endPoint            |
            | - inviteAcceptDialog  |
            | - provider            |
            | - publicKey           |
            | - tokenEndpoint       |
            +-----------------------+
                   |
                   | exposes
                   |
         +---------+---------+----------------------+
         |                   |                      |
         v                   v                      v
+------------------+  +------------------+   +------------------+
| ResourceTypes[]  |  | Capabilities[]   |   |    Criteria[]    |
+------------------+  +------------------+   +------------------+
| - name           |  | - enforce-mfa    |   | - allowlist      |
| - shareTypes[]   |  | - exchange-token |   | - denylist       |
| - protocols{}    |  | - invite-wayf    |   | - http-signatures|
+------------------+  | - invites        |   | - invite         |
       |              | - webdav-uri     |   | - token-exchange |
       |              +------------------+   +------------------+
       | supports
       v
+------------------+
|   Protocols      |
+------------------+
| - ssh            |
| - webapp         |
| - webdav         |
| - ...            |
+------------------+
]]></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>publicKey</strong>: Optional public key for HTTP signatures</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-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, Iosif Peterfi,
Alessandro Petraro, Rene Ranger, Angelo Romasanta, David Rousse,
Carla Sauvanaud, Klaus Scheibenberger, Marcin Sieprawski,
Tilo Steiger, C.D. Tiwari, Alejandro Unger and Tom Wezepoel.</t>

</section>


  </middle>

  <back>








  </back>

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

-->

</rfc>

