diff --git a/fediverseid.html b/fediverseid.html index 00df28e..453258c 100644 --- a/fediverseid.html +++ b/fediverseid.html @@ -35,6 +35,7 @@ at sign ↓ @joeblow@example.com ← Fediverse ID + joeblow@example.com ← e-mail address ↑ no at sign @@ -42,4 +43,106 @@ +
+

Usage

+

+ Fediverse IDs appear in posts on the Fediverse, and are typed (something with the help of some form of autocomplete) by users. +

+
+
+

acct URI

+

+ Part of the process of resolving a Fediverse ID transfomrs a Fediverse ID into an acct URI. + (And then using that acct URI version of the Fediverse ID to make a request to WebFinger.) +

+

+ Here is an example: +

+
+
+     at sign
+       ↓
+       @joeblow@example.com ← Fediverse ID
+
+   acct:joeblow@example.com ← acct URI
+       ↑
+  no at sign
+
+
+
+
+

Fediverse ID Syntax

+

+ The final say for what is and is not a valid Fediverse IDs are the many implementations of WebFinger in-the-wild. + (Which could be different from each other.) +

+

+ But, having said that, what we can infer what an implementation that uses Fediverse IDs should probably support at minimum. + I.e., an implmentation consider more than just this as a valid Fediverse ID — but all these should work. +

+

+ Because Fediverse IDs are, from a technical point-of-view, closely tied to acct URI (because of WebFinger) it can affect what is a valid Fediverse ID. +

+

+ Inferring from IETF RFC-7565 (The 'acct' URI Scheme), the syntax of a Fediverse ID is: +

+
+fediverseID = "@" actor "@" host
+
+

+ Where “actor” is defined as: +

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

+ (Again note that an implementation could support more characters for “actor” than what is given by this definition.) +

+

+ And “host” is defined as +

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