515 lines
20 KiB
HTML
515 lines
20 KiB
HTML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
|
<head>
|
|
<!-- 2016-11-12 Sat 21:12 -->
|
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title></title>
|
|
<meta name="generator" content="Org mode" />
|
|
<meta name="author" content="Bob Mottram" />
|
|
<meta name="description" content="How to use XMPP/Jabber"
|
|
/>
|
|
<meta name="keywords" content="freedombone, xmpp" />
|
|
<style type="text/css">
|
|
<!--/*--><![CDATA[/*><!--*/
|
|
.title { text-align: center;
|
|
margin-bottom: .2em; }
|
|
.subtitle { text-align: center;
|
|
font-size: medium;
|
|
font-weight: bold;
|
|
margin-top:0; }
|
|
.todo { font-family: monospace; color: red; }
|
|
.done { font-family: monospace; color: green; }
|
|
.priority { font-family: monospace; color: orange; }
|
|
.tag { background-color: #eee; font-family: monospace;
|
|
padding: 2px; font-size: 80%; font-weight: normal; }
|
|
.timestamp { color: #bebebe; }
|
|
.timestamp-kwd { color: #5f9ea0; }
|
|
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
|
|
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
|
|
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
|
|
.underline { text-decoration: underline; }
|
|
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
|
|
p.verse { margin-left: 3%; }
|
|
pre {
|
|
border: 1px solid #ccc;
|
|
box-shadow: 3px 3px 3px #eee;
|
|
padding: 8pt;
|
|
font-family: monospace;
|
|
overflow: auto;
|
|
margin: 1.2em;
|
|
}
|
|
pre.src {
|
|
position: relative;
|
|
overflow: visible;
|
|
padding-top: 1.2em;
|
|
}
|
|
pre.src:before {
|
|
display: none;
|
|
position: absolute;
|
|
background-color: white;
|
|
top: -10px;
|
|
right: 10px;
|
|
padding: 3px;
|
|
border: 1px solid black;
|
|
}
|
|
pre.src:hover:before { display: inline;}
|
|
/* Languages per Org manual */
|
|
pre.src-asymptote:before { content: 'Asymptote'; }
|
|
pre.src-awk:before { content: 'Awk'; }
|
|
pre.src-C:before { content: 'C'; }
|
|
/* pre.src-C++ doesn't work in CSS */
|
|
pre.src-clojure:before { content: 'Clojure'; }
|
|
pre.src-css:before { content: 'CSS'; }
|
|
pre.src-D:before { content: 'D'; }
|
|
pre.src-ditaa:before { content: 'ditaa'; }
|
|
pre.src-dot:before { content: 'Graphviz'; }
|
|
pre.src-calc:before { content: 'Emacs Calc'; }
|
|
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
|
|
pre.src-fortran:before { content: 'Fortran'; }
|
|
pre.src-gnuplot:before { content: 'gnuplot'; }
|
|
pre.src-haskell:before { content: 'Haskell'; }
|
|
pre.src-java:before { content: 'Java'; }
|
|
pre.src-js:before { content: 'Javascript'; }
|
|
pre.src-latex:before { content: 'LaTeX'; }
|
|
pre.src-ledger:before { content: 'Ledger'; }
|
|
pre.src-lisp:before { content: 'Lisp'; }
|
|
pre.src-lilypond:before { content: 'Lilypond'; }
|
|
pre.src-lua:before { content: 'Lua'; }
|
|
pre.src-matlab:before { content: 'MATLAB'; }
|
|
pre.src-mscgen:before { content: 'Mscgen'; }
|
|
pre.src-ocaml:before { content: 'Objective Caml'; }
|
|
pre.src-octave:before { content: 'Octave'; }
|
|
pre.src-org:before { content: 'Org mode'; }
|
|
pre.src-oz:before { content: 'OZ'; }
|
|
pre.src-plantuml:before { content: 'Plantuml'; }
|
|
pre.src-processing:before { content: 'Processing.js'; }
|
|
pre.src-python:before { content: 'Python'; }
|
|
pre.src-R:before { content: 'R'; }
|
|
pre.src-ruby:before { content: 'Ruby'; }
|
|
pre.src-sass:before { content: 'Sass'; }
|
|
pre.src-scheme:before { content: 'Scheme'; }
|
|
pre.src-screen:before { content: 'Gnu Screen'; }
|
|
pre.src-sed:before { content: 'Sed'; }
|
|
pre.src-sh:before { content: 'shell'; }
|
|
pre.src-sql:before { content: 'SQL'; }
|
|
pre.src-sqlite:before { content: 'SQLite'; }
|
|
/* additional languages in org.el's org-babel-load-languages alist */
|
|
pre.src-forth:before { content: 'Forth'; }
|
|
pre.src-io:before { content: 'IO'; }
|
|
pre.src-J:before { content: 'J'; }
|
|
pre.src-makefile:before { content: 'Makefile'; }
|
|
pre.src-maxima:before { content: 'Maxima'; }
|
|
pre.src-perl:before { content: 'Perl'; }
|
|
pre.src-picolisp:before { content: 'Pico Lisp'; }
|
|
pre.src-scala:before { content: 'Scala'; }
|
|
pre.src-shell:before { content: 'Shell Script'; }
|
|
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
|
|
/* additional language identifiers per "defun org-babel-execute"
|
|
in ob-*.el */
|
|
pre.src-cpp:before { content: 'C++'; }
|
|
pre.src-abc:before { content: 'ABC'; }
|
|
pre.src-coq:before { content: 'Coq'; }
|
|
pre.src-groovy:before { content: 'Groovy'; }
|
|
/* additional language identifiers from org-babel-shell-names in
|
|
ob-shell.el: ob-shell is the only babel language using a lambda to put
|
|
the execution function name together. */
|
|
pre.src-bash:before { content: 'bash'; }
|
|
pre.src-csh:before { content: 'csh'; }
|
|
pre.src-ash:before { content: 'ash'; }
|
|
pre.src-dash:before { content: 'dash'; }
|
|
pre.src-ksh:before { content: 'ksh'; }
|
|
pre.src-mksh:before { content: 'mksh'; }
|
|
pre.src-posh:before { content: 'posh'; }
|
|
/* Additional Emacs modes also supported by the LaTeX listings package */
|
|
pre.src-ada:before { content: 'Ada'; }
|
|
pre.src-asm:before { content: 'Assembler'; }
|
|
pre.src-caml:before { content: 'Caml'; }
|
|
pre.src-delphi:before { content: 'Delphi'; }
|
|
pre.src-html:before { content: 'HTML'; }
|
|
pre.src-idl:before { content: 'IDL'; }
|
|
pre.src-mercury:before { content: 'Mercury'; }
|
|
pre.src-metapost:before { content: 'MetaPost'; }
|
|
pre.src-modula-2:before { content: 'Modula-2'; }
|
|
pre.src-pascal:before { content: 'Pascal'; }
|
|
pre.src-ps:before { content: 'PostScript'; }
|
|
pre.src-prolog:before { content: 'Prolog'; }
|
|
pre.src-simula:before { content: 'Simula'; }
|
|
pre.src-tcl:before { content: 'tcl'; }
|
|
pre.src-tex:before { content: 'TeX'; }
|
|
pre.src-plain-tex:before { content: 'Plain TeX'; }
|
|
pre.src-verilog:before { content: 'Verilog'; }
|
|
pre.src-vhdl:before { content: 'VHDL'; }
|
|
pre.src-xml:before { content: 'XML'; }
|
|
pre.src-nxml:before { content: 'XML'; }
|
|
/* add a generic configuration mode; LaTeX export needs an additional
|
|
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
|
|
pre.src-conf:before { content: 'Configuration File'; }
|
|
|
|
table { border-collapse:collapse; }
|
|
caption.t-above { caption-side: top; }
|
|
caption.t-bottom { caption-side: bottom; }
|
|
td, th { vertical-align:top; }
|
|
th.org-right { text-align: center; }
|
|
th.org-left { text-align: center; }
|
|
th.org-center { text-align: center; }
|
|
td.org-right { text-align: right; }
|
|
td.org-left { text-align: left; }
|
|
td.org-center { text-align: center; }
|
|
dt { font-weight: bold; }
|
|
.footpara { display: inline; }
|
|
.footdef { margin-bottom: 1em; }
|
|
.figure { padding: 1em; }
|
|
.figure p { text-align: center; }
|
|
.inlinetask {
|
|
padding: 10px;
|
|
border: 2px solid gray;
|
|
margin: 10px;
|
|
background: #ffffcc;
|
|
}
|
|
#org-div-home-and-up
|
|
{ text-align: right; font-size: 70%; white-space: nowrap; }
|
|
textarea { overflow-x: auto; }
|
|
.linenr { font-size: smaller }
|
|
.code-highlighted { background-color: #ffff00; }
|
|
.org-info-js_info-navigation { border-style: none; }
|
|
#org-info-js_console-label
|
|
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
|
|
.org-info-js_search-highlight
|
|
{ background-color: #ffff00; color: #000000; font-weight: bold; }
|
|
.org-svg { width: 90%; }
|
|
/*]]>*/-->
|
|
</style>
|
|
<link rel="stylesheet" type="text/css" href="freedombone.css" />
|
|
<script type="text/javascript">
|
|
/*
|
|
@licstart The following is the entire license notice for the
|
|
JavaScript code in this tag.
|
|
|
|
Copyright (C) 2012-2013 Free Software Foundation, Inc.
|
|
|
|
The JavaScript code in this tag is free software: you can
|
|
redistribute it and/or modify it under the terms of the GNU
|
|
General Public License (GNU GPL) as published by the Free Software
|
|
Foundation, either version 3 of the License, or (at your option)
|
|
any later version. The code is distributed WITHOUT ANY WARRANTY;
|
|
without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
|
|
|
|
As additional permission under GNU GPL version 3 section 7, you
|
|
may distribute non-source (e.g., minimized or compacted) forms of
|
|
that code without the copy of the GNU GPL normally required by
|
|
section 4, provided you include this license notice and a URL
|
|
through which recipients can access the Corresponding Source.
|
|
|
|
|
|
@licend The above is the entire license notice
|
|
for the JavaScript code in this tag.
|
|
*/
|
|
<!--/*--><![CDATA[/*><!--*/
|
|
function CodeHighlightOn(elem, id)
|
|
{
|
|
var target = document.getElementById(id);
|
|
if(null != target) {
|
|
elem.cacheClassElem = elem.className;
|
|
elem.cacheClassTarget = target.className;
|
|
target.className = "code-highlighted";
|
|
elem.className = "code-highlighted";
|
|
}
|
|
}
|
|
function CodeHighlightOff(elem, id)
|
|
{
|
|
var target = document.getElementById(id);
|
|
if(elem.cacheClassElem)
|
|
elem.className = elem.cacheClassElem;
|
|
if(elem.cacheClassTarget)
|
|
target.className = elem.cacheClassTarget;
|
|
}
|
|
/*]]>*///-->
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<div id="preamble" class="status">
|
|
<a name="top" id="top"></a>
|
|
</div>
|
|
<div id="content">
|
|
<div class="org-center">
|
|
|
|
<div class="figure">
|
|
<p><img src="images/logo.png" alt="logo.png" />
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<center>
|
|
<h1>XMPP/Jabber</h1>
|
|
</center>
|
|
|
|
<p>
|
|
Most people know XMPP as "<i>Jabber</i>" and it's sometimes regarded and an old protocol once used by Google and Facebook but which is no longer relevant. However, it still works and if appropriately configured, as it is on Freedombone, can provide the best chat messaging security currently available.
|
|
</p>
|
|
|
|
<p>
|
|
With regard to chat apps you might have read a lot of stuff about <i>end-to-end security</i>. That's important, but to also protect the metadata of who sends messages to who the data needs to be onion routed (wrapped in multiple layers of routing encryption), and that's something which most popular chat apps don't provide. Also beware of chat apps which fundamentally rely upon Google's infrastructure. You can be sure that they extensively data mine everything and will be able to reconstruct your social graph if that's at all technically feasible, then pass that to whatever governments they're friendly with or trying to lobby.
|
|
</p>
|
|
|
|
<p>
|
|
A well written article on the state of XMPP and how it compares to other chat protocols <a href="https://gultsch.de/xmpp_2016.html">can be found here</a>.
|
|
</p>
|
|
|
|
<div id="outline-container-orgfdc65c1" class="outline-2">
|
|
<h2 id="orgfdc65c1">Using with Gajim</h2>
|
|
<div class="outline-text-2" id="text-orgfdc65c1">
|
|
<p>
|
|
In mid 2016 <a href="https://gajim.org/">Gajim</a> became the first desktop XMPP client to support the <a href="https://en.wikipedia.org/wiki/OMEMO">OMEMO end-to-end security standard</a>, which is superior to the more traditional <a href="https://en.wikipedia.org/wiki/Off-the-Record_Messaging">OTR</a> since it also includes multi-user chat and the ratcheting mechanism pioneered by Open Whisper Systems. To install it:
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-bash">su -c <span class="org-string">'echo "deb ftp://ftp.gajim.org/debian unstable main" > /etc/apt/sources.list.d/gajim.list'</span>
|
|
sudo apt-get update
|
|
sudo apt-get -y install gajim-dev-keyring
|
|
sudo apt-get -y install git tor python-dev python-pip gajim-nightly
|
|
mkdir ~/.local/share/gajim/plugins -p
|
|
<span class="org-builtin">cd</span> ~/.local/share/gajim/plugins
|
|
git clone https://github.com/omemo/gajim-omemo
|
|
sudo pip install <span class="org-variable-name">protobuf</span>==2.6.1, python-axolotl==0.1.35
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Open Gajim and enter your XMPP address and password.
|
|
</p>
|
|
|
|
<p>
|
|
Go to <b>Edit/Preferences</b> and select the <b>Advanced</b> tab. Under <b>Global Proxy</b> select <b>Tor</b> and the <b>Close</b> button. Then select <b>Edit/Plugins</b> and make sure that OMEMO is active (ticked), then select the <b>Close</b> button.
|
|
</p>
|
|
|
|
<p>
|
|
When you start a conversation make sure that the OMEMO box is ticked. You can also click on the keys button and trust various fingerprints. Both sides will need to do that before an encrypted chat can start.
|
|
</p>
|
|
|
|
<p>
|
|
If you wish to make backups of the OMEMO keys then they can be found within:
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-bash">~/.local/share/gajim
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
If you wish to use OpenPGP to encrypt your messages then go to <b>Edit/Accounts</b>, select your account and then the <b>Personal Information</b> tab. You can then choose your GPG key. When initiating a chat you can select the <b>Advanced</b> button and then select <b>Toggle OpenPGP Encryption</b>. OpenPGP is not as secure as OMEMO, but does allow you to use XMPP in a similar style to email in that the recipient of the message does not necessarily need to be online at the same time that you send it.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org90afa1a" class="outline-2">
|
|
<h2 id="org90afa1a">Using with Profanity</h2>
|
|
<div class="outline-text-2" id="text-org90afa1a">
|
|
<p>
|
|
The <a href="https://profanity.im">Profanity</a> shell based user interface and is perhaps the simplest way to use XMPP from a laptop. It's also a good way to ensure that your OTR keys are the same even when logging in from different laptops or devices, and it also means that if those devices later become compomised then there are no locally stored OTR keys to be found.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-bash">ssh username@domain -p 2222
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Then select XMPP. Generate an <a href="https://en.wikipedia.org/wiki/Off-the-Record_Messaging">OTR</a> key with:
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-bash">/otr gen
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Then to start a conversation using OTR:
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-bash">/otr start otherusername@otheruserdomain
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
or if you're already in an insecure chat with someone just use:
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-bash">/otr start
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Set a security question and answer:
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-bash">/otr question <span class="org-string">"What is the name of your best friends rabbit?"</span> fiffi
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
On the other side the user can enter:
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-bash">/otr answer fiffi
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
For the most paranoid you can also obtain your fingerprint:
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-bash">/otr myfp
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
and quote that. If they quote theirs back you can check it with:
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-bash">/otr theirfp
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
If the fingerprints match then you can be pretty confident that unless you have been socially engineered via the question and answer you probably are talking to who you think you are, and that it will be difficult for mass surveillance systems to know the content of the conversation. For more details see <a href="https://www.profanity.im/otr.html">this guide</a>
|
|
</p>
|
|
|
|
<p>
|
|
When accessed via the user control panel the client is automatically routed through Tor and so if you are also using OTR then this provides protection for both message content and metadata.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org6aeefab" class="outline-2">
|
|
<h2 id="org6aeefab">Using with Jitsi</h2>
|
|
<div class="outline-text-2" id="text-org6aeefab">
|
|
<p>
|
|
Jitsi can be downloaded from <a href="https://jitsi.org">https://jitsi.org</a>
|
|
</p>
|
|
|
|
<p>
|
|
On your desktop/laptop open Jitsi and select <b>Options</b> from the <b>Tools</b> menu.
|
|
</p>
|
|
|
|
<p>
|
|
Click <b>Add</b> to add a new user, then enter the Jabber ID (yourusername@yourmaindomainname). Close and then you should notice that your status is "Online" (or if not then you should be able to set it to online).
|
|
</p>
|
|
|
|
<p>
|
|
From the <b>File</b> menu you can add contacts, then select the chat icon to begin a chat. Click on the lock icon on the right hand side and this will initiate an authentication procedure in which you can specify a question and answer to verify the identity of the person you're communicating with. Once authentication is complete then you'll be chating using OTR, which provides an additional layer of security.
|
|
</p>
|
|
|
|
<p>
|
|
When opening Jitsi initially you will get a certificate warning for your domain name (assuming that you're using a self-signed certificate). If this happens then select <b>View Certificate</b> and enable the checkbox to trust the certificate, then select <b>Continue Anyway</b>. Once you've done this then the certificate warning will not appear again unless you reinstall Jitsi or use a different computer.
|
|
</p>
|
|
|
|
<p>
|
|
You can also <a href="https://www.youtube.com/watch?v=vgx7VSrDGjk">see this video</a> as an example of using OTR.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgefffbcb" class="outline-2">
|
|
<h2 id="orgefffbcb">Using with Ubuntu</h2>
|
|
<div class="outline-text-2" id="text-orgefffbcb">
|
|
<p>
|
|
The default XMPP client in Ubuntu is Empathy. Using Empathy isn't as secure as using Jitsi, since it doesn't include the <i>off the record</i> feature, but since it's the default it's what many users will have easy access to.
|
|
</p>
|
|
|
|
<p>
|
|
Open <b>System Settings</b> and select <b>Online Accounts</b>, <b>Add account</b> and then <b>Jabber</b>.
|
|
</p>
|
|
|
|
<p>
|
|
Enter your username (username@domainname) and password.
|
|
</p>
|
|
|
|
<p>
|
|
Click on <b>Advanced</b> and make sure that <b>Encryption required</b> and <b>Ignore SSL certificate errors</b> are checked. Ignoring the certificate errors will allow you to use the self-signed certificate created earlier. Then click <b>Done</b> and set your Jabber account and Empathy to <b>On</b>.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org175673d" class="outline-2">
|
|
<h2 id="org175673d">Using Tor Messenger</h2>
|
|
<div class="outline-text-2" id="text-org175673d">
|
|
<p>
|
|
Tor Messenger is a messaging client which supports XMPP, and its onion routing enables you to protect the metadata of chat interactions to some extent by making it difficult for an adversary to know which server is talking to which. You can download Tor Messenger from <a href="https://torproject.org">torproject.org</a> and the setup is pretty simple.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org14cc22e" class="outline-2">
|
|
<h2 id="org14cc22e">Using with Android/Conversations</h2>
|
|
<div class="outline-text-2" id="text-org14cc22e">
|
|
<p>
|
|
Install <a href="https://f-droid.org/">F-Droid</a>
|
|
</p>
|
|
|
|
<p>
|
|
Search for and install <b>Orbot</b> and <b>Conversations</b>.
|
|
</p>
|
|
|
|
<p>
|
|
Add an account and enter your Jabber/XMPP ID and password.
|
|
</p>
|
|
|
|
<p>
|
|
From the menu select <b>Settings</b> then <b>Expert Settings</b>. Select <b>Connect via Tor</b> and depending on your situation you might also want to select <b>Don't save encrypted messages</b>. Also within expert settings select <b>Keep in foreground</b>. This will enable you to still receive notifications when your device is in standby mode with the screen turned off.
|
|
</p>
|
|
|
|
<p>
|
|
From the menu select <b>Manage accounts</b> and add a new account.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-bash">Jabber ID: myusername@mydomain
|
|
Password: your XMPP password
|
|
Hostname: mydomain (preferably your xmpp onion address)
|
|
Port: 5222
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Then select <b>Next</b>. When chatting you can use the lock icon to encrypt your conversation. OMEMO is the recommended type of encryption. It's also going through Tor, so passive surveillance of the metadata should not be easy for an adversary.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="postamble" class="status">
|
|
|
|
<style type="text/css">
|
|
.back-to-top {
|
|
position: fixed;
|
|
bottom: 2em;
|
|
right: 0px;
|
|
text-decoration: none;
|
|
color: #000000;
|
|
background-color: rgba(235, 235, 235, 0.80);
|
|
font-size: 12px;
|
|
padding: 1em;
|
|
display: none;
|
|
}
|
|
|
|
.back-to-top:hover {
|
|
background-color: rgba(135, 135, 135, 0.50);
|
|
}
|
|
</style>
|
|
|
|
<div class="back-to-top">
|
|
<a href="#top">Back to top</a> | <a href="mailto:bob@freedombone.net">E-mail me</a>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|