aboutsummaryrefslogtreecommitdiff
path: root/template
diff options
context:
space:
mode:
Diffstat (limited to 'template')
-rw-r--r--template/about.html.j253
-rw-r--r--template/architecture.html.j250
-rw-r--r--template/contact.html.j261
-rw-r--r--template/copyright.html.j236
-rw-r--r--template/developers.html.j288
-rw-r--r--template/engage.html.j234
-rw-r--r--template/ev.html.j2121
-rw-r--r--template/faq.html.j251
-rw-r--r--template/glossary.html.j244
-rw-r--r--template/gnurl.html.j2175
-rw-r--r--template/index.html.j2293
-rw-r--r--template/news.html.j2.inc3
-rw-r--r--template/old-news.html.j227
-rw-r--r--template/team.html.j2210
-rw-r--r--template/tutorial-archpi.html.j2150
-rw-r--r--template/tutorial-debian9.html.j2557
-rw-r--r--template/tutorial-macos.html.j2506
-rw-r--r--template/tutorial-ubuntu1804.html.j2499
-rw-r--r--template/tutorial.html.j239
-rw-r--r--template/video.html.j234
20 files changed, 3031 insertions, 0 deletions
diff --git a/template/about.html.j2 b/template/about.html.j2
new file mode 100644
index 00000000..55c9f605
--- /dev/null
+++ b/template/about.html.j2
@@ -0,0 +1,53 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<div class="container">
4 <article>
5 <section>
6 <h3>{{ _("About GNUnet") }}</h3>
7 <p>
8 {% trans %}
9 We still have to write this section.
10 {% endtrans %}
11 </p>
12 <h4>{{ _("Current funding") }}</h3>
13 <p>
14 {% trans %}
15 We currently do not have any grants. All work is done by volunteers.
16 {% endtrans %}
17 </p>
18 <h4>{{ _("Past funding") }}</h3>
19 <p>
20 {% trans %}
21 We are grateful for past funding from the following organizations:
22 {% endtrans %}
23 <ul>
24 <li>
25 <p>
26 <a href="https://renewablefreedom.org/">Renewable Freedom Foundation</a><br>
27 <img src="{{ url('static/images/rff_logo.png') }}" alt="RFF logo">
28 </p>
29 </li>
30 <li>
31 <p>
32 <a href="https://cordis.europa.eu/fp7/">European Commission (FP7)</a><br>
33 <img src="{{ url('static/images/fp7_logo.jpg') }}" alt="FP7 logo">
34 </p>
35 </li>
36 <li>
37 <p>
38 <a href="http://www.dfg.de/">Deutsche Forschungsgemeinschaft</a><br>
39 <img src="{{ url('static/images/dfg_logo.gif') }}" alt="DFG logo">
40 </p>
41 </li>
42 <li>
43 <p>
44 <a href="https://nlnet.nl/">NLnet Foundation</a><br>
45 <img src="{{ url('static/images/nlnet_logo.gif') }}" alt="NLnet logo">
46 </p>
47 </li>
48 </ul>
49 </p>
50 </section>
51 </article>
52</div>
53{% endblock body_content %}
diff --git a/template/architecture.html.j2 b/template/architecture.html.j2
new file mode 100644
index 00000000..7b69572f
--- /dev/null
+++ b/template/architecture.html.j2
@@ -0,0 +1,50 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<!-- Jumbotron -->
4<div class="container-fluid">
5 <div class="container text-center">
6 <h1>{{ _("GNUnet System Architecture") }}</h1>
7 <p>
8 </p>
9 </div>
10</div>
11<!-- TODO: This image is too big, it should scale dynamically -->
12<div class="container-wide">
13 <div class="text-center">
14 <img class="img-fluid" style="width:auto" style="border:1px solid #222" src="../static/images/gnunet-arch-full.svg">
15 </div>
16</div>
17<div class="container">
18 <div class="row">
19 <div class="col-lg-6">
20 <h2>{{ _("Foundations") }}</h2>
21 <p>
22 {% trans %}
23 The foundations of GNUnet are a distributed hash
24 table (R5N), an SCTP-like end-to-end encrypted
25 messaging layer (CADET), a public key infrastructure
26 (GNS) and a pluggable transport system (TRANSPORT).<br>
27 Using public keys for addresses
28 and self-organized decentralized routing algorithms,
29 these subsystems replace the traditional TCP/IP stack.
30 {% endtrans %}
31 </p>
32
33 </div>
34 <div class="col-lg-6">
35 <h2>{{ _("Security") }}</h2>
36
37 <p>
38 {% trans %}
39 GNUnet is implemented using a multi-process architecture.
40 Each subsystem runs as a separate process, providing
41 fault-isolation and enabling tight permissions to be
42 granted to each subsystem. Naturally, the
43 implementation is a <a href="https://www.gnu.org/">GNU</a>
44 package, and will always remain free software.
45 {% endtrans %}
46 </p>
47 </div>
48 </div>
49</div>
50{% endblock body_content %}
diff --git a/template/contact.html.j2 b/template/contact.html.j2
new file mode 100644
index 00000000..aa74fcc5
--- /dev/null
+++ b/template/contact.html.j2
@@ -0,0 +1,61 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3
4<div class="jumbotron">
5 <div class="container text-center">
6 <h1>{{ _("Contact information") }}</h1>
7 </div>
8</div>
9
10<div class="container">
11<div class="row">
12 <div class="col-lg-6">
13 <h2>{{ _("The mailing list") }}</h2>
14 <p>
15 {% trans %}
16 An archived, public mailing list for GNUnet is
17 hosted at
18 <a href="https://lists.gnu.org/mailman/listinfo/gnunet-developers">https://lists.gnu.org/mailman/listinfo/gnunet-developers</a>. You can send messages to the list
19 at <a href="mailto:gnunet-developers@gnu.org">gnunet-developers@gnu.org</a>.
20 {% endtrans %}
21 </p>
22 </div>
23
24 <div class="col-lg-6">
25 <h2>{{ _("The IRC channel") }}</h2>
26 <p>
27 {% trans %}
28 #gnunet is reachable via irc.freenode.net. There is also an <a href="https://old.gnunet.org/bot/log/gnunet">archive</a> availabe.
29 {% endtrans %}
30 </p>
31 </div>
32</div>
33
34<div class="row">
35 <div class="col-lg-6">
36 <h2>{{ _("Contacting individuals") }}</h2>
37 <p>
38 {% trans %}
39 GNUnet developers are generally reachable at
40 <tt>PSEUDONYM@gnunet.org</tt>. Most of us
41 support receiving GnuPG encrypted Emails.
42 {% endtrans %}
43 </p>
44 </div>
45
46 <div class="col-lg-6">
47 <h2>{{ _("Reporting bugs") }}</h2>
48 <p>
49 {% trans %}
50 We track open feature requests and bugs for projects
51 within GNUnet in our
52 <a href="https://bugs.gnunet.org/">Bug tracker</a>.
53 You can also report bugs or feature requests to the
54 <a href="https://lists.gnu.org/mailman/listinfo/bug-gnunet">bug-gnunet</a>
55 mailing list. The mailinglist requires no subscription.
56 {% endtrans %}
57 </p>
58 </div>
59</div>
60</div>
61{% endblock body_content %}
diff --git a/template/copyright.html.j2 b/template/copyright.html.j2
new file mode 100644
index 00000000..37dd9f66
--- /dev/null
+++ b/template/copyright.html.j2
@@ -0,0 +1,36 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3
4<div class="container-fluid">
5 <div class="container text-center">
6 <h1>{{ _("Copyright Assignment") }}</h1><br><br>
7 <!-- Note: source of the pdf/copyright.pdf is in gitolite-admin/ -->
8 {% trans %}
9 <p>
10 Contributors to GNUnet with Git access must sign the
11 <a href="/static/pdf/copyright.pdf">copyright assignment</a> to
12 ensure that the <a href="https://gnunet.org/git/gnunet-ev.git/tree/gnunet_taler_agreement.tex">GNUnet e.V. --- Taler Systems SA agreement
13 on licensing and collaborative development</a> of the GNUnet and
14 GNU Taler projects is satisfied.
15 </p>
16 {% endtrans %}
17 </div>
18 <div class="container">
19 {% trans %}
20 <p>The agreements ensure that the code will continue to be made
21 available under free software licenses, but gives developers
22 the freedom to move code between GNUnet and GNU Taler without
23 worrying about licenses and to give the company the ability to
24 dual-license (for example, so that we can distribute via
25 App-stores that are hostile to free software).</p>
26 {% endtrans %}
27 {% trans %}
28 <p>Minor contributions (basically, anyone without Git access) do
29 not require copyright assignment. Pseudonymous contributions are
30 accepted, in this case simply sign the agreement with your
31 pseudonym. Scanned copies are sufficient, but snail mail is
32 preferred.</p>
33 {% endtrans %}
34 </div>
35</div>
36{% endblock body_content %}
diff --git a/template/developers.html.j2 b/template/developers.html.j2
new file mode 100644
index 00000000..22283277
--- /dev/null
+++ b/template/developers.html.j2
@@ -0,0 +1,88 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<div class="jumbotron">
4 <div class="text-center">
5 <h1>{{ _("GNUnet for developers") }}</h1>
6 </div>
7</div>
8
9<div class="container-fluid c_acronym">
10<div class="container">
11 <div class="row">
12 <div class="col-lg-4">
13 <h3>{{ _("Repositories") }}</h3>
14
15 <p>
16 {% trans %}
17 A list of our Git
18 repositories can be found on our
19 our <a href="https://gnunet.org/git/">Git Server</a>.
20 {% endtrans %}
21 </p>
22 </div>
23 <div class="col-lg-4">
24 <h3>{{ _("Bibliography") }}</h3>
25
26 <p>
27 {% trans %}
28 Technical papers can be found in
29 our <a href="https://old.gnunet.org/bibliography">bibliography</a>.
30 {% endtrans %}
31 </p>
32 </div>
33 <div class="col-lg-4">
34 <h3>{{ _("Discussion") }}</h3>
35
36 <p>
37 {% trans %}
38 We have a mailing list for developer discussions.
39 You can subscribe to or read the list archive at
40 <a href="http://lists.gnu.org/mailman/listinfo/gnunet-developers">http://lists.gnu.org/mailman/listinfo/gnunet-developers</a>.
41 {% endtrans %}
42 </p>
43 </div>
44 </div>
45 <div class="row">
46 <div class="col-lg-4">
47 <h3>{{ _("Regression Testing") }}</h3>
48
49 <p>
50 {% trans %}
51 We have <a href="https://buildbot.net/">Buildbot</a>
52 automation tests to detect regressions and check for
53 portability at <a
54 href="https://gnunet.org/buildbot/gnunet/">https://gnunet.org/buildbot/gnunet/</a>.
55 {% endtrans %}
56 </p>
57 </div>
58 <div class="col-lg-4" note="not yet operational">
59 <h3>{{ _("Code Coverage Analysis") }}</h3>
60
61 <p>
62 {% trans %}
63 We use
64 <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV</a>
65 to analyze the code coverage of our tests, the
66 results are available
67 at <a href="https://gnunet.org/coverage/">https://gnunet.org/coverage/</a>.
68 {% endtrans %}
69 </p>
70 </div>
71 <div class="col-lg-4">
72 <h3>{{ _("Performance Analysis") }}</h3>
73
74 <p>
75 {% trans %}
76 We
77 use <a href="https://gnunet.org/gauger">Gauger</a>
78 for performance regression analysis of the exchange
79 backend
80 at <a href="https://gnunet.org/gauger/">https://gnunet.org/gauger/</a>.
81 {% endtrans %}
82 </p>
83 </div>
84 </div>
85</div>
86</div>
87
88{% endblock body_content %}
diff --git a/template/engage.html.j2 b/template/engage.html.j2
new file mode 100644
index 00000000..592643a7
--- /dev/null
+++ b/template/engage.html.j2
@@ -0,0 +1,34 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<article class="d-flex flex-column p-2 bd-highlight">
4<div class="container">
5 <div class="text-center">
6 <header>
7 <h1>{{ _("Talk With Us") }}</h1>
8 </header>
9 <br />
10 <p>
11 {% trans %}
12 Use the mailing lists, and join our <a href="ircs://chat.freenode.net:6697/#gnunet">IRC channel</a>
13 to keep up with development, find technical help, and discuss GNUnet.
14 {% endtrans %}
15 </p>
16 </div>
17 <p>
18 {% trans %}
19 <a href="https://lists.gnu.org/mailman/listinfo/help-gnunet">General Help Mailing List</a>
20 {% endtrans %}
21 </p>
22 <p>
23 {% trans %}
24 <a href="https://lists.gnu.org/mailman/listinfo/gnunet-developers">Development Mailing List</a>
25 {% endtrans %}
26 </p>
27 <p>
28 {% trans %}
29 Available on <a href="https://freenode.net">irc.freenode.net</a> in channel <a href="ircs://chat.freenode.net:6697/#gnunet">#gnunet</a>.
30 {% endtrans %}
31 </p>
32</div>
33</article>
34{% endblock body_content %}
diff --git a/template/ev.html.j2 b/template/ev.html.j2
new file mode 100644
index 00000000..90b46ef0
--- /dev/null
+++ b/template/ev.html.j2
@@ -0,0 +1,121 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<article>
4<div class="container-fluid">
5 <div class="container text-center">
6 <header>
7 <h1>{{ _("Verein zur F&ouml;rderung von GNUnet e.V.") }}</h1>
8 </header>
9 <p>
10 {% trans %}
11 On December 27th 2013 a group of GNUnet hackers met at 30c3
12 to create the "Verein zur F&ouml;rderung von GNUnet e.V.", an
13 association under German law to support GNUnet development.
14 The Amtsgericht M&uuml;nchen registered the association on the
15 7th of March under VR 205287.
16 {% endtrans %}
17 </p>
18 <p>
19 {% trans %}
20 The association is officially dedicated to supporting research,
21 development and education in the area of secure decentralized
22 networking in general, and GNUnet specifically. This is the
23 official website for the association.
24 {% endtrans %}
25 </p>
26 </div>
27</div>
28
29<div class="container adorn_h3_bracket">
30 <div class="row">
31 <div class="col-lg-6">
32 <h3>{{ _("Governance") }}</h3>
33 <p>
34 {% trans %}
35 You can find our "Satzung", and the list of members under
36 <a href="/git/gnunet-ev.git/tree/satzung.tex">https://gnunet.org/git/gnunet-ev.git/tree/satzung.tex</a>.
37 The current board consists of:
38 <dl><dt>Vorsitz</dt>
39 <dd><a href="http://grothoff.org/christian/">Christian Grothoff</a></dd>
40 <dt>stellvertretender Vorsitz</dt>
41 <dd>Matthias Wachs</dd>
42 <dt>Kassenwart</dt>
43 <dd>Florian Dold</dd>
44 <dt>Beisitzer</dt>
45 <dd>Sree Harsha Totakura, Lurchi</dd>
46 </dl>
47 {% endtrans %}
48 </p>
49 </div>
50 <div class="col-lg-6">
51 <h3>{{ _("Becoming a Member of GNUnet e.V.") }}</h3>
52 <p>
53 {% trans %}
54 GNUnet developers with git (write) access can become
55 members to participate in the decision process and
56 formally support GNUnet e.V. For this, all you have
57 to do is update the <tt>members.txt</tt> file in the
58 <a href="/git/gnunet-ev.git/">gnunet-ev</a> repository.
59 There are no membership dues; however, members are required
60 to support GNUnet e.V. and in particularly contribute to the
61 technical development within their means. For further
62 details, we refer to the
63 <a href="/git/gnunet-ev.git/">Satzung</a>
64 (currently only available in German, translations welcome).
65 {% endtrans %}
66 </p>
67 </div>
68 </div>
69 <div class="row">
70 <div class="col-lg-6">
71 <h3>{{ _("Support Us!") }}</h3>
72 <p>
73 {% trans %}
74 Everybody is welcome to support us via donations. For
75 financial contributions, Europeans are able to donate via
76 SEPA. We hope to setup accounts in other major currency areas
77 in the future. You can also donate via Bitcoin, routing
78 details are given below. Please note that we are unable to
79 provide receipts for your donations. If you are planning to
80 donate a significant amount of money, please contact us first
81 as it might be better to come to a custom arrangement.
82
83 <dl><dt>BitCoin</dt>
84 <dd>1GNUnetpWeR9Zs3vipdvVywo1GseeksjUh</dd>
85 <dt>SEPA/IBAN</dt>
86 <dd>DE67830654080004822650 (BIC/SWIFT: GENODEF1SLR)</dd>
87 </dl>
88 {% endtrans %}
89 </p>
90 </div>
91 <div class="col-lg-6">
92 <h3>{{ _("Official Meeting Notes") }}</h3>
93 <p>
94 <ul>
95 <li>{{ _("2013-12 (constitutional meeting)") }}
96 (<a href="/git/gnunet-ev.git/tree/minutes/2013-12-27.txt">txt</a>)
97 </li>
98 <li>{{ _("2014-12") }}
99 (<a href="/git/gnunet-ev.git/tree/minutes/2014-12-28.txt">txt</a>)
100 </li>
101 <li>{{ _("2015-12") }}
102 (<a href="/git/gnunet-ev.git/tree/minutes/2015-12-29.txt">txt</a>)
103 </li>
104 <li>{{ _("2016-12") }}
105 (<a href="/git/gnunet-ev.git/tree/minutes/2016-12-28.txt">txt</a>)
106 </li>
107 <li>{{ _("2017-12") }}
108 (<a href="/git/gnunet-ev.git/tree/minutes/2017-12-27.txt">txt</a>)
109 </li>
110 <li>{{_("2018-12") }}
111 (<a href="/git/gnunet-ev.git/tree/minutes/2018-12-27.txt">txt</a>)
112 </li>
113 </ul>
114 </p>
115 </div>
116 </div>
117</div>
118
119</div> <!-- /container -->
120</article>
121{% endblock body_content %}
diff --git a/template/faq.html.j2 b/template/faq.html.j2
new file mode 100644
index 00000000..05feb4f8
--- /dev/null
+++ b/template/faq.html.j2
@@ -0,0 +1,51 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<div class="container">
4 <article>
5 <section>
6 <h3>{{ _("I receive many &quot;WARNING Calculated flow delay for X at Y for Z&quot;. Should I worry?") }}</h3>
7 <p>
8 {% trans %}
9 A: Right now, this is expected and a known cause for high
10 latency in GNUnet. We have started a major rewrite to address
11 this and other problems, but until the Transport Next
12 Generation (TNG) is ready, these warnings are expected.
13 {% endtrans %}
14 </p>
15 </section>
16 <section>
17 <h3>{{ _("Is there a graphical user interface?") }}</h3>
18 <p>
19 {% trans %}
20 A: gnunet-gtk is a separate download. The package
21 contains various GTK+ based graphical interfaces, including a
22 graphical tool for configuration.
23 {% endtrans %}
24 </p>
25 </section>
26 </article>
27<!--
28<h2>{{ _("Q?") }}</h2>
29{% trans %}
30<p>
31A:
32</p>
33{% endtrans %}
34
35<h2>{{ _("Q?") }}</h2>
36{% trans %}
37<p>
38A:
39</p>
40{% endtrans %}
41
42<h2>{{ _("Q?") }}</h2>
43{% trans %}
44<p>
45A:
46</p>
47{% endtrans %}
48-->
49
50</div>
51{% endblock body_content %}
diff --git a/template/glossary.html.j2 b/template/glossary.html.j2
new file mode 100644
index 00000000..f394bb77
--- /dev/null
+++ b/template/glossary.html.j2
@@ -0,0 +1,44 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<div class="container">
4
5<dl>
6<!--
7<dt>{{ _("term") }}</dt>
8 <dd>
9 {% trans %}
10 explanation
11 {% endtrans %}
12 </dd>
13</dt>
14-->
15<dt>{{ _("Ego") }}</dt>
16 <dd>
17 {% trans %}
18 explanation
19 {% endtrans %}
20 </dd>
21</dt>
22<dt>{{ _("Identity") }}</dt>
23 <dd>
24 {% trans %}
25 explanation
26 {% endtrans %}
27 </dd>
28</dt>
29<dt>{{ _("Pseudonym") }}</dt>
30 <dd>
31 {% trans %}
32 explanation
33 {% endtrans %}
34 </dd>
35</dt>
36<dt>{{ _("Namespaces (deprecated)") }}</dt>
37 <dd>
38 {% trans %}
39 explanation
40 {% endtrans %}
41 </dd>
42</dt>
43</div>
44{% endblock body_content %}
diff --git a/template/gnurl.html.j2 b/template/gnurl.html.j2
new file mode 100644
index 00000000..dbfbe757
--- /dev/null
+++ b/template/gnurl.html.j2
@@ -0,0 +1,175 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<div class="container-fluid">
4 <article>
5 <h1>{{ _("gnurl (libgnurl)") }}</h1>
6 <p>
7 {% trans %}
8 libgnurl is a micro fork of libcurl. The goal of libgnurl
9 is to support only HTTP and HTTPS (and only HTTP 1.x) with
10 a single crypto backend (GnuTLS) to ensure a small footprint
11 and uniform experience for developers regardless of how
12 libcurl was compiled.<br>
13 Our main usecase is for GNUnet, but it might be usable for
14 others, hence we're releasing the code
15 to the general public.<br>
16 libgnurl is released under the same
17 license as libcurl. Please read the README for instructions, as you
18 must supply the correct options to configure to get a proper build of
19 libgnurl.
20 {% endtrans %}
21 </p>
22 <h3>{{_("Motivation") }}</h3>
23 <p>
24 {% trans %}
25 cURL supports many crypto backends. GNUnet requires the use of
26 GnuTLS, but other variants are used by some distributions. Supporting
27 other crypto backends would again expose us to a wider array of
28 security issues, may create licensing issues and most importantly
29 introduce new bugs as some crypto backends are known to introduce
30 subtle runtime issues. While it is possible to have two versions of
31 libcurl installed on the same system, this is error-prone, especially
32 as if we are linked against the wrong version, the bugs that arise
33 might be rather subtle.
34 {% endtrans %}
35 </p>
36 <p>
37 {% trans %}
38 For GNUnet, we also need a particularly modern version of
39 GnuTLS. Thus, it would anyway be necessary to recompile cURL for
40 GNUnet. But what happens if one links cURL against this version of
41 GnuTLS? Well, first one would install GnuTLS by hand in the
42 system. Then, we build cURL. cURL will build against it just fine, but
43 the linker will eventually complain bitterly. The reason is that cURL
44 also links against a bunch of other system libraries (gssapi, ldap,
45 ssh2, rtmp, krb5, sasl2, see discussion on obscure protocols above),
46 which --- as they are part of the distribution --- were linked against
47 an older version of GnuTLS. As a result, the same binary would be
48 linked against two different versions of GnuTLS. That is typically a
49 recipe for disaster. Thus, in order to avoid updating a dozen system
50 libraries (and having two versions of those installed), it is
51 necessary to disable all of those cURL features that GNUnet does not
52 use, and there are many of those. For GNUnet, the more obscure
53 protocols supported by cURL are close to dead code --- mostly
54 harmless, but not useful. However, as some application may use one of
55 those features, distributions are typically forced to enable all of
56 those features, and thus including security issues that might arise
57 from that code.
58 {% endtrans %}
59 </p>
60 <p>
61 {% trans %}
62 So to use a modern version of GnuTLS, a sane approach is to disable
63 all of the "optional" features of cURL that drag in system libraries
64 that link against the older GnuTLS. That works, except that one should
65 then NEVER install that version of libcurl in say /usr or /usr/local,
66 as that may break other parts of the system that might depend on these
67 features that we just disabled. Libtool versioning doesn't help here,
68 as it is not intended to deal with libraries that have optional
69 features. Naturally, installing cURL somewhere else is also
70 problematic, as we now need to be really careful that the linker will
71 link GNUnet against the right version. Note that none of this can
72 really be trivially fixed by the cURL developers.
73 {% endtrans %}
74 </p>
75 <h3>{{_("Rename to fix") }}</h3>
76 <p>
77 {% trans %}
78 How does forking fix it? Easy. First, we can get rid of all of the
79 compatibility issues --- if you use libgnurl, you state that you don't
80 need anything but HTTP/HTTPS. Those applications that need more,
81 should stick with the original cURL. Those that do not, can choose to
82 move to something simpler. As the library gets a new name, we do not
83 have to worry about tons of packages breaking as soon as one rebuilds
84 it. So renaming itself and saying that "libgnurl = libcurl with only
85 HTTP/HTTPS support and GnuTLS" fixes 99%% of the problems that darkened
86 my mood. Note that this pretty much CANNOT be done without a fork, as
87 renaming is an essential part of the fix. Now, there might be creative
88 solutions to achieve the same thing within the standard cURL build
89 system, but I'm not happy to wait for a decade for Daniel to review
90 the patches. The changes libgnurl makes to curl are miniscule and can
91 easily be applied again and again whenever libcurl makes a new
92 release.
93 {% endtrans %}
94 </p>
95 <h3>{{_("Using libgnurl") }}</h3>
96 <p>
97 {% trans %}
98 Projects that use cURL only for HTTP/HTTPS and that would work
99 with GnuTLS should be able to switch to libgnurl by changing
100 "-lcurl" to "-lgnurl". That's it. No changes to the source code
101 should be required,
102 as libgnurl strives for bug-for-bug compatibility with the
103 HTTP/HTTPS/GnuTLS subset of cURL.
104 We might add new features relating to this core subset if they
105 are proposed, but so far we have kept our changes minimal and
106 no additions to the original curl source have been written.
107 {% endtrans %}
108 </p>
109 <h4>{{_("Gotchas") }}</h4>
110 <p>
111 {% trans %}
112 libgnurl and gnurl are not intended to be used as a replacement
113 for curl for users. Since no conflicts in filenames should occur
114 you are not expected to remove curl to make use of gnurl and
115 viceversa.
116 {% endtrans %}
117 </p>
118 </article>
119</div>
120
121<div class="container adorn_h3_bracket">
122 <div class="row">
123 <div class="col-lg-6">
124 <h3>{{ _("Source Code") }}</h3>
125 <p>
126 {% trans %}
127 You can get the Gnurl Git repository using:
128 <code>git clone https://git.taler.net/gnurl.git</code>
129 The versions are checked in as signed git tags.
130 {% endtrans %}
131 </p>
132 </div>
133 <div class="col-lg-6">
134 <h3>{{ _("Downloads") }}</h3>
135 <p>
136 {% trans %}
137 Releases are published on <a href="https://ftp.gnu.org/gnu/gnunet/">ftp.gnu.org/gnu/gnunet</a>.
138 gnURL is available from within a variety of distributions and package managers.
139 Package Managers which include gnurl are:
140 <a href="https://gnu.org/s/guix">GNU Guix</a> (available as "gnurl"),
141 <a href="https://gentoo.org">Gentoo</a> through the collaborative ebuild collection
142 <a href="https://gnunet.org/git/youbroketheinternet-overlay.git/">youbroketheinternet</a>,
143 <a href=https://nixos.org/nix">Nix</a>, and <a href="http://pkgsrc.org">pkgsrc</a>.
144 {% endtrans %}
145 </p>
146 </div>
147 </div>
148 <div class="row">
149 <div class="col-lg-6">
150 <h3>{{ _("Reporting Bugs") }}</h3>
151 <p>
152 {% trans %}
153 You can report bugs on our bug tracker:
154 <a href="https://gnunet.org/bugs/">gnunet.org/bugs</a>. Alternatively
155 you can use our bug mailinglist, but we prefer to track bugs
156 on the bugtracker.
157 {% endtrans %}
158 </p>
159 </div>
160 <div class="col-lg-6">
161 <h3>{{ _("Maintainer and Cryptographic signatures") }}</h3>
162 <p>
163 {% trans %}
164 gnur/libgnurl is maintained by ng0.
165 Releases are signed
166 with the OpenPG Key <b>A88C8ADD129828D7EAC02E52E22F9BBFEE348588</b>,
167 with the key fingerprint <b>A88C 8ADD 1298 28D7 EAC0 2E52 E22F 9BBF EE34 8588</b>.
168 {% endtrans %}
169 </p>
170 </div>
171 </div>
172</div>
173
174</div> <!-- /container -->
175{% endblock body_content %}
diff --git a/template/index.html.j2 b/template/index.html.j2
new file mode 100644
index 00000000..48e41248
--- /dev/null
+++ b/template/index.html.j2
@@ -0,0 +1,293 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<!-- Jumbotron -->
4<div class="container-logo banner dark text-center">
5 <img src="{{ url('static/images/gnunet-anonymous-logo.png') }}" />
6</div>
7<div class="jumbotron">
8 <div class="container text-center">
9 <p>
10 {% trans %}
11 GNUnet is a new network protocol stack for building secure, distributed,
12 and privacy-preserving applications. With strong roots in academic
13 <a href="https://old.gnunet.org/bibliography">research</a>, our goal is to replace the
14 <a href="https://secushare.org/broken-internet">old insecure Internet</a>
15 protocol stack.
16 {% endtrans %}
17 <br><br>
18 {% trans %}
19 GNUnet is typically run as an
20 <a href="https://en.wikipedia.org/wiki/Overlay_network">overlay network</a>
21 on top of the the existing Internet infrastructure forming the
22 basis of a hybrid
23 <a href="architecture.html">peer-to-peer mesh and relay backbone</a>
24 for applications to run on. It could just as well be run
25 independently of the Internet, over
26 <a href="https://en.wikipedia.org/wiki/Physical_layer">dedicated radio and cable</a>.
27 {% endtrans %}
28 <br><br>
29 {% trans %}
30 GNUnet is made for an open society: It's a self-organizing
31 network and it is
32 <a href="http://www.gnu.org/philosophy/free-sw.html">free software</a>
33 as in freedom. GNUnet puts you in control of your data. You
34 determine which data to share with whom, and you're not
35 pressured to accept compromises.
36 {% endtrans %}
37 </p>
38 <p>
39 <a class="btn btn-primary btn-lg" href="https://git.gnunet.org/gnunet.git">
40 {% trans %}
41 Download GNUnet (via Git)
42 {% endtrans %}
43 </a>
44 <a class="btn btn-primary btn-lg" href="ev.html">
45 {% trans %}
46 Join &amp; support us!
47 {% endtrans %}
48 </a>
49 </p>
50 </div>
51</div>
52
53<div class="container-fluid adorn_h3_bracket c_acronym">
54 <div class="container">
55 <div class="row">
56 <div class="container text-center">
57 <h1>{% trans %}The Internet of tomorrow needs GNUnet today{% endtrans %}</h1>
58 </div>
59 </div>
60 <div class="row">
61 <div class="col-lg-4">
62 <h3>{{ _("Imagine...") }}</h3>
63 <p>
64 {% trans %}
65 The conventional Internet is currently like a system of roads
66 with deep potholes and highwaymen all over the place. Even if
67 you still can use the roads (e.g. send emails, or browse
68 websites) your vehicle might get hijacked, damaged, or long
69 arms might reach into its back and steal your items (data) to
70 use it against you and sell it to others - while you can't
71 even notice the thievery nor accuse and hold the scroungers
72 accountable.
73 {% endtrans %}
74 </p>
75 </div>
76 <div class="col-lg-4">
77 <h3>{{ _("The Internet is broken") }}</h3>
78
79 <p>
80 {% trans %}
81 Protocols from Ethernet and IP to BGP and X.509 PKI are
82 insecure by default: protecting against address forgery,
83 routers learning metadata, or choosing trustworthy CAs is
84 nontrivial and sometimes impossible.
85 {% endtrans %}
86 </p>
87 <p>
88 {% trans %}
89 GNUnet provides
90 <a href="https://www.w3.org/2014/strint/papers/65.pdf">privacy by design</a>,
91 improving addressing, routing, naming and
92 content distribution in a technically robust manner - as
93 opposed to ad-hoc designs in place today.
94 {% endtrans %}
95 </p>
96 </div>
97 <div class="col-lg-4">
98 <h3>{{ _("Decentralization is hard") }}</h3>
99
100 <p>
101 {% trans %}
102 It seems as if every other distributed or P2P project
103 develops its own library stack, covering transports, stream
104 muxing, discovery and others. This divides effort and
105 multiplies bug count.
106 {% endtrans %}
107 <p>
108 {% trans %}
109 GNUnet is a metadata-preserving foundation for your
110 application, covering areas from addressing to reliable
111 bidirectional Axolotl-encrypted channels, with advanced
112 routing. Our work is based on continuous research spanning
113 almost two decades.
114 {% endtrans %}
115 </p>
116 </div>
117 </div>
118 <div class="row">
119 <div class="col-lg-4">
120 <h3>{{ _("Metadata is exposed") }}</h3>
121 <p>
122 {% trans %}
123 Even though transport encryption is increasingly being
124 deployed on the Internet, it still reveals data that can
125 threaten democracy: the identities of senders and receivers,
126 the times, frequency and the volume of communication are all
127 still revealed.
128 <!-- Looks like a weak argumentation to me:
129 which <a
130 href="https://www.freehaven.net/anonbib/cache/websitefingerprinting-pets2016.pdf">enables
131 reverse-engineering pages visited via website
132 fingerprinting</a>. -->
133 {% endtrans %}
134 <p>
135 {% trans %}
136 GNUnet
137 <a href="https://secushare.org/anonymity">addresses</a>
138 these concerns with perfect forward secrecy via ephemeral
139 public key addressing, fixed packet size to hinder traffic
140 analysis, layered encryption, Sybil-resistant routing, and
141 more.
142 {% endtrans %}
143 </p>
144 </div>
145 <div class="col-lg-4">
146 <h3>{{ _("Freedoms are not respected") }}</h3>
147 <p>
148 {% trans %}
149 Today, monitoring increasingly centralized infrastructure,
150 proprietary implementations, traffic shapers and firewalls
151 restrict all of the
152 <a href="https://www.gnu.org/philosophy/free-sw.html">essential freedoms</a>
153 to various degrees.
154 {% endtrans %}
155 </p>
156 <p>
157 {% trans %}
158 GNUnet gives users freedoms to securely access information
159 ("run" the network), to study all aspects of the network’s
160 operation ("access the code"), to distribute information
161 ("copy"), as well as the freedom to deploy new applications
162 ("modify").
163 {% endtrans %}
164 </p>
165 </div>
166 </div>
167 </div>
168 <!--
169 <div class="container">
170 <div class="row">
171 <div class="container text-center bg-primary">
172 <h3>
173 {% trans %}
174 GNUnet aims to enable a secure and ethical Internet.
175 {% endtrans %}
176 </h3>
177 </div>
178 </div>
179 </div>
180 //-->
181</div>
182
183
184
185<div class="container adorn_h3_bracket">
186 <div class="row">
187 <div class="container text-center">
188 <h1>
189 {% trans %}
190 Featured Applications
191 {% endtrans %}
192 </h1>
193 </div>
194 </div>
195 <div class="row">
196 <div class="col-lg-4">
197 <h3>{{ _("GNU Taler") }}</h3>
198
199 <p>
200 {% trans %}
201 <a href="https://taler.net/">GNU Taler</a>
202 is a new privacy-preserving electronic payment system.
203 Payments are cryptographically
204 secured and are confirmed within milliseconds with
205 extremely low transaction costs.
206 {% endtrans %}
207 </p>
208 </div>
209
210 <div class="col-lg-4">
211 <h3>{{ _("The GNU Name System") }}</h3>
212
213 <p>
214 {% trans %}
215 The GNU Name System (GNS) is a fully decentralized replacement
216 for the Domain Name System (DNS). Instead of using a
217 hierarchy, GNS uses a directed graph. Naming conventions
218 are similar to DNS, but queries and replies are private even
219 with respect to peers providing the answers. The integrity of
220 records and privacy of look-ups is cryptographically secured.
221 <!-- Too technical: GNS integrates
222 a robust, efficient and instant key revocation mechanism. -->
223 {% endtrans %}
224 </p>
225
226 </div>
227 <div class="col-lg-4">
228 <h3>{{ _("secushare") }}</h3>
229
230 <p>
231 {% trans %}
232 <a href="https://secushare.org/">secushare</a>
233 is creating a decentralized social networking
234 application on top of GNUnet. Using overlay
235 multicast and the extensible PSYC protocol, notifications are
236 distributed end-to-end encrypted to authorized recipients only.
237 {% endtrans %}
238 </p>
239 </div>
240 </div>
241
242 <div class="row">
243 <div class="col-lg-4">
244 <h3>{{ _("pretty Easy privacy") }}</h3>
245
246 <p>
247 {% trans %}
248 <a href="https://pep.foundation/">pretty Easy privacy</a> (p&#8801;p)
249 is creating a usable end-to-end encrypted e-mail solution using
250 opportunistic key exchange.
251 p&#8801;p will use GNUnet to protect metadata and exploit new
252 cryptographic protocols to verify keys.
253 {% endtrans %}
254 </p>
255 </div>
256 <div class="col-lg-4">
257 <h3>{{ _("Filesharing") }}</h3>
258 <p>
259 {% trans %}
260 GNUnet filesharing is an application that provides
261 censorship-resistant, anonymous filesharing. The publisher is
262 empowered to make a gradual choice between performance and anonymity.
263 {% endtrans %}
264 </p>
265
266 </div>
267 <div class="col-lg-4">
268 <h3>{{ _("Conversation") }}</h3>
269 <p>
270 {% trans %}
271 GNUnet conversation is an application that provides secure
272 voice communication in a fully decentralized way by employing
273 GNUnet for routing and transport.
274 {% endtrans %}
275 </p>
276
277 </div>
278 </div>
279</div>
280
281<div class="container adorn_h3_bracket">
282 <div class="row">
283 <div class="container text-center">
284 <h1>{{ _("News") }}</h1>
285 </div>
286 </div>
287 <div class="row">
288 <div class="col-lg-12">
289 {% include "template/news.html.j2.inc" %}
290 </div>
291 </div>
292</div> <!-- /container -->
293{% endblock body_content %}
diff --git a/template/news.html.j2.inc b/template/news.html.j2.inc
new file mode 100644
index 00000000..d4a422ba
--- /dev/null
+++ b/template/news.html.j2.inc
@@ -0,0 +1,3 @@
1{% include "news/2019-02.inc" %}
2{% include "news/2018-07.inc" %}
3<a href="old-news.html"><h3>{{ _("More news")}}</h3></a>
diff --git a/template/old-news.html.j2 b/template/old-news.html.j2
new file mode 100644
index 00000000..671af1c1
--- /dev/null
+++ b/template/old-news.html.j2
@@ -0,0 +1,27 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3
4<div class="jumbotron">
5 <div class="container text-center">
6 <h1>{{ _("Older News") }}</h1>
7 <div class="col-lg-12">
8 <p>
9 {% trans %}
10 This page documents the GNUnet history.
11 {% endtrans %}
12 </p>
13 </div>
14 </div>
15</div>
16
17<div class="container">
18 <div class="row">
19 <div class="col-lg-12">
20{% include "news/2018-06.inc" %}
21{% include "news/2018-08.inc" %}
22{% include "news/2017-10.inc" %}
23 </div>
24 </div>
25</div> <!-- /container -->
26
27{% endblock body_content %}
diff --git a/template/team.html.j2 b/template/team.html.j2
new file mode 100644
index 00000000..7e437478
--- /dev/null
+++ b/template/team.html.j2
@@ -0,0 +1,210 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<section class="team">
4 <!-- list alphabetical, first those with images, then those without -->
5 <div class="container">
6 <div class="row">
7 <div class="col-md-10 col-md-offset-1">
8 <div class="col-lg-12">
9 <h6 class="description">The developer team working on GNUnet</h6>
10 <div class="row pt-md">
11 <div class="col-lg-3 col-md-3 col-sm-4 col-xs-12 profile">
12 <!-- <div class="col-6 col-md-4 profile"> -->
13 <div class="img-box">
14 <!-- was: height="240" -->
15 <img src="{{ url('static/team-images/christian-grothoff.jpg') }}" alt="Christian Grothoff" class="img-fluid">
16 <ul class="text-center">
17 <li><a href="https://grothoff.org/christian"><i class="fas fa-home"></i></a></li>
18 </ul>
19 </div>
20 <h1><a href="https://grothoff.org/christian/">Christian Grothoff</a></h1>
21 <h2>{{ _("GNU maintainer.") }}</h2>
22 <p></p>
23 </div>
24 <div class="col-lg-3 col-md-3 col-sm-4 col-xs-12 profile">
25 <!-- <div class="col-6 col-md-4 profile"> -->
26 <div class="img-box">
27 <!-- was: height="240" -->
28 <img src="{{ url('static/team-images/default.png') }}" alt="dvn" class="img-fluid">
29 <ul class="text-center">
30 </ul>
31 </div>
32 <h1>dvn</h1>
33 <h2>{{ _("Continuous Integration, secushare, packaging (Guix).") }}</h2>
34 <p></p>
35 </div>
36 <div class="col-lg-3 col-md-3 col-sm-4 col-12 profile">
37 <!-- <div class="col-6 col-md-4 profile"> -->
38 <div class="img-box">
39 <!-- was: height="240" -->
40 <img src="{{ url('static/team-images/florian-dold.jpg') }}" alt="Florian Dold" class="img-fluid">
41 <ul class="text-center">
42 <a href="https://fdold.eu"><li><i class="fas fa-home"></i></li></a>
43 </ul>
44 </div>
45 <h1>Florian Dold</h1>
46 <h2>{{ _("Set, Consensus, Voting") }}</h2>
47 <p></p>
48 </div>
49 <div class="col-lg-3 col-md-3 col-sm-4 col-12 profile">
50 <!-- <div class="col-6 col-md-4 profile"> -->
51 <div class="img-box">
52 <!-- was: height="240" -->
53 <img src="{{ url('static/team-images/jeff-burdges.jpg') }}" alt="Jeffrey Burdges" class="img-fluid">
54 <ul class="text-center">
55 </ul>
56 </div>
57 <h1>Jeffrey Burdges</h1>
58 <h2>{{ _("Mix networking") }}</h2>
59 <p></p>
60 </div>
61 <div class="col-lg-3 col-md-3 col-sm-4 col-12 profile">
62 <div class="img-box">
63 <!-- was: height="240" -->
64 <img src="{{ url('static/team-images/default.png') }}" alt="Julius B&uuml;nger" class="img-fluid">
65 <ul class="text-center">
66 </ul>
67 </div>
68 <h1>Julius B&uuml;ger</h1>
69 <h2>{{ _("Random peer sampling") }}</h2>
70 <p></p>
71 </div>
72 <div class="col-lg-3 col-md-3 col-sm-4 col-12 profile">
73 <div class="img-box">
74 <!-- was: height="240" -->
75 <img src="{{ url('static/team-images/default.png') }}" alt="lurchi" class="img-fluid">
76 <ul class="text-center">
77 </ul>
78 </div>
79 <h1>lurchi</h1>
80 <h2>{{ _("secushare, Social, PSYC, Multicast") }}</h2>
81 <p></p>
82 </div>
83 <div class="col-lg-3 col-md-3 col-sm-4 col-12 profile">
84 <div class="img-box">
85 <!-- was: height="240" -->
86 <img src="{{ url('static/team-images/schanzenbach.jpg') }}" alt="Martin Schanzenbach" class="img-fluid">
87 <ul class="text-center">
88 <a href="https://schanzen.eu"><li><i class="fas fa-home"></i></li></a>
89 </ul>
90 </div>
91 <h1>Martin Schanzenbach</h1>
92 <h2>{{ _("GNU Name System, Identity Management, ABE.") }}</h2>
93 <p></p>
94 </div>
95 <div class="col-lg-3 col-md-3 col-sm-4 col-12 profile">
96 <div class="img-box">
97 <!-- was: height="240" -->
98 <img src="{{ url('static/team-images/sree-harsha-totakura.jpg') }}" alt="Sree Harsha Totakura" class="img-fluid">
99 <ul class="text-center">
100 <a href="http://sreeharsha.totakura.in/"><li><i class="fas fa-home"></i></li></a>
101 </ul>
102 </div>
103 <h1>Sree Harsha Totakura</h1>
104 <h2>{{ _("Testbed, voice.") }}</h2>
105 <p></p>
106 </div>
107 <div class="col-lg-3 col-md-3 col-sm-4 col-12 profile">
108 <div class="img-box">
109 <!-- was: height="240" -->
110 <img src="{{ url('static/team-images/t3sserakt.jpg') }}" alt="t3sserakt" class="img-fluid">
111 <ul class="text-center">
112 </ul>
113 </div>
114 <h1>t3sserakt</h1>
115 <h2>{{ _("secushare, Social, PSYC, Multicast.") }}</h2>
116 <p></p>
117 </div>
118 <div class="col-lg-3 col-md-3 col-sm-4 col-12 profile">
119 <div class="img-box">
120 <!-- was: height="240" -->
121 <img src="{{ url('static/team-images/default.png') }}" alt="wldhx" class="img-fluid">
122 <ul class="text-center">
123 </ul>
124 </div>
125 <h1>wldhx</h1>
126 <h2>{{ _("Web site, packaging (Nix/Guix).") }}</h2>
127 <p></p>
128 </div>
129 <div class="col-lg-3 col-md-3 col-sm-4 col-12 profile">
130 <div class="img-box">
131 <!-- was: height="240" -->
132 <img src="{{ url('static/team-images/default.png') }}" alt="lynX" class="img-fluid">
133 <ul class="text-center">
134 <a href="http://my.pages.de"><li><i class="fas fa-home"></i></li></a>
135 </ul>
136 </div>
137 <h1>carlo von lynX</h1>
138 <h2>{{ _("secushare, PSYC, multicast, advocacy, sights and sounds, UX.") }}</h2>
139 <p></p>
140 </div>
141 <div class="col-lg-3 col-md-3 col-sm-4 col-12 profile">
142 <div class="img-box">
143 <!-- was: height="240" -->
144 <img src="{{ url('static/team-images/default.png') }}" alt="Christian K&uuml;hne" class="img-fluid">
145 <ul class="text-center">
146 </ul>
147 </div>
148 <h1>Christian K&uuml;hne</h1>
149 <h2>{{ _("secushare, Social, PSYC, Multicast, data protection theory.") }}</h2>
150 <p></p>
151 </div>
152 <div class="col-lg-3 col-md-3 col-sm-4 col-xs-12 profile">
153 <div class="img-box">
154 <img src="{{ url('static/team-images/default.png') }}" alt="Bart Polot" class="img-fluid">
155 <ul class="text-center">
156 </ul>
157 </div>
158 <h1>Bart Polot</h1>
159 <h2>{{ _("NSE, CADET.") }}</h2>
160 <p></p>
161 </div>
162 <div class="col-lg-3 col-md-3 col-sm-4 col-xs-12 profile">
163 <div class="img-box">
164 <img src="{{ url('static/team-images/default.png') }}" alt="LRN" class="img-fluid">
165 <ul class="text-center">
166 </ul>
167 </div>
168 <h1>LRN</h1>
169 <h2>{{ _("W32 port.") }}</h2>
170 <p></p>
171 </div>
172 <div class="col-lg-3 col-md-3 col-sm-4 col-xs-12 profile">
173 <div class="img-box">
174 <img src="{{ url('static/team-images/default.png') }}" alt="Nils Durner" class="img-fluid">
175 <ul class="text-center">
176 </ul>
177 </div>
178 <h1>Nils Durner</h1>
179 <h2>{{ _("W32 port.") }}</h2>
180 <p></p>
181 </div>
182 <div class="col-lg-3 col-md-3 col-sm-4 col-xs-12 profile">
183 <div class="img-box">
184 <img src="{{ url('static/team-images/ng0.jpg') }}" alt="ng0" class="img-fluid">
185 <ul class="text-center">
186 <a href="https://n0.is"><li><i class="fas fa-home"></i></li></a>
187 </ul>
188 </div>
189 <h1>ng0</h1>
190 <h2>{{ _("Documentation, Website, libgnurl, System Integration, Build System, packaging (NetBSD pkgsrc, Guix, Gentoo,...).") }}</h2>
191 <p></p>
192 </div>
193 <div class="col-lg-3 col-md-3 col-sm-4 col-xs-12 profile">
194 <div class="img-box">
195 <img src="{{ url('static/team-images/default.png') }}" alt="tg" class="img-fluid">
196 <ul class="text-center">
197 </ul>
198 </div>
199 <h1>tg</h1>
200 <h2>{{ _("Multicast.") }}</h2>
201 <p></p>
202 </div>
203 </div>
204 </div>
205 </div>
206 </div>
207 </div>
208<!-- </div> -->
209</section>
210{% endblock body_content %}
diff --git a/template/tutorial-archpi.html.j2 b/template/tutorial-archpi.html.j2
new file mode 100644
index 00000000..893a7de8
--- /dev/null
+++ b/template/tutorial-archpi.html.j2
@@ -0,0 +1,150 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<div class="container">
4
5<h2>{{ _("Tutorial: GNUnet on Archlinux/Pi") }}</h2>
6
7Welcome to this GNUnet tutorial for Archlinux on a Raspberry Pi 3. If you want
8to run a GNUnet node on a separte system, permanently online, with low energy
9consumption, this might be the thing for you. This tutorial shows you how to
10install, run, and operate it.
11
12<h3>{{ _("Requirements") }}</h3>
13
14<p>First you need the hardware. This tutorial works with a Raspberry Pi 3. The
15other Pi versions I haven't tested, but they should probably work, too. To
16install Archlinux on the Pi3, follow the instructions from <a
17href="https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3">archlinuxarm.org</a>.</p>
18
19<p>That was easy, right? Our goal now is to build GNUnet from source. So, let's
20install the tools for building new software.</p>
21
22<p><code>
23> sudo pacman -S base-devel
24</code></p>
25
26<p>Now we can continue to install the following Archlinux dependencies to
27compile GNUnet on our Pi.</p>
28
29<p><code>
30$ pacman -Su libmicrohttpd libgcrypt gnurl libunistring gnutls libidn
31libextractor openssl libltdl sqlite texinfo which gettext zlib
32pkg-config git miniupnpc libextractor jansson nim
33</code></p>
34
35<h3>{{ _("Get the Source Code") }}</h3>
36
37<p>We are getting closer. Download the GNUnet source code which we will build
38in the next step:<p>
39
40<p><code>
41> git clone https://gnunet.org/git/gnunet.git<br>
42</code></p>
43
44<p>Now it's time to compile GNUnet.</p>
45
46<p><code>
47> cd gnunet<br>
48> ./bootstrap # Run this to generate the configure files.<br>
49> ./configure # Use --help to see the various flags available to you.<br>
50> make -j$(nproc || echo -n 1)<br>
51> sudo make install<br>
52</code></p>
53
54<p>Congrats! GNUnet is now installed!</p>
55
56<h3>{{ _("Run") }}</h3>
57
58<p>By default GNUnet looks in our home directory for the file
59~/.gnunet/gnunet.conf. We can start with an empty file for now:</p>
60
61<p><code>
62> touch ~/.config/gnunet.conf
63</code></p>
64
65<p>Now we can start it with the commandline tool gnunet-arm (Automatic Restart
66Manager).</p>
67
68<p><code>
69> gnunet-arm -s
70</code></p>
71
72<p>It starts the default GNUnet services. We can list them with the -I option:</p>
73
74<p><code>
75> gnunet-arm -I<br>
76Running services:<br>
77ats (gnunet-service-ats)<br>
78revocation (gnunet-service-revocation)<br>
79set (gnunet-service-set)<br>
80nat (gnunet-service-nat)<br>
81transport (gnunet-service-transport)<br>
82peerstore (gnunet-service-peerstore)<br>
83hostlist (gnunet-daemon-hostlist)<br>
84identity (gnunet-service-identity)<br>
85namecache (gnunet-service-namecache)<br>
86peerinfo (gnunet-service-peerinfo)<br>
87datastore (gnunet-service-datastore)<br>
88zonemaster (gnunet-service-zonemaster)<br>
89zonemaster-monitor (gnunet-service-zonemaster-monitor)<br>
90nse (gnunet-service-nse)<br>
91cadet (gnunet-service-cadet)<br>
92dht (gnunet-service-dht)<br>
93core (gnunet-service-core)<br>
94gns (gnunet-service-gns)<br>
95statistics (gnunet-service-statistics)<br>
96topology (gnunet-daemon-topology)<br>
97fs (gnunet-service-fs)<br>
98namestore (gnunet-service-namestore)<br>
99vpn (gnunet-service-vpn)<br>
100</code></p>
101
102<p>For stopping GNUnet again we can use the -e option.</p>
103
104<p><code>
105> gnunet-arm -e
106</code></p>
107
108<h3>{{ _("Make sure, it works!") }}</h3>
109
110After starting GNUnet you should make sure that your peer is connecting to the
111P2P-network. By typing gnunet-core you should see something like this:
112
113<p><code>
114> gnunet-core<br>
115Tue Oct 30 19:58:48 2018: connection established DSTJ (timeout in 293 s)<br>
116Tue Oct 30 19:58:48 2018: connection established A4MK (timeout in 292 s)<br>
117Tue Oct 30 19:58:48 2018: connection established 7WRD (timeout in 299 s)<br>
118Tue Oct 30 19:58:48 2018: connection established 5WBG (timeout in 299 s)<br>
119</code></p>
120
121<h3>{{ _("Chat the cat") }}</h3>
122
123<p>To be able to chat, we need to install and compile additional
124software.</p>
125
126<p><code>
127> git clone https://gnunet.org/git/gnunet-nim.git<br>
128> cd gnunet-nim/examples<br>
129> nim c groupchat.nim
130</code></p>
131
132<p>Fine! We can now try to enter a chat server running on another GNUnet node.
133
134<p><code>
135> LD_LIBRARY_PATH=/path/to/gnunetlibs ./groupchat --config=/path/to/gnunet.conf --server=YV6G9EP9K3X41BM3FJ3D29BDZR6358XNZ6KDZVV7DFW729YB0KCG --port=welcome --nick=YOURNICK
136</code></p>
137
138<p>You should now see something like this:</p>
139
140<p><code>
141> 2018-10-30 19:50:10 Welcome 8Q2T! participants: @[] <br>
142Hello GNUnet!<br>
1432018-10-30 19:52:53 [8Q2T] Hello GNUnet!
144</code></p>
145
146<p>Here we have typed "Hello gnunet!" to standard in which is then written out
147to standard out after having been sent back from GNUnet.</p>
148
149</div>
150{% endblock body_content %}
diff --git a/template/tutorial-debian9.html.j2 b/template/tutorial-debian9.html.j2
new file mode 100644
index 00000000..2f128333
--- /dev/null
+++ b/template/tutorial-debian9.html.j2
@@ -0,0 +1,557 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<div class="container">
4
5 <h2>{{ _("Tutorial: GNUnet on Debian 9") }}</h2>
6
7 <h3>{{ _("Introduction") }}</h3>
8
9 <p>
10 Welcome to the hopefully painless GNUnet tutorial for Debian 9! It provides
11 very concrete instructions on how to compile, install and configure a current
12 version of GNUnet. The goal is to support newcomers, either end users or
13 developers, who want to get in touch with GNUnet for the first time. After
14 installing GNUnet we will make sure that out new GNUnet installation is working
15 correctly.
16 </p>
17
18 <p>
19 <b>Attention: If you came across the official gnunet package for Debian 9,
20 ignore it! It is ancient and not compatible with current GNUnet
21 installations.</b>
22 </p>
23
24 <p>
25 Now let's start!
26 </p>
27
28 <h3>{{ _("Requirements") }}</h3>
29
30 <p>
31 First let's install the following Debian 9 packages to use GNUnet
32 painlessly. Optional dependencies are listed in Appendix A. They are required
33 for some experimental GNUnet features.
34 </p>
35
36 <code>
37 $ sudo apt install git libtool autoconf autopoint build-essential libgcrypt-dev libidn11-dev zlib1g-dev libunistring-dev libglpk-dev miniupnpc libextractor-dev libjansson-dev libcurl4-gnutls-dev libsqlite3-dev openssl libnss3-tools
38 </code>
39
40 <h3>{{ _("Make an installation directory") }}</h3>
41
42 <p>
43 Next we create a directory in our home directory where we store
44 the source code later. We should keep this directory after
45 installation because it contains Makefiles that can be used for
46 uninstalling GNUnet again (see chapter *Uninstall GNUnet and its
47 dependencies*).
48 </p>
49
50 <code>
51 $ mkdir ~/gnunet_installation
52 </code>
53
54 <h3>{{ _("Get the source code") }}</h3>
55
56 <p>
57 We download the GNUnet source code using git. On Debian 9 we need the
58 sources of another library (libmicrohttpd).
59 </p>
60
61 <p>
62 <b>Attention: The official libmicrohttpsd package for Debian 9 is too old, we need
63 at least version 0.9.52.</b>
64 </p>
65
66 <code>
67 $ cd ~/gnunet_installation<br>
68 $ git clone --depth 1 https://gnunet.org/git/gnunet.git<br>
69 $ git clone --depth 1 https://gnunet.org/git/libmicrohttpd.git
70 </code>
71
72 <h3>{{ _("Compile and Install") }}</h3>
73
74
75 <p>
76 Before we can compile GNUnet on Debian 9, we compile and install libmicrohttp
77 </p>
78
79 <code>
80 $ cd ~/gnunet_installation/libmicrohttpd<br>
81 $ autoreconf -fi<br>
82 $ sudo apt install libgnutls28-dev<br>
83 $ ./configure --disable-doc --prefix=/opt/libmicrohttpd<br>
84 $ make -j$(nproc || echo -n 1)<br>
85 $ sudo make install<br>
86 </code>
87
88 <p>
89 Installing GNUnet is not hard. We have two options:
90 installing a *production version* and installing a *development version*. If
91 you want to start writing GNUnet applications or join the GNUnet development
92 choose the development version (it will print more debug output and contains
93 debug symbols that can be displayed with a debugger). Otherwise choose the
94 production version.
95 </p>
96
97 <h4>{{ _("Option 1: GNUnet for production / usage") }}</h4>
98
99 <code>
100 $ cd ~/gnunet_installation/gnunet<br>
101 $ ./bootstrap<br>
102 $ export GNUNET_PREFIX=/usr<br>
103 $ ./configure --prefix=$GNUNET_PREFIX --disable-documentation --with-microhttpd=/opt/libmicrohttpd<br>
104 $ sudo addgroup gnunetdns<br>
105 $ sudo adduser --system --group --disabled-login --home /var/lib/gnunet gnunet<br>
106 $ make -j$(nproc || echo -n 1)<br>
107 $ sudo make install
108 </code>
109
110 <h4>{{ _("Option 2: GNUnet for development") }}</h4>
111
112 <code>
113 $ cd ~/gnunet_installation/gnunet<br>
114 $ ./bootstrap<br>
115 $ export GNUNET_PREFIX=/usr<br>
116 $ export CFLAGS="-g -Wall -O0"<br>
117 $ ./configure --prefix=$GNUNET_PREFIX --disable-documentation --enable-logging=verbose --with-microhttpd=/opt/libmicrohttpd<br>
118 $ make -j$(nproc || echo -n 1)<br>
119 $ sudo make install
120 </code>
121
122<!--
123 <h4>{{ _("Install GNUnet plugin for name resolution") }}</h4>
124 <p>
125 So now it gets a bit nasty. It's not so bad. All we have to do
126 is copy a file and edit another one. The file we need to copy
127 is GNUnet's plugin for the Name Service Switch (NSS) in unix
128 systems. Different unixes expect it in different locations and
129 GNUnet's build system does not try to guess. On Debian 9 we
130 have to do
131 <code>
132 $ sudo cp /usr/lib/gnunet/nss/libnss_gns.so.2 /lib/$(uname -m)-linux-gnu/
133 </code>
134 </p>
135
136 <p>
137 The next step is activating the GNUnet plugin we just copied
138 in the NSS config. It is located in `/etc/nsswitch.conf`. It should
139 contain a line starting with "hosts" similar to this (at least "files"
140 and "dns" should be there):
141 </p>
142
143 <p>
144 <code>
145 $ cat /etc/nsswitch.conf<br>
146 hosts: files mdns4_minimal [NOTFOUND=return] dns
147 </code>
148 </p>
149
150 <p>
151 <b>Attention: Once we modified `etc/nsswitch.conf` DNS resolution will only
152 be possible as long as is GNUnet is running. We can leave the next step out,
153 but then we will not be able to use GNUnet's name resolution in external
154 applications.</b>
155 </p>
156
157 <p>We save a copy of the original file and then modify the line using sed:</p>
158
159 <p>
160 <code>
161 $ sudo cp /etc/nsswitch.conf /etc/nsswitch.conf.original<br>
162 $ sudo sed -i -E 's/^(hosts:.*) dns/\1 gns [NOTFOUND=return] dns/' /etc/nsswitch.conf
163 </code>
164 </p>
165
166 <p>Now in the line starting with "hosts" should contain an entry "gns [NOTFOUND=return]" before the "dns" entry like this:</p>
167
168 <p>
169 <code>
170 hosts: files mdns4_minimal [NOTFOUND=return] gns [NOTFOUND=return] dns
171 </code>
172 </p>
173
174 <p>That's it. It wasn't that nasty, was it?</p>
175-->
176
177 <h3>{{ _("Configuration") }}</h3>
178
179 <p>
180 Congratulations! GNUnet is now installed! Before we start it we
181 need to create a configuration file. By default GNUnet looks in
182 our home directory for the file `~/.gnunet/gnunet.conf`. We can
183 start with an empty file for now:
184 </p>
185
186 <code>
187 $ touch ~/.config/gnunet.conf
188 </code>
189
190 <p>
191 Now we can start it with the command line tool
192 `gnunet-arm` (Automatic Restart Manager).
193 </p>
194
195 <code>
196 $ gnunet-arm -s
197 </code>
198
199 <p>
200 It starts the default GNUnet services. We can list them with the
201 `-I` option:
202 </p>
203
204 <code>
205 $ gnunet-arm -I<br>
206 Running services:<br>
207 ats (gnunet-service-ats)<br>
208 revocation (gnunet-service-revocation)<br>
209 set (gnunet-service-set)<br>
210 nat (gnunet-service-nat)<br>
211 transport (gnunet-service-transport)<br>
212 peerstore (gnunet-service-peerstore)<br>
213 hostlist (gnunet-daemon-hostlist)<br>
214 identity (gnunet-service-identity)<br>
215 namecache (gnunet-service-namecache)<br>
216 peerinfo (gnunet-service-peerinfo)<br>
217 datastore (gnunet-service-datastore)<br>
218 zonemaster (gnunet-service-zonemaster)<br>
219 zonemaster-monitor (gnunet-service-zonemaster-monitor)<br>
220 nse (gnunet-service-nse)<br>
221 cadet (gnunet-service-cadet)<br>
222 dht (gnunet-service-dht)<br>
223 core (gnunet-service-core)<br>
224 gns (gnunet-service-gns)<br>
225 statistics (gnunet-service-statistics)<br>
226 topology (gnunet-daemon-topology)<br>
227 fs (gnunet-service-fs)<br>
228 namestore (gnunet-service-namestore)<br>
229 vpn (gnunet-service-vpn)
230 </code>
231
232 <p>
233 For stopping GNUnet again we can use the `-e` option.
234 </p>
235
236 <code>
237 $ gnunet-arm -e
238 </code>
239
240
241 <h3>{{ _("Make sure it works") }}</h3>
242
243 <p>
244 Let's try out some of GNUnet's use cases. Some should be done
245 before others:
246 </p>
247
248 <ul>
249 <li>filesharing</li>
250 <li>A simple chat using CADET</li>
251 <li>Name resolution using GNS on the command line</li>
252 <li>Name resolution using GNS with a browser (do it on the command line first)</li>
253 <li>Serving a website using VPN (do name resolution with a browser first)</li>
254 </ul>
255
256 <h4>{{ _("filesharing") }}</h4>
257
258 <p>
259 Let's publish a file in the GNUnet filesharing network. We use the keywords
260 ("commons" and "state") so other people will be able to search for the file.
261 </p>
262
263 <p>
264 We can choose any file and describe it with meaningful keywords (using the
265 `-k` command line option).
266 </p>
267
268 <code>
269 $ gnunet-publish -k commons -k state ostrom.pdf<br>
270 Publishing `/home/myself/ostrom.pdf' done.<br>
271 URI is `gnunet://fs/chk/M57SXDJ72EWS25CT6307KKJ8K0GCNSPTAZ649NA1NS10MJB4A1GZ9EN4Y02KST9VA5BHE8B335RPXQVBWVZ587Y83WQ7J3DHMBX30Q8.DHNGBN4CB2DBX1QRZ1R0B1Q18WTEAK4R94S9D57C9JMJJ3H7SSQDCV4D1218C4S2VP085AMQQSMG18FCP6NQMZQZJ91XR5NBX7YF0V0.42197237'.
272 </code>
273
274
275 <p>Finding the file by keyword works with `gnunet-search`.</p>
276
277 <code>
278 $ gnunet-search commons<br>
279 #1:<br>
280 gnunet-download -o "ostrom.pdf" gnunet://fs/chk/M57SXDJ72EWS25CT6307KKJ8K0GCNSPTAZ649NA1NS10MJB4A1GZ9EN4Y02KST9VA5BHE8B335RPXQVBWVZ587Y83WQ7J3DHMBX30Q8.DHNGBN4CB2DBX1QRZ1R0B1Q18WTEAK4R94S9D57C9JMJJ3H7SSQDCV4D1218C4S2VP085AMQQSMG18FCP6NQMZQZJ91XR5NBX7YF0V0.42197237
281 </code>
282
283 <p>
284 It gives us the command line call to download the file (and store it as
285 ostrom.pdf)!
286 </p>
287
288 <h4>{{ _("CADET (and Chat)") }}</h4>
289
290 <p>
291 We can use the `gnunet-cadet` command line tool to open a port and from
292 another machine connect to this port and chat or transfer data. First we need
293 our *peer ID* of the GNUnet peer opening the port.
294 </p>
295
296 <code>
297 $ gnunet-peerinfo -s<br>
298 I am peer `P4T5GHS1PCZ06R82D3KW8Z8J1113BQZWAWGYHTZ8G1ZXMWXQGAVG'.
299 </code>
300
301
302 <p>
303 Now we open the port (it can be any string!):
304 </p>
305
306 <code>
307 $ gnunet-cadet -o my-secret-port
308 </code>
309
310 <p>
311 On the other machine we can connect using the peer ID and the port
312 and start chatting!
313 </p>
314
315 <code>
316 $ gnunet-cadet P4T5GHS1PCZ06R82D3KW8Z8J1113BQZWAWGYHTZ8G1ZXMWXQGAVG my-secret-port
317 </code>
318
319 <h4>{{ _("Name resolution using GNS on the command line") }}</h4>
320
321 <p>
322 GNS is the GNU name service, a fully decentralized alternatice to
323 DNS. We'll publish an IP address in a GNS record try to resolve it
324 on the command line. First we need an identity which is the
325 equivalent to a zone in DNS. We'll call it "myself" and create it
326 using the `gnunet-identity` command line tool. Instead of "myself"
327 you can surely use your nick or any other name.
328 </p>
329
330 <code>
331 $ gnunet-identity -C myself
332 </code>
333
334 <p>
335 We can check if it worked using the same tool. We expect the name
336 of our identity and the corresponding public key to be
337 displayed.
338 </p>
339
340 <code>
341 $ gnunet-identity -d<br>
342 myself - HWTYD3P5D77JVFNVMZ1M5T10V4SZYNMY3PCGQCSVENKD6ZCRKPMG
343 </code>
344
345 <p>
346 Now we add a public `A` record to our zone. It has the name "ccc", a value
347 of "195.54.164.39" and it expires after one day.
348 </p>
349
350 <code>
351 $ gnunet-namestore -z myself -a -e "1 d" -p -t A -n ccc -V 195.54.164.39
352 </code>
353
354 <p>
355 Now we can query that record using the command line tool `gnunet-gns`.
356 </p>
357
358 <code>
359 $ gnunet-gns -t A -u ccc.myself<br>
360 ccc.myself:<br>
361 Got `A' record: 195.54.164.39
362 </code>
363
364 <p>
365 So it worked! But only resolving our own records is boring. So we
366 can give our identity (the public key of it to be precise) to
367 someone else so they can try to resolve our records, too. The
368 other person (Bob) has to add it to his namestore like this:
369 <p>
370
371 <code>
372 $ gnunet-namestore -z myself -a -e never -p -t PKEY -n alice -V HWTYD3P5D77JVFNVMZ1M5T10V4SZYNMY3PCGQCSVENKD6ZCRKPMG
373 </code>
374
375 <p>
376 Our identity in Bobs namestore is a public record (-p) and never
377 expires (-e never). Now Bob (let's assume he has called his identity
378 myself, too) should be able to resolve our "ccc" record, too!
379 </p>
380
381 <code>
382 $ gnunet-gns -t A -u ccc.alice.myself<br>
383 ccc.alice.myself:<br>
384 Got `A' record: 195.54.164.39
385 </code>
386
387 <p>
388 It can continue like this. A friend of Bob would be able to
389 resolve our records too because Bob published our identity in a
390 public record. Bobs friend would simply use "ccc.alice.bob.myself"
391 to resolve our "ccc" record.
392 </p>
393
394
395 <h4>{{ _("Name resolution using GNS with a browser") }}</h4>
396
397 <p>
398 In the previous use case "Name resolution using GNS on the
399 command line" we got an idea about what GNS is about, but now
400 let's use it with a browser, to make it actually useful. Currently
401 Firefox and Chromium are known to work.
402 </p>
403
404 <p>
405 Many websites enforce HTTPS and thus provide certificates for
406 their hostnames (and not our GNS names). Browsers don't like wrong
407 hostnames in certificates and will present error messages. So
408 GNUnet has to trick them by generating own certificates for our
409 GNS names. This means we need to create our own certificate
410 authority and tell our browser about it. Luckily there's a script
411 for it:
412 </p>
413
414 <code>
415 $ gnunet-gns-proxy-setup-ca
416 </code>
417
418 <p>
419 After executing this script the Browser has to be restarted.
420 </p>
421
422 <p>
423 GNUnet provides a proxy service (gnunet-gns-proxy) that the
424 browser can send DNS and HTTP traffic to. It will try to resolve
425 names with GNS first and forward the rest of the DNS traffic to
426 the system's DNS resolver. It will also take care of the HTTP
427 traffic, so the browser gets valid certificates and the web server
428 will not be confused by our GNS hostnames. Our GNS namestore
429 doesn't know about any DNS hostnames yet, so we have to store
430 them, too. For our "ccc" A record, we have to store a LEHO (legacy
431 hostname) record, too. It must contain the website's original DNS
432 hostname:
433 </p>
434
435 <code>
436 $ gnunet-namestore -z myself -a -e "1 d" -p -t LEHO -n ccc -V www.ccc.de
437 </code>
438
439 <p>
440 Now let's start gnunet-gns-proxy.
441 </p>
442
443 <code>
444 $ /usr/lib/gnunet/libexec/gnunet-gns-proxy
445 </code>
446
447 <p>
448 Our browser has to be configured so it uses our proxy. In Firefox
449 we have to set these options under "about:config":
450 </p>
451
452 <code>
453 network.proxy.socks: localhost<br>
454 network.proxy.socks_port: 7777<br>
455 network.proxy.socks_remote_dns true<br>
456 network.proxy.type: 1
457 </code>
458
459 <p>
460 To tell Chromium to use the proxy, it has to be started with the
461 "--proxy-server" command line option:
462 </p>
463
464 <code>
465 $ chromium --proxy-server="socks5://127.0.0.1:7777"
466 </code>
467
468 <p>
469 Now we should be able to resolve our GNS names in the browser! We
470 just have to type "https://ccc.myself" into the address bar. If
471 our friend Bob prepared his system, too, he can resolve our record
472 by typing "ccc.alice.myself".
473 </p>
474
475
476 <h4>{{ _("VPN") }}</h4>
477
478 <p>
479 TBD
480 </p>
481
482 <h3>{{ _("Uninstall GNUnet and its dependencies") }}</h3>
483
484 <code>
485 $ cd ~/gnunet_installation/gnunet<br>
486 $ sudo make uninstall<br>
487 $ cd ~/gnunet_installation/libmicrohttpd<br>
488 $ sudo make uninstall<br>
489 $ sudo apt remove git libtool autoconf autopoint build-essential libgcrypt-dev libidn11-dev zlib1g-dev libunistring-dev libglpk-dev miniupnpc libextractor-dev libjansson-dev libcurl4-gnutls-dev libsqlite3-dev<br>
490 $ sudo apt autoremove<br>
491 $ sudo userdel -r gnunet<br>
492 $ sudo groupdel gnunet<br>
493 $ sudo groupdel gnunetdns<br>
494 $ sudo mv /etc/nsswitch.conf.original /etc/nsswitch.conf<br>
495 $ sudo rm /lib/$(uname -m)-linux-gnu/libnss_gns.so.2
496 </code>
497
498 <h3>{{ _("Appendix A: Optional GNUnet features") }}</h3>
499
500 <p>
501 TBD
502 </p>
503
504 <h3>{{ _("Troubleshooting") }}</h3>
505
506 <h4>{{ _("You can't reach other people's nodes") }}</h4>
507
508 <p>
509 Should our computer not have reached the open GNUnet network automatically,
510 we can manually instruct our node how to reach the nodes of our friends. This
511 works by exchanging HELLO strings. This is how we get a hello string for our
512 computer.
513 </p>
514
515 <code>
516 $ gnunet-peerinfo -gn
517 </code>
518
519 <p>
520 We can now pass this string to our friends "out of band" (using
521 whatever existing chat or messaging technology). If the string
522 contains some private IP networks we don't want to share, we can
523 carefully edit them out.
524 </p>
525
526 <p>
527 Once we receive such strings from our friends, we can add them
528 like this:
529 </p>
530
531 <code>
532 gnunet-peerinfo -p <string>
533 </code>
534
535
536 <p>
537 Now our GNUnet nodes can attempt reaching each other directly. This may
538 still fail due to NAT traversal issues.
539 </p>
540
541
542<!--
543 <h4>{{ _("OMG you guys broke my internet") }}</h4>
544
545 <p>
546 We can replace `/etc/nsswitch.conf` with the backup we made earlier
547 (`/etc/nsswitch.conf.original`). Now DNS resolution should work again without a
548 running GNUnet.
549 </p>
550
551 <code>
552 $ cp /etc/nsswitch.conf.original /etc/nsswitch.conf
553 </code>
554-->
555
556</div>
557{% endblock body_content %}
diff --git a/template/tutorial-macos.html.j2 b/template/tutorial-macos.html.j2
new file mode 100644
index 00000000..df0ff757
--- /dev/null
+++ b/template/tutorial-macos.html.j2
@@ -0,0 +1,506 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<div class="container">
4
5 <h2>{{ _("Tutorial: GNUnet on macOS 10.14 (Mojave)") }}</h2>
6
7 <h3>{{ _("Introduction") }}</h3>
8
9 <p>
10 Welcome to the hopefully painless GNUnet tutorial for macOS Mojave! It provides
11 concrete instructions on how to compile, install and configure a current
12 version of GNUnet. The goal is to support newcomers, either end users or
13 developers, who want to get in touch with GNUnet for the first time. After
14 installing GNUnet we will make sure that out new GNUnet installation is working
15 correctly.
16 </p>
17
18 <h3>{{ _("Requirements") }}</h3>
19
20 <p>
21 First, install <a href="https://brew.sh">homebrew</a> and <a href="https://developer.apple.com/xcode/">XCode</a>.
22 Then install the following packages:
23 </p>
24
25 <code>
26 $ sudo brew install git autoconf automake glpk gettext gnutls jansson libextractor libgcrypt libffi libidn2 libmicrohttpd libmpc libtool libunistring pkg-config unbound
27 </code>
28
29 <h3>{{ _("Make an installation directory") }}</h3>
30
31 <p>
32 Next we create a directory in our home directory where we store
33 the source code later. We should keep this directory after
34 installation because it contains Makefiles that can be used for
35 uninstalling GNUnet again (see chapter *Uninstall GNUnet and its
36 dependencies*).
37 </p>
38
39 <code>
40 $ mkdir ~/gnunet
41 </code>
42
43 <h3>{{ _("Get the source code") }}</h3>
44
45 <code>
46 $ cd ~<br>
47 $ git clone --depth 1 https://gnunet.org/git/gnunet.git gnunet_src<br>
48 </code>
49 <p>
50 In order to have a gnutls with DANE support, you need to edit the formula:
51 </p>
52 <code>
53 $ brew edit gnutls
54 </code>
55 <p>
56 Add the line "depends_on 'unbound'" to the dependencies in the formula.
57 Then in the install function before the configure add:
58 </p>
59 <code>
60 ENV['CFLAGS']='-I/usr/local/Cellar/unbound/1.9.0/include'<br/>
61 ENV['LDFLAGS']='-L/usr/local/Cellar/unbound/1.9.0/lib'
62 </code>
63 <p>
64 Reinstall gnutls from source:
65 </p>
66 <code>
67 $ brew reinstall -s gnutls
68 </code>
69
70 <h3>{{ _("Compile and Install") }}</h3>
71
72
73 <p>
74 We have two options:
75 installing a *production version* and installing a *development version*. If
76 you want to start writing GNUnet applications or join the GNUnet development
77 choose the development version (it will print more debug output and contains
78 debug symbols that can be displayed with a debugger). Otherwise choose the
79 production version.
80 </p>
81
82 <h4>{{ _("Option 1: GNUnet for production / usage") }}</h4>
83
84 <code>
85 $ cd ~/gnunet_src<br>
86 $ ./bootstrap<br>
87 $ export GNUNET_PREFIX=~/gnunet<br>
88 $ ./configure --prefix=$GNUNET_PREFIX --disable-documentation<br>
89 </code>
90 <p>
91 You might see configure failing telling you that it ``cannot run C compiled programs.''.
92 In this case, you might need to open/run Xcode once and you will be prompted to
93 install additonal packages.
94 Then, you might have to manually install the command line tools from here https://developer.apple.com/download/more/ (you need an Apple ID for this).
95 Install those and execute
96 </p>
97 <code>
98 $ open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
99 </code>
100 <p>
101 After configure passes, you need to add a 'gnunetdns' group using the macOS system preferences.
102 Further, you need to add a user 'gnunet'. Then:
103 </p>
104 <code>
105 $ make<br>
106 $ sudo make install
107 </code>
108
109 <h4>{{ _("Option 2: GNUnet for development") }}</h4>
110
111 <p>
112 Perform the same steps as for Option 1, but add the configure flat '--enable-experimental'
113 </p>
114 <!--
115 <h4>{{ _("Install GNUnet plugin for name resolution") }}</h4>
116 <p>
117 So now it gets a bit nasty. It's not so bad. All we have to do
118 is copy a file and edit another one. The file we need to copy
119 is GNUnet's plugin for the Name Service Switch (NSS) in unix
120 systems. Different unixes expect it in different locations and
121 GNUnet's build system does not try to guess. On Debian 9 we
122 have to do
123 <code>
124 $ sudo cp /usr/lib/gnunet/nss/libnss_gns.so.2 /lib/$(uname -m)-linux-gnu/
125 </code>
126 </p>
127
128 <p>
129 Congratulations! GNUnet is now installed! Before we start it we
130 need to create a configuration file. By default GNUnet looks in
131 our home directory for the file `~/.gnunet/gnunet.conf`. We can
132 start with an empty file for now:
133 </p>
134
135 <code>
136 $ touch ~/.config/gnunet.conf
137 </code>
138
139 <p>
140 Now we can start it with the command line tool
141 `gnunet-arm` (Automatic Restart Manager).
142 </p>
143
144 <code>
145 $ gnunet-arm -s
146 </code>
147
148 <p>
149 It starts the default GNUnet services. We can list them with the
150 `-I` option:
151 </p>
152
153 <code>
154 $ gnunet-arm -I<br>
155 Running services:<br>
156 ats (gnunet-service-ats)<br>
157 revocation (gnunet-service-revocation)<br>
158 set (gnunet-service-set)<br>
159 nat (gnunet-service-nat)<br>
160 transport (gnunet-service-transport)<br>
161 peerstore (gnunet-service-peerstore)<br>
162 hostlist (gnunet-daemon-hostlist)<br>
163 identity (gnunet-service-identity)<br>
164 namecache (gnunet-service-namecache)<br>
165 peerinfo (gnunet-service-peerinfo)<br>
166 datastore (gnunet-service-datastore)<br>
167 zonemaster (gnunet-service-zonemaster)<br>
168 zonemaster-monitor (gnunet-service-zonemaster-monitor)<br>
169 nse (gnunet-service-nse)<br>
170 cadet (gnunet-service-cadet)<br>
171 dht (gnunet-service-dht)<br>
172 core (gnunet-service-core)<br>
173 gns (gnunet-service-gns)<br>
174 statistics (gnunet-service-statistics)<br>
175 topology (gnunet-daemon-topology)<br>
176 fs (gnunet-service-fs)<br>
177namestore (gnunet-service-namestore)<br>
178vpn (gnunet-service-vpn)
179 </code>
180
181 <p>
182 For stopping GNUnet again we can use the `-e` option.
183 </p>
184
185 <code>
186 $ gnunet-arm -e
187 </code>
188
189
190 <h3>{{ _("Make sure it works") }}</h3>
191
192 <p>
193 Let's try out some of GNUnet's use cases. Some should be done
194 before others:
195 </p>
196
197 <ul>
198 <li>filesharing</li>
199 <li>A simple chat using CADET</li>
200 <li>Name resolution using GNS on the command line</li>
201 <li>Name resolution using GNS with a browser (do it on the command line first)</li>
202 <li>Serving a website using VPN (do name resolution with a browser first)</li>
203 </ul>
204
205 <h4>{{ _("filesharing") }}</h4>
206
207 <p>
208 Let's publish a file in the GNUnet filesharing network. We use the keywords
209 ("commons" and "state") so other people will be able to search for the file.
210 </p>
211
212 <p>
213 We can choose any file and describe it with meaningful keywords (using the
214 `-k` command line option).
215 </p>
216
217 <code>
218 $ gnunet-publish -k commons -k state ostrom.pdf<br>
219 Publishing `/home/myself/ostrom.pdf' done.<br>
220 URI is `gnunet://fs/chk/M57SXDJ72EWS25CT6307KKJ8K0GCNSPTAZ649NA1NS10MJB4A1GZ9EN4Y02KST9VA5BHE8B335RPXQVBWVZ587Y83WQ7J3DHMBX30Q8.DHNGBN4CB2DBX1QRZ1R0B1Q18WTEAK4R94S9D57C9JMJJ3H7SSQDCV4D1218C4S2VP085AMQQSMG18FCP6NQMZQZJ91XR5NBX7YF0V0.42197237'.
221 </code>
222
223
224 <p>Finding the file by keyword works with `gnunet-search`.</p>
225
226 <code>
227 $ gnunet-search commons<br>
228#1:<br>
229 gnunet-download -o "ostrom.pdf" gnunet://fs/chk/M57SXDJ72EWS25CT6307KKJ8K0GCNSPTAZ649NA1NS10MJB4A1GZ9EN4Y02KST9VA5BHE8B335RPXQVBWVZ587Y83WQ7J3DHMBX30Q8.DHNGBN4CB2DBX1QRZ1R0B1Q18WTEAK4R94S9D57C9JMJJ3H7SSQDCV4D1218C4S2VP085AMQQSMG18FCP6NQMZQZJ91XR5NBX7YF0V0.42197237
230 </code>
231
232 <p>
233 It gives us the command line call to download the file (and store it as
234 ostrom.pdf)!
235 </p>
236
237 <h4>{{ _("CADET (and Chat)") }}</h4>
238
239 <p>
240 We can use the `gnunet-cadet` command line tool to open a port and from
241 another machine connect to this port and chat or transfer data. First we need
242 our *peer ID* of the GNUnet peer opening the port.
243 </p>
244
245 <code>
246 $ gnunet-peerinfo -s<br>
247 I am peer `P4T5GHS1PCZ06R82D3KW8Z8J1113BQZWAWGYHTZ8G1ZXMWXQGAVG'.
248 </code>
249
250
251 <p>
252 Now we open the port (it can be any string!):
253 </p>
254
255 <code>
256 $ gnunet-cadet -o my-secret-port
257 </code>
258
259 <p>
260 On the other machine we can connect using the peer ID and the port
261 and start chatting!
262 </p>
263
264 <code>
265 $ gnunet-cadet P4T5GHS1PCZ06R82D3KW8Z8J1113BQZWAWGYHTZ8G1ZXMWXQGAVG my-secret-port
266 </code>
267
268 <h4>{{ _("Name resolution using GNS on the command line") }}</h4>
269
270 <p>
271 GNS is the GNU name service, a fully decentralized alternatice to
272 DNS. We'll publish an IP address in a GNS record try to resolve it
273 on the command line. First we need an identity which is the
274 equivalent to a zone in DNS. We'll call it "myself" and create it
275 using the `gnunet-identity` command line tool. Instead of "myself"
276 you can surely use your nick or any other name.
277 </p>
278
279 <code>
280 $ gnunet-identity -C myself
281 </code>
282
283 <p>
284 We can check if it worked using the same tool. We expect the name
285 of our identity and the corresponding public key to be
286 displayed.
287 </p>
288
289 <code>
290 $ gnunet-identity -d<br>
291 myself - HWTYD3P5D77JVFNVMZ1M5T10V4SZYNMY3PCGQCSVENKD6ZCRKPMG
292 </code>
293
294 <p>
295 Now we add a public `A` record to our zone. It has the name "ccc", a value
296 of "195.54.164.39" and it expires after one day.
297 </p>
298
299 <code>
300 $ gnunet-namestore -z myself -a -e "1 d" -p -t A -n ccc -V 195.54.164.39
301 </code>
302
303 <p>
304 Now we can query that record using the command line tool `gnunet-gns`.
305 </p>
306
307 <code>
308 $ gnunet-gns -t A -u ccc.myself<br>
309 ccc.myself:<br>
310 Got `A' record: 195.54.164.39
311 </code>
312
313 <p>
314 So it worked! But only resolving our own records is boring. So we
315 can give our identity (the public key of it to be precise) to
316 someone else so they can try to resolve our records, too. The
317 other person (Bob) has to add it to his namestore like this:
318 <p>
319
320 <code>
321 $ gnunet-namestore -z myself -a -e never -p -t PKEY -n alice -V HWTYD3P5D77JVFNVMZ1M5T10V4SZYNMY3PCGQCSVENKD6ZCRKPMG
322 </code>
323
324 <p>
325 Our identity in Bobs namestore is a public record (-p) and never
326 expires (-e never). Now Bob (let's assume he has called his identity
327 myself, too) should be able to resolve our "ccc" record, too!
328 </p>
329
330 <code>
331 $ gnunet-gns -t A -u ccc.alice.myself<br>
332 ccc.alice.myself:<br>
333 Got `A' record: 195.54.164.39
334 </code>
335
336 <p>
337 It can continue like this. A friend of Bob would be able to
338 resolve our records too because Bob published our identity in a
339 public record. Bobs friend would simply use "ccc.alice.bob.myself"
340 to resolve our "ccc" record.
341 </p>
342
343
344 <h4>{{ _("Name resolution using GNS with a browser") }}</h4>
345
346 <p>
347 In the previous use case "Name resolution using GNS on the
348 command line" we got an idea about what GNS is about, but now
349 let's use it with a browser, to make it actually useful. Currently
350 Firefox and Chromium are known to work.
351 </p>
352
353 <p>
354 Many websites enforce HTTPS and thus provide certificates for
355 their hostnames (and not our GNS names). Browsers don't like wrong
356 hostnames in certificates and will present error messages. So
357 GNUnet has to trick them by generating own certificates for our
358 GNS names. This means we need to create our own certificate
359 authority and tell our browser about it. Luckily there's a script
360 for it:
361 </p>
362
363 <code>
364 $ gnunet-gns-proxy-setup-ca
365 </code>
366
367 <p>
368 After executing this script the Browser has to be restarted.
369 </p>
370
371 <p>
372 GNUnet provides a proxy service (gnunet-gns-proxy) that the
373 browser can send DNS and HTTP traffic to. It will try to resolve
374 names with GNS first and forward the rest of the DNS traffic to
375 the system's DNS resolver. It will also take care of the HTTP
376 traffic, so the browser gets valid certificates and the web server
377 will not be confused by our GNS hostnames. Our GNS namestore
378 doesn't know about any DNS hostnames yet, so we have to store
379 them, too. For our "ccc" A record, we have to store a LEHO (legacy
380 hostname) record, too. It must contain the website's original DNS
381 hostname:
382 </p>
383
384 <code>
385 $ gnunet-namestore -z myself -a -e "1 d" -p -t LEHO -n ccc -V www.ccc.de
386 </code>
387
388 <p>
389 Now let's start gnunet-gns-proxy.
390 </p>
391
392 <code>
393 $ /usr/lib/gnunet/libexec/gnunet-gns-proxy
394 </code>
395
396 <p>
397 Our browser has to be configured so it uses our proxy. In Firefox
398 we have to set these options under "about:config":
399 </p>
400
401 <code>
402 network.proxy.socks: localhost<br>
403 network.proxy.socks_port: 7777<br>
404 network.proxy.socks_remote_dns true<br>
405 network.proxy.type: 1
406 </code>
407
408 <p>
409 To tell Chromium to use the proxy, it has to be started with the
410 "--proxy-server" command line option:
411 </p>
412
413 <code>
414 $ chromium --proxy-server="socks5://127.0.0.1:7777"
415 </code>
416
417 <p>
418 Now we should be able to resolve our GNS names in the browser! We
419 just have to type "https://ccc.myself" into the address bar. If
420 our friend Bob prepared his system, too, he can resolve our record
421 by typing "ccc.alice.myself".
422 </p>
423
424
425 <h4>{{ _("VPN") }}</h4>
426
427 <p>
428 TBD
429 </p>
430
431 <h3>{{ _("Uninstall GNUnet and its dependencies") }}</h3>
432
433 <code>
434 $ cd ~/gnunet_installation/gnunet<br>
435 $ sudo make uninstall<br>
436 $ cd ~/gnunet_installation/libmicrohttpd<br>
437 $ sudo make uninstall<br>
438 $ sudo apt remove git libtool autoconf autopoint build-essential libgcrypt-dev libidn11-dev zlib1g-dev libunistring-dev libglpk-dev miniupnpc libextractor-dev libjansson-dev libcurl4-gnutls-dev libsqlite3-dev<br>
439 $ sudo apt autoremove<br>
440 $ sudo userdel -r gnunet<br>
441 $ sudo groupdel gnunet<br>
442 $ sudo groupdel gnunetdns<br>
443 $ sudo mv /etc/nsswitch.conf.original /etc/nsswitch.conf<br>
444 $ sudo rm /lib/$(uname -m)-linux-gnu/libnss_gns.so.2
445 </code>
446
447 <h3>{{ _("Appendix A: Optional GNUnet features") }}</h3>
448
449 <p>
450 TBD
451 </p>
452
453 <h3>{{ _("Troubleshooting") }}</h3>
454
455 <h4>{{ _("You can't reach other people's nodes") }}</h4>
456
457 <p>
458 Should our computer not have reached the open GNUnet network automatically,
459 we can manually instruct our node how to reach the nodes of our friends. This
460 works by exchanging HELLO strings. This is how we get a hello string for our
461 computer.
462 </p>
463
464 <code>
465 $ gnunet-peerinfo -gn
466 </code>
467
468 <p>
469 We can now pass this string to our friends "out of band" (using
470 whatever existing chat or messaging technology). If the string
471 contains some private IP networks we don't want to share, we can
472 carefully edit them out.
473 </p>
474
475 <p>
476 Once we receive such strings from our friends, we can add them
477 like this:
478 </p>
479
480 <code>
481 gnunet-peerinfo -p <string>
482 </code>
483
484
485 <p>
486 Now our GNUnet nodes can attempt reaching each other directly. This may
487 still fail due to NAT traversal issues.
488 </p>
489
490
491 <!--
492 <h4>{{ _("OMG you guys broke my internet") }}</h4>
493
494 <p>
495 We can replace `/etc/nsswitch.conf` with the backup we made earlier
496 (`/etc/nsswitch.conf.original`). Now DNS resolution should work again without a
497 running GNUnet.
498 </p>
499
500 <code>
501 $ cp /etc/nsswitch.conf.original /etc/nsswitch.conf
502 </code>
503 -->
504
505 </div>
506{% endblock body_content %}
diff --git a/template/tutorial-ubuntu1804.html.j2 b/template/tutorial-ubuntu1804.html.j2
new file mode 100644
index 00000000..9645f169
--- /dev/null
+++ b/template/tutorial-ubuntu1804.html.j2
@@ -0,0 +1,499 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<article class="container">
4<!--<article> -->
5<header>
6 <h2>{{ _("Tutorial: GNUnet on Ubuntu 18.04") }}</h2>
7</header>
8<section>
9 <h3>{{ _("Introduction") }}</h3>
10 <p>
11 Welcome to the hopefully painless GNUnet tutorial for Ubuntu 18.04!
12 It provides very concrete instructions on how to compile, install
13 and configure a current version of GNUnet. The goal is to support
14 newcomers, either end users or developers, who want to get in touch
15 with GNUnet for the first time. After installing GNUnet we will make
16 sure that out new GNUnet installation is working correctly.
17 </p>
18 <p>
19 <b>Attention: If you came across the official gnunet package for
20 Ubuntu 18.04, ignore it! It is ancient and not compatible with
21 current GNUnet installations.</b>
22 </p>
23 <p>
24 Now let's start!
25 </p>
26</section>
27<section>
28 <h3>{{ _("Requirements") }}</h3>
29 <p>
30 First let's install the following Ubuntu 18.04 packages to use
31 GNUnet painlessly. Optional dependencies are listed in Appendix
32 A. They are required for some experimental GNUnet features.
33 </p>
34 <code>
35 $ sudo apt install git libtool autoconf autopoint \<br>
36 build-essential libgcrypt-dev libidn11-dev zlib1g-dev \<br>
37 libunistring-dev libglpk-dev miniupnpc libextractor-dev \<br>
38 libjansson-dev libcurl4-gnutls-dev libsqlite3-dev openssl \<br>
39 libnss3-tools libmicrohttpd-dev
40 </code>
41</section>
42<section>
43 <h3>{{ _("Make an installation directory") }}</h3>
44 <p>
45 Next we create a directory in our home directory where we store
46 the source code later. We should keep this directory after
47 installation because it contains Makefiles that can be used for
48 uninstalling GNUnet again (see chapter *Uninstall GNUnet and its
49 dependencies*).
50 </p>
51 <code>
52 $ mkdir ~/gnunet_installation
53 </code>
54</section>
55<section>
56 <h3>{{ _("Get the source code") }}</h3>
57 <p>
58 We download the GNUnet source code using git.
59 </p>
60 <code>
61 $ cd ~/gnunet_installation<br>
62 $ git clone --depth 1 https://gnunet.org/git/gnunet.git<br>
63 </code>
64</section>
65<section>
66 <h3>{{ _("Compile and Install") }}</h3>
67 <p>
68 Installing GNUnet is not hard. We have two options:
69 installing a *production version* and installing a *development version*. If
70 you want to start writing GNUnet applications or join the GNUnet development
71 choose the development version (it will print more debug output and contains
72 debug symbols that can be displayed with a debugger). Otherwise choose the
73 production version.
74 </p>
75</section>
76<section>
77 <h4>{{ _("Option 1: GNUnet for production / usage") }}</h4>
78 <code>
79 $ cd ~/gnunet_installation/gnunet<br>
80 $ ./bootstrap<br>
81 $ export GNUNET_PREFIX=/usr<br>
82 $ ./configure --prefix=$GNUNET_PREFIX --disable-documentation --with-microhttpd=/opt/libmicrohttpd<br>
83 $ sudo addgroup gnunetdns<br>
84 $ sudo adduser --system --group --disabled-login --home /var/lib/gnunet gnunet<br>
85 $ make -j$(nproc || echo -n 1)<br>
86 $ sudo make install
87 </code>
88</section>
89<section>
90 <h4>{{ _("Option 2: GNUnet for development") }}</h4>
91
92 <code>
93 $ cd ~/gnunet_installation/gnunet<br>
94 $ ./bootstrap<br>
95 $ export GNUNET_PREFIX=/usr<br>
96 $ export CFLAGS="-g -Wall -O0"<br>
97 $ ./configure --prefix=$GNUNET_PREFIX --disable-documentation --enable-logging=verbose <br>
98 $ make -j$(nproc || echo -n 1)<br>
99 $ sudo make install
100 </code>
101
102 <!--
103<h4>{{ _("Install GNUnet plugin for name resolution") }}</h4>
104 So now it gets a bit nasty. It's not so bad. All we have to do is copy a file and edit another one. The file we need to copy is GNUnet's plugin for the Name Service Switch (NSS) in unix systems. Different unixes expect it in different locations and GNUnet's build system does not try to guess. On Ubuntu 18.04 we have to do
105
106 <code>
107 $ sudo cp /usr/lib/gnunet/nss/libnss_gns.so.2 /lib/$(uname -m)-linux-gnu/
108 </code>
109
110 <p>The next step is activating the GNUnet plugin we just copied in the NSS
111 config. It is located in `/etc/nsswitch.conf`. It should contain a line
112 starting with "hosts" similar to this (at least "files" and "dns" should be
113 there):</p>
114
115 <code>
116 $ cat /etc/nsswitch.conf<br>
117 hosts: files mdns4_minimal [NOTFOUND=return] dns
118 </code>
119
120 <p><b>Attention: Once we modified `etc/nsswitch.conf` DNS resolution will only
121 be possible as long as is GNUnet is running. We can leave the next step out,
122 but then we will not be able to use GNUnet's name resolution in external
123 applications.</b></p>
124
125 <p>We save a copy of the original file and then modify the line using sed:</p>
126
127 <code>
128 $ sudo cp /etc/nsswitch.conf /etc/nsswitch.conf.original<br>
129 $ sudo sed -i -E 's/^(hosts:.*) dns/\1 gns [NOTFOUND=return] dns/' /etc/nsswitch.conf
130 </code>
131
132 <p>Now in the line starting with "hosts" should contain an entry "gns [NOTFOUND=return]" before the "dns" entry like this:</p>
133
134 <code>
135 hosts: files mdns4_minimal [NOTFOUND=return] gns [NOTFOUND=return] dns
136 </code>
137
138 <p>That's it. It wasn't that nasty, was it?</p>
139-->
140</section>
141<section>
142 <h3>{{ _("Configuration") }}</h3>
143
144 <p>
145 Congratulations! GNUnet is now installed! Before we start it we
146 need to create a configuration file. By default GNUnet looks in
147 our home directory for the file `~/.gnunet/gnunet.conf`. We can
148 start with an empty file for now:
149 </p>
150
151 <code>
152 $ touch ~/.config/gnunet.conf
153 </code>
154
155 <p>
156 Now we can start it with the command line tool `gnunet-arm`
157 (Automatic Restart Manager).
158 </p>
159
160 <code>
161 $ gnunet-arm -s
162 </code>
163
164 <p>
165 It starts the default GNUnet services. We can list them with the `-I` option:
166 </p>
167
168 <code>
169 $ gnunet-arm -I<br>
170 Running services:<br>
171 ats (gnunet-service-ats)<br>
172 revocation (gnunet-service-revocation)<br>
173 set (gnunet-service-set)<br>
174 nat (gnunet-service-nat)<br>
175 transport (gnunet-service-transport)<br>
176 peerstore (gnunet-service-peerstore)<br>
177 hostlist (gnunet-daemon-hostlist)<br>
178 identity (gnunet-service-identity)<br>
179 namecache (gnunet-service-namecache)<br>
180 peerinfo (gnunet-service-peerinfo)<br>
181 datastore (gnunet-service-datastore)<br>
182 zonemaster (gnunet-service-zonemaster)<br>
183 zonemaster-monitor (gnunet-service-zonemaster-monitor)<br>
184 nse (gnunet-service-nse)<br>
185 cadet (gnunet-service-cadet)<br>
186 dht (gnunet-service-dht)<br>
187 core (gnunet-service-core)<br>
188 gns (gnunet-service-gns)<br>
189 statistics (gnunet-service-statistics)<br>
190 topology (gnunet-daemon-topology)<br>
191 fs (gnunet-service-fs)<br>
192 namestore (gnunet-service-namestore)<br>
193 vpn (gnunet-service-vpn)
194 </code>
195
196 <p>
197 For stopping GNUnet again we can use the `-e` option.
198 </p>
199
200 <code>
201 $ gnunet-arm -e
202 </code>
203</section>
204<section>
205 <h3>{{ _("Make sure it works") }}</h3>
206
207 <p>
208 Let's try out some of GNUnet's use cases. Some should be done before others:
209 </p>
210
211 <ul>
212 <li>filesharing</li>
213 <li>A simple chat using CADET</li>
214 <li>Name resolution using GNS on the command line</li>
215 <li>Name resolution using GNS with a browser (do it on the command line first)</li>
216 <li>Serving a website using VPN (do name resolution with a browser first)</li>
217 </ul>
218</section>
219<section>
220 <h4>{{ _("filesharing") }}</h4>
221
222 <p>
223 Let's publish a file in the GNUnet filesharing network. We use the keywords
224 ("commons" and "state") so other people will be able to search for the file.
225 </p>
226
227 <p>
228 We can choose any file and describe it with meaningful keywords (using the
229 `-k` command line option).
230 </p>
231
232 <code>
233 $ gnunet-publish -k commons -k state ostrom.pdf<br>
234 Publishing `/home/myself/ostrom.pdf' done.<br>
235 URI is `gnunet://fs/chk/M57SXDJ72EWS25CT6307KKJ8K0GCNSPTAZ649NA1NS10MJB4A1GZ9EN4Y02KST9VA5BHE8B335RPXQVBWVZ587Y83WQ7J3DHMBX30Q8.DHNGBN4CB2DBX1QRZ1R0B1Q18WTEAK4R94S9D57C9JMJJ3H7SSQDCV4D1218C4S2VP085AMQQSMG18FCP6NQMZQZJ91XR5NBX7YF0V0.42197237'.
236 </code>
237
238 <p>
239 Finding the file by keyword works with `gnunet-search`.
240 </p>
241
242 <code>
243 $ gnunet-search commons<br>
244 #1:<br>
245 gnunet-download -o "ostrom.pdf" gnunet://fs/chk/M57SXDJ72EWS25CT6307KKJ8K0GCNSPTAZ649NA1NS10MJB4A1GZ9EN4Y02KST9VA5BHE8B335RPXQVBWVZ587Y83WQ7J3DHMBX30Q8.DHNGBN4CB2DBX1QRZ1R0B1Q18WTEAK4R94S9D57C9JMJJ3H7SSQDCV4D1218C4S2VP085AMQQSMG18FCP6NQMZQZJ91XR5NBX7YF0V0.42197237
246 </code>
247
248 <p>
249 It gives us the command line call to download the file (and store it as
250 ostrom.pdf)!
251 </p>
252</section>
253<section>
254 <h4>{{ _("CADET (and Chat)") }}</h4>
255
256 <p>
257 We can use the `gnunet-cadet` command line tool to open a port and from
258 another machine connect to this port and chat or transfer data. First we need
259 our *peer ID* of the GNUnet peer opening the port.
260 </p>
261
262 <code>
263 $ gnunet-peerinfo -s<br>
264 I am peer `P4T5GHS1PCZ06R82D3KW8Z8J1113BQZWAWGYHTZ8G1ZXMWXQGAVG'.
265 </code>
266
267 <p>
268 Now we open the port (it can be any string!):
269 </p>
270
271 <code>
272 $ gnunet-cadet -o my-secret-port
273 </code>
274
275 <p>On the other machine we can connect using the peer ID and the port and start chatting!</p>
276
277 <code>
278 $ gnunet-cadet P4T5GHS1PCZ06R82D3KW8Z8J1113BQZWAWGYHTZ8G1ZXMWXQGAVG my-secret-port
279 </code>
280</section>
281<section>
282 <h4>{{ _("Name resolution using GNS on the command line") }}</h4>
283
284 <p>GNS is the GNU name service, a fully decentralized alternatice to DNS. We'll publish an IP address in a GNS record try to resolve it on the command line. First we need an identity which is the
285 equivalent to a zone in DNS. We'll call it "myself" and create it using the
286 `gnunet-identity` command line tool. Instead of "myself" you can surely use your
287 nick or any other name. </p>
288
289 <code>
290 $ gnunet-identity -C myself
291 </code>
292
293 <p>We can check if it worked using the same tool. We expect the name of our identity and the corresponding public key to be displayed.</p>
294
295 <code>
296 $ gnunet-identity -d<br>
297 myself - HWTYD3P5D77JVFNVMZ1M5T10V4SZYNMY3PCGQCSVENKD6ZCRKPMG
298 </code>
299
300 <p>
301 Now we add a public `A` record to our zone. It has the name "ccc", a value
302 of "195.54.164.39" and it expires after one day.
303 </p>
304
305 <code>
306 $ gnunet-namestore -z myself -a -e "1 d" -p -t A -n ccc -V 195.54.164.39
307 </code>
308
309 <p>Now we can query that record using the command line tool `gnunet-gns`.</p>
310
311 <code>
312 $ gnunet-gns -t A -u ccc.myself<br>
313 ccc.myself:<br>
314 Got `A' record: 195.54.164.39
315 </code>
316
317 <p>
318 So it worked! But only resolving our own records is boring. So we
319 can give our identity (the public key of it to be precise) to
320 someone else so they can try to resolve our records, too. The
321 other person (Bob) has to add it to his namestore like this:
322 </p>
323
324 <code>
325 $ gnunet-namestore -z myself -a -e never -p -t PKEY -n alice -V HWTYD3P5D77JVFNVMZ1M5T10V4SZYNMY3PCGQCSVENKD6ZCRKPMG
326 </code>
327
328 <p>
329 Our identity in Bobs namestore is a public record (-p) and never
330 expires (-e never). Now Bob (let's assume he has called his
331 identity myself, too) should be able to resolve our "ccc" record,
332 too!
333 </p>
334
335 <code>
336 $ gnunet-gns -t A -u ccc.alice.myself<br>
337 ccc.alice.myself:<br>
338 Got `A' record: 195.54.164.39
339 </code>
340
341 <p>
342 It can continue like this. A friend of Bob would be able to
343 resolve our records too because Bob published our identity in a
344 public record. Bobs friend would simply use "ccc.alice.bob.myself"
345 to resolve our "ccc" record.
346 </p>
347</section>
348<section>
349 <h4>{{ _("Name resolution using GNS with a browser") }}</h4>
350
351 <p>
352 In the previous use case "Name resolution using GNS on the command line" we got an idea
353 about what GNS is about, but now let's use it with a browser, to make it actually useful. Currently Firefox and Chromium are known to work.
354 </p>
355
356 <p>
357 Many websites enforce HTTPS and thus provide certificates for
358 their hostnames (and not our GNS names). Browsers don't like wrong
359 hostnames in certificates and will present error messages. So GNUnet
360 has to trick them by generating own certificates for our GNS
361 names. This means we need to create our own certificate authority
362 and tell our browser about it. Luckily there's a script for it:
363 </p>
364
365 <code>
366 $ gnunet-gns-proxy-setup-ca
367 </code>
368
369 <p>After executing this script the Browser has to be restarted.</p>
370
371 <p>
372 GNUnet provides a proxy service (gnunet-gns-proxy) that the
373 browser can send DNS and HTTP traffic to. It will try to resolve
374 names with GNS first and forward the rest of the DNS traffic to
375 the system's DNS resolver. It will also take care of the HTTP
376 traffic, so the browser gets valid certificates and the web server
377 will not be confused by our GNS hostnames. Our GNS namestore
378 doesn't know about any DNS hostnames yet, so we have to store
379 them, too. For our "ccc" A record, we have to store a LEHO (legacy
380 hostname) record, too. It must contain the website's original DNS
381 hostname:
382 </p>
383
384 <code>
385 $ gnunet-namestore -z myself -a -e "1 d" -p -t LEHO -n ccc -V www.ccc.de
386 </code>
387
388 <p>Now let's start gnunet-gns-proxy.</p>
389
390 <code>
391 $ /usr/lib/gnunet/libexec/gnunet-gns-proxy
392 </code>
393
394 <p>
395 Our browser has to be configured so it uses our proxy. In Firefox
396 we have to set these options under "about:config":
397 </p>
398
399 <code>
400 network.proxy.socks: localhost<br>
401 network.proxy.socks_port: 7777<br>
402 network.proxy.socks_remote_dns true<br>
403 network.proxy.type: 1
404 </code>
405
406 <p>
407 To tell Chromium to use the proxy, it has to be started with the
408 "--proxy-server" command line option:
409 </p>
410
411 <code>
412 $ chromium --proxy-server="socks5://127.0.0.1:7777"
413 </code>
414
415 <p>
416 Now we should be able to resolve our GNS names in the browser! We
417 just have to type "https://ccc.myself" into the address bar. If
418 our friend Bob prepared his system, too, he can resolve our record
419 by typing "ccc.alice.myself".
420 </p>
421</section>
422<section>
423 <h4>{{ _("VPN") }}</h4>
424
425 <p>
426 TBD
427 </p>
428</section>
429<section>
430 <h3>{{ _("Uninstall GNUnet and its dependencies") }}</h3>
431
432 <code>
433 $ cd ~/gnunet_installation/gnunet<br>
434 $ sudo make uninstall<br>
435 $ cd ~/gnunet_installation/libmicrohttpd<br>
436 $ sudo make uninstall<br>
437 $ sudo apt remove git libtool autoconf autopoint build-essential libgcrypt-dev libidn11-dev zlib1g-dev libunistring-dev libglpk-dev miniupnpc libextractor-dev libjansson-dev libcurl4-gnutls-dev libsqlite3-dev<br>
438 $ sudo apt autoremove<br>
439 $ sudo userdel -r gnunet<br>
440 $ sudo groupdel gnunet<br>
441 $ sudo groupdel gnunetdns<br>
442 $ sudo mv /etc/nsswitch.conf.original /etc/nsswitch.conf<br>
443 $ sudo rm /lib/$(uname -m)-linux-gnu/libnss_gns.so.2
444 </code>
445</section>
446<section>
447 <h3>{{ _("Appendix A: Optional GNUnet features") }}</h3>
448
449 <p>
450 TBD
451 </p>
452</section>
453<section>
454 <h3>{{ _("Troubleshooting") }}</h3>
455</section>
456<section>
457 <h4>{{ _("You can't reach other people's nodes") }}</h4>
458
459 <p>
460 Should our computer not have reached the open GNUnet network automatically,
461 we can manually instruct our node how to reach the nodes of our friends. This
462 works by exchanging HELLO strings. This is how we get a hello string for our
463 computer.
464 </p>
465
466 <code>
467 $ gnunet-peerinfo -gn
468 </code>
469
470 <p>
471 We can now pass this string to our friends "out of band" (using whatever
472 existing chat or messaging technology). If the string contains some private IP
473 networks we don't want to share, we can carefully edit them out.
474 </p>
475
476 <p>
477 Once we receive such strings from our friends, we can add them like
478 this:
479 </p>
480
481 <code>
482 gnunet-peerinfo -p <string>
483 </code>
484
485 <p>Now our GNUnet nodes can attempt reaching each other directly. This may
486 still fail due to NAT traversal issues.</p>
487
488 <!--<h4>{{ _("OMG you guys broke my internet") }}</h4>
489
490 <p>We can replace `/etc/nsswitch.conf` with the backup we made earlier
491 (`/etc/nsswitch.conf.original`). Now DNS resolution should work again without a
492 running GNUnet.</p>
493
494 <code>
495 $ cp /etc/nsswitch.conf.original /etc/nsswitch.conf
496 </code>-->
497</section>
498</article>
499{% endblock body_content %}
diff --git a/template/tutorial.html.j2 b/template/tutorial.html.j2
new file mode 100644
index 00000000..91c6396d
--- /dev/null
+++ b/template/tutorial.html.j2
@@ -0,0 +1,39 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<article class="d-flex flex-column p-2 bd-highlight">
4 <header>
5 <h1>{{ _("Tutorials") }}</h1>
6 </header>
7 <p>
8 {% trans %}
9 This page holds various tutorials for GNUnet. Some of them are not
10 complete, but we find them useful regardless of their state.
11 {% endtrans %}
12 </p>
13 <p>
14 {% trans %}
15 <a href="tutorial-ubuntu1804.html">GNUnet on Ubuntu 18.04</a>
16 {% endtrans %}
17 </p>
18 <p>
19 {% trans %}
20 <a href="tutorial-archpi.html">GNUnet on Arch-Pi</a>
21 {% endtrans %}
22 </p>
23 <p>
24 {% trans %}
25 <a href="tutorial-debian9.html">GNUnet on Debian 9</a>
26 {% endtrans %}
27 </p>
28 <p>
29 {% trans %}
30 <a href="tutorial-macos.html">GNUnet on macOS</a>
31 {% endtrans %}
32 </p>
33 <p>
34 {% trans %}
35 <a href="https://tutorial.gnunet.org/">C Coding Tutorial for GNUnet</a>
36 {% endtrans %}
37 </p>
38</article>
39{% endblock body_content %}
diff --git a/template/video.html.j2 b/template/video.html.j2
new file mode 100644
index 00000000..90eebb9b
--- /dev/null
+++ b/template/video.html.j2
@@ -0,0 +1,34 @@
1{% extends "common/base.j2" %}
2{% block body_content %}
3<div class="jumbotron">
4 <div class="container text-center">
5 <h1>{{ _("Media related to GNUnet") }}</h1>
6
7 <p>
8 {% trans %}
9 Over the years we've given a couple of talks, workshops and other presentations
10 which have been recorded. The list below is neither chronological in order, nor
11 complete.
12 {% endtrans %}
13 </p>
14 </div>
15</div>
16
17<div class="container adorn_h3_bracket">
18 <div class="row">
19 <div class="col-lg-4">
20
21 <h3>{{ _("2017") }}</h3>
22 <h3>{{ _("2016") }}</h3>
23 <h3>{{ _("2015") }}</h3>
24 <h3>{{ _("2014") }}</h3>
25 <h3>{{ _("2013") }}</h3>
26 <h3>{{ _("2012") }}</h3>
27 <h3>{{ _("2011") }}</h3>
28 <h3>{{ _("2010") }}</h3>
29 </div>
30 </div>
31</div>
32
33</div> <!-- /container -->
34{% endblock body_content %}