265 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			HTML
		
	
	
			
		
		
	
	
			265 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			HTML
		
	
	
<article>
 | 
						||
	<h1>Fediverse ID Syntax</h1>
 | 
						||
	<section>
 | 
						||
		<address class="h-card">
 | 
						||
			by
 | 
						||
			<a rel="author" class="u-url" href="http://changelog.ca/"><span class="p-given-name">Charles</span> <span class="p-additional-name">Iliya</span> <span class="p-family-name">Krempeaux</span></a>
 | 
						||
		</address>
 | 
						||
	</section>
 | 
						||
	<section>
 | 
						||
		<p>
 | 
						||
			Currently there is no canonical syntax for a <strong>Fediverse ID</strong>.
 | 
						||
			However, we can infer a syntax for the <strong>Fediverse ID</strong> given that it has to be used with <ziba-link dir=".." transform="lowercase">WebFinger</ziba-link>.
 | 
						||
		</p>
 | 
						||
	</section>
 | 
						||
	<section>
 | 
						||
		<h2>De Facto </h2>
 | 
						||
		<p>
 | 
						||
			Currently, the syntax of a <strong>Fediverse ID</strong> is whatever each <ziba-link dir=".." name="software">Fediverse software</ziba-link> supports.
 | 
						||
			Which could be different from each other!
 | 
						||
			And could even change over time!
 | 
						||
		</p>
 | 
						||
		<p>
 | 
						||
			The final say for what is and is not a valid <strong>Fediverse ID</strong> are the many implementations of <ziba-link dir=".." transform="lowercase">WebFinger</ziba-link> in-the-wild for all the different <ziba-link dir=".." name="software">Fediverse software</ziba-link> out there.
 | 
						||
			Which again could be different from each other!
 | 
						||
			And again could even change over time!
 | 
						||
		</p>
 | 
						||
		<p>
 | 
						||
			The reason being because, from a technical point-of-view, a <strong>Fediverse ID</strong> is turned into an <ziba-link dir=".." transform="lowercase">acct URI</ziba-link> and then resolved with <ziba-link dir=".." transform="lowercase">WebFinger</ziba-link>.
 | 
						||
		</p>
 | 
						||
		<p>
 | 
						||
			But, having said that, we can infer a <em>minimum syntax</em> and a <em>maximum syntax</em> for what should be considered a valid <strong>Fediverse ID</strong>.
 | 
						||
			I.e., the syntax that any implmentation for <strong>Fediverse ID</strong>s <em>should</em> support.
 | 
						||
			But, to say it explicitly, an implemention for <strong>Fediverse ID</strong>s <em>could</em> support more than just what is given by thes syntaxes.
 | 
						||
		</p>
 | 
						||
		<p>
 | 
						||
			Perhaps oddly, the <strong>maximal syntax</strong> is simpler than the <strong>minimal syntax</strong>.
 | 
						||
		</p>
 | 
						||
	</section>
 | 
						||
	<section>
 | 
						||
		<h2>Maximal Fediverse ID Syntax</h2>
 | 
						||
		<p>
 | 
						||
			An <ziba-link dir=".." transform="lowercase">acct URI</ziba-link> has some constraints according to the IETF RFC-7565 (The 'acct' URI Scheme) specification.
 | 
						||
			But — software, such as <ziba-link dir=".." name="software">Fediverse software</ziba-link>, don't have to implement those constraints.
 | 
						||
			I.e., they can accept more than just what IETF RFC-7565 (The 'acct' URI Scheme) specifies.
 | 
						||
		</p>
 | 
						||
		<p>
 | 
						||
			Given that, here is a more <em>maximal</em> syntax for a <strong>Fediverse ID</strong>:
 | 
						||
		</p>
 | 
						||
<pre>
 | 
						||
 | 
						||
fediverseID = "@" [ actor ] "@" host
 | 
						||
 | 
						||
</pre>
 | 
						||
		<p>
 | 
						||
			Where, given that ‘NOTATSIGN’ (i.e., <em>not at-sign</em>) is any Unicode character that isn't the U+0040 ("@") at-signs —
 | 
						||
		</p>
 | 
						||
		<p>
 | 
						||
			‘actor’ is defined as:
 | 
						||
		</p>
 | 
						||
<pre>
 | 
						||
 | 
						||
actor       = NOTATSIGN *NOTATSIGN      ; one or more characters that are not an at-sign ("@") (U+0040)
 | 
						||
 | 
						||
</pre>
 | 
						||
		<p>
 | 
						||
			And ‘host’ is defined as:
 | 
						||
		</p>
 | 
						||
<pre>
 | 
						||
 | 
						||
host        = NOTATSIGN *NOTATSIGN      ; one or more characters that are not an at-sign ("@") (U+0040)
 | 
						||
 | 
						||
</pre>
 | 
						||
		<p>
 | 
						||
			Note in this <em>maximal</em> <strong>Fediverse ID</strong> syntax ‘actor’ is optional.
 | 
						||
			But when ‘actor’ isn't included there still needs to be 2 U+0040 ("@") at-signs.
 | 
						||
		</p>
 | 
						||
		<p>
 | 
						||
			Here are some <strong>Fediverse ID</strong>s that fit this <em>maximal</em> <strong>Fediverse ID</strong> syntax:
 | 
						||
		</p>
 | 
						||
		<ul>
 | 
						||
			<li><code class="fediverseid">@joeblow@example.com</code></li>
 | 
						||
			<li><code class="fediverseid">@janedoe@something.example</code></li>
 | 
						||
			<li><code class="fediverseid">@reiver@mastodon.social</code></li>
 | 
						||
			<li><code class="fediverseid">@reiver@greatape.social</code></li>
 | 
						||
			<li><code class="fediverseid">@dariush@changelog.ca</code></li>
 | 
						||
			<li><code class="fediverseid">@malekeh@changelog.ca</code></li>
 | 
						||
		</ul>
 | 
						||
		<ul>
 | 
						||
			<li><code class="fediverseid">@دورود@example.com</code></li>
 | 
						||
		</ul>
 | 
						||
		<ul>
 | 
						||
			<li><code class="fediverseid">@@example.com</code></li>
 | 
						||
			<li><code class="fediverseid">@@something.example</code></li>
 | 
						||
			<li><code class="fediverseid">@@mastodon.social</code></li>
 | 
						||
			<li><code class="fediverseid">@@greatape.social</code></li>
 | 
						||
			<li><code class="fediverseid">@@changelog.ca</code></li>
 | 
						||
		</ul>
 | 
						||
		<ul>
 | 
						||
			<li><code class="fediverseid">@🙂@example.com</code></li>
 | 
						||
			<li><code class="fediverseid">@hello world :-)@something.example</code></li>
 | 
						||
			<li><code class="fediverseid">@(╯°□°)╯︵ ┻━┻@mastodon.social</code></li>
 | 
						||
			<li><code class="fediverseid">@😈❤️@greatape.social</code></li>
 | 
						||
			<li><code class="fediverseid">@✪@changelog.ca</code></li>
 | 
						||
			<li><code class="fediverseid">@awesome 🙂@changelog.ca</code></li>
 | 
						||
		</ul>
 | 
						||
		<ul>
 | 
						||
			<li><code class="fediverseid">@.@example.com</code></li>
 | 
						||
			<li><code class="fediverseid">@joe.blow@example.com</code></li>
 | 
						||
			<li><code class="fediverseid">@jane.doe@something.example</code></li>
 | 
						||
			<li><code class="fediverseid">@.reiver@mastodon.social</code></li>
 | 
						||
			<li><code class="fediverseid">@reiver.@greatape.social</code></li>
 | 
						||
			<li><code class="fediverseid">@d.a.r.i.u.sh@changelog.ca</code></li>
 | 
						||
			<li><code class="fediverseid">@.m.a.l.e.k.e.h.@changelog.ca</code></li>
 | 
						||
		</ul>
 | 
						||
		<ul>
 | 
						||
			<li><code class="fediverseid">@joeblow+@example.com</code></li>
 | 
						||
			<li><code class="fediverseid">@janedoe+@something.example</code></li>
 | 
						||
			<li><code class="fediverseid">@reiver+@mastodon.social</code></li>
 | 
						||
			<li><code class="fediverseid">@reiver+@greatape.social</code></li>
 | 
						||
			<li><code class="fediverseid">@dariush+@changelog.ca</code></li>
 | 
						||
			<li><code class="fediverseid">@malekeh+@changelog.ca</code></li>
 | 
						||
		</ul>
 | 
						||
		<ul>
 | 
						||
			<li><code class="fediverseid">@joeblow+tech@example.com</code></li>
 | 
						||
			<li><code class="fediverseid">@janedoe+psychology@something.example</code></li>
 | 
						||
			<li><code class="fediverseid">@reiver+fediverse@mastodon.social</code></li>
 | 
						||
			<li><code class="fediverseid">@reiver+allyourbases@greatape.social</code></li>
 | 
						||
			<li><code class="fediverseid">@dariush+one@changelog.ca</code></li>
 | 
						||
			<li><code class="fediverseid">@malekeh+two@changelog.ca</code></li>
 | 
						||
		</ul>
 | 
						||
		<ul>
 | 
						||
			<li><code class="fediverseid">@joeblow/tech@example.com</code></li>
 | 
						||
			<li><code class="fediverseid">@janedoe/psychology@something.example</code></li>
 | 
						||
			<li><code class="fediverseid">@reiver/fediverse@mastodon.social</code></li>
 | 
						||
			<li><code class="fediverseid">@reiver/allyourbases@greatape.social</code></li>
 | 
						||
			<li><code class="fediverseid">@dariush/one@changelog.ca</code></li>
 | 
						||
			<li><code class="fediverseid">@malekeh/two@changelog.ca</code></li>
 | 
						||
		</ul>
 | 
						||
	</section>
 | 
						||
	<section>
 | 
						||
		<h2>acct URI</h2>
 | 
						||
		<p>
 | 
						||
			Part of the process of <strong>resolving</strong> a <strong>Fediverse ID</strong> transfomrs a <strong>Fediverse ID</strong> into an <ziba-link transform="lowercase">acct URI</ziba-link>.
 | 
						||
			(And then using that <ziba-link transform="lowercase">acct URI</ziba-link> version of the <strong>Fediverse ID</strong> makes a request to <ziba-link dir=".." transform="lowercase">WebFinger</ziba-link>.)
 | 
						||
		</p>
 | 
						||
		<p>
 | 
						||
			Here is an example of transforming a <strong>Fediverse ID</strong> into an <ziba-link transform="lowercase">acct URI</ziba-link>:
 | 
						||
		</p>
 | 
						||
<pre>
 | 
						||
 | 
						||
     at sign
 | 
						||
       ↓
 | 
						||
       @joeblow@example.com ← Fediverse ID
 | 
						||
 | 
						||
   acct:joeblow@example.com ← acct URI
 | 
						||
       ↑
 | 
						||
  no at sign
 | 
						||
 | 
						||
</pre>
 | 
						||
		<p>
 | 
						||
			A client would then make a request to:
 | 
						||
		</p>
 | 
						||
<pre>
 | 
						||
 | 
						||
https://example.com/.well-known/host-meta
 | 
						||
 | 
						||
</pre>
 | 
						||
		<p>
 | 
						||
			To discover what the (template) URL for <ziba-link dir=".." transform="lowercase">WebFinger</ziba-link> is.
 | 
						||
			And then, for example, if it is at:
 | 
						||
		</p>
 | 
						||
<pre>
 | 
						||
 | 
						||
https://example.com/.well-known/webfinger?resource={uri}
 | 
						||
 | 
						||
</pre>
 | 
						||
		<p>
 | 
						||
			Then make a request to:
 | 
						||
		</p>
 | 
						||
<pre>
 | 
						||
 | 
						||
https://example.com/.well-known/webfinger?resource=acct:joeblow@example.com
 | 
						||
 | 
						||
</pre>
 | 
						||
		<p>
 | 
						||
			This <ziba-link dir=".." transform="lowercase">WebFinger</ziba-link> implementation <em>could</em> accept whatever it wants.
 | 
						||
			It doesn't have to restrict itself to what is specified by the IETF RFC-7565 (The 'acct' URI Scheme) specification.
 | 
						||
			BUT —
 | 
						||
		</p>
 | 
						||
	</section>
 | 
						||
	<section>
 | 
						||
		<h2>Minimal Fediverse ID Syntax</h2>
 | 
						||
		<p>
 | 
						||
			Let us consider what a <em>minimal</em> <strong>Fediverse ID</strong> syntax would be if we constrained ourselves to what the IETF RFC-7565 (The 'acct' URI Scheme) specificaiton says.
 | 
						||
		</p>
 | 
						||
		<p>
 | 
						||
			Here is what we get:
 | 
						||
		</p>
 | 
						||
<pre>
 | 
						||
 | 
						||
fediverseID = "@" actor "@" host
 | 
						||
 | 
						||
</pre>
 | 
						||
		<p>
 | 
						||
			Where “actor” is defined as:
 | 
						||
		</p>
 | 
						||
<pre>
 | 
						||
 | 
						||
actor       = unreserved / sub-delims 0*( unreserved / pct-encoded / sub-delims )
 | 
						||
 | 
						||
unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
 | 
						||
 | 
						||
sub-delims  = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
 | 
						||
 | 
						||
pct-encoded = "%" HEXDIG HEXDIG
 | 
						||
 | 
						||
ALPHA       =  %x41-5A / %x61-7A   ; A-Z / a-z
 | 
						||
 | 
						||
DIGIT       =  %x30-39             ; 0-9
 | 
						||
 | 
						||
HEXDIG      =  DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
 | 
						||
 | 
						||
</pre>
 | 
						||
		<p>
 | 
						||
			(Again note that an implementation <em>could</em> support more characters for “actor” than what is given by this definition.)
 | 
						||
		</p>
 | 
						||
		<p>
 | 
						||
			And “host” is defined as
 | 
						||
		</p>
 | 
						||
<pre>
 | 
						||
 | 
						||
host        = IP-literal / IPv4address / reg-name
 | 
						||
 | 
						||
IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"
 | 
						||
 | 
						||
IPv6address =                            6( h16 ":" ) ls32
 | 
						||
            /                       "::" 5( h16 ":" ) ls32
 | 
						||
            / [               h16 ] "::" 4( h16 ":" ) ls32
 | 
						||
            / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
 | 
						||
            / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
 | 
						||
            / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
 | 
						||
            / [ *4( h16 ":" ) h16 ] "::"              ls32
 | 
						||
            / [ *5( h16 ":" ) h16 ] "::"              h16
 | 
						||
            / [ *6( h16 ":" ) h16 ] "::"
 | 
						||
 | 
						||
h16         = 1*4HEXDIG
 | 
						||
 | 
						||
ls32        = ( h16 ":" h16 ) / IPv4address
 | 
						||
 | 
						||
IPvFuture   = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
 | 
						||
 | 
						||
IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
 | 
						||
 | 
						||
dec-octet   = DIGIT                 ; 0-9
 | 
						||
            / %x31-39 DIGIT         ; 10-99
 | 
						||
            / "1" 2DIGIT            ; 100-199
 | 
						||
            / "2" %x30-34 DIGIT     ; 200-249
 | 
						||
            / "25" %x30-35          ; 250-255
 | 
						||
 | 
						||
reg-name    = *( unreserved / pct-encoded / sub-delims )
 | 
						||
 | 
						||
</pre>
 | 
						||
	</section>
 | 
						||
</article>
 |