diff --git a/doc/Home.md b/doc/Home.md index d0f95d076..437486e02 100644 --- a/doc/Home.md +++ b/doc/Home.md @@ -7,11 +7,11 @@ Friendica Documentation and Resources * [Account Basics](help/Account-Basics) * [New User Quick Start](help/Quick-Start-guide) * [Creating posts](help/Text_editor) - * [BBCode tag reference](help/BBCode) + * [BBCode tag reference](help/BBCode) * [Comment, sort and delete posts](help/Text_comment) * [Profiles](help/Profiles) * [Accesskey reference](help/Accesskeys) - * [Events](help/events) + * [Events](help/events) * You and other users * [Connectors](help/Connectors) * [Making Friends](help/Making-Friends) @@ -31,9 +31,7 @@ Friendica Documentation and Resources * [Settings & Admin Panel](help/Settings) * [Installing Connectors (Twitter/GNU Social)](help/Installing-Connectors) * [Install an ejabberd server (XMPP chat) with synchronized credentials](help/install-ejabberd) -* [Message Flow](help/Message-Flow) * [Using SSL with Friendica](help/SSL) -* [Twitter/GNU Social API Functions](help/api) * [Config values that can only be set in .htconfig.php](help/htconfig) **Developer Manual** @@ -46,9 +44,11 @@ Friendica Documentation and Resources * [Plugin Development](help/Plugins) * [Theme Development](help/themes) * [Smarty 3 Templates](help/smarty3-templates) +* [Protocol Documentation](help/Protocol) * [Database schema documantation](help/database) * [Class Autoloading](help/autoloader) * [Code - Reference(Doxygen generated - sets cookies)](doc/html/) +* [Twitter/GNU Social API Functions](help/api) **External Resources** diff --git a/doc/Message-Flow.md b/doc/Message-Flow.md index ce0a4248a..9a6785d59 100644 --- a/doc/Message-Flow.md +++ b/doc/Message-Flow.md @@ -4,7 +4,7 @@ Friendica Message Flow This page documents some of the details of how messages get from one person to another in the Friendica network. There are multiple paths, using multiple protocols and message formats. -Those attempting to understand these message flows should become familiar with (at the minimum) the [DFRN protocol document](http://dfrn.org/dfrn.pdf) and the message passing elements of the OStatus stack (salmon and Pubsubhubbub). +Those attempting to understand these message flows should become familiar with (at the minimum) the [DFRN protocol document](https://github.com/friendica/friendica/blob/master/spec/dfrn2.pdf) and the message passing elements of the OStatus stack (salmon and Pubsubhubbub). Most message passing involves the file include/items.php, which has functions for several feed-related import/export activities. @@ -21,8 +21,8 @@ Push (pubsubhubbub) feeds arrive via mod/pubsub.php DFRN-poll feed imports arrive via include/poller.php as a scheduled task, this implements the local side of the DFRN-poll protocol. -Scenario #1. Bob posts a public status message ---- +### Scenario #1. Bob posts a public status message + This is a public message with no conversation members so no private transport is used. There are two paths it can take - as a bbcode path to DFRN clients, and converted to HTML with the server's PuSH (pubsubhubbub) hubs notified. When a PuSH hub is operational, dfrn-poll clients prefer to receive their information through the PuSH channel. @@ -30,31 +30,31 @@ They will fall back on a daily poll in case the hub has delivery issues (this is If there is no specified hub or hubs, DFRN clients will poll at a configurable (per-contact) rate at up to 5-minute intervals. Feeds retrieved via dfrn-poll are bbcode and may also contain private conversations which the poller has permissions to see. -Scenario #2. Jack replies to Bob's public message. Jack is on the Friendica/DFRN network. ---- +### Scenario #2. Jack replies to Bob's public message. Jack is on the Friendica/DFRN network. + Jack uses dfrn-notify to send a direct reply to Bob. Bob then creates a feed of the conversation and sends it to everybody involved in the conversation using dfrn-notify. PuSH hubs are notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks). -Scenario #3. Mary replies to Bob's public message. Mary is on the Friendica/DFRN network. ---- +### Scenario #3. Mary replies to Bob's public message. Mary is on the Friendica/DFRN network. + Mary uses dfrn-notify to send a direct reply to Bob. Bob then creates a feed of the conversation and sends it to everybody involved in the conversation (excluding himself, the conversation is now sent to both Jack and Mary). Messages are sent using dfrn-notify. Push hubs are also notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks). -Scenario #4. William replies to Bob's public message. William is on the OStatus network. ---- +### Scenario #4. William replies to Bob's public message. William is on the OStatus network. + William uses salmon to notify Bob of the reply. Content is html embedded in salmon magic envelope. Bob then creates a feed of the conversation and sends it to all Friendica participants involved in the conversation using dfrn-notify (excluding himself, the conversation is sent to both Jack and Mary). Push hubs are notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks). -Scenario #5. Bob posts a private message to Mary and Jack. ---- +### Scenario #5. Bob posts a private message to Mary and Jack. + Message is delivered immediately to Mary and Jack using dfrn_notify. Public hubs are not notified. Requeueing is attempted in case of timeout. diff --git a/doc/Protocol.md b/doc/Protocol.md new file mode 100644 index 000000000..86ed027d6 --- /dev/null +++ b/doc/Protocol.md @@ -0,0 +1,40 @@ +Used Protocols +=============== + +Friendicas DFRN Protocol +--- + +* [Document with the DFRN specification](spec/dfrn2.pdf) +* [Schema of the contact request process](spec/dfrn2_contact_request.png) +* [Schema of the contact request confirmation](spec/dfrn2_contact_confirmation.png) +* [Description of the message flow](help/Message-Flow) + +ActivityStreams +--- + +Friendica is using ActivityStreams in version 1.0 for its activities and object types. +Additional types are used for non standard activities. + +* [Link to the specification](http://activitystrea.ms/head/activity-schema.html) +* [List of used ActivityStreams verbs and object types.](https://github.com/friendica/friendica/wiki/ActivityStreams) + +Salmon +--- + +Salmon is used as a message exchange protocol for replies and mentions. + +* [Link to the protocol summary](http://www.salmon-protocol.org/salmon-protocol-summary) + +Portable Contacts +--- + +Portable Contacts is used for friends lists. + +* [Link to the specification](https://web.archive.org/web/20160426223008/http://portablecontacts.net/draft-spec.html) (Link to archive.org) + +pubsubhubbub +--- + +pubsubhubbub is used for OStatus. + +* [Link to the specification](https://pubsubhubbub.github.io/PubSubHubbub/pubsubhubbub-core-0.4.html) diff --git a/doc/de/Home.md b/doc/de/Home.md index 68c026e5c..6023e3cdc 100644 --- a/doc/de/Home.md +++ b/doc/de/Home.md @@ -26,32 +26,31 @@ Friendica - Dokumentation und Ressourcen * [Bugs und Probleme](help/Bugs-and-Issues) * [Häufig gestellte Fragen (FAQ)](help/FAQ) -**Technische Dokumentation** +**Dokumentation für Administratoren** * [Installation](help/Install) * [Konfigurationen & Admin-Panel](help/Settings) * [Plugins](help/Plugins) * [Konnektoren (Connectors) installieren (Twitter/GNU Social)](help/Installing-Connectors) * [Installation eines ejabberd Servers (XMPP-Chat) mit synchronisierten Anmeldedaten](help/install-ejabberd) (EN) -* [Nachrichtenfluss](help/Message-Flow) * [Betreibe deine Seite mit einem SSL-Zertifikat](help/SSL) -* [Entwickler](help/Developers) -* [Twitter/GNU Social API Functions](help/api) (EN) -* [Translation of Friendica](help/translations) (EN) * [Konfigurationswerte, die nur in der .htconfig.php gesetzt werden können](help/htconfig) (EN) -**Entwickler Dokumentation** +**Dokumentation für Entwickler** -* [Where to get started?](help/Developers-Intro) +* [Entwickler](help/Developers) +* [Where to get started?](help/Developers-Intro) (EN) * [Help on Github](help/Github) * [Help on Vagrant](help/Vagrant) -* [How to translate Friendica](help/translations) +* [How to translate Friendica](help/translations) (EN) * [Bugs and Issues](help/Bugs-and-Issues) * [Plugin Development](help/Plugins) * [Theme Development](help/themes) * [Smarty 3 Templates](help/smarty3-templates) +* [Protokoll Dokumentation](help/Protocol) (EN) * [Datenbank-Schema](help/database) * [Code-Referenz (mit doxygen generiert - setzt Cookies)](doc/html/) +* [Twitter/GNU Social API Functions](help/api) (EN) **Externe Ressourcen** diff --git a/doc/de/Message-Flow.md b/doc/de/Message-Flow.md index 0694db134..3d4c912cc 100644 --- a/doc/de/Message-Flow.md +++ b/doc/de/Message-Flow.md @@ -6,7 +6,7 @@ Friendica Nachrichtenfluss Diese Seite soll einige Infos darüber dokumentieren, wie Nachrichten innerhalb von Friendica von einer Person zur anderen übertragen werden. Es gibt verschiedene Pfade, die verschiedene Protokolle und Nachrichtenformate nutzen. -Diejenigen, die den Nachrichtenfluss genauer verstehen wollen, sollten sich mindestens mit dem DFRN-Protokoll (http://dfrn.org/dfrn.pdf) und den Elementen zur Nachrichtenverarbeitung des OStatus Stack informieren (salmon und Pubsubhubbub). +Diejenigen, die den Nachrichtenfluss genauer verstehen wollen, sollten sich mindestens mit dem DFRN-Protokoll ([Dokument mit den DFRN Spezifikationen](https://github.com/friendica/friendica/blob/master/spec/dfrn2.pdf)) und den Elementen zur Nachrichtenverarbeitung des OStatus Stack informieren (salmon und Pubsubhubbub). Der Großteil der Nachrichtenverarbeitung nutzt die Datei include/items.php, welche Funktionen für verschiedene Feed-bezogene Import-/Exportaktivitäten liefert. @@ -24,7 +24,7 @@ PuSh-Feeds (pubsubhubbub) kommen via mod/pubsub.php an. DFRN-poll Feed-Imports kommen via include/poller.php als geplanter Task an, das implementiert die lokale Bearbeitung (local side) des DFRN-Protokolls. -Szenario #1. Bob schreibt eine öffentliche Statusnachricht +### Szenario #1. Bob schreibt eine öffentliche Statusnachricht Dies ist eine öffentliche Nachricht ohne begrenzte Nutzerfreigabe, so dass keine private Übertragung notwendig ist. Es gibt zwei Wege, die genutzt werden können - als bbcode an DFRN-Clients oder als durch den Server konvertierten HTML-Code (mit PuSH; pubsubhubbub). @@ -33,13 +33,13 @@ Sie fallen zurück auf eine tägliche Abfrage, wenn der Hub Übertragungsschwier Wenn kein spezifizierter Hub oder Hubs ausgewählt sind, werden DFRN-Clients in einer pro Kontakt konfigurierbaren Rate mit bis zu 5-Minuten-Intervallen abfragen. Feeds, die via DFRN-Poll abgerufen werden, sind bbcode und können auch private Unterhaltungen enthalten, die vom Poller auf ihre Zugriffsrechte hin geprüft werden. -Szenario #2. Jack antwortet auf Bobs öffentliche Nachricht. Jack ist im Friendica/DFRN-Netzwerk. +### Szenario #2. Jack antwortet auf Bobs öffentliche Nachricht. Jack ist im Friendica/DFRN-Netzwerk. Jack nutzt dfrn-notify, um eine direkte Antwort an Bob zu schicken. Bob erstellt dann einen Feed der Unterhaltung und sendet diesen an jeden, der an der Unterhaltung beteiligt ist und dfrn-notify nutzt. Die PuSH-Hubs werden darüber informiert, dass neuer Inhalt verfügbar ist. Der/die Hub/s erhalten dann die neuesten Feeds und übertragen diese an alle Hub-Teilnehmer (die auch zu verschiedenen Netzwerken gehören können). -Szenario #3. Mary antwortet auf Bobs öffentliche Nachricht. Mary ist im Friendica/DFRN-Netzwerk. +### Szenario #3. Mary antwortet auf Bobs öffentliche Nachricht. Mary ist im Friendica/DFRN-Netzwerk. Mary nutzt dfrn-notify, um eine direkte Antwort an Bob zu schicken. Bob erstellt dann einen Feed der Unterhaltung und sendet diesen an jeden, der an der Unterhaltung beteiligt ist (mit Ausnahme von Bob selbst; die Unterhaltung wird nun an Jack und Mary geschickt). @@ -47,14 +47,14 @@ Die Nachrichten werden mit dfrn-notify übertragen. PuSH-Hubs werden darüber informiert, dass neuer Inhalt verfügbar ist. Der/die Hub/s erhalten dann die neuesten Feeds und übertragen sie an alle Hub-Teilnehmer (die auch zu verschiedenen Netzwerken gehören können). -Szenario #4. William antwortet auf Bobs öffentliche Nachricht. William ist in einem OStatus-Netzwerk. +### Szenario #4. William antwortet auf Bobs öffentliche Nachricht. William ist in einem OStatus-Netzwerk. William nutzt salmon, um Bob über seine Antwort zu benachrichtigen. Der Inhalt ist HTML-Code, der in das Salmon Magic Envelope eingebettet ist. Bob erstellt dann einen Feed der Unterhaltung und sendet es an alle Friendica-Nutzer, die an der Unterhaltung beteiligt sind und dfrn-notify nutzen (mit Ausnahme von William selbst; die Unterhaltung wird an Jack und Mary weitergeleitet). PuSH-Hubs werden darüber informiert, dass neuer Inhalt verfügbar ist. Der/die Hub/s erhalten dann die neuesten Feeds und übertragen sie an alle Hub-Teilnehmer (die auch zu verschiedenen Netzwerken gehören können). -Szenario #5. Bob schreibt eine private Nachricht an Mary und Jack. +### Szenario #5. Bob schreibt eine private Nachricht an Mary und Jack. Die Nachricht wird sofort an Mary und Jack mit Hilfe von dfrn_notify geschickt. Öffentliche Hubs werden nicht benachrichtigt. diff --git a/include/dfrn.php b/include/dfrn.php index 67cef59d9..9cbf05ece 100644 --- a/include/dfrn.php +++ b/include/dfrn.php @@ -3,7 +3,8 @@ * @file include/dfrn.php * @brief The implementation of the dfrn protocol * - * https://github.com/friendica/friendica/wiki/Protocol + * @see https://github.com/friendica/friendica/wiki/Protocol and + * https://github.com/friendica/friendica/blob/master/spec/dfrn2.pdf */ require_once("include/Contact.php"); diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php index 51cd59c62..5aea4eede 100644 --- a/mod/dfrn_confirm.php +++ b/mod/dfrn_confirm.php @@ -1,17 +1,21 @@ argv[1]; } - /** + /* * * Main entry point. Scenario 1. Our user received a friend request notification (perhaps * from another site) and clicked 'Approve'. @@ -87,7 +91,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) { $activity = ((x($_POST,'activity')) ? intval($_POST['activity']) : 0 ); } - /** + /* * * Ensure that dfrn_id has precedence when we go to find the contact record. * We only want to search based on contact id if there is no dfrn_id, @@ -103,7 +107,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) { logger('Confirming follower with contact_id: ' . $cid); - /** + /* * * The other person will have been issued an ID when they first requested friendship. * Locate their record. At this time, their record will have both pending and blocked set to 1. @@ -139,7 +143,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) { if($network === NETWORK_DFRN) { - /** + /* * * Generate a key pair for all further communications with this person. * We have a keypair for every contact, and a site key for unknown people. @@ -166,7 +170,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) { $params = array(); - /** + /* * * Per the DFRN protocol, we will verify both ends by encrypting the dfrn_id with our * site private key (person on the other end can decrypt it with our site public key). @@ -212,7 +216,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) { logger('Confirm: posting data to ' . $dfrn_confirm . ': ' . print_r($params,true), LOGGER_DATA); - /** + /* * * POST all this stuff to the other site. * Temporarily raise the network timeout to 120 seconds because the default 60 @@ -506,7 +510,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) { //NOTREACHED } - /** + /* * * * End of Scenario 1. [Local confirmation of remote friend request]. diff --git a/mod/dfrn_notify.php b/mod/dfrn_notify.php index 780fb456f..6f6fc41c1 100644 --- a/mod/dfrn_notify.php +++ b/mod/dfrn_notify.php @@ -1,5 +1,10 @@ + + + + + + + + +Friendica - Contact confirmation + + + + +bob@example.com + + + + +karen@karenhompage.com + + +notifications.php + + +notifications_content() +----------------------------------------- +- This is the page where Karen see Bobs friendship request +- the submit form redirects to Karens local dfrn_confirm page +($dfrn_id, $contact_id, $intro_id are submitted) + + +dfrn_confirm.php + + +dfrn_confirm_post() +SCENARIO 1 ( no $_POST['source_url'] available) +-------------------------------------------------------------------------------- +- contact data come either form $handsfree (if autoconfirm) or +from $_POST +- get all data about Karen form the user table +[Note: Bob have been issued an ID (contact issue-id) when he first +requested the friendship. Locate Bobs contact record. At this +time, his record will have both pending and blocked set to 1. +There won't be any dfrn_id if this is a network follower, so use +the contact_id instead] +- search for Bob in the contact table by contact_id, dfrn_id and +issued-id not empty (for the uid -> Karens user id) +- if network = dfrn + -> create a new keypair (prvkey & pubkey) and update the +contact +[Note: Generate a key pair for all further communications with +this person. We have a keypair for every contact, and a site key +for unknown people. This provides a means to carry on +relationships with other people any single key is compromised. It +is a robust key. We're much more worried about key leakage +than anybody cracking it.] + -> update Bobs contact record (in the contact table) with the +generated prvkey + -> encrypting the dfrn_id with Karens prvkey (Bob can decrypt it +on the other and with Karens site-pubkey) and add it to the +transmit params. + -> encrypting Karens profile url with Bobs site-pubkey (Bob +can decrypt it with his own private key) and add it to the +transmit params. + -> add the above generated public key to params which +getting transmitted (if $aes_allow -> encrypt the the public key) + -> add duplex state and page-flags to the params + -> send params to Bobs dfrn_confirm page ($res = +post_url($dfrn_confirm,$params); + + +dfrn_confirm_post() +SCENARIO 2 ( $_POST['source_url'] is available) +------------------------------------------------------------------------ +- get all data about Bob from the user table (prvkey and uid form +Bob ) +- decrypt the transmitted source_url (profile url) with Bobs +prvkey +- get data of Karen from contact table by her source_url (and by +her user id) +- decrypt the dfrn_id sent by Karen with Karens site-pubkey +(taken from contact table) +- if possible decrpyt the pubkey sent by Karen with the prvkey of +Bob (taken from user table) -> if this is not possible use the raw +pubkey +- search if the dfrn_id is already present in the contact table (if it +is prensent it is a duplicate) +- update dfrn-id and pubkey for Karens contact entry in the +contact table + + + -> set the relation for the contact and set pending = 0 and +blocked = 0 + + +- update the relationship of the contact Karen +-> if duplex delete the issued-id +-> set blocked = 0 and pending = 0 + + +send a notification + + +delete the intro of Bob + + +Note: this chart respects only dfrn +contacts and focuses on key exchange +(for other areas it might be very +incomplete) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spec/dfrn2_contact_request.png b/spec/dfrn2_contact_request.png new file mode 100644 index 000000000..cf60094ae Binary files /dev/null and b/spec/dfrn2_contact_request.png differ diff --git a/spec/dfrn2_contact_request.svg b/spec/dfrn2_contact_request.svg new file mode 100644 index 000000000..d81323457 --- /dev/null +++ b/spec/dfrn2_contact_request.svg @@ -0,0 +1,218 @@ + + + + + + + + + +Friendica - Contact request + + + + +karenn@karenhompage.com + + + + +bob@example.com + + + dfrn_request.php +- +https://karenhompage/dfrn_request/karin + + +dfrn_request_post - SCENARIO 1 +---------------------------------------------- +- Cleanup old introductions that remain blocked + Cleanup +any old email intros - which will have a greater lifetime +- probe_url Bobs posted dfrn_url and get the network with +webfinger_dfrn +- try to select all contact data of Bob (contact table) by the +url ($_POST['dfrn_url] and profile uid ($a->profile['uid']) +where self = 0 to look if this contact is already there (if +issued-id or rel is already available return here because it +seems that we are already connected) +- create a issued-id with $issued_id = random_string(); +- if we already found a contact record above update the +issued-id with the one we have created +- otherwise if Bob is not already in the contact table scrape +Bobs profile and create a new contact with this data (e.g. +the scraped issued-id / profiles pubkey becomes contacts +site-pubkey) in the contact table (blocked = 1, pending = 1) +- select this created contact from contact table and create +an intro in the intro table (blocked = 1) + + +$_POST['dfrn_url'] is transmited and is Bobs profile url + + +redirect to Bobs request page +goaway($parms['dfrn-request'] . "?dfrn_url=$dfrn_url" + . '&dfrn_version=' . +DFRN_PROTOCOL_VERSION + . '&confirm_key=' . $hash + . (($aes_allow) ? "&aes_allow=1" : "") + ); +http://example.com/dfrn_request/bob?dfrn_url=6874747 +03a2f2f6b6172656e686f6d65706167652e636f6d2f70726f66 +696c652f6b6172656e&aes_allow=1&confirm_key=”ABC123” + + +dfrn_request.php + + +http://example.com/dfrn_request/bob? +dfrn_url= +687474703a2f2f6b6172656e686f6d65706167652e +636f6d2f70726f66696c652f6b6172656e&aes_allow=1& +confirm_key=”ABC123” +dfrn_request_content() +------------------------------------------ +- copy the posted parameters (dfrn_url, key and so on) +to $_POST + dfrn_request_post() - SCENARIO 2 +($_POST['localconfirm'] == 1) +----------------------------------------------------------------------- +- if(local_user() && ($a->user['nickname'] == $a- +>argv[1]) && (x($_POST,'dfrn_url'))) +-> +- $confirm_key comes from $_POST +- get data for contact Karen (contact table) by +$dfrn_url (contacts url and nurl) -> if contact Karen +does already have a dfrn-id Bob seems already +connected with Karen (abort here) +- if this contact (Karen) isn't available in the contact +tabel, scrape Karens profile page to pick up the dfrn +links, key, fn, and photo +- create a contact for Karen in the contact table with +the scraped data with blocked = 1 and pending = 1 +(Karens pubkey becomes the contact site-pubkey) +- fetch_url($dfrn_request . '?confirm_key=' . +$confirm_key); +- fetch_url(http://karenhomepage.com/dfrn_request? +confirm_key=”ABC123”) + + +dfrn_request.php + + +http://karenhomepage.com/dfrn_request?confirm_key=”ABC123” +dfrn_request_content() - +(elseif((x($_GET,'confirm_key')) && strlen($_GET['confirm_key'])) ) +---------------------------------------------------------------------------------------------- +- select the intro by confirm_key (intro table) -> get contact id +- use the intro contact id to get the contact in the contact table +- build a notification package ( notification(array.....) ) +- update intro in intro table (blocked = 0) + + +Bob stays on his Friendica server +- goaway($forwardurl); + + +Note: this chart respects only dfrn +contacts and focuses on key exchange +(for other areas it might be very +incomplete) + + +dfrn_request_content() +------------------------------------ +- the page for the on Katrins server where Bob do a connection +request +- the form transmit on submit Bobs profile url as dfrn_url + + + + + + + + + + +bob wants to make a request and is directed from karens profile page to karens dfrn-request page + + + + + + + + + + + + + + + + + + + + + + + + + + +redirict to bobs dfrn_request page + + + + + + + + + + + + + + + + + + + + +http://karenhomepage.com/dfrn_request?confirm_key=”ABC123” + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Bob fills request form and presses submit + diff --git a/view/theme/frio/css/style.css b/view/theme/frio/css/style.css index 2c5030ca2..0dc3573be 100644 --- a/view/theme/frio/css/style.css +++ b/view/theme/frio/css/style.css @@ -2105,7 +2105,6 @@ ul li:hover .contact-wrapper a.contact-action-link:hover { /* Events page */ - .fc .fc-month-view .fc-content .fc-title .item-desc:hover { color: $link_hover_color; } @@ -2305,6 +2304,39 @@ little modifications to emulate a standard page template */ -moz-box-shadow: 0 0 3px #dadada; } +/* Help Page */ +section.help-content-wrapper h1 { + padding-bottom: 0.3em; + font-size: 1.8em; + border-bottom: 1px solid #ddd; +} +section.help-content-wrapper h2 { + padding-bottom: 0.3em; + font-size: 1.5em; + border-bottom: 1px solid #ddd; +} +section.help-content-wrapper h3 { + font-size: 1.2em; +} +section.help-content-wrapper h1, +section.help-content-wrapper h2, +section.help-content-wrapper h3, +section.help-content-wrapper h5, +section.help-content-wrapper h6 { + margin-top: 24px; + margin-bottom: 16px; + font-weight: 600; + line-height: 1.25; +} +section.help-content-wrapper p { + margin: 0.4em 0; +} +section.help-content-wrapper p, +section.help-content-wrapper a { + line-height: 1.6; + font-size: 0.96em; +} + /* * Overwriting for transparency and other colors */