Commit bcc7d204 authored by Michał "rysiek" Woźniak's avatar Michał "rysiek" Woźniak 🔒

Revert "Merge branch 'release-4.0' into 'add-delivery-selfsent'"

This reverts commit 2ff47f2e
parent 568101d8
Pipeline #31216 canceled with stages
This diff is collapsed.
inherit_from: .rubocop_todo.yml
AllCops:
Exclude:
- 'db/**/*'
- 'vendor/**/*'
Style/StringLiterals:
Enabled: true
Layout/EmptyLineBetweenDefs:
Enabled: true
Layout/SpaceAfterComma:
Enabled: true
This diff is collapsed.
......@@ -3,32 +3,7 @@ Change Log
This project adheres to [Semantic Versioning](http://semver.org/).
## [4.0] / 2019-01-XX
### Fixed
* Show error message if X-RESEND (and family) is forbidden by the list-config.
### Added
* 'X-STOP': To use any keyword, you *must* now also use the new keyword 'X-STOP' to mark where to stop looking for keywords. This enables looking for keyword arguments in multiple lines, e.g. for X-RESEND with long, wrapped lines.
* Keywords for getting (new) passwords for accounts. 'X-GET-NEW-PASSWORD' sets and sends back a new password for the account of the subscribed email-address. 'X-GET-NEW-PASSWORD-FOR: subscription1@example.org' sets and sends back a new password for the account of the given email-address; this is allowed for admins only and allows to get a password for people that have no key associated with their subscription, yet.
* Provide systemd configs for weekly key maintenance. This relies on a working systemd-timesyncd. (#422)
* `deliver_selfsent` per-list option to control whether subscribers get a copy of mail they sent themselves. (#365)
### Changed
* Drop support for GPG 2.0, require GPG 2.2.
* Drop support to migrate lists from version 2. This includes pin_keys code, which looked for subscriptions without an associated key, and tried to find a distinctly matching key. Originally, this was implemented to help with a shortcoming of code which handled version 2 to version 3 migration. (#411)
* "Plugins" are now called "keyword handlers", and they are implemented differently. If you use custom plugins you have to rewrite them (see an included keyword handler for implementation hints, it's rather simple). If you don't, this change doesn't affect you. One positive effect of this: if a message contains an unknown keyword, no keyword is being handled but the sender is sent an error message; thus we avoid half-handled messages.
* Allow only fingerprints as argument to X-DELETE-KEY. We want to reference keys only by fingerprint, if possible (as we do with other keywords already).
* The list-option `keywords_admin_only` has been removed. The functionality will be replaced by some other means of configuration. [TODO: explain/adapt when replacement is implemented]
* Drop deprecated X-LISTNAME keyword. (#374)
* Downcase email addresses: Email addresses are downcased before saving.
* Allow Jenkins job notifications to reach lists. Before, such mails were rejected due to being "auto-submitted".
## [3.3.0] / 2018-09-04
## unreleased
### Fixed
......@@ -42,8 +17,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
### Added
* To remove a fingerprint from a subscription one can use the new keyword X-UNSET-FINGERPRINT (#360).
* Extend the pseudoheaders configuration option to support 'sig' and 'enc' as configurable and sortable fields.
* `deliver_selfsent` per-list opton to control whether subscribers get a copy of mail they sent themselves. (#365)
### Changed
......@@ -51,6 +25,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
* In the response to 'X-ADD-KEY', differentiate between 'newly imported' and 'updated' keys.
* Parse keywords up to the first line detected as mail content, this addresses a first part of #249.
### Added
* Extend the pseudoheaders configuration option to support 'sig' and 'enc' as configurable and sortable fields.
## [3.2.3] / 2018-05-14
......@@ -298,7 +274,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
* Friendlier error message if delivery to subscription fails.
* Set list-email as primary address after adding UIDs. Previously it was a little random, for reasons only known to GnuPG.
* Only use temporary files where necessary, and with more secure paths.
* Tighten requirements for valid email-addresses a little: The domain-part may now only contain alphanumeric characters, plus these: `._-`
* Tighten requirements for valid email-addresses a little: The domain-part may now only contain alpha-numeric characters, plus these: `._-`
* Required version of schleuder-cli: 0.0.2.
### Added
......
......@@ -10,8 +10,8 @@ For more details see <https://schleuder.org/docs/>.
Requirements
------------
* ruby >=2.3
* gnupg >=2.2
* ruby >=2.1
* gnupg 2.0.x, or >=2.1.16
* gpgme
* sqlite3
* openssl
......@@ -47,15 +47,15 @@ Additionally these **rubygems** are required (will be installed automatically un
Installing Schleuder
------------
1. Download [the gem](https://schleuder.org/download/schleuder-3.3.0.gem) and [the OpenPGP-signature](https://schleuder.org/download/schleuder-3.3.0.gem.sig) and verify:
1. Download [the gem](https://schleuder.org/download/schleuder-3.2.3.gem) and [the OpenPGP-signature](https://schleuder.org/download/schleuder-3.2.3.gem.sig) and verify:
```
gpg --recv-key 0xB3D190D5235C74E1907EACFE898F2C91E2E6E1F3
gpg --verify schleuder-3.3.0.gem.sig
gpg --verify schleuder-3.2.3.gem.sig
```
2. If all went well install the gem:
```
gem install schleuder-3.3.0.gem
gem install schleuder-3.2.3.gem
```
3. Set up schleuder:
......@@ -145,4 +145,4 @@ GNU GPL 3.0. Please see [LICENSE.txt](LICENSE.txt).
Alternative Download
--------------------
Alternatively to the gem-files you can download the latest release as [a tarball](https://schleuder.org/download/schleuder-3.3.0.tar.gz) and [its OpenPGP-signature](https://schleuder.org/download/schleuder-3.3.0.tar.gz.sig).
Alternatively to the gem-files you can download the latest release as [a tarball](https://schleuder.org/download/schleuder-3.2.3.tar.gz) and [its OpenPGP-signature](https://schleuder.org/download/schleuder-3.2.3.tar.gz.sig).
......@@ -7,7 +7,7 @@ require_relative "lib/#{project}.rb"
@filename_gem = "#{@tagname}.gem"
@filename_tarball = "#{@tagname}.tar.gz"
load 'active_record/railties/databases.rake'
load "active_record/railties/databases.rake"
# Configure ActiveRecord
ActiveRecord::Tasks::DatabaseTasks.tap do |config|
......@@ -19,7 +19,7 @@ ActiveRecord::Tasks::DatabaseTasks.tap do |config|
end
# ActiveRecord requires this task to be present
Rake::Task.define_task('db:environment')
Rake::Task.define_task("db:environment")
namespace :db do
# A shortcut.
......@@ -42,7 +42,7 @@ end
task :publish_gem => :website
task :git_tag => :check_version
desc 'Build new version: git-tag and gem-file'
desc "Build new version: git-tag and gem-file"
task :new_version => [
:check_version,
:edit_readme, :edit_changelog,
......@@ -57,12 +57,12 @@ task :new_version => [
] do
end
desc 'Edit CHANGELOG.md'
desc "Edit CHANGELOG.md"
task :edit_changelog do
edit_and_add_file('CHANGELOG')
end
desc 'Edit README'
desc "Edit README"
task :edit_readme do
edit_and_add_file('README')
end
......@@ -72,12 +72,12 @@ task :git_tag do
`git tag -u #{@gpguid} -s -m "Version #{@version}" #{@tagname}`
end
desc 'Add changed version to git-index'
desc "Add changed version to git-index"
task :git_add_version do
`git add lib/#{project}/version.rb`
end
desc 'Commit changes as new version'
desc "Commit changes as new version"
task :git_commit do
`git commit -m "Version #{@version}"`
end
......@@ -111,10 +111,10 @@ desc 'Publish gem-file to rubygems.org'
task :publish_gem do
puts "Really push #{@filename_gem} to rubygems.org? [yN]"
if gets.match(/^y/i)
puts 'Pushing...'
puts "Pushing..."
`gem push #{@filename_gem}`
else
puts 'Not pushed.'
puts "Not pushed."
end
end
......@@ -125,7 +125,7 @@ end
desc 'Describe manual release-tasks'
task :website do
puts 'Please remember to publish the release-notes on the website and on schleuder-announce.'
puts "Please remember to publish the release-notes on the website and on schleuder-announce."
end
desc 'Check if version-tag already exists'
......@@ -133,7 +133,7 @@ task :check_version do
# Check if Schleuder::VERSION has been updated since last release
if `git tag`.match?(/^#{@tagname}$/)
$stderr.puts "Warning: Tag '#{@tagname}' already exists. Did you forget to update #{project}/version.rb?"
$stderr.print 'Delete tag to continue? [yN] '
$stderr.print "Delete tag to continue? [yN] "
if $stdin.gets.match(/^y/i)
`git tag -d #{@tagname}`
else
......
#!/usr/bin/env ruby
# This file can be deleted once we cease to support gnupg 2.0.
require 'fileutils'
require 'cgi'
require 'openssl'
def respond(msg, flush=true)
$stdout.puts msg
if flush
$stdout.flush
end
end
def send_ok(flush=true)
respond 'OK', flush
end
def send_password
if File.exist?(OLDPWDSENTFILE)
pwd = ''
if File.exist?(EMPTYPWDSENTFILE1)
FileUtils.touch(EMPTYPWDSENTFILE2)
else
FileUtils.touch(EMPTYPWDSENTFILE1)
end
else
pwd = OLDPASSWD
FileUtils.touch(OLDPWDSENTFILE)
end
respond "D #{pwd}"
end
def do_exit
if File.exist?(EMPTYPWDSENTFILE2)
FileUtils.rm_rf(TMPDIR)
end
exit 0
end
OLDPASSWD = CGI.escape(ENV['PINENTRY_USER_DATA'].to_s)
if OLDPASSWD.empty?
respond "Fatal error: passed PINENTRY_USER_DATA was empty, cannot continue"
exit 1
end
# We need a static directory name to maintain the state across invocations of
# this file.
TMPDIR = File.join(ENV['GNUPGHOME'], '.tmp-pinentry-clearpassphrase')
OLDPWDSENTFILE = File.join(TMPDIR, '1')
EMPTYPWDSENTFILE1 = File.join(TMPDIR, '2')
EMPTYPWDSENTFILE2 = File.join(TMPDIR, '3')
if ! Dir.exist?(TMPDIR)
Dir.mkdir(TMPDIR)
end
respond "OK - what's up?"
while line = $stdin.gets do
case line
when /^GETPIN/
send_password
send_ok
when /^BYE/
send_ok false
do_exit
else
send_ok
end
end
......@@ -4,7 +4,7 @@
# error-message.
$VERBOSE=nil
trap('INT') { exit 1 }
trap("INT") { exit 1 }
begin
......
......@@ -7,7 +7,7 @@
require 'socket'
require 'open3'
trap ('INT') { exit 0 }
trap ("INT") { exit 0 }
def usage
puts "Usage: #{File.basename(__FILE__)} [-p portnum]"
......@@ -30,28 +30,28 @@ schleuderbin = File.join(File.dirname(__FILE__), 'schleuder')
begin
# run the server
server = TCPServer.new('127.0.0.1', port)
server = TCPServer.new("127.0.0.1", port)
# receive input
while (connection = server.accept)
input = ''
recipient = ''
connection.puts '220 localhost SMTP'
connection.puts "220 localhost SMTP"
begin
while line = connection.gets
line.chomp!
case line[0..3].downcase
when 'ehlo', 'helo'
connection.puts '250 localhost'
connection.puts "250 localhost"
when 'mail', 'rset'
connection.puts '250 ok'
connection.puts "250 ok"
when 'rcpt'
recipient = line.split(':').last.gsub(/[<>\s]*/, '')
connection.puts '250 ok'
connection.puts "250 ok"
when 'data'
connection.puts '354 go ahead'
connection.puts "354 go ahead"
when 'quit'
connection.puts '221 localhost'
connection.puts "221 localhost"
when '.'
puts "New message to #{recipient}"
err, status = Open3.capture2e("#{schleuderbin} work #{recipient}", {stdin_data: input})
......@@ -59,7 +59,7 @@ begin
puts "Error from schleuder: #{err}."
connection.puts "550 #{err}"
else
connection.puts '250 ok'
connection.puts "250 ok"
end
else
input << line + "\n"
......
class CreateLists < ActiveRecord::Migration[5.2]
class CreateLists < ActiveRecord::Migration
def up
if ! table_exists?(:lists)
create_table :lists do |t|
......
class CreateSubscriptions < ActiveRecord::Migration[5.2]
class CreateSubscriptions < ActiveRecord::Migration
def up
if ! table_exists?(:subscriptions)
create_table :subscriptions do |t|
......
class AddLanguageToLists < ActiveRecord::Migration[5.2]
class AddLanguageToLists < ActiveRecord::Migration
def up
if ! column_exists?(:lists, :language)
add_column :lists, :language, :string, default: 'en'
......
class ChangeKeywordsAdminOnlyDefaults < ActiveRecord::Migration[5.2]
class ChangeKeywordsAdminOnlyDefaults < ActiveRecord::Migration
def up
change_column_default :lists, :keywords_admin_only, "[\"subscribe\", \"unsubscribe\", \"delete-key\"]"
end
......
class AddForwardAllIncomingToAdmins < ActiveRecord::Migration[5.2]
class AddForwardAllIncomingToAdmins < ActiveRecord::Migration
def up
if ! column_exists?(:lists, :forward_all_incoming_to_admins)
add_column :lists, :forward_all_incoming_to_admins, :boolean, default: false
......
class ChangeSendEncryptedOnlyDefault < ActiveRecord::Migration[5.2]
class ChangeSendEncryptedOnlyDefault < ActiveRecord::Migration
def up
change_column_default :lists, :send_encrypted_only, true
end
......
class AddLogfilesToKeepToLists < ActiveRecord::Migration[5.2]
class AddLogfilesToKeepToLists < ActiveRecord::Migration
def up
if ! column_exists?(:lists, :logfiles_to_keep)
add_column :lists, :logfiles_to_keep, :integer, default: 2
......
class RenameDeliveryDisabledToDeliveryEnabledAndChangeDefault < ActiveRecord::Migration[5.2]
class RenameDeliveryDisabledToDeliveryEnabledAndChangeDefault < ActiveRecord::Migration
def up
if column_exists?(:subscriptions, :delivery_disabled)
rename_column :subscriptions, :delivery_disabled, :delivery_enabled
......
class StripGpgPassphrase < ActiveRecord::Migration[5.2]
class StripGpgPassphrase < ActiveRecord::Migration
def up
if column_exists?(:lists, :gpg_passphrase)
remove_column :lists, :gpg_passphrase
......
class RemoveDefaultMime < ActiveRecord::Migration[5.2]
class RemoveDefaultMime < ActiveRecord::Migration
def up
remove_column :lists, :default_mime
end
......
class FixHeadersToMetaDefaults < ActiveRecord::Migration[5.2]
class FixHeadersToMetaDefaults < ActiveRecord::Migration
def up
change_column_default :lists, :headers_to_meta, '["from", "to", "date", "cc"]'
end
......
class AddInternalFooterToList < ActiveRecord::Migration[5.2]
class AddInternalFooterToList < ActiveRecord::Migration
def up
if ! column_exists?(:lists, :internal_footer)
add_column :lists, :internal_footer, :text, default: ''
......
class AddSigEncToHeadersToMetaDefaults < ActiveRecord::Migration[5.2]
class AddSigEncToHeadersToMetaDefaults < ActiveRecord::Migration
def up
change_column_default :lists, :headers_to_meta, '["from", "to", "cc", "date", "sig", "enc"]'
list_klass = create_list_klass
......
class CreateAccounts < ActiveRecord::Migration[5.2]
def up
create_table :accounts do |t|
t.string :email, null: false
t.string :password_digest, null: false
t.boolean :api_superadmin, null: false, default: false
end
add_index :accounts, :email, unique: true
end
def down
drop_table(:accounts)
end
end
class RemoveKeywordsAdminOnly < ActiveRecord::Migration[5.2]
def up
remove_column :lists, :keywords_admin_only
end
def down
add_column :lists, :keywords_admin_only, :text, default: "[\"subscribe\", \"unsubscribe\", \"delete-key\"]"
end
end
# encoding: UTF-8
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
......@@ -10,58 +11,53 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2019_02_20_111200) do
create_table "accounts", force: :cascade do |t|
t.string "email", null: false
t.string "password_digest", null: false
t.boolean "api_superadmin", default: false, null: false
t.index ["email"], name: "index_accounts_on_email", unique: true
end
ActiveRecord::Schema.define(version: 20170713215059) do
create_table "lists", force: :cascade do |t|
t.datetime "created_at"
t.datetime "updated_at"
t.string "email", limit: 255
t.string "fingerprint", limit: 255
t.string "log_level", limit: 255, default: "warn"
t.string "subject_prefix", limit: 255, default: ""
t.string "subject_prefix_in", limit: 255, default: ""
t.string "subject_prefix_out", limit: 255, default: ""
t.string "openpgp_header_preference", limit: 255, default: "signencrypt"
t.text "public_footer", default: ""
t.text "headers_to_meta", default: "[\"from\", \"to\", \"cc\", \"date\", \"sig\", \"enc\"]"
t.text "bounces_drop_on_headers", default: "{\"x-spam-flag\":\"yes\"}"
t.text "keywords_admin_notify", default: "[\"add-key\"]"
t.boolean "send_encrypted_only", default: true
t.boolean "receive_encrypted_only", default: false
t.boolean "receive_signed_only", default: false
t.boolean "receive_authenticated_only", default: false
t.boolean "receive_from_subscribed_emailaddresses_only", default: false
t.boolean "receive_admin_only", default: false
t.boolean "keep_msgid", default: true
t.boolean "bounces_drop_all", default: false
t.boolean "bounces_notify_admins", default: true
t.boolean "deliver_selfsent", default: true
t.boolean "include_list_headers", default: true
t.boolean "include_openpgp_header", default: true
t.integer "max_message_size_kb", default: 10240
t.string "language", limit: 255, default: "en"
t.boolean "forward_all_incoming_to_admins", default: false
t.integer "logfiles_to_keep", default: 2
t.text "internal_footer", default: ""
t.string "email", limit: 255
t.string "fingerprint", limit: 255
t.string "log_level", limit: 255, default: "warn"
t.string "subject_prefix", limit: 255, default: ""
t.string "subject_prefix_in", limit: 255, default: ""
t.string "subject_prefix_out", limit: 255, default: ""
t.string "openpgp_header_preference", limit: 255, default: "signencrypt"
t.text "public_footer", default: ""
t.text "headers_to_meta", default: "[\"from\", \"to\", \"date\", \"cc\"]"
t.text "bounces_drop_on_headers", default: "{\"x-spam-flag\":\"yes\"}"
t.text "keywords_admin_only", default: "[\"subscribe\", \"unsubscribe\", \"delete-key\"]"
t.text "keywords_admin_notify", default: "[\"add-key\"]"
t.boolean "send_encrypted_only", default: true
t.boolean "receive_encrypted_only", default: false
t.boolean "receive_signed_only", default: false
t.boolean "receive_authenticated_only", default: false
t.boolean "receive_from_subscribed_emailaddresses_only", default: false
t.boolean "receive_admin_only", default: false
t.boolean "keep_msgid", default: true
t.boolean "bounces_drop_all", default: false
t.boolean "bounces_notify_admins", default: true
t.boolean "deliver_selfsent", default: true
t.boolean "include_list_headers", default: true
t.boolean "include_openpgp_header", default: true
t.integer "max_message_size_kb", default: 10240
t.string "language", limit: 255, default: "en"
t.boolean "forward_all_incoming_to_admins", default: false
t.integer "logfiles_to_keep", default: 2
t.text "internal_footer", default: ""
end
create_table "subscriptions", force: :cascade do |t|
t.integer "list_id"
t.string "email", limit: 255
t.string "fingerprint", limit: 255
t.boolean "admin", default: false
t.boolean "delivery_enabled", default: true
t.integer "list_id"
t.string "email", limit: 255
t.string "fingerprint", limit: 255
t.boolean "admin", default: false
t.boolean "delivery_enabled", default: true
t.datetime "created_at"
t.datetime "updated_at"
t.index ["email", "list_id"], name: "index_subscriptions_on_email_and_list_id", unique: true
t.index ["list_id"], name: "index_subscriptions_on_list_id"
end
add_index "subscriptions", ["email", "list_id"], name: "index_subscriptions_on_email_and_list_id", unique: true
add_index "subscriptions", ["list_id"], name: "index_subscriptions_on_list_id"
end
......@@ -26,7 +26,7 @@ function abort {
[ -z ${SCHLOCKER_CONFIG_PATH+x} ] && SCHLOCKER_CONFIG_PATH="/etc/schleuder/schleuder.yml"
[ -z ${SCHLOCKER_CONFIG_SUPERADMIN+x} ] && SCHLOCKER_CONFIG_SUPERADMIN="root@localhost"
[ -z ${SCHLOCKER_CONFIG_LISTS_DIR+x} ] && SCHLOCKER_CONFIG_LISTS_DIR="$SCHLOCKER_HOMEDIR/lists"
[ -z ${SCHLOCKER_CONFIG_KEYWORD_HANDLERS_DIR+x} ] && SCHLOCKER_CONFIG_KEYWORD_HANDLERS_DIR="/usr/local/lib/schleuder/keyword_handlers"
[ -z ${SCHLOCKER_CONFIG_PLUGINS_DIR+x} ] && SCHLOCKER_CONFIG_PLUGINS_DIR="/etc/schleuder/plugins"
[ -z ${SCHLOCKER_CONFIG_LOG_LEVEL+x} ] && SCHLOCKER_CONFIG_LOG_LEVEL="warn"
[ -z ${SCHLOCKER_CONFIG_SMTP_HOST+x} ] && SCHLOCKER_CONFIG_SMTP_HOST="localhost"
[ -z ${SCHLOCKER_CONFIG_SMTP_PORT+x} ] && SCHLOCKER_CONFIG_SMTP_PORT="25"
......@@ -229,7 +229,7 @@ if [ ! -e "$SCHLOCKER_CONFIG_PATH" ]; then
SCHLOCKER_CONFIG="---
superadmin: $SCHLOCKER_CONFIG_SUPERADMIN
lists_dir: $SCHLOCKER_CONFIG_LISTS_DIR
keyword_handlers_dir: $SCHLOCKER_CONFIG_KEYWORD_HANDLERS_DIR
plugins_dir: $SCHLOCKER_CONFIG_PLUGINS_DIR
log_level: $SCHLOCKER_CONFIG_LOG_LEVEL
smtp_settings:
# For explanation see documentation for ActionMailer::smtp_settings, e.g. <http://api.rubyonrails.org/classes/ActionMailer/Base.html>.
......
......@@ -6,7 +6,7 @@
#
# Options are listed with the behaviour encoded in the database schema.
# Only send out encrypted emails to subscriptions?
# Only send out enrypted emails to subscriptions?
# (This setting does not affect resend-messages.)
send_encrypted_only: true
......@@ -51,6 +51,12 @@ headers_to_meta:
# and a thread of (encrypted) messages can be built by an eavesdropper.
keep_msgid: true
# Which keywords ("email-commands") should be restricted to list-admins?
keywords_admin_only:
- subscribe
- unsubscribe
- delete-key
# For which keywords should the list-admins receive a notice whenever it
# triggers a command.
keywords_admin_notify:
......
[Unit]
Description=Schleuder weekly key maintenance
After=local-fs.target network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/schleuder refresh_keys
ExecStart=/usr/local/bin/schleuder check_keys
User=schleuder
[Unit]
Description=Schleuder weekly key maintenance
[Timer]
OnCalendar=weekly
Persistent=true
[Install]
WantedBy=timers.target
......@@ -4,8 +4,8 @@ lists_dir: /var/lib/schleuder/lists
# Where to write list-logs. The actual log-file will be <lists_logs_base_dir>/<hostname>/<listname>/list.log.
listlogs_dir: /var/lib/schleuder/lists
# Schleuder looks for additional, custom keyword-handlers in this directory.
keyword_handlers_dir: /usr/local/lib/schleuder/keyword_handlers
# Schleuder reads plugins also from this directory.
plugins_dir: /etc/schleuder/plugins
# Schleuder reads filters also from this directory path,
# in the specific pre_decryption or post_decryption subdirectory.
......@@ -22,7 +22,7 @@ filters_dir: /usr/local/lib/schleuder/filters
log_level: warn
# Which keyserver to refresh keys from (used by `schleuder refresh_keys`, meant
# to be run from cron or systemd weekly).
# to be run from cron weekly).
# If you have gnupg 2.1, we strongly suggest to use a hkps-keyserver:
#keyserver: hkps://hkps.pool.sks-keyservers.net
# If you have gnupg 2.1 and TOR running locally, use a onion-keyserver:
......
......@@ -48,26 +48,6 @@ class SchleuderApiDaemon < Sinatra::Base
ActiveRecord::Base.connection.close
end
error Errors::KeyNotFound do
status 404
body 'Key not found.'
end
error Errors::SubscriptionNotFound do
status 404
body 'Subscription not found.'
end
error Errors