<?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.30 (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-02" 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="January" day="21"/>

    <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:
<spanx style="verb">json
        {
          "webdav": "/remote/dav/ocm/",
          "webapp": "/app/ocm/",
          "talk": "/apps/spreed/api/"
        }
</spanx>
Fields:
      <list style="symbols">
          <t>webdav (string) - The top-level WebDAV [RFC4918] path at this
endpoint.  In order to access a Remote Resource, implementations
SHOULD use this path as a prefix (see sharing examples).</t>
          <t>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).</t>
          <t>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.</t>
          <t>Any additional protocol supported for this Resource type MAY be
advertised here, where the value MAY correspond to
a top-level URI to be used for that protocol.</t>
        </list></t>
    </list></t>
  <t>OPTIONAL: capabilities (array of string) - The optional capabilities
supported by this OCM Server.
As implementations MUST accept Share Creation Notifications
to be compliant, it is not necessary to expose that as a
capability.
Example: <spanx style="verb">["exchange-token", "webdav-uri"]</spanx>.  The array MAY
include one or more of the following items:
_ <spanx style="verb">"enforce-mfa"</spanx> - to indicate that this OCM Server can apply a
Sending Server's MFA requirements for a Share on their behalf.
_ <spanx style="verb">"exchange-token"</spanx> - to indicate that this OCM Server exposes a
[RFC6749]-compliant endpoint, which allows to exchange a secret
received in the protocol properties of a Share Creation Notification
for a short-lived bearer token.
_ <spanx style="verb">"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.
_ <spanx style="verb">"invites"</spanx> - to indicate the server would support acting as an
Invite Sender or Invite Receiver OCM Server.  This might be useful
for suggesting to a user that existing contacts might be upgraded
to the more secure (and possibly required) invite flow.
_ <spanx style="verb">"notifications"</spanx> - to indicate that this OCM Server handles
notifications to exchange updates on shares and invites.
_ <spanx style="verb">"invite-wayf"</spanx> - to indicate that this OCM Server exposes a WAYF
Page to facilitate the Invite flow.
_ <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>
  <t>OPTIONAL: criteria (array of string) - The criteria for accepting a
Share Creation Notification.
As all Receiving Servers SHOULD require the use of TLS in API
calls, it is not necessary to expose that as a criterium.
Example: <spanx style="verb">["http-request-signatures"]</spanx>.  The array MAY include
for instance:
_ <spanx style="verb">"http-request-signatures"</spanx> - to indicate that API requests
without http signatures will be rejected.
_ <spanx style="verb">"token-exchange"</spanx> - to indicate that API requests without
token exchange will be rejected (see the <xref target="code-flow">Code Flow</xref>
section).
_ <spanx style="verb">"denylist"</spanx> - some servers MAY be blocked based on their IP
address
_ <spanx style="verb">"allowlist"</spanx> - unknown servers MAY be blocked based on their IP
address
_ <spanx style="verb">"invite"</spanx> - an invite MUST have been exchanged between the
sender and the receiver before a Share Creation Notification can be
sent</t>
  <t>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>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t><spanx style="verb">json
{
  "keys": [
    {
      "kty": "OKP",
      "crv": "Ed25519",
      "kid": "sender.example.org#key1",
      "x": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo"
    }
  ]
}
</spanx></t>

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

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

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

<t>{
  "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"]
    }
  }
}
```</t>

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

<t><spanx style="verb">
"@method": POST
"@target-uri": https://receiver.example.org/ocm/shares
"content-digest": sha-256=:&lt;digest-value&gt;=:
"@signature-params": ("@method" "@target-uri" "content-digest");
    created=&lt;timestamp&gt;;
    keyid="sender.example.org#key1";
    alg="ed25519"
</spanx></t>

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

<t><spanx style="verb">
Signature-Input: sig1=("@method" "@target-uri" "content-digest");
  created=&lt;timestamp&gt;;
  keyid="sender.example.org#key1";
  alg="ed25519"
Signature: sig1=:&lt;signature-value&gt;=:
</spanx></t>

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

<t><spanx style="verb">json
{
  "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": "..."
}
</spanx></t>

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

<t><spanx style="verb">
+-----------------+
|  Address Book   |
|                 |
| - owner: User   |--------+
| - contacts: []  |        |
+-----------------+        |
       |                   |
       | contains          | generates
       | 0..*              |
       v                   v
+-----------------+  +----------------+
|    Contact      |  |    Invites     |
+-----------------+  +----------------+
</spanx>
### Properties</t>

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

<t><spanx style="verb">
+-----------------+
|    Contact      |
+-----------------+
| - addedDate     |
| - email         |
| - name          |
| - provider      |
| - userID        |
+-----------------+
       ^
       | referenced by
       |
+-----------------+
|  Address Book   |
+-----------------+
</spanx>
### Properties</t>

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

<t>```
+-----------------+
|     Invite      |
+-----------------+
| - acceptedTime  |
| - createdTime   |
| - sender: User  |
| - token         |
+-----------------+
       |
       | generated by
       v
+-----------------+
|   Address Book  |
+-----------------+</t>

<t>```
### Properties</t>

<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 anchor="relationships-2"><name>Relationships</name>

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

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

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

<t><spanx style="verb">
            +-----------------------+
            |      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         |
| - ...            |
+------------------+
</spanx></t>

<section anchor="properties"><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>

<t><spanx style="verb">
+-----------------+                      +------------------+
|  Sending Party  |                      | Receiving Party  |
+-----------------+                      +------------------+
       |                                        |
       | creates                                | accesses
       v                                        v
+------------------+     notification    +------------------+
|     Share        |--------------------&gt;| Receiving Server |
+------------------+                     +------------------+
| - expiration     |                            |
| - name           |                            | mediates access to
| - owner          |                            v
| - protocol       |                     +------------------+
| - providerId     |                     | Resource (remote)|
| - requirements[] |                     +------------------+
| - resourceType   |
| - sender         |
| - shareType      |
| - shareWith      |
| - state          |
+------------------+
       |
       | governs access to
       v
+-----------------+
|    Resource     |
+-----------------+
</spanx></t>

<section anchor="properties-1"><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>

<t><spanx style="verb">
                     +-----------------------+
                     |        User           |
                     +-----------------------+
                     | - email               |
                     | - name                |
                     | - ocmAddress          |
                     | - uid                 |
                     +-----------------------+
                            |
                  +---------+---------+
                  |                   |
                  | owns              | participates in
                  v                   v
         +------------------+  +------------------+
         |  Address Book    |  |    Shares        |
         +------------------+  +------------------+
         | - contacts[]     |  | - receiving[]    |
         +------------------+  | - sending[]      |
                  |            +------------------+
                  |
                  | issues
                  v
         +------------------+
         |    Invites       |
         +------------------+
         | - sent[]         |
         +------------------+
</spanx></t>

<section anchor="properties-2"><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>

<t><spanx style="verb">
+-----------------+
|    Resource     |
+-----------------+
| - location      |
| - owner: User   |
| - resourceID    |
| - type          |
+-----------------+
       ^
       |
       | accessed via
       |
       v
+------------------+
|     Share        |
+------------------+
</spanx></t>

<section anchor="properties-3"><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-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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
W3P+y02NUTe5CNMtR+yLeZM7df32a++v9nHTHxYFCv/s7CJ9NMDfdyAPW/7+
/HeZXUrty5AmqcJZOyViIm6c3icy+5973l/t46Y/fl0k642zD1fioGOnDb/x
95ld3CLMXu3sXKiOf+TUBCR88qw4mP9bZie9EhvNJMwe6xLpBV61dJKl6F0R
Y+bPHP8dSZaIppypq0T7XtWUgJOsoCJVWV6CfAzLucFsIwmE4YrskWpzXuN7
uu7V+yQuKkzQviZfFDnKKDtjEksLjFoRuJD8W6iJ4UAcABtoxPtiEvWkhsfY
C9LBDAya2C195pKDKEJDYK9GZVYkueAEdXAIaZejKL30MvyLguJPqTpRlpMo
5aIhIOglFk3TSbreUeAOEmZE83ZoC06QCkU3Ail0zhqcHt4c8ynOWq5TQaGS
psUsqTEvq5wekFpzcbOeraJgPWBRoMG2tkqqpofDDYjnAWmNLUzlSgfSl8os
MPYPTGgsaPvp+qykMAN3qpLQUEzKcbI/Y8KyVJgzMZM2MRQOwFca9hoEbL8/
O3rx7uTk6O3h0aHG7onHQzJ3gDI78k7HxvRSIWRqXbWSQ+NiU8Vg+bTKKklH
lxCeocR/SrEPLJRHZYHTOXIJfFwKM6fJiBkEKbR8S7+Jp9FopSZi9mtIR+M5
/yQV5oz8LZYmv98QVQr1xsCMfcKpduYgzGNIGJbKLdpq4ZkuWDWzVT84dqvX
SRgA6txSa5U1+ph6vjrud3G4m9bYZKx1PPsHoNoPajblgQ0rUOsyGcbFLkq5
RVxSB9uReO4sP1cSlajnTrChO16s+cZwqiaJ+gZwFSkyUCxMNUU7Ndp7OElv
GK8yFtSS3JjWMXQoaEBXpdwbDM7sDK3UcxTl2V4lNzYz77esQF/H3g9Ik3u7
u88+hs/zaJxiKMd5P+z8hN1lKDLDxC+wZk6871js/8GZE8b4BnsrFh+3NBiD
amPksP/AH1Tiuj/ORvdn5WJ+P5+McNrtTjc4ifLRLNx99uxJn+F58OzpY4An
zgGcovcmhoVfgDBLiT2k4pz12esXFeRX6YZv+kHnp/dpQmVOjDnm2Iaqbb0/
OwaF6FvMdU1G4fkKaO1T8AXAIkwAbPg6SivMhd7b2XnE0HJHsMMKhEjUEhGY
8ARRSPRx9AlEssIU0v0QD9GAA7Iv3BHxOJDYM2FNIkvCx1sgU6hw7vuIw9cV
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
OpR4G/z/4JKOnChEAQA=

-->

</rfc>

