schleuder 3.4.1 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3127723694c9320dbc25abc2bd7d5de2a0ca22d587c794bb36be5ae09fdf63f0
4
- data.tar.gz: dfdcd502ca1498883cd931004034c7c4f8874271c06499bc39591cba407130a8
3
+ metadata.gz: 49f682bc409302cde8907906dbbbab0238d4e404748874b5c3b263806b70abbe
4
+ data.tar.gz: c47b37fc7c1dede5b95bd396ceef0642cf5061af574a589b84497e01d1f7dcf8
5
5
  SHA512:
6
- metadata.gz: 31e3a5ed4c50043c7f0324f60595023cfc51766eca36aae32d326cffdcb81f09a3ad4798d4a96e43e99d67b768ab620dfe5b686ce95aeb5132f02e674cbc483a
7
- data.tar.gz: bf93269f6737cfa57ce71474e15275e2379ea9c45cfc680698912d68674d0bd39a0d855ebbf09b59bdc00165948c81bc037b109012fd1b6b4a86f1664a9fcbb7
6
+ metadata.gz: 42706627c3b2ea15d6e735cc28fcaa34a4bcd4cf58bb6789edd5ce83ba8033e10259a16cd61e06d5d2a25f01aa55a25f9a03073a5a03683cab2dc093a04e1103
7
+ data.tar.gz: b5b784eafd81435118bac61ce089d36e45e0932c46816aa46ae3da199fa96f9cd9c4e31c9dea58eba93d37de707d121a3ee69949388096c8b4330b7498b9a4ad
data/README.md CHANGED
@@ -47,15 +47,15 @@ Additionally these **rubygems** are required (will be installed automatically un
47
47
  Installing Schleuder
48
48
  ------------
49
49
 
50
- 1. Download [the gem](https://schleuder.org/download/schleuder-3.4.1.gem) and [the OpenPGP-signature](https://schleuder.org/download/schleuder-3.4.1.gem.sig) and verify:
50
+ 1. Download [the gem](https://schleuder.org/download/schleuder-3.5.0.gem) and [the OpenPGP-signature](https://schleuder.org/download/schleuder-3.5.0.gem.sig) and verify:
51
51
  ```
52
52
  gpg --recv-key 0xB3D190D5235C74E1907EACFE898F2C91E2E6E1F3
53
- gpg --verify schleuder-3.4.1.gem.sig
53
+ gpg --verify schleuder-3.5.0.gem.sig
54
54
  ```
55
55
 
56
56
  2. If all went well install the gem:
57
57
  ```
58
- gem install schleuder-3.4.1.gem
58
+ gem install schleuder-3.5.0.gem
59
59
  ```
60
60
 
61
61
  3. Set up schleuder:
@@ -65,7 +65,7 @@ Installing Schleuder
65
65
  This creates necessary directories, copies example configs, etc. If you see errors about missing write permissions please follow the advice given.
66
66
 
67
67
 
68
- For further information on setup and configuration please read <https://schleuder.org/docs/#setup>.
68
+ For further information on setup and configuration please read <https://schleuder.org/schleuder/docs/server-admins.html>.
69
69
 
70
70
 
71
71
  Command line usage
@@ -145,4 +145,4 @@ GNU GPL 3.0. Please see [LICENSE.txt](LICENSE.txt).
145
145
  Alternative Download
146
146
  --------------------
147
147
 
148
- Alternatively to the gem-files you can download the latest release as [a tarball](https://schleuder.org/download/schleuder-3.4.1.tar.gz) and [its OpenPGP-signature](https://schleuder.org/download/schleuder-3.4.1.tar.gz.sig).
148
+ Alternatively to the gem-files you can download the latest release as [a tarball](https://schleuder.org/download/schleuder-3.5.0.tar.gz) and [its OpenPGP-signature](https://schleuder.org/download/schleuder-3.5.0.tar.gz.sig).
data/Rakefile CHANGED
@@ -110,7 +110,7 @@ end
110
110
  desc 'Publish gem-file to rubygems.org'
111
111
  task :publish_gem do
112
112
  puts "Really push #{@filename_gem} to rubygems.org? [yN]"
113
- if gets.match(/^y/i)
113
+ if $stdin.gets.match(/^y/i)
114
114
  puts "Pushing..."
115
115
  `gem push #{@filename_gem}`
116
116
  else
@@ -132,7 +132,7 @@ desc 'Check if version-tag already exists'
132
132
  task :check_version do
133
133
  # Check if Schleuder::VERSION has been updated since last release
134
134
  if `git tag`.match?(/^#{@tagname}$/)
135
- $stderr.puts "Warning: Tag '#{@tagname}' already exists. Did you forget to update #{project}/version.rb?"
135
+ $stderr.puts "Warning: Tag '#{@tagname}' already exists. Did you forget to update lib/#{project}/version.rb?"
136
136
  $stderr.print "Delete tag to continue? [yN] "
137
137
  if $stdin.gets.match(/^y/i)
138
138
  `git tag -d #{@tagname}`
@@ -0,0 +1,11 @@
1
+ class AddDeliverSelfsentToList < ActiveRecord::Migration
2
+ def up
3
+ if ! column_exists?(:lists, :deliver_selfsent)
4
+ add_column :lists, :deliver_selfsent, :boolean, default: true
5
+ end
6
+ end
7
+
8
+ def down
9
+ remove_column(:lists, :deliver_selfsent)
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ class AddAutocryptHeaderToList < ActiveRecord::Migration
2
+ def up
3
+ if ! column_exists?(:lists, :include_autocrypt_header)
4
+ add_column :lists, :include_autocrypt_header, :boolean, default: true
5
+ end
6
+ end
7
+
8
+ def down
9
+ remove_column(:lists, :include_autocrypt_header)
10
+ end
11
+ end
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended that you check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(version: 20180110203100) do
14
+ ActiveRecord::Schema.define(version: 20190906194820) do
15
15
 
16
16
  create_table "lists", force: :cascade do |t|
17
17
  t.datetime "created_at"
@@ -37,6 +37,7 @@ ActiveRecord::Schema.define(version: 20180110203100) do
37
37
  t.boolean "keep_msgid", default: true
38
38
  t.boolean "bounces_drop_all", default: false
39
39
  t.boolean "bounces_notify_admins", default: true
40
+ t.boolean "deliver_selfsent", default: true
40
41
  t.boolean "include_list_headers", default: true
41
42
  t.boolean "include_openpgp_header", default: true
42
43
  t.integer "max_message_size_kb", default: 10240
@@ -44,6 +45,7 @@ ActiveRecord::Schema.define(version: 20180110203100) do
44
45
  t.boolean "forward_all_incoming_to_admins", default: false
45
46
  t.integer "logfiles_to_keep", default: 2
46
47
  t.text "internal_footer", default: ""
48
+ t.boolean "include_autocrypt_header", default: true
47
49
  end
48
50
 
49
51
  create_table "subscriptions", force: :cascade do |t|
@@ -93,6 +93,9 @@ bounces_drop_on_headers:
93
93
  # Send a notice to the list-admins whenever an email is bounced or dropped?
94
94
  bounces_notify_admins: true
95
95
 
96
+ # Include Autocrypt header into emails?
97
+ include_autocrypt_header: true
98
+
96
99
  # Include RFC-compliant List-* Headers into emails?
97
100
  include_list_headers: true
98
101
 
@@ -123,3 +126,8 @@ language: en
123
126
  # Forward a raw copy of all incoming emails to the list-admins?
124
127
  # Mainly useful for debugging.
125
128
  forward_all_incoming_to_admins: false
129
+
130
+ # Should e-mails be delivered to the original subscribed sender?
131
+ # Disabling this only works for signed e-mails; any e-mail that is unsigned
132
+ # sent to the list is treated as coming from an unknown source
133
+ deliver_selfsent: true
@@ -1,3 +1,10 @@
1
+ # default to ASCII-8BIT encoding as early as possible for external
2
+ # data.
3
+ #
4
+ # this should ensure we are able to parse most incoming
5
+ # plain text mails in different charsets.
6
+ Encoding.default_external = Encoding::UTF_8
7
+
1
8
  # Stdlib
2
9
  require 'fileutils'
3
10
  require 'singleton'
@@ -61,6 +68,9 @@ ENV["SCHLEUDER_CONFIG"] ||= '/etc/schleuder/schleuder.yml'
61
68
  ENV["SCHLEUDER_LIST_DEFAULTS"] ||= '/etc/schleuder/list-defaults.yml'
62
69
  ENV["SCHLEUDER_ENV"] ||= 'production'
63
70
  ENV["SCHLEUDER_ROOT"] = rootdir.to_s
71
+ # Ensure that gnupg never-ever tries to ask for a passphrase.
72
+ ENV["GPG_TTY"] = "/nonexistant-#{rand}"
73
+ ENV["DISPLAY"] = nil
64
74
 
65
75
  GPGME::Ctx.set_gpg_path_from_env
66
76
  GPGME::Ctx.check_gpg_version
@@ -1,6 +1,7 @@
1
1
  require 'thor'
2
2
  require 'yaml'
3
3
  require 'gpgme'
4
+ require 'charlock_holmes'
4
5
 
5
6
  require_relative '../schleuder'
6
7
  require 'schleuder/cli/subcommand_fix'
@@ -57,6 +57,10 @@ module GPGME
57
57
  "#{self.to_s}\n\n#{export(armor: true).read}"
58
58
  end
59
59
 
60
+ def minimal
61
+ export(minimal: true).to_s
62
+ end
63
+
60
64
  # Force encoding, some databases save "ASCII-8BIT" as binary data.
61
65
  alias_method :orig_fingerprint, :fingerprint
62
66
  def fingerprint
@@ -19,6 +19,7 @@ module Schleuder
19
19
  :receive_admin_only,
20
20
  :keep_msgid,
21
21
  :bounces_drop_all,
22
+ :deliver_selfsent,
22
23
  :bounces_notify_admins,
23
24
  :include_list_headers,
24
25
  :include_openpgp_header,
@@ -146,6 +147,16 @@ module Schleuder
146
147
  key.armored
147
148
  end
148
149
 
150
+ def key_minimal_base64_encoded(fingerprint=self.fingerprint)
151
+ key = keys(fingerprint).first
152
+
153
+ if key.blank?
154
+ return false
155
+ end
156
+
157
+ Base64.strict_encode64(key.minimal)
158
+ end
159
+
149
160
  def check_keys
150
161
  now = Time.now
151
162
  checkdate = now + (60 * 60 * 24 * 14) # two weeks
@@ -340,16 +351,24 @@ module Schleuder
340
351
  true
341
352
  end
342
353
 
343
- def send_to_subscriptions(mail)
354
+ def send_to_subscriptions(mail, incoming_mail=nil)
344
355
  logger.debug "Sending to subscriptions."
345
356
  mail.add_internal_footer!
346
357
  self.subscriptions.each do |subscription|
347
358
  begin
348
- if subscription.delivery_enabled
349
- subscription.send_mail(mail)
350
- else
359
+
360
+ if ! subscription.delivery_enabled
351
361
  logger.info "Not sending to #{subscription.email}: delivery is disabled."
362
+ next
363
+ end
364
+
365
+ if ! self.deliver_selfsent && incoming_mail.was_validly_signed? && ( subscription == incoming_mail.signer )
366
+ logger.info "Not sending to #{subscription.email}: delivery of self sent is disabled."
367
+ next
352
368
  end
369
+
370
+ subscription.send_mail(mail)
371
+
353
372
  rescue => exc
354
373
  msg = I18n.t('errors.delivery_error',
355
374
  { email: subscription.email, error: exc.to_s })
@@ -42,6 +42,8 @@ module Schleuder
42
42
  gpg_opts.merge!(encrypt: true, keys: { address => key.fingerprint })
43
43
  end
44
44
  mail.gpg gpg_opts
45
+
46
+ mail.header['List-Id'] = "<#{@list.email.gsub('@', '.')}>"
45
47
  end
46
48
  mail.deliver
47
49
  end
@@ -17,6 +17,7 @@ module Mail
17
17
  attr_accessor :original_message
18
18
  attr_accessor :list
19
19
  attr_accessor :protected_headers_subject
20
+ attr_writer :dynamic_pseudoheaders
20
21
 
21
22
  # TODO: This should be in initialize(), but I couldn't understand the
22
23
  # strange errors about wrong number of arguments when overriding
@@ -44,9 +45,7 @@ module Mail
44
45
  # might be gone (e.g. request-keywords that delete subscriptions or
45
46
  # keys).
46
47
  new.signer
47
- self.dynamic_pseudoheaders.each do |str|
48
- new.add_pseudoheader(str)
49
- end
48
+ new.dynamic_pseudoheaders = self.dynamic_pseudoheaders.dup
50
49
 
51
50
  # Store previously protected subject for later access.
52
51
  # mail-gpg pulls headers from the decrypted mime parts "up" into the main
@@ -206,11 +205,15 @@ module Mail
206
205
  @recipient.match(/-bounce@/).present? ||
207
206
  # Empty Return-Path
208
207
  self.return_path.to_s == '<>' ||
209
- # Auto-Submitted exists and does not equal 'no' and no cron header
210
- # present, as cron emails have the auto-submitted header.
208
+ # Auto-Submitted exists and does not equal 'no' and:
209
+ # - no cron header is present
210
+ # - no Jenkins job notification header is present
211
+ # as these emails have the auto-submitted header.
211
212
  ( self['Auto-Submitted'].present? && \
212
213
  self['Auto-Submitted'].to_s.downcase != 'no' && \
213
- !self['X-Cron-Env'].present?)
214
+ !self['X-Cron-Env'].present? && \
215
+ !self['X-Jenkins-Job'].present? && \
216
+ self.subject.to_s !~ /\A\*\*\* SECURITY information.*\*\*\*\Z/)
214
217
  end
215
218
 
216
219
  def keywords
@@ -244,11 +247,11 @@ module Mail
244
247
  # decide itself how to encode, it works. If we don't, some
245
248
  # character-sequences are not properly re-encoded.
246
249
  part.content_transfer_encoding = nil
247
- # Make the converted strings (now UTF-8) match what mime-part's headers say,
248
- # fall back to US-ASCII if none is set.
249
- # https://tools.ietf.org/html/rfc2046#section-4.1.2
250
- # -> Default charset is US-ASCII
251
- part.body = lines.compact.join.encode(part.charset||'US-ASCII')
250
+
251
+ # Set the right charset on the now parsed body
252
+ new_body = lines.compact.join
253
+ part.charset = new_body.encoding.to_s
254
+ part.body = new_body
252
255
 
253
256
  @keywords
254
257
  end
@@ -266,20 +269,17 @@ module Mail
266
269
  end
267
270
 
268
271
  def add_pseudoheader(string_or_key, value=nil)
269
- @dynamic_pseudoheaders ||= []
270
- if value.present?
271
- @dynamic_pseudoheaders << make_pseudoheader(string_or_key, value)
272
- else
273
- @dynamic_pseudoheaders << string_or_key.to_s
274
- end
272
+ dynamic_pseudoheaders << make_pseudoheader(string_or_key, value)
275
273
  end
276
274
 
277
275
  def make_pseudoheader(key, value)
278
- "#{key.to_s.camelize}: #{value.to_s}"
276
+ output = "#{key.to_s.camelize}: #{value.to_s}"
277
+ # wrap lines after 76 with 2 indents
278
+ output.gsub(/(.{1,76})( +|$)\n?/, " \\1\n").chomp.lstrip
279
279
  end
280
280
 
281
281
  def dynamic_pseudoheaders
282
- @dynamic_pseudoheaders || []
282
+ @dynamic_pseudoheaders ||= []
283
283
  end
284
284
 
285
285
  def signature_state
@@ -330,7 +330,8 @@ module Mail
330
330
  end
331
331
 
332
332
  def pseudoheaders(list)
333
- (standard_pseudoheaders(list) + dynamic_pseudoheaders).flatten.join("\n") + "\n"
333
+ separator = '------------------------------------------------------------------------------'
334
+ (standard_pseudoheaders(list) + dynamic_pseudoheaders).flatten.join("\n") + "\n" + separator + "\n"
334
335
  end
335
336
 
336
337
  def add_msgids(list, orig)
@@ -345,6 +346,14 @@ module Mail
345
346
  end
346
347
 
347
348
  def add_list_headers(list)
349
+ if list.include_autocrypt_header
350
+ # Inject whitespaces, to let Mail break the string at these points
351
+ # leading to correct wrapping.
352
+ keydata = list.key_minimal_base64_encoded.gsub(/(.{78})/, '\1 ')
353
+
354
+ self['Autocrypt'] = "addr=#{list.email}; prefer-encrypt=mutual; keydata=#{keydata}"
355
+ end
356
+
348
357
  if list.include_list_headers
349
358
  self['List-Id'] = "<#{list.email.gsub('@', '.')}>"
350
359
  self['List-Owner'] = "<mailto:#{list.owner_address}> (Use list's public key)"
@@ -1,16 +1,12 @@
1
1
  module Schleuder
2
2
  module ListPlugins
3
3
  def self.attach_listkey(arguments, list, mail)
4
- filename = "#{list.fingerprint}.pgpkey"
5
- # "Mail" only really converts to multipart if the content-type is blank.
6
- mail.content_type = nil
7
- mail.add_file({
8
- filename: filename,
9
- content: list.export_key
10
- })
11
- mail.attachments[filename].content_type = 'application/pgp-keys'
12
- mail.attachments[filename].content_description = "OpenPGP public key of #{list.email}"
13
- mail.attachments[filename].content_disposition = "attachment; filename=#{filename}"
4
+ new_part = Mail::Part.new
5
+ new_part.body = list.export_key
6
+ new_part.content_type = 'application/pgp-keys'
7
+ new_part.content_description = "OpenPGP public key of #{list.email}"
8
+ new_part.content_disposition = "attachment; filename=#{list.fingerprint}.pgpkey"
9
+ mail.add_part new_part
14
10
  nil
15
11
  end
16
12
  end
@@ -56,6 +56,9 @@ module Schleuder
56
56
 
57
57
  # Only continue if all recipients are still here.
58
58
  if recip_map.size < arguments.size
59
+ recip_map.keys.each do |aborted_sender|
60
+ mail.add_pseudoheader(:error, I18n.t("plugins.resend.aborted", email: aborted_sender))
61
+ end
59
62
  return
60
63
  end
61
64
 
@@ -117,22 +120,22 @@ module Schleuder
117
120
  Array(recipients).inject({}) do |hash, email|
118
121
  keys = mail.list.keys(email)
119
122
  # Exclude unusable keys.
120
- keys.select! { |key| key.usable_for?(:encrypt) }
121
- case keys.size
123
+ usable_keys = keys.select { |key| key.usable_for?(:encrypt) }
124
+ case usable_keys.size
122
125
  when 1
123
- hash[email] = keys.first
126
+ hash[email] = usable_keys.first
124
127
  when 0
125
128
  if encrypted_only
126
129
  # Don't add the email to the result to exclude it from the
127
130
  # recipients.
128
- add_keys_error(mail, email, keys.size)
131
+ add_resend_msg(mail, email, :error, 'not_resent_no_keys', usable_keys.size, keys.size)
129
132
  else
130
133
  hash[email] = ''
131
134
  end
132
135
  else
133
136
  # Always report this situation, regardless of sending or not. It's
134
137
  # bad and should be fixed.
135
- add_keys_error(mail, email, keys.size)
138
+ add_resend_msg(mail, email, :notice, 'not_resent_encrypted_no_keys', usable_keys.size, keys.size)
136
139
  if ! encrypted_only
137
140
  hash[email] = ''
138
141
  end
@@ -152,8 +155,8 @@ module Schleuder
152
155
  gpg_opts
153
156
  end
154
157
 
155
- def self.add_keys_error(mail, email, keys_size)
156
- mail.add_pseudoheader(:error, I18n.t("plugins.resend.not_resent_no_keys", email: email, num_keys: keys_size))
158
+ def self.add_resend_msg(mail, email, severity, msg, usable_keys_size, all_keys_size)
159
+ mail.add_pseudoheader(severity, I18n.t("plugins.resend.#{msg}", email: email, usable_keys: usable_keys_size, all_keys: all_keys_size))
157
160
  end
158
161
 
159
162
  def self.add_error_header(mail, recipients_map)
@@ -163,15 +166,15 @@ module Schleuder
163
166
  def self.add_resent_headers(mail, recipients_map, to_or_cc, sent_encrypted)
164
167
  if sent_encrypted
165
168
  prefix = I18n.t('plugins.resend.encrypted_to')
166
- str = recipients_map.map do |email, key|
169
+ str = "\n" + recipients_map.map do |email, key|
167
170
  "#{email} (#{key.fingerprint})"
168
- end.join(', ')
171
+ end.join(",\n")
169
172
  else
170
173
  prefix = I18n.t('plugins.resend.unencrypted_to')
171
- str = recipients_map.keys.join(', ')
174
+ str = ' ' + recipients_map.keys.join(", ")
172
175
  end
173
176
  headername = resent_header_name(to_or_cc)
174
- mail.add_pseudoheader(headername, "#{prefix} #{str}")
177
+ mail.add_pseudoheader(headername, "#{prefix}#{str}")
175
178
  end
176
179
 
177
180
  def self.resent_header_name(to_or_cc)
@@ -5,15 +5,43 @@ module Schleuder
5
5
  return error if error
6
6
 
7
7
  logger.info "Parsing incoming email."
8
+
9
+ # is it valid utf-8?
10
+ msg_scrubbed = false
11
+ unless msg.valid_encoding?
12
+ logger.warn "Converting message due to invalid characters"
13
+ detection = CharlockHolmes::EncodingDetector.detect(msg)
14
+ begin
15
+ msg = CharlockHolmes::Converter.convert(msg, detection[:encoding], 'UTF-8')
16
+ rescue ArgumentError
17
+ # it looks like even icu wasn't able to convert
18
+ # so we scrub the invalid characters to be able to
19
+ # at least parse the message somehow. Though this might
20
+ # result in data loss.
21
+ logger.warn "Scrubbing message due to invalid characters"
22
+ msg = msg.scrub
23
+ msg_scrubbed = true
24
+ end
25
+ end
26
+
8
27
  @mail = Mail.create_message_to_list(msg, recipient, list)
9
28
 
29
+ if msg_scrubbed
30
+ @mail.add_pseudoheader(:note, I18n.t("pseudoheaders.scrubbed_message"))
31
+ end
32
+
10
33
  error = run_filters('pre')
11
34
  return error if error
12
35
 
13
36
  begin
14
37
  # This decrypts, verifies, etc.
15
38
  @mail = @mail.setup
16
- rescue GPGME::Error::DecryptFailed
39
+
40
+ rescue GPGME::Error::BadPassphrase,
41
+ GPGME::Error::DecryptFailed,
42
+ GPGME::Error::NoData,
43
+ GPGME::Error::NoSecretKey
44
+
17
45
  logger.warn "Decryption of incoming message failed."
18
46
  return Errors::DecryptionFailed.new(list)
19
47
  end
@@ -46,7 +74,7 @@ module Schleuder
46
74
  # Subscriptions
47
75
  logger.debug "Creating clean copy of message"
48
76
  copy = @mail.clean_copy(list.headers_to_meta.any?)
49
- list.send_to_subscriptions(copy)
77
+ list.send_to_subscriptions(copy, @mail)
50
78
  nil
51
79
  end
52
80
 
@@ -1,3 +1,3 @@
1
1
  module Schleuder
2
- VERSION = '3.4.1'
2
+ VERSION = '3.5.0'
3
3
  end
@@ -121,7 +121,9 @@ de:
121
121
  Oder, um einen Schlüssel per HTTP von einem Server zu laden:
122
122
  X-FETCH-KEY: https://example.org/keys/mykey.asc
123
123
  resend:
124
- not_resent_no_keys: Resending an <%{email}> fehlgeschlagen (%{num_keys} Schlüssel gefunden und unverschlüsseltes Senden verboten).
124
+ not_resent_no_keys: Resending an <%{email}> fehlgeschlagen (%{all_keys} Schlüssel gefunden, davon %{usable_keys} nutzbar. Unverschlüsseltes Senden verboten).
125
+ not_resent_encrypted_no_keys: Verschlüsseltes Resending an <%{email}> fehlgeschlagen (%{all_keys} Schlüssel gefunden, davon %{usable_keys} nutzbar).
126
+ aborted: Resending an <%{email}> abgebrochen aufgrund anderer Probleme.
125
127
  encrypted_to: Verschlüsselt an
126
128
  unencrypted_to: Unverschlüsselt an
127
129
  invalid_recipient: "Ungültige Emailadresse für resend: %{address}"
@@ -250,6 +252,7 @@ de:
250
252
  fetch_key:
251
253
  invalid_input: "Ungültige Angabe. Gültig sind: URLs, OpenPGP-Fingerabdrücke, oder Emailadressen."
252
254
  pseudoheaders:
255
+ scrubbed_message: Diese Email enthielt ungültige Zeichen, die aus Verarbeitungsgründen möglicherweise entfernt wurden.
253
256
  stripped_html_from_multialt: Diese Email enthielt einen alternativen HTML-Teil, der PGP-Daten beinhaltete. Der HTML-Teil wurde entfernt, um die Email sauberer analysieren zu können.
254
257
  stripped_html_from_multialt_with_keywords: Diese Email enthielt Schlüsselwörter und einen alternativen HTML-Teil. Der HTML-Teil wurde entfernt, um zu verhindern dass diese Schlüsselwörter Aussenstehenden bekannt werden.
255
258
  signature_states:
@@ -125,7 +125,9 @@ en:
125
125
  Or, to fetch a key keys by URL:
126
126
  X-FETCH-KEY: https://example.org/keys/mykey.asc
127
127
  resend:
128
- not_resent_no_keys: Resending to <%{email}> failed (%{num_keys} keys found and unencrypted sending disallowed).
128
+ not_resent_no_keys: Resending to <%{email}> failed (%{all_keys} keys found, of which %{usable_keys} can be used. Unencrypted sending not allowed).
129
+ not_resent_encrypted_no_keys: Resending as encrypted email to <%{email}> failed (%{all_keys} keys found, of which %{usable_keys} can be used).
130
+ aborted: Resending to <%{email}> aborted due to other errors.
129
131
  encrypted_to: Encrypted to
130
132
  unencrypted_to: Unencrypted to
131
133
  invalid_recipient: "Invalid email-address for resending: %{address}"
@@ -254,6 +256,7 @@ en:
254
256
  fetch_key:
255
257
  invalid_input: "Invalid input. Allowed are: URLs, OpenPGP-fingerprints, or email-addresses."
256
258
  pseudoheaders:
259
+ scrubbed_message: This message included invalid characters, which might have been removed to be able to process the message properly.
257
260
  stripped_html_from_multialt: This message included an alternating HTML-part that contained PGP-data. The HTML-part was removed to enable parsing the message more properly.
258
261
  stripped_html_from_multialt_with_keywords: This message included keywords and an alternating HTML-part. The HTML-part was removed to prevent the disclosure of these keywords to third parties.
259
262
  signature_states:
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schleuder
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.1
4
+ version: 3.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - schleuder dev team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-16 00:00:00.000000000 Z
11
+ date: 2020-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gpgme
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '2.0'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 2.0.13
22
+ version: 2.0.19
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: '2.0'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 2.0.13
32
+ version: 2.0.19
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: mail
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -51,9 +51,9 @@ dependencies:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0.3'
54
- - - ">="
54
+ - - "<"
55
55
  - !ruby/object:Gem::Version
56
- version: 0.3.3
56
+ version: 0.4.3
57
57
  type: :runtime
58
58
  prerelease: false
59
59
  version_requirements: !ruby/object:Gem::Requirement
@@ -61,9 +61,9 @@ dependencies:
61
61
  - - "~>"
62
62
  - !ruby/object:Gem::Version
63
63
  version: '0.3'
64
- - - ">="
64
+ - - "<"
65
65
  - !ruby/object:Gem::Version
66
- version: 0.3.3
66
+ version: 0.4.3
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: activerecord
69
69
  requirement: !ruby/object:Gem::Requirement
@@ -176,6 +176,20 @@ dependencies:
176
176
  - - "~>"
177
177
  - !ruby/object:Gem::Version
178
178
  version: '1'
179
+ - !ruby/object:Gem::Dependency
180
+ name: charlock_holmes
181
+ requirement: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - "~>"
184
+ - !ruby/object:Gem::Version
185
+ version: 0.7.6
186
+ type: :runtime
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: 0.7.6
179
193
  - !ruby/object:Gem::Dependency
180
194
  name: rspec
181
195
  requirement: !ruby/object:Gem::Requirement
@@ -275,6 +289,8 @@ files:
275
289
  - db/migrate/20160501172700_fix_headers_to_meta_defaults.rb
276
290
  - db/migrate/20170713215059_add_internal_footer_to_list.rb
277
291
  - db/migrate/20180110203100_add_sig_enc_to_headers_to_meta_defaults.rb
292
+ - db/migrate/20180723173900_add_deliver_selfsent_to_list.rb
293
+ - db/migrate/20190906194820_add_autocrypt_header_to_list.rb
278
294
  - db/schema.rb
279
295
  - etc/init.d/schleuder-api-daemon
280
296
  - etc/list-defaults.yml
@@ -391,7 +407,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
391
407
  - !ruby/object:Gem::Version
392
408
  version: '0'
393
409
  requirements: []
394
- rubyforge_project: "[none]"
410
+ rubyforge_project:
395
411
  rubygems_version: 2.7.6.2
396
412
  signing_key:
397
413
  specification_version: 4