From 6ccee544a4d35e8c28fb81c47eb7d359ace08191 Mon Sep 17 00:00:00 2001 From: Daniel Siders Date: Mon, 17 Sep 2012 14:46:10 -0400 Subject: [PATCH] added to docs, diagram --- Gemfile | 1 + Gemfile.lock | 2 + content/assets/images/diagram.png | Bin 0 -> 51878 bytes content/docs/app-auth.md | 7 ++-- content/docs/index.md | 66 ++++++++++++++++++------------ content/docs/server-protocol.md | 7 +++- layouts/doc.slim | 2 + 7 files changed, 52 insertions(+), 33 deletions(-) create mode 100644 content/assets/images/diagram.png diff --git a/Gemfile b/Gemfile index de2d5ec..b64b012 100644 --- a/Gemfile +++ b/Gemfile @@ -16,3 +16,4 @@ gem 'adsf' gem 'builder' gem 'tent-schemas', :git => 'git://github.com/tent/tent-schemas.git', :branch => 'master' gem 'pygments.rb', :git => 'git://github.com/akzhan/pygments.rb.git', :branch => 'rubypython-0.6' +gem 'fssm', :groups => :development diff --git a/Gemfile.lock b/Gemfile.lock index 79289ff..d81911d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -27,6 +27,7 @@ GEM cri (2.3.0) colored (>= 1.2) ffi (1.0.11) + fssm (0.2.9) json-schema (1.0.9) mime-types (1.19) nanoc (3.4.0) @@ -56,6 +57,7 @@ DEPENDENCIES adsf builder clogger + fssm mime-types nanoc nanoc-cachebuster diff --git a/content/assets/images/diagram.png b/content/assets/images/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..92cef0421969f58de5f6a4859f76331011f4a2b7 GIT binary patch literal 51878 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 Yq-VZZPwIB>2nv4~TXq{}8Q2B?8y99xga7~l literal 0 HcmV?d00001 diff --git a/content/docs/app-auth.md b/content/docs/app-auth.md index 7c8a01e..25cab87 100644 --- a/content/docs/app-auth.md +++ b/content/docs/app-auth.md @@ -5,17 +5,16 @@ title: App Authentication ## App Authentication Tent uses [OAuth 2](http://tools.ietf.org/html/draft-ietf-oauth-v2-31) for app -authentication. Because of the distributed nature of Tent, it is necessary for -apps to register with the Tent entity before doing the authentication flow. +authentication. Because of the distributed nature of Tent, +apps must register with the Tent entity before starting the authentication flow. -After the authentication flow, requests are authenticated using the credentials +After the authentication flow is complete, requests are authenticated using the credentials with [MAC Access Authentication](http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01). ### App Registration - Before authenticating a user, the application must be registered with the specified Tent entity. The first step is to perform discovery on the provided entity url. diff --git a/content/docs/index.md b/content/docs/index.md index 2ea8bc6..a361e26 100644 --- a/content/docs/index.md +++ b/content/docs/index.md @@ -1,14 +1,6 @@ --- title: Protocol Introduction --- - -## The Tent Protocol - -Tent is a protocol for decentralized social networking. It allows you to control your data, who has access to it, and what can be done with it. - -Anyone can run a Tent server or write a Tent app. There are Tent hosts for users who do not want to manage a server. - - ### API Overview Tent is a social layer over HTTP using [JSON](http://en.wikipedia.org/wiki/JSON). @@ -30,8 +22,8 @@ a Tent profile (e.g. `https://tent.johnsmith.me/profile`) ### Servers -Tent servers are the protocol core. They represent the users and maintain their data and relationships. Servers also handle these responsibilities: - +Tent **servers** are the protocol core. They represent the users and maintain their data and relationships. Servers also handle these responsibilities: + - Persisting data - Notifying other servers about new data - Ensuring content is only pushed to recipients accepting associated licences @@ -40,40 +32,60 @@ Tent servers are the protocol core. They represent the users and maintain their - Authorizing apps to access data - Notifying apps about new or modified data to which they have access -tentd is the current reference Tent server. +[tentd](https://github.com/tent/tentd) is the current reference Tent server. ### Apps -Users create and view content on apps. Apps must authenticate with the user's server before content can be posted or viewed. +Users create and view **posts** and **profiles** on **apps**. Apps must authenticate with the user's server before content can be posted or viewed. -For example: +The Process: -1. ian-hanson.me (Ian) posts a status update (post) from a micro blogging app authenticated with his server. -2. The app publishes the post to his server. -3. His server sends a notification to every server following him or mentioned in the post with permission to see the post. -4. If anna-collins.me (Anna) is following Ian, her server will receive a notification from Ian’s server containing the post. -5. If Anna has an app setup for consuming status updates, her server will send it a notification with Ian’s post. -6. Anna can now read Ian’s post from the status app. -7. If Anna decides to reply, her response will follow a path inverse to Ian’s post. +1. User A creates a `status` post on her app. +2. App sends posts to user A's server. +3. User A's Server sends post notifications to all users who follow User A's `status` posts and users mentioned in this post. The server will not send notifications to users not allowed in the post's permissions. +4. The servers operated by user A's followers each receive this notification. +5. These servers each send the post to the appropriate app(s). +6. The following users can view the post on their apps. TentStatus is an open source Tent app for creating and viewing status posts. ### Posts -Posts are at the core of Tent. They are sent to followers immediately after being created. Users set permissions on each post that determine which other users can access them. Other users can fetch public posts individually or over a date range. Posts each have a post type which describes its data. Tent posts can be used to describe anything, and developers can create new post types for different kinds of media, interactions, or applications. This documentation describes four basic post types: **status**, short messages of 140 characters or less, **essay**, longer form writing, **photo**, pictures, and **album**, a collection of **photo** posts. +**Posts** are at the core of Tent. Posts are sent to followers immediately after being created. + +Users set permissions on each post that determine which other users can access them. Other users can fetch public posts individually or over a date range. + +Post types describe the format and content of each post. Tent posts can be used for almost anything, and developers can create new post types for different kinds of media, interactions, or applications. + +This documentation describes four basic post types: `status`, short messages of 140 characters or less, `essay`, longer form writing, `photo`, pictures, and `album`, a collection of `photo` posts. ### Profiles -Every Tent entity's server has a profile JSON file describing it. They store information about the user, specifically static information that should always be accessible. +Every Tent entity's server has a **profile** JSON file describing it. Profiles store information about the user, specifically static information that should always be accessible. -The most basic profile -has a single object containing the Tent version, the entity name (e.g. +The most basic profile has a single object containing the Tent version, the entity name (e.g. johnsmith.me), an array of supported licences, and an array of servers containing canonical API roots. -A user may have multiple versions of the same info type in your profile. +A user may have multiple versions of the same info type in their profile. ### Notifications -Tent notifications are used when a server needs to let another server or app -know about new content updates. This includes new posts and profile changes. Notifications are JSON POST requests containing posts. \ No newline at end of file +Tent **notifications** are used when a server needs to let another server or app +know about new content updates. This includes new posts and profile changes. Notifications are JSON POST requests containing posts. A new notification is sent for event (post, following event, profile change). + +### Example + +https://cloudmir.com/ (Lindsay) and https://titanous.com (Jonathan) are both following https://daniel.tent.is (Daniel) and have requested all his status posts. + +2. https://daniel.tent.is creates a `status` post on TentStatus in which he mentions another user, https://jesse.tent.is (Jesse). + +3. TentStatus sends this post to Daniel's server. + +4. Daniel's server sends post notifications to Lindsay and Jonathan, because they follow Daniel and requested all `status` posts he creates, and Jesse, because the post mentions him. + +5. Lindsay, Jonathan, and Jesse's servers receive the post and send a copy of the post to TentStatus, the application they each have configures to read `status` posts. + +6. Lindsay, Jonathan, and Jesse can each read, reply to, repost, or ignore the post as they wish. + +![diagram](/assets/images/diagram.png) \ No newline at end of file diff --git a/content/docs/server-protocol.md b/content/docs/server-protocol.md index b315294..192cf3a 100644 --- a/content/docs/server-protocol.md +++ b/content/docs/server-protocol.md @@ -3,7 +3,7 @@ This document describes the protocol that Tent servers use to communicate with each other. -###Basics +### Basics Every Tent user is represented by a server. Servers establish and maintain relationships and exchange content between users. @@ -28,7 +28,10 @@ Link: ; rel="https://tent.io/rels/profile" ``` or ```text -Link: ; rel="https://tent.io/rels/profile", ; rel="https://tent.io/rels/profile", ; rel="https://tent.io/rels/profile" +Link: ; rel="https://tent.io/rels/profile", +; rel="https://tent.io/rels/profile", + +; rel="https://tent.io/rels/profile" ``` #### HTML `link` tag diff --git a/layouts/doc.slim b/layouts/doc.slim index 6ca5a9f..85d1690 100644 --- a/layouts/doc.slim +++ b/layouts/doc.slim @@ -16,6 +16,8 @@ html lang='en' li == nav_link_with_active 'Post Types', '/docs/post-types' li == nav_link_with_active 'Profile Info Types', '/docs/info-types' .span8 + .lead + p Tent is a protocol for decentralized social networking. .alert.alert-block h4 Alpha Documentation p These docs are very rough, incorrect, and incomplete. They will be modified heavily over the next few weeks.