├── .gitignore ├── composer.json ├── favicon.ico ├── image ├── ie.png ├── osx.png ├── chrome.png ├── linux.png ├── android.png ├── de_flag.png ├── en_flag.png ├── firefox.png ├── key_ring.png ├── keypair.png ├── windows.png ├── apg_create.png ├── enigmail1.png ├── enigmail2.png ├── enigmail3.png ├── key_import.png ├── nokeypair.png ├── thunderbird.png ├── add_to_chrome.png ├── editor_button.png ├── launch_editor.png ├── make-keypair.png ├── internetbrowser.png ├── key_generation.png ├── mailvelope_icon.png ├── full-infographic-de.png ├── full-infographic-en.png ├── Microsoft_Outlook-Logo.png ├── mailvelope_create_keys.png └── Sources.txt ├── questions.gif ├── screenshot.jpg ├── include ├── descriptions-en │ ├── not_translated.html │ ├── gpgtools_m.html │ ├── mailvelope_introduction.html │ ├── gpg4win.html │ ├── gnupg.html │ ├── apg_install.html │ ├── apg_k9.html │ ├── apg_install_technical.html │ ├── mailvelope_install_firefox.html │ ├── apg_k9_simple.html │ ├── apg_create_keys.html │ ├── mailvelope_install.html │ ├── enigmail_thunderbird.html │ ├── apg_k9_technical.html │ ├── mailvelope_install_chrome.html │ ├── thunderbird_install_l.html │ ├── thunderbird_install_w.html │ ├── public_private_key_simple.html │ ├── mailvelope_requirements.html │ ├── keyserver.html │ ├── mailvelope_create_keys.html │ ├── public_private_key_technical.html │ ├── enigmail_create_keys.html │ ├── using_it_right.html │ ├── web_of_trust.html │ └── test_email.html ├── descriptions-de │ ├── not_translated.html │ ├── mailvelope_introduction.html │ ├── gpg4win.html │ ├── gpgtools_m.html │ ├── mailvelope_install_firefox.html │ ├── mailvelope_install_chrome.html │ ├── gnupg.html │ ├── apg_install.html │ ├── apg_k9.html │ ├── apg_k9_simple.html │ ├── mailvelope_install.html │ ├── apg_install_technical.html │ ├── apg_encrypt.html │ ├── apg_create_keys.html │ ├── enigmail_thunderbird.html │ ├── apg_k9_technical.html │ ├── keyserver.html │ ├── thunderbird_install_w.html │ ├── thunderbird_install_l.html │ ├── public_private_key_simple.html │ ├── mailvelope_requirements.html │ ├── mailvelope_create_keys.html │ ├── apg_keyserver.html │ ├── enigmail_create_keys.html │ ├── public_private_key_technical.html │ ├── test_email.html │ ├── using_it_right.html │ └── web_of_trust.html ├── startpage.html ├── sources.html ├── questions.html ├── snippets.html ├── LiamsKey.html ├── NinasKey.html └── impressum.html ├── DEPLOY.md ├── js ├── angular-csp.css ├── angular-cookies.min.js ├── angular-translate-loader-url.js ├── angular-translate-storage-cookie.js ├── angular-cookies.min.js.map ├── angular-translate-loader-static-files.js ├── angular-translate-storage-local.js ├── site.js ├── angular-cookies.js └── angular-animate.min.js ├── README.md ├── CONTRIBUTING.md ├── locale ├── en.json └── de.json ├── index.html ├── css ├── input-range.css └── style.css └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | counter.txt -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/favicon.ico -------------------------------------------------------------------------------- /image/ie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/ie.png -------------------------------------------------------------------------------- /image/osx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/osx.png -------------------------------------------------------------------------------- /questions.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/questions.gif -------------------------------------------------------------------------------- /image/chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/chrome.png -------------------------------------------------------------------------------- /image/linux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/linux.png -------------------------------------------------------------------------------- /screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/screenshot.jpg -------------------------------------------------------------------------------- /image/android.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/android.png -------------------------------------------------------------------------------- /image/de_flag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/de_flag.png -------------------------------------------------------------------------------- /image/en_flag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/en_flag.png -------------------------------------------------------------------------------- /image/firefox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/firefox.png -------------------------------------------------------------------------------- /image/key_ring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/key_ring.png -------------------------------------------------------------------------------- /image/keypair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/keypair.png -------------------------------------------------------------------------------- /image/windows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/windows.png -------------------------------------------------------------------------------- /image/apg_create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/apg_create.png -------------------------------------------------------------------------------- /image/enigmail1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/enigmail1.png -------------------------------------------------------------------------------- /image/enigmail2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/enigmail2.png -------------------------------------------------------------------------------- /image/enigmail3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/enigmail3.png -------------------------------------------------------------------------------- /image/key_import.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/key_import.png -------------------------------------------------------------------------------- /image/nokeypair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/nokeypair.png -------------------------------------------------------------------------------- /image/thunderbird.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/thunderbird.png -------------------------------------------------------------------------------- /image/add_to_chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/add_to_chrome.png -------------------------------------------------------------------------------- /image/editor_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/editor_button.png -------------------------------------------------------------------------------- /image/launch_editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/launch_editor.png -------------------------------------------------------------------------------- /image/make-keypair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/make-keypair.png -------------------------------------------------------------------------------- /image/internetbrowser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/internetbrowser.png -------------------------------------------------------------------------------- /image/key_generation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/key_generation.png -------------------------------------------------------------------------------- /image/mailvelope_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/mailvelope_icon.png -------------------------------------------------------------------------------- /image/full-infographic-de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/full-infographic-de.png -------------------------------------------------------------------------------- /image/full-infographic-en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/full-infographic-en.png -------------------------------------------------------------------------------- /image/Microsoft_Outlook-Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/Microsoft_Outlook-Logo.png -------------------------------------------------------------------------------- /image/mailvelope_create_keys.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jugendhackt/HowToPGP/HEAD/image/mailvelope_create_keys.png -------------------------------------------------------------------------------- /image/Sources.txt: -------------------------------------------------------------------------------- 1 | https://www.iconfinder.com/icons/24463/mozilla_thunderbird_icon#size=128 2 | http://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Windows_logo_-_2012.svg/768px-Windows_logo_-_2012.svg.png -------------------------------------------------------------------------------- /include/descriptions-en/not_translated.html: -------------------------------------------------------------------------------- 1 |

Not translated

2 |

This part of the instruction is not yet translated or does not exist. 3 | You can help building the website by participating on Github.

4 | -------------------------------------------------------------------------------- /include/descriptions-de/not_translated.html: -------------------------------------------------------------------------------- 1 |

Nicht übersetzt

2 |

Dieser Teil der Anleitung wurde entwender noch nicht in Ihre Sprache übersetzt oder noch nicht erstellt. 3 | Sie können helfen, diese Website zu erstellen. Infos auf Github.

4 | 5 | -------------------------------------------------------------------------------- /include/descriptions-en/gpgtools_m.html: -------------------------------------------------------------------------------- 1 |

Get GnuPG by downloading GPGTools.

2 |

GPGTools is a sofware-package, that contains GnuPG. Download and install it. 3 | Always choose the preset standard-options. After the installation, you can close all installation windows.

4 | 5 | -------------------------------------------------------------------------------- /include/descriptions-en/mailvelope_introduction.html: -------------------------------------------------------------------------------- 1 |

What is Mailvelope?

2 |

Mailvelope is for all users who want to read their mails directly in the web browser. 3 | Mailvelope is preconfigured for all common Mailproviders. So there shouldn't be problems with Gmail, Outlook, Yahoo! Mail, GMX, Posteo and some others. 4 | -------------------------------------------------------------------------------- /include/descriptions-en/gpg4win.html: -------------------------------------------------------------------------------- 1 |

Get GnuPG by downloading GPG4Win

2 |

GPG4Win is a software package that includes GnuPG. 3 | Download and install it, 4 | choosing default options whenever asked. After it is installed, you can close any windows that it creates.

5 | 6 | -------------------------------------------------------------------------------- /DEPLOY.md: -------------------------------------------------------------------------------- 1 | # Deploying an update to howtopgp.jugendhackt.de: 2 | 3 | Add the remote repository: 4 | 5 | git remote add heroku git@heroku.com:howtopgp.git 6 | 7 | Push the local git repo to the server: 8 | 9 | git push heroku master 10 | 11 | *Your ssh key must be registered by [ByteHamster](https://github.com/ByteHamster).* -------------------------------------------------------------------------------- /include/descriptions-de/mailvelope_introduction.html: -------------------------------------------------------------------------------- 1 |

Was ist Mailvelope?

2 |

Mailvelope ist für alle geeignet, die ihre Emails direkt im Browser abrufen möchten. 3 | Mailvelope ist bereits für alle gängigen Emailprovider vorkonfiguriert, wenn du also Gmail, 4 | Outlook, Yahoo! Mail, GMX, Posteo, oder ähnliches verwendst, solltest du keine Probleme mit Mailvelope haben.

5 | -------------------------------------------------------------------------------- /include/descriptions-de/gpg4win.html: -------------------------------------------------------------------------------- 1 |

Hol dir GnuPG, indem du GPG4Win herunterlädst

2 | 3 |

GPG4Win ist ein Software-Paket, das GnuPG enthält. Lade es herunter, 4 | installiere es und wähle dabei immer die vorgeschlagenen Standard-Optionen. Nachdem es installiert wurde, 5 | kannst du alle Fenster schließen, die es geöffnet hat.

6 | 7 | -------------------------------------------------------------------------------- /include/descriptions-de/gpgtools_m.html: -------------------------------------------------------------------------------- 1 |

Hol dir GnuPG, indem du GPGTools herunterlädst

2 | 3 |

GPGTools ist ein Software-Paket, das GnuPG enthält. Lade es herunter, 4 | installiere es und wähle dabei immer die vorgeschlagenen Standard-Optionen. Nachdem es installiert wurde, 5 | kannst du alle Fenster schließen, die es geöffnet hat.

6 | 7 | -------------------------------------------------------------------------------- /include/descriptions-de/mailvelope_install_firefox.html: -------------------------------------------------------------------------------- 1 |

Installation des Mailvelope-Plugins

2 |

Als nächstes musst du das Mailvelope-Plugin für deinen Browser installieren. 3 | Hier 4 | kannst du das Plugin für deinen Browser herunterladen. 5 | Klicke bei beiden Sicherheitsfragen auf "Akzeptieren" bzw. "Installieren".

6 | 7 | -------------------------------------------------------------------------------- /include/descriptions-en/gnupg.html: -------------------------------------------------------------------------------- 1 |

GnuPG, OpenPGP, what?

2 |

In general, the terms GnuPG, GPG, GNU Privacy Guard, OpenPGP and PGP are used interchangeably. 3 | Technically, OpenPGP (Pretty Good Privacy) is the encryption standard, and GNU Privacy Guard (often shortened to GPG or GnuPG) 4 | is the program that implements the standard. Enigmail is a plug-in program for your email program that provides an interface for GnuPG.

5 | 6 | -------------------------------------------------------------------------------- /include/descriptions-en/apg_install.html: -------------------------------------------------------------------------------- 1 |

Install the APG app

2 |

To use PGP on your Android device you need to download the APG app. 3 | You can download the app here 4 | from the Google Play Store, or 5 | here from the F-Droid app repository.

6 | -------------------------------------------------------------------------------- /include/descriptions-de/mailvelope_install_chrome.html: -------------------------------------------------------------------------------- 1 |

Als nächstes musst du das Mailvelope-Plugin in deinem Chrome-Browser installieren. Hier findest du den Downloadlink:
2 | Google Chrome. 3 | Dieser Link führt dich zum Google Chrome Webstore. Klicke auf in der oberen, rechten Ecke.

4 | -------------------------------------------------------------------------------- /js/angular-csp.css: -------------------------------------------------------------------------------- 1 | /* Include this file in your html if you are using the CSP mode. */ 2 | 3 | @charset "UTF-8"; 4 | 5 | [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], 6 | .ng-cloak, .x-ng-cloak, 7 | .ng-hide:not(.ng-hide-animate) { 8 | display: none !important; 9 | } 10 | 11 | ng\:form { 12 | display: block; 13 | } 14 | 15 | .ng-animate-shim { 16 | visibility:hidden; 17 | } 18 | 19 | .ng-anchor { 20 | position:absolute; 21 | } 22 | -------------------------------------------------------------------------------- /include/descriptions-de/gnupg.html: -------------------------------------------------------------------------------- 1 |

GnuPG, OpenPGP, was?

2 | 3 |

Die Begriffe GnuPG, GPG, GNU Privacy Guard, OpenPGP und PGP werden oft verwendet, 4 | um das gleiche zu bezeichnen. Technisch gesehen, ist OpenPGP (Pretty Good Privacy) 5 | der Verschlüsselungsstandard und GNU Privacy Guard (abgekürzt GPG oder GnuPG) das Programm, 6 | das diesen Standard umsetzt. Enigmail ist eine Erweiterung für dein E-Mail-Programm und fungiert als Schnittstelle zu GnuPG.

7 | 8 | -------------------------------------------------------------------------------- /include/descriptions-de/apg_install.html: -------------------------------------------------------------------------------- 1 |

Installiere die APG-App

2 |

Um PGP auf deinem Android nutzen zu können, musst du dir die APG-App herunterladen. 3 | Du kannst dir die App hier 4 | hier aus dem Google Play Store herunterladen, oder alternativ 5 | hier aus dem F-Droid App Repository.

6 | -------------------------------------------------------------------------------- /include/descriptions-de/apg_k9.html: -------------------------------------------------------------------------------- 1 |

Du brauchst ein Mailprogramm

2 |

Um APG optimal nutzen zu können empfehlen wir den Open-Source Mailclient K9-Mail. Lade die App 3 | hier aus dem Google Play Store herunter, 4 | oder alternativ hier aus dem F-Droid App Repository.

5 |

Öffne die K9-Mail App und folge dem Einrichtungsdialog.

6 | -------------------------------------------------------------------------------- /include/descriptions-en/apg_k9.html: -------------------------------------------------------------------------------- 1 |

You need a Mailclient

2 |

The easiest way to encryt your E-Mails whith the APG app is to use the the open-source mailclient K9-Mail. 3 | You can download it here 4 | from the Google Play Store, or here 5 | from the F-Droid app repository.

6 |

Open the K9-Mail App and follow the set up dialog.

7 | -------------------------------------------------------------------------------- /include/descriptions-en/apg_install_technical.html: -------------------------------------------------------------------------------- 1 |

Install the APG app

2 |

To use PGP on your Android device you need to download the APG app. 3 | You can download the app here 4 | from the Google Play Store, or 5 | here from the F-Droid app repository.

6 |

APG is an open-source implementation of OpenPGP. The app is licenced under the GPL3 licence

7 | -------------------------------------------------------------------------------- /include/descriptions-en/mailvelope_install_firefox.html: -------------------------------------------------------------------------------- 1 |

Installing the Mailvelope browser-plugin

2 |

Next, you have to install the Mailvelope plugin in your browser. You can get the version for Mozilla Firefox 3 | here. Accept both security questions with "Allow" and "Install".
4 | After the installation process has been completed, you can find a new icon with a lock on it in your toolbar, in the upper right corner. Click it to open the Mailvelope main menu. 5 | 6 | -------------------------------------------------------------------------------- /include/startpage.html: -------------------------------------------------------------------------------- 1 |

2 |
3 |

4 | SECTION_1 5 |

6 |

7 | SECTION_2 8 |

9 |
10 |
11 |
12 |
13 | CONTINUE 14 |
15 |
16 |
17 |
18 | fullinfographic 19 |
20 | -------------------------------------------------------------------------------- /include/descriptions-de/apg_k9_simple.html: -------------------------------------------------------------------------------- 1 |

Du brauchst ein Mailprogramm

2 |

Um APG möglichst einfach nutzen zu können empfehlen wir die E-Mail App K9-Mail. Mit der App kannst du deine 3 | E-Mails auf deinem Android Gerät abrufen. Lade die App 4 | hier aus dem Google Play Store herunter, 5 | oder alternativ hier aus dem F-Droid App Repository.

6 |

Öffne die K9-Mail App und folge dem Einrichtungsdialog.

7 | -------------------------------------------------------------------------------- /include/descriptions-de/mailvelope_install.html: -------------------------------------------------------------------------------- 1 |

Als nächstes musst du das Mailvelope-Plugin für deinen Browser installieren. Hier findest du die Downloads für Firefox und den Chrome-Browser: 2 | Mozilla Firefox,
3 | Google Chrome. 4 | Dieser Link führt dich zum Google Chrome Webstore. Klicke auf in der oberen, rechten Ecke.

5 | 6 | -------------------------------------------------------------------------------- /include/descriptions-en/apg_k9_simple.html: -------------------------------------------------------------------------------- 1 |

You need a Mailclient

2 |

The easiest way to encryt your E-Mails whith the APG app is to use the the open-source mailclient K9-Mail. With this app 3 | you can read your e-mails on your android device. 4 | You can download it here 5 | from the Google Play Store, or here 6 | from the F-Droid app repository.

7 |

Open the K9-Mail App and follow the set up dialog.

8 | -------------------------------------------------------------------------------- /include/descriptions-en/apg_create_keys.html: -------------------------------------------------------------------------------- 1 |

Create a Keypair

2 |

Open the APG app and press the button. Fill the textfields out the textfields with your personal data and of a strong passphrase. 3 | Your passphrase should be at least 12 character and should contain at leat one small and one capital letter, one number and one special character. 4 | Do not not forget your password or you have to do it all agin. Choose a keylenght of 4096. Now press on the "save" button in the upper right corner. You now have created your own pgp keypair.

5 | -------------------------------------------------------------------------------- /include/descriptions-de/apg_install_technical.html: -------------------------------------------------------------------------------- 1 |

Installiere die APG-App

2 |

Um PGP auf deinem Android nutzen zu können, musst du dir die APG-App herunterladen. 3 | Du kannst dir die App hier 4 | aus dem Google Play Store herunterladen, oder alternativ 5 | hier aus dem F-Droid App Repository.

6 |

APG ist eine OpenPGP Implementation und ist Open-Source. Die App steht unter GPL3 Lizenz.

7 | -------------------------------------------------------------------------------- /include/descriptions-en/mailvelope_install.html: -------------------------------------------------------------------------------- 1 |

Installing the Mailvelope browser-plugin

2 |

Next, you have to install the Mailvelope plugin in your browser. You can get the version for 3 | Mozilla Firefox here.
4 | For the Google Chrome Version click here. 5 | This will bring you to the Google Chrome Webstore. Click on the in the upper-right corner.

6 | -------------------------------------------------------------------------------- /include/descriptions-de/apg_encrypt.html: -------------------------------------------------------------------------------- 1 |

Sende eine verschlüsselte Test-E-Mail

2 |

Jetzt kannst du Edward eine verschlüsselte Mail senden mit deinem öffentlichen Schlüssel senden. 3 | Damit du diesen später an die E-Mail anhängen kannst, musst du ihn ersteinmal exportieren. 4 | Tippe auf deinen eigenen Kontakt und dann auf die das Icon, mit den drei Quadraten und wähle "Export to file". 5 | Merke dir den Dateipfad. Jetzt kannst du die Mail an Edward schreiben. 6 | Gehe in die K9-Mailapp und verfasse eine E-Mail an edward-de@gsg.org mit dem Betreff "Verschlüsselungstest". 7 | Und setze Hacken bei Sign und Encrypt.

8 | 9 | -------------------------------------------------------------------------------- /include/descriptions-de/apg_create_keys.html: -------------------------------------------------------------------------------- 1 |

Erstelle ein Schlüsselpaar

2 |

Öffne die APG-App und tippe auf den Button. Fülle die Felder mit deinen Daten aus und überlege dir eine starke Passphrase. 3 | Deine Passphrase sollte mindestens 12 Zeichen lang sein und mindestens je einen Kleinbuchstaben und Großbuchstaben und mindestens eine Zahl oder ein Satzzeichen enthalten. 4 | Vergiss das Passwort nicht, sonst ist diese gesamte Arbeit umsonst! Wähle eine als Keylänge 4096. Wenn du fertig bist, tippe auf den "save" Button in der oberen rechten Ecke. Nun hast du dir dein PGP-Schlüsselpaar erstellt.

5 | -------------------------------------------------------------------------------- /include/descriptions-en/enigmail_thunderbird.html: -------------------------------------------------------------------------------- 1 |

Install the Enigmail plugin for your email program

2 |

In your email program's menu, select Add-ons (it may be in the Tools section). 3 | Make sure Extensions is selected on the left. Do you see Enigmail? If so, skip this step.

4 |

If not, search "Enigmail" with the search bar in the upper right. You can take it from here. Restart your email program when you are done.

5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /include/descriptions-en/apg_k9_technical.html: -------------------------------------------------------------------------------- 1 |

You need a Mailclient

2 |

The easiest way to encryt your E-Mails whith the APG app is to use the the open-source mailclient K9-Mail, because APG has a K9-Mail integration. 3 | You can download it here 4 | from the Google Play Store, or here 5 | from the F-Droid app repository.

6 |

The K9 mailclient is licenced under the Apache 2.0 licence and is a community developement projekt.

7 |

Open the K9-Mail App and follow the set up dialog.

8 | -------------------------------------------------------------------------------- /include/descriptions-en/mailvelope_install_chrome.html: -------------------------------------------------------------------------------- 1 |

Installing the Mailvelope browser-plugin

2 |

Next, you have to install the Mailvelope plugin in your browser. You can get the version for 3 | Google Chrome here. 4 | This link will bring you to the Google Chrome Webstore. Click on the 5 | in the upper-right corner. When the confirmation prompt appears, click Install.
6 | After installation, a lock icon is displayed in the main Google Chrome toolbar. Click it to open the Mailvelope main menu.

7 | 8 | -------------------------------------------------------------------------------- /include/descriptions-de/enigmail_thunderbird.html: -------------------------------------------------------------------------------- 1 |

Das Enigmail-Plugin

2 |

Klicke im Menü deines E-Mail-Programmes auf Add-ons (es könnte auch im Untermenü Extras sein). 3 | Vergewissere dich, dass auf der linken Seite Erweiterungen ausgewählt ist. Kannst du Enigmail sehen? 4 | Wenn ja, dann überspringe diesen Schritt.

5 | 6 |

Wenn nicht, suche "Enigmail" mit Hilfe der Suchleiste oben rechts. Installiere es und starte dein E-Mail-Programm anschließend neu.

7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /include/descriptions-en/thunderbird_install_l.html: -------------------------------------------------------------------------------- 1 |

Most GNU/Linux operating systems come with GnuPG installed on them, so you do not have to download it. 2 | Before configuring GnuPG though, you'll need the IceDove desktop email program installed on your computer. 3 | Most GNU/Linux distributions have IceDove installed already, though it may be under the alternate name "Thunderbird." 4 | Email programs are another way to access the same email accounts you can access in a browser (like Gmail), but provide extra features.

5 |

Setup your email program with your email account

6 |

Open your email program and follow the wizard (step-by-step walkthrough) that sets it up with your email account.

7 | -------------------------------------------------------------------------------- /include/descriptions-en/thunderbird_install_w.html: -------------------------------------------------------------------------------- 1 |

To get started, you'll need the IceDove desktop email program installed on your computer. 2 | For your system, IceDove may be known by the alternate name "Thunderbird." Email programs are 3 | another way to access the same email accounts you can access in a browser (like Gmail), but provide extra features. 4 |
5 | If you do not have Thunderbird/Icedove yet download and install it now. 6 |

7 | 8 |

Setup your email program with your email account

9 |

Open your email program and follow the wizard (step-by-step walkthrough) that sets it up with your email account.

10 | 11 | -------------------------------------------------------------------------------- /include/descriptions-de/apg_k9_technical.html: -------------------------------------------------------------------------------- 1 |

Du brauchst einen Mailprogramm

2 |

Um APG optimal nutzen zu können empfehlen wir den Open-Source Mailclient K9-Mail, da APG eine K9 Integration besitzt. Lade die App 3 | hier aus dem Google Play Store herunter, 4 | oder alternativ hier aus dem F-Droid App Repository.

5 |

Der K9-Mailclient steht unter Apache 2.0 Lizenz und wird von der Community weiter entwickelt. 6 | K9-Mail unterstüzt IMAP, POP3 und Exchange 2003/2007.

7 |

Öffne die K9-Mail App und richte dein Mailkonto ein, indem du dem Einrichtungsdialog folgst.

8 | -------------------------------------------------------------------------------- /include/descriptions-en/public_private_key_simple.html: -------------------------------------------------------------------------------- 1 |

To use PGP, you'll need a public key and a private key (known together as a keypair). 2 | Each is a long string of randomly generated numbers and letters that are unique to you. 3 | Your public and private keys are linked together by a special mathematical function.

4 | 5 |

Your public key isn't like a physical key, because it is stored in the open in an online 6 | directory called a keyserver. People download it and use it to encrypt emails they send to you. 7 | You can think of the keyserver as phonebook, where people who want to send you an encrypted email look up your public key.

8 | 9 |

Your private key is more like a physical key, because you keep it to yourself (on your computer). 10 | You use your private key to decode encrypted emails other people send to you.

11 | 12 | -------------------------------------------------------------------------------- /include/descriptions-en/mailvelope_requirements.html: -------------------------------------------------------------------------------- 1 |

Requirements:

2 | Mailvelope is a free browser-plugin, for Mozilla Firefox and Google Chrome. 3 | You can download one of them by clicking at the links down below. 4 |
5 | 6 | Chrome 7 | Mozilla Firefox 8 |
9 | 10 | Chrome 11 | Google Chrome 12 | 13 | 14 |

Not sure what Browser to install? Read 15 | this article 16 | to get more information about advantages and disadvantages of both browsers.

17 | -------------------------------------------------------------------------------- /include/descriptions-de/keyserver.html: -------------------------------------------------------------------------------- 1 |

Wähle Enigmail → Schlüssel verwalten... im Menü aus.

2 |

Rechtsklicke auf deinen Schlüssel und klicke dann auf "Auf Schlüssel-Server hochladen...". Wähle dazu den voreingestellten Schlüsselserver im Pop-up.

3 |

Jetzt kann jemand, der dir eine verschlüsselte Nachricht übermitteln möchte, deinen Schlüssel vom Internet herunterladen.

4 | 5 |

Probleme?

6 |

11 | 12 | -------------------------------------------------------------------------------- /include/descriptions-de/thunderbird_install_w.html: -------------------------------------------------------------------------------- 1 |

Du brauchst ein E-Mail-Programm

2 |

E-Mail-Programme sind neben Webmail eine weitere Möglichkeit, auf E-Mail-Konten zuzugreifen. Sie funktionieren ähnlich, bieten aber mehr Funktionen und können mehrere Mailkonten gleichzeitig verwalten. 3 | In dieser Anleitung wird das freie Programm Thunderbird verwendet.
4 | Wenn du Thunderbird noch nicht installiert hast, kannst du es hier herunterladen. 5 | Führe dann den Installationsassistenten aus.

6 | 7 |

Richte dein E-Mail-Konto ein

8 |

Öffne Thunderbird und folge dem Assistenten, der es für dein E-Mail-Konto konfiguriert. Wenn es dabei Schwierigkeiten gibt, erkundige dich bei deinem E-Mail-Anbieter nach den benötigten Angaben. Große Anbieter haben dafür in der Regel Anleitungen auf ihrer Website.

9 | -------------------------------------------------------------------------------- /include/descriptions-de/thunderbird_install_l.html: -------------------------------------------------------------------------------- 1 |

Auf den meisten GNU/Linux-Systemen ist GnuPG bereits installiert, also musst du es nicht herunterladen. 2 | Bevor du GnuPG konfigurierst, brauchst du jedoch ein E-Mail-Programm. E-Mail-Programme sind neben Webmail eine weitere Möglichkeit, auf E-Mail-Konten zuzugreifen. Sie funktionieren ähnlich, bieten aber mehr Funktionen und können mehrere Mailkonten gleichzeitig verwalten. Bei den meisten GNU/Linux-Distributionen kann man eine Version des freien Programms Thunderbird (bzw. Icedove) installieren, wenn sie nicht bereits installiert ist.

3 | 4 |

Richte dein E-Mail-Konto ein

5 |

Öffne dein E-Mail-Programm und folge dem Assistenten, der es für dein E-Mail-Konto konfiguriert. Wenn es dabei Schwierigkeiten gibt, erkundige dich bei deinem E-Mail-Anbieter nach den benötigten Angaben. Große Anbieter haben dafür in der Regel Anleitungen auf ihrer Website.

6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [HowToPGP](http://howtopgp.jugendhackt.de/) 2 | 3 | A [Jugend hackt](http://jugendhackt.de/) project. 4 | 5 | We want to explain [PGP-encryption](http://de.wikipedia.org/wiki/Pretty_Good_Privacy) 6 | simple and understandable for everyone. PGP is a very secure way to encrypt your e-mails, but is it not that easy to install and to use. Only by teaching a wide range of people how to use encryption, we are able to stop mass surveillance. 7 | 8 | ![Screenshot](https://raw.githubusercontent.com/Jugendhackt/HowToPGP/master/screenshot.jpg) 9 | 10 | **Read your personal instruction for PGP** 11 | 12 | ![Questions](https://raw.githubusercontent.com/Jugendhackt/HowToPGP/master/questions.gif) 13 | 14 | **Our website is currently available in English and German, contact us if you speak another language and want to help us make this tool accessible to more people. Especially a plain language translation would be real great.** 15 | 16 | -------------------------------------------------------------------------------- /include/descriptions-de/public_private_key_simple.html: -------------------------------------------------------------------------------- 1 |

Um PGP zu verwenden, benötigt man einen öffentlichen und einen privaten Schlüssel (beide bilden ein Schlüsselpaar). 2 | Jeder Schlüssel ist eine sehr große Zahl und ist einzigartig. Beide Schlüssel sind mit einer speziellen mathematischen Funktion verbunden.

3 | 4 |

Dein öffentlicher Schlüssel ist nicht wie ein Hausschlüssel, da er im Internet auf einem Schlüsselserver gespeichert wird. 5 | Die Leute können ihn so herunterladen und ihn benutzen, wenn sie dir verschlüsselte E-Mails verschicken. 6 | Man kann sich den Schlüsselserver wie ein Telefonbuch vorstellen, von wo Leute, die dir eine Verschlüsselte E-Mail schicken möchten, 7 | deinen öffentlichen Schlüssel herunterladen können.

8 | 9 |

Dein privater Schlüssel ist eher wie ein Hausschlüssel, weil ihn niemand außer dir besitzen darf. 10 | Der private Schlüssel wird eingesetzt, wenn du E-Mails entschlüsselst.

11 | 12 | -------------------------------------------------------------------------------- /include/descriptions-de/mailvelope_requirements.html: -------------------------------------------------------------------------------- 1 |

Voraussetzungen:

2 | Mailvelope ist ein kostenloses Browser-Plugin für Mozilla Firefox und Google Chrome. Falls du 3 | keinen der beiden Browser intalliert hast, findest du die Downloadlinks hier:
4 |
5 | 6 | Chrome 7 | Mozilla Firefox 8 |
9 | 10 | Chrome 11 | Google Chrome 12 | 13 | 14 |

Du bist dir unsicher, welchen der beiden Browser du installieren sollst? 15 | In 16 | diesem Artikel von Chip Praxistipps findest du mehr Informationen zu den 17 | Vor- und Nachteilen der beiden Internentbrowser.

18 | -------------------------------------------------------------------------------- /include/descriptions-en/keyserver.html: -------------------------------------------------------------------------------- 1 |

Upload your public key to a keyserver

2 |

In your email program's menu, select Enigmail → Key Management.

3 |

Right click on your key and select "Upload Public Keys to Keyserver". Use the default keyserver in the popup.

4 |

Now someone who wants to send you an encrypted message can download your public key from the Internet. 5 | There are multiple keyservers that you can select from the menu when you upload, but they are all copies of each other, 6 | so it does not matter which one you use. However, it sometimes takes a few hours for them to match each other when a new key is uploaded.

7 | 8 |

Troubleshooting

9 |

14 | -------------------------------------------------------------------------------- /include/sources.html: -------------------------------------------------------------------------------- 1 |
2 |

3 |

SOURCES


4 |

ENIGMAIL_HOWTO

5 | Free Software Foundation 6 | (Attribution-ShareAlike 4.0 International) 7 |
8 |
9 | Thunderbird icon:
10 | Iconfinder 11 | (Free for non commercial use) 12 |
13 |
14 | Windows icon:
15 | Wikimedia 16 | (Public domain) 17 | Android icon
18 | Wikimedia 19 | (Attribution 3.0 Unported) 20 | 21 | 22 |
-------------------------------------------------------------------------------- /include/descriptions-de/mailvelope_create_keys.html: -------------------------------------------------------------------------------- 1 |

Erstelle ein Schlüsselpaar

2 |

Nach der Installation kannst du das Mailvelope Hauptmenü über, das in deiner Browsertoolbar erschienene Sicherheitsschlossicon erreichen. Danach musst du dir ein Schlüsselpaar erstellen. Hierfür klickst du in im Mailvelope Hauptmenü auf „Optionen“. Nun solltest du ein Fenster mit der Überschrift „Einrichtung“, ansonsten erreichst du dieses Fenster über „Schlüsselverwaltung“, „Einrichtung“. Klicke hier auf den den blauen Button mit der Aufschrift „Schlüssel erstellen“.
In den ersten beiden Felder des folgenden Fenster gibst du deinen Namen (oder einen Pseudonym) und deine E-Mailadresse ein. Nun musst du dir ein starkes Passwort ausdenken. Dein Passwort 3 | sollte mindestens 12 Zeichen lang sein und mindestens je einen Kleinbuchstaben und Großbuchstaben und mindestens eine Zahl oder ein Satzzeichen enthalten. Vergiss das Passwort nicht, sonst ist diese gesamte Arbeit umsonst! Wiederhole dein Passwort im nächsten Feld um Tippfehler im Passwort zu vermeiden und drücke auf „Senden“.

4 | 5 | -------------------------------------------------------------------------------- /include/descriptions-en/mailvelope_create_keys.html: -------------------------------------------------------------------------------- 1 |

Erstelle ein Schlüsselpaar

2 |

Nach der Installation kannst du das Mailvelope Hauptmenü über, das in deiner Browsertoolbar erschienene Sicherheitsschlossicon erreichen. Danach musst du dir ein Schlüsselpaar erstellen. Hierfür klickst du in im Mailvelope Hauptmenü auf „Optionen“. Nun solltest du ein Fenster mit der Überschrift „Einrichtung“, ansonsten erreichst du dieses Fenster über „Schlüsselverwaltung“, „Einrichtung“. Klicke hier auf den den blauen Button mit der Aufschrift „Schlüssel erstellen“.
In den ersten beiden Felder des folgenden Fenster gibst du deinen Namen (oder einen Pseudonym) und deine E-Mailadresse ein. Nun musst du dir ein starkes Passwort ausdenken. Dein Passwort 3 | sollte mindestens 12 Zeichen lang sein und mindestens je einen Kleinbuchstaben und Großbuchstaben und mindestens eine Zahl oder ein Satzzeichen enthalten. Vergiss das Passwort nicht, sonst ist diese gesamte Arbeit umsonst! Wiederhole dein Passwort im nächsten Feld um Tippfehler im Passwort zu vermeiden und drücke auf „Senden“.

4 | 5 | -------------------------------------------------------------------------------- /include/descriptions-de/apg_keyserver.html: -------------------------------------------------------------------------------- 1 |

Keyserver

2 |

Du befindest dich nun in deinem Adressbuch. Bis jetzt hast du nur einen Kontakt - dich selbst. Damit deine Kommunikationsparter dir verschlüsselte Mails schreiben können, müssen sie 3 | deinen öffentlichen Key haben. Der einfachste Weg anderen deinen öffentlichen Schlüssel zukommen zu lassen ist, ihn auf einen Keyserver hochzuladen. 4 | Um dies zu tun tippe auf deinen Kontakt, auf den Pfeilbutton oben in der Kopfzeile und anschließend auf "Upload to key server". Mache das am besten für alle drei Keyserver.

5 |

Wenn du den öffenlichen Schlüssel einer anderen Person suchst, findest du diesen oft auf einem dieser Keyserver. Öffne die APG-App und tippe auf das Icon, 6 | mit dem Plus und dem Männchen. Um den Schlüssel von edward-de@fsf.org zu importieren, gebe seine E-Mailadresse in das Suchfeld ein. Nun solltest du einen 7 | Eintrag mit dem Namen Edward the GPG Bot finden. Um zu überprüfen, dass sich dabei auch um Edward handelt, vergleiche Edwards Fingerabdruck (C09A61E8) mit den 8 | letzen Stellen der langen bunten Buchstabenkombination in diesem Eintrag. Nachdem du dies überprüft hast, tippe auf den Eintag und danach auf dem blauen 9 | Button unten mit der Aufschrit "Import selected keys". Jetzt solltest du eine grüne Meldung bekommen - "1 Key successfully imported". Edward wird dir jetzt 10 | in deiner Kontaktliste angezeigt.

11 | -------------------------------------------------------------------------------- /js/angular-cookies.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | AngularJS v1.5.0 3 | (c) 2010-2016 Google, Inc. http://angularjs.org 4 | License: MIT 5 | */ 6 | (function(p,c,n){'use strict';function l(b,a,g){var d=g.baseHref(),k=b[0];return function(b,e,f){var g,h;f=f||{};h=f.expires;g=c.isDefined(f.path)?f.path:d;c.isUndefined(e)&&(h="Thu, 01 Jan 1970 00:00:00 GMT",e="");c.isString(h)&&(h=new Date(h));e=encodeURIComponent(b)+"="+encodeURIComponent(e);e=e+(g?";path="+g:"")+(f.domain?";domain="+f.domain:"");e+=h?";expires="+h.toUTCString():"";e+=f.secure?";secure":"";f=e.length+1;4096 4096 bytes)!");k.cookie=e}}c.module("ngCookies",["ng"]).provider("$cookies",[function(){var b=this.defaults={};this.$get=["$$cookieReader","$$cookieWriter",function(a,g){return{get:function(d){return a()[d]},getObject:function(d){return(d=this.get(d))?c.fromJson(d):d},getAll:function(){return a()},put:function(d,a,m){g(d,a,m?c.extend({},b,m):b)},putObject:function(d,b,a){this.put(d,c.toJson(b),a)},remove:function(a,k){g(a,n,k?c.extend({},b,k):b)}}}]}]);c.module("ngCookies").factory("$cookieStore", 8 | ["$cookies",function(b){return{get:function(a){return b.getObject(a)},put:function(a,c){b.putObject(a,c)},remove:function(a){b.remove(a)}}}]);l.$inject=["$document","$log","$browser"];c.module("ngCookies").provider("$$cookieWriter",function(){this.$get=l})})(window,window.angular); 9 | //# sourceMappingURL=angular-cookies.min.js.map 10 | -------------------------------------------------------------------------------- /include/descriptions-en/public_private_key_technical.html: -------------------------------------------------------------------------------- 1 |

What is asymmetric cryptograpy?

2 | 3 |

Public-key cryptography, also known as asymmetric cryptography, requires two separate keys, 4 | one of which is private and one of which is public. Although different, the two parts of this key 5 | pair are mathematically linked. The public key is used, for example, to encrypt plaintext or to verify a 6 | digital signature; whereas the private key is used for the opposite operation, in these examples to 7 | decrypt ciphertext or to create a digital signature. The term "asymmetric" stems from the use of different 8 | keys to perform these opposite functions, each the inverse of the other – as contrasted with conventional 9 | ("symmetric") cryptography which relies on the same key to perform both.

10 | 11 |

Mathematically a public key is based on the two large prime numbers, along with an auxiliary value. 12 | The prime numbers must be kept secret. Anyone can use the public key to encrypt a message, but with 13 | currently published methods, if the public key is large enough, only someone with knowledge of the 14 | prime numbers can feasibly decode the message.

15 | 16 |

Your public key isn't like a physical key, because it is stored in the open in an online directory 17 | called a keyserver. People download it and use it, along with PGP, to encrypt emails they send to you. 18 | You can think of the keyserver as phonebook, where people who want to send you an encrypted email look up your public key.

19 | 20 |

Your private key is more like a physical key, because you keep it to yourself (on your computer). 21 | You use your private key to decode encrypted emails other people send to you.

22 | 23 | -------------------------------------------------------------------------------- /include/descriptions-de/enigmail_create_keys.html: -------------------------------------------------------------------------------- 1 |

Erstelle ein Schlüsselpaar

2 |

Der Enigmail-Assistent startet möglicherweise automatisch, falls nicht, wähle Enigmail → 3 | Enigmail-Assistent im Menü deines E-Mail-Programms aus. Du musst den Text im nächsten Fenster 4 | nicht unbedingt lesen, wenn du nicht willst, aber es ist eine gute Idee, die Texte der späteren 5 | Schritte des Assistenten zu lesen. Nutze die Standard-Optionen, außer bei folgenden Punkten:

6 | 7 |

Im Schritt "Verschlüsselung", wähle "Verschlüssele alle meine Nachrichten, weil mir meine Privatsphäre wichtig ist"

8 |

Im Schritt "Unterschreiben", wähle "Meine Nachrichten sollen nicht standardmäßig unterschrieben werden"

9 |

Im Schritt "Schlüsselauswahl", wähle "Ich möchte ein neues Schlüsselpaar erzeugen"

10 |

Im Schritt "OpenPGP-Schlüssel erzeugen" solltest du ein starkes Passwort verwenden! Dein Passwort 11 | sollte mindestens 12 Zeichen lang sein und mindestens je einen Kleinbuchstaben und Großbuchstaben und 12 | mindestens eine Zahl oder ein Satzzeichen enthalten. Vergiss das Passwort nicht, sonst ist diese gesamte Arbeit umsonst!

13 |

14 | 15 |

Das Programm wird einige Minuten brauchen, um den nächsten Schritt "Schlüsselerzeugung" abzuschließen. 16 | Während du wartest, solltest du etwas anderes mit deinem Computer tun, wie einen Film anschauen oder 17 | im Web surfen. Je mehr du deinen Computer in dieser Zeit nutzt, desto schneller wird der Schlüssel generiert.

18 | 19 |

Wenn der Schritt "Enigmail-Bestätigung" kommt, klicke auf "Zertifikat erzeugen" und speichere es an 20 | einem sicheren Ort auf deinem Computer (wir empfehlen einen Ordner namens "Widerrufszertifikat" in deinem Home-Verzeichnis).

21 | 22 | -------------------------------------------------------------------------------- /include/descriptions-de/public_private_key_technical.html: -------------------------------------------------------------------------------- 1 |

Wie funktioniert asymmetrische Verschlüsselung

2 |

PGP ist ein asymmetrisches Verschlüsselungsverfahren, also ein kryptographisches Verfahren, um mit einem 3 | öffentlichen Schlüssel einen Klartext in einen Geheimtext umzuwandeln, aus dem der Klartext mit einem 4 | geheimen Schlüssel wieder gewonnen werden kann.
5 | 6 | Um PGP zu verwenden, benötigt man einen öffentlichen und einen privaten Schlüssel (beide bilden ein Schlüsselpaar). 7 | Jeder Schlüssel ist eine sehr große Zahl und ist einzigartig. Beide Schlüssel sind mit einer mathematischen Funktion verbunden.
8 | 9 | Funktionen, bei denen eine Richtung leicht, die andere schwierig zu berechnen ist, bezeichnet man als Einwegfunktionen 10 | (engl. one-way function). Beispielsweise ist nach aktuellem Wissensstand die Faktorisierung einer großen Zahl, 11 | also ihre Zerlegung in ihre Primfaktoren, sehr aufwändig, während das Erzeugen einer Zahl durch Multiplikation 12 | von Primzahlen recht einfach ist. Spezielle Einwegfunktionen sind Falltürfunktionen (engl. trapdoor one-way function), 13 | die mit Hilfe einer Zusatzinformation auch rückwärts leicht zu berechnen sind. Bei PGP ist dein öffentlicher Schlüssel die Falltüre. 14 |

15 | 16 |

Dein öffentlicher Schlüssel ist nicht wie ein Hausschlüssel, da er im Internet auf einem Schlüsselserver 17 | gespeichert wird. Die Leute können ihn so herunterladen und ihn benutzen, wenn sie dir verschlüsselte 18 | E-Mails verschicken. Man kann sich den Schlüsselserver wie ein Telefonbuch vorstellen, von wo Leute, 19 | die dir eine Verschlüsselte E-Mail schicken möchten, deinen öffentlichen Schlüssel herunterladen können.

20 | 21 |

Dein privater Schlüssel ist eher wie ein Hausschlüssel, weil ihn niemand außer dir besitzen darf. 22 | Der private Schlüssel wird eingesetzt, wenn du E-Mails entschlüsselst.

23 | 24 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Coutributing to the HowToPGP project 2 | 3 | We are always happy about [pull requests](https://github.com/Jugendhackt/HowToPGP/pulls) from everyone! 4 | 5 | No matter what kind of contribution - large or small. If you want to help but you are not sure what to add, here is a small list of features that realy would bring the projekt foreward. 6 | You can also look at the [issue page](https://github.com/Jugendhackt/HowToPGP/issues) for more ideas. 7 | 8 | ##Instructions 9 | 10 | The aim of our project is to cover as many systems as possible, so new instructions are always an great improvement. There are also 11 | instructions that are not completed yet. You can help by completing the Android and the Mailvelpoe instructions. 12 | 13 | The instruction text files can be found in [HowToPGP/include/descriptions-lang](https://github.com/Jugendhackt/HowToPGP/tree/master/include). 14 | Please orientate at the exsiting instructions. Name the files like that: __client_instructionpart_os_level.html__ for example __thunderbird_install_l_technical.html__. 15 | Add the .html files in [here](https://github.com/Jugendhackt/HowToPGP/blob/master/page.appcache). 16 | 17 | ##Translation 18 | 19 | We want to make this website aviable in multible languages. At the moment our Website is aviable in English and German. Sometimes there are 20 | parts of the instruction that are not translated in one of this languages. Just look for files that exists in the descriptions-de folder but not in 21 | the descriptions-en folder or vice versa. A very big improvement would be a translation in new language. For a translation in a new language create a new folder in 22 | [HowToPGP/include/](https://github.com/Jugendhackt/HowToPGP/tree/master/include) and name it __descriptions-lang__. Please do not translate the 23 | name of the files. For a translation of the mainpage add a new .json file in [HowToPGP/locale/](https://github.com/Jugendhackt/HowToPGP/tree/master/locale) and name it 24 | __lang.json__. 25 | -------------------------------------------------------------------------------- /locale/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "FIREFOX": "Firefox", 3 | "PAGE_TITLE": "HowToPGP", 4 | "WINDOWS": "Windows", 5 | "QUESTION_BROWSER": "Which browser?", 6 | "KEYS_TRUE": "I already use PGP on my computer", 7 | "KEYS_FALSE": "I am new to PGP", 8 | "SOURCES": "Sources", 9 | "QUESTIONS_DESCRIPTION": "Before starting, we ask you to give us some simple information so we can generate your personal instruction.", 10 | "CHROME": "Chrome", 11 | "INTERNETBROWSER": "No Mailclient", 12 | "QUESTION_KEYS": "Do you already have a PGP keypair?", 13 | "QUESTION_ONE": "Which operating system do you use?", 14 | "SECTION_2": "With this interactiv instruction we want to explain you, how to encrypt your e-mails with PGP to protect your communication and help stopping mass surveillance.

Please answer some questions in order to make it possible to provide specific information first!", 15 | "QUESTION_THREE": "Which level of difficulty?", 16 | "DESCRIPTION": "Read your personal instruction for PGP", 17 | "SLIDER_VALUE_3": "I want to gain technical understanding", 18 | "CONTINUE": "Continue »", 19 | "START_DESCRIPTION": "Start tutorial!", 20 | "COPYRIGHT": "© Jugend hackt Süd", 21 | "SLIDER_VALUE_2": "As fast as possible, please!", 22 | "QUESTIONS_TITLE": "Questions", 23 | "LINUX": "Linux", 24 | "CONTACT_US": "In case that you want to contact us, drop us a mail. Our Keys are down there.", 25 | "ANDROID": "Android", 26 | "MACOS": "OS X", 27 | "SECTION_1": "Have you ever heard anything about the PGP-encryption?", 28 | "BUGREPORT": "Send feedback", 29 | "THUNDERBIRD": "Thunderbird", 30 | "ENIGMAIL_HOWTO": "Enigmail instruction: ", 31 | "SLIDER_VALUE_1": "I'm not good with computers", 32 | "LAST_MODIFIED": "Last modified: ", 33 | "ERROR404": "Error 404 - This Site does not exist", 34 | "IE": "Internet Explorer", 35 | "QUESTION_TWO": "Which mail client do you use?" 36 | } 37 | -------------------------------------------------------------------------------- /locale/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "FIREFOX": "Firefox", 3 | "PAGE_TITLE": "HowToPGP", 4 | "WINDOWS": "Windows", 5 | "QUESTION_BROWSER": "Welcher Browser?", 6 | "KEYS_TRUE": "Ich habe bereits ein PGP Keypair", 7 | "KEYS_FALSE": "Ich benutze PGP zum ersten Mal", 8 | "SOURCES": "Quellen", 9 | "QUESTIONS_DESCRIPTION": "Um für dich eine personalisierte Anleitung erstellen zu können, brauchen wir einige Informationen.", 10 | "CHROME": "Chrome", 11 | "INTERNETBROWSER": "Kein Mailprogramm", 12 | "QUESTION_KEYS": "Besitzt du bereits ein PGP-Schlüsselpaar?", 13 | "QUESTION_ONE": "Welches Betriebssystem verwendest du?", 14 | "SECTION_2": "Mit dieser interaktiven Anleitung wollen wir dir erklären, wie du mit Hilfe von PGP deine E-Mails verschlüsseln kannst. Dadurch schützt du deine Kommunikation und wirkst der Massenüberwachung entgegen.

Doch zuvor: eine kleine Fragerunde, um rechnerspezifische Ergebnisse liefern zu können.", 15 | "QUESTION_THREE": "Wie Ausführlich?", 16 | "DESCRIPTION": "Eine persönlich angepasste Anleitung für PGP", 17 | "SLIDER_VALUE_3": "Technisches Verständnis", 18 | "CONTINUE": "Fortfahren »", 19 | "START_DESCRIPTION": "Anleitung starten!", 20 | "COPYRIGHT": "© Jugend hackt Süd", 21 | "SLIDER_VALUE_2": "Schnell zum Ziel", 22 | "QUESTIONS_TITLE": "Fragen", 23 | "LINUX": "Linux", 24 | "CONTACT_US": "Wenn du uns erreichen willst, schreibt uns doch eine Mail. Unsere PGP-Keys findest du hier.", 25 | "ANDROID": "Android", 26 | "MACOS": "OS X", 27 | "SECTION_1": "Hast du schon mal von PGP-Verschlüsselung gehört?", 28 | "BUGREPORT": "Feedback senden", 29 | "THUNDERBIRD": "Thunderbird", 30 | "ENIGMAIL_HOWTO": "Enigmail Anleitung: ", 31 | "SLIDER_VALUE_1": "Ich stehe mit Computern auf Kriegsfuß.", 32 | "LAST_MODIFIED": "Zuletzt aktualisiert: ", 33 | "ERROR404": "Error 404 - Diese Seite existiert nicht!", 34 | "IE": "Internet Explorer", 35 | "QUESTION_TWO": "Welches E-Mail-Programm verwendest du?" 36 | } 37 | -------------------------------------------------------------------------------- /include/descriptions-en/enigmail_create_keys.html: -------------------------------------------------------------------------------- 1 |

Create a keypair

2 |

The Enigmail Setup wizard should start automatically. If it does not, select Enigmail → Setup Wizard 3 | from your email program's menu. You do not need to read the text in the window that pops up unless you would like to, 4 | but it is good to read the text on the later screens of the wizard. Click "Next" with the default options selected, except in these instances:

5 | 6 |

On the screen titled "Encryption," select "Encrypt all of my messages by default, because privacy is critical to me."

7 | 8 |

On the screen titled "Signing," select "Don't sign my messages by default."

9 | 10 |

On the screen titled "Key Selection," select "I want to create a new key pair for signing and encrypting my email."

11 | 12 |

On the screen titled "Create Key," pick a strong password! Your password should be at least 12 characters and include at 13 | least one lower case and upper case letter and at least one number or punctuation symbol. Don't forget the password, or all this work will be wasted!

14 | 15 |

The program will take a little while to finish the next step, the "Key Creation" screen. While you wait, do something else with your computer, 16 | like watching a movie or browsing the Web. The more you use the computer at this point, the faster the key creation will go.

17 | 18 |

When the "Key Generation Completed" screen pops up, select Generate Certificate and choose to save it in a safe place on your computer 19 | (we recommend making a folder called "Revocation Certificate" in your home folder and keeping it there). You'll learn more about the revocation certificate in

20 | 21 | 22 |

Troubleshooting

23 | 24 |

25 |

32 |

33 | 34 | -------------------------------------------------------------------------------- /js/angular-translate-loader-url.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * angular-translate - v2.8.1 - 2015-10-01 3 | * 4 | * Copyright (c) 2015 The angular-translate team, Pascal Precht; Licensed MIT 5 | */ 6 | (function (root, factory) { 7 | if (typeof define === 'function' && define.amd) { 8 | // AMD. Register as an anonymous module unless amdModuleId is set 9 | define([], function () { 10 | return (factory()); 11 | }); 12 | } else if (typeof exports === 'object') { 13 | // Node. Does not work with strict CommonJS, but 14 | // only CommonJS-like environments that support module.exports, 15 | // like Node. 16 | module.exports = factory(); 17 | } else { 18 | factory(); 19 | } 20 | }(this, function () { 21 | 22 | angular.module('pascalprecht.translate') 23 | /** 24 | * @ngdoc object 25 | * @name pascalprecht.translate.$translateUrlLoader 26 | * @requires $q 27 | * @requires $http 28 | * 29 | * @description 30 | * Creates a loading function for a typical dynamic url pattern: 31 | * "locale.php?lang=en_US", "locale.php?lang=de_DE", "locale.php?language=nl_NL" etc. 32 | * Prefixing the specified url, the current requested, language id will be applied 33 | * with "?{queryParameter}={key}". 34 | * Using this service, the response of these urls must be an object of 35 | * key-value pairs. 36 | * 37 | * @param {object} options Options object, which gets the url, key and 38 | * optional queryParameter ('lang' is used by default). 39 | */ 40 | .factory('$translateUrlLoader', $translateUrlLoader); 41 | 42 | function $translateUrlLoader($q, $http) { 43 | 44 | 'use strict'; 45 | 46 | return function (options) { 47 | 48 | if (!options || !options.url) { 49 | throw new Error('Couldn\'t use urlLoader since no url is given!'); 50 | } 51 | 52 | var requestParams = {}; 53 | 54 | requestParams[options.queryParameter || 'lang'] = options.key; 55 | 56 | return $http(angular.extend({ 57 | url: options.url, 58 | params: requestParams, 59 | method: 'GET' 60 | }, options.$http)) 61 | .then(function(result) { 62 | return result.data; 63 | }, function () { 64 | return $q.reject(options.key); 65 | }); 66 | }; 67 | } 68 | $translateUrlLoader.$inject = ['$q', '$http']; 69 | 70 | $translateUrlLoader.displayName = '$translateUrlLoader'; 71 | return 'pascalprecht.translate'; 72 | 73 | })); 74 | -------------------------------------------------------------------------------- /include/descriptions-en/using_it_right.html: -------------------------------------------------------------------------------- 1 |

Use it well

2 |

Everyone uses GnuPG a little differently, but it is important to follow some basic practices to keep your email secure. 3 | Not following them, you risk the privacy of the people you communicate with, as well as your own, and damage the Web of Trust.

4 | 5 |

When should I encrypt?

6 |

The more you can encrypt your messages, the better. If you only encrypt emails occasionally, 7 | each encrypted message could raise a red flag for surveillance systems. If all or most of your email is encrypted, 8 | people doing surveillance won't know where to start.

9 | 10 |

That's not to say that only encrypting some of your email isn't helpful -- it is a great start and it makes bulk surveillance more difficult.

11 | 12 |

Be wary of invalid keys!

13 |

GnuPG makes email safer, but it is still important to watch out for invalid keys, which might have fallen into the wrong hands. 14 | Email encrypted with invalid keys might be readable by surveillance programs.

15 |

In your email program, go back to the second email that Edward sent you. Because Edward encrypted it with your public key, 16 | it will have a message from Enigmail at the top, which most likely says "Enigmail: Part of this message encrypted."

17 | 18 |

When using GnuPG, make a habit of glancing at that bar. 19 | The program will warn you there if you get an email encrypted 20 | with a key that can not be trusted.

21 | 22 |

Copy your revocation certificate to somewhere safe

23 |

Remember when you created your keys and saved the revocation certificate that GnuPG made? it is time to copy that certificate 24 | onto the safest digital storage that you have -- the ideal thing is a flash drive, disk, or hard drive stored in a safe place in your home.

25 |

If your private key ever gets lost or stolen, you'll need this certificate file to let people know that you are no longer using that keypair.

26 | 27 |

Act swiftly if someone gets your private key

28 |

If you lose your private key or someone else gets ahold of it (say, by stealing or cracking your computer), 29 | it is important to revoke it immediately before someone else uses it to read your encrypted email. 30 | This guide does not cover how to revoke a key, but you can follow the 31 | instructions on the GnuPG site. 32 | After you're done revoking, send an email to everyone with whom you usually use your key to make sure they know.

33 | 34 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | HowToPGP 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 |
29 |
30 |

PAGE_TITLE

31 | DESCRIPTION 32 |
33 |
34 | 35 |
36 |
37 | 39 |
40 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /include/descriptions-de/test_email.html: -------------------------------------------------------------------------------- 1 |

Sende eine verschlüsselte Test-E-Mail

2 |

Schreibe eine neue E-Mail in Deinem E-Mail-Programm an edward-de@fsf.org. Schreibe "Verschlüsselungstest" 3 | oder etwas ähnliches in den Betreff und irgendetwas in den Text der Nachricht.
4 | Das Icon mit dem Schlüssel unten rechts im Fenster der E-Mail sollte gelb sein. Das bedeutet die Verschlüsselung 5 | ist aktiviert. Dies wird ab jetzt deine Standardeinstellung sein.
6 | Neben dem Schlüssel siehst du das Bild eines Stiftes. Das Anklicken dieses Symbols veranlasst Enigmail, 7 | eine spezielle eindeutige Unterschrift auf der Basis deines privaten Schlüssels zu deiner Nachricht hinzuzufügen. 8 | Dies ist ein anderes Verfahren als die Verschlüsselung, das du im Rahmen dieser Anleitung nicht benutzten musst.
9 | Drücke auf Senden. Enigmail wird eine Meldung "Nicht gefundene Empfänger" zeigen.

10 | 11 |

Um eine E-Mail an Edward zu verschlüsseln, benötigst du seinen öffentlichen Schlüssel, also muss 12 | Enigmail ihn jetzt von einem Schlüsselserver herunterladen. Klicke auf "Fehlende Schlüssel herunterladen", 13 | wähle den ersten (Schlüssel-ID C09A61E8) und klicke dann auf OK. Klicke im nächsten Pop-up-Fenster wieder auf OK.
14 | 15 | Jetzt bist du zurück beim Dialog "Nicht gefundene Empfänger". Wähle den Kasten vor Edwards Schlüssel an und 16 | klicke auf Absenden. Sollte die E-Mail nicht automatisch versendet werden, kannst du jetzt auf Senden drücken.

17 | 18 |

Da du die E-Mail mit Edwards öffentlichem Schlüssel verschlüsselt hast, braucht man Edwards privaten Schlüssel, 19 | um die E-Mail entschlüsseln zu können. Nur Edward besitzt seinen privaten Schlüssel, also kann niemand außer ihm — 20 | nicht einmal du — die E-Mail entschlüsseln.

21 | 22 |

Probleme?

23 | 24 |

28 | 29 |

Empfange eine Antwort

30 |

Wenn Edward deine E-Mail empfangen hat, entschlüsselt er sie mit seinem privaten Schlüssel. 31 | Dann wird er deinen öffentlichen Schlüssel verwenden (den du ihm in der Email geschickt hast), um seine Antwort an dich zu verschlüsseln.

32 |

Edward braucht vermutlich zwei, drei Minuten, um zu antworten. In der Zwischenzeit du könntest schonmal bei "Nutze es richtig" weiter lesen.

33 |

Wenn du Edwards E-Mail bekommst und sie öffnest, erkennt Enigmail automatisch, dass sie mit deinem 34 | öffentlichen Schlüssel verschlüsselt wurde, und wird dann deinen privaten Schlüssel benutzen, um sie zu entschlüsseln.

35 |

Beachte die Leiste mit Informationen über Edwards Schlüssel, die über der Nachricht eingeblendet wird.

36 | 37 | -------------------------------------------------------------------------------- /js/angular-translate-storage-cookie.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * angular-translate - v2.8.1 - 2015-10-01 3 | * 4 | * Copyright (c) 2015 The angular-translate team, Pascal Precht; Licensed MIT 5 | */ 6 | (function (root, factory) { 7 | if (typeof define === 'function' && define.amd) { 8 | // AMD. Register as an anonymous module unless amdModuleId is set 9 | define([], function () { 10 | return (factory()); 11 | }); 12 | } else if (typeof exports === 'object') { 13 | // Node. Does not work with strict CommonJS, but 14 | // only CommonJS-like environments that support module.exports, 15 | // like Node. 16 | module.exports = factory(); 17 | } else { 18 | factory(); 19 | } 20 | }(this, function () { 21 | 22 | angular.module('pascalprecht.translate') 23 | 24 | /** 25 | * @ngdoc object 26 | * @name pascalprecht.translate.$translateCookieStorage 27 | * @requires $cookieStore 28 | * 29 | * @description 30 | * Abstraction layer for cookieStore. This service is used when telling angular-translate 31 | * to use cookieStore as storage. 32 | * 33 | */ 34 | .factory('$translateCookieStorage', $translateCookieStorageFactory); 35 | 36 | function $translateCookieStorageFactory($cookieStore) { 37 | 38 | 'use strict'; 39 | 40 | var $translateCookieStorage = { 41 | 42 | /** 43 | * @ngdoc function 44 | * @name pascalprecht.translate.$translateCookieStorage#get 45 | * @methodOf pascalprecht.translate.$translateCookieStorage 46 | * 47 | * @description 48 | * Returns an item from cookieStorage by given name. 49 | * 50 | * @param {string} name Item name 51 | * @return {string} Value of item name 52 | */ 53 | get: function (name) { 54 | return $cookieStore.get(name); 55 | }, 56 | 57 | /** 58 | * @ngdoc function 59 | * @name pascalprecht.translate.$translateCookieStorage#set 60 | * @methodOf pascalprecht.translate.$translateCookieStorage 61 | * 62 | * @description 63 | * Sets an item in cookieStorage by given name. 64 | * 65 | * @deprecated use #put 66 | * 67 | * @param {string} name Item name 68 | * @param {string} value Item value 69 | */ 70 | set: function (name, value) { 71 | $cookieStore.put(name, value); 72 | }, 73 | 74 | /** 75 | * @ngdoc function 76 | * @name pascalprecht.translate.$translateCookieStorage#put 77 | * @methodOf pascalprecht.translate.$translateCookieStorage 78 | * 79 | * @description 80 | * Sets an item in cookieStorage by given name. 81 | * 82 | * @param {string} name Item name 83 | * @param {string} value Item value 84 | */ 85 | put: function (name, value) { 86 | $cookieStore.put(name, value); 87 | } 88 | }; 89 | 90 | return $translateCookieStorage; 91 | } 92 | $translateCookieStorageFactory.$inject = ['$cookieStore']; 93 | 94 | $translateCookieStorageFactory.displayName = '$translateCookieStorage'; 95 | return 'pascalprecht.translate'; 96 | 97 | })); 98 | -------------------------------------------------------------------------------- /include/questions.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | {{"QUESTIONS_DESCRIPTION"|translate}} 5 |

6 |

7 | 8 | {{progress}}% 9 | 10 |
11 |

{{"QUESTION_THREE"|translate}}

12 | 13 |

14 |
15 |
16 |
17 |
18 | {{"START_DESCRIPTION"|translate}} 19 |
20 |
21 |
22 |
23 |
24 |

{{"QUESTION_KEYS"|translate}}

25 |
{{'KEYS_FALSE'|translate}}{{"KEYS_FALSE"|translate}}
26 |
{{'KEYS_TRUE'|translate}}{{"KEYS_TRUE"|translate}}
27 |
28 |
29 |

{{"QUESTION_BROWSER"|translate}}

30 |
{{'IE'|translate}}{{"IE"|translate}}
31 |
{{'FIREFOX'|translate}}{{"FIREFOX"|translate}}
32 |
{{'CHROME'|translate}}{{"CHROME"|translate}}
33 |
34 |
35 |

{{"QUESTION_TWO"|translate}}

36 |
{{'THUNDERBIRD'|translate}}{{"THUNDERBIRD"|translate}}
37 |
{{'INTERNETBROWSER'|translate}}{{"INTERNETBROWSER"|translate}}
38 |
39 |
40 |

{{"QUESTION_ONE"|translate}}

41 |
{{'WINDOWS'|translate}}{{"WINDOWS"|translate}}
42 |
{{'MACOS'|translate}}{{"MACOS"|translate}}
43 |
{{'LINUX'|translate}}{{"LINUX"|translate}}
44 |
{{'ANDROID'|translate}}{{"ANDROID"|translate}}
45 |
46 | 47 |
48 | -------------------------------------------------------------------------------- /include/snippets.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 |
7 | 8 |
9 |
10 | 11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | -------------------------------------------------------------------------------- /js/angular-cookies.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version":3, 3 | "file":"angular-cookies.min.js", 4 | "lineCount":8, 5 | "mappings":"A;;;;;aAKC,SAAQ,CAACA,CAAD,CAASC,CAAT,CAAkBC,CAAlB,CAA6B,CA2QtCC,QAASA,EAAc,CAACC,CAAD,CAAYC,CAAZ,CAAkBC,CAAlB,CAA4B,CACjD,IAAIC,EAAaD,CAAAE,SAAA,EAAjB,CACIC,EAAcL,CAAA,CAAU,CAAV,CAmClB,OAAO,SAAQ,CAACM,CAAD,CAAOC,CAAP,CAAcC,CAAd,CAAuB,CAjCW,IAC3CC,CAD2C,CACrCC,CACVF,EAAA,CAgCoDA,CAhCpD,EAAqB,EACrBE,EAAA,CAAUF,CAAAE,QACVD,EAAA,CAAOZ,CAAAc,UAAA,CAAkBH,CAAAC,KAAlB,CAAA,CAAkCD,CAAAC,KAAlC,CAAiDN,CACpDN,EAAAe,YAAA,CAAoBL,CAApB,CAAJ,GACEG,CACA,CADU,+BACV,CAAAH,CAAA,CAAQ,EAFV,CAIIV,EAAAgB,SAAA,CAAiBH,CAAjB,CAAJ,GACEA,CADF,CACY,IAAII,IAAJ,CAASJ,CAAT,CADZ,CAIIK,EAAAA,CAAMC,kBAAA,CAqB6BV,CArB7B,CAANS,CAAiC,GAAjCA,CAAuCC,kBAAA,CAAmBT,CAAnB,CAE3CQ,EAAA,CADAA,CACA,EADON,CAAA,CAAO,QAAP,CAAkBA,CAAlB,CAAyB,EAChC,GAAOD,CAAAS,OAAA,CAAiB,UAAjB,CAA8BT,CAAAS,OAA9B,CAA+C,EAAtD,CACAF,EAAA,EAAOL,CAAA,CAAU,WAAV,CAAwBA,CAAAQ,YAAA,EAAxB,CAAgD,EACvDH,EAAA,EAAOP,CAAAW,OAAA,CAAiB,SAAjB,CAA6B,EAMhCC,EAAAA,CAAeL,CAAAM,OAAfD,CAA4B,CACb,KAAnB,CAAIA,CAAJ,EACEnB,CAAAqB,KAAA,CAAU,UAAV,CASqChB,CATrC,CACE,6DADF;AAEEc,CAFF,CAEiB,iBAFjB,CASFf,EAAAkB,OAAA,CAJOR,CAG6B,CArCW,CAzPnDlB,CAAA2B,OAAA,CAAe,WAAf,CAA4B,CAAC,IAAD,CAA5B,CAAAC,SAAA,CAOY,UAPZ,CAOwB,CAACC,QAAyB,EAAG,CAwBjD,IAAIC,EAAW,IAAAA,SAAXA,CAA2B,EAiC/B,KAAAC,KAAA,CAAY,CAAC,gBAAD,CAAmB,gBAAnB,CAAqC,QAAQ,CAACC,CAAD,CAAiBC,CAAjB,CAAiC,CACxF,MAAO,CAWLC,IAAKA,QAAQ,CAACC,CAAD,CAAM,CACjB,MAAOH,EAAA,EAAA,CAAiBG,CAAjB,CADU,CAXd,CAyBLC,UAAWA,QAAQ,CAACD,CAAD,CAAM,CAEvB,MAAO,CADHzB,CACG,CADK,IAAAwB,IAAA,CAASC,CAAT,CACL,EAAQnC,CAAAqC,SAAA,CAAiB3B,CAAjB,CAAR,CAAkCA,CAFlB,CAzBpB,CAuCL4B,OAAQA,QAAQ,EAAG,CACjB,MAAON,EAAA,EADU,CAvCd,CAuDLO,IAAKA,QAAQ,CAACJ,CAAD,CAAMzB,CAAN,CAAaC,CAAb,CAAsB,CACjCsB,CAAA,CAAeE,CAAf,CAAoBzB,CAApB,CAAuCC,CAvFpC,CAAUX,CAAAwC,OAAA,CAAe,EAAf,CAAmBV,CAAnB,CAuF0BnB,CAvF1B,CAAV,CAAkDmB,CAuFrD,CADiC,CAvD9B,CAuELW,UAAWA,QAAQ,CAACN,CAAD,CAAMzB,CAAN,CAAaC,CAAb,CAAsB,CACvC,IAAA4B,IAAA,CAASJ,CAAT,CAAcnC,CAAA0C,OAAA,CAAehC,CAAf,CAAd,CAAqCC,CAArC,CADuC,CAvEpC,CAsFLgC,OAAQA,QAAQ,CAACR,CAAD,CAAMxB,CAAN,CAAe,CAC7BsB,CAAA,CAAeE,CAAf,CAAoBlC,CAApB,CAA2CU,CAtHxC,CAAUX,CAAAwC,OAAA,CAAe,EAAf,CAAmBV,CAAnB,CAsH8BnB,CAtH9B,CAAV,CAAkDmB,CAsHrD,CAD6B,CAtF1B,CADiF,CAA9E,CAzDqC,CAA7B,CAPxB,CA8JA9B,EAAA2B,OAAA,CAAe,WAAf,CAAAiB,QAAA,CAiCS,cAjCT;AAiCyB,CAAC,UAAD,CAAa,QAAQ,CAACC,CAAD,CAAW,CAErD,MAAO,CAWLX,IAAKA,QAAQ,CAACC,CAAD,CAAM,CACjB,MAAOU,EAAAT,UAAA,CAAmBD,CAAnB,CADU,CAXd,CAyBLI,IAAKA,QAAQ,CAACJ,CAAD,CAAMzB,CAAN,CAAa,CACxBmC,CAAAJ,UAAA,CAAmBN,CAAnB,CAAwBzB,CAAxB,CADwB,CAzBrB,CAsCLiC,OAAQA,QAAQ,CAACR,CAAD,CAAM,CACpBU,CAAAF,OAAA,CAAgBR,CAAhB,CADoB,CAtCjB,CAF8C,CAAhC,CAjCzB,CAqIAjC,EAAA4C,QAAA,CAAyB,CAAC,WAAD,CAAc,MAAd,CAAsB,UAAtB,CAEzB9C,EAAA2B,OAAA,CAAe,WAAf,CAAAC,SAAA,CAAqC,gBAArC,CAAuDmB,QAA+B,EAAG,CACvF,IAAAhB,KAAA,CAAY7B,CAD2E,CAAzF,CAvTsC,CAArC,CAAD,CA4TGH,MA5TH,CA4TWA,MAAAC,QA5TX;", 6 | "sources":["angular-cookies.js"], 7 | "names":["window","angular","undefined","$$CookieWriter","$document","$log","$browser","cookiePath","baseHref","rawDocument","name","value","options","path","expires","isDefined","isUndefined","isString","Date","str","encodeURIComponent","domain","toUTCString","secure","cookieLength","length","warn","cookie","module","provider","$CookiesProvider","defaults","$get","$$cookieReader","$$cookieWriter","get","key","getObject","fromJson","getAll","put","extend","putObject","toJson","remove","factory","$cookies","$inject","$$CookieWriterProvider"] 8 | } 9 | -------------------------------------------------------------------------------- /css/input-range.css: -------------------------------------------------------------------------------- 1 | input[type=range] { 2 | -webkit-appearance: none; 3 | width: 100%; 4 | } 5 | input[type=range]::-webkit-slider-thumb { 6 | -webkit-appearance: none; 7 | } 8 | input[type=range]:focus { 9 | outline: none; 10 | } 11 | input[type=range]::-ms-track { 12 | width: 100%; 13 | background: transparent; 14 | border-color: transparent; 15 | color: transparent; 16 | } 17 | input[type=range]::-webkit-slider-thumb { 18 | -webkit-appearance: none; 19 | height: 36px; 20 | width: 16px; 21 | background: #000; 22 | margin-top: -14px; 23 | } 24 | input[type=range]::-webkit-slider-runnable-track { 25 | width: 100%; 26 | height: 8.4px; 27 | background: #4285f4; 28 | border-radius: 1.3px; 29 | } 30 | input[type=range]::-moz-range-track { 31 | width: 100%; 32 | height: 8.4px; 33 | background: #4285f4; 34 | border-radius: 1.3px; 35 | border: 0.2px solid #010101; 36 | } 37 | input[type=range]::-ms-track { 38 | width: 100%; 39 | height: 8.4px; 40 | background: transparent; 41 | border-color: transparent; 42 | border-width: 16px 0; 43 | color: transparent; 44 | } 45 | input[type=range]::-ms-fill-lower { 46 | background: #2a6495; 47 | border: 0.2px solid #010101; 48 | border-radius: 2.6px; 49 | } 50 | input[type=range]::-ms-fill-upper { 51 | background: #3071a9; 52 | border: 0.2px solid #010101; 53 | border-radius: 2.6px; 54 | } 55 | input[type=range]::-moz-range-thumb { 56 | border: 1px solid #000000; 57 | height: 36px; 58 | width: 16px; 59 | border-radius: 3px; 60 | background: #000; 61 | } 62 | input[type=range]::-ms-thumb { 63 | height: 36px; 64 | width: 16px; 65 | border-radius: 3px; 66 | background: #000; 67 | } 68 | input[type=range] { 69 | -webkit-appearance: none; 70 | margin: 25px 0; 71 | width: 100%; 72 | } 73 | input[type=range]:focus { 74 | outline: none; 75 | } 76 | input[type=range]::-webkit-slider-runnable-track { 77 | width: 100%; 78 | height: 8.4px; 79 | animate: 0.5s; 80 | background: #4285f4; 81 | border-radius: 1.3px; 82 | } 83 | input[type=range]::-webkit-slider-thumb { 84 | height: 36px; 85 | width: 16px; 86 | border-radius: 3px; 87 | background: #000; 88 | -webkit-appearance: none; 89 | margin-top: -14px; 90 | } 91 | input[type=range]::-moz-range-track { 92 | width: 100%; 93 | height: 8.4px; 94 | animate: 0.5s; 95 | background: #3071a9; 96 | border-radius: 1.3px; 97 | } 98 | input[type=range]::-moz-range-thumb { 99 | height: 36px; 100 | width: 16px; 101 | border-radius: 3px; 102 | background: #000; 103 | } 104 | input[type=range]::-moz-focus-outer { 105 | border: 0; 106 | } 107 | input[type=range]::-ms-track { 108 | width: 100%; 109 | height: 8.4px; 110 | animate: 0.2s; 111 | background: transparent; 112 | border-color: transparent; 113 | border-width: 16px 0; 114 | color: transparent; 115 | } 116 | input[type=range]::-ms-fill-lower { 117 | background: #4285f4; 118 | border-radius: 2.6px; 119 | } 120 | input[type=range]::-ms-fill-upper { 121 | background: #4285f4; 122 | border-radius: 2.6px; 123 | } 124 | input[type=range]::-ms-thumb { 125 | height: 36px; 126 | width: 16px; 127 | border-radius: 3px; 128 | background: #000; 129 | } 130 | -------------------------------------------------------------------------------- /include/descriptions-en/web_of_trust.html: -------------------------------------------------------------------------------- 1 |

Learn the Web of Trust

2 |

Email encryption is a powerful technology, but it has a weakness; it requires a way to verify that a 3 | person's public key is actually theirs. Otherwise, there would be no way to stop an attacker from making 4 | an email address with your friend's name, creating keys to go with it and impersonating your friend. 5 | That's why the free software programmers that developed email encryption created keysigning and the Web of Trust.

6 | 7 |

When you sign someone's key, you are publicly saying that you trust that it does belong to them and 8 | not an impostor. People who use your public key can see the number of signatures it has. Once you have 9 | used GnuPG for a long time, you may have hundreds of signatures. The Web of Trust is the constellation 10 | of all GnuPG users, connected to each other by chains of trust expressed through signatures, forming a 11 | giant network. The more signatures a key has, and the more signatures its signers' keys have, the more trustworthy that key is.

12 | 13 |

People's public keys are usually identified by their key fingerprint, which is a string of digits like 14 | F357AA1A5B1FA42CFD9FE52A9FF2194CC09A61E8 (for Edward's key). You can see the fingerprint for your public key, 15 | and other public keys saved on your computer, by going to Enigmail → Key Management in your email program's menu, 16 | then right clicking on the key and choosing Key Properties. it is good practice to share your fingerprint wherever you 17 | share your email address, so that people can double-check that they have the correct public key when they download yours from a keyserver.

18 | 19 |

You may also see public keys referred to by their key ID, which is simply the last 8 digits of the fingerprint, 20 | like C09A61E8 for Edward. The key ID is visible directly from the Key Management window. This key ID is like a 21 | person's first name (it is a useful shorthand but may not be unique to a given key), whereas the fingerprint 22 | actually identifies the key uniquely without the possibility of confusion. If you only have the key ID, you 23 | can still look up the key (as well as its fingerprint), like you did in Step 3, but if multiple options appear, 24 | you'll need the fingerprint of the person to whom are trying to communicate to verify which one to use.

25 | 26 | 27 |

Sign a key

28 |

In your email program's menu, go to Enigmail → Key Management.

29 |

Right click on Edward's public key and select Sign Key from the context menu.

30 |

In the window that pops up, select "I will not answer" and click ok.

31 |

Now you should be back at the Key Management menu. Select Keyserver → Upload Public Keys and hit ok.

32 |

You've just effectively said "I trust that Edward's public key actually belongs to Edward." This does 33 | not mean much because Edward isn't a real person, but it is good practice.

34 | 35 | 36 | 37 |

Important: check people's identification before signing their keys

38 |

Before signing a real person's key, always make sure it actually belongs to them, and that they are 39 | who they say they are. Ask them to show you their ID (unless you trust them very highly) and their 40 | public key fingerprint -- not just the shorter public key ID, which could refer to another key as well. 41 | In Enigmail, answer honestly in the window that pops up and asks "How carefully have you verified that 42 | the key you are about to sign actually belongs to the person(s) named above?".

43 | 44 | -------------------------------------------------------------------------------- /js/angular-translate-loader-static-files.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * angular-translate - v2.8.1 - 2015-10-01 3 | * 4 | * Copyright (c) 2015 The angular-translate team, Pascal Precht; Licensed MIT 5 | */ 6 | (function (root, factory) { 7 | if (typeof define === 'function' && define.amd) { 8 | // AMD. Register as an anonymous module unless amdModuleId is set 9 | define([], function () { 10 | return (factory()); 11 | }); 12 | } else if (typeof exports === 'object') { 13 | // Node. Does not work with strict CommonJS, but 14 | // only CommonJS-like environments that support module.exports, 15 | // like Node. 16 | module.exports = factory(); 17 | } else { 18 | factory(); 19 | } 20 | }(this, function () { 21 | 22 | angular.module('pascalprecht.translate') 23 | /** 24 | * @ngdoc object 25 | * @name pascalprecht.translate.$translateStaticFilesLoader 26 | * @requires $q 27 | * @requires $http 28 | * 29 | * @description 30 | * Creates a loading function for a typical static file url pattern: 31 | * "lang-en_US.json", "lang-de_DE.json", etc. Using this builder, 32 | * the response of these urls must be an object of key-value pairs. 33 | * 34 | * @param {object} options Options object, which gets prefix, suffix and key. 35 | */ 36 | .factory('$translateStaticFilesLoader', $translateStaticFilesLoader); 37 | 38 | function $translateStaticFilesLoader($q, $http) { 39 | 40 | 'use strict'; 41 | 42 | return function (options) { 43 | 44 | if (!options || (!angular.isArray(options.files) && (!angular.isString(options.prefix) || !angular.isString(options.suffix)))) { 45 | throw new Error('Couldn\'t load static files, no files and prefix or suffix specified!'); 46 | } 47 | 48 | if (!options.files) { 49 | options.files = [{ 50 | prefix: options.prefix, 51 | suffix: options.suffix 52 | }]; 53 | } 54 | 55 | var load = function (file) { 56 | if (!file || (!angular.isString(file.prefix) || !angular.isString(file.suffix))) { 57 | throw new Error('Couldn\'t load static file, no prefix or suffix specified!'); 58 | } 59 | 60 | return $http(angular.extend({ 61 | url: [ 62 | file.prefix, 63 | options.key, 64 | file.suffix 65 | ].join(''), 66 | method: 'GET', 67 | params: '' 68 | }, options.$http)) 69 | .then(function(result) { 70 | return result.data; 71 | }, function () { 72 | return $q.reject(options.key); 73 | }); 74 | }; 75 | 76 | var deferred = $q.defer(), 77 | promises = [], 78 | length = options.files.length; 79 | 80 | for (var i = 0; i < length; i++) { 81 | promises.push(load({ 82 | prefix: options.files[i].prefix, 83 | key: options.key, 84 | suffix: options.files[i].suffix 85 | })); 86 | } 87 | 88 | $q.all(promises) 89 | .then(function (data) { 90 | var length = data.length, 91 | mergedData = {}; 92 | 93 | for (var i = 0; i < length; i++) { 94 | for (var key in data[i]) { 95 | mergedData[key] = data[i][key]; 96 | } 97 | } 98 | 99 | deferred.resolve(mergedData); 100 | }, function (data) { 101 | deferred.reject(data); 102 | }); 103 | 104 | return deferred.promise; 105 | }; 106 | } 107 | $translateStaticFilesLoader.$inject = ['$q', '$http']; 108 | 109 | $translateStaticFilesLoader.displayName = '$translateStaticFilesLoader'; 110 | return 'pascalprecht.translate'; 111 | 112 | })); 113 | -------------------------------------------------------------------------------- /include/LiamsKey.html: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | Public Key Liam 11 | 12 | 13 | 14 |
-----BEGIN PGP PUBLIC KEY BLOCK-----
15 | Version: GnuPG v2
16 | 
17 | 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
63 | e4F2F9GctJbCG/cC4JM=
64 | =UO7r
65 | -----END PGP PUBLIC KEY BLOCK-----
66 | 67 | 68 | -------------------------------------------------------------------------------- /include/NinasKey.html: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | Public Key Nina 11 | 12 | 13 | 14 |

15 | blobfisch@outlook.de
16 | 
17 | -----BEGIN PGP PUBLIC KEY BLOCK-----
18 | Version: GnuPG v2.0.22 (MingW32)
19 | 
20 | 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
66 | wgFf4+wonWuItKE=
67 | =xByR
68 | -----END PGP PUBLIC KEY BLOCK-----

69 | 70 | 71 | -------------------------------------------------------------------------------- /include/descriptions-de/using_it_right.html: -------------------------------------------------------------------------------- 1 |

Nutze es richtig

2 |

Alle nutzen GnuPG ein wenig anders, aber es ist wichtig, ein paar wesentliche Regeln zu befolgen, 3 | um deine E-Mails zu sichern. Wenn du sie nicht befolgst, gefährdest du die Privatheit der Menschen, 4 | mit denen du kommunizierst, und deine eigene, und du beschädigst das Web of Trust.

5 | 6 |

Wann soll ich verschlüsseln?

7 |

Je öfter du deine Nachrichten verschlüsselst, desto besser. Wenn du E-Mails nur hin und wieder verschlüsselt, 8 | könnte jede verschlüsselte Nachricht die Aufmerksamkeit der Überwachungssysteme wecken. Wenn alle oder die 9 | meisten deiner E-Mails verschlüsselt sind, wissen die Überwacher nicht, wo sie anfangen sollen.

10 | 11 |

Das heißt nicht, dass es sinnlos ist, nur einige Nachrichten zu verschlüsseln -- es ist ein guter Start und macht Massenüberwachung schwieriger.

12 | 13 | 14 |

Nimm dich vor ungültigen Schlüsseln in acht!

15 |

GnuPG macht E-Mails sicherer, aber es ist immer noch wichtig, nach ungültigen Schlüsseln Ausschau 16 | zu halten, die in die falschen Hände gefallen sein könnten. E-Mails, die mit ungültigen Schlüsseln 17 | verschlüsselt worden sind, könnten von Überwachungsprogrammen gelesen werden.

18 |

Gehe in deinem E-Mail-Programm zurück zur zweiten E-Mail, die dir Edward gesendet hat. Weil sie 19 | mit deinem Schlüssel verschlüsselt wurde, gibt es oben eine Leiste, die sagt, dass die E-Mail verschlüsselt ist.

20 | 21 |

Wenn Du GnuPG benutzt, gewöhne es dir an, dass du auf diese Leiste schaust. Enigmail wird dich 22 | dort warnen, wenn Du eine E-Mail erhältst, die mit einem nicht vertrauenswürdigen Schlüssel verschlüsselt worden sind.

23 | 24 |

Speichere dein Widerrufszertifikat an einem sicheren Ort

25 |

Erinnerst du dich daran, als du deine Schlüssel erzeugt hast und das Widerrufszertifikat gespeichert 26 | hast, das GnuPG erzeugt hat? Nun ist es an der Zeit, das Zertifikat an den sichersten Ort zu kopieren, 27 | den du hast -- ideal ist ein Flashmedium oder eine Festplatte, die du an einem sicheren Ort in deinem Haus aufbewahrst.

28 |

Sollte dein privater Schlüssel jemals gestohlen werden oder verloren gehen, brauchst du dieses Zertifikat, 29 | um anderen mitzuteilen, dass du dieses Schlüsselpaar nicht mehr benutzt.

30 | 31 |

Reagiere schnell, wenn jemand deinen privaten Schlüssel bekommt

32 | 33 |

Wenn du deinen privaten Schlüssel verlierst oder ihn jemand anders erhält (z.B. wenn jemand deinen 34 | Computer stiehlt oder sich unberechtigt Zugang verschafft), ist es wichtig, ihn sofort zurückzuziehen, 35 | bevor ihn jemand benutzt, um deine verschlüsselten E-Mails zu lesen. Wie dies geht, wird in dieser 36 | Anleitung nicht beschrieben, du kannst dies aber im Handbuch von GnuPG 37 | nachlesen. Wenn du mit dem Widerruf fertig bist, schicke eine E-Mail an alle, mit denen du normalerweise deinen Schlüssel benutzt, um sie zu informieren.

38 | 39 |

Mache deinen öffentlichen Schlüssel zu einem Teil deiner Online-Identität

40 |

Füge als erstes deinen Schlüssel-Fingerabdruck zu deiner E-Mail-Signatur hinzu. Dann schreibe an mindestens fünf deiner 41 | Freunde eine E-Mail, um ihnen mitzuteilen, dass du gerade GnuPG eingerichtet hast, und um den Fingerabdruck deines öffentlichen 42 | Schlüssels bekanntzugeben. Verlinke auf diese Anleitung und bitte sie, deinem Beispiel zu folgen. Vergiss nicht, dass es eine 43 | tolle Infografik gibt, die du weitergeben kannst.

44 | 45 |

Schreibe den Fingerabdruck deines öffentlichen Schlüssels überall hin, wo jemand deine E-Mail-Adresse sieht: deine 46 | Profile in sozialen Netzwerken, Blog, Webseiten oder Visitenkarten. Wir müssen unsere Kultur so verändern, dass wir 47 | den Eindruck haben, dass etwas fehlt, wenn wir eine E-Mail-Adresse ohne einen Schlüssel-Fingerabdruck sehen.

48 | 49 | -------------------------------------------------------------------------------- /include/descriptions-de/web_of_trust.html: -------------------------------------------------------------------------------- 1 |

Verstehe das Web of Trust

2 |

E-Mail-Verschlüsselung ist zwar eine leistungsfähige Technologie, sie hat aber eine Schwäche: 3 | Sie benötigt eine Methode zur Überprüfung, ob ein öffentlicher Schlüssel tatsächlich der angegebenen 4 | Person gehört. Ansonsten gäbe es keine Möglichkeit, eine Angreiferin davon abzuhalten, Schlüssel mit 5 | dem Namen deines Freundes zu erstellen und sich als dein Freund auszugeben. Aus diesem Grund haben die 6 | Programmierer freier Software, die E-Mail-Verschlüsselung erfunden haben, Signaturen und das Web of Trust erfunden.

7 | 8 |

Wenn du den Schlüssel von jemandem signierst, dann sagst du öffentlich, dass du glaubst, dass der 9 | Schlüssel tatsächlich dieser Person gehört und nicht einem Betrüger. Leute, die deinen öffentlichen 10 | Schlüssel benutzen, können sehen, wie viele Signaturen er erhalten hat. Wenn du GnuPG einige Jahre 11 | lang verwendet hast, kannst du hunderte Signaturen haben. Das Web of Trust ist eine Konstellation 12 | aller GnuPG-Nutzer, die durch Signaturenketten zu einem riesigen Netz verbunden sind. Je mehr 13 | Signaturen ein Schlüssel hat und je mehr Signaturen die Schlüssel derjenigen, die unterschrieben 14 | haben, erhalten haben, desto vertrauenswürdiger ist dieser Schlüssel.

15 | 16 |

Öffentliche Schlüssel werden normalerweise anhand ihres Fingerabdrucks identifiziert, 17 | einer Zeichenkette wie F357AA1A5B1FA42CFD9FE52A9FF2194CC09A61E8 (für Edwards Schlüssel). 18 | Sehen kannst du den Fingerabdruck deines öffentlichen Schlüssels – und anderer öffentlicher 19 | Schlüssel, die du gespeichert hast, indem du zu Enigmail → Schlüssel verwalten im Menü 20 | deines E-Mail-Programms gehst und dann mit der rechten Maustaste auf den Schlüssel klickst und 21 | die Schlüsseleigenschaften auswählst. Es ist sinnvoll, deinen Fingerabdruck immer weiterzugeben, 22 | wenn du anderen deine E-Mail-Adresse mitteilst, so dass diese Menschen kontrollieren können, 23 | ob sie deinen richtigen Schlüssel von einem Schlüsselserver herunterladen.

24 | 25 |

Du wirst sehen, dass man sich auch über die Schlüssel-ID auf öffentliche Schlüssel bezieht, 26 | dabei handelt es sich einfach um die letzten 8 Zeichen des Fingerabdrucks, z.B. C09A61E8 für Edward. 27 | Die Schlüssel-ID ist direkt im Fenster Schlüssel verwalten sichtbar. Diese Schlüssel-ID ist wie 28 | der Vorname einer Person (es ist eine nützliche Abkürzung, aber ist vielleicht nicht eindeutig), 29 | während der Fingerabdruck tatsächlich den Schlüssel eindeutig und ohne Möglichkeit der Verwechslung 30 | identifiziert. Wenn du nur die Schlüssel-ID hast, kannst du den Schlüssel (und seinen Fingerabdruck) 31 | immer noch nachschlagen, wie du es in Schritt 3 getan hast, aber wenn mehrere Möglichkeiten auftauchen, 32 | brauchst du den Fingerabdruck der Person, mit der du kommunizieren willst, um zu klären, 33 | welchen Schlüssel du benutzen sollst.

34 | 35 |

Signiere einen Schlüssel

36 |

Gehe in deinem E-Mail-Programm zu Enigmail → Schlüssel verwalten.

37 |

Klicke mit der rechten Maustaste auf Edwards öffentlichen Schlüssel und wähle "Unterschreiben" aus dem Kontextmenü aus.

38 |

Im Pop-up-Fenster wähle "Keine Antwort" und klicke auf OK.

39 |

Zurück in Enigmail-Schlüssel verwalten wähle Schlüssel-Server → Schlüssel hochladen und klicke auf OK.

40 |

Du hast gerade gesagt, dass du darauf vertraust, dass Edwards Schlüssel tatsächlich Edward gehört. 41 | Dies bedeutet wenig, da Edward keine echte Person ist, es ist aber gute Praxis.

42 | 43 | 44 |

Wichtig: Überprüfe die Identität der Leute, deren Schlüssel du signierst.

45 |

Bevor du einen Schlüssel einer realen Person signierst, überprüfe stets, ob der Schlüssel ihr 46 | gehört und ob sie ist, wer sie behauptet zu sein. Frage sie nach ihrem Ausweis (außer du vertraust ihr sehr stark) 47 | und dem Fingerabdruck ihres öffentlichen Schlüssels -- nicht nur nach der kurzen Schlüssel-ID, die 48 | zusätzlich auch zu einem anderen Schlüssel gehören könnte. Antworte ehrlich auf die Frage 49 | "Haben Sie überprüft, ob dieser Schlüssel tatsächlich dem oben genannten Absender gehört?" in Enigmail..

50 | 51 | -------------------------------------------------------------------------------- /js/angular-translate-storage-local.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * angular-translate - v2.8.1 - 2015-10-01 3 | * 4 | * Copyright (c) 2015 The angular-translate team, Pascal Precht; Licensed MIT 5 | */ 6 | (function (root, factory) { 7 | if (typeof define === 'function' && define.amd) { 8 | // AMD. Register as an anonymous module unless amdModuleId is set 9 | define([], function () { 10 | return (factory()); 11 | }); 12 | } else if (typeof exports === 'object') { 13 | // Node. Does not work with strict CommonJS, but 14 | // only CommonJS-like environments that support module.exports, 15 | // like Node. 16 | module.exports = factory(); 17 | } else { 18 | factory(); 19 | } 20 | }(this, function () { 21 | 22 | angular.module('pascalprecht.translate') 23 | 24 | /** 25 | * @ngdoc object 26 | * @name pascalprecht.translate.$translateLocalStorage 27 | * @requires $window 28 | * @requires $translateCookieStorage 29 | * 30 | * @description 31 | * Abstraction layer for localStorage. This service is used when telling angular-translate 32 | * to use localStorage as storage. 33 | * 34 | */ 35 | .factory('$translateLocalStorage', $translateLocalStorageFactory); 36 | 37 | function $translateLocalStorageFactory($window, $translateCookieStorage) { 38 | 39 | 'use strict'; 40 | 41 | // Setup adapter 42 | var localStorageAdapter = (function(){ 43 | var langKey; 44 | return { 45 | /** 46 | * @ngdoc function 47 | * @name pascalprecht.translate.$translateLocalStorage#get 48 | * @methodOf pascalprecht.translate.$translateLocalStorage 49 | * 50 | * @description 51 | * Returns an item from localStorage by given name. 52 | * 53 | * @param {string} name Item name 54 | * @return {string} Value of item name 55 | */ 56 | get: function (name) { 57 | if(!langKey) { 58 | langKey = $window.localStorage.getItem(name); 59 | } 60 | 61 | return langKey; 62 | }, 63 | /** 64 | * @ngdoc function 65 | * @name pascalprecht.translate.$translateLocalStorage#set 66 | * @methodOf pascalprecht.translate.$translateLocalStorage 67 | * 68 | * @description 69 | * Sets an item in localStorage by given name. 70 | * 71 | * @deprecated use #put 72 | * 73 | * @param {string} name Item name 74 | * @param {string} value Item value 75 | */ 76 | set: function (name, value) { 77 | langKey=value; 78 | $window.localStorage.setItem(name, value); 79 | }, 80 | /** 81 | * @ngdoc function 82 | * @name pascalprecht.translate.$translateLocalStorage#put 83 | * @methodOf pascalprecht.translate.$translateLocalStorage 84 | * 85 | * @description 86 | * Sets an item in localStorage by given name. 87 | * 88 | * @param {string} name Item name 89 | * @param {string} value Item value 90 | */ 91 | put: function (name, value) { 92 | langKey=value; 93 | $window.localStorage.setItem(name, value); 94 | } 95 | }; 96 | }()); 97 | 98 | var hasLocalStorageSupport = 'localStorage' in $window; 99 | if (hasLocalStorageSupport) { 100 | var testKey = 'pascalprecht.translate.storageTest'; 101 | try { 102 | // this check have to be wrapped within a try/catch because on 103 | // a SecurityError: Dom Exception 18 on iOS 104 | if ($window.localStorage !== null) { 105 | $window.localStorage.setItem(testKey, 'foo'); 106 | $window.localStorage.removeItem(testKey); 107 | hasLocalStorageSupport = true; 108 | } else { 109 | hasLocalStorageSupport = false; 110 | } 111 | } catch (e){ 112 | hasLocalStorageSupport = false; 113 | } 114 | } 115 | var $translateLocalStorage = hasLocalStorageSupport ? localStorageAdapter : $translateCookieStorage; 116 | return $translateLocalStorage; 117 | } 118 | $translateLocalStorageFactory.$inject = ['$window', '$translateCookieStorage']; 119 | 120 | $translateLocalStorageFactory.displayName = '$translateLocalStorageFactory'; 121 | return 'pascalprecht.translate'; 122 | 123 | })); 124 | -------------------------------------------------------------------------------- /include/descriptions-en/test_email.html: -------------------------------------------------------------------------------- 1 |

Try it out!

2 |

Now you'll try a test correspondence with a computer program named Edward, which knows 3 | how to use encryption. Except where noted, these are the same steps you would follow when corresponding with a real, live person.

4 | 5 |

Send Edward your public key

6 |

This is a special step that you won't have to do when corresponding with real people. 7 | In your email program's menu, go to Enigmail → Key Management. You should see your key 8 | in the list that pops up. Right click on your key and select Send Public Keys by Email. 9 | This will create a new draft message, as if you had just hit the Write button.

10 | 11 |

Address the message to edward-en@fsf.org. Put at least one word (whatever you want) in the subject and body of the email. do not send yet.

12 | 13 |

There should be an icon of a yellow key in the bottom right of the composition window. 14 | This means that encryption is on, however, we want this first special message to Edward to be unencrypted. 15 | Click the key icon once to turn encryption off. The key should become grey, with a blue dot on it 16 | (to alert you that the setting has been changed from the default). Once encryption is off, hit Send.

17 | 18 |

It may take two or three minutes for Edward to respond. In the meantime, you might want to 19 | skip ahead and check out the sectioon "Use it Well" section of this guide. Once he's responded, 20 | head to the next step. From here on, you'll be doing just the same thing as when corresponding with a real person.

21 | 22 |

When you open Edward's reply, Enigmail may prompt you for your password before using your private key to decrypt it.

23 | 24 |

Send a test encrypted email

25 | 26 |

Write a new email in your email program, addressed to edward-en@fsf.org. Make the subject 27 | "Encryption test" or something similar and write something in the body.

28 |

The key in the bottom right of the window should be yellow, meaning encryption is on. This will be your default from now on.

29 |

Next to the key, you'll notice an icon of a pencil. Clicking this tells Enigmail to add a 30 | special, unique signature to your message, generated using your private key. This is a separate 31 | feature from encryption, and you do not have to use it for this guide.

32 |

Click Send. Enigmail will pop up a window that says "Recipients not valid, not trusted or not found."

33 | 34 |

To encrypt an email to Edward, you need his public key, so now you'll have Enigmail download it from a keyserver. 35 | Click Download Missing Keys and use the default in the pop-up that asks you to choose a keyserver. 36 | Once it finds keys, check the first one (Key ID starting with C), then select ok. Select ok in the next pop-up.

37 | 38 |

Now you are back at the "Recipients not valid, not trusted or not found" screen. Check the box in front of Edward's key and click Send.

39 | 40 |

Since you encrypted this email with Edward's public key, Edward's private key is required to decrypt it. 41 | Edward is the only one with his private key, so no one except him — not even you — can decrypt it.

42 | 43 |

Enigmail can not find Edward's key
44 | Close the pop-ups that have appeared since you clicked Send. Make sure you are connected to the Internet and try again. 45 | If that does not work, repeat the process, choosing a different keyserver when it asks you to pick one.

46 | 47 |

Important: Security tips

48 |

Even if you encrypted your email, the subject line is not encrypted, so do not put private information there. 49 | The sending and receiving addresses aren't encrypted either, so they could be read by a surveillance system. 50 | When you send attachments, Enigmail will give you an option of whether you want to encrypt them.

51 | 52 | 53 |

Receive a response

54 |

When Edward receives your email, he will use his private key to decrypt it, then use your public key 55 | (which you sent him in your email to encrypt his reply to you.

56 |

It may take two or three minutes for Edward to respond. In the meantime, you might want to skip ahead 57 | and check out the "Use it Well" section of this guide.

58 |

When you receive Edward's email and open it, Enigmail will automatically detect that it is encrypted 59 | with your public key, and then it will use your private key to decrypt it.

60 |

Notice the bar that Enigmail shows you above the message, with information about the status of Edward's key.

61 | 62 | -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0px; 3 | padding: 0px; 4 | font-family: "Helvetica", Arial, sans-serif; 5 | color: #000000; 6 | box-sizing: border-box; 7 | } 8 | body { 9 | margin: 0 auto; 10 | overflow-y: scroll; 11 | height: 100%; 12 | } 13 | html { 14 | background: #ffffff; 15 | height: 100%; 16 | } 17 | div#title { 18 | border-bottom: 1px solid #e5e5e5; 19 | background-color: #f1f1f1; 20 | padding: 15px 0px; 21 | margin-bottom: 20px; 22 | } 23 | div#title h1 { 24 | font-size: 30px; 25 | font-weight: normal; 26 | text-align: left; 27 | margin-right: 15px; 28 | display: inline-block; 29 | cursor: pointer; 30 | margin-top: 0; 31 | margin-bottom: 0; 32 | } 33 | div#title span { 34 | font-size: 16px; 35 | color: #444; 36 | display: inline-block; 37 | } 38 | #language { 39 | padding: 22px; 40 | right: 0px; 41 | top: 0px; 42 | position: absolute; 43 | } 44 | #language input { 45 | height: 20px; 46 | margin-left: 5px; 47 | } 48 | #language input:hover { 49 | opacity: 0.5; 50 | } 51 | .content-box { 52 | width: 900px; 53 | margin: 0 auto; 54 | padding: 0px 10px; 55 | } 56 | @media screen and (max-width: 900px) { 57 | .content-box { 58 | width: 100% !important; 59 | } 60 | #contentwrapper { 61 | padding-bottom: 100px !important; 62 | } 63 | } 64 | a { 65 | text-decoration: none; 66 | color: #2222ff; 67 | border-radius: 0px; 68 | cursor: pointer; 69 | } 70 | a:hover { 71 | text-decoration: underline; 72 | } 73 | img, a img { 74 | border: none; 75 | } 76 | *:focus { 77 | outline: none; 78 | } 79 | *::-moz-focus-inner { 80 | border: 0; 81 | } 82 | a.button { 83 | text-decoration: none; 84 | text-align: center; 85 | padding: 12px; 86 | margin-top: 15px; 87 | color: white!important; 88 | font-size: 18px; 89 | background-color: #4285f4; 90 | transition: all 0.1s ease-in-out; 91 | } 92 | a.button:hover { 93 | background-color: #2163D0; 94 | } 95 | #footer { 96 | margin-top: 15px; 97 | font-size: 14px; 98 | padding: 15px 0px; 99 | border-top: 1px solid #e5e5e5; 100 | background-color: #f1f1f1; 101 | position: absolute; 102 | bottom: 0; 103 | right: 0; 104 | left: 0; 105 | } 106 | .mainpage #section1 { 107 | font-size: 20px; 108 | margin-bottom: 10px; 109 | margin-top: 40px; 110 | } 111 | #main_img { 112 | margin: 0px auto; 113 | width: 600px; 114 | display: block; 115 | } 116 | @media screen and (max-width: 780px) { 117 | #main_img { 118 | width: 100%; 119 | } 120 | } 121 | #contentwrapper { 122 | min-height: 100%; 123 | position: relative; 124 | padding-bottom: 67px; 125 | } 126 | .text_block { 127 | margin-top: 20px; 128 | padding: 10px; 129 | border: 1px solid #e5e5e5; 130 | background-color: #f1f1f1; 131 | } 132 | .question > h2 { 133 | font-weight: normal; 134 | margin-bottom: 20px; 135 | } 136 | .question > div { 137 | transition: all 0.1s ease-in-out; 138 | background-color: #f1f1f1; 139 | cursor: pointer; 140 | padding: 5px; 141 | } 142 | .question > div:hover { 143 | background-color: #fcfcfc; 144 | } 145 | .question > div > img { 146 | width: 50px; 147 | margin-right: 20px; 148 | vertical-align: middle; 149 | } 150 | #input_range { 151 | width: 300px; 152 | max-width: 100%; 153 | margin-top: 30px; 154 | } 155 | #last_modified { 156 | font-size: 14px; 157 | } 158 | .description_block > h2 { 159 | font-weight: normal; 160 | margin-bottom: 15px; 161 | margin-top: 5px; 162 | } 163 | .description_block p.notice { 164 | padding: 10px; 165 | margin-top: 10px; 166 | margin-left: 10px; 167 | border-left: 5px solid #ccc; 168 | } 169 | .description_block p.important { 170 | padding: 10px; 171 | margin: 10px; 172 | margin-right: 0px; 173 | border-left: 5px solid #CE0A0A; 174 | } 175 | .description_block img.inline { 176 | display: inline-block; 177 | vertical-align: middle; 178 | } 179 | .description_block ul { 180 | margin-top: 10px; 181 | margin-bottom: 10px; 182 | } 183 | .description_block li { 184 | margin-left: 20px; 185 | margin-bottom: 5px; 186 | } 187 | .progress-bar { 188 | background-color: #4285f4; 189 | } 190 | .progress-bar > b{ 191 | padding-left: 5px; 192 | } 193 | .animate-container.ng-enter, .animate-container.ng-leave { 194 | -webkit-transition: 0.5s ease all; 195 | -moz-transition: 0.5s ease all; 196 | -ms-transition: 0.5s ease all; 197 | -o-transition: 0.5s ease all; 198 | transition: 0.5s ease all; 199 | position: relative; 200 | } 201 | .animate-container.ng-enter { 202 | opacity: 0; 203 | top: 999px; 204 | } 205 | .animate-container.ng-enter.ng-enter-active { 206 | opacity:1; 207 | top: 0px; 208 | } 209 | .animate-container.ng-leave { 210 | opacity:1; 211 | top: 0px; 212 | } 213 | .animate-container.ng-leave.ng-leave-active { 214 | opacity:0; 215 | top: 999px; 216 | } 217 | -------------------------------------------------------------------------------- /js/site.js: -------------------------------------------------------------------------------- 1 | var app = angular.module('HowToApp', ["ui.bootstrap", 'ngAnimate', 'ngCookies', 'pascalprecht.translate']); 2 | 3 | app.config(['$translateProvider', function ($translateProvider) { 4 | var supported_languages = ['en', 'de']; 5 | $translateProvider.registerAvailableLanguageKeys(supported_languages, { 6 | 'en_*': 'en', 7 | 'de_*': 'de' 8 | }) 9 | $translateProvider.useStaticFilesLoader({ 10 | prefix: 'locale/', 11 | suffix: '.json' 12 | }); 13 | $translateProvider.determinePreferredLanguage(); 14 | // set preferred language to english in case an unsupported or invalid 15 | // language was determined. 16 | if (supported_languages.indexOf($translateProvider.preferredLanguage()) < 0) { 17 | $translateProvider.preferredLanguage("en"); 18 | } 19 | $translateProvider.fallbackLanguage("en"); 20 | $translateProvider.useLocalStorage(); 21 | $translateProvider.useSanitizeValueStrategy('sanitizeParameters'); 22 | }]); 23 | 24 | app.controller('MainController', ['$translate', '$scope', '$location', function ($translate, $scope, $location) { 25 | $scope.changeLanguage = function (langKey) { 26 | $translate.use(langKey); 27 | }; 28 | $scope.getPartial = function (path) { 29 | return 'include/descriptions-'+$translate.use()+'/'+path+'.html'; 30 | } 31 | $scope.setProgress = function(percent, speed) { 32 | if(!speed) { 33 | speed = 1; 34 | } 35 | $scope.progress = percent; 36 | } 37 | 38 | $scope.showQuestion = function(next) { 39 | if(next == "client") { 40 | $scope.setProgress(25); 41 | } else if(next == "browser") { 42 | $scope.setProgress(50); 43 | } else if(next == "keys") { 44 | $scope.setProgress(75); 45 | } else if(next == "level") { 46 | $scope.setProgress(95); 47 | } else { 48 | $scope.setProgress(0); 49 | next = "os"; 50 | } 51 | $scope.question = next; 52 | $scope.content_include = "questions"; 53 | $location.path("/" + next); 54 | } 55 | 56 | $scope.selectOS = function(os) { 57 | $scope.os = os; 58 | if (os == "android") { 59 | $scope.showQuestion("keys"); 60 | } else{ 61 | $scope.showQuestion("client"); 62 | } 63 | } 64 | 65 | $scope.selectKeys = function(keys) { 66 | $scope.keys = keys; 67 | $scope.showQuestion("level"); 68 | } 69 | 70 | $scope.selectClient = function(client) { 71 | $scope.client = client; 72 | if (client == "browser") { 73 | $scope.showQuestion("browser"); 74 | } else { 75 | $scope.showQuestion("keys"); 76 | } 77 | } 78 | 79 | $scope.selectBrowser = function(browser) { 80 | $scope.browser = browser; 81 | $scope.showQuestion("keys"); 82 | } 83 | 84 | $scope.submitQuestions = function(difficulty) { 85 | $scope.difficulty = difficulty; 86 | $scope.setProgress (100, 0.5); 87 | $scope.content_include = "snippets"; 88 | $location.path("/result"); 89 | } 90 | 91 | $scope.showStartPage = function() { 92 | $location.path(""); 93 | $scope.content_include = "startpage"; 94 | $scope.os = ""; 95 | $scope.client = ""; 96 | $scope.browser = ""; 97 | $scope.keys = ""; 98 | $scope.difficulty = 2; 99 | $scope.progress = 0; 100 | } 101 | 102 | $scope.showQuestions = function() { 103 | $scope.showQuestion("os"); 104 | } 105 | $scope.showImpressum = function() { 106 | $scope.content_include = "impressum"; 107 | } 108 | $scope.showSources = function() { 109 | $scope.content_include = "sources"; 110 | } 111 | $scope.getLanguageImageUrl = function(lang) { 112 | return 'image/'+lang+'_flag.png' 113 | } 114 | $scope.getLocalizedImageUrl = function(prefix) { 115 | return 'image/'+prefix+$translate.use()+'.png' 116 | } 117 | 118 | $scope.handlePath = function() { 119 | var question = $location.path().substr(1); 120 | var valid = false; 121 | switch (question) { 122 | case "os": 123 | valid = true; 124 | break; 125 | case "client": 126 | valid = ($scope.os); 127 | break; 128 | case "browser": 129 | valid = ($scope.os && $scope.client == "browser"); 130 | break; 131 | case "keys": 132 | valid = ($scope.os && ($scope.os == "android" || $scope.client)); 133 | break; 134 | case "level": 135 | valid = ($scope.os && ($scope.os == "android" || $scope.client) && $scope.keys); 136 | break; 137 | case "result": 138 | if ($scope.os && ($scope.os == "android" || $scope.client) && $scope.keys) { 139 | $scope.content_include = "snippets"; 140 | return; 141 | } 142 | } 143 | 144 | if (!valid) { 145 | // no matching path, start from the beginning 146 | $scope.showStartPage(); 147 | } else { 148 | $scope.showQuestion(question); 149 | } 150 | } 151 | 152 | $scope.$on('$locationChangeSuccess', function() { 153 | $scope.handlePath(); 154 | }); 155 | 156 | $scope.languages = ["en", "de"]; 157 | $scope.textblock_classes = "description_block text_block"; 158 | $scope.handlePath(); 159 | }]); 160 | -------------------------------------------------------------------------------- /include/impressum.html: -------------------------------------------------------------------------------- 1 |



2 |

Impressum


3 | 4 |

VEREINSADRESSE
5 | Open Knowledge Foundation Deutschland e.V.
6 | Singerstr. 109
7 | 10179 Berlin
8 | Deutschland

9 |

Vereinsregister Nr: VR 30468 B
10 | Steuernummer: 27/674/52428
11 | VAT: DE278022128

12 |

E-Mail: info@okfn.de
13 | Telefon: +030-57703666-2

14 |

 

15 |

DATENSCHUTZERKLÄRUNG

16 |

Die Open Knowledge Foundation Deutschland e.V., Singerstr. 109, 10179 Berlin Deutschland (nachfolgend als „Open 17 | Knowledge Foundation“ oder „wir“ bezeichnet) betreibt die im Internet unter https://howtopgp.jugendhackt.de und 18 | den jeweils dazu gehörenden Unterverzeichnissen abrufbare Internetseite (nachfolgend die „Website“).

19 |

Die Open Knowledge Foundation möchte Ihnen mit dieser Datenschutzerklärung erläutern, welche Daten in welcher 20 | Form verarbeitet werden, wenn Sie unsere Website besuchen. Hiermit kommen wir zugleich unserer 21 | Informationspflicht gem. Art. 13 Datenschutz-Grundverordnung (DS-GVO) Ihnen gegenüber nach.

22 |

I. Verantwortlicher und Kontaktmöglichkeiten des Datenschutzbeauftragten
23 | Die datenschutzrechtlich Verantwortliche für die auf unserer Website stattfindenden Datenverarbeitungen ist die 24 |

25 |

Open Knowledge Foundation Deutschland e.V.
26 | Singerstr. 109
27 | 10179 Berlin
28 | Deutschland
29 | E-Mail: info@okfn.de

30 |

Telefon: +49 30 57703666 0
31 | Fax: +49 30 57703666 9

32 |

Unser Datenschutzbeauftragter ist erreichbar unter:
33 | Open Knowledge Foundation Deutschland e.V.
34 | – Datenschutzbeauftragter –
35 | Singerstr. 109
36 | 10179 Berlin
37 | Deutschland
38 | E-Mail: datenschutz@okfn.de

39 |

II. Personenbezogene Daten, Zwecke und Rechtsgrundlage der Datenverarbeitung

40 |

1. Personenbezogene Daten

41 |

Nach der DS-GVO sind personenbezogene Daten „alle Informationen, die sich auf eine identifizierte oder 42 | identifizierbare natürliche Person (im Folgenden „betroffene Person“) beziehen; als identifizierbar wird eine 43 | natürliche Person angesehen, die direkt oder indirekt, insbesondere mittels Zuordnung zu einer Kennung wie einem 44 | Namen, zu einer Kennnummer, zu Standortdaten, zu einer Online-Kennung oder zu einem oder mehreren besonderen 45 | Merkmalen identifiziert werden kann, die Ausdruck der physischen, physiologischen, genetischen, psychischen, 46 | wirtschaftlichen, kulturellen oder sozialen Identität dieser natürlichen Person sind.

47 |

2. Allgemeine Nutzung der Website

48 |

Wir erheben und speichern im Zuge Ihres Besuchs auf unserer Website keine personenbezogenen Daten.

49 |

Unbeschadet der vorstehenden grundsätzlichen Gegebenheiten registriert aber der Webserver unseres Hosters 50 | automatisch Zugriffe auf die Websites und dabei insbesondere Ihre IP-Adresse. Ihre IP-Adresse wird jedoch nicht 51 | gespeichert.

52 |

Zudem legt unser Hoster zur Erhaltung der Systemsicherheit sog. Logfiles an. Diese Logfiles enthalten die 53 | folgenden Informationen:

54 |
    55 |
  • Datum des Zugriffs
  • 56 |
  • die URL
  • 57 |
  • Inhalte auf die zugegriffen wurde sowie 58 |
  • 59 |
  • die übertragenen Informationen
  • 60 |
61 |

Diese Informationen bleiben für uns anonym. Ein Rückschluss auf eine Person ist somit nicht möglich.

62 |

Nehmen Sie unter der auf unserer Website angegebenen E-Mail-Adresse Kontakt zu uns auf, teilen Sie uns zumindest 63 | Ihre E-Mail-Adresse mit, sowie gegebenenfalls weitere Informationen, die Sie in Ihrer E-Mail preisgeben. Damit 64 | wir Ihr Anliegen bearbeiten können, müssen wir diese Daten verarbeiten.

65 |

3. Zwecke und Rechtsgrundlage der Datenverarbeitung

66 |

Die Verarbeitung Ihrer IP-Adresse während des Verbindungsaufbaus erfolgt, damit wir Ihnen unsere Website zur 67 | Verfügung stellen können. Sie basiert auf Art. 6 Abs. 1 lit. f) DS-GVO. Unser berechtigtes Interesse besteht im 68 | genannten Zweck.

69 |

Die Verarbeitung im Rahmen einer Kontaktaufnahme erfolgt, damit wir Ihre Anfrage bearbeiten und beantworten 70 | könne. Die Rechtsgrundlage ist Art. 6 Abs. 1 lit. f) DS-GVO. Unser berechtigtes Interesse liegt im soeben 71 | genannten Zweck.

72 |

III. Empfänger der Daten
73 | Innerhalb unseres Unternehmens haben jeweils die Abteilungen auf Ihre Daten Zugriff, die für die Bearbeitung der 74 | Anliegen zuständig sind. Zudem setzen wir externe Dienstleister ein, soweit wir Leistungen nicht oder nicht 75 | sinnvoll selbst vornehmen können. Diese externen Dienstleister sind dabei vor allem Anbieter von 76 | IT-Dienstleistungen und Telekommunikationsdienste.

77 |

Eine Übermittlung in Drittstaaten findet grundsätzlich nicht und nur dann statt, soweit sie zur Ausführung Ihrer 78 | Aufträge erforderlich ist, gesetzlich vorgeschrieben ist oder Sie uns Ihre Einwilligung hierzu erteilt 79 | haben.

80 |

IV. Speicherdauer
81 | Unsere Logfiles werden 14 Tage gespeichert. Ihre E-Mails und Kontaktaufnahmen speichern wir so lange, wie es zur 82 | Bearbeitung Ihrer Anfrage erforderlich ist.

83 |

V. Betroffenenrechte
84 | Die Datenschutz-Grundverordnung garantiert Ihnen gewisse Rechte, die Sie uns gegenüber – soweit die gesetzlichen 85 | Voraussetzungen vorliegen – geltend machen können.

86 |
    87 |
  • Art. 15 DS-GVO – Auskunftsrecht der betroffenen Person: Sie haben das Recht, von uns eine Bestätigung darüber zu verlangen, ob Sie betreffende personenbezogene Daten verarbeitet werden und wenn ja, welche dies sind sowie die näheren Umstände der Datenverarbeitung. 89 |
  • 90 |
  • Art. 16 DS-GVO – Recht auf Berichtigung: Sie haben das Recht, von uns unverzüglich die Berichtigung Sie betreffender unrichtiger personenbezogener Daten zu verlangen. Dabei haben Sie unter Berücksichtigung der Zwecke der Verarbeitung auch das Recht, die Vervollständigung unvollständiger personenbezogener Daten – auch mittels einer ergänzenden Erklärung – zu verlangen. 91 |
  • 92 |
  • Art. 17 DS-GVO – Recht auf Löschung: Sie haben das Recht, von uns zu verlangen, dass Sie betreffende 93 | personenbezogene Daten unverzüglich gelöscht werden. Beachten Sie hier bitte die unter Punkt II. 4 94 | beschriebene Ausnahme. 95 |
  • 96 |
  • Art. 18 DS-GVO – Recht auf Einschränkung der Verarbeitung: Sie haben das Recht, von uns die 97 | Einschränkung der Verarbeitung zu verlangen. 98 |
  • 99 |
  • Art. 20 DS-GVO – Recht auf Datenübertragbarkeit: Sie haben das Recht, im Falle der Verarbeitung 100 | aufgrund einer Einwilligung oder zur Erfüllung eines Vertrags, die Sie betreffenden personenbezogenen Daten, 101 | die Sie uns bereitgestellt haben, in einem strukturierten, gängigen und maschinenlesbaren Format zu 102 | erhalten, und diese Daten einem anderen Verantwortlichen ohne Behinderung durch uns zu übermitteln oder die 103 | Daten direkt an den anderen Verantwortlichen übermitteln zu lassen, soweit dies technisch machbar ist. 104 |
  • 105 |
  • Art. 21 DS-GVO – Widerspruchsrecht: Sie haben das Recht, aus Gründen, die sich aus ihrer besonderen 106 | Situation ergeben, jederzeit gegen die Verarbeitung Sie betreffender personenbezogener Daten, die aufgrund 107 | eines berechtigten Interesses unsererseits oder zur Wahrung einer Aufgabe im öffentlichen Interesse 108 | erforderlich ist, oder die in Ausübung öffentlicher Gewalt erfolgt, Widerspruch einzulegen. Legen Sie 109 | Widerspruch ein, werden wir Ihre personenbezogenen Daten nicht mehr verarbeiten, es sei denn, wir können 110 | zwingende schutzwürdige Gründe für die Verarbeitung nachweisen, die Ihre Interessen, Rechte und Freiheiten 111 | überwiegen, oder die Verarbeitung dient der Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen. 112 | Soweit wir Ihre personenbezogenen Daten verarbeiten, um Direktwerbung zu betreiben, haben Sie das Recht, 113 | jederzeit Widerspruch gegen die Verarbeitung einzulegen. Widersprechen Sie der Verarbeitung für Zwecke der 114 | Direktwerbung, so werden wir Ihre personenbezogenen Daten nicht mehr für diese Zwecke verarbeiten. 115 |
  • 116 |
  • Art. 77 DSGVO i. V. m. § 19 BDSG – Recht auf Beschwerde bei einer Aufsichtsbehörde: Sie haben das 117 | Recht, jederzeit Beschwerde bei einer Aufsichtsbehörde, insbesondere in dem Mitgliedstaat ihres 118 | Aufenthaltsorts, ihres Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes, einzulegen, wenn Sie der 119 | Ansicht sind, dass die Verarbeitung der sie betreffenden personenbezogenen Daten gegen geltendes Recht 120 | verstößt. 121 |
  • 122 |
123 |

VI. Pflicht zur Bereitstellung von Daten
124 | Sie haben keine vertragliche oder gesetzliche Pflicht uns personenbezogene Daten bereitzustellen. Allerdings 125 | sind wir ohne die von Ihnen mitgeteilten Daten nicht in der Lage, Ihnen unsere Services anzubieten.

126 |

VII. Bestehen von automatisierten Entscheidungsfindungen (einschließlich Profiling)
127 | Wir verwenden keine automatisierten Entscheidungsfindungen, die Ihnen gegenüber rechtliche Wirkungen entfaltet 128 | oder Sie beeinträchtigt.

129 | 130 |

Wenn Sie Anmerkungen oder Fragen haben:

131 |

Wir treffen alle erdenklichen Vorkehrungen zum Schutz und zur Sicherheit Ihrer Daten. Ihre Fragen und Kommentare 132 | zum Datenschutz sind uns willkommen, schreiben Sie einfach eine Mail an info@okfn.de. 133 |

134 |

Berlin, November 2018

135 | 136 |
137 | 138 | 139 |

CONTACT_US

140 | Nina • 141 | Liam 142 |

143 |

144 |

145 |

146 | -------------------------------------------------------------------------------- /js/angular-cookies.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license AngularJS v1.5.0 3 | * (c) 2010-2016 Google, Inc. http://angularjs.org 4 | * License: MIT 5 | */ 6 | (function(window, angular, undefined) {'use strict'; 7 | 8 | /** 9 | * @ngdoc module 10 | * @name ngCookies 11 | * @description 12 | * 13 | * # ngCookies 14 | * 15 | * The `ngCookies` module provides a convenient wrapper for reading and writing browser cookies. 16 | * 17 | * 18 | *
19 | * 20 | * See {@link ngCookies.$cookies `$cookies`} for usage. 21 | */ 22 | 23 | 24 | angular.module('ngCookies', ['ng']). 25 | /** 26 | * @ngdoc provider 27 | * @name $cookiesProvider 28 | * @description 29 | * Use `$cookiesProvider` to change the default behavior of the {@link ngCookies.$cookies $cookies} service. 30 | * */ 31 | provider('$cookies', [function $CookiesProvider() { 32 | /** 33 | * @ngdoc property 34 | * @name $cookiesProvider#defaults 35 | * @description 36 | * 37 | * Object containing default options to pass when setting cookies. 38 | * 39 | * The object may have following properties: 40 | * 41 | * - **path** - `{string}` - The cookie will be available only for this path and its 42 | * sub-paths. By default, this is the URL that appears in your `` tag. 43 | * - **domain** - `{string}` - The cookie will be available only for this domain and 44 | * its sub-domains. For security reasons the user agent will not accept the cookie 45 | * if the current domain is not a sub-domain of this domain or equal to it. 46 | * - **expires** - `{string|Date}` - String of the form "Wdy, DD Mon YYYY HH:MM:SS GMT" 47 | * or a Date object indicating the exact date/time this cookie will expire. 48 | * - **secure** - `{boolean}` - If `true`, then the cookie will only be available through a 49 | * secured connection. 50 | * 51 | * Note: By default, the address that appears in your `` tag will be used as the path. 52 | * This is important so that cookies will be visible for all routes when html5mode is enabled. 53 | * 54 | **/ 55 | var defaults = this.defaults = {}; 56 | 57 | function calcOptions(options) { 58 | return options ? angular.extend({}, defaults, options) : defaults; 59 | } 60 | 61 | /** 62 | * @ngdoc service 63 | * @name $cookies 64 | * 65 | * @description 66 | * Provides read/write access to browser's cookies. 67 | * 68 | *
69 | * Up until Angular 1.3, `$cookies` exposed properties that represented the 70 | * current browser cookie values. In version 1.4, this behavior has changed, and 71 | * `$cookies` now provides a standard api of getters, setters etc. 72 | *
73 | * 74 | * Requires the {@link ngCookies `ngCookies`} module to be installed. 75 | * 76 | * @example 77 | * 78 | * ```js 79 | * angular.module('cookiesExample', ['ngCookies']) 80 | * .controller('ExampleController', ['$cookies', function($cookies) { 81 | * // Retrieving a cookie 82 | * var favoriteCookie = $cookies.get('myFavorite'); 83 | * // Setting a cookie 84 | * $cookies.put('myFavorite', 'oatmeal'); 85 | * }]); 86 | * ``` 87 | */ 88 | this.$get = ['$$cookieReader', '$$cookieWriter', function($$cookieReader, $$cookieWriter) { 89 | return { 90 | /** 91 | * @ngdoc method 92 | * @name $cookies#get 93 | * 94 | * @description 95 | * Returns the value of given cookie key 96 | * 97 | * @param {string} key Id to use for lookup. 98 | * @returns {string} Raw cookie value. 99 | */ 100 | get: function(key) { 101 | return $$cookieReader()[key]; 102 | }, 103 | 104 | /** 105 | * @ngdoc method 106 | * @name $cookies#getObject 107 | * 108 | * @description 109 | * Returns the deserialized value of given cookie key 110 | * 111 | * @param {string} key Id to use for lookup. 112 | * @returns {Object} Deserialized cookie value. 113 | */ 114 | getObject: function(key) { 115 | var value = this.get(key); 116 | return value ? angular.fromJson(value) : value; 117 | }, 118 | 119 | /** 120 | * @ngdoc method 121 | * @name $cookies#getAll 122 | * 123 | * @description 124 | * Returns a key value object with all the cookies 125 | * 126 | * @returns {Object} All cookies 127 | */ 128 | getAll: function() { 129 | return $$cookieReader(); 130 | }, 131 | 132 | /** 133 | * @ngdoc method 134 | * @name $cookies#put 135 | * 136 | * @description 137 | * Sets a value for given cookie key 138 | * 139 | * @param {string} key Id for the `value`. 140 | * @param {string} value Raw value to be stored. 141 | * @param {Object=} options Options object. 142 | * See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults} 143 | */ 144 | put: function(key, value, options) { 145 | $$cookieWriter(key, value, calcOptions(options)); 146 | }, 147 | 148 | /** 149 | * @ngdoc method 150 | * @name $cookies#putObject 151 | * 152 | * @description 153 | * Serializes and sets a value for given cookie key 154 | * 155 | * @param {string} key Id for the `value`. 156 | * @param {Object} value Value to be stored. 157 | * @param {Object=} options Options object. 158 | * See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults} 159 | */ 160 | putObject: function(key, value, options) { 161 | this.put(key, angular.toJson(value), options); 162 | }, 163 | 164 | /** 165 | * @ngdoc method 166 | * @name $cookies#remove 167 | * 168 | * @description 169 | * Remove given cookie 170 | * 171 | * @param {string} key Id of the key-value pair to delete. 172 | * @param {Object=} options Options object. 173 | * See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults} 174 | */ 175 | remove: function(key, options) { 176 | $$cookieWriter(key, undefined, calcOptions(options)); 177 | } 178 | }; 179 | }]; 180 | }]); 181 | 182 | angular.module('ngCookies'). 183 | /** 184 | * @ngdoc service 185 | * @name $cookieStore 186 | * @deprecated 187 | * @requires $cookies 188 | * 189 | * @description 190 | * Provides a key-value (string-object) storage, that is backed by session cookies. 191 | * Objects put or retrieved from this storage are automatically serialized or 192 | * deserialized by angular's toJson/fromJson. 193 | * 194 | * Requires the {@link ngCookies `ngCookies`} module to be installed. 195 | * 196 | *
197 | * **Note:** The $cookieStore service is **deprecated**. 198 | * Please use the {@link ngCookies.$cookies `$cookies`} service instead. 199 | *
200 | * 201 | * @example 202 | * 203 | * ```js 204 | * angular.module('cookieStoreExample', ['ngCookies']) 205 | * .controller('ExampleController', ['$cookieStore', function($cookieStore) { 206 | * // Put cookie 207 | * $cookieStore.put('myFavorite','oatmeal'); 208 | * // Get cookie 209 | * var favoriteCookie = $cookieStore.get('myFavorite'); 210 | * // Removing a cookie 211 | * $cookieStore.remove('myFavorite'); 212 | * }]); 213 | * ``` 214 | */ 215 | factory('$cookieStore', ['$cookies', function($cookies) { 216 | 217 | return { 218 | /** 219 | * @ngdoc method 220 | * @name $cookieStore#get 221 | * 222 | * @description 223 | * Returns the value of given cookie key 224 | * 225 | * @param {string} key Id to use for lookup. 226 | * @returns {Object} Deserialized cookie value, undefined if the cookie does not exist. 227 | */ 228 | get: function(key) { 229 | return $cookies.getObject(key); 230 | }, 231 | 232 | /** 233 | * @ngdoc method 234 | * @name $cookieStore#put 235 | * 236 | * @description 237 | * Sets a value for given cookie key 238 | * 239 | * @param {string} key Id for the `value`. 240 | * @param {Object} value Value to be stored. 241 | */ 242 | put: function(key, value) { 243 | $cookies.putObject(key, value); 244 | }, 245 | 246 | /** 247 | * @ngdoc method 248 | * @name $cookieStore#remove 249 | * 250 | * @description 251 | * Remove given cookie 252 | * 253 | * @param {string} key Id of the key-value pair to delete. 254 | */ 255 | remove: function(key) { 256 | $cookies.remove(key); 257 | } 258 | }; 259 | 260 | }]); 261 | 262 | /** 263 | * @name $$cookieWriter 264 | * @requires $document 265 | * 266 | * @description 267 | * This is a private service for writing cookies 268 | * 269 | * @param {string} name Cookie name 270 | * @param {string=} value Cookie value (if undefined, cookie will be deleted) 271 | * @param {Object=} options Object with options that need to be stored for the cookie. 272 | */ 273 | function $$CookieWriter($document, $log, $browser) { 274 | var cookiePath = $browser.baseHref(); 275 | var rawDocument = $document[0]; 276 | 277 | function buildCookieString(name, value, options) { 278 | var path, expires; 279 | options = options || {}; 280 | expires = options.expires; 281 | path = angular.isDefined(options.path) ? options.path : cookiePath; 282 | if (angular.isUndefined(value)) { 283 | expires = 'Thu, 01 Jan 1970 00:00:00 GMT'; 284 | value = ''; 285 | } 286 | if (angular.isString(expires)) { 287 | expires = new Date(expires); 288 | } 289 | 290 | var str = encodeURIComponent(name) + '=' + encodeURIComponent(value); 291 | str += path ? ';path=' + path : ''; 292 | str += options.domain ? ';domain=' + options.domain : ''; 293 | str += expires ? ';expires=' + expires.toUTCString() : ''; 294 | str += options.secure ? ';secure' : ''; 295 | 296 | // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum: 297 | // - 300 cookies 298 | // - 20 cookies per unique domain 299 | // - 4096 bytes per cookie 300 | var cookieLength = str.length + 1; 301 | if (cookieLength > 4096) { 302 | $log.warn("Cookie '" + name + 303 | "' possibly not set or overflowed because it was too large (" + 304 | cookieLength + " > 4096 bytes)!"); 305 | } 306 | 307 | return str; 308 | } 309 | 310 | return function(name, value, options) { 311 | rawDocument.cookie = buildCookieString(name, value, options); 312 | }; 313 | } 314 | 315 | $$CookieWriter.$inject = ['$document', '$log', '$browser']; 316 | 317 | angular.module('ngCookies').provider('$$cookieWriter', function $$CookieWriterProvider() { 318 | this.$get = $$CookieWriter; 319 | }); 320 | 321 | 322 | })(window, window.angular); 323 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | {description} 294 | Copyright (C) {year} {fullname} 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | {signature of Ty Coon}, 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | 341 | -------------------------------------------------------------------------------- /js/angular-animate.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | AngularJS v1.5.0 3 | (c) 2010-2016 Google, Inc. http://angularjs.org 4 | License: MIT 5 | */ 6 | (function(D,r,Va){'use strict';function ya(a,b,c){if(!a)throw Ka("areq",b||"?",c||"required");return a}function za(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;ba(a)&&(a=a.join(" "));ba(b)&&(b=b.join(" "));return a+" "+b}function La(a){var b={};a&&(a.to||a.from)&&(b.to=a.to,b.from=a.from);return b}function X(a,b,c){var d="";a=ba(a)?a:a&&R(a)&&a.length?a.split(/\s+/):[];s(a,function(a,g){a&&0=a&&(a=e,e=0,b.push(t),t=[]);t.push(g.fn);g.children.forEach(function(a){e++; 28 | c.push(a)});a--}t.length&&b.push(t);return b}(c)}var M=[],r=U(a);return function(u,A,v){function z(a){a=a.hasAttribute("ng-animate-ref")?[a]:a.querySelectorAll("[ng-animate-ref]");var b=[];s(a,function(a){var c=a.getAttribute("ng-animate-ref");c&&c.length&&b.push(a)});return b}function K(a){var b=[],c={};s(a,function(a,f){var d=G(a.element),h=0<=["enter","move"].indexOf(a.event),d=a.structural?z(d):[];if(d.length){var e=h?"to":"from";s(d,function(a){var b=a.getAttribute("ng-animate-ref");c[b]=c[b]|| 29 | {};c[b][e]={animationID:f,element:I(a)}})}else b.push(a)});var d={},h={};s(c,function(c,e){var l=c.from,t=c.to;if(l&&t){var g=a[l.animationID],E=a[t.animationID],k=l.animationID.toString();if(!h[k]){var z=h[k]={structural:!0,beforeStart:function(){g.beforeStart();E.beforeStart()},close:function(){g.close();E.close()},classes:J(g.classes,E.classes),from:g,to:E,anchors:[]};z.classes.length?b.push(z):(b.push(g),b.push(E))}h[k].anchors.push({out:l.element,"in":t.element})}else l=l?l.animationID:t.animationID, 30 | t=l.toString(),d[t]||(d[t]=!0,b.push(a[l]))});return b}function J(a,b){a=a.split(" ");b=b.split(" ");for(var c=[],d=0;d=P&&b>=O&&(wa=!0,q())}function L(){function b(){if(!A){t(!1);s(m, 37 | function(a){l.style[a[0]]=a[1]});z(a,f);e.addClass(a,ca);if(p.recalculateTimingStyles){ja=l.className+" "+da;ga=r(l,ja);F=v(l,ja,ga);$=F.maxDelay;n=Math.max($,0);O=F.maxDuration;if(0===O){q();return}p.hasTransitions=0B.expectedEndTime)?H.cancel(B.timer):g.push(q)}L&&(k=H(c,k,!1),g[0]={timer:k,expectedEndTime:d},g.push(q),a.data("$$animateCss",g));if(ea.length)a.on(ea.join(" "),E);f.to&&(f.cleanupStyles&&Ga(x,l,Object.keys(f.to)),Ba(a, 39 | f))}}function c(){var b=a.data("$$animateCss");if(b){for(var d=1;d