summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app-crypt/seahorse')
-rw-r--r--app-crypt/seahorse/Manifest3
-rw-r--r--app-crypt/seahorse/files/seahorse-40.0-fix-segfault-with-ldap-disabled.patch29
-rw-r--r--app-crypt/seahorse/files/seahorse-43.0-c99-2.patch517
-rw-r--r--app-crypt/seahorse/files/seahorse-43.0-c99.patch21
-rw-r--r--app-crypt/seahorse/files/seahorse-43.0-clang16.patch35
-rw-r--r--app-crypt/seahorse/files/seahorse-43.0-gnupg-2.4.patch20
-rw-r--r--app-crypt/seahorse/files/seahorse-43.0-musl-stdout.patch85
-rw-r--r--app-crypt/seahorse/metadata.xml30
-rw-r--r--app-crypt/seahorse/seahorse-43.0-r3.ebuild (renamed from app-crypt/seahorse/seahorse-41.0.ebuild)35
-rw-r--r--app-crypt/seahorse/seahorse-43.0-r4.ebuild (renamed from app-crypt/seahorse/seahorse-40.0-r1.ebuild)37
10 files changed, 740 insertions, 72 deletions
diff --git a/app-crypt/seahorse/Manifest b/app-crypt/seahorse/Manifest
index 2446da87b272..a34a2741571a 100644
--- a/app-crypt/seahorse/Manifest
+++ b/app-crypt/seahorse/Manifest
@@ -1,2 +1 @@
-DIST seahorse-40.0.tar.xz 1309064 BLAKE2B dd179ef13c79454b30571959b33c02a523591fa9d59957e0c30ec5d75a52bd8e9a5b420214f85d5feac0849d69a51ddcee808ab47e4bf97d7ac99094f853bc9a SHA512 c389420fb1b3d54c1b9a1004f2c8b9e50118a1ffcba02aa8cfdd2223d1bc117368c9a1ad875c59abd319d95eb93ec3de2e9cedadbfc1d6a0997d613c8256c60b
-DIST seahorse-41.0.tar.xz 1371984 BLAKE2B fdfc7c6d5ba41ab83c639d93c92fe6e1c36d42a02c7a384c2055bfe594e2a16415115bfb07597de93a886e492974e38c812fbbd59c7112c0360adeed96cb437d SHA512 cc51e27a55ed646ee376aa1b1bffe28369d80e4b8c484c9711de6bdf190694714ef208579d0399b5c199b5619491d72dede1b1f6c03b89cf3a53e8519a4d4fcf
+DIST seahorse-43.0.tar.xz 1392460 BLAKE2B b7ae8b42042ad8e07eaf2633583b566f9757f83bd066eb8b0786d5e89353901f5526ed925bb6152820a5b2a36defb0c0f38dea634c3ae78ebf8d29ab07ff9cfb SHA512 168fdfc829134915f513028b1d35b647aa18a0390786cbf512f7ddb7b125b239f3f3d880a847119a5aa22580354f0b594e553fe3940a3afbda5861e69dd88e5d
diff --git a/app-crypt/seahorse/files/seahorse-40.0-fix-segfault-with-ldap-disabled.patch b/app-crypt/seahorse/files/seahorse-40.0-fix-segfault-with-ldap-disabled.patch
deleted file mode 100644
index 8454a0388ea0..000000000000
--- a/app-crypt/seahorse/files/seahorse-40.0-fix-segfault-with-ldap-disabled.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 6fc0e3e321cdf0bf7e047234561fe8a8084a93f9 Mon Sep 17 00:00:00 2001
-From: Xi Ruoyao <xry111@mengyan1223.wang>
-Date: Wed, 14 Apr 2021 23:18:06 +0800
-Subject: [PATCH] Fix segfault when built with ldap disabled
-
-Fixes #321.
----
- pgp/seahorse-pgp-backend.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/pgp/seahorse-pgp-backend.c b/pgp/seahorse-pgp-backend.c
-index 25febf31..8c10e7e3 100644
---- a/pgp/seahorse-pgp-backend.c
-+++ b/pgp/seahorse-pgp-backend.c
-@@ -445,7 +445,10 @@ seahorse_pgp_backend_add_remote (SeahorsePgpBackend *self,
- /* Don't persist, so just immediately create a ServerSource */
- g_autoptr(SeahorseServerSource) ssrc = NULL;
- ssrc = seahorse_server_category_create_server (uri);
-- g_list_store_append (G_LIST_STORE (self->remotes), ssrc);
-+ /* If the scheme of the uri is ldap, but ldap support is disabled
-+ * in the build, ssrc will be NULL. */
-+ if (ssrc)
-+ g_list_store_append (G_LIST_STORE (self->remotes), ssrc);
- }
- }
-
---
-GitLab
-
diff --git a/app-crypt/seahorse/files/seahorse-43.0-c99-2.patch b/app-crypt/seahorse/files/seahorse-43.0-c99-2.patch
new file mode 100644
index 000000000000..65aa21fc8ec8
--- /dev/null
+++ b/app-crypt/seahorse/files/seahorse-43.0-c99-2.patch
@@ -0,0 +1,517 @@
+https://bugs.gentoo.org/882805
+https://gitlab.gnome.org/GNOME/seahorse/-/commit/87a5e5312beac6cbe3b39f72cf0f120f1ed00473
+
+From 87a5e5312beac6cbe3b39f72cf0f120f1ed00473 Mon Sep 17 00:00:00 2001
+From: Niels De Graef <ndegraef@redhat.com>
+Date: Sat, 21 Oct 2023 15:43:04 +0200
+Subject: [PATCH] ssh: Refactor SSH key parsing
+
+Fix several issues in the SSH Key parsing code, and directly use a
+`GInputStream` we can (asynchronously) read from. Take the opportunity
+also to add some unit tests that we can run to make sure we're not
+regressing on anything.
+---
+ ssh/key-data.vala | 59 +++++-----
+ ssh/key.vala | 58 +++++-----
+ ssh/meson.build | 20 ++++
+ ssh/source.vala | 9 +-
+ ssh/test-key-parse.vala | 231 ++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 316 insertions(+), 61 deletions(-)
+ create mode 100644 ssh/test-key-parse.vala
+
+diff --git a/ssh/key-data.vala b/ssh/key-data.vala
+index 1fdb1e6a8..8843bff84 100644
+--- a/ssh/key-data.vala
++++ b/ssh/key-data.vala
+@@ -101,12 +101,12 @@ public class Seahorse.Ssh.KeyData : GLib.Object {
+ return result;
+ }
+
+- internal static string parse_key_blob (uchar[] bytes) throws GLib.Error {
++ internal static string parse_key_blob(uchar[] bytes) throws GLib.Error {
+ string digest = Checksum.compute_for_data(ChecksumType.MD5, bytes);
+ if (digest == null)
+ throw new Error.GENERAL("Can't calculate fingerprint from key.");
+
+- StringBuilder fingerprint = new StringBuilder.sized((digest.length * 3) / 2);
++ var fingerprint = new StringBuilder.sized((digest.length * 3) / 2);
+ for (size_t i = 0; i < digest.length; i += 2) {
+ if (i > 0)
+ fingerprint.append_c(':');
+@@ -147,7 +147,7 @@ public class Seahorse.Ssh.KeyData : GLib.Object {
+ string contents;
+ FileUtils.get_contents(filename, out contents);
+
+- StringBuilder results = new StringBuilder();
++ var results = new StringBuilder();
+
+ // Load each line
+ bool first = true;
+@@ -204,54 +204,65 @@ public class Seahorse.Ssh.SecData : GLib.Object {
+ *
+ * @param data The data that contains a private key.
+ */
+- public static SecData parse_data(StringBuilder data) throws GLib.Error {
+- SecData secdata = new SecData();
++ public static SecData parse_data(DataInputStream data, string initial_line) throws GLib.Error {
++ var secdata = new SecData();
+
+ // Get the comment
+- if (data.str.has_prefix(SSH_KEY_SECRET_SIG)) {
+- string comment = data.str.split("\n", 2)[0];
+- secdata.comment = comment.substring(SSH_KEY_SECRET_SIG.length).strip();
++ if (initial_line.has_prefix(SSH_KEY_SECRET_SIG)) {
++ secdata.comment = initial_line.substring(SSH_KEY_SECRET_SIG.length).strip();
+ }
+
+ // First get our raw data (if there is none, don't bother)
+- string rawdata = parse_lines_block(data, SSH_PRIVATE_BEGIN, SSH_PRIVATE_END);
++ string rawdata = parse_lines_block(data, initial_line, SSH_PRIVATE_BEGIN, SSH_PRIVATE_END);
+ if (rawdata == null || rawdata == "")
+ throw new Error.GENERAL("Private key contains no data.");
+
+ secdata.rawdata = rawdata;
+
+- // Guess at the algorithm type
+- secdata.algo = Algorithm.guess_from_string(rawdata);
++ // Guess the algorithm type by searching the base64 decoded data. (we
++ // should properly exclude the start/end line, but it shouldn't harm
++ // too much though afaik). Note that it's definitely not ideal though;
++ // but the openssh format isn't exactly obvious
++ var decoded = Base64.decode(rawdata.offset(initial_line.length));
++ for (uint i = 0; i < decoded.length - 3; i++) {
++ unowned var str = ((string) decoded).offset(i);
++ var algo = Algorithm.from_string(str);
++ if (algo != Algorithm.UNKNOWN) {
++ secdata.algo = algo;
++ break;
++ }
++ }
+
+ return secdata;
+ }
+
+- /**
+- * Takes everything between the start and end pattern and returns it.
+- * NOTE: The string (if found will) be removed from the argument.
+- */
+- private static string parse_lines_block(StringBuilder data, string start, string end) {
+- StringBuilder result = new StringBuilder();
++ /** Reads all lines from start until the end pattern and returns it */
++ private static string parse_lines_block(DataInputStream data,
++ string initial_line,
++ string start, string end)
++ throws GLib.Error {
++ var result = new StringBuilder();
++
++ string? line = initial_line;
+
+ bool start_found = false;
+- string[] lines = data.str.split("\n");
+- foreach (string line in lines) {
++ do {
+ // Look for the beginning
+ if (!start_found) {
+ if (start in line) {
+- result.append_printf("%s\n", line);
+- result.erase(0, line.length + 1);
++ result.append(line);
++ result.append_c('\n');
+ start_found = true;
+ continue;
+ }
+ } else {
+ // Look for the end
+- result.append_printf("%s\n", line);
+- result.erase(0, line.length + 1);
++ result.append(line);
++ result.append_c('\n');
+ if (end in line)
+ break;
+ }
+- }
++ } while ((line = data.read_line_utf8()) != null);
+
+ return result.str;
+ }
+diff --git a/ssh/key.vala b/ssh/key.vala
+index e2ebc30b3..453f8dd2c 100644
+--- a/ssh/key.vala
++++ b/ssh/key.vala
+@@ -223,24 +223,36 @@ public class Seahorse.Ssh.Key : Seahorse.Object, Seahorse.Exportable, Seahorse.D
+ }
+
+ /**
+- * Parses a string into public/private keys.
++ * Parses an input stream into public/private keys.
+ *
+- * @param data The string that needs to be parsed.
++ * @param input The input stream that needs to be parsed.
+ * @param cancellable Can be used to cancel the parsing.
+ */
+- public static async KeyParseResult parse(string data,
+- Cancellable? cancellable = null) throws GLib.Error {
+- return_if_fail (data != null || data != "");
+-
++ public static async KeyParseResult parse(GLib.InputStream input,
++ Cancellable? cancellable = null)
++ throws GLib.Error {
+ var pubkeys = new GenericArray<KeyData>();
+ var seckeys = new GenericArray<SecData>();
+
+- StringBuilder toParse = new StringBuilder(data.chug());
+- while (toParse.str.length > 0) {
++ // Fetch the data into a string
++ var data = new DataInputStream(input);
++
++ while (true) {
++ // Read the next line, and remove leading whitespace
++ var raw_line = yield data.read_line_utf8_async(Priority.DEFAULT, cancellable, null);
++ if (raw_line == null)
++ break;
++
++ string line = raw_line.chug();
++
++ // Ignore comments and empty lines (not a parse error, but no data)
++ if (line == "" || line.has_prefix("#"))
++ continue;
++
+ // First of all, check for a private key, as it can span several lines
+- if (SecData.contains_private_key(toParse.str)) {
++ if (SecData.contains_private_key(line)) {
+ try {
+- var secdata = SecData.parse_data(toParse);
++ var secdata = SecData.parse_data(data, line);
+ seckeys.add(secdata);
+ continue;
+ } catch (GLib.Error e) {
+@@ -248,24 +260,9 @@ public class Seahorse.Ssh.Key : Seahorse.Object, Seahorse.Exportable, Seahorse.D
+ }
+ }
+
+- // We're sure we'll have at least 1 element
+- string[] lines = toParse.str.split("\n", 2);
+- string line = lines[0];
+- toParse.erase(0, line.length);
+- if (lines.length == 2) // There was a \n, so don't forget to erase it as well
+- toParse.erase(0, 1);
+-
+- // Comments and empty lines, not a parse error, but no data
+- if (line.strip() == "" || line.has_prefix("#"))
+- continue;
+-
+ // See if we have a public key
+- try {
+- KeyData keydata = KeyData.parse_line(line);
+- pubkeys.add(keydata);
+- } catch (GLib.Error e) {
+- warning(e.message);
+- }
++ var keydata = KeyData.parse_line(line);
++ pubkeys.add(keydata);
+ }
+
+ var result = KeyParseResult();
+@@ -282,9 +279,8 @@ public class Seahorse.Ssh.Key : Seahorse.Object, Seahorse.Exportable, Seahorse.D
+ */
+ public static async KeyParseResult parse_file(string filename,
+ Cancellable? cancellable = null) throws GLib.Error {
+- string contents;
+- FileUtils.get_contents(filename, out contents);
+-
+- return yield parse(contents, cancellable);
++ var file = GLib.File.new_for_path(filename);
++ var file_stream = yield file.read_async();
++ return yield parse(file_stream, cancellable);
+ }
+ }
+diff --git a/ssh/meson.build b/ssh/meson.build
+index 15418772e..c2c81a6a9 100644
+--- a/ssh/meson.build
++++ b/ssh/meson.build
+@@ -58,3 +58,23 @@ ssh_askpass = executable('ssh-askpass',
+ install: true,
+ install_dir: libexecbindir,
+ )
++
++# Tests
++ssh_test_names = [
++ 'key-parse',
++]
++
++foreach _test : ssh_test_names
++ test_bin = executable(_test,
++ files('test-@0@.vala'.format(_test)),
++ dependencies: [
++ ssh_dep,
++ ssh_dependencies,
++ ],
++ include_directories: include_directories('..'),
++ )
++
++ test(_test, test_bin,
++ suite: 'ssh',
++ )
++endforeach
+diff --git a/ssh/source.vala b/ssh/source.vala
+index c4646c9fb..43b4a1ab0 100644
+--- a/ssh/source.vala
++++ b/ssh/source.vala
+@@ -333,15 +333,12 @@ public class Seahorse.Ssh.Source : GLib.Object, Gcr.Collection, Seahorse.Place {
+ /**
+ * Parse an inputstream into a list of keys and import those keys.
+ */
+- public async List<Key>? import_async(InputStream input, Gtk.Window transient_for,
++ public async List<Key>? import_async(InputStream input,
++ Gtk.Window? transient_for,
+ Cancellable? cancellable = null) throws GLib.Error {
+- uint8[] buffer = new uint8[4096];
+- size_t bytes_read;
+- input.read_all(buffer, out bytes_read, cancellable);
++ var result = yield Key.parse(input, cancellable);
+
+ string fullpath = other_keys_path();
+-
+- var result = yield Key.parse((string) buffer, cancellable);
+ foreach (unowned var keydata in result.public_keys) {
+ yield import_public_async(keydata, fullpath, cancellable);
+ }
+diff --git a/ssh/test-key-parse.vala b/ssh/test-key-parse.vala
+new file mode 100644
+index 000000000..ef9404790
+--- /dev/null
++++ b/ssh/test-key-parse.vala
+@@ -0,0 +1,231 @@
++/*
++ * Seahorse
++ *
++ * Copyright (C) 2023 Niels De Graef
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
++ * See the GNU General Public License for more details.
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, see
++ * <http://www.gnu.org/licenses/>.
++ */
++
++void main(string[] args) {
++ Test.init(ref args);
++
++ Test.add_func("/ssh/key-parse/pubkey-simple", test_key_parse_pubkey_simple);
++ Test.add_func("/ssh/key-parse/pubkey-bad-algo", test_key_parse_pubkey_bad_algo);
++ Test.add_func("/ssh/key-parse/pubkey-multple", test_key_parse_pubkey_multiple);
++
++ Test.add_func("/ssh/key-parse/private-key-simple", test_key_parse_private_key_simple);
++ Test.add_func("/ssh/key-parse/private-key-pw-protected", test_key_parse_private_key_pw_protected);
++
++ Test.run();
++}
++
++const string PUBKEY_SIMPLE = """
++ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCi9ZNp78OzcMpR9QeSKKCybNxTR+ailXs3cwizr1R9Dlx/EobQBXOwE2Ed5PqSU5HEgtYRoKqlTxMogMXMX508dedC0ADTzM09B3OBqpZ7YnMuyLbtk1MNP8xcvVmHwwfw3Y79xxZZeqjUTI7cSE6jcNyz/k/Dl+6RYI552ab80b1kgDDwOyUL75hFllEZ9vHCcAOtk7y5LyeUpnRu5WJq0YBPVQljeYs23ZiTSo5NkJd7pvV9hs68ZAYqm1POXwCcAKOj4HXW3AL83AD49g8MJOAelCMaJpUkOgn4n4QTtqLEC108sqZgwWiadbN/ZHt3Idbn3AIxMMhD/wdkSwkfm9tAohMrqYpSiG31xyifH61mcoBMSxRMQhUscCGV3kLo6P/dZtxRbu4r74r/Ae2Jg4pzYrVFVzfObXdlTjtxJmR8UvnZg60OE0RwYMs1LJTE6xakcAg22O9i3bau00MoIIYEPgiFFP5t0Tw3D06BcEzr/2wEzlvbxy0qzDTr40U= testsimple
++""";
++
++private void test_key_parse_pubkey_simple() {
++ var input = new MemoryInputStream.from_data(PUBKEY_SIMPLE.data);
++
++ var mainloop = new GLib.MainLoop();
++ Seahorse.Ssh.Key.parse.begin(input, null, (obj, res) => {
++ try {
++ var parse_result = Seahorse.Ssh.Key.parse.end(res);
++
++ assert_true(parse_result.public_keys.length == 1);
++ unowned var keydata = parse_result.public_keys[0];
++ assert_true(keydata.comment == "testsimple");
++ assert_true(keydata.algo == Seahorse.Ssh.Algorithm.RSA);
++
++ assert_true(parse_result.secret_keys.length == 0);
++ } catch (Error err) {
++ error("Couldn't parse public key: %s", err.message);
++ } finally {
++ mainloop.quit();
++ }
++ });
++ mainloop.run();
++}
++
++// Basically the same as PUBKEY_SIMPLE, but a bogus algorithm
++const string PUBKEY_BAD_ALGO = """
++ssh-blabla AAAAB3NzaC1yc2EAAAADAQABAAABgQCi9ZNp78OzcMpR9QeSKKCybNxTR+ailXs3cwizr1R9Dlx/EobQBXOwE2Ed5PqSU5HEgtYRoKqlTxMogMXMX508dedC0ADTzM09B3OBqpZ7YnMuyLbtk1MNP8xcvVmHwwfw3Y79xxZZeqjUTI7cSE6jcNyz/k/Dl+6RYI552ab80b1kgDDwOyUL75hFllEZ9vHCcAOtk7y5LyeUpnRu5WJq0YBPVQljeYs23ZiTSo5NkJd7pvV9hs68ZAYqm1POXwCcAKOj4HXW3AL83AD49g8MJOAelCMaJpUkOgn4n4QTtqLEC108sqZgwWiadbN/ZHt3Idbn3AIxMMhD/wdkSwkfm9tAohMrqYpSiG31xyifH61mcoBMSxRMQhUscCGV3kLo6P/dZtxRbu4r74r/Ae2Jg4pzYrVFVzfObXdlTjtxJmR8UvnZg60OE0RwYMs1LJTE6xakcAg22O9i3bau00MoIIYEPgiFFP5t0Tw3D06BcEzr/2wEzlvbxy0qzDTr40U= testbad
++""";
++
++private void test_key_parse_pubkey_bad_algo() {
++ var input = new MemoryInputStream.from_data(PUBKEY_BAD_ALGO.data);
++
++ var mainloop = new GLib.MainLoop();
++ Seahorse.Ssh.Key.parse.begin(input, null, (obj, res) => {
++ try {
++ Seahorse.Ssh.Key.parse.end(res);
++ assert_not_reached();
++ } catch (Error err) {
++ // Expected
++ } finally {
++ mainloop.quit();
++ }
++ });
++ mainloop.run();
++}
++
++const string PUBKEY_MULTIPLE = """
++ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCi9ZNp78OzcMpR9QeSKKCybNxTR+ailXs3cwizr1R9Dlx/EobQBXOwE2Ed5PqSU5HEgtYRoKqlTxMogMXMX508dedC0ADTzM09B3OBqpZ7YnMuyLbtk1MNP8xcvVmHwwfw3Y79xxZZeqjUTI7cSE6jcNyz/k/Dl+6RYI552ab80b1kgDDwOyUL75hFllEZ9vHCcAOtk7y5LyeUpnRu5WJq0YBPVQljeYs23ZiTSo5NkJd7pvV9hs68ZAYqm1POXwCcAKOj4HXW3AL83AD49g8MJOAelCMaJpUkOgn4n4QTtqLEC108sqZgwWiadbN/ZHt3Idbn3AIxMMhD/wdkSwkfm9tAohMrqYpSiG31xyifH61mcoBMSxRMQhUscCGV3kLo6P/dZtxRbu4r74r/Ae2Jg4pzYrVFVzfObXdlTjtxJmR8UvnZg60OE0RwYMs1LJTE6xakcAg22O9i3bau00MoIIYEPgiFFP5t0Tw3D06BcEzr/2wEzlvbxy0qzDTr40U= test1
++ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDADxtTchMRaGP2YCG5Iiu/sCkdKYkogkZ9NrawGutvwcoQL4D3oIC+r+ka3YzenICz0Rpu4ZIyGzn5s7VISzjcGK99a8/UoXsSyTUy37ihbpAbkYju+avtJZyCMOrRyrXp0W8gSKnUuxDJJNlG5+Jhjdh35rGo7ENSDIGRBXx0uLmKvxbPGSQoULbUzxJRVes6HW7cr44RXG4GL5uekS5hSHN/wJuc/OBqT2ETn+Ivn8cj2fooR6Y7Ei6uFNwbNebYgzDzNOTfaGssCXoEqWL9dJA8FAXA9u4BQskIaUm9SiQblzKGZSKtoPPFh7Sp7Ii1k2TAG0g9VW8gYqUZgLZY4OKjARR+SkdyzlnJKOD1QuSIrnyDNOgl7SBwtujT6gg+9bcQzSPVRWuPldYj2qYEZiR7LPood7AvzDL2tZwb8r60O5KDip+66inj5BxmPO6Vmeo84DLXdZNhEnoCfaL5J9qArhTvxYPjU8RiuBoy6nqN00IWeT2e3RZTPjpq1wc= test2
++""";
++
++private void test_key_parse_pubkey_multiple() {
++ var input = new MemoryInputStream.from_data(PUBKEY_MULTIPLE.data);
++
++ var mainloop = new GLib.MainLoop();
++ Seahorse.Ssh.Key.parse.begin(input, null, (obj, res) => {
++ try {
++ var parse_result = Seahorse.Ssh.Key.parse.end(res);
++ assert_true(parse_result.public_keys.length == 2);
++ assert_true(parse_result.secret_keys.length == 0);
++ } catch (Error err) {
++ error("Couldn't parse public key: %s", err.message);
++ } finally {
++ mainloop.quit();
++ }
++ });
++ mainloop.run();
++}
++
++const string PRIVATE_KEY_SIMPLE = """
++-----BEGIN OPENSSH PRIVATE KEY-----
++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
++-----END OPENSSH PRIVATE KEY-----
++""";
++
++private void test_key_parse_private_key_simple() {
++ var input = new MemoryInputStream.from_data(PRIVATE_KEY_SIMPLE.data);
++
++ var mainloop = new GLib.MainLoop();
++ Seahorse.Ssh.Key.parse.begin(input, null, (obj, res) => {
++ try {
++ var parse_result = Seahorse.Ssh.Key.parse.end(res);
++ assert_true(parse_result.public_keys.length == 0);
++
++ assert_true(parse_result.secret_keys.length == 1);
++ unowned var secdata = parse_result.secret_keys[0];
++ assert_null(secdata.comment);
++ assert_true(secdata.algo == Seahorse.Ssh.Algorithm.RSA);
++ } catch (Error err) {
++ error("Couldn't parse private key: %s", err.message);
++ } finally {
++ mainloop.quit();
++ }
++ });
++ mainloop.run();
++}
++
++// Key with "test" password
++const string PRIVATE_KEY_PW_PROTECTED = """
++-----BEGIN OPENSSH PRIVATE KEY-----
++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
++Znmynq4dXIf58Nj4+TpgQkxQwxM=
++-----END OPENSSH PRIVATE KEY-----
++""";
++
++private void test_key_parse_private_key_pw_protected() {
++ var input = new MemoryInputStream.from_data(PRIVATE_KEY_PW_PROTECTED.data);
++
++ var mainloop = new GLib.MainLoop();
++ Seahorse.Ssh.Key.parse.begin(input, null, (obj, res) => {
++ try {
++ var parse_result = Seahorse.Ssh.Key.parse.end(res);
++ assert_true(parse_result.public_keys.length == 0);
++
++ assert_true(parse_result.secret_keys.length == 1);
++ unowned var secdata = parse_result.secret_keys[0];
++ assert_null(secdata.comment);
++ assert_true(secdata.algo == Seahorse.Ssh.Algorithm.RSA);
++ } catch (Error err) {
++ error("Couldn't parse private key: %s", err.message);
++ } finally {
++ mainloop.quit();
++ }
++ });
++ mainloop.run();
++}
+--
+GitLab
diff --git a/app-crypt/seahorse/files/seahorse-43.0-c99.patch b/app-crypt/seahorse/files/seahorse-43.0-c99.patch
new file mode 100644
index 000000000000..6fe5ff3cd800
--- /dev/null
+++ b/app-crypt/seahorse/files/seahorse-43.0-c99.patch
@@ -0,0 +1,21 @@
+https://bugs.gentoo.org/882805
+https://gitlab.gnome.org/GNOME/seahorse/-/merge_requests/220
+
+From 4110a2389bf9728b8f0c9b216b0a5843de806e4a Mon Sep 17 00:00:00 2001
+From: ppw 0 <ppw0@tuta.io>
+Date: Wed, 6 Dec 2023 12:16:45 +0000
+Subject: [PATCH] Update file operation.vala
+
+--- a/ssh/operation.vala
++++ b/ssh/operation.vala
+@@ -49,7 +49,7 @@ public abstract class Operation : GLib.Object {
+ protected async string? operation_async(string command,
+ string? input,
+ Cancellable? cancellable) throws GLib.Error {
+- return_val_if_fail (command != null && command != "", null);
++ return_val_if_fail (command != null && command != "", false);
+
+ // Strip the command name for logging purposes
+ string[] args;
+--
+GitLab
diff --git a/app-crypt/seahorse/files/seahorse-43.0-clang16.patch b/app-crypt/seahorse/files/seahorse-43.0-clang16.patch
new file mode 100644
index 000000000000..c31fc42709e1
--- /dev/null
+++ b/app-crypt/seahorse/files/seahorse-43.0-clang16.patch
@@ -0,0 +1,35 @@
+https://gitlab.gnome.org/GNOME/seahorse/-/merge_requests/214
+
+From 3887ba07ccab4aa970c24a22a183b97e255e6ece Mon Sep 17 00:00:00 2001
+From: Florian Weimer <fweimer@redhat.com>
+Date: Fri, 14 Apr 2023 14:37:23 +0200
+Subject: [PATCH] Avoid C99 incompatibility around
+ seahorse_pkcs11_backend_initialize
+
+Move the prototype for seahorse_pkcs11_backend_initialize into the
+header file, so C code generated from Vala sources will use it.
+This avoids an implicit function declaration during the C-build
+of src/application.vala, and resulting build failures with future
+compilers.
+--- a/pkcs11/seahorse-pkcs11-backend.c
++++ b/pkcs11/seahorse-pkcs11-backend.c
+@@ -43,8 +43,6 @@ enum {
+ PROP_LOADED,
+ };
+
+-void seahorse_pkcs11_backend_initialize (void);
+-
+ static SeahorsePkcs11Backend *pkcs11_backend = NULL;
+
+ struct _SeahorsePkcs11Backend {
+--- a/pkcs11/seahorse-pkcs11-backend.h
++++ b/pkcs11/seahorse-pkcs11-backend.h
+@@ -43,4 +43,6 @@ SeahorsePkcs11Backend * seahorse_pkcs11_backend_get (void);
+ GcrCollection * seahorse_pkcs11_backend_get_writable_tokens (SeahorsePkcs11Backend *self,
+ gulong with_mechanism);
+
++void seahorse_pkcs11_backend_initialize (void);
++
+ #endif /* SEAHORSE_PKCS11_BACKEND_H_ */
+--
+GitLab
diff --git a/app-crypt/seahorse/files/seahorse-43.0-gnupg-2.4.patch b/app-crypt/seahorse/files/seahorse-43.0-gnupg-2.4.patch
new file mode 100644
index 000000000000..034da78fb284
--- /dev/null
+++ b/app-crypt/seahorse/files/seahorse-43.0-gnupg-2.4.patch
@@ -0,0 +1,20 @@
+https://bugs.gentoo.org/889362
+https://gitlab.gnome.org/GNOME/seahorse/-/commit/9260c74779be3d7a378db0671af862ffa3573d42
+
+From: Xi Ruoyao <xry111@xry111.site>
+Date: Wed, 21 Dec 2022 20:58:26 +0800
+Subject: [PATCH] Allow building with GnuPG-2.4.x
+
+--- a/meson.build
++++ b/meson.build
+@@ -26,7 +26,7 @@ endif
+ # Dependencies
+ min_glib_version = '2.66'
+ min_gcr_version = '3.38'
+-accepted_gpg_versions = [ '2.2.0', '2.3.0' ]
++accepted_gpg_versions = [ '2.2.0', '2.3.0', '2.4.0' ]
+ gpg_check_version = find_program('build-aux' / 'gpg_check_version.py')
+
+ glib_deps = [
+--
+GitLab
diff --git a/app-crypt/seahorse/files/seahorse-43.0-musl-stdout.patch b/app-crypt/seahorse/files/seahorse-43.0-musl-stdout.patch
new file mode 100644
index 000000000000..2a6873134e27
--- /dev/null
+++ b/app-crypt/seahorse/files/seahorse-43.0-musl-stdout.patch
@@ -0,0 +1,85 @@
+https://gitlab.gnome.org/GNOME/seahorse/-/commit/6d673637d90066f4756568ce1b2f1f3c89a37c74
+
+From 6d673637d90066f4756568ce1b2f1f3c89a37c74 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Pablo=20Correa=20G=C3=B3mez?= <ablocorrea@hotmail.com>
+Date: Thu, 20 Oct 2022 18:35:33 +0200
+Subject: [PATCH] ssh: avoid stdout and stderr variable names
+
+In Alpine Linux, the compiler:
+
+C compiler for the host machine: gcc (gcc 12.2.1 "gcc (Alpine 12.2.1_git20220924-r3) 12.2.1 20220924")
+C linker for the host machine: gcc ld.bfd 2.39
+Vala compiler for the host machine: valac (valac 0.56.3)
+
+ended up including stdio.h into the C code generated from Vala.
+This produced the following (and similar) errors due to
+stderr and stdout being #define in stdio.h:
+
+ninja: job failed: gcc -Issh/libseahorse-ssh.a.p -Issh -I../ssh -Icommon -I../common -I. -I.. -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/gio-unix-2.0 -I/usr/include/gcr-3 -I/usr/include/gck-1 -I/usr/include/p11-kit-1 -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libdrm -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/libhandy-1 -flto=auto -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -w -O0 -DGCR_API_SUBJECT_TO_CHANGE -DGCK_API_SUBJECT_TO_CHANGE -DSECRET_WITH_UNSTABLE -include config.h -Wno-unused-parameter -Wno-missing-field-initializers -Os -fomit-frame-pointer -Os -fomit-frame-pointer -fPIC -pthread -MD -MQ ssh/libseahorse-ssh.a.p/meson-generated_operation.c.o -MF ssh/libseahorse-ssh.a.p/meson-generated_operation.c.o.d -o ssh/libseahorse-ssh.a.p/meson-generated_operation.c.o -c ssh/libseahorse-ssh.a.p/operation.c
+In file included from /usr/include/fortify/stdio.h:22,
+ from /usr/include/pango-1.0/pango/pango-utils.h:25,
+ from /usr/include/pango-1.0/pango/pango.h:51,
+ from /usr/include/gtk-3.0/gdk/gdktypes.h:35,
+ from /usr/include/gtk-3.0/gdk/gdkapplaunchcontext.h:30,
+ from /usr/include/gtk-3.0/gdk/gdk.h:32,
+ from /usr/include/gtk-3.0/gtk/gtk.h:30,
+ from common/seahorse-common.h:11,
+ from ssh/seahorse-ssh.h:6,
+ from ssh/libseahorse-ssh.a.p/operation.c:25:
+ssh/libseahorse-ssh.a.p/operation.c: In function 'seahorse_ssh_operation_operation_async_co':
+ssh/libseahorse-ssh.a.p/operation.c:621:17: error: expected identifier before '(' token
+ 621 | _data_->stdout = NULL;
+ | ^~~~~~
+ssh/libseahorse-ssh.a.p/operation.c:622:17: error: expected identifier before '(' token
+ 622 | _data_->stderr = NULL;
+ | ^~~~~~
+
+Fix the problem by naming the variables std_out and std_err, as it
+was before commit e60e5fd4b1545053e99758b894e8ef981de08c3e
+
+Fixes e60e5fd4b1545053e99758b894e8ef981de08c3e
+
+Coauthored-by: psykose <alice@ayaya.dev>
+--- a/ssh/operation.vala
++++ b/ssh/operation.vala
+@@ -84,12 +84,12 @@ public abstract class Operation : GLib.Object {
+
+ // And off we go to run the program
+ var subprocess = launcher.spawnv(args);
+- string? stdout = null, stderr = null;
++ string? std_out = null, std_err = null;
+ try {
+- yield subprocess.communicate_utf8_async(input, cancellable, out stdout, out stderr);
+- return stdout;
++ yield subprocess.communicate_utf8_async(input, cancellable, out std_out, out std_err);
++ return std_out;
+ } catch (GLib.Error e) {
+- Seahorse.Util.show_error(null, this.prompt_title, stderr);
++ Seahorse.Util.show_error(null, this.prompt_title, std_err);
+ throw e;
+ }
+ }
+@@ -221,10 +221,10 @@ public class PrivateImportOperation : Operation {
+
+ // Start command to generate public key
+ string cmd = "%s -y -f '%s'".printf(Config.SSH_KEYGEN_PATH, file);
+- string stdout = yield operation_async(cmd, null, cancellable);
++ string std_out = yield operation_async(cmd, null, cancellable);
+
+ // We'll build the key string from the output
+- var key_str = new StringBuilder(stdout);
++ var key_str = new StringBuilder(std_out);
+
+ // Only use the first line of the output
+ int pos = int.max(key_str.str.index_of_char('\n'), key_str.str.index_of_char('\r'));
+@@ -232,7 +232,7 @@ public class PrivateImportOperation : Operation {
+ key_str.erase(pos);
+
+ // Parse the data so we can get the fingerprint
+- KeyData? keydata = KeyData.parse_line(stdout);
++ KeyData? keydata = KeyData.parse_line(std_out);
+
+ // Add the comment to the output
+ if (data.comment != null) {
+--
+GitLab
diff --git a/app-crypt/seahorse/metadata.xml b/app-crypt/seahorse/metadata.xml
index 10379b458c7f..e641ba504704 100644
--- a/app-crypt/seahorse/metadata.xml
+++ b/app-crypt/seahorse/metadata.xml
@@ -1,18 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
-<maintainer type="project">
- <email>gnome@gentoo.org</email>
- <name>Gentoo GNOME Desktop</name>
-</maintainer>
-<use>
- <flag name="ldap">Enable seahorse to manipulate GPG keys on a LDAP server.</flag>
-</use>
-<longdescription>Seahorse is a GNOME application for managing encryption keys.
-It also integrates with nautilus, gedit and other places for encryption operations.
+ <maintainer type="project">
+ <email>gnome@gentoo.org</email>
+ <name>Gentoo GNOME Desktop</name>
+ </maintainer>
+ <use>
+ <flag name="ldap">Enable seahorse to manipulate GPG keys on a LDAP server.</flag>
+ </use>
+ <longdescription>
+ Seahorse is a GNOME application for managing encryption keys.
+ It also integrates with nautilus, gedit and other places for encryption operations.
-With seahorse you can create and manage PGP keys, create and manage SSH keys,
-publish and retrieve keys from key servers, cache your passphrase so you
-don't have to keep typing it and backup your keys and keyring.
-</longdescription>
+ With seahorse you can create and manage PGP keys, create and manage SSH keys,
+ publish and retrieve keys from key servers, cache your passphrase so you
+ don't have to keep typing it and backup your keys and keyring.
+ </longdescription>
+ <upstream>
+ <remote-id type="gnome-gitlab">GNOME/seahorse</remote-id>
+ </upstream>
</pkgmetadata>
diff --git a/app-crypt/seahorse/seahorse-41.0.ebuild b/app-crypt/seahorse/seahorse-43.0-r3.ebuild
index abbf0c377707..3d17bcbbd3f2 100644
--- a/app-crypt/seahorse/seahorse-41.0.ebuild
+++ b/app-crypt/seahorse/seahorse-43.0-r3.ebuild
@@ -1,8 +1,9 @@
-# Copyright 1999-2021 Gentoo Authors
+# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
-EAPI=7
-inherit gnome.org gnome2-utils meson xdg vala
+EAPI=8
+PYTHON_COMPAT=( python3_{10..12} )
+inherit gnome.org gnome2-utils meson python-any-r1 vala xdg
DESCRIPTION="Manage your passwords and encryption keys"
HOMEPAGE="https://wiki.gnome.org/Apps/Seahorse"
@@ -10,30 +11,31 @@ HOMEPAGE="https://wiki.gnome.org/Apps/Seahorse"
LICENSE="GPL-2+ FDL-1.1+"
SLOT="0"
IUSE="ldap zeroconf"
-KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~ia64 ~ppc ~ppc64 ~riscv ~sparc ~x86"
+KEYWORDS="~alpha amd64 ~arm arm64 ~ia64 ~loong ~ppc ~ppc64 ~riscv ~sparc x86"
RDEPEND="
>=dev-libs/glib-2.66:2
- >=app-crypt/gcr-3.38:=
- >=app-crypt/gpgme-1.14.0
+ >=app-crypt/gcr-3.38:0=
+ >=app-crypt/gpgme-1.14.0:=
>=x11-libs/gtk+-3.24.0:3
>=app-crypt/gnupg-2.2
- >=gui-libs/libhandy-1.1:1=
+ >=gui-libs/libhandy-1.6.0:1
>=app-crypt/libsecret-0.16
dev-libs/libpwquality
- net-misc/openssh
+ virtual/openssh
ldap? ( net-nds/openldap:= )
- >=net-libs/libsoup-2.33.92:2.4
- zeroconf? ( >=net-dns/avahi-0.6:=[dbus] )
+ net-libs/libsoup:3.0
+ zeroconf? ( >=net-dns/avahi-0.6[dbus] )
"
DEPEND="${RDEPEND}
$(vala_depend)
dev-libs/libxml2:2
- app-crypt/gcr[vala]
+ app-crypt/gcr:0[vala]
app-crypt/libsecret[vala]
gui-libs/libhandy:1[vala]
"
BDEPEND="
+ ${PYTHON_DEPS}
app-text/docbook-xml-dtd:4.2
app-text/docbook-xsl-stylesheets
dev-libs/appstream-glib
@@ -45,9 +47,16 @@ BDEPEND="
virtual/pkgconfig
"
+PATCHES=(
+ "${FILESDIR}"/${P}-gnupg-2.4.patch
+ "${FILESDIR}"/${P}-musl-stdout.patch
+ "${FILESDIR}"/${P}-clang16.patch
+)
+
src_prepare() {
- xdg_src_prepare
- vala_src_prepare
+ default
+ vala_setup
+ gnome2_environment_reset
}
src_configure() {
diff --git a/app-crypt/seahorse/seahorse-40.0-r1.ebuild b/app-crypt/seahorse/seahorse-43.0-r4.ebuild
index 935f5b5b2e62..422476ec2fd6 100644
--- a/app-crypt/seahorse/seahorse-40.0-r1.ebuild
+++ b/app-crypt/seahorse/seahorse-43.0-r4.ebuild
@@ -1,8 +1,9 @@
-# Copyright 1999-2021 Gentoo Authors
+# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
-EAPI=7
-inherit gnome.org gnome2-utils meson xdg vala
+EAPI=8
+PYTHON_COMPAT=( python3_{10..12} )
+inherit gnome.org gnome2-utils meson python-any-r1 vala xdg
DESCRIPTION="Manage your passwords and encryption keys"
HOMEPAGE="https://wiki.gnome.org/Apps/Seahorse"
@@ -10,30 +11,31 @@ HOMEPAGE="https://wiki.gnome.org/Apps/Seahorse"
LICENSE="GPL-2+ FDL-1.1+"
SLOT="0"
IUSE="ldap zeroconf"
-KEYWORDS="~alpha amd64 ~arm arm64 ~ia64 ~ppc ~ppc64 ~sparc x86"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~ia64 ~loong ~ppc ~ppc64 ~riscv ~sparc ~x86"
RDEPEND="
- >=dev-libs/glib-2.58:2
- >=app-crypt/gcr-3.38:=
- >=app-crypt/gpgme-1.14.0
+ >=dev-libs/glib-2.66:2
+ >=app-crypt/gcr-3.38:0=
+ >=app-crypt/gpgme-1.14.0:=
>=x11-libs/gtk+-3.24.0:3
>=app-crypt/gnupg-2.2
- >=gui-libs/libhandy-1.1:1=
+ >=gui-libs/libhandy-1.6.0:1
>=app-crypt/libsecret-0.16
dev-libs/libpwquality
- net-misc/openssh
+ virtual/openssh
ldap? ( net-nds/openldap:= )
- >=net-libs/libsoup-2.33.92:2.4
- zeroconf? ( >=net-dns/avahi-0.6:=[dbus] )
+ net-libs/libsoup:3.0
+ zeroconf? ( >=net-dns/avahi-0.6[dbus] )
"
DEPEND="${RDEPEND}
$(vala_depend)
dev-libs/libxml2:2
- app-crypt/gcr[vala]
+ app-crypt/gcr:0[vala]
app-crypt/libsecret[vala]
gui-libs/libhandy:1[vala]
"
BDEPEND="
+ ${PYTHON_DEPS}
app-text/docbook-xml-dtd:4.2
app-text/docbook-xsl-stylesheets
dev-libs/appstream-glib
@@ -46,12 +48,17 @@ BDEPEND="
"
PATCHES=(
- "${FILESDIR}"/${P}-fix-segfault-with-ldap-disabled.patch
+ "${FILESDIR}"/${P}-gnupg-2.4.patch
+ "${FILESDIR}"/${P}-musl-stdout.patch
+ "${FILESDIR}"/${P}-clang16.patch
+ "${FILESDIR}"/${P}-c99.patch
+ "${FILESDIR}"/${P}-c99-2.patch
)
src_prepare() {
- xdg_src_prepare
- vala_src_prepare
+ default
+ vala_setup
+ gnome2_environment_reset
}
src_configure() {