7 | <%= l(:filtered_mail_footer) %> 8 | <%= link_to l(:header_openpgp), 9 | Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 10 |
11 | 12 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? %> 13 |14 | <%= Setting.plugin_openpgp['filtered_mail_footer'].html_safe %> 15 |
16 | <% end %> -------------------------------------------------------------------------------- /app/views/mailer/attachments_added.filtered.text.erb: -------------------------------------------------------------------------------- 1 | <%= l(:filtered_mail_attachments_added) %> 2 | <%= @added_to_url %> 3 | 4 | ---------------------------------------- 5 | 6 | <%= l(:filtered_mail_footer) %> 7 | <%= Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 8 | 9 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? -%> 10 | <%= Setting.plugin_openpgp['filtered_mail_footer'] %> 11 | <% end -%> -------------------------------------------------------------------------------- /app/views/mailer/document_added.filtered.html.erb: -------------------------------------------------------------------------------- 1 |7 | <%= l(:filtered_mail_footer) %> 8 | <%= link_to l(:header_openpgp), 9 | Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 10 |
11 | 12 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? %> 13 |14 | <%= Setting.plugin_openpgp['filtered_mail_footer'].html_safe %> 15 |
16 | <% end %> 17 | -------------------------------------------------------------------------------- /app/views/mailer/document_added.filtered.text.erb: -------------------------------------------------------------------------------- 1 | <%= l(:filtered_mail_document_added) %> 2 | <%= @document_url %> 3 | 4 | ---------------------------------------- 5 | 6 | <%= l(:filtered_mail_footer) %> 7 | <%= Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 8 | 9 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? -%> 10 | <%= Setting.plugin_openpgp['filtered_mail_footer'] %> 11 | <% end -%> -------------------------------------------------------------------------------- /app/views/mailer/issue_add.filtered.html.erb: -------------------------------------------------------------------------------- 1 |7 | <%= l(:filtered_mail_footer) %> 8 | <%= link_to l(:header_openpgp), 9 | Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 10 |
11 | 12 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? %> 13 |14 | <%= Setting.plugin_openpgp['filtered_mail_footer'].html_safe %> 15 |
16 | <% end %> 17 | -------------------------------------------------------------------------------- /app/views/mailer/issue_add.filtered.text.erb: -------------------------------------------------------------------------------- 1 | <%= l(:filtered_mail_issue_add) %> 2 | <%= @issue_url %> 3 | 4 | ---------------------------------------- 5 | 6 | <%= l(:filtered_mail_footer) %> 7 | <%= Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 8 | 9 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? -%> 10 | <%= Setting.plugin_openpgp['filtered_mail_footer'] %> 11 | <% end -%> -------------------------------------------------------------------------------- /app/views/mailer/issue_edit.filtered.html.erb: -------------------------------------------------------------------------------- 1 |7 | <%= l(:filtered_mail_footer) %> 8 | <%= link_to l(:header_openpgp), 9 | Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 10 |
11 | 12 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? %> 13 |14 | <%= Setting.plugin_openpgp['filtered_mail_footer'].html_safe %> 15 |
16 | <% end %> 17 | -------------------------------------------------------------------------------- /app/views/mailer/issue_edit.filtered.text.erb: -------------------------------------------------------------------------------- 1 | <%= l(:filtered_mail_issue_edit) %> 2 | <%= @issue_url %> 3 | 4 | ---------------------------------------- 5 | 6 | <%= l(:filtered_mail_footer) %> 7 | <%= Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 8 | 9 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? -%> 10 | <%= Setting.plugin_openpgp['filtered_mail_footer'] %> 11 | <% end -%> -------------------------------------------------------------------------------- /app/views/mailer/message_posted.filtered.html.erb: -------------------------------------------------------------------------------- 1 |7 | <%= l(:filtered_mail_footer) %> 8 | <%= link_to l(:header_openpgp), 9 | Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 10 |
11 | 12 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? %> 13 |14 | <%= Setting.plugin_openpgp['filtered_mail_footer'].html_safe %> 15 |
16 | <% end %> 17 | -------------------------------------------------------------------------------- /app/views/mailer/message_posted.filtered.text.erb: -------------------------------------------------------------------------------- 1 | <%= l(:filtered_mail_message_posted) %> 2 | <%= @message_url %> 3 | 4 | ---------------------------------------- 5 | 6 | <%= l(:filtered_mail_footer) %> 7 | <%= Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 8 | 9 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? -%> 10 | <%= Setting.plugin_openpgp['filtered_mail_footer'] %> 11 | <% end -%> -------------------------------------------------------------------------------- /app/views/mailer/news_added.filtered.html.erb: -------------------------------------------------------------------------------- 1 |7 | <%= l(:filtered_mail_footer) %> 8 | <%= link_to l(:header_openpgp), 9 | Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 10 |
11 | 12 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? %> 13 |14 | <%= Setting.plugin_openpgp['filtered_mail_footer'].html_safe %> 15 |
16 | <% end %> 17 | -------------------------------------------------------------------------------- /app/views/mailer/news_added.filtered.text.erb: -------------------------------------------------------------------------------- 1 | <%= l(:filtered_mail_news_added) %> 2 | <%= @news_url %> 3 | 4 | ---------------------------------------- 5 | 6 | <%= l(:filtered_mail_footer) %> 7 | <%= Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 8 | 9 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? -%> 10 | <%= Setting.plugin_openpgp['filtered_mail_footer'] %> 11 | <% end -%> -------------------------------------------------------------------------------- /app/views/mailer/news_comment_added.filtered.html.erb: -------------------------------------------------------------------------------- 1 |7 | <%= l(:filtered_mail_footer) %> 8 | <%= link_to l(:header_openpgp), 9 | Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 10 |
11 | 12 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? %> 13 |14 | <%= Setting.plugin_openpgp['filtered_mail_footer'].html_safe %> 15 |
16 | <% end %> 17 | -------------------------------------------------------------------------------- /app/views/mailer/news_comment_added.filtered.text.erb: -------------------------------------------------------------------------------- 1 | <%= l(:filtered_mail_news_comment_added) %> 2 | <%= @news_url %> 3 | 4 | ---------------------------------------- 5 | 6 | <%= l(:filtered_mail_footer) %> 7 | <%= Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 8 | 9 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? -%> 10 | <%= Setting.plugin_openpgp['filtered_mail_footer'] %> 11 | <% end -%> -------------------------------------------------------------------------------- /app/views/mailer/wiki_content_added.filtered.html.erb: -------------------------------------------------------------------------------- 1 |7 | <%= l(:filtered_mail_footer) %> 8 | <%= link_to l(:header_openpgp), 9 | Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 10 |
11 | 12 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? %> 13 |14 | <%= Setting.plugin_openpgp['filtered_mail_footer'].html_safe %> 15 |
16 | <% end %> 17 | -------------------------------------------------------------------------------- /app/views/mailer/wiki_content_added.filtered.text.erb: -------------------------------------------------------------------------------- 1 | <%= l(:filtered_mail_wiki_content_added) %> 2 | <%= @wiki_content_url %> 3 | 4 | ---------------------------------------- 5 | 6 | <%= l(:filtered_mail_footer) %> 7 | <%= Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 8 | 9 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? -%> 10 | <%= Setting.plugin_openpgp['filtered_mail_footer'] %> 11 | <% end -%> -------------------------------------------------------------------------------- /app/views/mailer/wiki_content_updated.filtered.html.erb: -------------------------------------------------------------------------------- 1 |7 | <%= l(:filtered_mail_footer) %> 8 | <%= link_to l(:header_openpgp), 9 | Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 10 |
11 | 12 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? %> 13 |14 | <%= Setting.plugin_openpgp['filtered_mail_footer'].html_safe %> 15 |
16 | <% end %> 17 | -------------------------------------------------------------------------------- /app/views/mailer/wiki_content_updated.filtered.text.erb: -------------------------------------------------------------------------------- 1 | <%= l(:filtered_mail_wiki_content_updated) %> 2 | <%= @wiki_content_url %> 3 | 4 | ---------------------------------------- 5 | 6 | <%= l(:filtered_mail_footer) %> 7 | <%= Setting['protocol'] + '://' + Setting['host_name'] + '/pgp' %> 8 | 9 | <% if not Setting.plugin_openpgp['filtered_mail_footer'].blank? -%> 10 | <%= Setting.plugin_openpgp['filtered_mail_footer'] %> 11 | <% end -%> -------------------------------------------------------------------------------- /app/views/pgpkeys/index.html.erb: -------------------------------------------------------------------------------- 1 |<%= l(:note_login) %>
5 | 6 | <% else %> 7 | 8 |16 | <%= label_tag 'fpr', l(:label_fingerprint) %> 17 | <%= text_field_tag 'fpr', @user_pgpkey.fpr, size: "40", readonly: true %> 18 |
19 |20 | <%= label_tag 'metadata', l(:label_metadata) %> 21 | <%= text_area_tag 'meta', @user_pgpkey.metadata, rows: "4", readonly: true %> 22 |
23 |24 | <%= label_tag 'key', l(:label_public_key) %> 25 | <%= text_area_tag 'key', @user_pgpkey.public_key, rows: "30", readonly: true %> 26 |
27 |
28 | <%= l(:note_user_public_key_given) %>
29 | (<%= l(:note_sent_to) %> <%= User.current.mail %>)
30 |
<%= submit_tag l(:button_delete) %>
33 | <% end %> 34 | 35 | <% else %> 36 | 37 | <% # no user key given %> 38 | <%= form_tag method: "post", action: "create" do %> 39 |40 | <%= label_tag 'key', l(:label_public_key) %> 41 | <%= text_area_tag 'key', nil, :size => "50x30" %> 42 |
43 |
44 | <%= l(:note_user_public_key_missing) %>
45 | (<%= l(:note_sent_to) %> <%= User.current.mail %>)
46 |
<%= submit_tag l(:button_create) %>
49 | <% end %> 50 | 51 | <% end %> 52 | <% end %> 53 |63 | <%= label_tag 'fpr', l(:label_fingerprint) %> 64 | <%= text_field_tag 'fpr', @server_pgpkey.fpr, size: "40", readonly: true %> 65 |
66 |67 | <%= label_tag 'metadata', l(:label_metadata) %> 68 | <%= text_area_tag 'meta', @server_pgpkey.metadata, rows: "4", readonly: true %> 69 |
70 |71 | <%= label_tag 'key', l(:label_public_key) %> 72 | <%= text_area_tag 'key', @server_pgpkey.public_key, rows: "30", readonly: true %> 73 |
74 |
75 | <%= l(:note_server_public_key_given) %>
76 | (<%= l(:note_sent_to) %> <%= Setting['mail_from'] %>)
77 |
<%= submit_tag l(:button_delete) %>
81 | <% end %> 82 | <% end %> 83 | 84 | <% else %> 85 | 86 | <% # no server key given %> 87 | <% if not User.current.admin? %> 88 |100 | <%= label_tag 'key', l(:label_private_key) %> 101 | <%= text_area_tag 'key', nil, :size => "50x30" %> 102 |
103 |104 | <%= label_tag 'secret', l(:label_secret) %> 105 | <%= password_field_tag 'secret', nil, size: "40" %> 106 |
107 |
108 | <%= l(:note_server_private_key_create) %>
109 | (<%= l(:note_receiving_emails) %> Receiving emails)
110 |
<%= submit_tag l(:button_create) %>
113 | <% end %> 114 |124 | <%= label_tag 'key_type', l(:label_key_type) %> 125 | <%= text_field_tag 'key_type', 'RSA', size: "40", readonly: true %> 126 |
127 |128 | <%= label_tag 'key_length', l(:label_key_length) %> 129 | <%= text_field_tag 'key_length', '2048', size: "40", readonly: true %> 130 |
131 |132 | <%= label_tag 'subkey_type', l(:label_subkey_type) %> 133 | <%= text_field_tag 'subkey_type', 'RSA', size: "40", readonly: true %> 134 |
135 |136 | <%= label_tag 'subkey_length', l(:label_subkey_length) %> 137 | <%= text_field_tag 'subkey_length', '2048', size: "40", readonly: true %> 138 |
139 |140 | <%= label_tag 'name_real', l(:label_name_real) %> 141 | <%= text_field_tag 'name_real', 'Redmine Server', size: "40", readonly: true %> 142 |
143 |144 | <%= label_tag 'name_comment', l(:label_name_comment) %> 145 | <%= text_field_tag 'name_comment', '', size: "40", readonly: true %> 146 |
147 |148 | <%= label_tag 'name_email', l(:label_name_email) %> 149 | <%= text_field_tag 'name_email', Setting['mail_from'], size: "40", readonly: true %> 150 |
151 |152 | <%= label_tag 'expire_date', l(:label_expire_date) %> 153 | <%= text_field_tag 'expire_date', '0', size: "40", readonly: true %> 154 |
155 |156 | <%= label_tag 'passphrase', l(:label_secret) %> 157 | <%= password_field_tag 'passphrase', nil, size: "40" %> 158 |
159 |
160 | <%= l(:note_server_private_key_generate) %>
161 | (<%= l(:note_receiving_emails) %> Receiving emails)
162 |
<%= submit_tag l(:button_generate) %>
164 | <% end %> 165 | 166 | <% end %> 167 | 168 | <% end %> 169 | <% end %> 170 |3 | <%= label_tag 'settings[signature_needed]', l(:label_signature_needed) %> 4 | <%= check_box_tag 'settings[signature_needed]', nil, 5 | @settings['signature_needed'] %> 6 |
7 | 8 |10 | <%= label_tag 'settings[activation]', l(:label_openpgp_activation) %> 11 | <%= select_tag 'settings[activation]', 12 | options_for_select([ 13 | [l(:option_activation_all), "all"], 14 | [l(:option_activation_project), "project"], 15 | [l(:option_activation_none), "none"] 16 | ], 17 | @settings['activation'] 18 | ) %> 19 |
20 |21 | <%= label_tag 'settings[unencrypted_mails]', l(:label_unencrypted_mails) %> 22 | <%= select_tag 'settings[unencrypted_mails]', 23 | options_for_select([ 24 | [l(:option_unencrypted_mails_blocked), "blocked"], 25 | [l(:option_unencrypted_mails_filtered), "filtered"], 26 | [l(:option_unencrypted_mails_unchanged), "unchanged"] 27 | ], 28 | @settings['unencrypted_mails'] 29 | ) %> 30 |
31 |32 | <%= label_tag 'settings[filtered_mail_footer]', l(:label_filtered_mail_footer) %> 33 | <%= text_area_tag 'settings[filtered_mail_footer]', 34 | @settings['filtered_mail_footer'], 35 | {:size => "160x10"} %> 36 |
37 | -------------------------------------------------------------------------------- /config/locales/de.yml: -------------------------------------------------------------------------------- 1 | de: 2 | header_openpgp: PGP Schlüsselverwaltung 3 | subheader_openpgp_incoming: Eingehende Mails 4 | subheader_openpgp_outgoing: Ausgehende Mails 5 | subheader_save_key: Existierenden Schlüssel hinzufügen 6 | subheader_generate_key: Neuen Schlüssel generieren 7 | label_openpgp_activation: Plugin Aktivierung 8 | label_unencrypted_mails: Unverschlüsselte Mails 9 | label_signature_needed: Nur valide Signaturen 10 | label_filtered_mail_footer: Angehängte Nachricht in gefilterten Mails 11 | label_public_key: Öffentlicher PGP Schlüssel 12 | label_private_key: Privater PGP Schlüssel 13 | label_fingerprint: Fingerabdruck 14 | label_metadata: Metadaten 15 | label_key_type: Schlüsseltyp 16 | label_key_length: Schlüssellänge 17 | label_subkey_type: Unterschlüsseltyp 18 | label_subkey_length: Unterschlüssellänge 19 | label_name_real: Name 20 | label_name_comment: Kommentar 21 | label_name_email: Email 22 | label_expire_date: Ablaufdatum 23 | label_secret: Passphrase 24 | option_activation_all: für alle Projekte 25 | option_activation_project: abhängig von Projekteinstellungen 26 | option_activation_none: deaktiviert 27 | option_unencrypted_mails_blocked: blockiert 28 | option_unencrypted_mails_filtered: gefiltert 29 | option_unencrypted_mails_unchanged: unverändert 30 | button_create: Speichern 31 | button_delete: Löschen 32 | button_generate: Generieren 33 | note_login: Bitte einloggen, um die PGP Schlüssel zu verwalten. 34 | note_admin_only: Nur Administratoren können den privaten Schlüssel und die Passphrase für den Redmine Server verändern 35 | note_user_public_key_missing: Füge Deinen öffentlichen PGP Schlüssel hier hinzu, um verschlüsselte Mails zu erhalten 36 | note_user_public_key_given: Mit diesem PGP Schlüssel werden Mails von Redmine verschlüsselt 37 | note_server_public_key_missing: Kein Schlüssel hinterlegt. Benachrichtige bitte die Administratoren, falls Du Mails an Redmine verschlüsseln möchtest. 38 | note_server_public_key_given: Benutze diesen öffentlichen PGP Schlüssel, um Mails an Redmine zu verschlüsseln 39 | note_server_private_key_create: Füge einen privaten PGP Schlüssel für den Redmine Server hinzu, um verschlüsselte Mails an Redmine zu ermöglichen 40 | note_server_private_key_generate: Generiere einen privaten PGP Schlüssel für den Redmine Server, um verschlüsselte Mails an Redmine zu ermöglichen 41 | note_receiving_emails: Die Annahme von Emails muss in Redmine konfiguriert sein, siehe 42 | note_cleartext_create: "Der private Schlüssel und die Passphrase werden im Klartext übertragen! Verwende zumindest https oder nutze besser den serverseitigen rake taks: " 43 | note_cleartext_generate: "Die Passphrase wird im Klartext übertragen! Verwende zumindest https oder nutze besser den serverseitigen rake taks: " 44 | note_sent_to: gesendet an 45 | flash_public_key_not_valid: PGP Schlüssel ist ungültig (er sollte mit '-----BEGIN PGP PUBLIC KEY BLOCK-----' starten und mit '-----END PGP PUBLIC KEY BLOCK-----' enden) 46 | flash_private_key_not_valid: PGP Schlüssel ist ungültig (er sollte mit '-----BEGIN PGP PRIVATE KEY BLOCK-----' starten und mit '-----END PGP PRIVATE KEY BLOCK-----' enden) 47 | flash_bad_passphrase: Passphrase war falsch (bitte nochmal versuchen) 48 | flash_key_exists: Schlüssel existiert schon (bitte zuerst löschen) 49 | flash_key_not_exists: Schlüssel existiert nicht 50 | flash_update_not_allowed: Operation nicht erlaubt (bitte nicht weiter versuchen) 51 | flash_import_error: Fehler beim Importieren des Schlüssels (bitte nochmal versuchen oder die Administratoren benachrichtigen) 52 | flash_unknown_error: Unbekannter Fehler (bitte nochmal versuchen oder die Administratoren benachrichtigen) 53 | flash_no_secret: Keine Passphrase angegeben (kein Problem, aber bist Du Dir sicher?) 54 | flash_create_succesful: PGP Schlüssel erfolgreich gepeichert 55 | flash_delete_succesful: PGP Schlüssel erfolgreich gelöscht 56 | flash_generate_succesful: PGP Schlüssel erfolgreich generiert 57 | filtered_mail_footer: "Diese Mail wurde aus Gründen der Sicherheit gefiltert. Folge diesem Link und füge Deinen öffentlichen PGP Schlüssel hinzu, um ungefilterte, verschlüsselte Mails zu erhalten:" 58 | filtered_mail_attachments_added: Anhänge hinzugefügt 59 | filtered_mail_document_added: Dokument hinzugefügt 60 | filtered_mail_issue_add: Ticket hinzugefügt 61 | filtered_mail_issue_edit: Ticket bearbeitet 62 | filtered_mail_message_posted: Nachricht hinzugefügt 63 | filtered_mail_news_added: Neuigkeit hinzugefügt 64 | filtered_mail_news_comment_added: Kommentar hinzugefügt 65 | filtered_mail_wiki_content_added: Seite hinzugefügt 66 | filtered_mail_wiki_content_updated: Seite editiert 67 | -------------------------------------------------------------------------------- /config/locales/en.yml: -------------------------------------------------------------------------------- 1 | en: 2 | header_openpgp: PGP Keymanagement 3 | subheader_openpgp_incoming: Incoming 4 | subheader_openpgp_outgoing: Outgoing 5 | subheader_save_key: Save existing key 6 | subheader_generate_key: Generate new key 7 | label_openpgp_activation: Plugin activation 8 | label_unencrypted_mails: Unencrypted mails 9 | label_signature_needed: Valid signatures only 10 | label_filtered_mail_footer: Custom footer of filtered mails 11 | label_public_key: Public PGP key 12 | label_private_key: Private PGP key 13 | label_fingerprint: Fingerprint 14 | label_metadata: Metadata 15 | label_key_type: Key type 16 | label_key_length: Key length 17 | label_subkey_type: Subkey type 18 | label_subkey_length: Subkey length 19 | label_name_real: Name 20 | label_name_comment: Comment 21 | label_name_email: Email 22 | label_expire_date: Expire date 23 | label_secret: Passphrase 24 | option_activation_all: for all projects 25 | option_activation_project: dependant on project settings 26 | option_activation_none: deactivated 27 | option_unencrypted_mails_blocked: blocked 28 | option_unencrypted_mails_filtered: filtered 29 | option_unencrypted_mails_unchanged: unchanged 30 | button_create: Save 31 | button_delete: Remove 32 | button_generate: Generate 33 | note_login: Please log in to manage PGP keys. 34 | note_admin_only: Only administrators will be able to change the private PGP key and passphrase for the redmine server 35 | note_user_public_key_missing: Add your public PGP key here to recieve encrypted mails by redmine 36 | note_user_public_key_given: This PGP key is used to encrypt mails by redmine 37 | note_server_public_key_missing: No key given. Please contact your administrator if you want to send encrypted mails to redmine. 38 | note_server_public_key_given: Use this public PGP key to encrypt mails for redmine 39 | note_server_private_key_create: Add a private PGP key for redmine to enable encrytion of mails sent to redmine 40 | note_server_private_key_generate: Generate a private PGP key for redmine to enable encrytion of mails sent to redmine 41 | note_receiving_emails: recieving emails must be configured within redmine, see 42 | note_cleartext_create: "The private key and passphrase will be sent in cleartext! Ensure using https or better use the serverside rake task: " 43 | note_cleartext_generate: "The passphrase will be sent in cleartext! Ensure using https or better use the serverside rake task: " 44 | note_sent_to: sent to 45 | flash_public_key_not_valid: PGP key not valid (it should start with '-----BEGIN PGP PUBLIC KEY BLOCK-----' and end with '-----END PGP PUBLIC KEY BLOCK-----') 46 | flash_private_key_not_valid: PGP key not valid (it should start with '-----BEGIN PGP PRIVATE KEY BLOCK-----' and end with '-----END PGP PRIVATE KEY BLOCK-----') 47 | flash_bad_passphrase: Passphrase was wrong (please try again) 48 | flash_key_exists: Key does exist already (please delete it first) 49 | flash_key_not_exists: Key does not exist 50 | flash_update_not_allowed: Operation not allowed (please don't try) 51 | flash_import_error: Error importing the key (please try again or contact your administrator) 52 | flash_unknown_error: Unkown error (please try again or contact your administrator) 53 | flash_no_secret: Passphrase is empty (no problem, but are you sure?) 54 | flash_create_succesful: PGP key successfully saved 55 | flash_delete_succesful: PGP key successfully deleted 56 | flash_generate_succesful: PGP key successfully generated 57 | filtered_mail_footer: "This mail was filtered for enhanced security. Follow this link and add your public PGP key to receive unfiltered encrypted mails:" 58 | filtered_mail_attachments_added: Attachements added 59 | filtered_mail_document_added: Document added 60 | filtered_mail_issue_add: Issue added 61 | filtered_mail_issue_edit: Issue edited 62 | filtered_mail_message_posted: Message added 63 | filtered_mail_news_added: News added 64 | filtered_mail_news_comment_added: Comment added 65 | filtered_mail_wiki_content_added: Page added 66 | filtered_mail_wiki_content_updated: Page edited -------------------------------------------------------------------------------- /config/routes.rb: -------------------------------------------------------------------------------- 1 | # Plugin's routes 2 | # See: http://guides.rubyonrails.org/routing.html 3 | 4 | get 'pgp', :to => 'pgpkeys#index' 5 | post 'pgp/create', :to => 'pgpkeys#create' 6 | post 'pgp/delete', :to => 'pgpkeys#delete' 7 | post 'pgp/generate', :to => 'pgpkeys#generate' -------------------------------------------------------------------------------- /db/migrate/001_create_pgpkeys.rb: -------------------------------------------------------------------------------- 1 | class CreatePgpkeys < ActiveRecord::Migration 2 | def change 3 | create_table :pgpkeys do |t| 4 | t.integer :user_id 5 | t.string :fpr 6 | t.string :secret 7 | end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /init.rb: -------------------------------------------------------------------------------- 1 | #!/bin/env ruby 2 | # encoding: utf-8 3 | 4 | require 'gpgme' 5 | require 'mail-gpg' 6 | 7 | Redmine::Plugin.register :openpgp do 8 | name 'OpenPGP' 9 | author 'Alexander Blum' 10 | description 'Email encryption with the OpenPGP standard' 11 | version '1.0' 12 | author_url 'mailto:a.blum@free-reality.net' 13 | url 'https://github.com/C3S/redmine_openpgp' 14 | settings(:default => { 15 | 'signature_needed' => false, 16 | 'encryption_scope' => 'project', 17 | 'unencrypted_mails' => 'filtered', 18 | 'filtered_mail_footer' => '' 19 | }, :partial => 'settings/openpgp') 20 | project_module :openpgp do 21 | permission :block_email, { :openpgp => :show } 22 | end 23 | menu :account_menu, :pgpkeys, { :controller => 'pgpkeys', :action => 'index' }, 24 | :caption => 'PGP', :after => :my_account, 25 | :if => Proc.new { User.current.logged? } 26 | end 27 | 28 | # encrypt outgoing mails 29 | ActionDispatch::Callbacks.to_prepare do 30 | require_dependency 'mailer' 31 | Mailer.send(:include, EncryptMails) 32 | end 33 | 34 | # decrypt received mails 35 | ActionDispatch::Callbacks.to_prepare do 36 | require_dependency 'mail_handler' 37 | MailHandler.send(:include, DecryptMails) 38 | end 39 | -------------------------------------------------------------------------------- /lib/decrypt_mails.rb: -------------------------------------------------------------------------------- 1 | module DecryptMails 2 | 3 | def self.included(base) # :nodoc: 4 | base.send(:include, InstanceMethods) 5 | base.class_eval do 6 | alias_method_chain :receive, :encryption 7 | end 8 | end 9 | 10 | module InstanceMethods 11 | 12 | def receive_with_encryption(email, options={}) 13 | 14 | # encrypt and check validity of signature 15 | if email.encrypted? 16 | email = email.decrypt( 17 | :password => Pgpkey.find_by(:user_id => 0), 18 | :verify => true 19 | ) 20 | valid = email.signature_valid? 21 | signatures = email.signatures 22 | else 23 | if email.signed? 24 | verified = email.verify 25 | valid = verified.signature_valid? 26 | signatures = verified.signatures 27 | else 28 | valid = false 29 | end 30 | end 31 | 32 | # compare identity of signature with sender 33 | if valid 34 | valid = false 35 | sender_email = email.from.to_a.first.to_s.strip 36 | user = User.find_by_mail sender_email if sender_email.present? 37 | key = Pgpkey.find_by user_id: user.id 38 | signatures.each do |s| 39 | valid = true if key.fpr == s.fpr 40 | end if not signatures.empty? 41 | end 42 | 43 | # error on invalid signature 44 | if Setting.plugin_openpgp['signature_needed'] and not valid 45 | if logger 46 | logger.info "MailHandler: ignoring emails with invalid signature" 47 | end 48 | return false 49 | end 50 | 51 | receive_without_encryption(email, options) 52 | 53 | end 54 | 55 | end 56 | end -------------------------------------------------------------------------------- /lib/encrypt_mails.rb: -------------------------------------------------------------------------------- 1 | module EncryptMails 2 | 3 | def self.included(base) # :nodoc: 4 | base.send(:include, InstanceMethods) 5 | base.class_eval do 6 | alias_method_chain :mail, :relocation 7 | end 8 | end 9 | 10 | module InstanceMethods 11 | 12 | # action names to be processed by this plugin 13 | def actions 14 | [ 15 | 'attachments_added', 16 | 'document_added', 17 | 'issue_add', 18 | 'issue_edit', 19 | 'message_posted', 20 | 'news_added', 21 | 'news_comment_added', 22 | 'wiki_content_added', 23 | 'wiki_content_updated' 24 | ] 25 | end 26 | 27 | # dispatched mail method 28 | def mail_with_relocation(headers={}, &block) 29 | 30 | # pass unchanged, if action does not match or plugin is inactive 31 | act = Setting.plugin_openpgp['activation'] 32 | return mail_without_relocation(headers, &block) if 33 | act == 'none' or not actions.include? @_action_name or 34 | (act == 'project' and not project.try('module_enabled?', 'openpgp')) 35 | 36 | # relocate recipients 37 | recipients = relocate_recipients(headers) 38 | header = @_message.header.to_s 39 | 40 | # render and deliver encrypted mail 41 | reset(header) 42 | m = mail_without_relocation prepare_headers( 43 | headers, recipients[:encrypted], encrypt = true, sign = true 44 | ) do |format| 45 | format.text 46 | end 47 | m.deliver 48 | 49 | # render and deliver filtered mail 50 | reset(header) 51 | tpl = @_action_name + '.filtered' 52 | m = mail_without_relocation prepare_headers( 53 | headers, recipients[:filtered], encrypt = false, sign = true 54 | ) do |format| 55 | format.text { render tpl } 56 | format.html { render tpl } unless Setting.plain_text_mail? 57 | end 58 | m.deliver 59 | 60 | # render unchanged mail (deliverd by calling method) 61 | reset(header) 62 | m = mail_without_relocation prepare_headers( 63 | headers, recipients[:unchanged], encrypt = false, sign = false 64 | ) do |format| 65 | format.text 66 | format.html unless Setting.plain_text_mail? 67 | end 68 | 69 | m 70 | 71 | end 72 | 73 | # get project dependent on action and object 74 | def project 75 | 76 | case @_action_name 77 | when 'attachments_added' 78 | @attachments.first.project 79 | when 'document_added' 80 | @document.project 81 | when 'issue_add', 'issue_edit' 82 | @issue.project 83 | when 'message_posted' 84 | @message.project 85 | when 'news_added', 'news_comment_added' 86 | @news.project 87 | when 'wiki_content_added', 'wiki_content_updated' 88 | @wiki_content.project 89 | else 90 | nil 91 | end 92 | 93 | end 94 | 95 | # relocates reciepients (to, cc) of message 96 | def relocate_recipients(headers) 97 | 98 | # hash to be returned 99 | recipients = { 100 | :encrypted => {:to => [], :cc => []}, 101 | :blocked => {:to => [], :cc => []}, 102 | :filtered => {:to => [], :cc => []}, 103 | :unchanged => {:to => [], :cc => []}, 104 | :lost => {:to => [], :cc => []} 105 | } 106 | 107 | # relocation of reciepients 108 | [:to, :cc].each do |field| 109 | headers[field].each do |user| 110 | 111 | # encrypted 112 | unless Pgpkey.find_by(user_id: user.id).nil? 113 | recipients[:encrypted][field].push user and next 114 | end 115 | 116 | # unencrypted 117 | case Setting.plugin_openpgp['unencrypted_mails'] 118 | when 'blocked' 119 | recipients[:blocked][field].push user 120 | when 'filtered' 121 | recipients[:filtered][field].push user 122 | when 'unchanged' 123 | recipients[:unchanged][field].push user 124 | else 125 | recipients[:lost][field].push user 126 | end 127 | 128 | end unless headers[field].blank? 129 | end 130 | 131 | recipients 132 | 133 | end 134 | 135 | # resets the mail for sending mails multiple times 136 | def reset(header) 137 | 138 | @_mail_was_called = false 139 | @_message = Mail.new 140 | @_message.header header 141 | 142 | end 143 | 144 | # prepares the headers for different configurations 145 | def prepare_headers(headers, recipients, encrypt, sign) 146 | 147 | h = headers.deep_dup 148 | 149 | # headers for recipients 150 | h[:to] = recipients[:to] 151 | h[:cc] = recipients[:cc] 152 | 153 | # headers for gpg 154 | h[:gpg] = { 155 | encrypt: false, 156 | sign: false 157 | } 158 | 159 | # headers for encryption 160 | if encrypt 161 | h[:gpg][:encrypt] = true 162 | # add pgp keys for emails 163 | h[:gpg][:keys] = {} 164 | [:to, :cc].each do |field| 165 | h[field].each do |user| 166 | user_key = Pgpkey.find_by user_id: user.id 167 | unless user_key.nil? 168 | h[:gpg][:keys][user.mail] = user_key.fpr 169 | end 170 | end unless h[field].blank? 171 | end 172 | end 173 | 174 | # headers for signature 175 | if sign 176 | server_key = Pgpkey.find_by(:user_id => 0) 177 | unless server_key.nil? 178 | h[:gpg][:sign] = true 179 | h[:gpg][:sign_as] = Setting['mail_from'] 180 | h[:gpg][:password] = server_key.secret 181 | end 182 | end 183 | 184 | h 185 | 186 | end 187 | 188 | end 189 | end 190 | -------------------------------------------------------------------------------- /lib/tasks/generate_redmine_pgpkey.rake: -------------------------------------------------------------------------------- 1 | desc <<-END_DESC 2 | Generate the private PGP key for the redmine server. 3 | Warning: will override and delete the existing one. 4 | 5 | Available options: 6 | * secret => passphrase (interactive, if not given) 7 | 8 | Example: 9 | RAILS_ENV="production" rake redmine:generate_redmine_pgpkey 10 | RAILS_ENV="production" rake redmine:generate_redmine_pgpkey secret="passphrase" 11 | END_DESC 12 | 13 | namespace :redmine do 14 | task :generate_redmine_pgpkey => :environment do |task| 15 | keyfile = ENV['keyfile'] 16 | @secret = ENV['secret'] 17 | 18 | # sanity checks 19 | puts 'Warning: passphrase is empty (no problem, but are you sure?)' if @secret == "" 20 | 21 | # interactive mode: secret 22 | if @secret == nil 23 | print "Enter secret: " 24 | STDOUT.flush 25 | @secret = STDIN.noecho(&:gets).chomp! 26 | puts 27 | puts 'Warning: passphrase is empty (no problem, but are you sure?)' if @secret == "" 28 | end 29 | 30 | # remove old key from db and from gpg ring, if present 31 | old_key = Pgpkey.find_by user_id: 0 32 | if old_key 33 | old_fpr = old_key.fpr 34 | old_key.delete 35 | puts '... removed old key from db.' 36 | if not Pgpkey.find_by fpr: old_fpr 37 | gpgme_key = GPGME::Key.get(old_fpr) 38 | gpgme_key.delete!(true) 39 | puts '... removed old key from gpg key ring.' 40 | else 41 | puts 'Warning: old key not removed (still referenced by a user)' 42 | end 43 | end 44 | 45 | # prepare gpg parameter 46 | params = { 47 | :key_type => 'RSA', 48 | :key_length => '2048', 49 | :subkey_type => 'RSA', 50 | :subkey_length => '2048', 51 | :name_real => 'Redmine Server', 52 | :name_comment => '', 53 | :name_email => Setting['mail_from'], 54 | :expire_date => '0', 55 | :passphrase => @secret 56 | } 57 | data = "