schleuder 4.0.0 → 4.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71fae6520fb76978d0292533c7e4b1d4ed72cd881ba81be71eacd2ab1811d5e2
4
- data.tar.gz: 5542044280bcd7bb2875bdc443c37146c490fe186a16c9d2449d8d9dab8131c9
3
+ metadata.gz: c44b12c722680d91cee45a80ae2ee6a4ff47a9544dfd171cc83a5549bdd72be2
4
+ data.tar.gz: 77773ef59d05b1faff86cf2fe5d22ef657cd5683e6184db1a55b28d1592b07d2
5
5
  SHA512:
6
- metadata.gz: 8c724133f39be4c6af72c61d6f26e95bcf4f1a99f6184ac845d55a36d53eaea60fc78273950609f3bbae7fc4faec72005adf9324ab5186d505be58495cb58582
7
- data.tar.gz: 608978e0555f93ab3e4f7aefb67063df9e0fd8f7b06b28d20ea8f869384ba7ed0e08ba0d071ca81fccd2f269656907413b82fce930c6535aff30f60ef8ad4f95
6
+ metadata.gz: eb351c776f1773cf0dd5ef0f04f310fe70a0155d9344fd75eb78fce9b0d69cad0f0d9bfad664d1a8ab004a55c2d29a849cf1ea2cd0a295c61c3b56b96a25d9a8
7
+ data.tar.gz: 97ab8283c694fac04196ee752ffe3153f57acb1e37c8754c8c9f1840fbf5109d47fac3426aa8fa3f168341efbfcf38c8d4292e9a360b3d81dff5d9231ac9b700
data/README.md CHANGED
@@ -1,10 +1,9 @@
1
- Schleuder, version 3
1
+ Schleuder
2
2
  ======================================
3
3
 
4
4
  Schleuder is a gpg-enabled mailing list manager with resending-capabilities. Subscribers can communicate encrypted (and pseudonymously) among themselves, receive emails from non-subscribers and send emails to non-subscribers via the list.
5
5
 
6
- Version 3 of schleuder is a complete rewrite, which aims to be more robust, flexible, and internationalized. It
7
- also provides an API for the optional web interface called [schleuder-web](https://0xacab.org/schleuder/schleuder-web).
6
+ It aims to be robust, flexible, internationalized and also provides an API for the optional web interface called [schleuder-web](https://0xacab.org/schleuder/schleuder-web).
8
7
 
9
8
  For more details see <https://schleuder.org/docs/>.
10
9
 
@@ -17,21 +16,10 @@ Requirements
17
16
  * openssl
18
17
  * icu
19
18
 
20
- *If you use Debian buster or CentOS 7, please have a look at the [installation docs](https://schleuder.org/schleuder/docs/server-admins.html#installation). We do provide packages for those platforms, which simplify the installation a lot.*
21
-
22
- *🛈 A note regarding Ubuntu: All Ubuntu versions up to and including 17.10 don't meet the requirements with their packaged versions of gnupg! To run Schleuder on Ubuntu you currently have to install a more recent version of gnupg manually. Only Ubuntu 18.04 ("bionic") provides modern enough versions of Schleuder's requirements.*
23
-
24
- On systems that base on Debian 10 ("buster"), install the dependencies via
25
-
26
- apt-get install ruby-dev gnupg2 libgpgme-dev libsqlite3-dev libssl-dev build-essential libicu-dev
27
-
19
+ *If you use Debian buster, CentOS 7 or Archlinux, please have a look at the [installation docs](https://schleuder.org/schleuder/docs/server-admins.html#installation). We do provide packages for those platforms, which simplify the installation a lot.*
28
20
 
29
21
  We **recommend** to also run a random number generator like [haveged](http://www.issihosts.com/haveged/). This ensures Schleuder won't be blocked by lacking entropy, which otherwise might happen especially during key generation.
30
22
 
31
- On Debian based systems, install it via
32
-
33
- apt-get install haveged
34
-
35
23
 
36
24
  Additionally these **rubygems** are required (will be installed automatically unless present):
37
25
 
@@ -48,15 +36,15 @@ Additionally these **rubygems** are required (will be installed automatically un
48
36
  Installing Schleuder
49
37
  ------------
50
38
 
51
- 1. Download [the gem](https://schleuder.org/download/schleuder-4.0.0.gem) and [the OpenPGP-signature](https://schleuder.org/download/schleuder-4.0.0.gem.sig) and verify:
39
+ 1. Download [the gem](https://schleuder.org/download/schleuder-4.0.3.gem) and [the OpenPGP-signature](https://schleuder.org/download/schleuder-4.0.3.gem.sig) and verify:
52
40
  ```
53
41
  gpg --recv-key 0xB3D190D5235C74E1907EACFE898F2C91E2E6E1F3
54
- gpg --verify schleuder-4.0.0.gem.sig
42
+ gpg --verify schleuder-4.0.3.gem.sig
55
43
  ```
56
44
 
57
45
  2. If all went well install the gem:
58
46
  ```
59
- gem install schleuder-4.0.0.gem
47
+ gem install schleuder-4.0.3.gem
60
48
  ```
61
49
 
62
50
  3. Set up schleuder:
@@ -146,4 +134,4 @@ GNU GPL 3.0. Please see [LICENSE.txt](LICENSE.txt).
146
134
  Alternative Download
147
135
  --------------------
148
136
 
149
- Alternatively to the gem-files you can download the latest release as [a tarball](https://schleuder.org/download/schleuder-4.0.0.tar.gz) and [its OpenPGP-signature](https://schleuder.org/download/schleuder-4.0.0.tar.gz.sig).
137
+ Alternatively to the gem-files you can download the latest release as [a tarball](https://schleuder.org/download/schleuder-4.0.3.tar.gz) and [its OpenPGP-signature](https://schleuder.org/download/schleuder-4.0.3.tar.gz.sig).
data/Rakefile CHANGED
@@ -7,6 +7,9 @@ require_relative "lib/#{project}.rb"
7
7
  @filename_gem = "#{@tagname}.gem"
8
8
  @filename_tarball = "#{@tagname}.tar.gz"
9
9
 
10
+ # Make ActiveRecord's tasks usable for us (without this, those tasks try to run
11
+ # in the "default_env" environment, which is not configured).
12
+ ENV['RACK_ENV'] ||= ENV['SCHLEUDER_ENV']
10
13
  load 'active_record/railties/databases.rake'
11
14
 
12
15
  # Configure ActiveRecord
@@ -120,7 +123,7 @@ end
120
123
 
121
124
  desc 'Build and sign a tarball'
122
125
  task :build_tarball do
123
- `git archive --format tar.gz --prefix "#{@tagname}/" -o #{@filename_tarball} master`
126
+ `git archive --format tar.gz --prefix "#{@tagname}/" -o #{@filename_tarball} main`
124
127
  end
125
128
 
126
129
  desc 'Describe manual release-tasks'
@@ -0,0 +1,46 @@
1
+ # Since ActiveRecord >= 6.0, the SQLite3 connection adapter relies on boolean
2
+ # serialization to use 1 and 0, but does not natively recognize 't' and 'f' as
3
+ # booleans were previously serialized.
4
+ #
5
+ # Accordingly, this migration handles conversion of both column defaults and
6
+ # stored data provided by a user.
7
+ #
8
+ # In contrast to other migrations, only a 'forward' method is provided, a
9
+ # mechanism to 'reverse' is not. Given the nature of this migration, the later
10
+ # is not really required.
11
+ #
12
+ # Unfortunately, we missed this breaking change when bumping ActiveRecord to >=
13
+ # 6.0 in Schleuder version 4.0. This caused quite some work upstream, but also
14
+ # in downstream environments and, last but not least, at the side of users.
15
+ #
16
+ # We should extend our CI to explicitly test, and ensure things work as
17
+ # expected, if running a Schleuder setup in real world. As of now, we don't
18
+ # ensure data provided by a user in Schleuder version x still works after
19
+ # upgrading to version y.
20
+
21
+ class ChangeBooleanValuesToIntegers < ActiveRecord::Migration[6.0]
22
+ class Lists < ActiveRecord::Base
23
+ end
24
+
25
+ class Subscriptions < ActiveRecord::Base
26
+ end
27
+
28
+ def up
29
+ [Lists, Subscriptions].each do |table|
30
+ unless table.connection.is_a?(ActiveRecord::ConnectionAdapters::SQLite3Adapter)
31
+ return
32
+ end
33
+
34
+ bool_columns_defaults = table.columns.select { |column| column.type == :boolean }.map{ |column| [column.name, column.default] }
35
+
36
+ bool_columns_defaults.each do |column_name, column_default|
37
+ column_bool = ActiveRecord::Type::Boolean.new.deserialize(column_default)
38
+
39
+ change_column_default :"#{table.table_name}", :"#{column_name}", column_bool
40
+
41
+ table.where("#{column_name} = 'f'").update_all("#{column_name}": 0)
42
+ table.where("#{column_name} = 't'").update_all("#{column_name}": 1)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,28 @@
1
+ # It seems, the change to ActiveRecord >= 6.0 makes this necessary.
2
+ # Without doing this, the auto-generated database schema file would drop
3
+ # these limits, if running migrations.
4
+ #
5
+ # In contrast to other migrations, only a 'forward' method is provided, a
6
+ # mechanism to 'reverse' is not. Given the nature of this migration, the later
7
+ # is not really required.
8
+ #
9
+ # This has been an upstream issue for quite some time. For details, see
10
+ # https://github.com/rails/rails/issues/19001.
11
+
12
+ class AddLimitsToStringColumns < ActiveRecord::Migration[6.0]
13
+ class Lists < ActiveRecord::Base
14
+ end
15
+
16
+ class Subscriptions < ActiveRecord::Base
17
+ end
18
+
19
+ def up
20
+ [Lists, Subscriptions].each do |table|
21
+ string_columns = table.columns.select { |column| column.type == :string }.map(&:name)
22
+
23
+ string_columns.each do |column_name|
24
+ change_column :"#{table.table_name}", :"#{column_name}", :string, :limit => 255
25
+ end
26
+ end
27
+ end
28
+ end
data/db/schema.rb CHANGED
@@ -2,15 +2,15 @@
2
2
  # of editing this file, please use the migrations feature of Active Record to
3
3
  # incrementally modify your database, and then regenerate this schema definition.
4
4
  #
5
- # This file is the source Rails uses to define your schema when running `rails
6
- # db:schema:load`. When creating a new database, `rails db:schema:load` tends to
5
+ # This file is the source Rails uses to define your schema when running `bin/rails
6
+ # db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
7
7
  # be faster and is potentially less error prone than running all of your
8
8
  # migrations from scratch. Old migrations may fail to apply correctly if those
9
9
  # migrations use external dependencies or application code.
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- ActiveRecord::Schema.define(version: 2020_01_18_170110) do
13
+ ActiveRecord::Schema.define(version: 2021_11_07_151309) do
14
14
 
15
15
  create_table "lists", force: :cascade do |t|
16
16
  t.datetime "created_at"
data/lib/schleuder/cli.rb CHANGED
@@ -70,7 +70,6 @@ module Schleuder
70
70
 
71
71
  desc 'refresh_keys [list1@example.com]', 'Refresh all keys of all list from the keyservers sequentially (one by one or on the passed list). (This is supposed to be run from cron or systemd weekly.)'
72
72
  def refresh_keys(list=nil)
73
- GPGME::Ctx.send_notice_if_gpg_does_not_know_import_filter
74
73
  work_on_lists(:refresh_keys, list)
75
74
  permission_notice
76
75
  end
@@ -133,7 +132,7 @@ module Schleuder
133
132
  def shellexec(cmd)
134
133
  result = `#{cmd} 2>&1`
135
134
  if $?.exitstatus > 0
136
- exit $?.exitstatus
135
+ fatal result, $?.exitstatus
137
136
  end
138
137
  result
139
138
  end
@@ -4,13 +4,7 @@ module Schleuder
4
4
  class Conf
5
5
  include Singleton
6
6
 
7
- # since the regexp got only included into stdlib 2.2
8
- # TODO: remove once 2.1 support dropped
9
- if RUBY_VERSION < '2.2'
10
- EMAIL_REGEXP = /\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z/
11
- else
12
- EMAIL_REGEXP = URI::MailTo::EMAIL_REGEXP
13
- end
7
+ EMAIL_REGEXP = URI::MailTo::EMAIL_REGEXP
14
8
  # TODO: drop v3 keys and only accept length of 40
15
9
  FINGERPRINT_REGEXP = /\A(0x)?[a-f0-9]{32}([a-f0-9]{8})?\z/i
16
10
 
@@ -13,11 +13,7 @@ module Schleuder
13
13
  list.logger.debug "Calling filter #{cmd}"
14
14
  response = Filters.send(cmd, list, mail)
15
15
  if stop?(response)
16
- if bounce?(response, mail)
17
- return response
18
- else
19
- return nil
20
- end
16
+ return response
21
17
  end
22
18
  end
23
19
  nil
@@ -32,31 +28,6 @@ module Schleuder
32
28
  response.kind_of?(StandardError)
33
29
  end
34
30
 
35
- def bounce?(response, mail)
36
- if list.bounces_drop_all
37
- list.logger.debug 'Dropping bounce as configurated'
38
- notify_admins(I18n.t('.bounces_drop_all'), mail.original_message)
39
- return false
40
- end
41
-
42
- list.bounces_drop_on_headers.each do |key, value|
43
- if mail[key].to_s.match(/#{value}/i)
44
- list.logger.debug "Incoming message header key '#{key}' matches value '#{value}': dropping the bounce."
45
- notify_admins(I18n.t('.bounces_drop_on_headers', key: key, value: value), mail.original_message)
46
- return false
47
- end
48
- end
49
-
50
- list.logger.debug 'Bouncing message'
51
- true
52
- end
53
-
54
- def notify_admins(reason, original_message)
55
- if list.bounces_notify_admins?
56
- list.logger.notify_admin reason, original_message, I18n.t('notice')
57
- end
58
- end
59
-
60
31
  def load_filters
61
32
  list.logger.debug "Loading #{filter_type}_decryption filters"
62
33
  sorted_filters.map do |filter_name|
@@ -134,7 +134,6 @@ module GPGME
134
134
  arguments, error = fetch_key_gpg_arguments_for(input)
135
135
  return error if error
136
136
 
137
- self.class.send_notice_if_gpg_does_not_know_import_filter
138
137
  gpgerr, gpgout, exitcode = self.class.gpgcli("#{import_filter_arg} #{arguments}")
139
138
 
140
139
  # Unfortunately gpg doesn't exit with code > 0 if `--fetch-key` fails.
@@ -229,21 +228,6 @@ module GPGME
229
228
  raise 'Need gpg in $PATH or in $GPGBIN'
230
229
  end
231
230
 
232
- def self.spawn_daemon(name, args)
233
- delete_daemon_socket(name)
234
- cmd = "#{name} #{args} --daemon > /dev/null 2>&1"
235
- if ! system(cmd)
236
- return [false, "#{name} exited with code #{$?}"]
237
- end
238
- end
239
-
240
- def self.delete_daemon_socket(name)
241
- path = File.join(ENV['GNUPGHOME'], "S.#{name}")
242
- if File.exist?(path)
243
- File.delete(path)
244
- end
245
- end
246
-
247
231
  def keyserver_arg
248
232
  if Conf.keyserver.present?
249
233
  "--keyserver #{Conf.keyserver}"
@@ -252,24 +236,8 @@ module GPGME
252
236
  end
253
237
  end
254
238
 
255
- def self.gpg_knows_import_filter?
256
- sufficient_gpg_version?('2.1.15')
257
- end
258
-
259
239
  def import_filter_arg
260
- if self.class.gpg_knows_import_filter?
261
- %{ --import-filter drop-sig='sig_created_d > 0000-00-00'}
262
- end
263
- end
264
-
265
- def self.send_notice_if_gpg_does_not_know_import_filter
266
- if ! gpg_knows_import_filter?
267
- Schleuder.logger.notify_superadmin(
268
- subject: 'Schleuder installation problem',
269
- message: "Your version of GnuPG is very old, please update!\n\nWith your version of GnuPG we can not protect your setup against signature flooding. Please update to at least version 2.1.15 to fix this problem. See <https://dkg.fifthhorseman.net/blog/openpgp-certificate-flooding.html> for details on the background."
270
- )
271
- ''
272
- end
240
+ %{ --import-filter drop-sig='sig_created_d > 0000-00-00'}
273
241
  end
274
242
  end
275
243
  end
@@ -125,7 +125,7 @@ module Schleuder
125
125
 
126
126
  def import_keys_from_attachments
127
127
  @mail.attachments.map do |attachment|
128
- import_from_string(attachment.body.to_s)
128
+ import_from_string(attachment.body.raw_source)
129
129
  end
130
130
  end
131
131
 
@@ -7,13 +7,9 @@ module Schleuder
7
7
  class Logger < Syslog::Logger
8
8
  include LoggerNotifications
9
9
  def initialize
10
- if RUBY_VERSION.to_f < 2.1
11
- super('Schleuder')
12
- else
13
- super('Schleuder', Syslog::LOG_MAIL)
14
- end
10
+ super('Schleuder', Syslog::LOG_MAIL)
15
11
  # We need some sender-address different from the superadmin-address.
16
- @from = "#{`whoami`.chomp}@#{`hostname`.chomp}"
12
+ @from = "#{Etc.getlogin}@#{Socket.gethostname}"
17
13
  @adminaddresses = Conf.superadmin
18
14
  @level = ::Logger.const_get(Conf.log_level.upcase)
19
15
  end
@@ -0,0 +1,33 @@
1
+ module Mail
2
+ module Gpg
3
+ class SignPart < Mail::Part
4
+ # Copied verbatim from mail-gpg v.0.4.2. This code was changed in
5
+ # <https://github.com/jkraemer/mail-gpg/commit/5fded41ccee4a58f848a2f8e7bd53d11236f8984>,
6
+ # which breaks verifying some encapsulated (signed-then-encrypted)
7
+ # messages. See
8
+ # <https://github.com/jkraemer/mail-gpg/pull/40#issue-95776382> for
9
+ # details.
10
+ def self.verify_signature(plain_part, signature_part, options = {})
11
+ if !(signature_part.has_content_type? &&
12
+ ('application/pgp-signature' == signature_part.mime_type))
13
+ return false
14
+ end
15
+
16
+ # Work around the problem that plain_part.raw_source prefixes an
17
+ # erroneous CRLF, <https://github.com/mikel/mail/issues/702>.
18
+ if ! plain_part.raw_source.empty?
19
+ plaintext = [ plain_part.header.raw_source,
20
+ "\r\n\r\n",
21
+ plain_part.body.raw_source
22
+ ].join
23
+ else
24
+ plaintext = plain_part.encoded
25
+ end
26
+
27
+ signature = signature_part.body.encoded
28
+ GpgmeHelper.sign_verify(plaintext, signature, options)
29
+ end
30
+ end
31
+ end
32
+ end
33
+
@@ -31,7 +31,13 @@ module Schleuder
31
31
  end
32
32
 
33
33
  error = run_filters('pre')
34
- return error if error
34
+ if error
35
+ if bounce?(error, @mail)
36
+ return error
37
+ else
38
+ return nil
39
+ end
40
+ end
35
41
 
36
42
  begin
37
43
  # This decrypts, verifies, etc.
@@ -48,7 +54,13 @@ module Schleuder
48
54
  end
49
55
 
50
56
  error = run_filters('post')
51
- return error if error
57
+ if error
58
+ if bounce?(error, @mail)
59
+ return error
60
+ else
61
+ return nil
62
+ end
63
+ end
52
64
 
53
65
  if ! @mail.was_validly_signed?
54
66
  logger.debug 'Message was not validly signed, adding subject_prefix_in'
@@ -85,16 +97,34 @@ module Schleuder
85
97
  @list
86
98
  end
87
99
 
88
- def run_filters(filter_type)
89
- error = filters_runner(filter_type).run(@mail)
90
- if error
91
- if list.bounces_notify_admins?
92
- text = "#{I18n.t('.bounces_notify_admins')}\n\n#{error}"
93
- # TODO: raw_source is mostly blank?
94
- logger.notify_admin text, @mail.original_message, I18n.t('notice')
100
+ def notify_admins(reason, original_message)
101
+ if list.bounces_notify_admins
102
+ list.logger.notify_admin reason, original_message, I18n.t('notice')
103
+ end
104
+ end
105
+
106
+ def bounce?(response, mail)
107
+ if list.bounces_drop_all
108
+ list.logger.debug 'Dropping bounce as configurated'
109
+ notify_admins(I18n.t('.bounces_drop_all'), mail.original_message)
110
+ return false
111
+ end
112
+
113
+ list.bounces_drop_on_headers.each do |key, value|
114
+ if mail[key].to_s.match(/#{value}/i)
115
+ list.logger.debug "Incoming message header key '#{key}' matches value '#{value}': dropping the bounce."
116
+ notify_admins(I18n.t('.bounces_drop_on_headers', key: key, value: value), mail.original_message)
117
+ return false
95
118
  end
96
- return error
97
119
  end
120
+
121
+ list.logger.debug 'Bouncing message'
122
+ notify_admins("#{I18n.t('.bounces_notify_admins')}\n\n#{response}", mail.original_message)
123
+ true
124
+ end
125
+
126
+ def run_filters(filter_type)
127
+ filters_runner(filter_type).run(@mail)
98
128
  end
99
129
 
100
130
  def filters_runner(filter_type)
@@ -1,3 +1,3 @@
1
1
  module Schleuder
2
- VERSION = '4.0.0'
2
+ VERSION = '4.0.3'
3
3
  end
data/lib/schleuder.rb CHANGED
@@ -6,6 +6,7 @@
6
6
  Encoding.default_external = Encoding::UTF_8
7
7
 
8
8
  # Stdlib
9
+ require 'etc'
9
10
  require 'fileutils'
10
11
  require 'singleton'
11
12
  require 'yaml'
@@ -13,6 +14,7 @@ require 'pathname'
13
14
  require 'syslog/logger'
14
15
  require 'logger'
15
16
  require 'open3'
17
+ require 'socket'
16
18
 
17
19
  # Require mandatory libs. The database-layer-lib is required below.
18
20
  require 'mail-gpg'
@@ -32,7 +34,8 @@ $:.unshift libdir
32
34
  require 'schleuder/mail/parts_list.rb'
33
35
  require 'schleuder/mail/message.rb'
34
36
  require 'schleuder/mail/gpg.rb'
35
- require 'schleuder/mail/encrypted_part.rb'
37
+ require 'schleuder/mail/gpg/encrypted_part.rb'
38
+ require 'schleuder/mail/gpg/sign_part.rb'
36
39
  require 'schleuder/gpgme/import_status.rb'
37
40
  require 'schleuder/gpgme/key.rb'
38
41
  require 'schleuder/gpgme/sub_key.rb'
data/locales/de.yml CHANGED
@@ -11,12 +11,12 @@ de:
11
11
  invalid: "enthält nicht druckbare Zeichen"
12
12
  public_footer:
13
13
  invalid: "enthält nicht druckbare Zeichen"
14
- invalid_email: "ist keine valide E-Mail-Adresse"
15
- invalid_fingerprint: "ist kein valider OpenPGP-Fingerabdruck"
16
- list_fingerprint_missing: "Fingerabdruck der Liste ist nicht gesetzt, kann nicht arbeiten! (In `%{listdir}`.)"
17
- list_key_missing: "Schlüssel der Liste nicht im Schlüsselring gefunden, kann nicht arbeiten! (In `%{listdir}`.)"
18
- list_secret_key_missing: "Geheimer Schlüssel der Liste nicht im Schlüsselring gefunden, kann nicht arbeiten! (In `%{listdir}`.)"
19
- list_admins_missing: "List hat keine Admins konfiguriert, kann nicht arbeiten! (In `%{listdir}`.)"
14
+ invalid_email: "ist keine gültige E-Mail-Adresse"
15
+ invalid_fingerprint: "ist kein gültiger OpenPGP-Fingerabdruck"
16
+ list_fingerprint_missing: "Fingerabdruck der Liste ist nicht gesetzt, kann nicht verarbeiten! (In `%{listdir}`.)"
17
+ list_key_missing: "Schlüssel der Liste nicht im Schlüsselring gefunden, kann nicht verarbeiten! (In `%{listdir}`.)"
18
+ list_secret_key_missing: "Geheimer Schlüssel der Liste nicht im Schlüsselring gefunden, kann nicht verarbeiten! (In `%{listdir}`.)"
19
+ list_admins_missing: "List hat keine Admins konfiguriert, kann nicht verarbeiten! (In `%{listdir}`.)"
20
20
  fatalerror: |
21
21
  Es ist ein schwerwiegender Fehler aufgetreten. Administratoren wurden benachrichtigt.
22
22
  Bitte versuche es später noch ein Mal.
@@ -37,7 +37,7 @@ de:
37
37
  message_signature_unknown: |
38
38
  Emails an diese Adresse müssen mit dem OpenPGP-Schlüssel signiert sein, der
39
39
  deiner Mitgliedschaft zugewiesen ist. Wenn du nicht weisst, welcher Schlüssel das ist, frage
40
- die Administrator/innen. Die erreichst du per Email an
40
+ die Administrator/innen. Diese erreichst du per Email an
41
41
  <%{owner_email}>.
42
42
  (Vorzugsweise verschlüssele die Email mit dem Schlüssel dieser Adresse:
43
43
  %{list_fingerprint}).
@@ -147,7 +147,7 @@ de:
147
147
  Mitgliedschaft von %{email} nicht gelöscht:
148
148
  %{errors}
149
149
  cannot_unsubscribe_last_admin: |
150
- %{email} ist die einzige admin-Mitgliedschaft für diese Liste, daher darf sie nicht gelöscht werden.
150
+ %{email} ist die einzige Admin-Mitgliedschaft für diese Liste, daher darf sie nicht gelöscht werden.
151
151
  subscribed: |
152
152
  Mitgliedschaft von %{email} mit diesen Werten eingetragen:
153
153
 
@@ -159,7 +159,7 @@ de:
159
159
 
160
160
  %{errors}.
161
161
  list_of_subscriptions: "Mitgliedschaften:\n"
162
- set_fingerprint_only_self: Nur admins dürfen den Fingerabdruck für andere Mitgliedschaften festlegen.
162
+ set_fingerprint_only_self: Nur Admins dürfen den Fingerabdruck für andere Mitgliedschaften festlegen.
163
163
  fingerprint_set: Fingerabdruck für %{email} auf %{fingerprint} gesetzt.
164
164
  setting_fingerprint_failed: |
165
165
  Fingerabdruck für %{email} konnte nicht auf %{fingerprint} gesetzt werden:
@@ -172,7 +172,7 @@ de:
172
172
  Benötigt werden ein oder zwei Werte, bspw.:
173
173
  X-SET-FINGERPRINT: 0xB3D190D5235C74E1907EACFE898F2C91E2E6E1F3
174
174
 
175
- oder (als admin):
175
+ oder (als Admin):
176
176
  X-SET-FINGERPRINT: subscription2@hostname 0xB3D190D5235C74E1907EACFE898F2C91E2E6E1F3
177
177
 
178
178
  Wobei der Fingerprint in der gesamten Länge (40 Zeichen) angegeben werden muss. Optional mit 0x als Präfix.
@@ -184,11 +184,11 @@ de:
184
184
  Benötigt werden ein oder zwei Werte, bspw.:
185
185
  X-SET-FINGERPRINT: 0xB3D190D5235C74E1907EACFE898F2C91E2E6E1F3
186
186
 
187
- oder (als admin):
187
+ oder (als Admin):
188
188
  X-SET-FINGERPRINT: subscription2@hostname 0xB3D190D5235C74E1907EACFE898F2C91E2E6E1F3
189
189
 
190
190
  Um einen Fingerprint zu entfernen kannst du das Schlüsselwort 'UNSET-FINGERPRINT' verwenden.
191
- unset_fingerprint_only_self: Nur admins dürfen den Fingerabdruck für andere Mitgliedschaften löschen.
191
+ unset_fingerprint_only_self: Nur Admins dürfen den Fingerabdruck für andere Mitgliedschaften löschen.
192
192
  fingerprint_unset: Fingerabdruck für %{email} wurde entfernt.
193
193
  unsetting_fingerprint_failed: |
194
194
  Fingerabdruck für %{email} konnte nicht entfernt werden:
@@ -199,7 +199,7 @@ de:
199
199
  Benötigt werden ein Wert, bspw.:
200
200
  X-UNSET-FINGERPRINT: subscription2@hostname
201
201
 
202
- Als admin musst du um deinen eigenen Fingerabdruck zu entfernen, noch zusätzlich das Argument force mitgeben. bspw.:
202
+ Als Admin musst du um deinen eigenen Fingerabdruck zu entfernen, noch zusätzlich das Argument force mitgeben. bspw.:
203
203
  X-UNSET-FINGERPRINT: adminsubscription2@hostname force
204
204
  subscribe_requires_arguments: |
205
205
  Fehler: Du hast zu dem Schlüsselwort 'SUBSCRIBE' keinen Wert angegeben.
@@ -210,13 +210,13 @@ de:
210
210
  Oder, um den Schlüssel der neuen Mitgliedschaft zuzuweisen:
211
211
  X-SUBSCRIBE: new-subscription@hostname 0xB3D190D5235C74E1907EACFE898F2C91E2E6E1F3
212
212
 
213
- Oder, um den Schlüssel zuzuweisen, und die Mitgliedschaft als admin einzutragen:
213
+ Oder, um den Schlüssel zuzuweisen, und die Mitgliedschaft als Admin einzutragen:
214
214
  X-SUBSCRIBE: new-subscription@hostname 0xB3D190D5235C74E1907EACFE898F2C91E2E6E1F3 true
215
215
 
216
- Oder, um den Schlüssel zuzuweisen, die Mitgliedschaft als admin einzutragen, und die Zustellung von Listen-Emails für diese Mitgliedschaft abzuschalten:
216
+ Oder, um den Schlüssel zuzuweisen, die Mitgliedschaft als Admin einzutragen, und die Zustellung von Listen-Emails für diese Mitgliedschaft abzuschalten:
217
217
  X-SUBSCRIBE: new-subscription@hostname 0xB3D190D5235C74E1907EACFE898F2C91E2E6E1F3 true false
218
218
 
219
- Wenn du die optionalen Werte weglässt hat die Mitgliedschaft keinen Schlüssel zugewiesen, ist nicht admin, und hat die Zustellung von Listen-Email aktiviert.
219
+ Wenn du die optionalen Werte weglässt hat die Mitgliedschaft keinen Schlüssel zugewiesen, ist nicht Admin, und hat die Zustellung von Listen-Email aktiviert.
220
220
  sign_this:
221
221
  signatures_attached: Die Signaturen hängen an.
222
222
  no_content_found: Deine Email enthielt keine Anhänge und keinen Text-Inhalt, daher konnte nichts signiert werden.
metadata CHANGED
@@ -1,105 +1,105 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schleuder
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - schleuder dev team
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-04 00:00:00.000000000 Z
11
+ date: 2022-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bigdecimal
14
+ name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.4'
19
+ version: 6.1.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.4'
26
+ version: 6.1.3
27
27
  - !ruby/object:Gem::Dependency
28
- name: gpgme
28
+ name: bcrypt
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.0'
34
- - - ">="
35
- - !ruby/object:Gem::Version
36
- version: 2.0.19
33
+ version: 3.1.2
37
34
  type: :runtime
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
38
  - - "~>"
42
39
  - !ruby/object:Gem::Version
43
- version: '2.0'
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: 2.0.19
40
+ version: 3.1.2
47
41
  - !ruby/object:Gem::Dependency
48
- name: mail
42
+ name: charlock_holmes
49
43
  requirement: !ruby/object:Gem::Requirement
50
44
  requirements:
51
45
  - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: 2.7.1
47
+ version: 0.7.6
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
51
  requirements:
58
52
  - - "~>"
59
53
  - !ruby/object:Gem::Version
60
- version: 2.7.1
54
+ version: 0.7.6
61
55
  - !ruby/object:Gem::Dependency
62
- name: mail-gpg
56
+ name: gpgme
63
57
  requirement: !ruby/object:Gem::Requirement
64
58
  requirements:
65
59
  - - "~>"
66
60
  - !ruby/object:Gem::Version
67
- version: '0.3'
61
+ version: '2.0'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 2.0.19
68
65
  type: :runtime
69
66
  prerelease: false
70
67
  version_requirements: !ruby/object:Gem::Requirement
71
68
  requirements:
72
69
  - - "~>"
73
70
  - !ruby/object:Gem::Version
74
- version: '0.3'
71
+ version: '2.0'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 2.0.19
75
75
  - !ruby/object:Gem::Dependency
76
- name: activerecord
76
+ name: mail
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: 6.1.3
81
+ version: 2.7.1
82
82
  type: :runtime
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: 6.1.3
88
+ version: 2.7.1
89
89
  - !ruby/object:Gem::Dependency
90
- name: bcrypt
90
+ name: mail-gpg
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: 3.1.2
95
+ version: '0.3'
96
96
  type: :runtime
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
- version: 3.1.2
102
+ version: '0.3'
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: rake
105
105
  requirement: !ruby/object:Gem::Requirement
@@ -114,20 +114,6 @@ dependencies:
114
114
  - - ">="
115
115
  - !ruby/object:Gem::Version
116
116
  version: 10.5.0
117
- - !ruby/object:Gem::Dependency
118
- name: sqlite3
119
- requirement: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - "~>"
122
- - !ruby/object:Gem::Version
123
- version: 1.4.2
124
- type: :runtime
125
- prerelease: false
126
- version_requirements: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - "~>"
129
- - !ruby/object:Gem::Version
130
- version: 1.4.2
131
117
  - !ruby/object:Gem::Dependency
132
118
  name: sinatra
133
119
  requirement: !ruby/object:Gem::Requirement
@@ -157,19 +143,19 @@ dependencies:
157
143
  - !ruby/object:Gem::Version
158
144
  version: '2'
159
145
  - !ruby/object:Gem::Dependency
160
- name: thor
146
+ name: sqlite3
161
147
  requirement: !ruby/object:Gem::Requirement
162
148
  requirements:
163
149
  - - "~>"
164
150
  - !ruby/object:Gem::Version
165
- version: '0'
151
+ version: 1.4.2
166
152
  type: :runtime
167
153
  prerelease: false
168
154
  version_requirements: !ruby/object:Gem::Requirement
169
155
  requirements:
170
156
  - - "~>"
171
157
  - !ruby/object:Gem::Version
172
- version: '0'
158
+ version: 1.4.2
173
159
  - !ruby/object:Gem::Dependency
174
160
  name: thin
175
161
  requirement: !ruby/object:Gem::Requirement
@@ -185,47 +171,47 @@ dependencies:
185
171
  - !ruby/object:Gem::Version
186
172
  version: '1'
187
173
  - !ruby/object:Gem::Dependency
188
- name: charlock_holmes
174
+ name: thor
189
175
  requirement: !ruby/object:Gem::Requirement
190
176
  requirements:
191
177
  - - "~>"
192
178
  - !ruby/object:Gem::Version
193
- version: 0.7.6
179
+ version: '0'
194
180
  type: :runtime
195
181
  prerelease: false
196
182
  version_requirements: !ruby/object:Gem::Requirement
197
183
  requirements:
198
184
  - - "~>"
199
185
  - !ruby/object:Gem::Version
200
- version: 0.7.6
186
+ version: '0'
201
187
  - !ruby/object:Gem::Dependency
202
- name: rspec
188
+ name: byebug
203
189
  requirement: !ruby/object:Gem::Requirement
204
190
  requirements:
205
191
  - - "~>"
206
192
  - !ruby/object:Gem::Version
207
- version: '3'
193
+ version: '10'
208
194
  type: :development
209
195
  prerelease: false
210
196
  version_requirements: !ruby/object:Gem::Requirement
211
197
  requirements:
212
198
  - - "~>"
213
199
  - !ruby/object:Gem::Version
214
- version: '3'
200
+ version: '10'
215
201
  - !ruby/object:Gem::Dependency
216
- name: hirb
202
+ name: database_cleaner
217
203
  requirement: !ruby/object:Gem::Requirement
218
204
  requirements:
219
205
  - - "~>"
220
206
  - !ruby/object:Gem::Version
221
- version: '0'
207
+ version: '2.0'
222
208
  type: :development
223
209
  prerelease: false
224
210
  version_requirements: !ruby/object:Gem::Requirement
225
211
  requirements:
226
212
  - - "~>"
227
213
  - !ruby/object:Gem::Version
228
- version: '0'
214
+ version: '2.0'
229
215
  - !ruby/object:Gem::Dependency
230
216
  name: factory_bot
231
217
  requirement: !ruby/object:Gem::Requirement
@@ -241,21 +227,7 @@ dependencies:
241
227
  - !ruby/object:Gem::Version
242
228
  version: '6.0'
243
229
  - !ruby/object:Gem::Dependency
244
- name: database_cleaner
245
- requirement: !ruby/object:Gem::Requirement
246
- requirements:
247
- - - "~>"
248
- - !ruby/object:Gem::Version
249
- version: '2.0'
250
- type: :development
251
- prerelease: false
252
- version_requirements: !ruby/object:Gem::Requirement
253
- requirements:
254
- - - "~>"
255
- - !ruby/object:Gem::Version
256
- version: '2.0'
257
- - !ruby/object:Gem::Dependency
258
- name: simplecov-console
230
+ name: hirb
259
231
  requirement: !ruby/object:Gem::Requirement
260
232
  requirements:
261
233
  - - "~>"
@@ -283,45 +255,45 @@ dependencies:
283
255
  - !ruby/object:Gem::Version
284
256
  version: '1'
285
257
  - !ruby/object:Gem::Dependency
286
- name: rubocop
258
+ name: rspec
287
259
  requirement: !ruby/object:Gem::Requirement
288
260
  requirements:
289
261
  - - "~>"
290
262
  - !ruby/object:Gem::Version
291
- version: '1'
263
+ version: '3'
292
264
  type: :development
293
265
  prerelease: false
294
266
  version_requirements: !ruby/object:Gem::Requirement
295
267
  requirements:
296
268
  - - "~>"
297
269
  - !ruby/object:Gem::Version
298
- version: '1'
270
+ version: '3'
299
271
  - !ruby/object:Gem::Dependency
300
- name: byebug
272
+ name: rubocop
301
273
  requirement: !ruby/object:Gem::Requirement
302
274
  requirements:
303
275
  - - "~>"
304
276
  - !ruby/object:Gem::Version
305
- version: '10'
277
+ version: '1'
306
278
  type: :development
307
279
  prerelease: false
308
280
  version_requirements: !ruby/object:Gem::Requirement
309
281
  requirements:
310
282
  - - "~>"
311
283
  - !ruby/object:Gem::Version
312
- version: '10'
284
+ version: '1'
313
285
  - !ruby/object:Gem::Dependency
314
- name: irb
286
+ name: simplecov-console
315
287
  requirement: !ruby/object:Gem::Requirement
316
288
  requirements:
317
- - - ">="
289
+ - - "~>"
318
290
  - !ruby/object:Gem::Version
319
291
  version: '0'
320
292
  type: :development
321
293
  prerelease: false
322
294
  version_requirements: !ruby/object:Gem::Requirement
323
295
  requirements:
324
- - - ">="
296
+ - - "~>"
325
297
  - !ruby/object:Gem::Version
326
298
  version: '0'
327
299
  description: |-
@@ -355,6 +327,8 @@ files:
355
327
  - db/migrate/20180723173900_add_deliver_selfsent_to_list.rb
356
328
  - db/migrate/20190906194820_add_autocrypt_header_to_list.rb
357
329
  - db/migrate/20200118170110_add_set_reply_to_to_sender_and_munge_from.rb
330
+ - db/migrate/20211106112020_change_boolean_values_to_integers.rb
331
+ - db/migrate/20211107151309_add_limits_to_string_columns.rb
358
332
  - db/schema.rb
359
333
  - etc/init.d/schleuder-api-daemon
360
334
  - etc/list-defaults.yml
@@ -432,8 +406,9 @@ files:
432
406
  - lib/schleuder/listlogger.rb
433
407
  - lib/schleuder/logger.rb
434
408
  - lib/schleuder/logger_notifications.rb
435
- - lib/schleuder/mail/encrypted_part.rb
436
409
  - lib/schleuder/mail/gpg.rb
410
+ - lib/schleuder/mail/gpg/encrypted_part.rb
411
+ - lib/schleuder/mail/gpg/sign_part.rb
437
412
  - lib/schleuder/mail/message.rb
438
413
  - lib/schleuder/mail/parts_list.rb
439
414
  - lib/schleuder/runner.rb
@@ -452,7 +427,7 @@ licenses:
452
427
  metadata:
453
428
  homepage_uri: https://schleuder.org/
454
429
  documentation_uri: https://schleuder.org/docs/
455
- changelog_uri: https://0xacab.org/schleuder/schleuder/blob/master/CHANGELOG.md
430
+ changelog_uri: https://0xacab.org/schleuder/schleuder/blob/main/CHANGELOG.md
456
431
  source_code_uri: https://0xacab.org/schleuder/schleuder/
457
432
  bug_tracker_uri: https://0xacab.org/schleuder/schleuder/issues
458
433
  mailing_list_uri: https://lists.nadir.org/mailman/listinfo/schleuder-announce/
@@ -473,8 +448,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
473
448
  - !ruby/object:Gem::Version
474
449
  version: '0'
475
450
  requirements: []
476
- rubygems_version: 3.2.7
477
- signing_key:
451
+ rubyforge_project:
452
+ rubygems_version: 2.7.6.2
453
+ signing_key:
478
454
  specification_version: 4
479
455
  summary: Schleuder is an encrypting mailing list manager with remailing-capabilities.
480
456
  test_files: []