Diff of the two buildlogs: -- --- b1/build.log 2025-08-25 16:45:06.814747837 +0000 +++ b2/build.log 2025-08-25 16:52:11.495298466 +0000 @@ -1,6 +1,6 @@ I: pbuilder: network access will be disabled during build -I: Current time: Sun Sep 27 10:50:47 -12 2026 -I: pbuilder-time-stamp: 1790549447 +I: Current time: Tue Aug 26 06:45:08 +14 2025 +I: pbuilder-time-stamp: 1756140308 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/forky-reproducible-base.tgz] I: copying local configuration @@ -35,53 +35,85 @@ dpkg-source: info: applying 0012-Relax-version-constraint-on-sqlite3-gem.patch I: Not using root during the build. I: Installing the build-deps -I: user script /srv/workspace/pbuilder/2575151/tmp/hooks/D02_print_environment starting +I: user script /srv/workspace/pbuilder/1624683/tmp/hooks/D01_modify_environment starting +debug: Running on ionos11-amd64. +I: Changing host+domainname to test build reproducibility +I: Adding a custom variable just for the fun of it... +I: Changing /bin/sh to bash +'/bin/sh' -> '/bin/bash' +lrwxrwxrwx 1 root root 9 Aug 25 16:45 /bin/sh -> /bin/bash +I: Setting pbuilder2's login shell to /bin/bash +I: Setting pbuilder2's GECOS to second user,second room,second work-phone,second home-phone,second other +I: user script /srv/workspace/pbuilder/1624683/tmp/hooks/D01_modify_environment finished +I: user script /srv/workspace/pbuilder/1624683/tmp/hooks/D02_print_environment starting I: set - BUILDDIR='/build/reproducible-path' - BUILDUSERGECOS='first user,first room,first work-phone,first home-phone,first other' - BUILDUSERNAME='pbuilder1' - BUILD_ARCH='amd64' - DEBIAN_FRONTEND='noninteractive' - DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=42 ' - DISTRIBUTION='forky' - HOME='/root' - HOST_ARCH='amd64' + BASH=/bin/sh + BASHOPTS=checkwinsize:cmdhist:complete_fullquote:extquote:force_fignore:globasciiranges:globskipdots:hostcomplete:interactive_comments:patsub_replacement:progcomp:promptvars:sourcepath + BASH_ALIASES=() + BASH_ARGC=() + BASH_ARGV=() + BASH_CMDS=() + BASH_LINENO=([0]="12" [1]="0") + BASH_LOADABLES_PATH=/usr/local/lib/bash:/usr/lib/bash:/opt/local/lib/bash:/usr/pkg/lib/bash:/opt/pkg/lib/bash:. + BASH_SOURCE=([0]="/tmp/hooks/D02_print_environment" [1]="/tmp/hooks/D02_print_environment") + BASH_VERSINFO=([0]="5" [1]="2" [2]="37" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu") + BASH_VERSION='5.2.37(1)-release' + BUILDDIR=/build/reproducible-path + BUILDUSERGECOS='second user,second room,second work-phone,second home-phone,second other' + BUILDUSERNAME=pbuilder2 + BUILD_ARCH=amd64 + DEBIAN_FRONTEND=noninteractive + DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=40 ' + DIRSTACK=() + DISTRIBUTION=forky + EUID=0 + FUNCNAME=([0]="Echo" [1]="main") + GROUPS=() + HOME=/root + HOSTNAME=i-capture-the-hostname + HOSTTYPE=x86_64 + HOST_ARCH=amd64 IFS=' ' - INVOCATION_ID='38c2885a83c549bf936fb2b9e5dea53d' - LANG='C' - LANGUAGE='en_US:en' - LC_ALL='C' - MAIL='/var/mail/root' - OPTIND='1' - PATH='/usr/sbin:/usr/bin:/sbin:/bin:/usr/games' - PBCURRENTCOMMANDLINEOPERATION='build' - PBUILDER_OPERATION='build' - PBUILDER_PKGDATADIR='/usr/share/pbuilder' - PBUILDER_PKGLIBDIR='/usr/lib/pbuilder' - PBUILDER_SYSCONFDIR='/etc' - PPID='2575151' - PS1='# ' - PS2='> ' + INVOCATION_ID=ada059708d67436faec21521741a0d49 + LANG=C + LANGUAGE=et_EE:et + LC_ALL=C + MACHTYPE=x86_64-pc-linux-gnu + MAIL=/var/mail/root + OPTERR=1 + OPTIND=1 + OSTYPE=linux-gnu + PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path + PBCURRENTCOMMANDLINEOPERATION=build + PBUILDER_OPERATION=build + PBUILDER_PKGDATADIR=/usr/share/pbuilder + PBUILDER_PKGLIBDIR=/usr/lib/pbuilder + PBUILDER_SYSCONFDIR=/etc + PIPESTATUS=([0]="0") + POSIXLY_CORRECT=y + PPID=1624683 PS4='+ ' - PWD='/' - SHELL='/bin/bash' - SHLVL='2' - SUDO_COMMAND='/usr/bin/timeout -k 18.1h 18h /usr/bin/ionice -c 3 /usr/bin/nice /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.O8QvZU5C/pbuilderrc_k18H --distribution forky --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/forky-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.O8QvZU5C/b1 --logfile b1/build.log schleuder_5.0.1-2.dsc' - SUDO_GID='110' - SUDO_HOME='/var/lib/jenkins' - SUDO_UID='105' - SUDO_USER='jenkins' - TERM='unknown' - TZ='/usr/share/zoneinfo/Etc/GMT+12' - USER='root' - _='/usr/bin/systemd-run' - http_proxy='http://213.165.73.152:3128' + PWD=/ + SHELL=/bin/bash + SHELLOPTS=braceexpand:errexit:hashall:interactive-comments:posix + SHLVL=3 + SUDO_COMMAND='/usr/bin/timeout -k 24.1h 24h /usr/bin/ionice -c 3 /usr/bin/nice -n 11 /usr/bin/unshare --uts -- /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.O8QvZU5C/pbuilderrc_Ebtz --distribution forky --hookdir /etc/pbuilder/rebuild-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/forky-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.O8QvZU5C/b2 --logfile b2/build.log schleuder_5.0.1-2.dsc' + SUDO_GID=111 + SUDO_HOME=/var/lib/jenkins + SUDO_UID=106 + SUDO_USER=jenkins + TERM=unknown + TZ=/usr/share/zoneinfo/Etc/GMT-14 + UID=0 + USER=root + _='I: set' + http_proxy=http://46.16.76.132:3128 I: uname -a - Linux ionos5-amd64 6.12.41+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.41-1 (2025-08-12) x86_64 GNU/Linux + Linux i-capture-the-hostname 6.12.41+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.41-1 (2025-08-12) x86_64 GNU/Linux I: ls -l /bin - lrwxrwxrwx 1 root root 7 Aug 10 2025 /bin -> usr/bin -I: user script /srv/workspace/pbuilder/2575151/tmp/hooks/D02_print_environment finished + lrwxrwxrwx 1 root root 7 Aug 10 12:30 /bin -> usr/bin +I: user script /srv/workspace/pbuilder/1624683/tmp/hooks/D02_print_environment finished -> Attempting to satisfy build-dependencies -> Creating pbuilder-satisfydepends-dummy package Package: pbuilder-satisfydepends-dummy @@ -344,7 +376,7 @@ Get: 185 http://deb.debian.org/debian forky/main amd64 ruby-thor all 1.3.2-2.1 [49.4 kB] Get: 186 http://deb.debian.org/debian forky/main amd64 ruby-typhoeus all 1.4.0-6 [36.5 kB] Get: 187 http://deb.debian.org/debian forky/main amd64 thin amd64 1.8.2+git20250216.de6b618-1 [61.5 kB] -Fetched 54.8 MB in 15s (3766 kB/s) +Fetched 54.8 MB in 16s (3533 kB/s) Preconfiguring packages ... Selecting previously unselected package libexpat1:amd64. (Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 19855 files and directories currently installed.) @@ -960,8 +992,8 @@ Setting up tzdata (2025b-5) ... Current default time zone: 'Etc/UTC' -Local time is now: Sun Sep 27 22:52:35 UTC 2026. -Universal Time is now: Sun Sep 27 22:52:35 UTC 2026. +Local time is now: Mon Aug 25 16:47:12 UTC 2025. +Universal Time is now: Mon Aug 25 16:47:12 UTC 2025. Run 'dpkg-reconfigure tzdata' if you wish to change it. Setting up ruby-minitest (5.25.4-3) ... @@ -1129,7 +1161,11 @@ Building tag database... -> Finished parsing the build-deps I: Building the package -I: Running cd /build/reproducible-path/schleuder-5.0.1/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-genchanges -S > ../schleuder_5.0.1-2_source.changes +I: user script /srv/workspace/pbuilder/1624683/tmp/hooks/A99_set_merged_usr starting +Not re-configuring usrmerge for forky +I: user script /srv/workspace/pbuilder/1624683/tmp/hooks/A99_set_merged_usr finished +hostname: Name or service not known +I: Running cd /build/reproducible-path/schleuder-5.0.1/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path" HOME="/nonexistent/second-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path" HOME="/nonexistent/second-build" dpkg-genchanges -S > ../schleuder_5.0.1-2_source.changes dpkg-buildpackage: info: source package schleuder dpkg-buildpackage: info: source version 5.0.1-2 dpkg-buildpackage: info: source distribution unstable @@ -1164,7 +1200,7 @@ dh_ruby --build dh_auto_test -O--buildsystem=ruby dh_ruby --test - rm -fr -- /tmp/dh-xdg-rundir-x8j4zHkV + rm -fr -- /tmp/dh-xdg-rundir-9tQZ7LfR create-stamp debian/debhelper-build-stamp dh_testroot -O--buildsystem=ruby dh_prep -O--buildsystem=ruby @@ -1311,736 +1347,736 @@ RUBYLIB=/build/reproducible-path/schleuder-5.0.1/debian/schleuder/usr/lib/ruby/vendor_ruby:. GEM_PATH=/build/reproducible-path/schleuder-5.0.1/debian/schleuder/usr/share/rubygems-integration/all:/build/reproducible-path/schleuder-5.0.1/debian/.debhelper/generated/_source/home/.local/share/gem/ruby/3.3.0:/var/lib/gems/3.3.0:/usr/local/lib/ruby/gems/3.3.0:/usr/lib/ruby/gems/3.3.0:/usr/lib/x86_64-linux-gnu/ruby/gems/3.3.0:/usr/share/rubygems-integration/3.3.0:/usr/share/rubygems-integration/all:/usr/lib/x86_64-linux-gnu/rubygems-integration/3.3.0 ruby3.3 -S rake --rakelibdir /gem2deb-nonexistent -f debian/ruby-tests.rake /usr/bin/ruby3.3 -S rake -f debian/Rakefile db:create -Created database '/tmp/schleuder-a304d13be0972b2599cecaad4ce87276/test.sqlite3' +Created database '/tmp/schleuder-348d33ae87ad3e481532fda646f6a13e/test.sqlite3' /usr/bin/ruby3.3 -S rake -f debian/Rakefile db:schema:load /usr/bin/ruby3.3 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.13.1/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.13.0/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.13.0/exe/rspec --format documentation -Randomized with seed 50886 +Randomized with seed 40730 -keys via api - check - does check keys with authorization - doesn't check keys without authentication - list - does list keys with authentication - doesn't list keys without authentication - import - doesn't import keys without authentication - returns json with key details about imported keys - returns json with empty array in case of useless input - does list keys with authentication - a key with broken utf8 in uid - does add key - already imported - does get key - does list this key - does delete key - export - does list keys with authentication - doesn't export keys without authentication - delete - does delete keys with authentication - doesn't delete keys without authentication - -Schleuder::KeyFetcher - #fetch - reports an error from trying to fetch an URL that doesn't exist - fetches one key from a good URL - fetches one key by fingerprint from SKS if vks_keyserver is blank - fetches one key by fingerprint from VKS if vks_keyserver is set - reports an error if both, vks_keyserver and sks_keyserver, are blank - reports the returned body content when receiving an unexpected HTTP status from the server - fetches one key by email from SKS if vks_keyserver is blank - reports an error from trying to import non-key-material - fetches one key by email from VKS if vks_keyserver is set - -Schleuder::KeywordHandlers::SignThis - responds to the configured keyword method - signs body content if no attachments are present - signs attachment (even if a body is present) +lists via api + creates a list + shows a list + correctly finds a list by email-address that starts with a number Schleuder::Subscription - is invalid when fingerprint contains invalid characters - downcases all letters of an email address - is invalid when email is nil - has a valid factory - is expected to respond to #email - is valid when fingerprint is nil - is expected to respond to #delivery_enabled - is expected to respond to #fingerprint - is expected to respond to #list_id - is invalid when list_id is blank - is invalid if admin is blank - is invalid when email is blank - formats email address when email begins with a space - is invalid when email does not contain an @ is invalid if admin is nil - is invalid if the given email is already subscribed for the list - is expected to respond to #admin + is expected to respond to #email removes whitespaces and 0x from the fingerprint is invalid if delivery_enabled is blank is invalid if delivery_enabled is nil + is expected to respond to #delivery_enabled + is invalid when email does not contain an @ + is expected to respond to #admin + is expected to respond to #list_id + is valid when fingerprint is nil is valid when fingerprint is empty + is invalid if the given email is already subscribed for the list + is invalid if admin is blank + is expected to respond to #fingerprint + formats email address when email begins with a space + is invalid when email is nil + is invalid when list_id is blank + downcases all letters of an email address + is invalid when email is blank + is invalid when fingerprint contains invalid characters + has a valid factory #fingerprint transforms the fingerprint to upper case -authorization via api - allows un-authorized access to /status.json - blocks un-authorized access to other URLs - allows authorized access - -status - returns status code 200 +Schleuder::KeyFetcher + #fetch + fetches one key by email from SKS if vks_keyserver is blank + fetches one key by fingerprint from SKS if vks_keyserver is blank + reports an error if both, vks_keyserver and sks_keyserver, are blank + reports an error from trying to fetch an URL that doesn't exist + fetches one key from a good URL + reports the returned body content when receiving an unexpected HTTP status from the server + fetches one key by fingerprint from VKS if vks_keyserver is set + reports an error from trying to import non-key-material + fetches one key by email from VKS if vks_keyserver is set user sends emails with different charsets - works with simple_jis - works with japanese_attachment works with simple_utf8 + works with japanese + works with ks_c_5601-1987 works with simple_jpiso2022 works with thunderbird-multi-alt-html + works with japanese_iso_2022 + works with simple_jis + works with signed_utf8 + works with japanese_attachment works with simple_latin1 works with japanese_shift_jis works with japanese_attachment_long_name - works with japanese - works with ks_c_5601-1987 - works with japanese_iso_2022 - works with signed_utf8 -GPGME::Key - .valid_fingerprint? - valid fingerprints - accepts 59C71FB38AEE22E091C78259D06350440F759BD3 as a valid fingerprint - accepts 59C71FB38AEE22E091C78259D0635044 as a valid fingerprint - accepts 0x59C71FB38AEE22E091C78259D06350440F759BD3 as a valid fingerprint - accepts 0x59C71FB38AEE22E091C78259D0635044 as a valid fingerprint - invalid fingerprints - rejects Z9C71FB38AEE22E091C78259D0635044 as an invalid fingerprint - rejects Z9C71FB38AEE22E091C78259D0635044 as an invalid fingerprint - rejects 59C71FB38AEE22E091C78259D06350440F759BD3A as an invalid fingerprint - rejects Z9C71FB38AEE22E091C78259D06350440F759BD3 as an invalid fingerprint - rejects 0x59C71FB38AEE22E091C78259D06350440F759B as an invalid fingerprint - rejects 59C71FB38AEE22E091C78259D06350440F759BD as an invalid fingerprint - #minimal - returns a minimal key - #summary - displays the expected attributes for a key that's not capable of encryption - displays the expected basic attributes - displays the expected attributes for an expiring key - displays the expected attributes for a revoked key - displays the expected attributes for an expired key +version + returns the current schleuder version if authorized + does not return the current schleuder version if not authorized -lists via api - creates a list - correctly finds a list by email-address that starts with a number - shows a list +Schleuder::Http + uses a proxy if one is configured -protected subject - recognizes keywords in mails with protected headers and empty subject - is not leaked - works with mutt protected headers - is included in mime-headers - don't block request-messages - is included as mime-part in body +Schleuder::ListBuilder + creates a new, valid list + subscribes the adminaddress and ignores the adminfingerprint if an adminkey was given + creates a list-key with all required UIDs + returns an error-message if given an invalid email-address + subscribes the adminaddress and respects the given adminfingerprint + returns an error-message if given an invalid email-address with a space + creates a listdir for the list + subscribes the adminaddress and imports the adminkey -user sends a plain text message - from thunderbird being signed-inline - from thunderbird being signed-mime - from thunderbird being plain +GPGME::Ctx + #keyimport + #find_keys with bracketed wrong email-address + #normalize_key_identifier with un-prefixed fingerprint + #gpgcli returns correct data types + #find_keys with correctly marked sub-string + #normalize_key_identifier with bracketed email-address + #find_keys with un-marked sub-string + #find_keys without argument + #find_keys with un-prefixed fingerprint + #normalize_key_identifier with URL + #find_keys with un-bracketed email-address + #normalize_key_identifier with some string + #normalize_key_identifier with un-bracketed email-address + #find_keys with correctly marked narrower sub-string + #find_keys with un-bracketed wrong email-address + #keyimport with unusable data + #find_keys with prefixed fingerprint + #normalize_key_identifier with prefixed fingerprint + #find_keys with bracketed email-address + +Schleuder::LoggerNotifications + notifies admins of multiple text-messages + notifies admins of multiple text-messages and the original message + includes a List-Id header in notification mails sent to admins + notifies admins of simple text-message + notifies admins encryptedly if their key is usable + notifies admins in the clear if their key is unusable + return path + sets default superadmin + sets superadmin Schleuder::Filters + .receive_from_subscribed_emailaddresses_only + rejects a message with a non-subscribed address as From-header if list.receive_from_subscribed_emailaddresses_only is set + does not reject a message with a non-subscribed address as From-header if list.receive_from_subscribed_emailaddresses_only is not set + does not reject a message with a subscribed address as From-header if list.receive_from_subscribed_emailaddresses_only is set + does not reject a message with a subscribed address as From-header with different letter case if list.receive_from_subscribed_emailaddresses_only is set + .strip_html_from_alternative + does not choke on nor change a message without Content-Type-header + does NOT strip HTML-part from multipart/alternative-message that does NOT contain ascii-armored PGP-data + strips HTML-part from multipart/alternative-message that contains ascii-armored PGP-data .key_auto_import_from_attachments - does not import key if sender address does not match key UID - only imports the one key that matches the sender address if keydata contains more than one key - does not import key if attachment has a different content-type than "application/pgp-keys" - imports key and reports no change imports key and reports new key imports key and reports the change - .fix_exchange_messages - fixes pgp/mime-messages that were mangled by Exchange - works with a text/plain message + imports key and reports no change + only imports the one key that matches the sender address if keydata contains more than one key + does not import key if sender address does not match key UID + does not import key if attachment has a different content-type than "application/pgp-keys" .strip_html_from_alternative_if_keywords_present + strips HTML-part from multipart/alternative-message that contains keywords does NOT strip HTML-part from multipart/alternative-message that does NOT contain keywords does not choke on nor change a message without Content-Type-header - strips HTML-part from multipart/alternative-message that contains keywords strips related-part from encapsulated multipart/alternative-part that contains keywords .key_auto_import_from_autocrypt_header - imports key and reports the change imports key and reports no change - does not import key if sender address does not match key UID, regardless of Autocrypt addr attribute - imports key and reports new key + imports key and reports the change only imports the one key that matches the sender address if keydata contains more than one key - .strip_html_from_alternative - does not choke on nor change a message without Content-Type-header - does NOT strip HTML-part from multipart/alternative-message that does NOT contain ascii-armored PGP-data - strips HTML-part from multipart/alternative-message that contains ascii-armored PGP-data - .receive_from_subscribed_emailaddresses_only - does not reject a message with a subscribed address as From-header with different letter case if list.receive_from_subscribed_emailaddresses_only is set - does not reject a message with a subscribed address as From-header if list.receive_from_subscribed_emailaddresses_only is set - rejects a message with a non-subscribed address as From-header if list.receive_from_subscribed_emailaddresses_only is set - does not reject a message with a non-subscribed address as From-header if list.receive_from_subscribed_emailaddresses_only is not set - -someone sends an email to a listname-dash-address - forwards the message to the admins if extension is -bounce and it's a real bounce mail - sends the list's key as reply to -sendkey - forwards the message to the admins if extension is -owner - forwards the message to the admins if extension is -bounce - -Errors - ::MessageTooBig shows sensible string in response to to_s() - ::MessageEmpty shows sensible string in response to to_s() - ::MessageSenderNotSubscribed shows sensible string in response to to_s() - ::KeywordAdminOnly shows sensible string in response to to_s() - ::KeyAdduidFailed shows sensible string in response to to_s() - ::LoadingListSettingsFailed shows sensible string in response to to_s() - ::MessageNotFromAdmin shows sensible string in response to to_s() - ::ListNotFound shows sensible string in response to to_s() - ::MessageUnauthenticated shows sensible string in response to to_s() - ::ListdirProblem shows sensible string in response to to_s() - ::KeyGenerationFailed shows sensible string in response to to_s() - ::DecryptionFailed shows sensible string in response to to_s() - ::MessageUnencrypted shows sensible string in response to to_s() - ::MessageUnsigned shows sensible string in response to to_s() - ::TooManyKeys shows sensible string in response to to_s() - -a bounce message is received - from bounce example - -Schleuder::LoggerNotifications - notifies admins of simple text-message - includes a List-Id header in notification mails sent to admins - notifies admins of multiple text-messages - notifies admins encryptedly if their key is usable - notifies admins in the clear if their key is unusable - notifies admins of multiple text-messages and the original message - return path - sets default superadmin - sets superadmin + imports key and reports new key + does not import key if sender address does not match key UID, regardless of Autocrypt addr attribute + .fix_exchange_messages + works with a text/plain message + fixes pgp/mime-messages that were mangled by Exchange -subscription via api - unsubscribes members - subscribes new member to a list - subscribes an admin user with a truthy value - subscribes an admin user - doesn't subscribe new member without authentication - subscribes an user and unsets delivery flag +user sends keyword + x-resend-unencrypted with matching key + x-unsubscribe doesn't unsubscribe last admin + x-resend-cc-encrypted-only to 2 addresses with missing keys + x-resend-cc to 2 addresses with missing keys + x-fetch-key without arguments + x-unset-fingerprint with own email-address as admin but without force + x-resend with admin-notification and admin has delivery disabled + x-set-fingerprint without email-address and with valid fingerprint + x-get-key with invalid argument + x-list-key with prefixed fingerprint + x-set-fingerprint with not-subscribed email-address and valid fingerprint + x-unsubscribe without argument + x-set-fingerprint with own email-address and valid, spaces-separated fingerprint + x-list-subscriptions with non-matching argument + x-unsubscribe + x-fetch-key with fingerprint of unchanged key + x-list-subscriptions with matching argument + x-subscribe with attributes (first one 'false') and spaces-separated fingerprint + x-list-key with arbitrary email-sub-string + x-unsubscribe with invalid argument + x-resend-cc to 2 addresses with one missing keys + x-unset-fingerprint with other email-address as admin + x-set-fingerprint with email-address but without valid fingerprint + x-fetch-key with unknown email-address + x-subscribe with attributes + x-get-logfile with debug level sends non-empty logfile + x-set-fingerprint with other email-address and valid fingerprint as non-admin + x-subscribe with attributes and spaces-separated fingerprint + x-resend-encrypted-only with matching key + x-fetch-key with fingerprint + x-fetch-key with invalid URL + x-sign-this with inline text + x-set-fingerprint without email-address and with invalid fingerprint + x-subscribe without arguments + x-set-fingerprint with own email-address and valid fingerprint + x-set-fingerprint without argument + x-set-fingerprint with other email-address and valid fingerprint + x-resend-cc-encrypted-only to 3 addresses with one missing keys + resend returns an error about wrong arguments if email content got into the arguments due to no blank line + x-resend with invalid recipient + x-resend-cc-encrypted-only with matching key + x-subscribe with invalid arguments + x-unset-fingerprint with not-subscribed email-address + x-subscribe without attributes, but with spaces-separated fingerprint + x-fetch-key with email address + x-subscribe with one attribute and spaces-separated fingerprint + x-subscribe with attributes (last one 'true') and spaces-separated fingerprint + does not parse keywords once the mail body started + x-resend-encrypted-only with two matching keys, one of which is expired + x-get-version with delivery disabled + x-set-fingerprint with email-address but without fingerprint + x-attach-listkey + x-list-keys with two arguments + x-fetch-key with unknown fingerprint + x-get-key with empty argument + x-attach-listkey from Thunderbird with protected headers + x-resend-cc-encrypted-only to 2 addresses with matching keys + x-resend-cc-encrypted-only to 2 addresses with one missing keys + x-get-version + x-unset-fingerprint with other email-address as non-admin + x-get-logfile with error-level sends empty logfile + x-fetch-key with invalid input + x-subscribe without attributes + x-fetch-key with URL + x-list-keys without arguments + x-list-subscriptions without arguments + x-unset-fingerprint with own email-address as admin and force + x-resend with admin-notification + x-resend with iso-8859-1 body + x-resend with utf-8 body and umlauts + x-list-keys with one argument + x-resend + x-list-key with correctly prefixed email-sub-string + x-get-key with valid argument + x-list-subscriptions without arguments but with admin-notification + x-sign-this with attachments + x-resend-cc-encrypted-only with expired key + x-unset-fingerprint without argument + x-resend-encrypted-only with expired key + x-resend does not include internal_footer + with broken utf8 in key + x-get-key with valid argument + x-list-keys works + x-add-key with inline key-material -KeywordHandlersRunner - rejects unknown keywords - rejects X-LIST-NAME with mismatching argument - loads additional keyword handlers - does not require mandatory keywords if no keywords are present - returns an error message if keyword is configured as admin-only - notifies admins - requires X-LIST-NAME - stores a keyword that was registered +GPGME::Key + #minimal + returns a minimal key + #summary + displays the expected attributes for a revoked key + displays the expected attributes for an expiring key + displays the expected attributes for an expired key + displays the expected attributes for a key that's not capable of encryption + displays the expected basic attributes + .valid_fingerprint? + valid fingerprints + accepts 59C71FB38AEE22E091C78259D06350440F759BD3 as a valid fingerprint + accepts 0x59C71FB38AEE22E091C78259D0635044 as a valid fingerprint + accepts 0x59C71FB38AEE22E091C78259D06350440F759BD3 as a valid fingerprint + accepts 59C71FB38AEE22E091C78259D0635044 as a valid fingerprint + invalid fingerprints + rejects Z9C71FB38AEE22E091C78259D06350440F759BD3 as an invalid fingerprint + rejects Z9C71FB38AEE22E091C78259D0635044 as an invalid fingerprint + rejects 0x59C71FB38AEE22E091C78259D06350440F759B as an invalid fingerprint + rejects 59C71FB38AEE22E091C78259D06350440F759BD3A as an invalid fingerprint + rejects 59C71FB38AEE22E091C78259D06350440F759BD as an invalid fingerprint + rejects Z9C71FB38AEE22E091C78259D0635044 as an invalid fingerprint Schleuder::Filters::Runner is expected to respond to #run loading filters - loads custom filters from filters_dir even with non-2-digit priority - loads filters from built-in filters_dir sorts them loads custom filters from filters_dir and sorts them in, ignores filter not following convention + loads filters from built-in filters_dir sorts them loads custom filters from filters_dir and sorts them in with missing dir + loads custom filters from filters_dir even with non-2-digit priority #run + stops on a StandardError and returns error even on headers match stops on a StandardError and returns error runs the filters stops on a StandardError and returns error even with bounces_drop_all - stops on a StandardError and returns error even on headers match - -Schleuder::Runner - after keyword parsing - falls back to default charset per RFC if none is set - falling back works also with non-ascii content - #run - injects pseudoheaders appropriately into an unsigned thunderbird-multipart/alternative-message - delivers a signed error message if a subscription's key is not available on a encrypted-only list - does not throw an error on encrypted but unsigned emails that contain a forwarded encrypted email - does not throw an error on emails with an attached pgp key as application/octet-stream - delivers a signed error message if a subscription's key is expired on a encrypted-only list - does not throw an error on emails with large first mime-part - does not throw an error on emails with broken utf-8 - injects pseudoheaders appropriately into a signed multipart/alternative-message (thunderbird+enigmail-1.9) - does not throw an error on emails that contain other gpg keywords - with bounces_drop_all set to false - bounces and does not notify admins if bounces_notify_admins is set to false - bounces and notifies admins about bounces when bounces_notify_admins is set to true - with a plain text message - has the correct headerlines - includes the internal_footer - does keep the Message-Id as configured - contains the specified pseudoheaders in the correct order - does not include the public_footer - contains the list headers if include_list_headers is set to true - contains the open pgp header if include_openpgp_header is set to true - doesn't leak the Message-Id as configured - does not deliver content if send_encrypted_only is set to true - delivers the incoming message - contains the Autocrypt header if include_autocrypt_header is set to true - does not contain the Autocrypt header if include_autocrypt_header is set to false - doesn't have unwanted headerlines from the original message - with bounces_drop_all set to true - drops all bounces when bounces_notify_admins is set to false - notifies admins about bounces when bounces_notify_admins is set to true - Quoted-Printable encoding - is handled properly in encrypted+signed emails - is handled properly in cleartext emails - is handled properly in encrypted emails - mails not encrypted to the list key - handles a mail which was encrypted to a passphrase and returns DecryptionFailed error - handles a mail containing PGP-garbage and returns DecryptionFailed error - handles a mail which was encrypted to an absent key and returns DecryptionFailed error - -Schleuder::KeywordHandlers::KeyManagement - registers keywords - .delete_key - sends error message if no argument is given - deletes multiple keys that each distinctly match one argument - deletes no key if the argument does not match - returns a string as error message if input message has no content - deletes a key that distinctly matches the argument - .add_key - rejects garbage - imports a key from attached binary material (without specified encoding) - ignores body if an ascii-armored attachment is present - imports a key from inline ascii-armored material - imports from attached quoted-printable ascii-armored key-material - imports a key from attached acsii-armored material - imports a key from attached quoted-printable binary material - ignores arguments - imports from attached quoted-printable binary key-material (as produced by Mutt 2.0.5) - imports from attached quoted-printable key-material (as produced by Thunderbird 115) - imports a key from attached explicitly base64-encoded binary material - imports from an inline mix of ascii-armored key and non-key material - updates a key - -version - does not return the current schleuder version if not authorized - returns the current schleuder version if authorized running filters - .key_auto_import_from_attachments - successfully validates a signature, whose previously unknown key is attached - successfully validates a signature, whose previously unknown key is attached, from an encrypted+signed message - .max_message_size - bounces to big mails .fix_exchange_messages! - accepts an invalid pgp/mime Exchange message accepts a valid plain-text message + accepts an invalid pgp/mime Exchange message .strip_html_from_alternative! does NOT strip HTML-part from multipart/alternative-message that does NOT contain ascii-armored PGP-data strips HTML-part from multipart/alternative-message that contains ascii-armored PGP-data + .key_auto_import_from_attachments + successfully validates a signature, whose previously unknown key is attached + successfully validates a signature, whose previously unknown key is attached, from an encrypted+signed message .key_auto_import_from_autocrypt_header successfully validates a signature, whose previously unknown key is in the autocrypt-header + .max_message_size + bounces to big mails Schleuder::Conf reads ERB code in config files -Schleuder::Http - uses a proxy if one is configured - -cli - #commands - exits with a status code of 1 in case the command is not implemented - #check_keys - warns about file system permissions if it was run as root - #refresh_keys - reports errors from refreshing keys - updates keys from the keyserver for only a specific list - warns about file system permissions if it was run as root - updates keys from the keyserver +user sends a plain text message + from thunderbird being signed-mime + from thunderbird being plain + from thunderbird being signed-inline -Schleuder::KeywordHandlers::Base - stores mail, list and arguments as instance variables - provides methods to register keywords +KeywordHandlersRunner + requires X-LIST-NAME + loads additional keyword handlers + does not require mandatory keywords if no keywords are present + rejects unknown keywords + notifies admins + returns an error message if keyword is configured as admin-only + rejects X-LIST-NAME with mismatching argument + stores a keyword that was registered -user sends an encrypted message - from thunderbird being encrypted-inline - from thunderbird being encrypted+signed-inline - from thunderbird being encrypted-mime - from thunderbird being encrypted+signed-mime +a bounce message is received + from bounce example -GPGME::Ctx - #normalize_key_identifier with un-prefixed fingerprint - #find_keys with prefixed fingerprint - #normalize_key_identifier with un-bracketed email-address - #find_keys with un-bracketed wrong email-address - #normalize_key_identifier with bracketed email-address - #find_keys with un-prefixed fingerprint - #normalize_key_identifier with URL - #find_keys with un-bracketed email-address - #keyimport with unusable data - #find_keys without argument - #find_keys with correctly marked narrower sub-string - #normalize_key_identifier with some string - #gpgcli returns correct data types - #find_keys with correctly marked sub-string - #normalize_key_identifier with prefixed fingerprint - #find_keys with bracketed wrong email-address - #find_keys with un-marked sub-string - #keyimport - #find_keys with bracketed email-address +Schleuder::KeywordHandlers::KeyManagement + registers keywords + .delete_key + sends error message if no argument is given + deletes no key if the argument does not match + deletes a key that distinctly matches the argument + returns a string as error message if input message has no content + deletes multiple keys that each distinctly match one argument + .add_key + imports a key from attached quoted-printable binary material + imports from attached quoted-printable key-material (as produced by Thunderbird 115) + updates a key + imports a key from attached binary material (without specified encoding) + imports from an inline mix of ascii-armored key and non-key material + rejects garbage + imports a key from attached explicitly base64-encoded binary material + imports a key from inline ascii-armored material + ignores body if an ascii-armored attachment is present + imports a key from attached acsii-armored material + imports from attached quoted-printable ascii-armored key-material + ignores arguments + imports from attached quoted-printable binary key-material (as produced by Mutt 2.0.5) Mail::Message - recognizes a sudo message with 'Auto-Submitted'-header NOT as automated message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_24.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/unknown_code_bounce_01.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_13.txt.eml as normal message - recognizes a cron message with 'Auto-Submitted'-header NOT as automated message - recognizes a message sent to listname-bounce@hostname as automated message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_18.txt.eml as normal message - does not misclassify normal message spec/fixtures/mails/not_bounces/tt_1234241664.txt.eml as bounce - does not misclassify bounce spec/fixtures/mails/bounces/tt_1234211929.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_16.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_01.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_19.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_05.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_1234211931.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_12_soft.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_17.txt.eml as normal message + does not misclassify normal message spec/fixtures/mails/not_bounces/Bug_948981-_marked_as_pending_in_schleuder.eml as bounce + does not misclassify bounce spec/fixtures/mails/bounces/tt_1234285532.txt.eml as normal message does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_06.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_25.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_02.txt.eml as normal message - recognizes bounce message subject using the bounce_email gem - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_22.txt.eml as normal message + adds list#public_footer as last mime-part without changing its value does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_23.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_08.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_1234211932.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_1234285668.txt.eml as normal message - doesn't change the order of mime-parts - does not misclassify bounce spec/fixtures/mails/bounces/tt_1234211357.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/malformed_bounce_01.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_01.txt.eml as normal message + recognizes bounce message subject using the bounce_email gem + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_07.txt.eml as normal message does not misclassify bounce spec/fixtures/mails/bounces/undeliverable_gmail.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_11.txt.eml as normal message + verifies an encapsulated (signed-then-encrypted) message + recognizes a cron message with 'Auto-Submitted'-header NOT as automated message + doesn't change the order of mime-parts does not misclassify normal message spec/fixtures/mails/not_bounces/tt_1234211024.txt.eml as bounce - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_21.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_11.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_20.txt.eml as normal message + does not misclassify normal message spec/fixtures/mails/not_bounces/Bug_948980-_marked_as_pending_in_schleuder.eml as bounce + does not misclassify bounce spec/fixtures/mails/bounces/tt_1234175799.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_22.txt.eml as normal message does not misclassify bounce spec/fixtures/mails/bounces/tt_1234241665.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_18.txt.eml as normal message does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_15.txt.eml as normal message - does not misclassify normal message spec/fixtures/mails/not_bounces/Bug_948981-_marked_as_pending_in_schleuder.eml as bounce - does not misclassify bounce spec/fixtures/mails/bounces/tt_1234177688.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_1234285532.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_07.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_09.txt.eml as normal message - adds list#internal_footer as last mime-part without changing its value - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_14.txt.eml as normal message - verifies an encapsulated (signed-then-encrypted) message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_17.txt.eml as normal message recognizes a Jenkins message with 'Auto-Submitted'-header NOT as automated message - does not misclassify normal message spec/fixtures/mails/not_bounces/Bug_948980-_marked_as_pending_in_schleuder.eml as bounce + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_12_soft.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/malformed_bounce_01.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_04.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_1234211357.txt.eml as normal message does not misclassify normal message spec/fixtures/mails/not_bounces/Bug_948982-_marked_as_pending_in_schleuder.eml as bounce + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_05.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_1234211929.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_13.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_1234211932.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_1234285668.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_1234211931.txt.eml as normal message does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_10.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_20.txt.eml as normal message - does not misclassify bounce spec/fixtures/mails/bounces/tt_1234175799.txt.eml as normal message - adds list#public_footer as last mime-part without changing its value - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_03.txt.eml as normal message + does not misclassify normal message spec/fixtures/mails/not_bounces/tt_1234241664.txt.eml as bounce + recognizes a sudo message with 'Auto-Submitted'-header NOT as automated message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_19.txt.eml as normal message does not misclassify bounce spec/fixtures/mails/bounces/tt_1234210655.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_14.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_1234177688.txt.eml as normal message + recognizes a message sent to listname-bounce@hostname as automated message + adds list#internal_footer as last mime-part without changing its value + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_24.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_09.txt.eml as normal message does not misclassify normal message spec/fixtures/mails/not_bounces/tt_1234210666.txt.eml as bounce - does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_04.txt.eml as normal message - makes a pseudo header - that a multiline with less than 76 get wrapped correctly on the first line - with key / value - that multiline are getting wrapped - that a multiline with less than 76 get wrapped correctly on the first line and the following lines - with empty value - without value - that is getting wrapped - that single multiline are getting indented - that a line with less than 76 gets wrapped + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_08.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_02.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_16.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_21.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_25.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/unknown_code_bounce_01.txt.eml as normal message + does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_03.txt.eml as normal message #add_subject_prefix! - does not add a subject prefix if already present - adds a configured subject prefix without subject adds a configured subject prefix + adds a configured subject prefix without subject + does not add a subject prefix if already present .keywords - reads multiple lines as keyword arguments - stops looking for keywords when a blank line that is not followed by another keyword is met - ignores empty lines before keywords - takes the whole rest of the body as keyword argument if blank lines are present - stops looking for keywords when the first line is already email content - stops looking for keywords when already the first line is blank followed by email content drops multiple empty lines between keywords and content splits lines into words and downcases them in keyword arguments + reads multiple lines as keyword arguments drops empty lines in keyword arguments parsing + takes the whole rest of the body as keyword argument if blank lines are present + stops looking for keywords when already the first line is blank followed by email content + stops looking for keywords when the first line is already email content + ignores empty lines before keywords + stops looking for keywords when a blank line that is not followed by another keyword is met + makes a pseudo header + that multiline are getting wrapped + that is getting wrapped + that a multiline with less than 76 get wrapped correctly on the first line + with empty value + that a line with less than 76 gets wrapped + without value + that a multiline with less than 76 get wrapped correctly on the first line and the following lines + that single multiline are getting indented + with key / value + +someone sends an email to a listname-dash-address + forwards the message to the admins if extension is -bounce and it's a real bounce mail + forwards the message to the admins if extension is -bounce + sends the list's key as reply to -sendkey + forwards the message to the admins if extension is -owner + +cli + #commands + exits with a status code of 1 in case the command is not implemented + #refresh_keys + updates keys from the keyserver + warns about file system permissions if it was run as root + reports errors from refreshing keys + updates keys from the keyserver for only a specific list + #check_keys + warns about file system permissions if it was run as root + +user sends an encrypted message + from thunderbird being encrypted+signed-mime + from thunderbird being encrypted-mime + from thunderbird being encrypted+signed-inline + from thunderbird being encrypted-inline + +status + returns status code 200 + +subscription via api + subscribes an user and unsets delivery flag + doesn't subscribe new member without authentication + subscribes an admin user + unsubscribes members + subscribes new member to a list + subscribes an admin user with a truthy value + +authorization via api + allows un-authorized access to /status.json + allows authorized access + blocks un-authorized access to other URLs + +Errors + ::MessageNotFromAdmin shows sensible string in response to to_s() + ::ListNotFound shows sensible string in response to to_s() + ::LoadingListSettingsFailed shows sensible string in response to to_s() + ::DecryptionFailed shows sensible string in response to to_s() + ::KeywordAdminOnly shows sensible string in response to to_s() + ::MessageTooBig shows sensible string in response to to_s() + ::TooManyKeys shows sensible string in response to to_s() + ::MessageUnencrypted shows sensible string in response to to_s() + ::ListdirProblem shows sensible string in response to to_s() + ::MessageSenderNotSubscribed shows sensible string in response to to_s() + ::MessageUnauthenticated shows sensible string in response to to_s() + ::MessageEmpty shows sensible string in response to to_s() + ::MessageUnsigned shows sensible string in response to to_s() + ::KeyGenerationFailed shows sensible string in response to to_s() + ::KeyAdduidFailed shows sensible string in response to to_s() + +Schleuder::KeywordHandlers::SignThis + responds to the configured keyword method + signs body content if no attachments are present + signs attachment (even if a body is present) + +keys via api + a key with broken utf8 in uid + does add key + already imported + does delete key + does list this key + does get key + export + doesn't export keys without authentication + does list keys with authentication + delete + doesn't delete keys without authentication + does delete keys with authentication + check + does check keys with authorization + doesn't check keys without authentication + import + doesn't import keys without authentication + returns json with empty array in case of useless input + does list keys with authentication + returns json with key details about imported keys + list + does list keys with authentication + doesn't list keys without authentication + +Schleuder::KeywordHandlers::Base + provides methods to register keywords + stores mail, list and arguments as instance variables + +Schleuder::Runner + #run + does not throw an error on emails that contain other gpg keywords + does not throw an error on emails with large first mime-part + delivers a signed error message if a subscription's key is expired on a encrypted-only list + injects pseudoheaders appropriately into an unsigned thunderbird-multipart/alternative-message + injects pseudoheaders appropriately into a signed multipart/alternative-message (thunderbird+enigmail-1.9) + delivers a signed error message if a subscription's key is not available on a encrypted-only list + does not throw an error on emails with an attached pgp key as application/octet-stream + does not throw an error on emails with broken utf-8 + does not throw an error on encrypted but unsigned emails that contain a forwarded encrypted email + with a plain text message + does not deliver content if send_encrypted_only is set to true + doesn't leak the Message-Id as configured + contains the open pgp header if include_openpgp_header is set to true + delivers the incoming message + includes the internal_footer + does keep the Message-Id as configured + does not include the public_footer + does not contain the Autocrypt header if include_autocrypt_header is set to false + doesn't have unwanted headerlines from the original message + contains the list headers if include_list_headers is set to true + contains the specified pseudoheaders in the correct order + contains the Autocrypt header if include_autocrypt_header is set to true + has the correct headerlines + Quoted-Printable encoding + is handled properly in cleartext emails + is handled properly in encrypted emails + is handled properly in encrypted+signed emails + with bounces_drop_all set to true + drops all bounces when bounces_notify_admins is set to false + notifies admins about bounces when bounces_notify_admins is set to true + mails not encrypted to the list key + handles a mail which was encrypted to a passphrase and returns DecryptionFailed error + handles a mail which was encrypted to an absent key and returns DecryptionFailed error + handles a mail containing PGP-garbage and returns DecryptionFailed error + with bounces_drop_all set to false + bounces and does not notify admins if bounces_notify_admins is set to false + bounces and notifies admins about bounces when bounces_notify_admins is set to true + after keyword parsing + falling back works also with non-ascii content + falls back to default charset per RFC if none is set Schleuder::List + is expected to respond to #subject_prefix_out + is invalid if max_message_size_kb is 0 is valid if keywords_admin_only does not contain special characters - is expected to respond to #log_level - is expected to respond to #public_footer - is invalid if include_list_headers is blank - is invalid if bounces_drop_on_headers contains special characters + is expected to respond to #bounces_drop_all + is valid if headers_to_meta does not contain special characters + is expected to respond to #openpgp_header_preference is invalid if forward_all_incoming_to_admins is nil - is valid if subject_prefix_in is nil - is invalid if include_openpgp_header is nil - is expected to respond to #bounces_notify_admins - is expected to respond to #receive_admin_only - is expected to respond to #keywords_admin_only - is valid if keywords_admin_notify does not contain special characters + is invalid if receive_admin_only is nil + is invalid if receive_admin_only is blank + is invalid if bounces_drop_all is blank + is expected to respond to #language + is invalid if keywords_admin_notify contains special characters + is invalid if deliver_selfsent is nil + is invalid if bounces_drop_all is nil + is invalid if receive_from_subscribed_emailaddresses_only is blank + is invalid if include_list_headers is nil + is expected to respond to #headers_to_meta + is invalid if deliver_selfsent is blank + is expected to respond to #email + is invalid if include_list_headers is nil + is invalid if bounces_notify_admins is nil is invalid if include_list_headers is blank + is expected to respond to #keywords_admin_only + is invalid if keep_msgid is nil is invalid when email does not contain an @ - is expected to respond to #logfiles_to_keep - is expected to respond to #language - is invalid if munge_from is nil + is invalid if headers_to_meta contains special characters + is invalid if language is jp + is invalid if receive_authenticated_only is blank + is expected to respond to #subject_prefix + is invalid if include_openpgp_header is nil + is expected to respond to #receive_from_subscribed_emailaddresses_only + is expected to respond to #bounces_drop_on_headers + is invalid if receive_from_subscribed_emailaddresses_only is nil + is invalid if internal_footer includes a non-printable character is invalid when fingerprint is nil - is expected to respond to #internal_footer - is expected to respond to #headers_to_meta - is expected to respond to #bounces_drop_all - is invalid when email is blank - is expected to respond to #fingerprint - is valid if subject_prefix_out is nil + has a valid factory + is expected to respond to #public_footer + is invalid if receive_signed_only is blank is invalid if set_reply_to_to_sender is blank - is invalid if public_footer includes a non-printable character - is invalid if language is jp - is invalid if include_list_headers is nil - is invalid if max_message_size_kb is 0 + is invalid if munge_from is nil + is valid if keywords_admin_notify does not contain special characters is invalid if bounces_notify_admins is blank - is expected to respond to #deliver_selfsent - is invalid if send_encrypted_only is blank - is expected to respond to #openpgp_header_preference - is invalid when email is nil - is invalid if send_encrypted_only is nil - exports the key with the given fingerprint - is invalid if receive_authenticated_only is blank - is invalid if openpgp_header_preference is foobar - is invalid if forward_all_incoming_to_admins is blank - is expected to respond to #subject_prefix_in - is invalid when fingerprint is blank - is invalid if receive_admin_only is nil - is invalid if munge_from is blank - is expected to respond to #subject_prefix_out + is invalid if log_level is foobar + is invalid if include_list_headers is blank + is invalid if receive_encrypted_only is nil is expected to respond to #keep_msgid - is invalid if receive_authenticated_only is nil - is expected to respond to #key_auto_import_from_email - is expected to respond to #receive_authenticated_only is invalid if logfiles_to_keep is 0 - is invalid if deliver_selfsent is nil - is expected to respond to #set_reply_to_to_sender - is invalid if receive_from_subscribed_emailaddresses_only is blank - is invalid if keep_msgid is blank - is expected to respond to #subscriptions - is expected to respond to #receive_signed_only - is invalid if set_reply_to_to_sender is nil - is expected to respond to #receive_from_subscribed_emailaddresses_only - is invalid if receive_signed_only is blank - is valid if headers_to_meta does not contain special characters - is invalid if bounces_notify_admins is nil + is expected to respond to #subject_prefix_in is expected to respond to #keywords_admin_notify - is invalid if bounces_drop_all is nil - is invalid if keep_msgid is nil - is invalid if internal_footer includes a non-printable character - is invalid if subject_prefix_in contains a linebreak - is invalid when fingerprint contains invalid characters - is expected to respond to #forward_all_incoming_to_admins is expected to respond to #include_list_headers - is expected to respond to #send_encrypted_only - is invalid when email contains a space - is expected to respond to #subject_prefix - is expected to respond to #receive_encrypted_only - is invalid if receive_encrypted_only is blank - is invalid if subject_prefix contains a linebreak - is invalid if headers_to_meta contains special characters - has a valid factory - is invalid if include_list_headers is nil - is invalid if bounces_drop_all is blank - is invalid if deliver_selfsent is blank is invalid if include_openpgp_header is blank - is expected to respond to #email - is invalid if receive_admin_only is blank - is invalid if receive_encrypted_only is nil - is invalid if log_level is foobar - is expected to respond to #include_openpgp_header - is invalid if keywords_admin_only contains special characters - is invalid if keywords_admin_notify contains special characters - is invalid if receive_from_subscribed_emailaddresses_only is nil - is valid if subject_prefix is nil + is invalid when email is nil + is invalid if bounces_drop_on_headers contains special characters is expected to respond to #munge_from - is invalid if receive_signed_only is nil + is valid if subject_prefix_out is nil + is expected to respond to #subscriptions + is invalid when email is blank is expected to respond to #max_message_size_kb + is expected to respond to #logfiles_to_keep + is invalid if keep_msgid is blank + is expected to respond to #forward_all_incoming_to_admins + is invalid if public_footer includes a non-printable character + is invalid when fingerprint is blank + is valid if subject_prefix_in is nil + is invalid if munge_from is blank + exports the key with the given fingerprint + is invalid if subject_prefix_in contains a linebreak + is invalid when email contains a space + is invalid if subject_prefix contains a linebreak + is invalid if set_reply_to_to_sender is nil + is invalid if receive_signed_only is nil + is expected to respond to #send_encrypted_only is invalid if subject_prefix_out contains a linebreak - is expected to respond to #bounces_drop_on_headers - send_list_key_to_subscriptions - sends its key to all subscriptions - #fetch_keys - does not import non-self-signatures - fetches one key by URL - fetches one key by email address - fetches one key by fingerprint + is expected to respond to #key_auto_import_from_email + is invalid if receive_authenticated_only is nil + is invalid when fingerprint contains invalid characters + is expected to respond to #include_openpgp_header + is expected to respond to #receive_authenticated_only + is valid if subject_prefix is nil + is expected to respond to #receive_encrypted_only + is expected to respond to #set_reply_to_to_sender + is expected to respond to #receive_admin_only + is expected to respond to #internal_footer + is expected to respond to #bounces_notify_admins + is invalid if send_encrypted_only is nil + is invalid if keywords_admin_only contains special characters + is invalid if send_encrypted_only is blank + is expected to respond to #fingerprint + is expected to respond to #deliver_selfsent + is invalid if openpgp_header_preference is foobar + is invalid if receive_encrypted_only is blank + is invalid if forward_all_incoming_to_admins is blank + is expected to respond to #log_level + is expected to respond to #receive_signed_only + #export_key + exports the key with the fingerprint of the list if no argument is given .configurable_attributes does not contain the attributes email and fingerprint returns an array that contains the configurable attributes - #to_s - returns the email + #bounce_address + adds the bounce keyword to the email address #munge_from - is disabled by default - sets from to munged version when enabled does not munge from address when disabled + sets from to munged version when enabled + is disabled by default + #sendkey_address + adds the sendkey keyword to the email address + #gpg + sets the GNUPGHOME environment variable to the listdir + returns an instance of GPGME::Ctx + #delete_key + returns false if no key with the fingerprint was found + deletes the key with the given fingerprint + #to_s + returns the email #fingerprint - transforms the fingerprint to upper case removes whitespaces and 0x from the fingerprint - #subscribe - subscribes and sets the fingerprint from key material that contains exactly one key - subscribes and does not set the fingerprint from key material containing no keys - subscribes and ignores a given fingerprint if key material is given, too - subscribes and does not set the fingerprint from key material containing multiple keys - subscribes and ignores nil-values for admin and delivery_enabled - .by_recipient - returns the list for a given address + transforms the fingerprint to upper case + #check_keys + adds a message if a key expires in two weeks or less + adds a message if a key is revoked + adds a message if a key is invalid + adds a message if a key is disabled #send_to_subscriptions - sends the message only to subscribers with available keys if send_encrypted_only is true, and a notification to the other subscribers - sends the message to subscribers if deliver_selfsent is set to false - sends the message to all subscribers but not the sender, if deliver_selfsent is false and the mail is correctly signed - sends the message to all subscribers - sends the message to all subscribers, in the clear if one's key is unusable, if send_encrypted_only is false sends the message to all subscribers including the sender, if deliver_selfsent is false but the mail is not correctly signed + sends the message to all subscribers, in the clear if one's key is unusable, if send_encrypted_only is false + sends the message only to subscribers with available keys if send_encrypted_only is true, and a notification to the other subscribers sends the message to all subscribers including the sender, if deliver_selfsent is true and the mail is correctly signed + sends the message to all subscribers but not the sender, if deliver_selfsent is false and the mail is correctly signed sends the message only to subscribers with usable keys if send_encrypted_only is true, and a notification to the other subscribers - #keys - returns an array with the keys matching the given bracketed email address - returns an array of keys matching the given fingerprint - it returns an array with the keys of the list - returns an array with the keys matching the given email address + sends the message to all subscribers + sends the message to subscribers if deliver_selfsent is set to false #import_key imports a given key - #admins - returns subscriptions of admin users - #logfile - returns the logfile path - #request_address - adds the request keyword to the email address - #refresh_keys - does not import non-self-signatures - updates keys from the keyserver - reports errors from refreshing keys - #export_key - exports the key with the fingerprint of the list if no argument is given #owner_address adds the owner keyword to the email address + #keys + it returns an array with the keys of the list + returns an array of keys matching the given fingerprint + returns an array with the keys matching the given bracketed email address + returns an array with the keys matching the given email address #secret_key returns the secret key with the fingerprint of the list - #set_reply_to_to_sender - prefers reply_to of the sender over from when existing - does not set reply_to mail address when disabled - is disabled by default - sets reply-to to senders from-address when enabled - #key - returns the key with the fingerprint of the list - #gpg - sets the GNUPGHOME environment variable to the listdir - returns an instance of GPGME::Ctx - #delete_key - deletes the key with the given fingerprint - returns false if no key with the fingerprint was found - #bounce_address - adds the bounce keyword to the email address - #sendkey_address - adds the sendkey keyword to the email address + #subscribe + subscribes and does not set the fingerprint from key material containing multiple keys + subscribes and sets the fingerprint from key material that contains exactly one key + subscribes and ignores a given fingerprint if key material is given, too + subscribes and does not set the fingerprint from key material containing no keys + subscribes and ignores nil-values for admin and delivery_enabled #key_minimal_base64_encoded returns the key with the fingerprint of the list if no argument is given in an Autocrypt-compatible format does not return the key with the fingerprint in an Autocrypt-compatible format if the argument given does not correspond to a key - #check_keys - adds a message if a key expires in two weeks or less - adds a message if a key is revoked - adds a message if a key is disabled - adds a message if a key is invalid + #logfile + returns the logfile path + #key + returns the key with the fingerprint of the list #logger calls the ListLogger + #admins + returns subscriptions of admin users + .by_recipient + returns the list for a given address + #refresh_keys + updates keys from the keyserver + does not import non-self-signatures + reports errors from refreshing keys + send_list_key_to_subscriptions + sends its key to all subscriptions + #request_address + adds the request keyword to the email address + #fetch_keys + fetches one key by email address + fetches one key by fingerprint + does not import non-self-signatures + fetches one key by URL + #set_reply_to_to_sender + is disabled by default + sets reply-to to senders from-address when enabled + does not set reply_to mail address when disabled + prefers reply_to of the sender over from when existing -user sends keyword - x-list-subscriptions with non-matching argument - x-set-fingerprint with email-address but without valid fingerprint - x-list-subscriptions without arguments but with admin-notification - x-unsubscribe with invalid argument - x-get-version - x-resend with admin-notification - x-resend-cc to 2 addresses with missing keys - x-resend-cc to 2 addresses with one missing keys - x-resend-encrypted-only with matching key - x-fetch-key with invalid URL - x-unset-fingerprint with other email-address as admin - x-sign-this with attachments - x-list-key with arbitrary email-sub-string - x-resend with admin-notification and admin has delivery disabled - x-subscribe with one attribute and spaces-separated fingerprint - x-subscribe with attributes (first one 'false') and spaces-separated fingerprint - x-resend-encrypted-only with expired key - x-sign-this with inline text - x-get-logfile with debug level sends non-empty logfile - x-subscribe without attributes, but with spaces-separated fingerprint - x-fetch-key with fingerprint of unchanged key - x-list-key with correctly prefixed email-sub-string - x-unset-fingerprint with own email-address as admin and force - x-unset-fingerprint with other email-address as non-admin - x-unsubscribe without argument - x-fetch-key without arguments - x-unset-fingerprint without argument - x-subscribe with attributes (last one 'true') and spaces-separated fingerprint - x-list-key with prefixed fingerprint - x-attach-listkey from Thunderbird with protected headers - x-set-fingerprint with own email-address and valid fingerprint - x-unsubscribe - x-list-keys with one argument - x-set-fingerprint with not-subscribed email-address and valid fingerprint - x-resend - x-subscribe with attributes - x-fetch-key with unknown email-address - x-list-subscriptions with matching argument - x-fetch-key with fingerprint - x-fetch-key with invalid input - x-unsubscribe doesn't unsubscribe last admin - x-set-fingerprint with other email-address and valid fingerprint as non-admin - x-set-fingerprint without email-address and with valid fingerprint - x-fetch-key with URL - x-unset-fingerprint with not-subscribed email-address - x-set-fingerprint with own email-address and valid, spaces-separated fingerprint - x-get-key with invalid argument - x-get-key with empty argument - x-resend-cc-encrypted-only to 2 addresses with one missing keys - x-attach-listkey - x-resend-cc-encrypted-only to 2 addresses with missing keys - resend returns an error about wrong arguments if email content got into the arguments due to no blank line - x-resend-cc-encrypted-only with matching key - x-resend-cc-encrypted-only to 2 addresses with matching keys - x-resend-cc-encrypted-only to 3 addresses with one missing keys - x-get-logfile with error-level sends empty logfile - x-resend does not include internal_footer - does not parse keywords once the mail body started - x-unset-fingerprint with own email-address as admin but without force - x-subscribe without attributes - x-get-version with delivery disabled - x-list-keys without arguments - x-get-key with valid argument - x-resend-encrypted-only with two matching keys, one of which is expired - x-subscribe with invalid arguments - x-set-fingerprint without argument - x-list-subscriptions without arguments - x-set-fingerprint without email-address and with invalid fingerprint - x-fetch-key with email address - x-resend with iso-8859-1 body - x-resend-unencrypted with matching key - x-resend-cc-encrypted-only with expired key - x-resend with invalid recipient - x-subscribe with attributes and spaces-separated fingerprint - x-fetch-key with unknown fingerprint - x-list-keys with two arguments - x-set-fingerprint with other email-address and valid fingerprint - x-resend with utf-8 body and umlauts - x-set-fingerprint with email-address but without fingerprint - x-subscribe without arguments - with broken utf8 in key - x-list-keys works - x-add-key with inline key-material - x-get-key with valid argument - -Schleuder::ListBuilder - subscribes the adminaddress and imports the adminkey - creates a list-key with all required UIDs - subscribes the adminaddress and ignores the adminfingerprint if an adminkey was given - creates a listdir for the list - creates a new, valid list - subscribes the adminaddress and respects the given adminfingerprint - returns an error-message if given an invalid email-address - returns an error-message if given an invalid email-address with a space +protected subject + is not leaked + works with mutt protected headers + recognizes keywords in mails with protected headers and empty subject + is included as mime-part in body + don't block request-messages + is included in mime-headers -Finished in 14 minutes 18 seconds (files took 4.3 seconds to load) +Finished in 4 minutes 0.2 seconds (files took 3.8 seconds to load) 583 examples, 0 failures -Randomized with seed 50886 +Randomized with seed 40730 ┌──────────────────────────────────────────────────────────────────────────────┐ @@ -2074,12 +2110,12 @@ install -p -m0644 ./man/schleuder-api-daemon.8 debian/schleuder/usr/share/man/man8/schleuder-api-daemon.8 install -m0755 -d debian/schleuder/usr/share/man/man8/ install -p -m0644 ./man/schleuder.8 debian/schleuder/usr/share/man/man8/schleuder.8 - man-recode --to-code UTF-8 --suffix .dh-new debian/schleuder/usr/share/man/man8/schleuder.8 man-recode --to-code UTF-8 --suffix .dh-new debian/schleuder/usr/share/man/man8/schleuder-api-daemon.8 - mv debian/schleuder/usr/share/man/man8/schleuder.8.dh-new debian/schleuder/usr/share/man/man8/schleuder.8 - chmod 0644 -- debian/schleuder/usr/share/man/man8/schleuder.8 + man-recode --to-code UTF-8 --suffix .dh-new debian/schleuder/usr/share/man/man8/schleuder.8 mv debian/schleuder/usr/share/man/man8/schleuder-api-daemon.8.dh-new debian/schleuder/usr/share/man/man8/schleuder-api-daemon.8 chmod 0644 -- debian/schleuder/usr/share/man/man8/schleuder-api-daemon.8 + mv debian/schleuder/usr/share/man/man8/schleuder.8.dh-new debian/schleuder/usr/share/man/man8/schleuder.8 + chmod 0644 -- debian/schleuder/usr/share/man/man8/schleuder.8 dh_installcron -O--buildsystem=ruby install -m0755 -d debian/schleuder/etc/cron.weekly install -p -m0755 debian/schleuder.cron.weekly debian/schleuder/etc/cron.weekly/schleuder @@ -2165,12 +2201,37 @@ dpkg-buildpackage: info: binary-only upload (no source included) dpkg-genchanges: info: not including original source code in upload I: copying local configuration +I: user script /srv/workspace/pbuilder/1624683/tmp/hooks/B01_cleanup starting +I: user script /srv/workspace/pbuilder/1624683/tmp/hooks/B01_cleanup finished I: unmounting dev/ptmx filesystem I: unmounting dev/pts filesystem I: unmounting dev/shm filesystem I: unmounting proc filesystem I: unmounting sys filesystem +W: Stray processes left from build: +* system-pbuilder-build-schleuder_5.0.1\x2d2-1624683.slice - Slice /system/pbuilder/build/schleuder_5.0.1-2/1624683 + Loaded: loaded + Active: active since Tue 2025-08-26 06:45:17 +14; 6min ago + Invocation: ce9cf79be77e4f04b3897b392341817d + Tasks: 33 + Memory: 430.1M (peak: 783.5M) + CPU: 3min 12.382s + CGroup: /system.slice/system-pbuilder.slice/system-pbuilder-build.slice/system-pbuilder-build-schleuder_5.0.1\x2d2.slice/system-pbuilder-build-schleuder_5.0.1\x2d2-1624683.slice + `-run-p1668723-i156839633.scope + |-1714725 gpg-agent --homedir /tmp/schleuder-348d33ae87ad3e481532fda646f6a13e/example.org/list232 --use-standard-socket --daemon + |-1714756 gpg-agent --homedir /tmp/schleuder-348d33ae87ad3e481532fda646f6a13e/example.org/list233 --use-standard-socket --daemon + |-1714776 gpg-agent --homedir /tmp/schleuder-348d33ae87ad3e481532fda646f6a13e/example.org/list234 --use-standard-socket --daemon + |-1715256 gpg-agent --homedir /tmp/schleuder-348d33ae87ad3e481532fda646f6a13e/example.org/list302 --use-standard-socket --daemon + |-1721940 gpg-agent --homedir /tmp/schleuder-348d33ae87ad3e481532fda646f6a13e/example.org/list325 --use-standard-socket --daemon + |-1727993 gpg-agent --homedir /tmp/schleuder-348d33ae87ad3e481532fda646f6a13e/example.org/list440 --use-standard-socket --daemon + |-1728528 gpg-agent --homedir /tmp/schleuder-348d33ae87ad3e481532fda646f6a13e/example.org/list457 --use-standard-socket --daemon + |-1728544 gpg-agent --homedir /tmp/schleuder-348d33ae87ad3e481532fda646f6a13e/example.org/list458 --use-standard-socket --daemon + |-1728558 gpg-agent --homedir /tmp/schleuder-348d33ae87ad3e481532fda646f6a13e/example.org/list459 --use-standard-socket --daemon + |-1729516 gpg-agent --homedir /tmp/schleuder-348d33ae87ad3e481532fda646f6a13e/example.org/list471 --use-standard-socket --daemon + `-1730185 gpg-agent --homedir /tmp/schleuder-348d33ae87ad3e481532fda646f6a13e/example.org/list484 --use-standard-socket --daemon + +Aug 26 06:45:17 ionos11-amd64 systemd[1]: Created slice system-pbuilder-build-schleuder_5.0.1\x2d2-1624683.slice - Slice /system/pbuilder/build/schleuder_5.0.1-2/1624683. I: cleaning the build env -I: removing directory /srv/workspace/pbuilder/2575151 and its subdirectories -I: Current time: Sun Sep 27 11:08:06 -12 2026 -I: pbuilder-time-stamp: 1790550486 +I: removing directory /srv/workspace/pbuilder/1624683 and its subdirectories +I: Current time: Tue Aug 26 06:52:11 +14 2025 +I: pbuilder-time-stamp: 1756140731