├── robots.txt ├── .gitignore ├── errata ├── README.md └── index.php ├── github └── hook.php ├── implementation-reports ├── index.md ├── README.md ├── index.php ├── telegraph.md ├── falcon.md ├── franciscms.md ├── webmention.io.md ├── webmention.herokuapp.com.md ├── kaku.md ├── dobrado.md ├── known.md ├── processwire-webmention.md ├── gnusocial.md ├── postly.md ├── TEMPLATE.md ├── grav-plugin-webmention.md ├── bridgy.md └── summary │ └── index.html ├── README.md ├── implementations ├── index.php └── index.md ├── styles.css ├── index.php └── draft └── source └── index.html /robots.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /errata/README.md: -------------------------------------------------------------------------------- 1 | Webmention Errata 2 | ================= 3 | 4 | No errata have been reported. 5 | 6 | -------------------------------------------------------------------------------- /errata/index.php: -------------------------------------------------------------------------------- 1 | &1'); 4 | echo 'ok'; 5 | -------------------------------------------------------------------------------- /implementation-reports/index.md: -------------------------------------------------------------------------------- 1 | # Webmention Implementation Reports 2 | 3 | * [Summary](https://webmention.net/implementation-reports/summary/) 4 | * [Reports](https://github.com/w3c/webmention/tree/master/implementation-reports) 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Webmention 2 | 3 | This repo contains the latest editor's draft of the [Webmention specification](http://webmention.net/draft/). 4 | 5 | Implementation reports are collected in the [Implementation Reports](implementation-reports) folder. 6 | 7 | [Webmention issues](https://github.com/aaronpk/webmention/issues) 8 | -------------------------------------------------------------------------------- /implementation-reports/README.md: -------------------------------------------------------------------------------- 1 | # Implementation Reports 2 | 3 | This folder is where you can find implementation reports that have been submitted. 4 | 5 | To submit your own, start with [TEMPLATE.md](TEMPLATE.md) 6 | 7 | View the [summary of submitted implementation reports](https://webmention.net/implementation-reports/summary/) 8 | -------------------------------------------------------------------------------- /implementations/index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Webmention 5 | 6 | 11 | 12 | 13 | 14 |
15 | 22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /implementation-reports/index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Webmention Implementation Reports 5 | 6 | 11 | 12 | 13 | 14 |
15 | 22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #fefefe; 3 | font-family: "Helvetica Neue", Helvetica, sans-serif; 4 | font-size: 14pt; 5 | } 6 | .page { 7 | max-width: 500px; 8 | margin: 0 auto; 9 | } 10 | a { 11 | color: #78b35c; 12 | } 13 | a:hover { 14 | color: #93c57c; 15 | } 16 | h1 { 17 | text-align: center; 18 | } 19 | .subtitle { 20 | padding: 20px 30px; 21 | font-size: 16pt; 22 | background-color: #93c57c; 23 | border: 1px #78b35c solid; 24 | border-radius: 4px; 25 | } 26 | ul.links { 27 | margin: 0; 28 | margin-top: 20px; 29 | padding: 0; 30 | list-style-type: none; 31 | } 32 | ul.links li { 33 | margin: 0; 34 | padding: 0; 35 | padding-top: 16px; 36 | } 37 | ul.links .main { 38 | text-align: center; 39 | font-size: 18pt; 40 | padding-top: 26px; 41 | padding-bottom: 16px; 42 | } 43 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Webmention 5 | 6 | 7 | 8 | 9 |
10 | 11 |

Webmention

12 | 13 |
Webmention is a simple way to notify any URL when you link to it from your site.
14 | 15 | 22 | 23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /implementation-reports/telegraph.md: -------------------------------------------------------------------------------- 1 | # Telegraph 2 | 3 | Implementation Home Page URL: https://telegraph.p3k.io 4 | 5 | Source Code repo URL(s) (optional): https://github.com/aaronpk/Telegraph 6 | * [ ] 100% open source implementation 7 | 8 | Programming Language(s): PHP 9 | 10 | Developer(s): [Aaron Parecki](http://aaronparecki.com) 11 | 12 | Implementation Classes (Sender and/or Receiver): Sender 13 | 14 | 15 | ## Sending 16 | 17 | ### Discovery Tests (3.1.1) 18 | 19 | MUST 20 | 21 | * [x] [Discovery Test #1](https://webmention.rocks/test/1) 22 | * [x] [Discovery Test #2](https://webmention.rocks/test/2) 23 | * [x] [Discovery Test #3](https://webmention.rocks/test/3) 24 | * [x] [Discovery Test #4](https://webmention.rocks/test/4) 25 | * [x] [Discovery Test #5](https://webmention.rocks/test/5) 26 | * [x] [Discovery Test #6](https://webmention.rocks/test/6) 27 | * [x] [Discovery Test #7](https://webmention.rocks/test/7) 28 | * [x] [Discovery Test #8](https://webmention.rocks/test/8) 29 | * [x] [Discovery Test #9](https://webmention.rocks/test/9) 30 | * [x] [Discovery Test #10](https://webmention.rocks/test/10) 31 | * [x] [Discovery Test #11](https://webmention.rocks/test/11) 32 | * [x] [Discovery Test #12](https://webmention.rocks/test/12) 33 | * [x] [Discovery Test #13](https://webmention.rocks/test/13) 34 | * [x] [Discovery Test #14](https://webmention.rocks/test/14) 35 | * [x] [Discovery Test #15](https://webmention.rocks/test/15) 36 | * [x] [Discovery Test #16](https://webmention.rocks/test/16) 37 | * [x] [Discovery Test #17](https://webmention.rocks/test/17) 38 | * [x] [Discovery Test #18](https://webmention.rocks/test/18) 39 | * [x] [Discovery Test #19](https://webmention.rocks/test/19) 40 | * [x] [Discovery Test #20](https://webmention.rocks/test/20) 41 | * [x] [Discovery Test #21](https://webmention.rocks/test/21) 42 | 43 | 44 | ### Sending Tests (3.1.2) 45 | 46 | MUST 47 | 48 | * [x] Accepts HTTP 200 response as a success 49 | * [x] Accepts HTTP 201 response as a success 50 | * [x] Accepts HTTP 202 response as a success 51 | 52 | 53 | ### Update Tests (3.1.3) 54 | 55 | SHOULD 56 | 57 | * [x] [Update Test #1](https://webmention.rocks/update/1) 58 | * [ ] [Update Test #2](https://webmention.rocks/update/2) 59 | 60 | #### Implementation Notes 61 | 62 | Since Telegraph is an API, it depends on the calling website to update the post 63 | contents and trigger sending Webmentions when the post is updated. 64 | 65 | 66 | ### Delete Test (3.1.4) 67 | 68 | SHOULD 69 | 70 | * [ ] [Delete Test #1](https://webmention.rocks/delete/1) 71 | 72 | 73 | ### Security Considerations (4) 74 | 75 | * [ ] The sender avoids sending a Webmention to a loopback address (SHOULD) 76 | 77 | -------------------------------------------------------------------------------- /implementation-reports/falcon.md: -------------------------------------------------------------------------------- 1 | # Falcon 2 | 3 | Implementation Home Page URL: https://indieweb.org/Falcon 4 | 5 | Source Code repo URL(s) (optional): https://github.com/tantek/cassis https://github.com/indieweb/link-rel-parser-php/tree/master/src/IndieWeb 6 | * [ ] 100% open source implementation 7 | 8 | Programming Language(s): PHP 9 | 10 | Developer(s): [Tantek Çelik](http://tantek.com) 11 | 12 | Implementation Classes (Sender and/or Receiver): Sender 13 | 14 | 15 | ## Sending 16 | 17 | ### Discovery Tests (3.1.1) 18 | 19 | MUST 20 | 21 | * [x] [Discovery Test #1](https://webmention.rocks/test/1) 22 | * [x] [Discovery Test #2](https://webmention.rocks/test/2) 23 | * [x] [Discovery Test #3](https://webmention.rocks/test/3) 24 | * [x] [Discovery Test #4](https://webmention.rocks/test/4) 25 | * [x] [Discovery Test #5](https://webmention.rocks/test/5) 26 | * [x] [Discovery Test #6](https://webmention.rocks/test/6) 27 | * [x] [Discovery Test #7](https://webmention.rocks/test/7) 28 | * [x] [Discovery Test #8](https://webmention.rocks/test/8) 29 | * [x] [Discovery Test #9](https://webmention.rocks/test/9) 30 | * [x] [Discovery Test #10](https://webmention.rocks/test/10) 31 | * [x] [Discovery Test #11](https://webmention.rocks/test/11) 32 | * [x] [Discovery Test #12](https://webmention.rocks/test/12) 33 | * [x] [Discovery Test #13](https://webmention.rocks/test/13) 34 | * [x] [Discovery Test #14](https://webmention.rocks/test/14) 35 | * [x] [Discovery Test #15](https://webmention.rocks/test/15) 36 | * [x] [Discovery Test #16](https://webmention.rocks/test/16) 37 | * [x] [Discovery Test #17](https://webmention.rocks/test/17) 38 | * [x] [Discovery Test #18](https://webmention.rocks/test/18) 39 | * [x] [Discovery Test #19](https://webmention.rocks/test/19) 40 | * [x] [Discovery Test #20](https://webmention.rocks/test/20) 41 | * [x] [Discovery Test #21](https://webmention.rocks/test/21) 42 | 43 | #### Implementation Notes 44 | 45 | I wrote nearly all of the Webmention endpoint discovery code that Falcon uses as open source in the following two files: 46 | * https://github.com/indieweb/link-rel-parser-php/blob/master/src/IndieWeb/link_rel_parser.php — can be used for getting arbitrary link relationships from HTTP headers and HTML documents 47 | * https://github.com/indieweb/link-rel-parser-php/blob/master/src/IndieWeb/get_rel_webmention.php — uses the output of link_rel_parser.php functions to return a webmention endpoint and or a pingback endpoint if any 48 | 49 | 50 | ### Sending Tests (3.1.2) 51 | 52 | MUST 53 | 54 | * [x] Accepts HTTP 200 response as a success 55 | * [x] Accepts HTTP 201 response as a success 56 | * [x] Accepts HTTP 202 response as a success 57 | 58 | 59 | ### Update Tests (3.1.3) 60 | 61 | SHOULD 62 | 63 | * [ ] [Update Test #1](https://webmention.rocks/update/1) 64 | * [ ] [Update Test #2](https://webmention.rocks/update/2) 65 | 66 | #### Implementation Notes 67 | 68 | Update sending implementation in-progress. 69 | 70 | 71 | ### Delete Tests (3.1.4) 72 | 73 | SHOULD 74 | 75 | * [ ] [Delete Test #1](https://webmention.rocks/delete/1) 76 | 77 | #### Implementation Notes 78 | 79 | Delete sending implementation in-progress. 80 | 81 | 82 | ### Security Considerations (4) 83 | 84 | * [x] The sender avoids sending a Webmention to a loopback address (SHOULD) 85 | 86 | 87 | ### Extensions 88 | 89 | This implementation has also implemented the following extensions. 90 | 91 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 92 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 93 | * [ ] Other: _______ 94 | -------------------------------------------------------------------------------- /implementation-reports/franciscms.md: -------------------------------------------------------------------------------- 1 | # FrancisCMS 2 | 3 | Implementation Home Page URL: https://github.com/FrancisCMS/FrancisCMS 4 | 5 | Source Code repo URL(s) (optional): 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): Ruby 9 | 10 | Developer(s): [Jason Garber](https://sixtwothree.org/) 11 | 12 | Implementation Classes (Sender and/or Receiver): 13 | 14 | 15 | ## Receiving 16 | 17 | Indicate which type of response the receiver provides: 18 | 19 | * [ ] HTTP 200 - Receiver synchronously processes the Webmention request (not recommended) 20 | * [ ] HTTP 201 - Receiver creates a status URL the sender can use to check the status of the Webmention 21 | * [x] HTTP 202 - Receiver processes the Webmention asynchronously 22 | 23 | Describe the response body (if any) which is returned in the request: 24 | 25 | The response body contains the URL to the webmention in the form of https://example.com/webmentions/1. 26 | 27 | 28 | ### Request Verification (3.2.1) 29 | 30 | * [x] Verifies source and target are valid URLs, rejecting with HTTP 400 (MUST) 31 | * [x] Verifies that target is a valid resource for which the receiver accepts Webmentions, rejecting with HTTP 400 (SHOULD) 32 | * [x] Ignores fragment when checking if target is supported (SHOULD) 33 | 34 | ### Webmention Verification (3.2.2) 35 | 36 | * [x] Verification is processed asynchronously (SHOULD) 37 | * [x] Follows at least one HTTP redirect on source URL (MUST) 38 | * [x] Respects a self-imposed limit on number of HTTP redirects to follow (MUST) 39 | 40 | #### Source URL content-types supported 41 | 42 | Please list the content types that your implementation supports when checking if the source document links to the target URL. 43 | 44 | * [x] HTML 45 | * [ ] Other: ______ 46 | 47 | 48 | ### HTML Verification (3.2.3) 49 | 50 | The tests below apply when the source document is HTML. 51 | 52 | * [x] Accepts a Webmention where the target URL is in an `` tag 53 | * [ ] Accepts a Webmention where the target URL is in an `` tag 54 | * [ ] Accepts a Webmention where the target URL is in an `` tag inside an HTML comment 58 | * [x] Rejects a Webmention where the target URL is not in the document 59 | 60 | 61 | ### Webmention Display/Use 62 | 63 | * [x] The receiver displays data from the source URL on the target post (MAY) 64 | 65 | * [x] The receiver recognizes that the source URL is a "comment" or "reply" to the post 66 | * [x] using HTML markup: `class="u-in-reply-to"` 67 | * [x] The receiver recognizes that the source URL is a "like" of the post 68 | * [x] using HTML markup: `class="u-like-of"` 69 | * [x] The receiver recognizes that the source URL is a "repost" of the post 70 | * [x] using HTML markup: `class="u-repost-of"` 71 | * [ ] The receiver recognizes that the source URL is an "RSVP" to the post 72 | * [ ] using HTML markup: __________ 73 | * [ ] The receiver recognizes additional response types, using markup: 74 | * [ ] Response: __________ using HTML markup: __________ 75 | * (Please add lines like above for additional response types the receiver has implemented) 76 | 77 | Please describe any other ways the Webmention is displayed or used if applicable. 78 | 79 | Received webmentions that are not identifiable as replies, likes, or reposts are generically identified as references and displayed in the UI similarly to replies. 80 | 81 | 82 | ### Update Tests (3.2.4) 83 | 84 | * [ ] Does not display an update Webmention as a new response (SHOULD) 85 | * [ ] Removes the response when an update Webmention is sent and the source URL returns 200 and no link is found (SHOULD) 86 | * [ ] Updates and stores the information from the primary object at the source URL (MUST) 87 | * [ ] Updates and stores the information from children or descendant objects at the source URL (MAY) 88 | 89 | 90 | ### Delete Tests (3.2.4) 91 | 92 | * [ ] Recognizes an HTTP 410 response as a delete, and removes the response (SHOULD) 93 | 94 | 95 | ### Security Considerations (4) 96 | 97 | * [x] Webmentions are moderated before being displayed (MAY) 98 | * [ ] Webmentions are periodically re-verified (MAY) 99 | * [ ] The receiver ensures any displayed data it properly encoded/filtered to prevent XSS attacks (MUST) 100 | * [ ] Respects a self-imposed limit on the time spent fetching the source URL (SHOULD) 101 | * [ ] Respects a self-imposed limit on the number of bytes fetched from the source URL (SHOULD) 102 | * [x] The receiver accepts additional parameters or headers, and so has CSRF protection (SHOULD) 103 | 104 | 105 | ### Extensions 106 | 107 | This implementation has also implemented the following extensions. 108 | 109 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 110 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 111 | * [ ] Other: _______ 112 | 113 | -------------------------------------------------------------------------------- /implementation-reports/webmention.io.md: -------------------------------------------------------------------------------- 1 | # webmention.io 2 | 3 | Implementation Home Page URL: https://webmention.io 4 | 5 | Source Code repo URL(s) (optional): 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): Ruby 9 | 10 | Developer(s): [Aaron Parecki](https://aaronparecki.com) 11 | 12 | Implementation Classes (Sender and/or Receiver): Receiver 13 | 14 | ## Implementation Notes 15 | 16 | Webmention.io is a Webmention and Pingback receiver, but does not display webmentions itself. It makes webmentions available via an API, and can also send a web hook to the website using it. 17 | 18 | ## Receiving 19 | 20 | Indicate which type of response the receiver provides: 21 | 22 | * [ ] HTTP 200 - Receiver synchronously processes the Webmention request (not recommended) 23 | * [x] HTTP 201 - Receiver creates a status URL the sender can use to check the status of the Webmention 24 | * [ ] HTTP 202 - Receiver processes the Webmention asynchronously 25 | 26 | Describe the response body (if any) which is returned in the request: 27 | 28 | 29 | ### Request Verification (3.2.1) 30 | 31 | * [x] Verifies source and target are valid URLs, rejecting with HTTP 400 (MUST) 32 | * [ ] Verifies that target is a valid resource for which the receiver accepts Webmentions, rejecting with HTTP 400 (SHOULD) 33 | * the endpoint accepts webmentions for any URL 34 | * [ ] Ignores fragment when checking if target is supported (SHOULD) 35 | 36 | ### Webmention Verification (3.2.2) 37 | 38 | * [x] Verification is processed asynchronously (SHOULD) 39 | * [x] Follows at least one HTTP redirect on source URL (MUST) 40 | * [x] Respects a self-imposed limit on number of HTTP redirects to follow (MUST) 41 | 42 | #### Source URL content-types supported 43 | 44 | Please list the content types that your implementation supports when checking if the source document links to the target URL. 45 | 46 | * [x] HTML 47 | * [ ] Other: ______ 48 | 49 | 50 | ### HTML Verification (3.2.2) 51 | 52 | The tests below apply when the source document is HTML. 53 | 54 | * [x] Accepts a Webmention where the target URL is in an `` tag 55 | * [ ] Accepts a Webmention where the target URL is in an `` tag 56 | * [ ] Accepts a Webmention where the target URL is in an `` tag inside an HTML comment 60 | * [x] Rejects a Webmention where the target URL is not in the document 61 | 62 | 63 | ### Webmention Display/Use 64 | 65 | * [ ] The receiver displays data from the source URL on the target post (MAY) 66 | 67 | * [x] The receiver recognizes that the source URL is a "comment" or "reply" to the post 68 | * [x] using HTML markup: `class="u-in-reply-to"` 69 | * [x] The receiver recognizes that the source URL is a "like" of the post 70 | * [x] using HTML markup: `class="u-like-of"` 71 | * [x] The receiver recognizes that the source URL is a "repost" of the post 72 | * [x] using HTML markup: `class="u-repost-of"` 73 | * [x] The receiver recognizes that the source URL is an "RSVP" to the post 74 | * [x] using HTML markup: `class="p-rsvp"` 75 | * [ ] The receiver recognizes additional response types, using markup: 76 | * [ ] Response: __________ using HTML markup: __________ 77 | * (Please add lines like above for additional response types the receiver has implemented) 78 | 79 | Please describe any other ways the Webmention is displayed or used if applicable. 80 | 81 | The endpoint stores the content found at the source and makes it available through an API. 82 | 83 | 84 | ### Update Tests (3.2.4) 85 | 86 | * [x] Does not display an update Webmention as a new response (SHOULD) 87 | * [ ] Removes the response when an update Webmention is sent and the source URL returns 200 and no link is found (SHOULD) 88 | * [x] Updates and stores the information from the primary object at the source URL (MUST) 89 | * [ ] Updates and stores the information from children or descendant objects at the source URL (MAY) 90 | 91 | 92 | ### Delete Tests (3.2.4) 93 | 94 | * [ ] Recognizes an HTTP 410 response as a delete, and removes the response (SHOULD) 95 | 96 | 97 | ### Security Considerations (4) 98 | 99 | * [ ] Webmentions are moderated before being displayed (MAY) 100 | * [ ] Webmentions are periodically re-verified (MAY) 101 | * [x] The receiver ensures any displayed data it properly encoded/filtered to prevent XSS attacks (MUST) 102 | * [x] Respects a self-imposed limit on the time spent fetching the source URL (SHOULD) 103 | * [ ] Respects a self-imposed limit on the number of bytes fetched from the source URL (SHOULD) 104 | * [ ] The receiver accepts additional parameters or headers, and so has CSRF protection (SHOULD) 105 | 106 | 107 | ### Extensions 108 | 109 | This implementation has also implemented the following extensions. 110 | 111 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 112 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 113 | * [ ] Other: _______ 114 | 115 | -------------------------------------------------------------------------------- /implementation-reports/webmention.herokuapp.com.md: -------------------------------------------------------------------------------- 1 | This file is a sample implementation report. Fork this repository, copy this file to a new `.md` file and change the name to your project name (in lower case with hyphens between words), and fill out the information in the report based on your implementation. When you are finished, submit a pull request and your report will be reviewed and added to the main repository. 2 | 3 | Complete this report by filling out the checkboxes as appropriate. To mark one as successful/complete/true, add an `x` between the brackets, e.g. `[x]`. If the statement does not apply to your implementation, use `[na]` and add a sentence explaining why it does not apply. 4 | 5 | If your implementation is only a sender or only a receiver, remove the other section from the document before submitting. 6 | 7 | When you are complete, send a pull request with the addition of your report file. Please remove this entire top section before submitting. 8 | 9 | 10 | # webmention.herokuapp.com 11 | 12 | Implementation Home Page URL: http://webmention.herokuapp.com 13 | 14 | Source Code repo URL(s) (optional): https://github.com/voxpelli/webpage-webmentions 15 | * [x] 100% open source implementation 16 | 17 | Programming Language(s): node.js 18 | 19 | Developer(s): [Pelle Wessman](http://kodfabrik.se/) 20 | 21 | Implementation Classes (Sender and/or Receiver): 22 | 23 | ## Receiving 24 | 25 | Indicate which type of response the receiver provides: 26 | 27 | * [ ] HTTP 200 - Receiver synchronously processes the Webmention request (not recommended) 28 | * [ ] HTTP 201 - Receiver creates a status URL the sender can use to check the status of the Webmention 29 | * [x] HTTP 202 - Receiver processes the Webmention asynchronously 30 | 31 | Describe the response body (if any) which is returned in the request: 32 | 33 | 34 | ### Request Verification (3.2.1) 35 | 36 | * [ ] Verifies source and target are valid URLs, rejecting with HTTP 400 (MUST) 37 | * [na] Verifies that target is a valid resource for which the receiver accepts Webmentions, rejecting with HTTP 400 (SHOULD) 38 | * [ ] Ignores fragment when checking if target is supported (SHOULD) 39 | 40 | ### Webmention Verification (3.2.2) 41 | 42 | * [x] Verification is processed asynchronously (SHOULD) 43 | * [x] Follows at least one HTTP redirect on source URL (MUST) 44 | * [ ] Respects a self-imposed limit on number of HTTP redirects to follow (MUST) 45 | 46 | #### Source URL content-types supported 47 | 48 | Please list the content types that your implementation supports when checking if the source document links to the target URL. 49 | 50 | * [x] HTML 51 | * [ ] Other: ______ 52 | 53 | 54 | ### HTML Verification (3.2.2) 55 | 56 | The tests below apply when the source document is HTML. 57 | 58 | * [x] Accepts a Webmention where the target URL is in an `` tag 59 | * [ ] Accepts a Webmention where the target URL is in an `` tag 60 | * [ ] Accepts a Webmention where the target URL is in an `` tag inside an HTML comment 64 | * [ ] Rejects a Webmention where the target URL is not in the document 65 | 66 | 67 | ### Webmention Display/Use 68 | 69 | * [x] The receiver displays data from the source URL on the target post (MAY) 70 | 71 | * [x] The receiver recognizes that the source URL is a "comment" or "reply" to the post 72 | * [x] using HTML markup: __________ 73 | * [x] The receiver recognizes that the source URL is a "like" of the post 74 | * [x] using HTML markup: __________ 75 | * [x] The receiver recognizes that the source URL is a "repost" of the post 76 | * [x] using HTML markup: __________ 77 | * [ ] The receiver recognizes that the source URL is an "RSVP" to the post 78 | * [ ] using HTML markup: __________ 79 | * [ ] The receiver recognizes additional response types, using markup: 80 | * [ ] Response: __________ using HTML markup: __________ 81 | * (Please add lines like above for additional response types the receiver has implemented) 82 | 83 | Please describe any other ways the Webmention is displayed or used if applicable. 84 | 85 | 86 | ### Update Tests (3.2.4) 87 | 88 | * [x] Does not display an update Webmention as a new response (SHOULD) 89 | * [x] Removes the response when an update Webmention is sent and the source URL returns 200 and no link is found (SHOULD) 90 | * [x] Updates and stores the information from the primary object at the source URL (MUST) 91 | * [ ] Updates and stores the information from children or descendant objects at the source URL (MAY) 92 | 93 | 94 | ### Delete Tests (3.2.4) 95 | 96 | * [ ] Recognizes an HTTP 410 response as a delete, and removes the response (SHOULD) 97 | 98 | 99 | ### Security Considerations (4) 100 | 101 | * [ ] Webmentions are moderated before being displayed (MAY) 102 | * [ ] Webmentions are periodically re-verified (MAY) 103 | * [x] The receiver ensures any displayed data it properly encoded/filtered to prevent XSS attacks (MUST) 104 | * [ ] Respects a self-imposed limit on the time spent fetching the source URL (SHOULD) 105 | * [ ] Respects a self-imposed limit on the number of bytes fetched from the source URL (SHOULD) 106 | * [ ] The receiver accepts additional parameters or headers, and so has CSRF protection (SHOULD) 107 | 108 | 109 | ### Extensions 110 | 111 | This implementation has also implemented the following extensions. 112 | 113 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 114 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 115 | * [ ] Other: _______ 116 | 117 | -------------------------------------------------------------------------------- /implementations/index.md: -------------------------------------------------------------------------------- 1 | # Webmention Implementations 2 | 3 | * [Implementation Report Summary](https://webmention.net/implementation-reports/summary/) 4 | * [Implementation Reports](https://webmention.net/implementation-reports/) 5 | 6 | ## Libraries 7 | 8 | ### Sending 9 | 10 | * [indieweb/mention-client-php](https://github.com/indieweb/mention-client-php) - *PHP* library for sending webmention and pingpack notifications 11 | * [indieweb/mention-client-ruby](https://github.com/indieweb/mention-client-ruby) - *Ruby* library for sending webmention notifications 12 | * [phpish/webmention](https://github.com/phpish/webmention) - Simple Webmention client (non-OO) in *PHP* packaged as a composer package 13 | * [vrypan/webmention-tools](https://github.com/vrypan/webmention-tools) - *Python* client library and command line webmention sender 14 | * [pear2/Services_Linkback](https://github.com/pear2/Services_Linkback) - *PHP* Pingback and Webmention client + server library 15 | * [bear/ronkyuu](https://github.com/bear/ronkyuu) - *Python* client library and command-line tools 16 | * [glennjones/webmentions](https://github.com/glennjones/webmentions) - *Node.js* a helper library for endpoint discovery, pulling validating Webmentions and sending Webmention requests 17 | * [willnorris.com/go/webmention](https://willnorris.com/go/webmention) - *Go* client library and command-line tool for discovering and sending Webmentions. 18 | * [webmentions-elixir](https://github.com/ckruse/webmentions-elixir) - *Elixir* client library for sending Webmentions 19 | 20 | ### Endpoint Discovery 21 | * [link_rel_parser](https://github.com/indieweb/link-rel-parser-php/blob/master/src/IndieWeb/link_rel_parser.php) - *PHP* `http_rels($h)` & `head_http_rels($url)` - HTTP header string parser for RFC5988 Link: rels (including `X-Pingback`) & function to curl a HEAD request and parse it all in one. 22 | * [phpish/link_header](https://github.com/phpish/link_header) - *PHP* Link header (RFC 5988) parser 23 | * [PEAR: HTTP2](http://pear.php.net/package/HTTP2) - *PHP* Link header (RFC 5988) parser ([documentation](http://pear.php.net/manual/en/package.http.http2.parselinks.php)) 24 | * [ronkyuu](http://indiewebcamp.com/ronkyuu) - *Python* client library and command-line tools 25 | 26 | ### Receiving 27 | * PHP Minimum Viable Webmention handler: [https://gist.github.com/adactio/6484118](https://gist.github.com/adactio/6484118) 28 | * [pear2/Services_Linkback](https://github.com/pear2/Services_Linkback) - *PHP* Pingback and Webmention client + server library 29 | 30 | ### Parsing 31 | * [microformats2 implementations and parsers](http://microformats.org/wiki/microformats2#Implementations) 32 | * [went](https://github.com/fiatjaf/went) - Webmention Endpoint Tools, a *Python* library that takes `source` and `target` URLs and does the rest of the job for you. 33 | 34 | ## Publishing Software 35 | 36 | Some open source publishing software supports Webmention. 37 | 38 | * [Known](http://withknown.com) personal publishing software sends webmentions and accepts webmention comments (including webmention updates), and likes 39 | * [FrancisCMS](https://github.com/FrancisCMS) personal publishing software similarly sends and receives 40 | * [WWWTech](https://indiewebcamp.com/WWWTech) personal publishing software similarly sends and receives 41 | * [phorkie](https://sourceforge.net/projects/phorkie/) sends and accepts webmentions to notify remote instances about forks 42 | 43 | Some additional publishing software, portions of which are open source, supports webmentions: 44 | 45 | * [p3k](https://p3k.io) sends and receives webmentions for all posts 46 | * [Taproot](https://indiewebcamp.com/Taproot) 47 | 48 | ### Plugins 49 | 50 | Plugins exist for some open source publishing software 51 | * [Wordpress](https://wordpress.org/plugins/webmention/) 52 | * [Drupal](https://www.drupal.org/project/vinculum) 53 | * [Elgg](https://github.com/mapkyca/elgg-webmention) 54 | * [Nucleus CMS](https://github.com/gRegorLove/nucleus-plugin-webmention) 55 | * [Craft CMS](https://github.com/jgarber623/craft-webmention-client) 56 | * [Kirby](https://github.com/bastianallgeier/kirby-webmentions) 57 | * [ProcessWire](http://modules.processwire.com/modules/webmention/) 58 | 59 | ## Tools 60 | 61 | * [Webmention Rocks!](https://webmention.rocks/) is a Webmention validator which helps you debug your webmention sending. It will provide detailed error messages to help you successfully send a Webmention, and will show your comment on the website when it's successfully processed. 62 | * [node-webmention-testpinger](https://github.com/voxpelli/node-webmention-testpinger) is a tool to ping your site with a variety of Webmention markup. Contains copies of a couple of real world examples of mentions that it enables you to ping locally to a development copy of your site. 63 | * [node-webmention-testendpoint](https://github.com/pfefferle/node-webmention-testendpoint) is tool to test your Webmention client. Generates a demo-post and a demo-endpoint to test if your client parses the webmention-endpoint correctly and to check if the ping body is transmitted correctly. 64 | * [stapibas](http://indiewebcamp.com/stapibas) is a self-hosted service to send and receive Webmentions for websites and blogs. It can be used to send out Webmentions and Pingbacks for new posts on static sites. 65 | * A [Firefox Add-On](https://addons.mozilla.org/fr/firefox/addon/webmention/) which allows you to send Webmentions via a context menu 66 | 67 | ## Services 68 | 69 | * [brid.gy](http://brid.gy/) is a service that sends Webmentions for comments/replies, likes, and reposts on Facebook, Twitter, Google+, and Instagram posts. It uses [original post discovery](http://indiewebcamp.com/original_post_discovery) to find target links for the Webmentions. [GitHub repo here.](https://github.com/snarfed/bridgy) 70 | * [Checkmention](https://checkmention.appspot.com/) lets you test your Webmention implementation on your indieweb site, and whether it robustly detects certain types of XSS attacks. It also allows you to test for [authorship spoofing](http://indiewebcamp.com/authorship#Spoofing). 71 | * [mention-tech](http://mention-tech.appspot.com/) is a service that can receive Webmentions on behalf of anyone via both Webmention directly, and a web form on its home page. 72 | * [webmention.herokuapp.com](https://webmention.herokuapp.com/) receives Webmentions for any registered page and allows them to be embedded through javascript. 73 | * [webmention.io](https://webmention.io) is an open-source project and hosted service for receiving Webmentions and Pingbacks on behalf of your IndieWeb site. 74 | * [Telegraph](https://telegraph.p3k.io) is an open-source project and hosted service for sending Webmentions and Pingbacks. 75 | -------------------------------------------------------------------------------- /implementation-reports/kaku.md: -------------------------------------------------------------------------------- 1 | # Kaku 2 | 3 | Implementation Home Page URL: https://github.com/bear/kaku 4 | 5 | Source Code repo URL(s) (optional): 6 | * [X] 100% open source implementation 7 | 8 | Programming Language(s): Python 9 | 10 | Developer(s): [Bear](https://bear.im) 11 | 12 | Implementation Classes (Sender and/or Receiver): 13 | 14 | ## Sending 15 | 16 | ### Discovery Tests (3.1.1) 17 | 18 | MUST 19 | 20 | * [X] [Discovery Test #1](https://webmention.rocks/test/1) 21 | * [X] [Discovery Test #2](https://webmention.rocks/test/2) 22 | * [X] [Discovery Test #3](https://webmention.rocks/test/3) 23 | * [X] [Discovery Test #4](https://webmention.rocks/test/4) 24 | * [X] [Discovery Test #5](https://webmention.rocks/test/5) 25 | * [X] [Discovery Test #6](https://webmention.rocks/test/6) 26 | * [X] [Discovery Test #7](https://webmention.rocks/test/7) 27 | * [X] [Discovery Test #8](https://webmention.rocks/test/8) 28 | * [X] [Discovery Test #9](https://webmention.rocks/test/9) 29 | * [X] [Discovery Test #10](https://webmention.rocks/test/10) 30 | * [X] [Discovery Test #11](https://webmention.rocks/test/11) 31 | * [X] [Discovery Test #12](https://webmention.rocks/test/12) 32 | * [X] [Discovery Test #13](https://webmention.rocks/test/13) 33 | * [X] [Discovery Test #14](https://webmention.rocks/test/14) 34 | * [X] [Discovery Test #15](https://webmention.rocks/test/15) 35 | * [X] [Discovery Test #16](https://webmention.rocks/test/16) 36 | * [X] [Discovery Test #17](https://webmention.rocks/test/17) 37 | * [X] [Discovery Test #18](https://webmention.rocks/test/18) 38 | * [X] [Discovery Test #19](https://webmention.rocks/test/19) 39 | * [X] [Discovery Test #20](https://webmention.rocks/test/20) 40 | * [X] [Discovery Test #21](https://webmention.rocks/test/21) 41 | 42 | ### Sending Tests (3.1.2) 43 | 44 | MUST 45 | 46 | * [X] Accepts HTTP 200 response as a success 47 | * [X] Accepts HTTP 201 response as a success 48 | * [X] Accepts HTTP 202 response as a success 49 | 50 | ### Update Tests (3.1.3) 51 | 52 | SHOULD 53 | 54 | * [X] [Update Test #1](https://webmention.rocks/update/1) 55 | * [X] [Update Test #2](https://webmention.rocks/update/2) 56 | 57 | ### Delete Tests (3.1.4) 58 | 59 | SHOULD 60 | 61 | * [X] [Delete Test #1](https://webmention.rocks/delete/1) 62 | 63 | ### Security Considerations (4) 64 | 65 | * [X] The sender avoids sending a Webmention to a loopback address (SHOULD) 66 | 67 | ### Extensions 68 | 69 | This implementation has also implemented the following extensions. 70 | 71 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 72 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 73 | * [ ] Other: _______ 74 | 75 | ## Receiving 76 | 77 | Indicate which type of response the receiver provides: 78 | 79 | * [ ] HTTP 200 - Receiver synchronously processes the Webmention request (not recommended) 80 | * [ ] HTTP 201 - Receiver creates a status URL the sender can use to check the status of the Webmention 81 | * [X] HTTP 202 - Receiver processes the Webmention asynchronously 82 | 83 | Describe the response body (if any) which is returned in the request: 84 | 85 | 86 | ### Request Verification (3.2.1) 87 | 88 | * [X] Verifies source and target are valid URLs, rejecting with HTTP 400 (MUST) 89 | * [X] Verifies that target is a valid resource for which the receiver accepts Webmentions, rejecting with HTTP 400 (SHOULD) 90 | * [X] Ignores fragment when checking if target is supported (SHOULD) 91 | 92 | ### Webmention Verification (3.2.2) 93 | 94 | * [X] Verification is processed asynchronously (SHOULD) 95 | * [X] Follows at least one HTTP redirect on source URL (MUST) 96 | * [X] Respects a self-imposed limit on number of HTTP redirects to follow (MUST) 97 | 98 | #### Source URL content-types supported 99 | 100 | Please list the content types that your implementation supports when checking if the source document links to the target URL. 101 | 102 | * [X] HTML 103 | * [X] Other: It verifies that the resource is fetchable and does not care about content type 104 | 105 | ### HTML Verification (3.2.2) 106 | 107 | The tests below apply when the source document is HTML. 108 | 109 | * [X] Accepts a Webmention where the target URL is in an `` tag 110 | * [X] Accepts a Webmention where the target URL is in an `` tag 111 | * [X] Accepts a Webmention where the target URL is in an `` tag inside an HTML comment 115 | * [X] Rejects a Webmention where the target URL is not in the document 116 | 117 | ### Webmention Display/Use 118 | 119 | * [X] The receiver displays data from the source URL on the target post (MAY) 120 | 121 | * [ ] The receiver recognizes that the source URL is a "comment" or "reply" to the post 122 | * [ ] using HTML markup: __________ 123 | * [ ] The receiver recognizes that the source URL is a "like" of the post 124 | * [ ] using HTML markup: __________ 125 | * [ ] The receiver recognizes that the source URL is a "repost" of the post 126 | * [ ] using HTML markup: __________ 127 | * [ ] The receiver recognizes that the source URL is an "RSVP" to the post 128 | * [ ] using HTML markup: __________ 129 | * [ ] The receiver recognizes additional response types, using markup: 130 | * [ ] Response: __________ using HTML markup: __________ 131 | * (Please add lines like above for additional response types the receiver has implemented) 132 | 133 | Please describe any other ways the Webmention is displayed or used if applicable. 134 | 135 | 136 | ### Update Tests (3.2.4) 137 | 138 | * [X] Does not display an update Webmention as a new response (SHOULD) 139 | * [X] Removes the response when an update Webmention is sent and the source URL returns 200 and no link is found (SHOULD) 140 | * [X] Updates and stores the information from the primary object at the source URL (MUST) 141 | * [ ] Updates and stores the information from children or descendant objects at the source URL (MAY) 142 | 143 | 144 | ### Delete Tests (3.2.4) 145 | 146 | * [X] Recognizes an HTTP 410 response as a delete, and removes the response (SHOULD) 147 | 148 | 149 | ### Security Considerations (4) 150 | 151 | * [ ] Webmentions are moderated before being displayed (MAY) 152 | * [ ] Webmentions are periodically re-verified (MAY) 153 | * [X] The receiver ensures any displayed data it properly encoded/filtered to prevent XSS attacks (MUST) 154 | * [X] Respects a self-imposed limit on the time spent fetching the source URL (SHOULD) 155 | * [ ] Respects a self-imposed limit on the number of bytes fetched from the source URL (SHOULD) 156 | * [X] The receiver accepts additional parameters or headers, and so has CSRF protection (SHOULD) 157 | 158 | 159 | ### Extensions 160 | 161 | This implementation has also implemented the following extensions. 162 | 163 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 164 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 165 | * [ ] Other: _______ 166 | -------------------------------------------------------------------------------- /implementation-reports/dobrado.md: -------------------------------------------------------------------------------- 1 | # Dobrado 2 | 3 | Implementation Home Page URL: dobrado.net 4 | 5 | Source Code repo URL : gitlab.com/dobrado 6 | * [x] 100% open source implementation 7 | 8 | Programming Languages: php, javascript 9 | 10 | Developer: [Malcolm Blaney](https://unicyclic.com/mal) 11 | 12 | Implementation Classes: Sender and Receiver 13 | 14 | 15 | ## Sending 16 | 17 | ### Discovery Tests (3.1.1) 18 | 19 | MUST 20 | 21 | * [x] [Discovery Test #1](https://webmention.rocks/test/1) 22 | * [x] [Discovery Test #2](https://webmention.rocks/test/2) 23 | * [x] [Discovery Test #3](https://webmention.rocks/test/3) 24 | * [x] [Discovery Test #4](https://webmention.rocks/test/4) 25 | * [x] [Discovery Test #5](https://webmention.rocks/test/5) 26 | * [x] [Discovery Test #6](https://webmention.rocks/test/6) 27 | * [x] [Discovery Test #7](https://webmention.rocks/test/7) 28 | * [x] [Discovery Test #8](https://webmention.rocks/test/8) 29 | * [x] [Discovery Test #9](https://webmention.rocks/test/9) 30 | * [x] [Discovery Test #10](https://webmention.rocks/test/10) 31 | * [x] [Discovery Test #11](https://webmention.rocks/test/11) 32 | * [x] [Discovery Test #12](https://webmention.rocks/test/12) 33 | * [x] [Discovery Test #13](https://webmention.rocks/test/13) 34 | * [x] [Discovery Test #14](https://webmention.rocks/test/14) 35 | * [x] [Discovery Test #15](https://webmention.rocks/test/15) 36 | * [x] [Discovery Test #16](https://webmention.rocks/test/16) 37 | * [x] [Discovery Test #17](https://webmention.rocks/test/17) 38 | * [x] [Discovery Test #18](https://webmention.rocks/test/18) 39 | * [x] [Discovery Test #19](https://webmention.rocks/test/19) 40 | * [x] [Discovery Test #20](https://webmention.rocks/test/20) 41 | * [x] [Discovery Test #21](https://webmention.rocks/test/21) 42 | 43 | 44 | ### Sending Tests (3.1.2) 45 | 46 | MUST 47 | 48 | * [x] Accepts HTTP 200 response as a success 49 | * [x] Accepts HTTP 201 response as a success 50 | * [x] Accepts HTTP 202 response as a success 51 | 52 | 53 | ### Update Tests (3.1.3) 54 | 55 | SHOULD 56 | 57 | * [x] [Update Test #1](https://webmention.rocks/update/1) 58 | * [x] [Update Test #2](https://webmention.rocks/update/2) 59 | 60 | 61 | ### Delete Tests (3.1.4) 62 | 63 | SHOULD 64 | 65 | * [x] [Delete Test #1](https://webmention.rocks/delete/1) 66 | 67 | ### Security Considerations (4) 68 | 69 | * [x] The sender avoids sending a Webmention to a loopback address (SHOULD) 70 | 71 | 72 | ### Extensions 73 | 74 | This implementation has also implemented the following extensions. 75 | 76 | * [x] [Salmention](http://indiewebcamp.com/Salmention) 77 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 78 | * [ ] Other: _______ 79 | 80 | 81 | ## Receiving 82 | 83 | Indicate which type of response the receiver provides: 84 | 85 | * [x] HTTP 200 - Receiver synchronously processes the Webmention request (not recommended) 86 | * [ ] HTTP 201 - Receiver creates a status URL the sender can use to check the status of the Webmention 87 | * [x] HTTP 202 - Receiver processes the Webmention asynchronously 88 | 89 | Describe the response body (if any) which is returned in the request: 90 | 91 | 92 | ### Request Verification (3.2.1) 93 | 94 | * [x] Verifies source and target are valid URLs, rejecting with HTTP 400 (MUST) 95 | * [x] Verifies that target is a valid resource for which the receiver accepts Webmentions, rejecting with HTTP 400 (SHOULD) 96 | * [x] Ignores fragment when checking if target is supported (SHOULD) 97 | 98 | ### Webmention Verification (3.2.2) 99 | 100 | * [x] Verification is processed asynchronously (SHOULD) 101 | * [x] Follows at least one HTTP redirect on source URL (MUST) 102 | * [x] Respects a self-imposed limit on number of HTTP redirects to follow (MUST) 103 | 104 | #### Source URL content-types supported 105 | 106 | Please list the content types that your implementation supports when checking if the source document links to the target URL. 107 | 108 | * [x] HTML 109 | * [ ] Other: ______ 110 | 111 | 112 | ### HTML Verification (3.2.2) 113 | 114 | The tests below apply when the source document is HTML. 115 | 116 | * [x] Accepts a Webmention where the target URL is in an `` tag 117 | * [ ] Accepts a Webmention where the target URL is in an `` tag 118 | * [ ] Accepts a Webmention where the target URL is in an `` tag inside an HTML comment 122 | * [x] Rejects a Webmention where the target URL is not in the document 123 | 124 | 125 | ### Webmention Display/Use 126 | 127 | * [x] The receiver displays data from the source URL on the target post (MAY) 128 | 129 | * [x] The receiver recognizes that the source URL is a "comment" or "reply" to the post 130 | * [x] using HTML markup: class="u-in-reply-to" 131 | * [x] The receiver recognizes that the source URL is a "like" of the post 132 | * [x] using HTML markup: class="u-like-of" 133 | * [x] The receiver recognizes that the source URL is a "repost" of the post 134 | * [x] using HTML markup: class="u-repost-of" 135 | * [ ] The receiver recognizes that the source URL is an "RSVP" to the post 136 | * [ ] using HTML markup: __________ 137 | * [ ] The receiver recognizes additional response types, using markup: 138 | * [ ] Response: __________ using HTML markup: __________ 139 | * (Please add lines like above for additional response types the receiver has implemented) 140 | 141 | Please describe any other ways the Webmention is displayed or used if applicable. 142 | 143 | 144 | ### Update Tests (3.2.4) 145 | 146 | * [x] Does not display an update Webmention as a new response (SHOULD) 147 | * [x] Removes the response when an update Webmention is sent and the source URL returns 200 and no link is found (SHOULD) 148 | * [x] Updates and stores the information from the primary object at the source URL (MUST) 149 | * [x] Updates and stores the information from children or descendant objects at the source URL (MAY) 150 | 151 | 152 | ### Delete Tests (3.2.4) 153 | 154 | * [x] Recognizes an HTTP 410 response as a delete, and removes the response (SHOULD) 155 | 156 | 157 | ### Security Considerations (4) 158 | 159 | * [ ] Webmentions are moderated before being displayed (MAY) 160 | * [ ] Webmentions are periodically re-verified (MAY) 161 | * [x] The receiver ensures any displayed data it properly encoded/filtered to prevent XSS attacks (MUST) 162 | * [x] Respects a self-imposed limit on the time spent fetching the source URL (SHOULD) 163 | * [ ] Respects a self-imposed limit on the number of bytes fetched from the source URL (SHOULD) 164 | * [ ] The receiver accepts additional parameters or headers, and so has CSRF protection (SHOULD) 165 | 166 | 167 | ### Extensions 168 | 169 | This implementation has also implemented the following extensions. 170 | 171 | * [x] [Salmention](http://indiewebcamp.com/Salmention) 172 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 173 | * [ ] Other: _______ 174 | 175 | -------------------------------------------------------------------------------- /implementation-reports/known.md: -------------------------------------------------------------------------------- 1 | # Known 2 | 3 | Implementation Home Page URL: https://withknown.com 4 | 5 | Source Code repo URL(s) (optional): 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): PHP 9 | 10 | Developer(s): [Ben Werdmuller](http://werd.io), [Erin Jo Richey](http://erinjorichey.com), [Marcus Povey](http://marcus-povey.co.uk) 11 | 12 | Implementation Classes (Sender and/or Receiver): Both 13 | 14 | 15 | ## Sending 16 | 17 | ### Discovery Tests (3.1.1) 18 | 19 | MUST 20 | 21 | * [ ] [Discovery Test #1](https://webmention.rocks/test/1) 22 | * [x] [Discovery Test #2](https://webmention.rocks/test/2) 23 | * [x] [Discovery Test #3](https://webmention.rocks/test/3) 24 | * [x] [Discovery Test #4](https://webmention.rocks/test/4) 25 | * [x] [Discovery Test #5](https://webmention.rocks/test/5) 26 | * [x] [Discovery Test #6](https://webmention.rocks/test/6) 27 | * [x] [Discovery Test #7](https://webmention.rocks/test/7) 28 | * [x] [Discovery Test #8](https://webmention.rocks/test/8) 29 | * [x] [Discovery Test #9](https://webmention.rocks/test/9) 30 | * [x] [Discovery Test #10](https://webmention.rocks/test/10) 31 | * [x] [Discovery Test #11](https://webmention.rocks/test/11) 32 | * [x] [Discovery Test #12](https://webmention.rocks/test/12) 33 | * [x] [Discovery Test #13](https://webmention.rocks/test/13) 34 | * [x] [Discovery Test #14](https://webmention.rocks/test/14) 35 | * [x] [Discovery Test #15](https://webmention.rocks/test/15) 36 | * [x] [Discovery Test #16](https://webmention.rocks/test/16) 37 | * [x] [Discovery Test #17](https://webmention.rocks/test/17) 38 | * [x] [Discovery Test #18](https://webmention.rocks/test/18) 39 | * [x] [Discovery Test #19](https://webmention.rocks/test/19) 40 | * [x] [Discovery Test #20](https://webmention.rocks/test/20) 41 | * [x] [Discovery Test #21](https://webmention.rocks/test/21) 42 | 43 | #### Implementation Notes 44 | 45 | Test #1 is currently being affected by a regression. This report will be updated once this has ben corrected. 46 | 47 | 48 | ### Sending Tests (3.1.2) 49 | 50 | MUST 51 | 52 | * [x] Accepts HTTP 200 response as a success 53 | * [x] Accepts HTTP 201 response as a success 54 | * [x] Accepts HTTP 202 response as a success 55 | 56 | 57 | ### Update Tests (3.1.3) 58 | 59 | SHOULD 60 | 61 | * [x] [Update Test #1](https://webmention.rocks/update/1) 62 | * [x] [Update Test #2](https://webmention.rocks/update/2) 63 | 64 | #### Implementation Notes 65 | 66 | (Add implementation notes here, or remove this section) 67 | 68 | 69 | ### Delete Tests (3.1.4) 70 | 71 | SHOULD 72 | 73 | * [x] [Delete Test #1](https://webmention.rocks/delete/1) 74 | 75 | 76 | ### Security Considerations (4) 77 | 78 | * [x] The sender avoids sending a Webmention to a loopback address (SHOULD) 79 | 80 | 81 | ### Extensions 82 | 83 | This implementation has also implemented the following extensions. 84 | 85 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 86 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 87 | * [ ] Other: _______ 88 | 89 | 90 | ## Receiving 91 | 92 | Indicate which type of response the receiver provides: 93 | 94 | * [x] HTTP 200 - Receiver synchronously processes the Webmention request (not recommended) 95 | * [ ] HTTP 201 - Receiver creates a status URL the sender can use to check the status of the Webmention 96 | * [ ] HTTP 202 - Receiver processes the Webmention asynchronously 97 | 98 | Describe the response body (if any) which is returned in the request: 99 | 100 | 101 | ### Request Verification (3.2.1) 102 | 103 | * [x] Verifies source and target are valid URLs, rejecting with HTTP 400 (MUST) 104 | * [ ] Verifies that target is a valid resource for which the receiver accepts Webmentions, rejecting with HTTP 400 (SHOULD) 105 | * [x] Ignores fragment when checking if target is supported (SHOULD) 106 | 107 | ### Webmention Verification (3.2.2) 108 | 109 | * [ ] Verification is processed asynchronously (SHOULD) 110 | * [x] Follows at least one HTTP redirect on source URL (MUST) 111 | * [x] Respects a self-imposed limit on number of HTTP redirects to follow (MUST) 112 | 113 | #### Source URL content-types supported 114 | 115 | Please list the content types that your implementation supports when checking if the source document links to the target URL. 116 | 117 | * [x] HTML 118 | * [ ] Other: ______ 119 | 120 | 121 | ### HTML Verification (3.2.2) 122 | 123 | The tests below apply when the source document is HTML. 124 | 125 | * [x] Accepts a Webmention where the target URL is in an `` tag 126 | * [x] Accepts a Webmention where the target URL is in an `` tag 127 | * [x] Accepts a Webmention where the target URL is in an `` tag inside an HTML comment 131 | * [x] Rejects a Webmention where the target URL is not in the document 132 | 133 | 134 | ### Webmention Display/Use 135 | 136 | * [x] The receiver displays data from the source URL on the target post (MAY) 137 | 138 | * [x] The receiver recognizes that the source URL is a "comment" or "reply" to the post 139 | * [ ] using HTML markup: __________ 140 | * [x] The receiver recognizes that the source URL is a "like" of the post 141 | * [ ] using HTML markup: __________ 142 | * [x] The receiver recognizes that the source URL is a "repost" of the post 143 | * [ ] using HTML markup: __________ 144 | * [x] The receiver recognizes that the source URL is an "RSVP" to the post 145 | * [ ] using HTML markup: __________ 146 | * [ ] The receiver recognizes additional response types, using markup: 147 | * [ ] Response: __________ using HTML markup: __________ 148 | * (Please add lines like above for additional response types the receiver has implemented) 149 | 150 | Please describe any other ways the Webmention is displayed or used if applicable. 151 | 152 | 153 | ### Update Tests (3.2.4) 154 | 155 | * [x] Does not display an update Webmention as a new response (SHOULD) 156 | * [ ] Removes the response when an update Webmention is sent and the source URL returns 200 and no link is found (SHOULD) 157 | * [x] Updates and stores the information from the primary object at the source URL (MUST) 158 | * [ ] Updates and stores the information from children or descendant objects at the source URL (MAY) 159 | 160 | 161 | ### Delete Tests (3.2.4) 162 | 163 | * [x] Recognizes an HTTP 410 response as a delete, and removes the response (SHOULD) 164 | 165 | 166 | ### Security Considerations (4) 167 | 168 | * [ ] Webmentions are moderated before being displayed (MAY) 169 | * [ ] Webmentions are periodically re-verified (MAY) 170 | * [x] The receiver ensures any displayed data it properly encoded/filtered to prevent XSS attacks (MUST) 171 | * [x] Respects a self-imposed limit on the time spent fetching the source URL (SHOULD) 172 | * [x] Respects a self-imposed limit on the number of bytes fetched from the source URL (SHOULD) 173 | * [x] The receiver accepts additional parameters or headers, and so has CSRF protection (SHOULD) 174 | 175 | 176 | ### Extensions 177 | 178 | This implementation has also implemented the following extensions. 179 | 180 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 181 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 182 | * [ ] Other: _______ 183 | -------------------------------------------------------------------------------- /implementation-reports/processwire-webmention.md: -------------------------------------------------------------------------------- 1 | # ProcessWire Webmention 2 | 3 | Implementation Home Page URL: https://github.com/gRegorLove/ProcessWire-Webmention 4 | 5 | Source Code repo URL(s) (optional): https://github.com/gRegorLove/ProcessWire-Webmention 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): PHP 9 | 10 | Developer(s): [gRegor Morrill](http://gregorlove.com) 11 | 12 | Implementation Classes (Sender and/or Receiver): Sender and Receiver 13 | 14 | 15 | ## Sending 16 | 17 | ### Discovery Tests (3.1.1) 18 | 19 | MUST 20 | 21 | * [x] [Discovery Test #1](https://webmention.rocks/test/1) 22 | * [x] [Discovery Test #2](https://webmention.rocks/test/2) 23 | * [x] [Discovery Test #3](https://webmention.rocks/test/3) 24 | * [x] [Discovery Test #4](https://webmention.rocks/test/4) 25 | * [x] [Discovery Test #5](https://webmention.rocks/test/5) 26 | * [x] [Discovery Test #6](https://webmention.rocks/test/6) 27 | * [x] [Discovery Test #7](https://webmention.rocks/test/7) 28 | * [x] [Discovery Test #8](https://webmention.rocks/test/8) 29 | * [x] [Discovery Test #9](https://webmention.rocks/test/9) 30 | * [x] [Discovery Test #10](https://webmention.rocks/test/10) 31 | * [x] [Discovery Test #11](https://webmention.rocks/test/11) 32 | * [x] [Discovery Test #12](https://webmention.rocks/test/12) 33 | * [x] [Discovery Test #13](https://webmention.rocks/test/13) 34 | * [x] [Discovery Test #14](https://webmention.rocks/test/14) 35 | * [x] [Discovery Test #15](https://webmention.rocks/test/15) 36 | * [x] [Discovery Test #16](https://webmention.rocks/test/16) 37 | * [x] [Discovery Test #17](https://webmention.rocks/test/17) 38 | * [x] [Discovery Test #18](https://webmention.rocks/test/18) 39 | * [x] [Discovery Test #19](https://webmention.rocks/test/19) 40 | * [x] [Discovery Test #20](https://webmention.rocks/test/20) 41 | * [x] [Discovery Test #21](https://webmention.rocks/test/21) 42 | 43 | 44 | ### Sending Tests (3.1.2) 45 | 46 | MUST 47 | 48 | * [x] Accepts HTTP 200 response as a success 49 | * [x] Accepts HTTP 201 response as a success 50 | * [x] Accepts HTTP 202 response as a success 51 | 52 | 53 | ### Update Tests (3.1.3) 54 | 55 | SHOULD 56 | 57 | * [x] [Update Test #1](https://webmention.rocks/update/1) 58 | * [x] [Update Test #2](https://webmention.rocks/update/2) 59 | 60 | 61 | ### Delete Tests (3.1.4) 62 | 63 | SHOULD 64 | 65 | * [x] [Delete Test #1](https://webmention.rocks/delete/1) 66 | 67 | 68 | ### Security Considerations (4) 69 | 70 | * [ ] The sender avoids sending a Webmention to a loopback address (SHOULD) 71 | 72 | 73 | ### Extensions 74 | 75 | This implementation has also implemented the following extensions. 76 | 77 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 78 | * [x] [Vouch](http://indiewebcamp.com/Vouch) 79 | * [ ] Other: _______ 80 | 81 | 82 | ## Receiving 83 | 84 | Indicate which type of response the receiver provides: 85 | 86 | * [ ] HTTP 200 - Receiver synchronously processes the Webmention request (not recommended) 87 | * [ ] HTTP 201 - Receiver creates a status URL the sender can use to check the status of the Webmention 88 | * [x] HTTP 202 - Receiver processes the Webmention asynchronously 89 | 90 | Describe the response body (if any) which is returned in the request: 91 | 92 | The response body indicates the webmention has been queued for processing, or an error message as appropriate. If the webmention is sent with an Accept: application/json header, the response will be in JSON format. Otherwise it will be text/plain. 93 | 94 | 95 | ### Request Verification (3.2.1) 96 | 97 | * [x] Verifies source and target are valid URLs, rejecting with HTTP 400 (MUST) 98 | * [x] Verifies that target is a valid resource for which the receiver accepts Webmentions, rejecting with HTTP 400 (SHOULD) 99 | * [x] Ignores fragment when checking if target is supported (SHOULD) 100 | 101 | ### Webmention Verification (3.2.2) 102 | 103 | * [x] Verification is processed asynchronously (SHOULD) 104 | * [x] Follows at least one HTTP redirect on source URL (MUST) 105 | * [x] Respects a self-imposed limit on number of HTTP redirects to follow (MUST) 106 | 107 | #### Source URL content-types supported 108 | 109 | Please list the content types that your implementation supports when checking if the source document links to the target URL. 110 | 111 | * [x] HTML 112 | * [ ] Other: ______ 113 | 114 | 115 | ### HTML Verification (3.2.2) 116 | 117 | The tests below apply when the source document is HTML. 118 | 119 | * [x] Accepts a Webmention where the target URL is in an `` tag 120 | * [x] Accepts a Webmention where the target URL is in an `` tag 121 | * [x] Accepts a Webmention where the target URL is in an `` tag inside an HTML comment 125 | * [x] Rejects a Webmention where the target URL is not in the document 126 | 127 | 128 | ### Webmention Display/Use 129 | 130 | * [x] The receiver displays data from the source URL on the target post (MAY) 131 | 132 | * [x] The receiver recognizes that the source URL is a "comment" or "reply" to the post 133 | * [x] using HTML markup: class="u-in-reply-to" 134 | * [x] The receiver recognizes that the source URL is a "like" of the post 135 | * [x] using HTML markup: class="u-like-of" 136 | * [x] The receiver recognizes that the source URL is a "repost" of the post 137 | * [x] using HTML markup: class="u-repost-of" 138 | * [ ] The receiver recognizes that the source URL is an "RSVP" to the post 139 | * [ ] using HTML markup: __________ 140 | * [ ] The receiver recognizes additional response types, using markup: 141 | * [ ] Response: __________ using HTML markup: __________ 142 | * (Please add lines like above for additional response types the receiver has implemented) 143 | 144 | Please describe any other ways the Webmention is displayed or used if applicable. 145 | 146 | 147 | ### Update Tests (3.2.4) 148 | 149 | * [x] Does not display an update Webmention as a new response (SHOULD) 150 | * [x] Removes the response when an update Webmention is sent and the source URL returns 200 and no link is found (SHOULD) 151 | * [x] Updates and stores the information from the primary object at the source URL (MUST) 152 | * [ ] Updates and stores the information from children or descendant objects at the source URL (MAY) 153 | 154 | 155 | ### Delete Tests (3.2.4) 156 | 157 | * [x] Recognizes an HTTP 410 response as a delete, and removes the response (SHOULD) 158 | 159 | 160 | ### Security Considerations (4) 161 | 162 | * [ ] Webmentions are moderated before being displayed (MAY) 163 | * [ ] Webmentions are periodically re-verified (MAY) 164 | * [x] The receiver ensures any displayed data it properly encoded/filtered to prevent XSS attacks (MUST) 165 | * [x] Respects a self-imposed limit on the time spent fetching the source URL (SHOULD) 166 | * [ ] Respects a self-imposed limit on the number of bytes fetched from the source URL (SHOULD) 167 | * [ ] The receiver accepts additional parameters or headers, and so has CSRF protection (SHOULD) 168 | 169 | 170 | ### Extensions 171 | 172 | This implementation has also implemented the following extensions. 173 | 174 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 175 | * [x] [Vouch](http://indiewebcamp.com/Vouch) 176 | * [ ] Other: _______ 177 | 178 | -------------------------------------------------------------------------------- /implementation-reports/gnusocial.md: -------------------------------------------------------------------------------- 1 | # GNU Social Linkback Plugin 2 | 3 | Implementation Home Page URL: https://gnu.io/social/ 4 | 5 | Source Code repo URL(s) (optional): https://git.gnu.io/gnu/gnu-social/ 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): PHP 9 | 10 | Developer(s): [Stephen Paul Weber](https://singpolyma.net) 11 | 12 | Implementation Classes (Sender and/or Receiver): Both 13 | 14 | 15 | ## Sending 16 | 17 | ### Discovery Tests (3.1.1) 18 | 19 | MUST 20 | 21 | * [x] [Discovery Test #1](https://webmention.rocks/test/1) 22 | * [x] [Discovery Test #2](https://webmention.rocks/test/2) 23 | * [x] [Discovery Test #3](https://webmention.rocks/test/3) 24 | * [x] [Discovery Test #4](https://webmention.rocks/test/4) 25 | * [x] [Discovery Test #5](https://webmention.rocks/test/5) 26 | * [x] [Discovery Test #6](https://webmention.rocks/test/6) 27 | * [x] [Discovery Test #7](https://webmention.rocks/test/7) 28 | * [x] [Discovery Test #8](https://webmention.rocks/test/8) 29 | * [x] [Discovery Test #9](https://webmention.rocks/test/9) 30 | * [x] [Discovery Test #10](https://webmention.rocks/test/10) 31 | * [x] [Discovery Test #11](https://webmention.rocks/test/11) 32 | * [x] [Discovery Test #12](https://webmention.rocks/test/12) 33 | * [ ] [Discovery Test #13](https://webmention.rocks/test/13) 34 | * [x] [Discovery Test #14](https://webmention.rocks/test/14) 35 | * [x] [Discovery Test #15](https://webmention.rocks/test/15) 36 | * [x] [Discovery Test #16](https://webmention.rocks/test/16) 37 | * [ ] [Discovery Test #17](https://webmention.rocks/test/17) 38 | * [x] [Discovery Test #18](https://webmention.rocks/test/18) 39 | * [x] [Discovery Test #19](https://webmention.rocks/test/19) 40 | * [x] [Discovery Test #20](https://webmention.rocks/test/20) 41 | * [x] [Discovery Test #21](https://webmention.rocks/test/21) 42 | 43 | #### Implementation Notes 44 | 45 | 13 and 17 currently do not pass because the HTML detection is done with PCRE and not a proper parser. 46 | 47 | ### Sending Tests (3.1.2) 48 | 49 | MUST 50 | 51 | * [x] Accepts HTTP 200 response as a success 52 | * [x] Accepts HTTP 201 response as a success 53 | * [x] Accepts HTTP 202 response as a success 54 | 55 | 56 | ### Update Tests (3.1.3) 57 | 58 | SHOULD 59 | 60 | * [ ] [Update Test #1](https://webmention.rocks/update/1) 61 | * [ ] [Update Test #2](https://webmention.rocks/update/2) 62 | 63 | #### Implementation Notes 64 | 65 | There is no way to update a notice on GNU Social. 66 | 67 | ### Delete Tests (3.1.4) 68 | 69 | SHOULD 70 | 71 | * [ ] [Delete Test #1](https://webmention.rocks/delete/1) 72 | 73 | ### Security Considerations (4) 74 | 75 | * [x] The sender avoids sending a Webmention to a loopback address (SHOULD) 76 | 77 | #### Implementation Notes 78 | 79 | All same-site webmentions are avoided. 80 | 81 | ### Extensions 82 | 83 | This implementation has also implemented the following extensions. 84 | 85 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 86 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 87 | * [ ] Other: _______ 88 | 89 | 90 | ## Receiving 91 | 92 | Indicate which type of response the receiver provides: 93 | 94 | * [x] HTTP 200 - Receiver synchronously processes the Webmention request (not recommended) 95 | * [ ] HTTP 201 - Receiver creates a status URL the sender can use to check the status of the Webmention 96 | * [ ] HTTP 202 - Receiver processes the Webmention asynchronously 97 | 98 | Describe the response body (if any) which is returned in the request: 99 | 100 | The URL of a notice created to embody the mention. 101 | 102 | ### Request Verification (3.2.1) 103 | 104 | * [x] Verifies source and target are valid URLs, rejecting with HTTP 400 (MUST) 105 | * [x] Verifies that target is a valid resource for which the receiver accepts Webmentions, rejecting with HTTP 400 (SHOULD) 106 | * [x] Ignores fragment when checking if target is supported (SHOULD) 107 | 108 | ### Webmention Verification (3.2.2) 109 | 110 | * [ ] Verification is processed asynchronously (SHOULD) 111 | * [x] Follows at least one HTTP redirect on source URL (MUST) 112 | * [x] Respects a self-imposed limit on number of HTTP redirects to follow (MUST) 113 | 114 | #### Source URL content-types supported 115 | 116 | Please list the content types that your implementation supports when checking if the source document links to the target URL. 117 | 118 | * [x] HTML 119 | * [x] Other: Any text-based format contaning the URL 120 | 121 | 122 | ### HTML Verification (3.2.2) 123 | 124 | The tests below apply when the source document is HTML. 125 | 126 | * [x] Accepts a Webmention where the target URL is in an `` tag 127 | * [x] Accepts a Webmention where the target URL is in an `` tag 128 | * [x] Accepts a Webmention where the target URL is in an `` tag inside an HTML comment 132 | * [x] Rejects a Webmention where the target URL is not in the document 133 | 134 | 135 | ### Webmention Display/Use 136 | 137 | * [x] The receiver displays data from the source URL on the target post (MAY) 138 | 139 | * [x] The receiver recognizes that the source URL is a "comment" or "reply" to the post 140 | * [x] using HTML markup: `class="u-in-reply-to"` or `rel="in-reply-to"` 141 | * [x] The receiver recognizes that the source URL is a "like" of the post 142 | * [x] using HTML markup: `class="u-like-of"` 143 | * [x] The receiver recognizes that the source URL is a "repost" of the post 144 | * [x] using HTML markup: `class="u-repost-of"` 145 | * [x] The receiver recognizes that the source URL is an "RSVP" to the post 146 | * [x] using HTML markup: `class="u-in-reply-to"` and `class="p-rsvp"` 147 | * [ ] The receiver recognizes additional response types, using markup: 148 | * [ ] Response: __________ using HTML markup: __________ 149 | * (Please add lines like above for additional response types the receiver has implemented) 150 | 151 | Please describe any other ways the Webmention is displayed or used if applicable. 152 | 153 | 154 | ### Update Tests (3.2.4) 155 | 156 | * [x] Does not display an update Webmention as a new response (SHOULD) 157 | * [ ] Removes the response when an update Webmention is sent and the source URL returns 200 and no link is found (SHOULD) 158 | * [x] Updates and stores the information from the primary object at the source URL (MUST) 159 | * [ ] Updates and stores the information from children or descendant objects at the source URL (MAY) 160 | 161 | 162 | ### Delete Tests (3.2.4) 163 | 164 | * [ ] Recognizes an HTTP 410 response as a delete, and removes the response (SHOULD) 165 | 166 | 167 | ### Security Considerations (4) 168 | 169 | * [ ] Webmentions are moderated before being displayed (MAY) 170 | * [ ] Webmentions are periodically re-verified (MAY) 171 | * [x] The receiver ensures any displayed data it properly encoded/filtered to prevent XSS attacks (MUST) 172 | * [x] Respects a self-imposed limit on the time spent fetching the source URL (SHOULD) 173 | * [ ] Respects a self-imposed limit on the number of bytes fetched from the source URL (SHOULD) 174 | * [ ] The receiver accepts additional parameters or headers, and so has CSRF protection (SHOULD) 175 | 176 | 177 | ### Extensions 178 | 179 | This implementation has also implemented the following extensions. 180 | 181 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 182 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 183 | * [ ] Other: _______ 184 | 185 | -------------------------------------------------------------------------------- /implementation-reports/postly.md: -------------------------------------------------------------------------------- 1 | # Postly 2 | 3 | Implementation Home Page URL: https://github.com/dissolve/postly 4 | 5 | Source Code repo URL(s) (optional): https://github.com/dissolve/postly 6 | * [x] 100% open source implementation 7 | 8 | Programming Language(s): 9 | 10 | Developer(s): [Ben ROberts](https://ben.thatmustbe.me) 11 | 12 | Implementation Classes (Sender and/or Receiver): Sender and Receiver 13 | 14 | 15 | ## Sending 16 | 17 | ### Discovery Tests (3.1.1) 18 | 19 | MUST 20 | 21 | * [ ] [Discovery Test #1](https://webmention.rocks/test/1) 22 | * [ ] [Discovery Test #2](https://webmention.rocks/test/2) 23 | * [x] [Discovery Test #3](https://webmention.rocks/test/3) 24 | * [x] [Discovery Test #4](https://webmention.rocks/test/4) 25 | * [x] [Discovery Test #5](https://webmention.rocks/test/5) 26 | * [x] [Discovery Test #6](https://webmention.rocks/test/6) 27 | * [ ] [Discovery Test #7](https://webmention.rocks/test/7) 28 | * [x] [Discovery Test #8](https://webmention.rocks/test/8) 29 | * [ ] [Discovery Test #9](https://webmention.rocks/test/9) 30 | * [ ] [Discovery Test #10](https://webmention.rocks/test/10) 31 | * [x] [Discovery Test #11](https://webmention.rocks/test/11) 32 | * [x] [Discovery Test #12](https://webmention.rocks/test/12) 33 | * [ ] [Discovery Test #13](https://webmention.rocks/test/13) 34 | * [x] [Discovery Test #14](https://webmention.rocks/test/14) 35 | * [ ] [Discovery Test #15](https://webmention.rocks/test/15) 36 | * [x] [Discovery Test #16](https://webmention.rocks/test/16) 37 | * [ ] [Discovery Test #17](https://webmention.rocks/test/17) 38 | * [x] [Discovery Test #18](https://webmention.rocks/test/18) 39 | * [x] [Discovery Test #19](https://webmention.rocks/test/19) 40 | * [x] [Discovery Test #20](https://webmention.rocks/test/20) 41 | * [x] [Discovery Test #21](https://webmention.rocks/test/21) 42 | 43 | 44 | ### Sending Tests (3.1.2) 45 | 46 | MUST 47 | 48 | * [x] Accepts HTTP 200 response as a success 49 | * [x] Accepts HTTP 201 response as a success 50 | * [x] Accepts HTTP 202 response as a success 51 | 52 | 53 | ### Update Tests (3.1.3) 54 | 55 | SHOULD 56 | 57 | * [x] [Update Test #1](https://webmention.rocks/update/1) 58 | * [x] [Update Test #2](https://webmention.rocks/update/2) 59 | 60 | 61 | ### Delete Tests (3.1.4) 62 | 63 | SHOULD 64 | 65 | * [x] [Delete Test #1](https://webmention.rocks/delete/1) 66 | 67 | 68 | ### Security Considerations (4) 69 | 70 | * [ ] The sender avoids sending a Webmention to a loopback address (SHOULD) 71 | 72 | 73 | ### Extensions 74 | 75 | This implementation has also implemented the following extensions. 76 | 77 | * [x] [Salmention](http://indiewebcamp.com/Salmention) 78 | * [x] [Vouch](http://indiewebcamp.com/Vouch) 79 | * [ ] Other: _______ 80 | 81 | 82 | ## Receiving 83 | 84 | Indicate which type of response the receiver provides: 85 | 86 | * [ ] HTTP 200 - Receiver synchronously processes the Webmention request (not recommended) 87 | * [ ] HTTP 201 - Receiver creates a status URL the sender can use to check the status of the Webmention 88 | * [x] HTTP 202 - Receiver processes the Webmention asynchronously 89 | 90 | Describe the response body (if any) which is returned in the request: 91 | 92 | The reponse body is a URL the sender can use to check the status of the Webmention (also provided in Link header with rel=status) 93 | 94 | ### Request Verification (3.2.1) 95 | 96 | * [x] Verifies source and target are valid URLs, rejecting with HTTP 400 (MUST) 97 | * [ ] Verifies that target is a valid resource for which the receiver accepts Webmentions, rejecting with HTTP 400 (SHOULD) 98 | * [x] Ignores fragment when checking if target is supported (SHOULD) 99 | 100 | #### Implementation Notes 101 | 102 | Checking that target is a valid resource is not done until after query has been processed form the queue. 103 | This is intentional as the target link may be a shortlink and thus on a different domain. 104 | 105 | ### Webmention Verification (3.2.2) 106 | 107 | * [x] Verification is processed asynchronously (SHOULD) 108 | * [x] Follows at least one HTTP redirect on source URL (MUST) 109 | * [x] Respects a self-imposed limit on number of HTTP redirects to follow (MUST) 110 | 111 | #### Source URL content-types supported 112 | 113 | Please list the content types that your implementation supports when checking if the source document links to the target URL. 114 | 115 | * [x] HTML 116 | * [x] Other: any content parsable as plaintext 117 | 118 | 119 | ### HTML Verification (3.2.2) 120 | 121 | The tests below apply when the source document is HTML. 122 | 123 | * [x] Accepts a Webmention where the target URL is in an `` tag 124 | * [x] Accepts a Webmention where the target URL is in an `` tag 125 | * [x] Accepts a Webmention where the target URL is in an `` tag inside an HTML comment 129 | * [x] Rejects a Webmention where the target URL is not in the document 130 | 131 | 132 | ### Webmention Display/Use 133 | 134 | * [x] The receiver displays data from the source URL on the target post (MAY) 135 | 136 | * [x] The receiver recognizes that the source URL is a "comment" or "reply" to the post 137 | * [x] using HTML markup: class="u-in-reply-to" 138 | * [x] The receiver recognizes that the source URL is a "like" of the post 139 | * [x] using HTML markup: class="u-like-of" or class="u-like" 140 | * [x] The receiver recognizes that the source URL is a "repost" of the post 141 | * [x] using HTML markup: class="u-repost-of" or class="u-repost" 142 | * [ ] The receiver recognizes that the source URL is an "RSVP" to the post 143 | * [ ] using HTML markup: __________ 144 | * [x] The receiver recognizes additional response types, using markup: 145 | * [x] Response: tag using HTML markup: class="u-tag-of" 146 | * (Please add lines like above for additional response types the receiver has implemented) 147 | 148 | Please describe any other ways the Webmention is displayed or used if applicable. 149 | 150 | Webmentions are only displayed if parsable microformats and are a comment, reply, like, repost, 151 | otherwise stored and not displayed. 152 | 153 | 154 | ### Update Tests (3.2.4) 155 | 156 | * [x] Does not display an update Webmention as a new response (SHOULD) 157 | * [x] Removes the response when an update Webmention is sent and the source URL returns 200 and no link is found (SHOULD) 158 | * [x] Updates and stores the information from the primary object at the source URL (MUST) 159 | * [x] Updates and stores the information from children or descendant objects at the source URL (MAY) 160 | 161 | 162 | ### Delete Tests (3.2.4) 163 | 164 | * [x] Recognizes an HTTP 410 response as a delete, and removes the response (SHOULD) 165 | 166 | 167 | ### Security Considerations (4) 168 | 169 | * [x] Webmentions are moderated before being displayed (MAY) 170 | * [ ] Webmentions are periodically re-verified (MAY) 171 | * [x] The receiver ensures any displayed data it properly encoded/filtered to prevent XSS attacks (MUST) 172 | * [x] Respects a self-imposed limit on the time spent fetching the source URL (SHOULD) 173 | * [ ] Respects a self-imposed limit on the number of bytes fetched from the source URL (SHOULD) 174 | * [ ] The receiver accepts additional parameters or headers, and so has CSRF protection (SHOULD) 175 | 176 | #### Implementation Notes 177 | 178 | Webmentions coming from un-vouched or non-whitelisted domains are moderated 179 | 180 | 181 | 182 | ### Extensions 183 | 184 | This implementation has also implemented the following extensions. 185 | 186 | * [x] [Salmention](http://indiewebcamp.com/Salmention) 187 | * [x] [Vouch](http://indiewebcamp.com/Vouch) 188 | * [ ] Other: _______ 189 | 190 | -------------------------------------------------------------------------------- /implementation-reports/TEMPLATE.md: -------------------------------------------------------------------------------- 1 | This file is a sample implementation report. Fork this repository, copy this file to a new `.md` file and change the name to your project name (in lower case with hyphens between words), and fill out the information in the report based on your implementation. When you are finished, submit a pull request and your report will be reviewed and added to the main repository. 2 | 3 | Complete this report by filling out the checkboxes as appropriate. To mark one as successful/complete/true, add an `x` between the brackets, e.g. `[x]`. If the statement does not apply to your implementation, use `[na]` and add a sentence explaining why it does not apply. 4 | 5 | If your implementation is only a sender or only a receiver, remove the other section from the document before submitting. 6 | 7 | When you are complete, send a pull request with the addition of your report file. Please remove this entire top section before submitting. 8 | 9 | 10 | # Implementation Name (Replace this header) 11 | 12 | Implementation Home Page URL: 13 | 14 | Source Code repo URL(s) (optional): 15 | * [ ] 100% open source implementation 16 | 17 | Programming Language(s): 18 | 19 | Developer(s): [Name](http://you.example.com) 20 | 21 | Implementation Classes (Sender and/or Receiver): 22 | 23 | 24 | ## Sending 25 | 26 | ### Discovery Tests (3.1.1) 27 | 28 | MUST 29 | 30 | * [ ] [Discovery Test #1](https://webmention.rocks/test/1) 31 | * [ ] [Discovery Test #2](https://webmention.rocks/test/2) 32 | * [ ] [Discovery Test #3](https://webmention.rocks/test/3) 33 | * [ ] [Discovery Test #4](https://webmention.rocks/test/4) 34 | * [ ] [Discovery Test #5](https://webmention.rocks/test/5) 35 | * [ ] [Discovery Test #6](https://webmention.rocks/test/6) 36 | * [ ] [Discovery Test #7](https://webmention.rocks/test/7) 37 | * [ ] [Discovery Test #8](https://webmention.rocks/test/8) 38 | * [ ] [Discovery Test #9](https://webmention.rocks/test/9) 39 | * [ ] [Discovery Test #10](https://webmention.rocks/test/10) 40 | * [ ] [Discovery Test #11](https://webmention.rocks/test/11) 41 | * [ ] [Discovery Test #12](https://webmention.rocks/test/12) 42 | * [ ] [Discovery Test #13](https://webmention.rocks/test/13) 43 | * [ ] [Discovery Test #14](https://webmention.rocks/test/14) 44 | * [ ] [Discovery Test #15](https://webmention.rocks/test/15) 45 | * [ ] [Discovery Test #16](https://webmention.rocks/test/16) 46 | * [ ] [Discovery Test #17](https://webmention.rocks/test/17) 47 | * [ ] [Discovery Test #18](https://webmention.rocks/test/18) 48 | * [ ] [Discovery Test #19](https://webmention.rocks/test/19) 49 | * [ ] [Discovery Test #20](https://webmention.rocks/test/20) 50 | * [ ] [Discovery Test #21](https://webmention.rocks/test/21) 51 | 52 | #### Implementation Notes 53 | 54 | (Add implementation notes here, or remove this section) 55 | 56 | 57 | ### Sending Tests (3.1.2) 58 | 59 | MUST 60 | 61 | * [ ] Accepts HTTP 200 response as a success 62 | * [ ] Accepts HTTP 201 response as a success 63 | * [ ] Accepts HTTP 202 response as a success 64 | 65 | 66 | ### Update Tests (3.1.3) 67 | 68 | SHOULD 69 | 70 | * [ ] [Update Test #1](https://webmention.rocks/update/1) 71 | * [ ] [Update Test #2](https://webmention.rocks/update/2) 72 | 73 | #### Implementation Notes 74 | 75 | (Add implementation notes here, or remove this section) 76 | 77 | 78 | ### Delete Tests (3.1.4) 79 | 80 | SHOULD 81 | 82 | * [ ] [Delete Test #1](https://webmention.rocks/delete/1) 83 | 84 | #### Implementation Notes 85 | 86 | (Add implementation notes here, or remove this section) 87 | 88 | 89 | ### Security Considerations (4) 90 | 91 | * [ ] The sender avoids sending a Webmention to a loopback address (SHOULD) 92 | 93 | 94 | ### Extensions 95 | 96 | This implementation has also implemented the following extensions. 97 | 98 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 99 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 100 | * [ ] Other: _______ 101 | 102 | 103 | ## Receiving 104 | 105 | Indicate which type of response the receiver provides: 106 | 107 | * [ ] HTTP 200 - Receiver synchronously processes the Webmention request (not recommended) 108 | * [ ] HTTP 201 - Receiver creates a status URL the sender can use to check the status of the Webmention 109 | * [ ] HTTP 202 - Receiver processes the Webmention asynchronously 110 | 111 | Describe the response body (if any) which is returned in the request: 112 | 113 | 114 | ### Request Verification (3.2.1) 115 | 116 | * [ ] Verifies source and target are valid URLs, rejecting with HTTP 400 (MUST) 117 | * [ ] Verifies that target is a valid resource for which the receiver accepts Webmentions, rejecting with HTTP 400 (SHOULD) 118 | * [ ] Ignores fragment when checking if target is supported (SHOULD) 119 | 120 | ### Webmention Verification (3.2.2) 121 | 122 | * [ ] Verification is processed asynchronously (SHOULD) 123 | * [ ] Follows at least one HTTP redirect on source URL (MUST) 124 | * [ ] Respects a self-imposed limit on number of HTTP redirects to follow (MUST) 125 | 126 | #### Source URL content-types supported 127 | 128 | Please list the content types that your implementation supports when checking if the source document links to the target URL. 129 | 130 | * [ ] HTML 131 | * [ ] Other: ______ 132 | 133 | 134 | ### HTML Verification (3.2.2) 135 | 136 | The tests below apply when the source document is HTML. 137 | 138 | * [ ] Accepts a Webmention where the target URL is in an `` tag 139 | * [ ] Accepts a Webmention where the target URL is in an `` tag 140 | * [ ] Accepts a Webmention where the target URL is in an `` tag inside an HTML comment 144 | * [ ] Rejects a Webmention where the target URL is not in the document 145 | 146 | 147 | ### Webmention Display/Use 148 | 149 | * [ ] The receiver displays data from the source URL on the target post (MAY) 150 | 151 | * [ ] The receiver recognizes that the source URL is a "comment" or "reply" to the post 152 | * [ ] using HTML markup: __________ 153 | * [ ] The receiver recognizes that the source URL is a "like" of the post 154 | * [ ] using HTML markup: __________ 155 | * [ ] The receiver recognizes that the source URL is a "repost" of the post 156 | * [ ] using HTML markup: __________ 157 | * [ ] The receiver recognizes that the source URL is an "RSVP" to the post 158 | * [ ] using HTML markup: __________ 159 | * [ ] The receiver recognizes additional response types, using markup: 160 | * [ ] Response: __________ using HTML markup: __________ 161 | * (Please add lines like above for additional response types the receiver has implemented) 162 | 163 | Please describe any other ways the Webmention is displayed or used if applicable. 164 | 165 | 166 | ### Update Tests (3.2.4) 167 | 168 | * [ ] Does not display an update Webmention as a new response (SHOULD) 169 | * [ ] Removes the response when an update Webmention is sent and the source URL returns 200 and no link is found (SHOULD) 170 | * [ ] Updates and stores the information from the primary object at the source URL (MUST) 171 | * [ ] Updates and stores the information from children or descendant objects at the source URL (MAY) 172 | 173 | 174 | ### Delete Tests (3.2.4) 175 | 176 | * [ ] Recognizes an HTTP 410 response as a delete, and removes the response (SHOULD) 177 | 178 | 179 | ### Security Considerations (4) 180 | 181 | * [ ] Webmentions are moderated before being displayed (MAY) 182 | * [ ] Webmentions are periodically re-verified (MAY) 183 | * [ ] The receiver ensures any displayed data it properly encoded/filtered to prevent XSS attacks (MUST) 184 | * [ ] Respects a self-imposed limit on the time spent fetching the source URL (SHOULD) 185 | * [ ] Respects a self-imposed limit on the number of bytes fetched from the source URL (SHOULD) 186 | * [ ] The receiver accepts additional parameters or headers, and so has CSRF protection (SHOULD) 187 | 188 | 189 | ### Extensions 190 | 191 | This implementation has also implemented the following extensions. 192 | 193 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 194 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 195 | * [ ] Other: _______ 196 | -------------------------------------------------------------------------------- /implementation-reports/grav-plugin-webmention.md: -------------------------------------------------------------------------------- 1 | # Webmention Plugin for Grav CMS 2 | 3 | Implementation Home Page URL: https://github.com/Perlkonig/grav-plugin-webmention 4 | 5 | Source Code repo URL(s) (optional): 6 | * [X] 100% open source implementation 7 | 8 | Programming Language(s): 9 | 10 | Developer(s): [Aaron Dalton](https://perlkonig.com) 11 | 12 | Implementation Classes (Sender and/or Receiver): Sender, receiver, and vouch extension 13 | 14 | 15 | ## Sending 16 | 17 | ### Discovery Tests (3.1.1) 18 | 19 | MUST 20 | 21 | * [X] [Discovery Test #1](https://webmention.rocks/test/1) 22 | * [X] [Discovery Test #2](https://webmention.rocks/test/2) 23 | * [X] [Discovery Test #3](https://webmention.rocks/test/3) 24 | * [X] [Discovery Test #4](https://webmention.rocks/test/4) 25 | * [X] [Discovery Test #5](https://webmention.rocks/test/5) 26 | * [X] [Discovery Test #6](https://webmention.rocks/test/6) 27 | * [X] [Discovery Test #7](https://webmention.rocks/test/7) 28 | * [X] [Discovery Test #8](https://webmention.rocks/test/8) 29 | * [X] [Discovery Test #9](https://webmention.rocks/test/9) 30 | * [X] [Discovery Test #10](https://webmention.rocks/test/10) 31 | * [X] [Discovery Test #11](https://webmention.rocks/test/11) 32 | * [X] [Discovery Test #12](https://webmention.rocks/test/12) 33 | * [X] [Discovery Test #13](https://webmention.rocks/test/13) 34 | * [X] [Discovery Test #14](https://webmention.rocks/test/14) 35 | * [X] [Discovery Test #15](https://webmention.rocks/test/15) 36 | * [X] [Discovery Test #16](https://webmention.rocks/test/16) 37 | * [X] [Discovery Test #17](https://webmention.rocks/test/17) 38 | * [X] [Discovery Test #18](https://webmention.rocks/test/18) 39 | * [X] [Discovery Test #19](https://webmention.rocks/test/19) 40 | * [X] [Discovery Test #20](https://webmention.rocks/test/20) 41 | * [X] [Discovery Test #21](https://webmention.rocks/test/21) 42 | 43 | #### Implementation Notes 44 | 45 | I've incorporated the following libraries into this plugin: 46 | 47 | - [IndieWeb/MentionClient](https://github.com/indieweb/mention-client-php) for discovering endpoints and sending notifications. 48 | 49 | - [php-mf2](https://github.com/indieweb/php-mf2) used by IndieWeb/MentionClient to resolve relative URLs and by my code to extract MF2 data from mentioners and vouchers. 50 | 51 | ### Sending Tests (3.1.2) 52 | 53 | MUST 54 | 55 | * [X] Accepts HTTP 200 response as a success 56 | * [X] Accepts HTTP 201 response as a success 57 | * [X] Accepts HTTP 202 response as a success 58 | 59 | 60 | ### Update Tests (3.1.3) 61 | 62 | SHOULD 63 | 64 | * [X] [Update Test #1](https://webmention.rocks/update/1) 65 | * [X] [Update Test #2](https://webmention.rocks/update/2) 66 | 67 | 68 | ### Delete Tests (3.1.4) 69 | 70 | SHOULD 71 | 72 | * [X] [Delete Test #1](https://webmention.rocks/delete/1) 73 | 74 | 75 | ### Security Considerations (4) 76 | 77 | * [X] The sender avoids sending a Webmention to a loopback address (SHOULD) 78 | 79 | #### Implementation Details 80 | 81 | IPv4 only. Checks against reserved IPs as well. 82 | 83 | ### Extensions 84 | 85 | This implementation has also implemented the following extensions. 86 | 87 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 88 | * [X] [Vouch](http://indiewebcamp.com/Vouch) 89 | * [ ] Other: _______ 90 | 91 | 92 | ## Receiving 93 | 94 | Indicate which type of response the receiver provides: 95 | 96 | * [ ] HTTP 200 - Receiver synchronously processes the Webmention request (not recommended) 97 | * [X] HTTP 201 - Receiver creates a status URL the sender can use to check the status of the Webmention 98 | * [X] HTTP 202 - Receiver processes the Webmention asynchronously 99 | 100 | Describe the response body (if any) which is returned in the request: 101 | 102 | HTML response, human readable. 103 | 104 | ### Request Verification (3.2.1) 105 | 106 | * [X] Verifies source and target are valid URLs, rejecting with HTTP 400 (MUST) 107 | * [X] Verifies that target is a valid resource for which the receiver accepts Webmentions, rejecting with HTTP 400 (SHOULD) 108 | * [ ] Ignores fragment when checking if target is supported (SHOULD) 109 | 110 | ### Webmention Verification (3.2.2) 111 | 112 | * [X] Verification is processed asynchronously (SHOULD) 113 | * [X] Follows at least one HTTP redirect on source URL (MUST) 114 | * [X] Respects a self-imposed limit on number of HTTP redirects to follow (MUST) 115 | 116 | #### Source URL content-types supported 117 | 118 | Please list the content types that your implementation supports when checking if the source document links to the target URL. 119 | 120 | * [X] HTML 121 | * [X] Other: Treats anything other than 'text/html' as plain text 122 | 123 | 124 | ### HTML Verification (3.2.2) 125 | 126 | The tests below apply when the source document is HTML. 127 | 128 | * [X] Accepts a Webmention where the target URL is in an `` tag 129 | * [X] Accepts a Webmention where the target URL is in an `` tag 130 | * [X] Accepts a Webmention where the target URL is in an `` tag inside an HTML comment 134 | * [X] Rejects a Webmention where the target URL is not in the document 135 | 136 | #### Implementation Details 137 | 138 | If content is HTML, it strips all comments and looks for 'href' and 'src' references. Any other content type is naively checked to contain the target string. 139 | 140 | ### Webmention Display/Use 141 | 142 | * [ ] The receiver displays data from the source URL on the target post (MAY) 143 | 144 | * [ ] The receiver recognizes that the source URL is a "comment" or "reply" to the post 145 | * [ ] using HTML markup: __________ 146 | * [ ] The receiver recognizes that the source URL is a "like" of the post 147 | * [ ] using HTML markup: __________ 148 | * [ ] The receiver recognizes that the source URL is a "repost" of the post 149 | * [ ] using HTML markup: __________ 150 | * [ ] The receiver recognizes that the source URL is an "RSVP" to the post 151 | * [ ] using HTML markup: __________ 152 | * [ ] The receiver recognizes additional response types, using markup: 153 | * [ ] Response: __________ using HTML markup: __________ 154 | * (Please add lines like above for additional response types the receiver has implemented) 155 | 156 | Please describe any other ways the Webmention is displayed or used if applicable. 157 | 158 | How the data is displayed is completely up to the user. The plugin processes the mentions and extracts any embedded MF2 data. If no MF2 data is present, then all the user will have is the URL. The plugin exposes this data to the Grav system and the user can incorporate that data into their themes in any way they wish. 159 | 160 | ### Update Tests (3.2.4) 161 | 162 | * [/] Does not display an update Webmention as a new response (SHOULD) 163 | * [X] Removes the response when an update Webmention is sent and the source URL returns 200 and no link is found (SHOULD) 164 | * [X] Updates and stores the information from the primary object at the source URL (MUST) 165 | * [ ] Updates and stores the information from children or descendant objects at the source URL (MAY) 166 | 167 | #### Implementation Details 168 | 169 | The first bullet gets a half mark at least. Maybe it's a full mark. The plugin is idempotent, but it never overwrites the initial 'date_received' field. So while any MF2 data would be updated, the user would have no indication that the data had changed. Display is ultimately up to the user, though. 170 | 171 | ### Delete Tests (3.2.4) 172 | 173 | * [X] Recognizes an HTTP 410 response as a delete, and removes the response (SHOULD) 174 | 175 | #### Implementation Details 176 | 177 | *Any* error response will result in the data being marked as invisible. But it's not deleted. The plugin deletes `410 GONE` responses from the data when the user approves. The user can of course manually delete any data they choose. 178 | 179 | ### Security Considerations (4) 180 | 181 | * [X] Webmentions are moderated before being displayed (MAY) 182 | * [X] Webmentions are periodically re-verified (MAY) 183 | * [/] The receiver ensures any displayed data it properly encoded/filtered to prevent XSS attacks (MUST) 184 | * [X] Respects a self-imposed limit on the time spent fetching the source URL (SHOULD) 185 | * [X] Respects a self-imposed limit on the number of bytes fetched from the source URL (SHOULD) 186 | * [ ] The receiver accepts additional parameters or headers, and so has CSRF protection (SHOULD) 187 | 188 | #### Implementation Details 189 | 190 | Regarding the half mark in bullet 3: The code uses libraries and language features to do a certain degree of due diligence, but it does not go out of its way. Ultimately the user who displays the data should apply reasonable filters. 191 | 192 | ### Extensions 193 | 194 | This implementation has also implemented the following extensions. 195 | 196 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 197 | * [X] [Vouch](http://indiewebcamp.com/Vouch) 198 | * [ ] Other: _______ 199 | 200 | -------------------------------------------------------------------------------- /implementation-reports/bridgy.md: -------------------------------------------------------------------------------- 1 | # Bridgy 2 | 3 | Bridgy is a service that sends comments, likes, RSVPs inside social networks (aka silos) to personal web sites. It can also publish (aka POSSE) posts from personal web sites into the silos, using an interactive web UI or webmention. More details: https://brid.gy/about 4 | 5 | Implementation Home Page URL: https://brid.gy/ 6 | 7 | Source Code repo URL(s) (optional): https://github.com/snarfed/bridgy 8 | * [x] 100% open source implementation 9 | 10 | Programming Language(s): Python 11 | 12 | Developer(s): 13 | * [Ryan Barrett](https://snarfed.org/) 14 | * [Kyle Mahan](https://kylewm.com/) 15 | * [and more...](https://github.com/snarfed/bridgy/graphs/contributors) 16 | 17 | Implementation Classes: Sender and Receiver 18 | 19 | 20 | ## Sending 21 | 22 | ### Discovery Tests (3.1.1) 23 | 24 | MUST 25 | 26 | * [x] [Discovery Test #1](https://webmention.rocks/test/1) 27 | * [x] [Discovery Test #2](https://webmention.rocks/test/2) 28 | * [x] [Discovery Test #3](https://webmention.rocks/test/3) 29 | * [x] [Discovery Test #4](https://webmention.rocks/test/4) 30 | * [x] [Discovery Test #5](https://webmention.rocks/test/5) 31 | * [x] [Discovery Test #6](https://webmention.rocks/test/6) 32 | * [x] [Discovery Test #7](https://webmention.rocks/test/7) 33 | * [x] [Discovery Test #8](https://webmention.rocks/test/8) 34 | * [x] [Discovery Test #9](https://webmention.rocks/test/9) 35 | * [x] [Discovery Test #10](https://webmention.rocks/test/10) 36 | * [x] [Discovery Test #11](https://webmention.rocks/test/11) 37 | * [x] [Discovery Test #12](https://webmention.rocks/test/12) 38 | * [x] [Discovery Test #13](https://webmention.rocks/test/13) 39 | * [x] [Discovery Test #14](https://webmention.rocks/test/14) 40 | * [ ] [Discovery Test #15](https://webmention.rocks/test/15) 41 | * [ ] [Discovery Test #16](https://webmention.rocks/test/16) 42 | * [x] [Discovery Test #17](https://webmention.rocks/test/17) 43 | * [x] [Discovery Test #18](https://webmention.rocks/test/18) 44 | * [x] [Discovery Test #19](https://webmention.rocks/test/19) 45 | * [ ] [Discovery Test #20](https://webmention.rocks/test/20) 46 | * [x] [Discovery Test #21](https://webmention.rocks/test/21) 47 | 48 | 49 | ### Sending Tests (3.1.2) 50 | 51 | MUST 52 | 53 | * [x] Accepts HTTP 200 response as a success 54 | * [x] Accepts HTTP 201 response as a success 55 | * [x] Accepts HTTP 202 response as a success 56 | 57 | 58 | ### Update Tests (3.1.3) 59 | 60 | SHOULD 61 | 62 | * [ ] [Update Test #1](https://webmention.rocks/update/1) 63 | * [ ] [Update Test #2](https://webmention.rocks/update/2) 64 | 65 | Bridgy does resend webmentions when responses change, but silo responses are separate from the posts they're responding to, so Bridgy doesn't currently update the webmention targets it sends to. It may in the future. Background: https://github.com/snarfed/bridgy/issues/9 66 | 67 | ### Delete Tests (3.1.4) 68 | 69 | SHOULD 70 | 71 | * [ ] [Delete Test #1](https://webmention.rocks/delete/1) 72 | 73 | Not yet supported: https://github.com/snarfed/bridgy/issues/9 74 | 75 | ### Security Considerations (4) 76 | 77 | * [ ] The sender avoids sending a Webmention to a loopback address (SHOULD) 78 | 79 | Bridgy intentionally supports loopback addresses (e.g. localhost) as an internal development tool. 80 | 81 | ### Extensions 82 | 83 | This implementation has also implemented the following extensions. 84 | 85 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 86 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 87 | * [ ] Other: _______ 88 | 89 | ### Implementation notes 90 | 91 | Bridgy is fairly high volume (https://brid.gy/#stats), so it has a couple scaling optimizations that aren't strictly kosher: 92 | * It caches discovered webmention endpoints at the domain level for 2h. 93 | https://github.com/snarfed/bridgy/blob/a31d4636bc76771c82eb54c27fd4e13b564bc114/tasks.py#L44 94 | * It has a large blacklist of domains that it never discovers endpoints on or sends webmentions to. https://github.com/snarfed/bridgy/blob/master/domain_blacklist.txt 95 | 96 | ## Receiving 97 | 98 | Indicate which type of response the receiver provides: 99 | 100 | * [x] HTTP 200 - Receiver synchronously processes the Webmention request (not recommended) 101 | * [x] HTTP 201 - Receiver creates a status URL the sender can use to check the status of the Webmention 102 | * [ ] HTTP 202 - Receiver processes the Webmention asynchronously 103 | 104 | Bridgy processes webmention requests synchronously, but returns HTTP 201 on success. The status URL is the URL of the silo post that was created. 105 | 106 | Describe the response body (if any) which is returned in the request: 107 | 108 | From https://brid.gy/about#response : 109 | 110 | JSON response containing at least a url field that points to the silo object that it operated on. The same URL is included in the Location HTTP header. For Twitter favorites and Facebook event RSVPs, this is the tweet, post, or event. If a new object was created, e.g. a Facebook post or Twitter tweet, @-reply, or retweet, there will also be an id field with the silo id of that object. 111 | 112 | For example, this request for an original post: 113 | 114 | ``` 115 | POST source=https://example.com/posts/123 116 | &target=https://brid.gy/publish/facebook 117 | ``` 118 | 119 | will receive this response: 120 | 121 | ``` 122 | HTTP/1.1 201 Created 123 | Content-Type: application/json 124 | Location: http://facebook.com/456_789 125 | 126 | { 127 | "url": "http://facebook.com/456_789", 128 | "type": "post", 129 | "id": "456_789" 130 | } 131 | ``` 132 | 133 | ### Request Verification (3.2.1) 134 | 135 | * [x] Verifies source and target are valid URLs, rejecting with HTTP 400 (MUST) 136 | * [x] Verifies that target is a valid resource for which the receiver accepts Webmentions, rejecting with HTTP 400 (SHOULD) 137 | * [x] Ignores fragment when checking if target is supported (SHOULD) 138 | 139 | ### Webmention Verification (3.2.2) 140 | 141 | * [ ] Verification is processed asynchronously (SHOULD) 142 | * [x] Follows at least one HTTP redirect on source URL (MUST) 143 | * [x] Respects a self-imposed limit on number of HTTP redirects to follow (MUST) 144 | 145 | #### Source URL content-types supported 146 | 147 | Please list the content types that your implementation supports when checking if the source document links to the target URL. 148 | 149 | * [x] HTML 150 | * [x] Other: text/plain 151 | 152 | 153 | ### HTML Verification (3.2.2) 154 | 155 | The tests below apply when the source document is HTML. 156 | 157 | * [x] Accepts a Webmention where the target URL is in an `` tag 158 | * [x] Accepts a Webmention where the target URL is in an `` tag 159 | * [x] Accepts a Webmention where the target URL is in an `` tag inside an HTML comment 163 | * [x] Rejects a Webmention where the target URL is not in the document 164 | 165 | 166 | ### Webmention Display/Use 167 | 168 | * [ ] The receiver displays data from the source URL on the target post (MAY) 169 | 170 | * [x] The receiver recognizes that the source URL is a "comment" or "reply" to the post 171 | * [x] using HTML markup: `class="u-in-reply-to"` 172 | * [x] The receiver recognizes that the source URL is a "like" of the post 173 | * [x] using HTML markup: `class="u-like-of"` 174 | * [x] The receiver recognizes that the source URL is a "repost" of the post 175 | * [x] using HTML markup: `class="u-repost-of"` 176 | * [x] The receiver recognizes that the source URL is an "RSVP" to the post 177 | * [x] using HTML markup: `class="p-rsvp"` + `class="u-in-reply-to"` 178 | * [x] The receiver recognizes additional response types, using markup: 179 | * [x] picture, using HTML markup: `class="u-photo"` 180 | * [x] person tag, using HTML markup: `class="u-category h-card"` 181 | * [x] custom option: disable backlink in created post, using HTML markup: `class="p-bridgy-omit-link"` 182 | * [x] custom option: ignore text formatting, using HTML markup: `class="u-bridgy-ignore-formatting"` 183 | * [x] custom option: explicit post text, using HTML markup: `class="u-bridgy-[SILO]-text"` 184 | 185 | More details: https://brid.gy/about#publishing 186 | 187 | 188 | ### Update Tests (3.2.4) 189 | 190 | * [x] Does not display an update Webmention as a new response (SHOULD) 191 | * [ ] Removes the response when an update Webmention is sent and the source URL returns 200 and no link is found (SHOULD) 192 | * [ ] Updates and stores the information from the primary object at the source URL (MUST) 193 | * [ ] Updates and stores the information from children or descendant objects at the source URL (MAY) 194 | 195 | Not yet supported: https://github.com/snarfed/bridgy/issues/84 196 | 197 | ### Delete Tests (3.2.4) 198 | 199 | * [ ] Recognizes an HTTP 410 response as a delete, and removes the response (SHOULD) 200 | 201 | Not yet supported: https://github.com/snarfed/bridgy/issues/84 202 | 203 | ### Security Considerations (4) 204 | 205 | * [ ] Webmentions are moderated before being displayed (MAY) 206 | * [ ] Webmentions are periodically re-verified (MAY) 207 | * [ ] The receiver ensures any displayed data it properly encoded/filtered to prevent XSS attacks (MUST) 208 | * [x] Respects a self-imposed limit on the time spent fetching the source URL (SHOULD) 209 | * [x] Respects a self-imposed limit on the number of bytes fetched from the source URL (SHOULD) 210 | * [ ] The receiver accepts additional parameters or headers, and so has CSRF protection (SHOULD) 211 | 212 | 213 | ### Extensions 214 | 215 | This implementation has also implemented the following extensions. 216 | 217 | * [ ] [Salmention](http://indiewebcamp.com/Salmention) 218 | * [ ] [Vouch](http://indiewebcamp.com/Vouch) 219 | * [ ] Other: _______ 220 | 221 | -------------------------------------------------------------------------------- /draft/source/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Webmention 5 | 6 | 7 | 119 | 120 | 121 | 122 | 123 |
124 |

125 | Webmention is a simple way to notify any URL when you mention it on your site. From the receiver's perspective, it's a way to request notifications when other sites mention it. 126 |

127 | 128 |
129 |

Author's Note

130 |

This specification was contributed to the W3C from the 131 | IndieWeb community. More 132 | history and evolution of Webmention can be found on the 133 | IndieWeb wiki.

134 |
135 |
136 | 137 |
138 |
139 | 140 |
141 |

Introduction

142 | 143 |

A Webmention is a notification that one URL links to another. For example, Alice writes an interesting post on her blog. Bob then writes a response to her post on his own site, linking back to Alice's original post. Bob's publishing software sends a Webmention to Alice notifying that her article was replied to, and Alice's software can show that reply as a comment on the original post.

144 | 145 |

Sending a Webmention is not limited to blog posts, and can be used for additional kinds of content and responses as well. For example, a response can be an RSVP to an event, an indication that someone "likes" another post, a "bookmark" of another post, and many others. Webmention enables these interactions to happen across different websites, enabling a distributed social web.

146 | 147 |
148 |

Social Web Working Group

149 | 150 |

Webmention is one of several related specifications being produced by the Social Web Working Group. Implementers interested in alternative approaches and complimentary protocols should start by reading the overview document [[social-web-protocols]].

151 |
152 | 153 |
154 |

Overview

155 | 156 |

A typical Webmention flow is as follows: 157 |

    158 |
  1. Alice posts some interesting content on her site (which is set up to receive Webmentions).
  2. 159 |
  3. Bob sees this content and comments about it on his site, linking back to Alice's original post.
  4. 160 |
  5. Using Webmention, Bob's publishing software automatically notifies Alice's server that her post has been linked to by the URL of Bob's post.
  6. 161 |
  7. Alice's publishing software verifies that Bob's post actually contains a mention of her post and then includes this information on her site.
  8. 162 |
163 |

164 |
165 | 166 |
167 |

Protocol Summary

168 | 169 |

Webmentions are sent "from" a source URL "to" a target URL to notify the target that it has been mentioned at the source URL.

170 | 171 |
    172 |
  1. User Aaron writes a post on his blog.
  2. 173 |
  3. User Barnaby writes a post on his blog that links to Aaron's post.
  4. 174 |
  5. After publishing the post (i.e., after it has a URL), Barnaby's server notices the mention of Aaron's post as part of the publishing process.
  6. 175 |
  7. Barnaby's server does Webmention discovery on Aaron's post to find its Webmention endpoint (if not found, process stops).
  8. 176 |
  9. Barnaby's server sends a Webmention notification to Aaron's post's Webmention endpoint with: 177 |
      178 |
    • source set to Barnaby's post's permalink
    • 179 |
    • target set to Aaron's post's permalink.
    • 180 |
    181 |
  10. 182 |
  11. Aaron's server receives the Webmention.
  12. 183 |
  13. Aaron's server verifies that target in the Webmention is a valid permalink on Aaron's blog (if not, processing stops).
  14. 184 |
  15. Aaron's server verifies that the source in the Webmention (when retrieved, after following redirects [[!FETCH]]) contains a hyperlink to the target (if not, processing stops).
  16. 185 |
186 | 187 |
188 |
189 | 190 |
191 |

Conformance

192 | 193 |

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", 194 | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this 195 | document are to be interpreted as described in [[!RFC2119]].

196 | 197 |
198 |

Conformance Classes

199 | 200 |

Webmention implementations are either senders or receivers. This section describes the conformance criteria for both.

201 | 202 |

Listed below are known types of Webmention implementations.

203 | 204 |

Senders

205 |

The conformance criteria for Webmention senders is described in Sending Webmentions

206 | 213 | 214 |

Receivers

215 |

The conformance criteria for Webmention receivers is described in Receiving Webmentions

216 | 221 |
222 | 223 |
224 |

Candidate Recommendation Exit Criteria

225 | 226 |

For this specification to exit the CR stage, there must be at least two independent, interoperable implementations of each feature. Each feature may be implemented by a different set of products. There is no requirement that all features be implemented by a single product. For the purposes of this criterion, we define the following terms:

227 | 228 |
229 |

Sender

230 | 231 |

A Webmention Sender is an implementation that sends Webmentions, the conformance criteria are described in Sending Webmentions. In order for a Sender to send a Webmention, there must first be a document at a URL that is accessible to the Receiver.

232 |
233 | 234 |
235 |

Receiver

236 | 237 |

A Webmention Receiver is an implementation that receives Webmentions to one or more target URLs on which the Receiver's Webmention endpoint is advertised. The conformance criteria for Receivers are described in Receiving Webmentions. In order to receive a Webmention, there must be a URL that advertises the Receiver's Webmention endpoint. The URL is not considered part of the Receiver's implementation, as it may exist in an entirely different system or domain.

238 |
239 | 240 |
241 |

Independent

242 | 243 |

Each implementation must be developed by a different party and cannot share, reuse, or derive from code used by another qualifying implementation. Sections of code that have no bearing on the implementation of this specification are exempt from this requirement.

244 |
245 | 246 |
247 |

Interoperable

248 | 249 |

A Sender and Receiver implementation are considered interoperable for a specific feature when the Sender 1) can discover the Webmention endpoint for the target URL for all specified ways of finding the endpoint (allowing the Receiver to change the way the endpoint is advertised without changing the Sender implementation), and 2) considers the Webmention request successful for all specified ways a Receiver may indicate success.

250 |
251 | 252 |
253 |

Implementation

254 | 255 |

An Implementation is a Webmention Sender or Receiver which meets all of the following criteria:

256 | 257 |
    258 |
  • implements the corresponding conformance class of the specification
  • 259 |
  • is available to the general public, as downloadable software or as a hosted service
  • 260 |
  • is not experimental (i.e. is intended for a wide audience and could be used on a daily basis)
  • 261 |
  • is suitable for a person to use as his/her primary implementation on a website
  • 262 |
263 |
264 | 265 |
266 |

Feature

267 | 268 |

For the purposes of evaluating exit criteria, each of the following is considered a feature:

269 | 270 |
    271 |
  • Sending a Webmention to a given target URL
  • 272 |
  • Re-sending Webmentions and sending new Webmentions when the source document is updated
  • 273 |
  • Re-sending Webmentions when the source document is deleted
  • 274 |
  • Receiving a Webmention request, processing it synchronously, and responding with HTTP 200
  • 275 |
  • Receiving a Webmention request, processing it asynchronously, creating a status URL and responding with HTTP 201
  • 276 |
  • Receiving a Webmention request, processing it asynchronously, and responding with HTTP 202 and no other feedback
  • 277 |
  • Updates: Receiving a Webmention from a source URL that was previously seen and updating the data it picked up from the source URL
  • 278 |
  • Delete: Receiving a Webmention from a source URL which now responds with HTTP 410
  • 279 |
280 |
281 | 282 |
283 | 284 |
285 |

Test Suite and Reporting

286 | 287 |

Please submit your implementation reports at http://webmention.net/implementation-reports/. Instructions are provided at the URL. The implementation report template references the tests available at webmention.rocks.

288 | 289 |

webmention.rocks provides many test cases you can use to live-test your implementation. It also is a good tool to use while developing a Webmention implementation, as it provides detailed responses when errors are encountered.

290 |
291 |
292 | 293 |
294 |

Webmention Protocol

295 | 296 |

This specification uses the link rel registry as defined by [[!HTML5]] 297 | for both HTML and HTTP link relations.

298 | 299 |
300 |

Sending Webmentions

301 | 302 |
303 |

Create a source document that mentions the target

304 | 305 |

Webmentions are sent "from" a source URL "to" a target URL to notify the target that it has been mentioned at the source URL. Before a Webmention can be sent, there needs to be a source URL to send the Webmention "from", often a blog post but may be any type of content.

306 | 307 |

For example, the URL at https://waterpigs.example/post-by-barnaby may contain the following HTML that has a link to Aaron's post.

308 |

<!doctype html>
309 | <html>
310 |   <body>
311 |     <a href="https://aaronpk.example/post-by-aaron">This is a great post</a>
312 |   </body>
313 | </html>
314 |           

315 |
316 | 317 |
318 |

Sender discovers receiver Webmention endpoint

319 | 320 |

The sender MUST fetch the target URL (and follow redirects [[!FETCH]]) 321 | and check for an HTTP Link header [[!RFC5988]] 322 | with a rel value of webmention. If the content type of the document 323 | is HTML, then the sender MUST look for an HTML <link> and 324 | <a> element with a rel value of webmention. If more than 325 | one of these is present, the first HTTP Link header takes precedence, 326 | followed by the first <link> or <a> 327 | element in document order. Senders MUST support all 328 | three options and fall back in this order.

329 | 330 |

The endpoint MAY be a relative 331 | URL, in which case the sender MUST resolve it relative to the 332 | target URL according to [[!URL]].

333 | 334 |

The endpoint MAY contain query string parameters, which MUST be 335 | preserved as query string parameters and MUST NOT be sent as POST body 336 | parameters when sending the Webmention request.

337 | 338 |

Senders MAY initially make an HTTP HEAD request [[!RFC7231]] to 339 | check for the Link header before making a GET request.

340 | 341 |

GET /post-by-aaron HTTP/1.1
342 | Host: aaronpk.example
343 | HTTP/1.1 200 OK
344 | Link: <http://aaronpk.example/webmention-endpoint>; rel="webmention"
345 | 
346 | <html>
347 | <head>
348 | ...
349 | <link href="http://aaronpk.example/webmention-endpoint" rel="webmention" />
350 | ...
351 | </head>
352 | <body>
353 | ....
354 | <a href="http://aaronpk.example/webmention-endpoint" rel="webmention">webmention</a>
355 | ...
356 | </body>
357 | </html>

358 | 359 |

Senders MAY customize the HTTP User Agent [[RFC7231]] used when fetching the target URL 360 | in order to indicate to the recipient that this request is made as part of Webmention discovery. 361 | In this case, it is recommended to include the string "Webmention" in the User Agent. This 362 | provides people with a pointer to find out why the discovery request was made.

363 | 364 |
365 |
366 |

Sender notifies receiver

367 | 368 |

The sender MUST post x-www-form-urlencoded [[!HTML5]] source and 369 | target parameters to the Webmention endpoint, where 370 | source is the URL of the sender's page containing a link, 371 | and target is the URL of the page being linked to.

372 | 373 |

Note that if the Webmention endpoint URL contains query string parameters, 374 | the query string parameters MUST be preserved, and MUST NOT be sent in the 375 | POST body.

376 | 377 |

The Webmention endpoint will validate and process the request, and 378 | return an HTTP status code [[!RFC7231]]. Most often, 202 Accepted 379 | or 201 Created will be returned, indicating that the 380 | request is queued and being processed asynchronously to prevent 381 | DoS attacks. If the response code is 201, the Location 382 | header will include a URL that can be used to monitor the 383 | status of the request.

384 | 385 |

Any 2xx response code MUST be considered a success.

386 | 387 |

POST /webmention-endpoint HTTP/1.1
388 | Host: aaronpk.example
389 | Content-Type: application/x-www-form-urlencoded
390 | 
391 | source=https://waterpigs.example/post-by-barnaby&
392 | target=https://aaronpk.example/post-by-aaron
393 | 
394 | 
395 | HTTP/1.1 202 Accepted

396 | 397 |
398 |
399 |

Sending Webmentions for updated posts

400 | 401 |

If the source URL was updated, the sender SHOULD re-send any previously sent Webmentions, 402 | (including re-sending a Webmention to a URL that may have been removed from the document), 403 | and SHOULD send Webmentions for any new links that appear at the URL.

404 | 405 |

This allows the recipients of Webmentions to update their display of the source document, 406 | or otherwise notify the recipient that a post that mentioned one of their URLs was updated.

407 | 408 |

When sending a Webmention when a post is updated, the sender MUST re-discover the Webmention endpoint of each target URL, in case the target has updated their Webmention endpoint.

409 | 410 |

If a response to the source URL is shown on the source URL page (e.g. as a comment), then sender SHOULD treat that as an update of the source URL and re-send any previously sent Webmentions.

411 |
412 |
413 |

Sending Webmentions for deleted posts

414 | 415 |

If the source URL was deleted, the sender SHOULD return an HTTP 410 Gone 416 | status code for the URL, and SHOULD display a "tombstone" representation of 417 | the deleted post, typically by blanking out the values of any properties in the post, and/or 418 | replacing the primary content of the post (e.g. the name and/or content of [[h-entry]]) 419 | with "Deleted". The sender SHOULD then re-send Webmentions for every previously sent 420 | Webmention for that document.

421 | 422 |

This allows receivers which may have displayed a previously received Webmention 423 | as a comment or other interaction to remove it from view if they support deletes, while 424 | providing a reasonable fallback for receivers which only support updates.

425 |
426 |
427 | 428 |
429 |

Receiving Webmentions

430 | 431 |

Upon receipt of a POST request containing the source and 432 | target parameters, the receiver SHOULD verify the parameters 433 | (see Request Verification below) and then 434 | SHOULD queue and process the request asynchronously, prevent DoS attacks. 435 | There are three possible responses to the request, depending on how the receiver 436 | processes it.

437 | 438 |

If the receiver creates a status page which the sender can use to 439 | check the status, the receiver MUST reply with an HTTP 201 Created 440 | response with a Location header pointing to the status 441 | URL. The response body MAY contain content.

442 | 443 |

HTTP/1.1 201 Created
444 | Location: http://aaronpk.example/webmention/DEhB9Jme

445 | 446 |

If the receiver processes the request asynchronously but does not 447 | return a status URL, the receiver MUST reply with an HTTP 202 Accepted 448 | response. The response body MAY contain content, in which case a 449 | human-readable response is recommended.

450 | 451 |

HTTP/1.1 202 Accepted

452 | 453 |

If the receiver chooses to process the request and perform the 454 | verification step synchronously (not recommended), it MUST respond 455 | with a 200 OK status on success.

456 | 457 |
458 |

Request Verification

459 | 460 |

The receiver MUST check that source and target are valid URLs [[!URL]] 461 | and are of schemes that are supported by the receiver. (Most 462 | commonly this means checking that the source and target 463 | schemes are http or https).

464 | 465 |

The receiver MUST reject the request if the source URL is the same as the target URL.

466 | 467 |

The receiver SHOULD check that target is a valid resource for which 468 | it can accept Webmentions. This check SHOULD happen 469 | synchronously to reject invalid Webmentions before more in-depth 470 | verification begins. What a 'valid resource' means is up to the receiver. For example, 471 | some receivers may accept Webmentions for multiple domains, others may accept 472 | Webmentions for only the same domain the endpoint is on.

473 | 474 |

Note that a target URL may contain a fragment identifier, and if the 475 | receiver limits which URLs can receive Webmentions, the fragment SHOULD be 476 | ignored when checking if the URL is supported.

477 |
478 | 479 |
480 |

Webmention Verification

481 | 482 |

Webmention verification SHOULD be handled asynchronously to 483 | prevent DoS attacks.

484 | 485 |

If the receiver is going to use the Webmention in some way, 486 | (displaying it as a comment on a post, incrementing a "like" 487 | counter, notifying the author of a post), then it MUST perform an 488 | HTTP GET request on source, following any HTTP redirects (and SHOULD 489 | limit the number of redirects it follows) to confirm that it actually 490 | mentions the target. The receiver SHOULD include an HTTP Accept header 491 | indicating its preference of content types that are acceptable.

492 | 493 |

The receiver SHOULD use per-media-type rules to determine whether 494 | the source document mentions the target URL. For example, in an 495 | [[HTML5]] document, the receiver should look for <a href="*">, 496 | <img href="*">, <video src="*"> 497 | and other similar links. In a [[JSON]] document, the receiver should 498 | look for properties whose values are an exact match for the URL. 499 | If the document is plain text, the receiver should look for the URL 500 | by searching for the string. Other content types may be handled at 501 | the implementer's discretion. The source document MUST have an exact 502 | match of the target URL provided in order for it to be considered a 503 | valid Webmention.

504 | 505 |

At this point, the receiver MAY publish content from the source page 506 | on the target page or other pages, along with any other data it picks 507 | up from the source. For example, the receiver may display the 508 | contents of the source as a comment on the post, or may display the author's 509 | profile photo in a list of others who have sent similar Webmentions, e.g. 510 | showing a list of people who have all "liked" a post.

511 |
512 | 513 |
514 |

Error Responses

515 | 516 |

If the Webmention was not successful because of something the 517 | sender did, it MUST return a 400 Bad Request 518 | status code and MAY include a description of the error in the response body.

519 | 520 |

Possible sender-related errors that can be returned synchronously 521 | before making a GET request to the source: 522 | 523 |

    524 |
  • Specified target URL not found.
  • 525 |
  • Specified target URL does not accept Webmentions.
  • 526 |
  • source URL was malformed or is not a supported URL scheme (e.g. a mailto: link)
  • 527 |
528 |

529 | 530 |

Possible sender-related errors that can occur after fetching the 531 | contents of the source URL: 532 | 533 |

    534 |
  • source URL not found.
  • 535 |
  • source URL does not contain a link to the target URL.
  • 536 |
537 |

538 | 539 |

If the Webmention was not successful because of an error on 540 | the receiver's server, it SHOULD return a 500 Internal Server Error 541 | status code and MAY include a description of the error in the response body.

542 | 543 |
544 | 545 |
546 |

Updating existing Webmentions

547 | 548 |

If receiver had received a Webmention in the past with the same 549 | source and target then, 550 | 551 |

    552 |
  • 553 | If both the verification steps are successful, it SHOULD update any existing data it picked from source for the existing Webmention. 554 |
      555 |
    • 556 | When a Webmention implementation does support updating (i.e., a "Webmention update implementation"), it MUST support updating data from properties of the primary object of the source. (e.g. properties of the [[h-entry]] of the page). 557 |
        558 |
      • 559 | A Webmention update implementation MAY support updating data from children, or other descendant objects of the primary object (e.g. a comment h-entry inside the h-entry of the page). Note: Implementations that support this may wish to consider supporting it according to the [[Salmention]] extension. 560 |
      • 561 |
      562 |
    • 563 |
    564 |
  • 565 | 566 |
  • If it received a 410 Gone status code on step 2 (performing a GET request on source), or received a 200 OK status code and does not find a mention of target on source, it SHOULD delete the existing Webmention, or mark it as deleted.
  • 567 | 568 |
  • Processing Webmentions SHOULD be idempotent. That is, receiving multiple Webmentions for the same source and target with no content changes should not show as multiple replies.
  • 569 |
570 |

571 |
572 | 573 |
574 |
575 | 576 |
577 |

Security Considerations

578 | 579 |
580 |

Preventing Abuse

581 | 582 | 588 |
589 | 590 |
591 |

Limits on GET requests

592 | 593 |

The Webmention protocol relies on the sender making a GET (or HEAD) 594 | request to discover the receiver's endpoint, followed by the receiver 595 | making a GET request to the sender's web page to verify the link. 596 | This means a sender can cause a receiver to make GET requests to 597 | arbitrary URLs, opening up a potential DoS vector.

598 |

Receivers MAY make an initial HTTP HEAD request when verifying the link 599 | and decide whether to make a full GET request after initially inspecting 600 | the content type, length, or other HTTP headers returned.

601 |

Receivers SHOULD place limits on the number of HTTP redirects they follow, 602 | for example limiting the number to 20, in order to prevent being stuck 603 | in a redirect loop if the sender continues to send redirects.

604 |

Receivers SHOULD place limits on the amount of data and time they 605 | spend fetching unverified source URLs. For example, if a source URL 606 | doesn't respond within 5 seconds, it can treat that as a failure. 607 | Similarly, the receiver can fetch only the first 1mb of the page, 608 | since any reasonable HTML or JSON page will be smaller than that.

609 |
610 | 611 |
612 |

Avoid sending Webmentions to localhost

613 | 614 |

When the sender discovers the receiver's Webmention endpoint, there 615 | is no legitimate reason for the endpoint to be localhost or any other loopback 616 | address. If the sender has any services that listen on localhost that 617 | don't require authentication, it's possible for a malicious Webmention 618 | receiver to craft a Webmention endpoint that could cause the sender to 619 | make an arbitrary POST request to itself.

620 |

During the discovery step, if the sender discovers the endpoint is 621 | localhost or a loopback IP address (127.0.0.0/8), it SHOULD NOT send 622 | the Webmention.

623 |
624 | 625 |
626 |

Cross-Site Request Forgery

627 | 628 |

This specification does not define any special handling of a Webmention request 629 | that may contain additional headers or parameters such as authentication headers 630 | or session cookies. However, if a Webmention endpoint does accept requests 631 | with additional headers, it SHOULD protect itself against Cross-Site 632 | Request Forgery (CSRF) attacks. One way to prevent CSRF attacks is by including 633 | a CSRF token in a query string parameter of the Webmention endpoint, so that 634 | a Webmention sender finds the token when discovering the endpoint.

635 | 636 |

For example, the target URL could advertise a Webmention endpoint that includes 637 | a CSRF token:

638 | 639 |

GET /post-by-aaron HTTP/1.1
640 | Host: aaronpk.example
641 | HTTP/1.1 200 OK
642 | Link: <http://aaronpk.example/webmention?csrf=Q0NTVhYjI0NTVkNDA3M>; rel="webmention"

643 | 644 |

Then, when the Webmention endpoint is processing a request, it can first check 645 | the validity of the CSRF token before any other processing.

646 |
647 | 648 |
649 |

Limit access to protected resources

650 | 651 |

It is possible for an attacker to advertise a Webmention endpoint that points to an arbitrary URL. As such, if you install software that sends Webmentions on a server that is behind a firewall or otherwise has access to normally protected resources, you should be aware that an attacker can cause the server to send a POST request to an internal server. You SHOULD take precautions to ensure this server cannot access protected resources by either:

652 | 653 | 657 |
658 | 659 |
660 |

Security and Privacy Review

661 | 662 |

These questions provide an overview of security and privacy considerations for this specification as guided by Self-Review Questionnaire: Security and Privacy ([[security-privacy-questionnaire]]).

663 | 664 |
665 |
Does this specification deal with personally-identifiable information?
666 |
The only potentially personally-identifiable information involved in Webmention are the source and target URLs.
667 |
Does this specification deal with high-value data?
668 |
No, there is no authentication or other credentials involved.
669 |
Does this specification introduce new state for an origin that persists across browsing sessions?
670 |
No
671 |
Does this specification expose persistent, cross-origin state to the web?
672 |
The Webmention receiver may create a temporary resource with information about the Webmention request.
673 |
Does this specification expose any other data to an origin that it doesn't currently have access to?
674 |
No
675 |
Does this specification enable new script execution/loading mechanisms?
676 |
No
677 |
Does this specification allow an origin access to a user's location?
678 |
No
679 |
Does this specification allow an origin access to sensors on a user's device?
680 |
No
681 |
Does this specification allow an origin access to aspects of a user's local computing environment?
682 |
No
683 |
Does this specification allow an origin access to other devices?
684 |
No
685 |
Does this specification allow an origin some measure of control over a user agent's native UI?
686 |
No
687 |
Does this specification expose temporary identifiers to the web?
688 |
No
689 |
Does this specification distinguish between behavior in first-party and third-party contexts?
690 |
No
691 |
How should this specification work in the context of a user agent's "incognito" mode?
692 |
Webmention does not maintain any state so there are no considerations when in "incognito" mode.
693 |
Does this specification persist data to a user's local device?
694 |
No
695 |
Does this specification allow downgrading default security characteristics?
696 |
No
697 |
698 |
699 | 700 |
701 | 702 |
703 |

Other Considerations

704 | 705 |
706 |

Sending Webmentions from non-HTML content

707 | 708 |

If your source document is not HTML, (such as a PDF), or is otherwise restricted from fetching the raw source via a plain HTTP GET request, (such as behind a paywall, or requires a click-through license agreement), you will need to set up an HTML "landing page" that lists all the targets you wish to send Webmentions to. After creating this HTML landing page, you can use its URL as the source URL when sending Webmentions. This gives receivers a URL they can fetch to verify the link to their target URL, while avoiding making the complete source document public.

709 | 710 |

Creating an HTML landing page can help increase the number of inbound links to your content, by providing people with a useful place to link to when referencing otherwise restricted content such as scholarly articles. In the case of a scholarly article, the landing page should include the list of references in the HTML, so that you can use them as Webmention target URLs.

711 |
712 | 713 |
714 |

Respecting cache headers on discovery

715 | 716 |

When performing Webmention discovery, Senders SHOULD respect the HTTP cache headers [[RFC7234]] returned by the target URL and avoid fetching the target URL more often than is indicated by the headers.

717 |
718 |
719 | 720 |
721 |

IANA Considerations

722 | 723 |

The link relation type below has been registered by IANA per Section 724 | 6.2.1 of [[!RFC5988]]:

725 | 726 |
727 | 728 |
Relation Name:
729 |
webmention
730 | 731 |
Description:
732 |
Identifies a target URI that supports the Webmention protocol. This 733 | allows clients that mention a resource in some form of publishing 734 | process to contact that endpoint and inform it that this resource has 735 | been mentioned.
736 | 737 |
Reference:
738 |
W3C Webmention 739 | Specification (http://www.w3.org/TR/webmention/)
740 | 741 |
Notes:
742 |
This is a similar "Linkback" mechanism to the ones of Refback, 743 | Trackback, and Pingback. It uses a different protocol, though, and thus 744 | should be discoverable through its own link relation type.
745 | 746 |
747 |
748 | 749 |
750 |

URIs for Form-Encoded Properties

751 | 752 |

If your implementation wants to treat the source and target parameters as URIs, you can prefix the terms with http://www.w3.org/ns/webmention#.

753 |
754 | 755 |
756 |

Extensions

757 | 758 |

The following Webmention Extension Specifications have 2+ interoperable implementations live on the web and are thus listed here:

759 | 760 |
761 |

Vouch

762 |

The [[Vouch]] protocol is an anti-spam extension to Webmention.

763 |
764 | 765 |
766 |

Salmention

767 |

The [[Salmention]] protocol is an extension to Webmention to propagate comments and other interactions upstream.

768 |
769 | 770 |
771 |

Private Webmention

772 |

The [[Private-Webmention]] protocol is an extension to Webmention that supports sending and verifying Webmentions for posts that have access control.

773 |
774 | 775 |
776 | 777 |
778 |

Resources

779 | 780 |

781 |

788 |

789 | 790 |
791 |

Articles

792 | 793 |

You can find a list of articles about Webmention on the IndieWeb wiki.

794 |
795 | 796 |
797 |

Implementations

798 | 799 |

You can find a list of Webmention implementations on webmention.net

800 |
801 | 802 |
803 | 804 |
805 |

Acknowledgements

806 | 807 |

The editor wishes to thank Sandeep Shetty 808 | for contributing the original draft of the Webmention specification.

809 |

Additionally, the editor wishes to thank the IndieWeb 810 | community and other implementers for their support, encouragement and enthusiasm, 811 | including but not limited to: Amy Guy, Benjamin Roberts, Ben Werdmüller, Dave Wilkinson, Rob Sanderson, and Tantek Çelik.

812 |
813 | 814 |
815 |

Change Log

816 | 817 |
818 |

Changes from 24 May 2016 CR to this version

819 | 820 | 837 |
838 | 839 |
840 |

Changes from 29 April 2016 WD to 24 May 2016 CR

841 | 842 | 847 |
848 | 849 |
850 |

Changes from 20 April 2016 WD to 29 April 2016 WD

851 | 852 | 859 |
860 | 861 |
862 |

Changes from 29 March 2016 WD to 20 April 2016 WD

863 | 864 | 872 |
873 | 874 |
875 |

Changes from 1 March 2016 WD to 29 March 2016 WD

876 | 877 | 885 |
886 | 887 |
888 |

Changes from 12 January 2016 FPWD to 1 March 2016 WD

889 | 890 |

This section lists changes from the 12 January 2016 FPWD to this Working Draft

891 | 892 | 900 |
901 |
902 | 903 | 904 | 905 | -------------------------------------------------------------------------------- /implementation-reports/summary/index.html: -------------------------------------------------------------------------------- 1 | 2 |
ABCDEFGHIJKLMNOPQRSTUVWXYZAAAB
1
10
Editor(s)
Member(s)
Outside WG
2
Sender TestsImplsPostlyFalconBridgyGravKakuKnown
3
Discovery #1811111111
4
Discovery #29111111111
5
Discovery #3101111111111
6
Discovery #4101111111111
7
Discovery #5101111111111
8
Discovery #6101111111111
9
Discovery #79111111111
10
Discovery #8101111111111
11
Discovery #99111111111
12
Discovery #109111111111
13
Discovery #11101111111111
14
Discovery #12101111111111
15
Discovery #13811111111
16
Discovery #14101111111111
17
Discovery #15811111111
18
Discovery #16101111111111
19
Discovery #17811111111
20
Discovery #18101111111111
21
Discovery #199111111111
22
Discovery #209111111111
23
Discovery #21101111111111
24
Sending Accept 200101111111111
25
Sending Accept 201101111111111
26
Sending Accept 202101111111111
27
Update #171111111
28
Update #26111111
29
Delete #16111111
30
Avoid Loopback511111
31
Salmention Extension211
32
Vouch Extension3111
33
11
34
Receiver TestsImplsPostlyBridgyGravKakuKnown
35
Responds with 20041111
36
Responds with 2013111
37
Responds with 20271111111
38
Rejects invalid URLs101111111111
39
Verifies target is a valid resource71111111n/a
40
Ignores fragment811111111
41
Processed Async811111111
42
Follows one redirect1111111111111
43
Self-imposed limit on redirects101111111111
44
Source URL HTML content type1111111111111
45
Source URL text content type511111
46
HTML verification <a>1111111111111
47
HTML verification <img>71111111
48
HTML verification <video>71111111
49
HTML verification <audio>71111111
50
HTML verification reject text511111
51
HTML verification reject link in comment41111
52
HTML verification no URL101111111111
53
Displays data811111111
54
Recognizes "in-reply-to"9111111111
55
Recognizes a "like"9111111111
56
Recognizes a "repost"9111111111
57
Recognizes an "RSVP"6111111
58
Does not treat an update as a new comment
101111111111
59
Removes the response when update has no link
6111111
60
Updates information from the primary object
9111111111
61
Updates information from children211
62
Recognizes HTTP 410 as delete6111111
63
Moderated before being displayed3111
64
Periodically re-verified*11
65
Filters/encodes to prevent XSS811111111
66
Self-imposed limit on time fetching9111111111
67
Self-imposed limit on bytes fetched3111
68
Accepts additional parameters, so has CSRF protection
3111
69
Salmention extension211
70
Vouch extension3111
71
72
* this feature does not affect interoperability
3 | 40 | --------------------------------------------------------------------------------