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 +4 -4
- data/README.md +7 -19
- data/Rakefile +4 -1
- data/db/migrate/20211106112020_change_boolean_values_to_integers.rb +46 -0
- data/db/migrate/20211107151309_add_limits_to_string_columns.rb +28 -0
- data/db/schema.rb +3 -3
- data/lib/schleuder/cli.rb +1 -2
- data/lib/schleuder/conf.rb +1 -7
- data/lib/schleuder/filters_runner.rb +1 -30
- data/lib/schleuder/gpgme/ctx.rb +1 -33
- data/lib/schleuder/keyword_handlers/key_management.rb +1 -1
- data/lib/schleuder/logger.rb +2 -6
- data/lib/schleuder/mail/{encrypted_part.rb → gpg/encrypted_part.rb} +0 -0
- data/lib/schleuder/mail/gpg/sign_part.rb +33 -0
- data/lib/schleuder/runner.rb +40 -10
- data/lib/schleuder/version.rb +1 -1
- data/lib/schleuder.rb +4 -1
- data/locales/de.yml +16 -16
- metadata +57 -81
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c44b12c722680d91cee45a80ae2ee6a4ff47a9544dfd171cc83a5549bdd72be2
|
4
|
+
data.tar.gz: 77773ef59d05b1faff86cf2fe5d22ef657cd5683e6184db1a55b28d1592b07d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb351c776f1773cf0dd5ef0f04f310fe70a0155d9344fd75eb78fce9b0d69cad0f0d9bfad664d1a8ab004a55c2d29a849cf1ea2cd0a295c61c3b56b96a25d9a8
|
7
|
+
data.tar.gz: 97ab8283c694fac04196ee752ffe3153f57acb1e37c8754c8c9f1840fbf5109d47fac3426aa8fa3f168341efbfcf38c8d4292e9a360b3d81dff5d9231ac9b700
|
data/README.md
CHANGED
@@ -1,10 +1,9 @@
|
|
1
|
-
Schleuder
|
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
|
-
|
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
|
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.
|
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.
|
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.
|
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.
|
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}
|
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:
|
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
|
-
|
135
|
+
fatal result, $?.exitstatus
|
137
136
|
end
|
138
137
|
result
|
139
138
|
end
|
data/lib/schleuder/conf.rb
CHANGED
@@ -4,13 +4,7 @@ module Schleuder
|
|
4
4
|
class Conf
|
5
5
|
include Singleton
|
6
6
|
|
7
|
-
|
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
|
-
|
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|
|
data/lib/schleuder/gpgme/ctx.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/schleuder/logger.rb
CHANGED
@@ -7,13 +7,9 @@ module Schleuder
|
|
7
7
|
class Logger < Syslog::Logger
|
8
8
|
include LoggerNotifications
|
9
9
|
def initialize
|
10
|
-
|
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 = "#{
|
12
|
+
@from = "#{Etc.getlogin}@#{Socket.gethostname}"
|
17
13
|
@adminaddresses = Conf.superadmin
|
18
14
|
@level = ::Logger.const_get(Conf.log_level.upcase)
|
19
15
|
end
|
File without changes
|
@@ -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
|
+
|
data/lib/schleuder/runner.rb
CHANGED
@@ -31,7 +31,13 @@ module Schleuder
|
|
31
31
|
end
|
32
32
|
|
33
33
|
error = run_filters('pre')
|
34
|
-
|
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
|
-
|
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
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
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)
|
data/lib/schleuder/version.rb
CHANGED
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
|
15
|
-
invalid_fingerprint: "ist kein
|
16
|
-
list_fingerprint_missing: "Fingerabdruck der Liste ist nicht gesetzt, kann nicht
|
17
|
-
list_key_missing: "Schlüssel der Liste nicht im Schlüsselring gefunden, kann nicht
|
18
|
-
list_secret_key_missing: "Geheimer Schlüssel der Liste nicht im Schlüsselring gefunden, kann nicht
|
19
|
-
list_admins_missing: "List hat keine Admins konfiguriert, kann nicht
|
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.
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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.
|
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:
|
11
|
+
date: 2022-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activerecord
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
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:
|
26
|
+
version: 6.1.3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bcrypt
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
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:
|
44
|
-
- - ">="
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: 2.0.19
|
40
|
+
version: 3.1.2
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
42
|
+
name: charlock_holmes
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
50
44
|
requirements:
|
51
45
|
- - "~>"
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
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:
|
54
|
+
version: 0.7.6
|
61
55
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
56
|
+
name: gpgme
|
63
57
|
requirement: !ruby/object:Gem::Requirement
|
64
58
|
requirements:
|
65
59
|
- - "~>"
|
66
60
|
- !ruby/object:Gem::Version
|
67
|
-
version: '0
|
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
|
71
|
+
version: '2.0'
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 2.0.19
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
|
-
name:
|
76
|
+
name: mail
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
79
|
- - "~>"
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version:
|
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:
|
88
|
+
version: 2.7.1
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
|
-
name:
|
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
|
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
|
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:
|
146
|
+
name: sqlite3
|
161
147
|
requirement: !ruby/object:Gem::Requirement
|
162
148
|
requirements:
|
163
149
|
- - "~>"
|
164
150
|
- !ruby/object:Gem::Version
|
165
|
-
version:
|
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:
|
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:
|
174
|
+
name: thor
|
189
175
|
requirement: !ruby/object:Gem::Requirement
|
190
176
|
requirements:
|
191
177
|
- - "~>"
|
192
178
|
- !ruby/object:Gem::Version
|
193
|
-
version: 0
|
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
|
186
|
+
version: '0'
|
201
187
|
- !ruby/object:Gem::Dependency
|
202
|
-
name:
|
188
|
+
name: byebug
|
203
189
|
requirement: !ruby/object:Gem::Requirement
|
204
190
|
requirements:
|
205
191
|
- - "~>"
|
206
192
|
- !ruby/object:Gem::Version
|
207
|
-
version: '
|
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: '
|
200
|
+
version: '10'
|
215
201
|
- !ruby/object:Gem::Dependency
|
216
|
-
name:
|
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:
|
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:
|
258
|
+
name: rspec
|
287
259
|
requirement: !ruby/object:Gem::Requirement
|
288
260
|
requirements:
|
289
261
|
- - "~>"
|
290
262
|
- !ruby/object:Gem::Version
|
291
|
-
version: '
|
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: '
|
270
|
+
version: '3'
|
299
271
|
- !ruby/object:Gem::Dependency
|
300
|
-
name:
|
272
|
+
name: rubocop
|
301
273
|
requirement: !ruby/object:Gem::Requirement
|
302
274
|
requirements:
|
303
275
|
- - "~>"
|
304
276
|
- !ruby/object:Gem::Version
|
305
|
-
version: '
|
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: '
|
284
|
+
version: '1'
|
313
285
|
- !ruby/object:Gem::Dependency
|
314
|
-
name:
|
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/
|
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
|
-
|
477
|
-
|
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: []
|