Package: src:schleuder Version: 5.0.0-4 Severity: serious Tags: ftbfs trixie sid
Dear maintainer: During a rebuild of all packages in unstable, your package failed to build: -------------------------------------------------------------------------------- [...] debian/rules clean dh clean --buildsystem=ruby --with ruby dh_auto_clean -O--buildsystem=ruby dh_ruby --clean dh_autoreconf_clean -O--buildsystem=ruby dh_clean -O--buildsystem=ruby rm -f debian/debhelper-build-stamp rm -rf debian/.debhelper/ rm -f -- debian/schleuder.substvars debian/files rm -fr -- debian/schleuder/ debian/tmp/ find . \( \( \ \( -path .\*/.git -o -path .\*/.svn -o -path .\*/.bzr -o -path .\*/.hg -o -path .\*/CVS -o -path .\*/.pc -o -path .\*/_darcs \) -prune -o -type f -a \ \( -name '#*#' -o -name '.*~' -o -name '*~' -o -name DEADJOE \ -o -name '*.orig' -o -name '*.rej' -o -name '*.bak' \ [... snipped ...] exits with a status code of 1 in case the command is not implemented Schleuder::LoggerNotifications notifies admins of multiple text-messages and the original message notifies admins in the clear if their key is unusable notifies admins of multiple text-messages notifies admins encryptedly if their key is usable includes a List-Id header in notification mails sent to admins notifies admins of simple text-message return path sets superadmin sets default superadmin GPGME::Key #summary 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 displays the expected attributes for a key that's not capable of encryption .valid_fingerprint? valid fingerprints accepts 59C71FB38AEE22E091C78259D0635044 as a valid fingerprint accepts 59C71FB38AEE22E091C78259D06350440F759BD3 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 59C71FB38AEE22E091C78259D06350440F759BD as an invalid fingerprint rejects 59C71FB38AEE22E091C78259D06350440F759BD3A as an invalid fingerprint rejects Z9C71FB38AEE22E091C78259D06350440F759BD3 as an invalid fingerprint rejects 0x59C71FB38AEE22E091C78259D06350440F759B as an invalid fingerprint rejects Z9C71FB38AEE22E091C78259D0635044 as an invalid fingerprint #minimal returns a minimal key Schleuder::Runner #run injects pseudoheaders appropriately into an unsigned thunderbird-multipart/alternative-message does not throw an error on emails with broken utf-8 does not throw an error on emails that contain other gpg keywords delivers a signed error message if a subscription's key is expired on a encrypted-only list 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 large first mime-part does not throw an error on encrypted but unsigned emails that contain a forwarded encrypted email injects pseudoheaders appropriately into a signed multipart/alternative-message (thunderbird+enigmail-1.9) does not throw an error on emails with an attached pgp key as application/octet-stream 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 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 mails not encrypted to the list key handles a mail which was encrypted to an absent key and returns DecryptionFailed error handles a mail containing PGP-garbage and returns DecryptionFailed error handles a mail which was encrypted to a passphrase and returns DecryptionFailed error Quoted-Printable encoding is handled properly in cleartext emails is handled properly in encrypted emails is handled properly in encrypted+signed emails with a plain text message contains the list headers if include_list_headers is set to true doesn't leak the Message-Id as configured does not contain the Autocrypt header if include_autocrypt_header is set to false contains the specified pseudoheaders in the correct order contains the Autocrypt header if include_autocrypt_header is set to true does not deliver content if send_encrypted_only is set to true delivers the incoming message does keep the Message-Id as configured includes the internal_footer contains the open pgp header if include_openpgp_header is set to true has the correct headerlines does not include the public_footer doesn't have unwanted headerlines from the original message after keyword parsing falling back works also with non-ascii content falls back to default charset per RFC if none is set Schleuder::Http uses a proxy if one is configured Schleuder::KeywordHandlers::KeyManagement registers keywords .delete_key deletes a key that distinctly matches the argument 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 .add_key imports a key from inline ascii-armored material imports from an inline mix of ascii-armored key and non-key material imports a key from attached binary material (without specified encoding) imports a key from attached acsii-armored material imports a key from attached quoted-printable binary material imports from attached quoted-printable binary key-material (as produced by Mutt 2.0.5) ignores body if an ascii-armored attachment is present imports a key from attached explicitly base64-encoded binary material rejects garbage updates a key imports from attached quoted-printable ascii-armored key-material imports from attached quoted-printable key-material (as produced by Thunderbird 115) ignores arguments a bounce message is received from bounce example Mail::Message 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_1234211931.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_1234285532.txt.eml as normal 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/tt_bounce_25.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_02.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 recognizes a Jenkins message with 'Auto-Submitted'-header NOT as automated 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_bounce_21.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_1234175799.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_bounce_16.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_09.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_bounce_14.txt.eml as normal message doesn't change the order of mime-parts 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_23.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_bounce_15.txt.eml as normal message does not misclassify bounce spec/fixtures/mails/bounces/undeliverable_gmail.txt.eml as normal message recognizes a cron message with 'Auto-Submitted'-header NOT as automated message does not misclassify bounce spec/fixtures/mails/bounces/tt_1234177688.txt.eml as normal message does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_03.txt.eml as normal message recognizes bounce message subject using the bounce_email gem does not misclassify bounce spec/fixtures/mails/bounces/tt_1234211929.txt.eml as normal message recognizes a sudo 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_19.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_bounce_10.txt.eml as normal message does not misclassify bounce spec/fixtures/mails/bounces/tt_1234211357.txt.eml as normal message verifies an encapsulated (signed-then-encrypted) message does not misclassify bounce spec/fixtures/mails/bounces/tt_1234241665.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_05.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_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_1234210655.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_bounce_18.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_06.txt.eml as normal message does not misclassify bounce spec/fixtures/mails/bounces/tt_bounce_04.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_bounce_17.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 #add_subject_prefix! does not add a subject prefix if already present adds a configured subject prefix without subject adds a configured subject prefix makes a pseudo header that is getting wrapped that a multiline with less than 76 get wrapped correctly on the first line and the following lines with key / value that a multiline with less than 76 get wrapped correctly on the first line without value that a line with less than 76 gets wrapped with empty value that single multiline are getting indented that multiline are getting wrapped .keywords stops looking for keywords when a blank line that is not followed by another keyword is met stops looking for keywords when the first line is already email content drops multiple empty lines between keywords and content drops empty lines in keyword arguments parsing reads multiple lines as keyword arguments splits lines into words and downcases them in keyword arguments 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 ignores empty lines before keywords GPGME::Ctx #find_keys with un-prefixed fingerprint #normalize_key_identifier with un-bracketed email-address #find_keys with un-bracketed wrong email-address #find_keys with prefixed fingerprint #find_keys with un-marked sub-string #find_keys with correctly marked sub-string #normalize_key_identifier with bracketed email-address #find_keys with bracketed wrong email-address #keyimport #keyimport with unusable data #find_keys with bracketed email-address #normalize_key_identifier with URL #normalize_key_identifier with prefixed fingerprint #find_keys without argument #gpgcli returns correct data types #find_keys with correctly marked narrower sub-string #find_keys with un-bracketed email-address #normalize_key_identifier with some string #normalize_key_identifier with un-prefixed fingerprint protected subject is included as mime-part in body don't block request-messages recognizes keywords in mails with protected headers and empty subject is included in mime-headers works with mutt protected headers is not leaked someone sends an email to a listname-dash-address sends the list's key as reply to -sendkey 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 -owner forwards the message to the admins if extension is -bounce user sends an encrypted message from thunderbird being encrypted-mime from thunderbird being encrypted-inline from thunderbird being encrypted+signed-inline from thunderbird being encrypted+signed-mime Schleuder::Filters::Runner is expected to respond to #run #run stops on a StandardError and returns error even with bounces_drop_all runs the filters stops on a StandardError and returns error even on headers match stops on a StandardError and returns error loading filters loads filters from built-in filters_dir sorts them loads custom filters from filters_dir even with non-2-digit priority loads custom filters from filters_dir and sorts them in with missing dir loads custom filters from filters_dir and sorts them in, ignores filter not following convention Schleuder::KeyFetcher #fetch reports an error from trying to import non-key-material fetches one key by fingerprint from VKS if vks_keyserver is set fetches one key by email from SKS if vks_keyserver is blank fetches one key by fingerprint from SKS if vks_keyserver is blank fetches one key by email 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 reports an error from trying to fetch an URL that doesn't exist fetches one key from a good URL Schleuder::Conf reads ERB code in config files Schleuder::Filters .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 imports key and reports new key imports key and reports the change does not import key if attachment has a different content-type than "application/pgp-keys" imports key and reports no change .receive_from_subscribed_emailaddresses_only 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 rejects a message with a non-subscribed address as From-header 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 .strip_html_from_alternative_if_keywords_present 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 related-part from encapsulated multipart/alternative-part that contains keywords strips HTML-part from multipart/alternative-message that contains keywords .key_auto_import_from_autocrypt_header 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 no change imports key and reports the change only imports the one key that matches the sender address if keydata contains more than one key .fix_exchange_messages fixes pgp/mime-messages that were mangled by Exchange works with a text/plain message user sends keyword x-fetch-key with invalid input x-resend with utf-8 body and umlauts x-get-logfile with error-level sends empty logfile x-list-subscriptions without arguments x-resend-cc-encrypted-only with matching key x-list-key with prefixed fingerprint x-subscribe without arguments x-resend with iso-8859-1 body resend returns an error about wrong arguments if email content got into the arguments due to no blank line x-resend with admin-notification and admin has delivery disabled x-fetch-key with email address x-resend-cc-encrypted-only with expired key x-list-subscriptions without arguments but with admin-notification x-list-subscriptions with non-matching argument x-list-subscriptions with matching argument x-unsubscribe with invalid argument x-unsubscribe without argument x-resend-encrypted-only with matching key x-unset-fingerprint without argument x-list-keys with two arguments x-set-fingerprint with not-subscribed email-address and valid fingerprint x-set-fingerprint with own email-address and valid, spaces-separated fingerprint x-set-fingerprint with own email-address and valid fingerprint x-subscribe with invalid arguments x-subscribe without attributes, but with spaces-separated fingerprint x-list-key with arbitrary email-sub-string x-subscribe with attributes x-list-keys with one argument x-resend x-list-keys without arguments x-set-fingerprint with email-address but without fingerprint x-fetch-key with URL x-unset-fingerprint with own email-address as admin but without force x-resend-cc-encrypted-only to 2 addresses with missing keys x-unsubscribe doesn't unsubscribe last admin x-resend-cc-encrypted-only to 2 addresses with matching keys x-set-fingerprint with other email-address and valid fingerprint x-subscribe with attributes (first one 'false') and spaces-separated fingerprint x-resend-cc to 2 addresses with one missing keys x-fetch-key without arguments x-unset-fingerprint with not-subscribed email-address x-fetch-key with fingerprint x-fetch-key with fingerprint of unchanged key x-set-fingerprint without email-address and with valid fingerprint x-resend does not include internal_footer x-resend-cc to 2 addresses with missing keys x-subscribe without attributes x-fetch-key with unknown email-address x-get-logfile with debug level sends non-empty logfile x-subscribe with one attribute and spaces-separated fingerprint x-resend-encrypted-only with expired key x-list-key with correctly prefixed email-sub-string x-attach-listkey x-resend with invalid recipient x-subscribe with attributes (last one 'true') and spaces-separated fingerprint x-unset-fingerprint with other email-address as non-admin x-sign-this with attachments x-get-key with valid argument x-set-fingerprint without email-address and with invalid fingerprint x-set-fingerprint with other email-address and valid fingerprint as non-admin does not parse keywords once the mail body started x-unset-fingerprint with other email-address as admin x-resend-cc-encrypted-only to 3 addresses with one missing keys x-resend with admin-notification x-attach-listkey from Thunderbird with protected headers x-resend-unencrypted with matching key x-set-fingerprint without argument x-unsubscribe x-subscribe with attributes and spaces-separated fingerprint x-get-version with delivery disabled x-resend-encrypted-only with two matching keys, one of which is expired x-get-version x-resend-cc-encrypted-only to 2 addresses with one missing keys x-fetch-key with invalid URL x-get-key with invalid argument x-sign-this with inline text (FAILED - 1) x-set-fingerprint with email-address but without valid fingerprint x-get-key with empty argument x-unset-fingerprint with own email-address as admin and force x-fetch-key with unknown fingerprint with broken utf8 in key x-get-key with valid argument x-list-keys works x-add-key with inline key-material status returns status code 200 subscription via api subscribes an user and unsets delivery flag subscribes new member to a list unsubscribes members subscribes an admin user with a truthy value subscribes an admin user doesn't subscribe new member without authentication Errors ::MessageUnsigned 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() ::ListNotFound shows sensible string in response to to_s() ::KeyGenerationFailed shows sensible string in response to to_s() ::TooManyKeys 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() ::MessageTooBig shows sensible string in response to to_s() ::MessageSenderNotSubscribed shows sensible string in response to to_s() ::MessageUnencrypted shows sensible string in response to to_s() ::KeywordAdminOnly shows sensible string in response to to_s() ::MessageEmpty shows sensible string in response to to_s() ::KeyAdduidFailed shows sensible string in response to to_s() ::DecryptionFailed shows sensible string in response to to_s() Failures: 1) user sends keyword x-sign-this with inline text Failure/Error: expect(message.to_s.gsub("\r", '')).to match(/BEGIN PGP SIGNED MESSAGE-----\nHash: SHA(256|512)\n\n#{signed_text}-----BEGIN PGP SIGNATURE/) expected "Date: Sat, 01 Mar 2025 14:07:41 +0000\nFrom: list...@example.org\nSender: list464-bou...@example.org...B1pRlhs9jOI=\n=Iqno\n-----END PGP SIGNATURE-----\n\n----==_mimepart_67c314ad6cb81_4291938121347--\n" to match /BEGIN PGP SIGNED MESSAGE-----\nHash: SHA(256|512)\n\nsigned signed signed -----BEGIN PGP SIGNATURE/ Diff: @@ -1,6 +1,46 @@ -/BEGIN PGP SIGNED MESSAGE-----\nHash: SHA(256|512)\n\nsigned +Date: Sat, 01 Mar 2025 14:07:41 +0000 +From: list...@example.org +Sender: list464-bou...@example.org +To: schleu...@example.org +Message-ID: <67c314ad6efb3_4291938121...@r7a-large-1740837571.mail> +In-Reply-To: <67c314ad449b6_4291938121...@r7a-large-1740837571.mail> +References: <67c314ad449b6_4291938121...@r7a-large-1740837571.mail> +Mime-Version: 1.0 +Content-Type: multipart/mixed; + boundary="--==_mimepart_67c314ad6cb81_4291938121347"; + charset=UTF-8 +Content-Transfer-Encoding: 7bit + + +----==_mimepart_67c314ad6cb81_4291938121347 +Content-Type: text/plain; + charset=UTF-8 +Content-Transfer-Encoding: 7bit + +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA512 + signed signed +signed ------BEGIN PGP SIGNATURE/ + +-----BEGIN PGP SIGNATURE----- + +iQIzBAEBCgAdFiEEWccfs4ruIuCRx4JZ0GNQRA91m9MFAmfDFK0ACgkQ0GNQRA91 +m9O1Dw//aFXXAFRbu6AZr2s4jMgM10epH447rsRb5bHUfpZQszDR3aLWvjOuUXwF +O5ShINJsEkoD0J7QSoM9ZrGcl/c12ngG80fAWSalf7uJ1yZRrJWIEosp/ySdZt38 +kl6sREDgqMpgRaPaZVFP/t5rHN6S+Oo6yRULEwZkdhs77pX0tdiPVKhA8aBrTy/6 +xC0qubh0EcIv1pkWmQzJj9IZj0myKpv3aVvt+4+PpOsSM+IDgKAjM47S1fOKqved +oBIEjCFg5iuQr6NNBxPGMYSSzKPgp8X+oRR1gDVTibcf0R0l/JXbsb4xzoIctPmt +/FinGjgIuRLxgqZzDC1+OwhNoY8Tu80Tl1tmJyGqe3s6gRaA36KZp4TDoys8OshJ +3YEjrjzOsXfc93tOWI6TxQUaapHyXSNsZyFXnHWryIxgVqJIalCjY0FHRT4L/0zh +JOu038oHPMQcNdvcEB58iSfPsNxoyzVNNVeZxVtXTZJJE6D70zp2XOtVZ7jY0ado +A4B4WAUVWL4Fzcg44rz8aUkJRMAI8s3ZhvrBINUSSuxi7Jp8IXkTtcSZj//By+Nw +bnpD+FNC9kf8im8Ey5hiOvn9NPnijcpcWJ0W3mFFCx0aG2cINLN4LcoYCLW2SzIP +qpQNN9xUXvgyfSNhP8lGwfjchNbNxi2Dxc2UpGB1B1pRlhs9jOI= +=Iqno +-----END PGP SIGNATURE----- + +----==_mimepart_67c314ad6cb81_4291938121347-- # ./spec/schleuder/integration/keywords_spec.rb:2457:in `block (2 levels) in <top (required)>' # ./spec/spec_helper.rb:60:in `block (3 levels) in <top (required)>' # ./spec/spec_helper.rb:59:in `block (2 levels) in <top (required)>' Finished in 2 minutes 35.7 seconds (files took 1.06 seconds to load) 583 examples, 1 failure Failed examples: rspec ./spec/schleuder/integration/keywords_spec.rb:2429 # user sends keyword x-sign-this with inline text Randomized with seed 21287 /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 failed ERROR: Test "ruby3.3" failed. Exiting. dh_auto_install: error: dh_ruby --install /<<PKGBUILDDIR>>/debian/schleuder returned exit code 1 make: *** [debian/rules:9: binary] Error 25 dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2 -------------------------------------------------------------------------------- The above is just how the build ends and not necessarily the most relevant part. If required, the full build log is available here: https://people.debian.org/~sanvila/build-logs/202503/ About the archive rebuild: The build was made on virtual machines from AWS, using sbuild and a reduced chroot with only build-essential packages. If you could not reproduce the bug please contact me privately, as I am willing to provide ssh access to a virtual machine where the bug is fully reproducible. If this is really a bug in one of the build-depends, please use reassign and add an affects on src:schleuder, so that this is still visible in the BTS web page for this package. Thanks.