[PackageKit-commit] packagekit: Branch 'master' - 36 commits

Richard Hughes hughsient at kemper.freedesktop.org
Fri Jul 17 04:23:01 PDT 2009


 backends/portage/portageBackend.py         |  202 +++++--
 contrib/browser-plugin/pk-plugin-install.c |   81 +--
 contrib/gtk-module/pk-gtk-module.c         |    8 
 data/Makefile.am                           |    6 
 docs/security.txt                          |   19 
 docs/setting-the-proxy.txt                 |   29 +
 lib/packagekit-glib/Makefile.am            |    3 
 lib/packagekit-glib/egg-string.c           |   52 +-
 lib/packagekit-glib/packagekit.h           |    1 
 lib/packagekit-glib/pk-client-pool.c       |  401 +++++++++++++++
 lib/packagekit-glib/pk-client-pool.h       |   78 +++
 lib/packagekit-glib/pk-client.c            |  191 ++++---
 lib/packagekit-glib/pk-client.h            |    2 
 lib/packagekit-glib/pk-self-test.c         |    2 
 po/da.po                                   |  339 ++++++++-----
 po/es.po                                   |  575 ++++++++++++++++------
 po/ml.po                                   |  619 ++++++++++++++++-------
 po/pt_BR.po                                |  750 ++++++++++++++++++++---------
 src/Makefile.am                            |    2 
 src/pk-dbus.c                              |  307 +++++++++++
 src/pk-dbus.h                              |   64 ++
 src/pk-engine.c                            |   67 ++
 src/pk-lsof.c                              |   15 
 src/pk-transaction-db.c                    |  241 +++++++++
 src/pk-transaction-db.h                    |   10 
 src/pk-transaction-extra.c                 |   23 
 src/pk-transaction-list.c                  |    8 
 src/pk-transaction.c                       |  193 ++-----
 28 files changed, 3286 insertions(+), 1002 deletions(-)

New commits:
commit f17797bbce189fd96b13dbe9476c6a06741dc766
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jul 17 12:21:20 2009 +0100

    Ensure we set the correct proxy for the transaction according to the uid and session. Fixes rh#491859

diff --git a/src/pk-engine.c b/src/pk-engine.c
index b83030c..8b8a51b 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -94,6 +94,7 @@ struct PkEnginePrivate
 #endif
 	gchar			*proxy_http;
 	gchar			*proxy_ftp;
+	gchar			*sender;
 };
 
 enum {
@@ -586,6 +587,8 @@ pk_engine_action_obtain_authorization_finished_cb (GObject *source_object, GAsyn
 	PolkitAuthorizationResult *result;
 	GError *error = NULL;
 	gboolean ret;
+	guint uid;
+	gchar *session = NULL;
 
 	/* finish the call */
 	result = polkit_authority_check_authorization_finish (engine->priv->authority, res, &error);
@@ -609,10 +612,33 @@ pk_engine_action_obtain_authorization_finished_cb (GObject *source_object, GAsyn
 		egg_warning ("setting the proxy failed");
 		goto out;
 	}
+
+	/* get uid */
+	uid = pk_dbus_get_uid (engine->priv->dbus, engine->priv->sender);
+	if (uid == G_MAXUINT) {
+		egg_warning ("failed to get the uid");
+		goto out;
+	}
+
+	/* get session */
+	session = pk_dbus_get_session (engine->priv->dbus, engine->priv->sender);
+	if (session == NULL) {
+		egg_warning ("failed to get the session");
+		goto out;
+	}
+
+	/* save to database */
+	ret = pk_transaction_db_set_proxy (engine->priv->transaction_db, uid, session,
+					   engine->priv->proxy_http, engine->priv->proxy_ftp);
+	if (!ret) {
+		egg_warning ("failed to save the proxy in the database");
+		goto out;
+	}
+
 out:
 	if (result != NULL)
 		g_object_unref (result);
-	return;
+	g_free (session);
 }
 #endif
 
@@ -633,6 +659,12 @@ pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *pro
 #endif
 	g_return_if_fail (PK_IS_ENGINE (engine));
 
+	/* blank is NULL */
+	if (proxy_http != NULL && proxy_http[0] == '\0')
+		proxy_http = NULL;
+	if (proxy_ftp != NULL && proxy_ftp[0] == '\0')
+		proxy_ftp = NULL;
+
 	egg_debug ("SetProxy method called: %s, %s", proxy_http, proxy_ftp);
 
 	/* check length of http */
@@ -652,12 +684,14 @@ pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *pro
 	}
 
 	/* save these so we can set them after the auth success */
-	egg_debug ("potentially changing http proxy from %s to %s", engine->priv->proxy_http, proxy_http);
-	egg_debug ("potentially changing ftp proxy from %s to %s", engine->priv->proxy_ftp, proxy_ftp);
 	g_free (engine->priv->proxy_http);
 	g_free (engine->priv->proxy_ftp);
+	g_free (engine->priv->sender);
 	engine->priv->proxy_http = g_strdup (proxy_http);
 	engine->priv->proxy_ftp = g_strdup (proxy_ftp);
+	engine->priv->sender = dbus_g_method_get_sender (context);
+	egg_debug ("changing http proxy to %s for %s", proxy_http, engine->priv->sender);
+	egg_debug ("changing ftp proxy to %s for %s", proxy_ftp, engine->priv->sender);
 
 #ifdef USE_SECURITY_POLKIT
 	/* check subject */
@@ -866,6 +900,7 @@ pk_engine_init (PkEngine *engine)
 	engine->priv->notify_clients_of_upgrade = FALSE;
 	engine->priv->shutdown_as_soon_as_possible = FALSE;
 	engine->priv->mime_types = NULL;
+	engine->priv->sender = NULL;
 
 	/* use the config file */
 	engine->priv->conf = pk_conf_new ();
@@ -1012,6 +1047,7 @@ pk_engine_finalize (GObject *object)
 	g_free (engine->priv->mime_types);
 	g_free (engine->priv->proxy_http);
 	g_free (engine->priv->proxy_ftp);
+	g_free (engine->priv->sender);
 
 	G_OBJECT_CLASS (pk_engine_parent_class)->finalize (object);
 }
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 2fad8fd..aacbeee 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1154,10 +1154,50 @@ out:
 /**
  * pk_transaction_set_running:
  */
+static gboolean
+pk_transaction_set_proxy (PkTransaction *transaction, GError **error)
+{
+	gboolean ret = FALSE;
+	gchar *session = NULL;
+	gchar *proxy_http = NULL;
+	gchar *proxy_ftp = NULL;
+
+	/* get session */
+	session = pk_dbus_get_session (transaction->priv->dbus, transaction->priv->sender);
+	if (session == NULL) {
+		*error = g_error_new (1, 0, "failed to get the session");
+		goto out;
+	}
+
+	/* get from database */
+	ret = pk_transaction_db_get_proxy (transaction->priv->transaction_db, transaction->priv->uid, session, &proxy_http, &proxy_ftp);
+	if (!ret) {
+		*error = g_error_new (1, 0, "failed to get the proxy from the database");
+		goto out;
+	}
+
+	/* try to set the new proxy */
+	ret = pk_backend_set_proxy (transaction->priv->backend, proxy_http, proxy_ftp);
+	if (!ret) {
+		*error = g_error_new (1, 0, "failed to set the proxy");
+		goto out;
+	}
+	egg_debug ("using http_proxy=%s, ftp_proxy=%s for %i:%s", proxy_http, proxy_ftp, transaction->priv->uid, session);
+out:
+	g_free (proxy_http);
+	g_free (proxy_ftp);
+	g_free (session);
+	return ret;
+}
+
+/**
+ * pk_transaction_set_running:
+ */
 G_GNUC_WARN_UNUSED_RESULT static gboolean
 pk_transaction_set_running (PkTransaction *transaction)
 {
 	gboolean ret;
+	GError *error = NULL;
 	PkBackendDesc *desc;
 	PkStore *store;
 	PkTransactionPrivate *priv = PK_TRANSACTION_GET_PRIVATE (transaction);
@@ -1186,6 +1226,13 @@ pk_transaction_set_running (PkTransaction *transaction)
 	pk_backend_set_role (priv->backend, priv->role);
 	egg_debug ("setting role for %s to %s", priv->tid, pk_role_enum_to_text (priv->role));
 
+	/* set proxy */
+	ret = pk_transaction_set_proxy (transaction, &error);
+	if (!ret) {
+		egg_warning ("failed to set the proxy: %s", error->message);
+		g_error_free (error);
+	}
+
 	/* do any pre transaction checks */
 	ret = pk_transaction_pre_transaction_checks (transaction, priv->cached_package_ids);
 
commit 5b7350701a22272ad5a8a64c77f0bf1282581f3c
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jul 17 12:09:39 2009 +0100

    Only return true when pk_transaction_db_get_proxy() finds valid data

diff --git a/src/pk-transaction-db.c b/src/pk-transaction-db.c
index 3d5cbe7..a1e515e 100644
--- a/src/pk-transaction-db.c
+++ b/src/pk-transaction-db.c
@@ -82,6 +82,12 @@ typedef struct {
 	gchar *cmdline;
 } PkTransactionDbItem;
 
+typedef struct {
+	gchar		*proxy_http;
+	gchar		*proxy_ftp;
+	gboolean	set;
+} PkTransactionDbProxyItem;
+
 /**
  * pk_transaction_db_item_clear:
  **/
@@ -576,11 +582,6 @@ pk_transaction_db_generate_id (PkTransactionDb *tdb)
 	return tid;
 }
 
-typedef struct {
-	gchar	*proxy_http;
-	gchar	*proxy_ftp;
-} PkTransactionDbProxyItem;
-
 /**
  * pk_transaction_sqlite_proxy_cb:
  **/
@@ -595,8 +596,10 @@ pk_transaction_sqlite_proxy_cb (void *data, gint argc, gchar **argv, gchar **col
 	for (i=0; i<argc; i++) {
 		if (egg_strequal (col_name[i], "proxy_http")) {
 			item->proxy_http = g_strdup (argv[i]);
+			item->set = TRUE;
 		} else if (egg_strequal (col_name[i], "proxy_ftp")) {
 			item->proxy_ftp = g_strdup (argv[i]);
+			item->set = TRUE;
 		} else {
 			egg_warning ("%s = %s\n", col_name[i], argv[i]);
 		}
@@ -627,7 +630,7 @@ pk_transaction_db_proxy_item_free (PkTransactionDbProxyItem *item)
  *
  * Retrieves the proxy information from the database.
  *
- * Return value: %TRUE for success
+ * Return value: %TRUE if we matched a proxy
  **/
 gboolean
 pk_transaction_db_get_proxy (PkTransactionDb *tdb, guint uid, const gchar *session,
@@ -655,6 +658,12 @@ pk_transaction_db_get_proxy (PkTransactionDb *tdb, guint uid, const gchar *sessi
 		goto out;
 	}
 
+	/* nothing matched */
+	if (!item->set) {
+		egg_debug ("no data");
+		goto out;
+	}
+
 	/* copy data */
 	*proxy_http = g_strdup (item->proxy_http);
 	*proxy_ftp = g_strdup (item->proxy_ftp);
@@ -695,14 +704,8 @@ pk_transaction_db_set_proxy (PkTransactionDb *tdb, guint uid, const gchar *sessi
 
 	/* check for previous entries */
 	ret = pk_transaction_db_get_proxy (tdb, uid, session, &proxy_http_tmp, &proxy_ftp_tmp);
-	if (!ret) {
-		egg_warning ("failed to get previous proxies");
-		goto out;
-	}
-
-	/* any data */
-	if (proxy_http_tmp != NULL || proxy_ftp_tmp != NULL) {
-		egg_debug ("updated proxy for uid:%i and session:%s", uid, session);
+	if (ret) {
+		egg_debug ("updated proxy %s, %s for uid:%i and session:%s", proxy_http, proxy_ftp, uid, session);
 
 		/* prepare statement */
 		rc = sqlite3_prepare_v2 (tdb->priv->db,
@@ -730,7 +733,7 @@ pk_transaction_db_set_proxy (PkTransactionDb *tdb, guint uid, const gchar *sessi
 
 	/* insert new entry */
 	timespec = pk_iso8601_present ();
-	egg_debug ("set proxy for uid:%i and session:%s", uid, session);
+	egg_debug ("set proxy %s, %s for uid:%i and session:%s", proxy_http, proxy_ftp, uid, session);
 
 	/* prepare statement */
 	rc = sqlite3_prepare_v2 (tdb->priv->db,
commit 2f742a809a4d8915a4e692b8eb920f18fd4f0258
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jul 17 11:09:37 2009 +0100

    Make saving the proxy data secure, and add some notes to the security document

diff --git a/docs/security.txt b/docs/security.txt
index f5a3ef8..4da7c73 100644
--- a/docs/security.txt
+++ b/docs/security.txt
@@ -91,3 +91,22 @@ Possible attack vectors:
  (MaximumPackagesToProcess) for each method, and also limiting the total length
  of the data.
 
+ * The HTTP and FTP proxies that are sent by the session may contain embedded
+ usernames and passwords. Whilst these are sent in plain text over the system
+ D-Bus (FIXME?), the database is not be readable by users (mode 0640).
+
+ * The matching of UID and session to proxies assumes that the user cannot
+ modify the login UID, and cannot spoof a session in ConsoleKit. If a user were
+ able to change the apparent UID, then this would allow them to use proxy
+ settings set from another user.
+ This is manifested when a graphical application is run using sudo (which you
+ should never do, but I digress) and different proxy settings may be used from
+ the user settings. It also allows applications run using sudo to use the proxy
+ specified by root, which may be different.
+
+ * We save the UID and session to a database to get the proxy state for each
+ transaction. If the user is able to create a large number of different sessions
+ then this will add many entries to the database. Some rate-limiting could be
+ added to ConsoleKit or PackageKit to solve this, but has not been done at this
+ time.
+
diff --git a/docs/setting-the-proxy.txt b/docs/setting-the-proxy.txt
index 4dece35..7406545 100644
--- a/docs/setting-the-proxy.txt
+++ b/docs/setting-the-proxy.txt
@@ -27,29 +27,3 @@ proxy settings and this is passed to the backend. This also allows the daemon to
 have to correct proxy settings if the daemon times out (as it is designed to do)
 and is restarted by a client application using DBus system activation.
 
-Implementation considerations;
-
-The PID and session should be be cached in PkDbus as these will be used on each transaction.
-
-Security considerations:
-The HTTP and FTP proxies that are sent by the session may contain embedded
-usernames and passwords. Whilst these are sent in plain text over the system
-DBus (TODO), the database should not be readable by a user as this could be used
-to discover proxy server passwords.
-
-The matching of UID and session to proxies assumes that the user cannot modify
-the login UID, and cannot spoof a session in ConsoleKit. If a user were able to
-change the apparent UID, then this would allow them to use proxy settings set
-from another user. This is manifested when a graphical application is run using
-sudo (which you should never do, but I digress) and different proxy settings may
-be used from the user settings. It also allows applications run using sudo to
-use the proxy specified by root, which may be different.
-
-We save the UID and session to a database to get the proxy state for each
-transaction. If the user is able to create a large number of different sessions
-then this will add many entries to the database. Some rate-limiting could be
-added to ConsoleKit or PackageKit to solve this, but has not been done at this
-time.
-
-TODO: need to check for injected SQL in the proxy data before we add freeform text.
-
diff --git a/src/pk-dbus.c b/src/pk-dbus.c
index 0605b90..28ba20c 100644
--- a/src/pk-dbus.c
+++ b/src/pk-dbus.c
@@ -95,7 +95,7 @@ pk_dbus_get_pid (PkDbus *dbus, const gchar *sender)
 	g_return_val_if_fail (dbus->priv->proxy_pid != NULL, G_MAXUINT);
 	g_return_val_if_fail (sender != NULL, G_MAXUINT);
 
-	/* get pid from DBus (quite slow) */
+	/* get pid from DBus (quite slow) - TODO: cache this */
 	ret = dbus_g_proxy_call (dbus->priv->proxy_pid,
 				 "GetConnectionUnixProcessID", &error,
 				 G_TYPE_STRING, sender,
diff --git a/src/pk-transaction-db.c b/src/pk-transaction-db.c
index 1f99997..3d5cbe7 100644
--- a/src/pk-transaction-db.c
+++ b/src/pk-transaction-db.c
@@ -683,13 +683,12 @@ gboolean
 pk_transaction_db_set_proxy (PkTransactionDb *tdb, guint uid, const gchar *session,
 			     const gchar *proxy_http, const gchar *proxy_ftp)
 {
-	gchar *error_msg = NULL;
-	gchar *statement = NULL;
 	gchar *timespec = NULL;
 	gchar *proxy_http_tmp = NULL;
 	gchar *proxy_ftp_tmp = NULL;
 	gboolean ret = FALSE;
 	gint rc;
+	sqlite3_stmt *statement = NULL;
 
 	g_return_val_if_fail (PK_IS_TRANSACTION_DB (tdb), FALSE);
 	g_return_val_if_fail (uid != G_MAXUINT, FALSE);
@@ -703,13 +702,27 @@ pk_transaction_db_set_proxy (PkTransactionDb *tdb, guint uid, const gchar *sessi
 
 	/* any data */
 	if (proxy_http_tmp != NULL || proxy_ftp_tmp != NULL) {
-		statement = g_strdup_printf ("UPDATE proxy SET proxy_http = '%s', proxy_ftp = '%s' WHERE uid = '%i' AND session = '%s'",
-					     proxy_http, proxy_ftp, uid, session);
 		egg_debug ("updated proxy for uid:%i and session:%s", uid, session);
-		rc = sqlite3_exec (tdb->priv->db, statement, NULL, NULL, &error_msg);
+
+		/* prepare statement */
+		rc = sqlite3_prepare_v2 (tdb->priv->db,
+					 "UPDATE proxy SET proxy_http = ?, proxy_ftp = ? WHERE uid = ? AND session = ?",
+					 -1, &statement, NULL);
 		if (rc != SQLITE_OK) {
-			egg_warning ("SQL error: %s", error_msg);
-			sqlite3_free (error_msg);
+			egg_warning ("failed to prepare statement: %s", sqlite3_errmsg (tdb->priv->db));
+			goto out;
+		}
+
+		/* bind data, so that the freeform proxy text cannot be used to inject SQL */
+		sqlite3_bind_text (statement, 1, proxy_http, -1, SQLITE_STATIC);
+		sqlite3_bind_text (statement, 2, proxy_ftp, -1, SQLITE_STATIC);
+		sqlite3_bind_int (statement, 3, uid);
+		sqlite3_bind_text (statement, 4, session, -1, SQLITE_STATIC);
+
+		/* execute statement */
+		rc = sqlite3_step (statement);
+		if (rc != SQLITE_DONE) {
+			egg_warning ("failed to execute statement: %s", sqlite3_errmsg (tdb->priv->db));
 			goto out;
 		}
 		goto out;
@@ -717,20 +730,36 @@ pk_transaction_db_set_proxy (PkTransactionDb *tdb, guint uid, const gchar *sessi
 
 	/* insert new entry */
 	timespec = pk_iso8601_present ();
-	statement = g_strdup_printf ("INSERT INTO proxy (created, uid, session, proxy_http, proxy_ftp) VALUES ('%s', '%i', '%s', '%s', '%s')",
-				     timespec, uid, session, proxy_http, proxy_ftp);
 	egg_debug ("set proxy for uid:%i and session:%s", uid, session);
-	rc = sqlite3_exec (tdb->priv->db, statement, NULL, NULL, &error_msg);
+
+	/* prepare statement */
+	rc = sqlite3_prepare_v2 (tdb->priv->db,
+				 "INSERT INTO proxy (created, uid, session, proxy_http, proxy_ftp) VALUES (?, ?, ?, ?, ?)",
+				 -1, &statement, NULL);
 	if (rc != SQLITE_OK) {
-		egg_warning ("SQL error: %s", error_msg);
-		sqlite3_free (error_msg);
+		egg_warning ("failed to prepare statement: %s", sqlite3_errmsg (tdb->priv->db));
+		goto out;
+	}
+
+	/* bind data, so that the freeform proxy text cannot be used to inject SQL */
+	sqlite3_bind_text (statement, 1, timespec, -1, SQLITE_STATIC);
+	sqlite3_bind_int (statement, 2, uid);
+	sqlite3_bind_text (statement, 3, session, -1, SQLITE_STATIC);
+	sqlite3_bind_text (statement, 4, proxy_http, -1, SQLITE_STATIC);
+	sqlite3_bind_text (statement, 5, proxy_ftp, -1, SQLITE_STATIC);
+
+	/* execute statement */
+	rc = sqlite3_step (statement);
+	if (rc != SQLITE_DONE) {
+		egg_warning ("failed to execute statement: %s", sqlite3_errmsg (tdb->priv->db));
 		goto out;
 	}
 
 	ret = TRUE;
 out:
+	if (statement != NULL)
+		sqlite3_finalize (statement);
 	g_free (timespec);
-	g_free (statement);
 	g_free (proxy_http_tmp);
 	g_free (proxy_ftp_tmp);
 	return ret;
commit e59ba218c6f2eec37f26f6cab5f60f00b2cdbcc5
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jul 17 10:51:11 2009 +0100

    Ensure the transaction database is not world readable

diff --git a/data/Makefile.am b/data/Makefile.am
index ac88c9b..b6815cc 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -35,6 +35,12 @@ database_DATA =						\
 	transactions.db					\
 	$(NULL)
 
+install-data-hook:
+	@for file in $(database_DATA); do \
+		echo "Remove global read access for: $(DESTDIR)$(PK_DB_DIR)/$$file"; \
+		chmod o-r $(DESTDIR)$(PK_DB_DIR)/$$file; \
+	done
+
 EXTRA_DIST =						\
 	org.freedesktop.PackageKit.conf.in		\
 	$(servicemain_in_files)				\
commit b35824314e3cb479bd2d476e700d28dcc4ddbdf1
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jul 17 10:17:59 2009 +0100

    Add a document explaining how we map the proxy internall

diff --git a/docs/setting-the-proxy.txt b/docs/setting-the-proxy.txt
new file mode 100644
index 0000000..4dece35
--- /dev/null
+++ b/docs/setting-the-proxy.txt
@@ -0,0 +1,55 @@
+Setting the proxy:
+
+The packagekitd daemon sets the network proxy for the packaging backend so that
+packages can be downloaded when on a corporate or managed network.
+
+If the system-wide ProxyHTTP or ProxyFTP are set in PackageKit.conf then these
+are used by default. If these keys are blank or not present then the session
+proxy can be used. The session proxies are the values that are set in the
+network proxy configuration.
+
+The session proxy is read by a session process that is started at login time,
+and then relayed to PackageKit. In GNOME, this is done by the gpk-update-icon
+process, which reads the settings from GConf, and executes SetProxy on
+org.freedesktop.PackageKit.
+
+Note: this method is on the main interface, not a transaction interface. The
+rationale for this is that every client using PackageKit should not have to
+read and set the proxy at the start of each and every transaction, as this
+would make each transaction slower to startup, and also require each client to
+read and track the session proxy configuration.
+
+To avoid this overhead, each session can register the proxy with the daemon
+once, and then the daemon can remember the user identifier and the session that
+it came from, and store this data in a database. When each transaction method
+is executed, the uid and session that executed the call are used to lookup the
+proxy settings and this is passed to the backend. This also allows the daemon to
+have to correct proxy settings if the daemon times out (as it is designed to do)
+and is restarted by a client application using DBus system activation.
+
+Implementation considerations;
+
+The PID and session should be be cached in PkDbus as these will be used on each transaction.
+
+Security considerations:
+The HTTP and FTP proxies that are sent by the session may contain embedded
+usernames and passwords. Whilst these are sent in plain text over the system
+DBus (TODO), the database should not be readable by a user as this could be used
+to discover proxy server passwords.
+
+The matching of UID and session to proxies assumes that the user cannot modify
+the login UID, and cannot spoof a session in ConsoleKit. If a user were able to
+change the apparent UID, then this would allow them to use proxy settings set
+from another user. This is manifested when a graphical application is run using
+sudo (which you should never do, but I digress) and different proxy settings may
+be used from the user settings. It also allows applications run using sudo to
+use the proxy specified by root, which may be different.
+
+We save the UID and session to a database to get the proxy state for each
+transaction. If the user is able to create a large number of different sessions
+then this will add many entries to the database. Some rate-limiting could be
+added to ConsoleKit or PackageKit to solve this, but has not been done at this
+time.
+
+TODO: need to check for injected SQL in the proxy data before we add freeform text.
+
commit 9c7ea538343c6e1f6edc0992a4d05532b29cda28
Merge: 90b9108... df624f6...
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jul 17 10:09:27 2009 +0100

    Merge branch 'master' of git+ssh://hughsie@git.packagekit.org/srv/git/PackageKit

commit 90b9108256e1ab557dc96e98ef7d89a657d7ef87
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jul 17 10:09:00 2009 +0100

    Add uid and session to proxy mapping in the database

diff --git a/src/pk-transaction-db.c b/src/pk-transaction-db.c
index 52e3ae2..1f99997 100644
--- a/src/pk-transaction-db.c
+++ b/src/pk-transaction-db.c
@@ -576,6 +576,166 @@ pk_transaction_db_generate_id (PkTransactionDb *tdb)
 	return tid;
 }
 
+typedef struct {
+	gchar	*proxy_http;
+	gchar	*proxy_ftp;
+} PkTransactionDbProxyItem;
+
+/**
+ * pk_transaction_sqlite_proxy_cb:
+ **/
+static gint
+pk_transaction_sqlite_proxy_cb (void *data, gint argc, gchar **argv, gchar **col_name)
+{
+	PkTransactionDbProxyItem *item = (PkTransactionDbProxyItem *) data;
+	gint i;
+
+	g_return_val_if_fail (item != NULL, 0);
+
+	for (i=0; i<argc; i++) {
+		if (egg_strequal (col_name[i], "proxy_http")) {
+			item->proxy_http = g_strdup (argv[i]);
+		} else if (egg_strequal (col_name[i], "proxy_ftp")) {
+			item->proxy_ftp = g_strdup (argv[i]);
+		} else {
+			egg_warning ("%s = %s\n", col_name[i], argv[i]);
+		}
+	}
+	return 0;
+}
+
+/**
+ * pk_transaction_db_proxy_item_free:
+ **/
+static void
+pk_transaction_db_proxy_item_free (PkTransactionDbProxyItem *item)
+{
+	if (item == NULL)
+		return;
+	g_free (item->proxy_http);
+	g_free (item->proxy_ftp);
+	g_free (item);
+}
+
+/**
+ * pk_transaction_db_get_proxy:
+ * @tdb: the #PkTransactionDb instance
+ * @uid: the user ID of the user
+ * @session: the ConsoleKit session
+ * @proxy_http: the HTTP proxy
+ * @proxy_ftp: the FTP proxy
+ *
+ * Retrieves the proxy information from the database.
+ *
+ * Return value: %TRUE for success
+ **/
+gboolean
+pk_transaction_db_get_proxy (PkTransactionDb *tdb, guint uid, const gchar *session,
+			     gchar **proxy_http, gchar **proxy_ftp)
+{
+	gchar *error_msg = NULL;
+	gchar *statement;
+	gboolean ret = FALSE;
+	gint rc;
+	PkTransactionDbProxyItem *item;
+
+	g_return_val_if_fail (PK_IS_TRANSACTION_DB (tdb), FALSE);
+	g_return_val_if_fail (uid != G_MAXUINT, FALSE);
+	g_return_val_if_fail (proxy_http != NULL, FALSE);
+	g_return_val_if_fail (proxy_ftp != NULL, FALSE);
+
+	/* get existing data */
+	item = g_new0 (PkTransactionDbProxyItem, 1);
+	statement = g_strdup_printf ("SELECT proxy_http, proxy_ftp FROM proxy WHERE uid = '%i' AND session = '%s' LIMIT 1",
+				     uid, session);
+	rc = sqlite3_exec (tdb->priv->db, statement, pk_transaction_sqlite_proxy_cb, item, &error_msg);
+	if (rc != SQLITE_OK) {
+		egg_warning ("SQL error: %s\n", error_msg);
+		sqlite3_free (error_msg);
+		goto out;
+	}
+
+	/* copy data */
+	*proxy_http = g_strdup (item->proxy_http);
+	*proxy_ftp = g_strdup (item->proxy_ftp);
+
+	/* success, even if we got no data */
+	ret = TRUE;
+out:
+	pk_transaction_db_proxy_item_free (item);
+	g_free (statement);
+	return ret;
+}
+
+/**
+ * pk_transaction_db_set_proxy:
+ * @tdb: the #PkTransactionDb instance
+ * @uid: the user ID of the user
+ * @session: the ConsoleKit session
+ * @proxy_http: the HTTP proxy
+ * @proxy_ftp: the FTP proxy
+ *
+ * Saves the proxy information to the database.
+ *
+ * Return value: %TRUE for success
+ **/
+gboolean
+pk_transaction_db_set_proxy (PkTransactionDb *tdb, guint uid, const gchar *session,
+			     const gchar *proxy_http, const gchar *proxy_ftp)
+{
+	gchar *error_msg = NULL;
+	gchar *statement = NULL;
+	gchar *timespec = NULL;
+	gchar *proxy_http_tmp = NULL;
+	gchar *proxy_ftp_tmp = NULL;
+	gboolean ret = FALSE;
+	gint rc;
+
+	g_return_val_if_fail (PK_IS_TRANSACTION_DB (tdb), FALSE);
+	g_return_val_if_fail (uid != G_MAXUINT, FALSE);
+
+	/* check for previous entries */
+	ret = pk_transaction_db_get_proxy (tdb, uid, session, &proxy_http_tmp, &proxy_ftp_tmp);
+	if (!ret) {
+		egg_warning ("failed to get previous proxies");
+		goto out;
+	}
+
+	/* any data */
+	if (proxy_http_tmp != NULL || proxy_ftp_tmp != NULL) {
+		statement = g_strdup_printf ("UPDATE proxy SET proxy_http = '%s', proxy_ftp = '%s' WHERE uid = '%i' AND session = '%s'",
+					     proxy_http, proxy_ftp, uid, session);
+		egg_debug ("updated proxy for uid:%i and session:%s", uid, session);
+		rc = sqlite3_exec (tdb->priv->db, statement, NULL, NULL, &error_msg);
+		if (rc != SQLITE_OK) {
+			egg_warning ("SQL error: %s", error_msg);
+			sqlite3_free (error_msg);
+			goto out;
+		}
+		goto out;
+	}
+
+	/* insert new entry */
+	timespec = pk_iso8601_present ();
+	statement = g_strdup_printf ("INSERT INTO proxy (created, uid, session, proxy_http, proxy_ftp) VALUES ('%s', '%i', '%s', '%s', '%s')",
+				     timespec, uid, session, proxy_http, proxy_ftp);
+	egg_debug ("set proxy for uid:%i and session:%s", uid, session);
+	rc = sqlite3_exec (tdb->priv->db, statement, NULL, NULL, &error_msg);
+	if (rc != SQLITE_OK) {
+		egg_warning ("SQL error: %s", error_msg);
+		sqlite3_free (error_msg);
+		goto out;
+	}
+
+	ret = TRUE;
+out:
+	g_free (timespec);
+	g_free (statement);
+	g_free (proxy_http_tmp);
+	g_free (proxy_ftp_tmp);
+	return ret;
+}
+
 /**
  * pk_transaction_db_class_init:
  * @klass: The PkTransactionDbClass
@@ -707,6 +867,14 @@ pk_transaction_db_init (PkTransactionDb *tdb)
 		}
 		egg_debug ("job count is now at %i", tdb->priv->job_count);
 	}
+
+	/* session proxy saving (since 0.5.1) */
+	rc = sqlite3_exec (tdb->priv->db, "SELECT * FROM proxy LIMIT 1", NULL, NULL, &error_msg);
+	if (rc != SQLITE_OK) {
+		egg_debug ("adding table proxy: %s", error_msg);
+		statement = "CREATE TABLE proxy (created TEXT, proxy_http TEXT, proxy_ftp TEXT, uid INTEGER, session TEXT);";
+		sqlite3_exec (tdb->priv->db, statement, NULL, NULL, NULL);
+	}
 }
 
 /**
@@ -761,6 +929,8 @@ pk_transaction_db_test (EggTest *test)
 	gchar *tid;
 	gboolean ret;
 	guint ms;
+	gchar *proxy_http = NULL;
+	gchar *proxy_ftp = NULL;
 
 	if (!egg_test_start (test, "PkTransactionDb"))
 		return;
@@ -845,6 +1015,45 @@ pk_transaction_db_test (EggTest *test)
 	else
 		egg_test_failed (test, "failed to get correct time, %i", value);
 
+	/************************************************************
+	 ****************          PROXIES         ******************
+	 ************************************************************/
+	egg_test_title (test, "can we set the proxies");
+	ret = pk_transaction_db_set_proxy (db, 500, "session1", "127.0.0.1:80", "127.0.0.1:21");
+	egg_test_assert (test, ret);
+
+	/************************************************************/
+	egg_test_title (test, "can we set the proxies (overwrite)");
+	ret = pk_transaction_db_set_proxy (db, 500, "session1", "127.0.0.1:8000", "127.0.0.1:21");
+	egg_test_assert (test, ret);
+
+	/************************************************************/
+	egg_test_title (test, "can we get the proxies (non-existant user)");
+	ret = pk_transaction_db_get_proxy (db, 501, "session1", &proxy_http, &proxy_ftp);
+	if (proxy_http == NULL && proxy_ftp == NULL)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct proxies, %s and %s", proxy_http, proxy_ftp);
+
+	/************************************************************/
+	egg_test_title (test, "can we get the proxies (non-existant session)");
+	ret = pk_transaction_db_get_proxy (db, 500, "session2", &proxy_http, &proxy_ftp);
+	if (proxy_http == NULL && proxy_ftp == NULL)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct proxies, %s and %s", proxy_http, proxy_ftp);
+
+	/************************************************************/
+	egg_test_title (test, "can we get the proxies (match)");
+	ret = pk_transaction_db_get_proxy (db, 500, "session1", &proxy_http, &proxy_ftp);
+	if (g_strcmp0 (proxy_http, "127.0.0.1:8000") == 0 &&
+	    g_strcmp0 (proxy_ftp, "127.0.0.1:21") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct proxies, %s and %s", proxy_http, proxy_ftp);
+
+	g_free (proxy_http);
+	g_free (proxy_ftp);
 	g_object_unref (db);
 	egg_test_end (test);
 }
diff --git a/src/pk-transaction-db.h b/src/pk-transaction-db.h
index 8dfdbb8..5f47cc7 100644
--- a/src/pk-transaction-db.h
+++ b/src/pk-transaction-db.h
@@ -77,6 +77,16 @@ guint		 pk_transaction_db_action_time_since	(PkTransactionDb	*tdb,
 							 PkRoleEnum		 role);
 gchar		*pk_transaction_db_generate_id		(PkTransactionDb	*tdb)
 							 G_GNUC_WARN_UNUSED_RESULT;
+gboolean	 pk_transaction_db_get_proxy		(PkTransactionDb	*tdb,
+							 guint			 uid,
+							 const gchar		*session,
+							 gchar			**proxy_http,
+							 gchar			**proxy_ftp);
+gboolean	 pk_transaction_db_set_proxy		(PkTransactionDb	*tdb,
+							 guint			 uid,
+							 const gchar		*session,
+							 const gchar		*proxy_http,
+							 const gchar		*proxy_ftp);
 
 G_END_DECLS
 
commit 1b4de86b02d60a19332e9f11725c7ced8ced75d5
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jul 17 10:06:03 2009 +0100

    Fix up the self test with the recent PkTransactionList change

diff --git a/src/pk-transaction-list.c b/src/pk-transaction-list.c
index 7aee7c8..e9975d0 100644
--- a/src/pk-transaction-list.c
+++ b/src/pk-transaction-list.c
@@ -893,7 +893,7 @@ pk_transaction_list_test_get_item (PkTransactionList *tlist)
 	tid = pk_transaction_db_generate_id (db);
 
 	/* create PkTransaction instance */
-	pk_transaction_list_create (tlist, tid, ":0");
+	pk_transaction_list_create (tlist, tid, ":0", NULL);
 	item = pk_transaction_list_get_from_tid (tlist, tid);
 	g_free (tid);
 
@@ -948,7 +948,7 @@ pk_transaction_list_test (EggTest *test)
 
 	/************************************************************/
 	egg_test_title (test, "create a transaction object");
-	ret = pk_transaction_list_create (tlist, tid, ":0");
+	ret = pk_transaction_list_create (tlist, tid, ":0", NULL);
 	if (ret)
 		egg_test_success (test, "created transaction %s", tid);
 	else
@@ -992,7 +992,7 @@ pk_transaction_list_test (EggTest *test)
 
 	/************************************************************/
 	egg_test_title (test, "add again the same tid (should fail)");
-	ret = pk_transaction_list_create (tlist, tid, ":0");
+	ret = pk_transaction_list_create (tlist, tid, ":0", NULL);
 	if (!ret)
 		egg_test_success (test, NULL);
 	else
@@ -1020,7 +1020,7 @@ pk_transaction_list_test (EggTest *test)
 
 	/************************************************************/
 	egg_test_title (test, "create another item");
-	ret = pk_transaction_list_create (tlist, tid, ":0");
+	ret = pk_transaction_list_create (tlist, tid, ":0", NULL);
 	if (ret)
 		egg_test_success (test, "created transaction %s", tid);
 	else
commit 3e5c4f2576aa3b536545f2292c682146ac5fabc2
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jul 17 10:00:13 2009 +0100

    Check the length of the proxy is less than 1024 bytes before saving it

diff --git a/src/pk-engine.c b/src/pk-engine.c
index d5ab3ef..b83030c 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -59,6 +59,7 @@
 #include "pk-notify.h"
 #include "pk-file-monitor.h"
 #include "pk-conf.h"
+#include "pk-dbus.h"
 
 static void     pk_engine_finalize	(GObject       *object);
 
@@ -77,6 +78,7 @@ struct PkEnginePrivate
 	PkNetwork		*network;
 	PkNotify		*notify;
 	PkConf			*conf;
+	PkDbus			*dbus;
 	PkFileMonitor		*file_monitor_conf;
 	PkFileMonitor		*file_monitor_binary;
 	PkBitfield		 actions;
@@ -624,14 +626,31 @@ pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *pro
 	gchar *sender = NULL;
 	PolkitSubject *subject;
 	PolkitDetails *details;
+	GError *error = NULL;
+	guint len;
 #else
 	gboolean ret;
-	GError *error = NULL;
 #endif
 	g_return_if_fail (PK_IS_ENGINE (engine));
 
 	egg_debug ("SetProxy method called: %s, %s", proxy_http, proxy_ftp);
 
+	/* check length of http */
+	len = egg_strlen (proxy_http, 1024);
+	if (len == 1024) {
+		error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_PROXY, "%s", "http proxy was too long");
+		dbus_g_method_return_error (context, error);
+		return;
+	}
+
+	/* check length of ftp */
+	len = egg_strlen (proxy_ftp, 1024);
+	if (len == 1024) {
+		error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_PROXY, "%s", "ftp proxy was too long");
+		dbus_g_method_return_error (context, error);
+		return;
+	}
+
 	/* save these so we can set them after the auth success */
 	egg_debug ("potentially changing http proxy from %s to %s", engine->priv->proxy_http, proxy_http);
 	egg_debug ("potentially changing ftp proxy from %s to %s", engine->priv->proxy_ftp, proxy_ftp);
@@ -883,6 +902,9 @@ pk_engine_init (PkEngine *engine)
 	/* we save a cache of the latest update lists sowe can do cached responses */
 	engine->priv->cache = pk_cache_new ();
 
+	/* we need the uid and the session for the proxy setting mechanism */
+	engine->priv->dbus = pk_dbus_new ();
+
 	/* we need to be able to clear this */
 	engine->priv->timeout_priority_id = 0;
 	engine->priv->timeout_normal_id = 0;
@@ -986,6 +1008,7 @@ pk_engine_finalize (GObject *object)
 	g_object_unref (engine->priv->backend);
 	g_object_unref (engine->priv->cache);
 	g_object_unref (engine->priv->conf);
+	g_object_unref (engine->priv->dbus);
 	g_free (engine->priv->mime_types);
 	g_free (engine->priv->proxy_http);
 	g_free (engine->priv->proxy_ftp);
commit 3006f391dc311447b68d267f5d315407618dd55e
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jul 17 09:59:04 2009 +0100

    Add the ConsoleKit functionality into PkDbus

diff --git a/src/pk-dbus.c b/src/pk-dbus.c
index 2a0f519..0605b90 100644
--- a/src/pk-dbus.c
+++ b/src/pk-dbus.c
@@ -37,6 +37,7 @@ struct PkDbusPrivate
 {
 	DBusGConnection		*connection;
 	DBusGProxy		*proxy_pid;
+	DBusGProxy		*proxy_session;
 };
 
 static gpointer pk_dbus_object = NULL;
@@ -95,7 +96,8 @@ pk_dbus_get_pid (PkDbus *dbus, const gchar *sender)
 	g_return_val_if_fail (sender != NULL, G_MAXUINT);
 
 	/* get pid from DBus (quite slow) */
-	ret = dbus_g_proxy_call (dbus->priv->proxy_pid, "GetConnectionUnixProcessID", &error,
+	ret = dbus_g_proxy_call (dbus->priv->proxy_pid,
+				 "GetConnectionUnixProcessID", &error,
 				 G_TYPE_STRING, sender,
 				 G_TYPE_INVALID,
 				 G_TYPE_UINT, &pid,
@@ -161,8 +163,36 @@ out:
 gchar *
 pk_dbus_get_session (PkDbus *dbus, const gchar *sender)
 {
+	gboolean ret;
+	gchar *session = NULL;
+	GError *error = NULL;
+	guint pid;
+
 	g_return_val_if_fail (PK_IS_DBUS (dbus), NULL);
-	return NULL;
+	g_return_val_if_fail (sender != NULL, NULL);
+
+	/* get pid */
+	pid = pk_dbus_get_pid (dbus, sender);
+	if (pid == G_MAXUINT) {
+		egg_warning ("failed to get PID");
+		goto out;
+	}
+
+	/* get session from ConsoleKit (quite slow) */
+	ret = dbus_g_proxy_call (dbus->priv->proxy_session,
+				 "GetSessionForUnixProcess", &error,
+				 G_TYPE_UINT, pid,
+				 G_TYPE_INVALID,
+				 DBUS_TYPE_G_OBJECT_PATH, &session,
+				 G_TYPE_INVALID);
+	if (!ret) {
+		egg_warning ("failed to get session for %i: %s", pid, error->message);
+		g_error_free (error);
+		goto out;
+	}
+
+out:
+	return session;
 }
 
 /**
@@ -178,6 +208,7 @@ pk_dbus_finalize (GObject *object)
 	dbus = PK_DBUS (object);
 
 	g_object_unref (dbus->priv->proxy_pid);
+	g_object_unref (dbus->priv->proxy_session);
 
 	G_OBJECT_CLASS (pk_dbus_parent_class)->finalize (object);
 }
@@ -207,16 +238,30 @@ pk_dbus_init (PkDbus *dbus)
 	GError *error = NULL;
 	dbus->priv = PK_DBUS_GET_PRIVATE (dbus);
 
-	/* connect to DBus so we can get the pid */
+	/* use the bus to get the uid */
 	dbus->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL);
-	dbus->priv->proxy_pid = dbus_g_proxy_new_for_name_owner (dbus->priv->connection,
-								   "org.freedesktop.DBus",
-								   "/org/freedesktop/DBus/Bus",
-								   "org.freedesktop.DBus", &error);
+
+	/* connect to DBus so we can get the pid */
+	dbus->priv->proxy_pid =
+		dbus_g_proxy_new_for_name_owner (dbus->priv->connection,
+						 "org.freedesktop.DBus",
+						 "/org/freedesktop/DBus/Bus",
+						 "org.freedesktop.DBus", &error);
 	if (dbus->priv->proxy_pid == NULL) {
 		egg_warning ("cannot connect to DBus: %s", error->message);
 		g_error_free (error);
 	}
+
+	/* use ConsoleKit to get the session */
+	dbus->priv->proxy_session =
+		dbus_g_proxy_new_for_name_owner (dbus->priv->connection,
+						 "org.freedesktop.ConsoleKit",
+						 "/org/freedesktop/ConsoleKit/Manager",
+						 "org.freedesktop.ConsoleKit.Manager", &error);
+	if (dbus->priv->proxy_session == NULL) {
+		egg_warning ("cannot connect to DBus: %s", error->message);
+		g_error_free (error);
+	}
 }
 
 /**
commit 7e82c65023f3da9e649218cd587b497645d0ef39
Author: Mounir Lamouri (volkmar) <mounir.lamouri at gmail.com>
Date:   Fri Jul 17 01:02:27 2009 +0200

    portage: get-udpates managed multiple updates for the same package and can get security ones from them

diff --git a/backends/portage/portageBackend.py b/backends/portage/portageBackend.py
index d297fc5..8db8a77 100755
--- a/backends/portage/portageBackend.py
+++ b/backends/portage/portageBackend.py
@@ -58,6 +58,7 @@ from itertools import izip
 # manage slots
 # remove percentage(None) if percentage is used
 # change how newest is working ?
+# change has_key to foo in dict
 
 # Map Gentoo categories to the PackageKit group name space
 CATEGORY_GROUP_MAP = {
@@ -323,7 +324,15 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
 
         return db.getcontents().keys()
 
-    def get_newer_cpv(self, cpv_list, installed):
+    def cmp_cpv(self, cpv1, cpv2):
+        '''
+        returns 1 if cpv1 > cpv2
+        returns 0 if cpv1 = cpv2
+        returns -1 if cpv1 < cpv2
+        '''
+        return portage.pkgcmp(portage.pkgsplit(cpv1), portage.pkgsplit(cpv2))
+
+    def get_newest_cpv(self, cpv_list, installed):
         newer = ""
 
         # get the first cpv following the installed rule
@@ -337,8 +346,7 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
 
         for cpv in cpv_list:
             if self.is_installed(cpv) == installed:
-                if portage.pkgcmp(portage.pkgsplit(cpv), \
-                        portage.pkgsplit(newer)) == 1:
+                if self.cmp_cpv(cpv, never) == 1:
                     newer = cpv
 
         return newer
@@ -354,6 +362,18 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
         else:
             return aux_get(cpv, keys)
 
+    def get_cpv_slotted(self, cpv_list):
+        cpv_dict = {}
+
+        for cpv in cpv_list:
+            slot = self.get_metadata(cpv, ["SLOT"])[0]
+            if not cpv_dict.has_key(slot):
+                cpv_dict[slot] = [cpv]
+            else:
+                cpv_dict[slot].append(cpv)
+
+        return cpv_dict
+
     def filter_free(self, cpv_list, fltlist):
         if len(cpv_list) == 0:
             return cpv_list
@@ -392,28 +412,22 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
             # we have one package per slot, so it's the newest
             return cpv_list
 
-        cpv_dict = {}
-
-        for cpv in cpv_list:
-            slot = self.get_metadata(cpv, ["SLOT"])[0]
-            if not cpv_dict.has_key(slot):
-                cpv_dict[slot] = [cpv]
-            else:
-                cpv_dict[slot].append(cpv)
+        cpv_dict = self.get_cpv_slotted(cpv_list)
 
         # slots are sorted (dict), revert them to have newest slots first
         slots = cpv_dict.keys()
         slots.reverse()
+
         # empty cpv_list, cpv are now in cpv_dict and cpv_list gonna be repop
         cpv_list = []
 
         for k in slots:
             # if not_intalled on, no need to check for newest installed
             if FILTER_NOT_INSTALLED not in fltlist:
-                newest_installed = self.get_newer_cpv(cpv_dict[k], True)
+                newest_installed = self.get_newest_cpv(cpv_dict[k], True)
                 if newest_installed != "":
                     cpv_list.append(newest_installed)
-            newest_available = self.get_newer_cpv(cpv_dict[k], False)
+            newest_available = self.get_newest_cpv(cpv_dict[k], False)
             if newest_available != "":
                 cpv_list.append(newest_available)
 
@@ -864,7 +878,7 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
         # portage prefer not to update _ALL_ packages
         # so we will only list updated packages in world, system or security
         # TODO: downgrade ?
-        # TODO: more than one updates for the same package ?
+        # FIXME: security updates on libs doesn't work
 
         # UPDATE TYPES:
         # - blocked: wait for feedbacks
@@ -875,44 +889,91 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
 
         # FILTERS:
         # - installed: try to update non-installed packages and call me ;)
-        # - free: TODO
-        # - newest: TODO
+        # - free: ok
+        # - newest: ok
 
         self.status(STATUS_INFO)
         self.allow_cancel(True)
         self.percentage(None)
 
-        # best way to get that ?
+        fltlist = filters.split(';')
+
         settings, trees, _ = _emerge.actions.load_emerge_config()
         root_config = trees[self.portage_settings["ROOT"]]["root_config"]
 
-        security_updates = []
-        cp_to_check = []
-        cpv_list = []
-
-        for atom in portage.sets.base.InternalPackageSet(
-                initial_atoms=root_config.setconfig.getSetAtoms("security")):
-            security_updates.append(atom.cpv)
+        update_candidates = []
+        cpv_updates = {}
 
-        # get system and world sets
+        # get system and world packages
         for s in ["system", "world"]:
             set = portage.sets.base.InternalPackageSet(
                     initial_atoms=root_config.setconfig.getSetAtoms(s))
             for atom in set:
-                cp_to_check.append(atom.cp)
-
-        # check if bestmatch is installed
-        for cp in cp_to_check:
-            best_cpv = portage.portdb.xmatch("bestmatch-visible", cp)
-            if not self.vardb.cpv_exists(best_cpv):
-                cpv_list.append(best_cpv)
-
-        # security updates
-        for cpv in security_updates:
-            self.package(cpv, INFO_SECURITY)
-        # regular updates
-        for cpv in cpv_list:
-            self.package(cpv, INFO_NORMAL)
+                update_candidates.append(atom.cp)
+
+        # check if a candidate can be updated
+        for cp in update_candidates:
+            cpv_list_inst = self.vardb.match(cp)
+            cpv_list_avai = portage.portdb.match(cp)
+
+            cpv_dict_inst = self.get_cpv_slotted(cpv_list_inst)
+            cpv_dict_avai = self.get_cpv_slotted(cpv_list_avai)
+
+            dict_entry = {}
+
+            # candidate slots are installed slots
+            slots = cpv_dict_inst.keys()
+            slots.reverse()
+
+            for s in slots:
+                cpv_list_updates = []
+                cpv_inst = cpv_dict_inst[s][0] # only one install per slot
+                cpv_list_avai = cpv_dict_avai[s]
+                cpv_list_avai.reverse()
+
+                for cpv in cpv_list_avai:
+                    if self.cmp_cpv(cpv_inst, cpv) == -1:
+                        cpv_list_updates.append(cpv)
+                    else: # because the list is sorted
+                        break
+
+                # no update for this slot
+                if len(cpv_list_updates) == 0:
+                    break
+
+                cpv_list_updates = self.filter_free(cpv_list_updates, fltlist)
+
+                if len(cpv_list_updates) == 0:
+                    break
+
+                if FILTER_NEWEST in fltlist:
+                    best_cpv = portage.best(cpv_list_updates)
+                    cpv_list_updates = [best_cpv]
+
+                dict_entry[s] = cpv_list_updates
+
+            if len(dict_entry) != 0:
+                cpv_updates[cp] = dict_entry
+
+        # get security updates
+        for atom in portage.sets.base.InternalPackageSet(
+                initial_atoms=root_config.setconfig.getSetAtoms("security")):
+            # send update message and remove atom from cpv_updates
+            if atom.cp in cpv_updates:
+                slot = self.get_metadata(atom.cpv, ["SLOT"])[0]
+                if slot in cpv_updates[atom.cp]:
+                    tmp_cpv_list = cpv_updates[atom.cp][slot][:]
+                    for cpv in tmp_cpv_list:
+                        if self.cmp_cpv(cpv, atom.cpv) >= 0:
+                            # cpv is a security update and removed from list
+                            cpv_updates[atom.cp][slot].remove(cpv)
+                            self.package(cpv, INFO_SECURITY)
+
+        # normal updates
+        for cp in cpv_updates:
+            for slot in cpv_updates[cp]:
+                for cpv in cpv_updates[cp][slot]:
+                    self.package(cpv, INFO_NORMAL)
 
     def install_packages(self, only_trusted, pkgs):
         self.status(STATUS_RUNNING)
commit df624f67049e09e2a6ef4b136e13b3d5aa42b3a2
Merge: 5073c64... 4dc7109...
Author: Mounir Lamouri (volkmar) <mounir.lamouri at gmail.com>
Date:   Fri Jul 17 00:26:35 2009 +0200

    Merge branch 'master' of git+ssh://volkmar@git.packagekit.org/srv/git/PackageKit

commit 5073c64557955cf85ccd7f6e8e154272a8a08ca8
Author: Mounir Lamouri (volkmar) <mounir.lamouri at gmail.com>
Date:   Fri Jul 17 00:26:19 2009 +0200

    portage: update the category/group map

diff --git a/backends/portage/portageBackend.py b/backends/portage/portageBackend.py
index 83e7515..89ab2d5 100755
--- a/backends/portage/portageBackend.py
+++ b/backends/portage/portageBackend.py
@@ -47,7 +47,6 @@ from itertools import izip
 # Package IDs description:
 # CAT/PN;PV;KEYWORD;[REPOSITORY|installed]
 # Last field must be "installed" if installed. Otherwise it's the repo name
-# TODO: KEYWORD ? (arch or ~arch) with update, it will work ?
 #
 # Naming convention:
 # cpv: category package version, the standard representation of what packagekit
@@ -77,7 +76,7 @@ CATEGORY_GROUP_MAP = {
         "app-laptop" : GROUP_OTHER,
         "app-misc" : GROUP_OTHER,
         "app-mobilephone" : GROUP_OTHER,
-        "app-office" : GROUP_OFFICE,
+        "app-office" : GROUP_OFFICE, # DONE
         "app-pda" : GROUP_OTHER,
         "app-portage" : GROUP_OTHER,
         "app-shells" : GROUP_OTHER,
@@ -139,14 +138,13 @@ CATEGORY_GROUP_MAP = {
         "mail-filter" : GROUP_OTHER, # TODO: from there
         "mail-mta" : GROUP_OTHER,
         "media-fonts" : GROUP_FONTS, # DONE (only this one)
-        "media-gfx" : GROUP_OTHER,
+        "media-gfx" : GROUP_GRAPHICS, # DONE
         "media-libs" : GROUP_OTHER,
         "media-plugins" : GROUP_OTHER,
         "media-radio" : GROUP_OTHER,
         "media-sound" : GROUP_OTHER,
         "media-tv" : GROUP_OTHER,
         "media-video" : GROUP_OTHER,
-        "metadata" : GROUP_OTHER,
         "net-analyzer" : GROUP_OTHER,
         "net-dialup" : GROUP_OTHER,
         "net-dns" : GROUP_OTHER,
@@ -168,10 +166,9 @@ CATEGORY_GROUP_MAP = {
         "net-wireless" : GROUP_OTHER,
         "net-zope" : GROUP_OTHER,
         "perl-core" : GROUP_OTHER,
-        "profiles" : GROUP_OTHER,
-        "rox-base" : GROUP_OTHER,
-        "rox-extra" : GROUP_OTHER,
-        "sci-astronomy" : GROUP_SCIENCE, # DONE from there
+        "rox-base" : GROUP_DESKTOP_OTHER, #DONE from there
+        "rox-extra" : GROUP_DESKTOP_OTHER,
+        "sci-astronomy" : GROUP_SCIENCE,
         "sci-biology" : GROUP_SCIENCE,
         "sci-calculators" : GROUP_SCIENCE,
         "sci-chemistry" : GROUP_SCIENCE,
@@ -182,8 +179,8 @@ CATEGORY_GROUP_MAP = {
         "sci-misc" : GROUP_SCIENCE,
         "sci-physics" : GROUP_SCIENCE,
         "sci-visualization" : GROUP_SCIENCE,
-        "sec-policy" : GROUP_OTHER, # TODO: from there
-        "sys-apps" : GROUP_OTHER,
+        "sec-policy" : GROUP_SECURITY,
+        "sys-apps" : GROUP_OTHER,   # TODO: from there
         "sys-auth" : GROUP_OTHER,
         "sys-block" : GROUP_OTHER,
         "sys-boot" : GROUP_OTHER,
@@ -193,7 +190,7 @@ CATEGORY_GROUP_MAP = {
         "sys-fs" : GROUP_OTHER,
         "sys-kernel" : GROUP_OTHER,
         "sys-libs" : GROUP_OTHER,
-        "sys-power" : GROUP_OTHER,
+        "sys-power" : GROUP_POWER_MANAGEMENT, # DONE
         "sys-process" : GROUP_OTHER,
         "virtual" : GROUP_OTHER, # TODO: what to do ?
         "www-apache" : GROUP_OTHER,
commit 5d1dcdec1c8e76dca6e1037eba89567905120c1f
Author: Mounir Lamouri (volkmar) <mounir.lamouri at gmail.com>
Date:   Thu Jul 16 23:58:20 2009 +0200

    portage: trivial: remove deprecated has_keys for in

diff --git a/backends/portage/portageBackend.py b/backends/portage/portageBackend.py
index 4fb91b1..83e7515 100755
--- a/backends/portage/portageBackend.py
+++ b/backends/portage/portageBackend.py
@@ -55,10 +55,7 @@ from itertools import izip
 
 # TODO:
 # ERRORS with messages ?
-# manage slots
 # remove percentage(None) if percentage is used
-# change how newest is working ?
-# change has_key to foo in dict
 
 # Map Gentoo categories to the PackageKit group name space
 CATEGORY_GROUP_MAP = {
@@ -242,7 +239,7 @@ def get_group(cp):
     ''' Return the group of the package
     Argument could be cp or cpv. '''
     category = portage.catsplit(cp)[0]
-    if CATEGORY_GROUP_MAP.has_key(category):
+    if category in CATEGORY_GROUP_MAP:
         return CATEGORY_GROUP_MAP[category]
 
     # TODO: add message ?
@@ -367,7 +364,7 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
 
         for cpv in cpv_list:
             slot = self.get_metadata(cpv, ["SLOT"])[0]
-            if not cpv_dict.has_key(slot):
+            if slot not in cpv_dict:
                 cpv_dict[slot] = [cpv]
             else:
                 cpv_dict[slot].append(cpv)
commit 4dc71095155b443bcde9ce41ad10e9844b4c4984
Author: kristho <kristho at fedoraproject.org>
Date:   Thu Jul 16 21:50:36 2009 +0000

    Sending translation for Danish

diff --git a/po/da.po b/po/da.po
index 82e65e5..df95b2b 100644
--- a/po/da.po
+++ b/po/da.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: packagekit\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-02 19:34+0000\n"
-"PO-Revision-Date: 2009-07-03 16:52+0200\n"
+"POT-Creation-Date: 2009-07-16 19:32+0000\n"
+"PO-Revision-Date: 2009-07-16 22:59+0200\n"
 "Last-Translator: Kris Thomsen <lakristho at gmail.com>\n"
 "Language-Team: Danish <dansk at dansk-gruppen.dk>\n"
 "MIME-Version: 1.0\n"
@@ -207,41 +207,67 @@ msgstr "Systemgenstart kræves af:"
 msgid "Session restart required:"
 msgstr "Sessionsgenstart kræves:"
 
-#. TRANSLATORS: a package requires the application to be restarted
+#. TRANSLATORS: a package requires the system to be restarted due to a security update
 #: ../client/pk-console.c:523
+msgid "System restart (security) required by:"
+msgstr "Systemgenstart (sikkerhed) kræves af:"
+
+#. TRANSLATORS: a package requires the session to be restarted due to a security update
+#: ../client/pk-console.c:526
+msgid "Session restart (security) required:"
+msgstr "Sessionsgenstart (sikkerhed) kræves:"
+
+#. TRANSLATORS: a package requires the application to be restarted
+#: ../client/pk-console.c:529
 msgid "Application restart required by:"
 msgstr "Programgenstart kræves af:"
 
-#. TRANSLATORS: a package needs to restart they system
-#: ../client/pk-console.c:578
+#. TRANSLATORS: a package needs to restart their system
+#: ../client/pk-console.c:584
 msgid "Please restart the computer to complete the update."
 msgstr "Genstart venligst computeren for at fuldføre opdateringen."
 
 #. TRANSLATORS: a package needs to restart the session
-#: ../client/pk-console.c:581
+#: ../client/pk-console.c:587
 msgid "Please logout and login to complete the update."
 msgstr "Log venligst ud og ind igen for at fuldføre opdateringen."
 
 #. TRANSLATORS: a package needs to restart the application
-#: ../client/pk-console.c:584
+#: ../client/pk-console.c:590
 msgid "Please restart the application as it is being used."
 msgstr "Genstart venligst programmet, da det er i brug."
 
+#. TRANSLATORS: a package needs to restart their system (due to security)
+#: ../client/pk-console.c:593
+msgid ""
+"Please restart the computer to complete the update as important security "
+"updates have been installed."
+msgstr "Genstart venligst computeren for at fuldføre opdateringen, eftersom "
+"vigtige sikkerhedsopdateringer er blevet installeret."
+
+#. TRANSLATORS: a package needs to restart the session (due to security)
+#: ../client/pk-console.c:596
+msgid ""
+"Please logout and login to complete the update as important security updates "
+"have been installed."
+msgstr "Log venligst ud og ind igen for at fuldføre opdateringen, eftersom "
+"vigtige sikkerhedsopdateringer er blevet installeret."
+
 #. TRANSLATORS: The package is already installed on the system
-#: ../client/pk-console.c:711
+#: ../client/pk-console.c:723
 #, c-format
 msgid "The package %s is already installed"
 msgstr "Pakken %s er allerede installeret"
 
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:719
+#: ../client/pk-console.c:731
 #, c-format
 msgid "The package %s could not be installed: %s"
 msgstr "Pakken %s kunne ikke installeres: %s"
 
 #. TRANSLATORS: There was a programming error that shouldn't happen. The detailed error follows
-#: ../client/pk-console.c:744 ../client/pk-console.c:767
-#: ../client/pk-console.c:863 ../client/pk-console.c:980
+#: ../client/pk-console.c:756 ../client/pk-console.c:779
+#: ../client/pk-console.c:875 ../client/pk-console.c:992
 #: ../client/pk-tools-common.c:62 ../client/pk-tools-common.c:81
 #: ../client/pk-tools-common.c:89
 #, c-format
@@ -249,254 +275,254 @@ msgid "Internal error: %s"
 msgstr "Intern fejl: %s"
 
 #. TRANSLATORS: There was an error installing the packages. The detailed error follows
-#: ../client/pk-console.c:752 ../client/pk-console.c:1376
+#: ../client/pk-console.c:764 ../client/pk-console.c:1388
 #, c-format
 msgid "This tool could not install the packages: %s"
 msgstr "Dette værktøj kunne ikke installere pakkerne: %s"
 
 #. TRANSLATORS: There was an error installing the files. The detailed error follows
-#: ../client/pk-console.c:775
+#: ../client/pk-console.c:787
 #, c-format
 msgid "This tool could not install the files: %s"
 msgstr "Dette værktøj kunne ikke installere filerne: %s"
 
 #. TRANSLATORS: The package name was not found in the installed list. The detailed error follows
-#: ../client/pk-console.c:831
+#: ../client/pk-console.c:843
 #, c-format
 msgid "This tool could not remove %s: %s"
 msgstr "Dette værktøj kunne ikke fjerne %s: %s"
 
 #. TRANSLATORS: There was an error removing the packages. The detailed error follows
-#: ../client/pk-console.c:854 ../client/pk-console.c:892
-#: ../client/pk-console.c:925
+#: ../client/pk-console.c:866 ../client/pk-console.c:904
+#: ../client/pk-console.c:937
 #, c-format
 msgid "This tool could not remove the packages: %s"
 msgstr "Dette værktøj kunne ikke fjerne pakkerne: %s"
 
 #. TRANSLATORS: When removing, we might have to remove other dependencies
-#: ../client/pk-console.c:904
+#: ../client/pk-console.c:916
 msgid "The following packages have to be removed:"
 msgstr "Følgende pakker er nødt til at blive fjernet:"
 
 #. TRANSLATORS: We are checking if it's okay to remove a list of packages
-#: ../client/pk-console.c:911
+#: ../client/pk-console.c:923
 msgid "Proceed removing additional packages?"
 msgstr "Fortsæt fjernelse af ekstra pakker?"
 
 #. TRANSLATORS: We did not remove any packages
-#: ../client/pk-console.c:916
+#: ../client/pk-console.c:928
 msgid "The package removal was canceled!"
 msgstr "Fjernelsen af pakker blev annulleret!"
 
 #. TRANSLATORS: The package name was not found in any software sources
-#: ../client/pk-console.c:957
+#: ../client/pk-console.c:969
 #, c-format
 msgid "This tool could not download the package %s as it could not be found"
 msgstr "Dette værktøj kunne ikke hente pakken %s fordi den ikke kunne findes"
 
 #. TRANSLATORS: Could not download the packages for some reason. The detailed error follows
-#: ../client/pk-console.c:988
+#: ../client/pk-console.c:1000
 #, c-format
 msgid "This tool could not download the packages: %s"
 msgstr "Dette værktøj kunne ikke hente pakkerne: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:1015 ../client/pk-console.c:1024
+#: ../client/pk-console.c:1027 ../client/pk-console.c:1036
 #, c-format
 msgid "This tool could not update %s: %s"
 msgstr "Dette værktøj kunne ikke opdatere %s: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:1046 ../client/pk-console.c:1054
+#: ../client/pk-console.c:1058 ../client/pk-console.c:1066
 #, c-format
 msgid "This tool could not get the requirements for %s: %s"
 msgstr "Dette værktøj kunne ikke hente kravene for %s: %s"
 
 #. TRANSLATORS: There was an error getting the dependencies for the package. The detailed error follows
-#: ../client/pk-console.c:1076 ../client/pk-console.c:1084
+#: ../client/pk-console.c:1088 ../client/pk-console.c:1096
 #, c-format
 msgid "This tool could not get the dependencies for %s: %s"
 msgstr "Dette værktøj kunne ikke hente afhængighederne for %s: %s"
 
 #. TRANSLATORS: There was an error getting the details about the package. The detailed error follows
-#: ../client/pk-console.c:1106 ../client/pk-console.c:1114
+#: ../client/pk-console.c:1118 ../client/pk-console.c:1126
 #, c-format
 msgid "This tool could not get package details for %s: %s"
 msgstr "Dette værktøj kunne ikke hente pakkedetaljer for %s: %s"
 
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:1136
+#: ../client/pk-console.c:1148
 #, c-format
 msgid "This tool could not find the files for %s: %s"
 msgstr "Dette værktøj kunne ikke finde filerne til %s: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:1144
+#: ../client/pk-console.c:1156
 #, c-format
 msgid "This tool could not get the file list for %s: %s"
 msgstr "Dette værktøj kunne ikke hente fillisten for %s: %s"
 
 #. TRANSLATORS: There was an error getting the list of packages. The filename follows
-#: ../client/pk-console.c:1166
+#: ../client/pk-console.c:1178
 #, c-format
 msgid "File already exists: %s"
 msgstr "Fil findes allerede: %s"
 
 #. TRANSLATORS: follows a list of packages to install
-#: ../client/pk-console.c:1171 ../client/pk-console.c:1227
-#: ../client/pk-console.c:1302
+#: ../client/pk-console.c:1183 ../client/pk-console.c:1239
+#: ../client/pk-console.c:1314
 msgid "Getting package list"
 msgstr "Henter pakkeliste"
 
 #. TRANSLATORS: There was an error getting the list of packages. The detailed error follows
-#: ../client/pk-console.c:1177 ../client/pk-console.c:1233
-#: ../client/pk-console.c:1308
+#: ../client/pk-console.c:1189 ../client/pk-console.c:1245
+#: ../client/pk-console.c:1320
 #, c-format
 msgid "This tool could not get package list: %s"
 msgstr "Dette værktøj kunne ikke hente pakkeliste: %s"
 
 #. TRANSLATORS: There was an error saving the list
-#: ../client/pk-console.c:1188
+#: ../client/pk-console.c:1200
 #, c-format
 msgid "Failed to save to disk"
 msgstr "Kunne ikke gemme på disk"
 
 #. TRANSLATORS: There was an error getting the list. The filename follows
-#: ../client/pk-console.c:1222 ../client/pk-console.c:1297
+#: ../client/pk-console.c:1234 ../client/pk-console.c:1309
 #, c-format
 msgid "File does not exist: %s"
 msgstr "Fil findes ikke: %s"
 
 #. TRANSLATORS: header to a list of packages newly added
-#: ../client/pk-console.c:1254
+#: ../client/pk-console.c:1266
 msgid "Packages to add"
 msgstr "Pakker at tilføje"
 
 #. TRANSLATORS: header to a list of packages removed
-#: ../client/pk-console.c:1262
+#: ../client/pk-console.c:1274
 msgid "Packages to remove"
 msgstr "Pakker at fjerne"
 
 #. TRANSLATORS: We didn't find any differences
-#: ../client/pk-console.c:1330
+#: ../client/pk-console.c:1342
 #, c-format
 msgid "No new packages need to be installed"
 msgstr "Ingen nye pakker behøver at blive installeret"
 
 #. TRANSLATORS: follows a list of packages to install
-#: ../client/pk-console.c:1336
+#: ../client/pk-console.c:1348
 msgid "To install"
 msgstr "At installere"
 
 #. TRANSLATORS: searching takes some time....
-#: ../client/pk-console.c:1348
+#: ../client/pk-console.c:1360
 msgid "Searching for package: "
 msgstr "Søger efter pakke: "
 
 #. TRANSLATORS: package was not found -- this is the end of a string ended in ...
-#: ../client/pk-console.c:1352
+#: ../client/pk-console.c:1364
 msgid "not found."
 msgstr "ikke fundet."
 
 #. TRANSLATORS: We didn't find any packages to install
-#: ../client/pk-console.c:1363
+#: ../client/pk-console.c:1375
 #, c-format
 msgid "No packages can be found to install"
 msgstr "Ingen pakker kunne findes til installation"
 
 #. TRANSLATORS: installing new packages from package list
 #. TRANSLATORS: we are now installing the debuginfo packages we found earlier
-#: ../client/pk-console.c:1369
+#: ../client/pk-console.c:1381
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:868
 #, c-format
 msgid "Installing packages"
 msgstr "Installerer pakker"
 
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:1405
+#: ../client/pk-console.c:1417
 #, c-format
 msgid "This tool could not find the update details for %s: %s"
 msgstr "Dette værktøj kunne ikke finde opdateringsdetaljer for %s: %s"
 
 #. TRANSLATORS: There was an error getting the details about the update for the package. The detailed error follows
-#: ../client/pk-console.c:1413
+#: ../client/pk-console.c:1425
 #, c-format
 msgid "This tool could not get the update details for %s: %s"
 msgstr "Dette værktøj kunne ikke hente opdateringsdetaljer for %s: %s"
 
 #. TRANSLATORS: This was an unhandled error, and we don't have _any_ context
-#: ../client/pk-console.c:1444
+#: ../client/pk-console.c:1456
 msgid "Error:"
 msgstr "Fejl:"
 
 #. TRANSLATORS: This a list of details about the package
-#: ../client/pk-console.c:1458
+#: ../client/pk-console.c:1470
 msgid "Package description"
 msgstr "Pakkebeskrivelse"
 
 #. TRANSLATORS: This a message (like a little note that may be of interest) from the transaction
-#: ../client/pk-console.c:1474
+#: ../client/pk-console.c:1486
 msgid "Message:"
 msgstr "Besked:"
 
 #. TRANSLATORS: This a list files contained in the package
-#: ../client/pk-console.c:1502
+#: ../client/pk-console.c:1514
 msgid "Package files"
 msgstr "Pakkefiler"
 
 #. TRANSLATORS: This where the package has no files
-#: ../client/pk-console.c:1510
+#: ../client/pk-console.c:1522
 msgid "No files"
 msgstr "Ingen filer"
 
 #. TRANSLATORS: This a request for a GPG key signature from the backend, which the client will prompt for later
-#: ../client/pk-console.c:1533
+#: ../client/pk-console.c:1545
 msgid "Repository signature required"
 msgstr "Signatur til pakkearkiv kræves"
 
 #. TRANSLATORS: This a prompt asking the user to import the security key
-#: ../client/pk-console.c:1543
+#: ../client/pk-console.c:1555
 msgid "Do you accept this signature?"
 msgstr "Accepterer du denne signatur?"
 
 #. TRANSLATORS: This is where the user declined the security key
-#: ../client/pk-console.c:1547
+#: ../client/pk-console.c:1559
 msgid "The signature was not accepted."
 msgstr "Signaturen blev ikke accepteret."
 
 #. TRANSLATORS: This a request for a EULA
-#: ../client/pk-console.c:1581
+#: ../client/pk-console.c:1593
 msgid "End user license agreement required"
 msgstr "Slutbruger licensaftale kræves"
 
 #. TRANSLATORS: This a prompt asking the user to agree to the license
-#: ../client/pk-console.c:1588
+#: ../client/pk-console.c:1600
 msgid "Do you agree to this license?"
 msgstr "Accepterer du denne licens?"
 
 #. TRANSLATORS: This is where the user declined the license
-#: ../client/pk-console.c:1592
+#: ../client/pk-console.c:1604
 msgid "The license was refused."
 msgstr "Licensen blev afvist."
 
 #. TRANSLATORS: This is when the daemon crashed, and we are up shit creek without a paddle
-#: ../client/pk-console.c:1621
+#: ../client/pk-console.c:1633
 msgid "The daemon crashed mid-transaction!"
 msgstr "Dæmonen brød sammen under overførslen!"
 
 #. TRANSLATORS: This is the header to the --help menu
-#: ../client/pk-console.c:1674
+#: ../client/pk-console.c:1686
 msgid "PackageKit Console Interface"
 msgstr "PackageKit konsolgrænseflade"
 
 #. these are commands we can use with pkcon
-#: ../client/pk-console.c:1676
+#: ../client/pk-console.c:1688
 msgid "Subcommands:"
 msgstr "Underkommandoer:"
 
 #. TRANSLATORS: command line argument, if we should show debugging information
 #. TRANSLATORS: if we should show debugging data
-#: ../client/pk-console.c:1768 ../client/pk-generate-pack.c:185
+#: ../client/pk-console.c:1780 ../client/pk-generate-pack.c:185
 #: ../client/pk-monitor.c:125
 #: ../contrib/command-not-found/pk-command-not-found.c:521
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:532
@@ -505,148 +531,148 @@ msgid "Show extra debugging information"
 msgstr "Vis ekstra fejlsøgningsinformation"
 
 #. TRANSLATORS: command line argument, just show the version string
-#: ../client/pk-console.c:1771 ../client/pk-monitor.c:127
+#: ../client/pk-console.c:1783 ../client/pk-monitor.c:127
 msgid "Show the program version and exit"
 msgstr "Vis programversionen og afslut"
 
 #. TRANSLATORS: command line argument, use a filter to narrow down results
-#: ../client/pk-console.c:1774
+#: ../client/pk-console.c:1786
 msgid "Set the filter, e.g. installed"
 msgstr "Sæt filteret, f.eks. installeret"
 
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1777
+#: ../client/pk-console.c:1789
 msgid "Exit without waiting for actions to complete"
 msgstr "Afslut uden at vente på at handlingerne færdiggøres"
 
 #. TRANSLATORS: This is when we could not connect to the system bus, and is fatal
-#: ../client/pk-console.c:1804
+#: ../client/pk-console.c:1816
 msgid "This tool could not connect to system DBUS."
 msgstr "Dette værktøj kunne ikke forbinde til system-DBUS."
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1893
+#: ../client/pk-console.c:1905
 msgid "The filter specified was invalid"
 msgstr "Filteret det blev angivet er ugyldigt"
 
 #. TRANSLATORS: a search type can be name, details, file, etc
-#: ../client/pk-console.c:1911
+#: ../client/pk-console.c:1923
 msgid "A search type is required, e.g. name"
 msgstr "En søgetype kræves, f.eks. navn"
 
 #. TRANSLATORS: the user needs to provide a search term
-#: ../client/pk-console.c:1917 ../client/pk-console.c:1925
-#: ../client/pk-console.c:1933 ../client/pk-console.c:1941
+#: ../client/pk-console.c:1929 ../client/pk-console.c:1937
+#: ../client/pk-console.c:1945 ../client/pk-console.c:1953
 msgid "A search term is required"
 msgstr "En søgeterm kræves"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1947
+#: ../client/pk-console.c:1959
 msgid "Invalid search type"
 msgstr "Ugyldig søgetype"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1953
+#: ../client/pk-console.c:1965
 msgid "A package name or filename to install is required"
 msgstr "Et pakkenavn eller filnavn at installere kræves"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1961
+#: ../client/pk-console.c:1973
 msgid "A type, key_id and package_id are required"
 msgstr "En type, nøgle_id og pakke_id kræves"
 
 #. TRANSLATORS: the user did not specify what they wanted to remove
-#: ../client/pk-console.c:1969
+#: ../client/pk-console.c:1981
 msgid "A package name to remove is required"
 msgstr "Et pakkenavn til fjernelse kræves"
 
 #. TRANSLATORS: the user did not specify anything about what to download or where
-#: ../client/pk-console.c:1976
+#: ../client/pk-console.c:1988
 msgid ""
 "A destination directory and then the package names to download are required"
 msgstr "En destinationsmappe og derefter pakkenavnene til hentning kræves"
 
 #. TRANSLATORS: the directory does not exist, so we can't continue
-#: ../client/pk-console.c:1982
+#: ../client/pk-console.c:1994
 msgid "Directory not found"
 msgstr "Mappe ikke fundet"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1989
+#: ../client/pk-console.c:2001
 msgid "A licence identifier (eula-id) is required"
 msgstr "En licensgenkender (eula-id) kræves"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1998
+#: ../client/pk-console.c:2010
 msgid "A transaction identifier (tid) is required"
 msgstr "En overførselsgenkender (tid) kræves"
 
 #. TRANSLATORS: The user did not specify a package name
-#: ../client/pk-console.c:2014
+#: ../client/pk-console.c:2026
 msgid "A package name to resolve is required"
 msgstr "Et pakkenavn til at løse kræves"
 
 #. TRANSLATORS: The user did not specify a repository (software source) name
-#: ../client/pk-console.c:2022 ../client/pk-console.c:2030
+#: ../client/pk-console.c:2034 ../client/pk-console.c:2042
 msgid "A repository name is required"
 msgstr "Et pakkearkivnavn kræves"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:2038
+#: ../client/pk-console.c:2050
 msgid "A repo name, parameter and value are required"
 msgstr "Et pakkearkivnavn, parameter og værdi kræves"
 
 #. TRANSLATORS: The user didn't specify what action to use
-#: ../client/pk-console.c:2051
+#: ../client/pk-console.c:2063
 msgid "An action, e.g. 'update-system' is required"
 msgstr "En handling, f.eks. \"update-system\" kræves"
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:2057
+#: ../client/pk-console.c:2069
 msgid "A correct role is required"
 msgstr "En korrekt rolle kræves"
 
 #. TRANSLATORS: we keep a database updated with the time that an action was last executed
-#: ../client/pk-console.c:2063
+#: ../client/pk-console.c:2075
 msgid "Failed to get the time since this action was last completed"
 msgstr "Kunne ikke hente tid siden denne handling sidst blev gennemført"
 
 #. TRANSLATORS: The user did not provide a package name
 #. TRANSLATORS: This is when the user fails to supply the package name
-#: ../client/pk-console.c:2072 ../client/pk-console.c:2083
-#: ../client/pk-console.c:2091 ../client/pk-console.c:2107
-#: ../client/pk-console.c:2115 ../client/pk-generate-pack.c:241
+#: ../client/pk-console.c:2084 ../client/pk-console.c:2095
+#: ../client/pk-console.c:2103 ../client/pk-console.c:2119
+#: ../client/pk-console.c:2127 ../client/pk-generate-pack.c:241
 msgid "A package name is required"
 msgstr "Et pakkenavn kræves"
 
 #. TRANSLATORS: each package "provides" certain things, e.g. mime(gstreamer-decoder-mp3), the user didn't specify it
-#: ../client/pk-console.c:2099
+#: ../client/pk-console.c:2111
 msgid "A package provide string is required"
 msgstr "En pakke udbydningsstreng kræves"
 
 #. TRANSLATORS: The user didn't specify a filename to create as a list
-#: ../client/pk-console.c:2123
+#: ../client/pk-console.c:2135
 msgid "A list file name to create is required"
 msgstr "Et listefilnavn til at oprette kræves"
 
 #. TRANSLATORS: The user didn't specify a filename to open as a list
-#: ../client/pk-console.c:2132 ../client/pk-console.c:2141
+#: ../client/pk-console.c:2144 ../client/pk-console.c:2153
 msgid "A list file to open is required"
 msgstr "En listefil til at åbne kræves"
 
 #. TRANSLATORS: The user tried to use an unsupported option on the command line
-#: ../client/pk-console.c:2194
+#: ../client/pk-console.c:2206
 #, c-format
 msgid "Option '%s' is not supported"
 msgstr "Indstilling \"%s\" er ikke understøttet"
 
 #. TRANSLATORS: User does not have permission to do this
-#: ../client/pk-console.c:2207
+#: ../client/pk-console.c:2219
 msgid "Incorrect privileges for this operation"
 msgstr "Rettigheder for denne operation er ikke rigtige"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:2210
+#: ../client/pk-console.c:2222
 msgid "Command failed"
 msgstr "Kommando fejlede"
 
@@ -866,56 +892,56 @@ msgid "Please choose a package to install"
 msgstr "Vælg venligst en pakke at installere"
 
 #. TRANSLATORS: when we are getting data from the daemon
-#: ../contrib/browser-plugin/src/contents.cpp:299
+#: ../contrib/browser-plugin/pk-plugin-install.c:433
 msgid "Getting package information..."
 msgstr "Henter information om pakke..."
 
 #. TRANSLATORS: run an applicaiton
-#: ../contrib/browser-plugin/src/contents.cpp:305
+#: ../contrib/browser-plugin/pk-plugin-install.c:439
 #, c-format
 msgid "Run %s"
 msgstr "Kør %s"
 
 #. TRANSLATORS: show the installed version of a package
-#: ../contrib/browser-plugin/src/contents.cpp:311
+#: ../contrib/browser-plugin/pk-plugin-install.c:445
 msgid "Installed version"
 msgstr "Installeret version"
 
 #. TRANSLATORS: run the application now
-#: ../contrib/browser-plugin/src/contents.cpp:319
+#: ../contrib/browser-plugin/pk-plugin-install.c:453
 #, c-format
 msgid "Run version %s now"
 msgstr "Kør version %s nu"
 
 #. TRANSLATORS: run the application now
-#: ../contrib/browser-plugin/src/contents.cpp:325
+#: ../contrib/browser-plugin/pk-plugin-install.c:459
 msgid "Run now"
 msgstr "Kør nu"
 
 #. TRANSLATORS: update to a new version of the package
-#: ../contrib/browser-plugin/src/contents.cpp:331
+#: ../contrib/browser-plugin/pk-plugin-install.c:465
 #, c-format
 msgid "Update to version %s"
 msgstr "Opdatér til version %s"
 
 #. TRANSLATORS: To install a package
-#: ../contrib/browser-plugin/src/contents.cpp:337
+#: ../contrib/browser-plugin/pk-plugin-install.c:471
 #, c-format
 msgid "Install %s now"
 msgstr "Installér %s nu"
 
 #. TRANSLATORS: the version of the package
-#: ../contrib/browser-plugin/src/contents.cpp:340
+#: ../contrib/browser-plugin/pk-plugin-install.c:474
 msgid "Version"
 msgstr "Version"
 
 #. TRANSLATORS: noting found, so can't install
-#: ../contrib/browser-plugin/src/contents.cpp:345
+#: ../contrib/browser-plugin/pk-plugin-install.c:479
 msgid "No packages found for your system"
 msgstr "Ingen pakker fundet til dit system"
 
 #. TRANSLATORS: package is being installed
-#: ../contrib/browser-plugin/src/contents.cpp:350
+#: ../contrib/browser-plugin/pk-plugin-install.c:484
 msgid "Installing..."
 msgstr "Installerer..."
 
@@ -934,8 +960,7 @@ msgstr "Kunne ikke finde pakken %s, eller pakken er allerede installeret: %s"
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:535
 msgid ""
 "Don't actually install any packages, only simulate what would be installed"
-msgstr ""
-"Installér ikke nogen pakker, lad kun som om de ville blive installeret"
+msgstr "Installér ikke nogen pakker, lad kun som om de ville blive installeret"
 
 #. command line argument, do we skip packages that depend on the ones specified
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:538
@@ -1117,26 +1142,32 @@ msgstr "PackageKit pakkeliste"
 msgid "PackageKit Service Pack"
 msgstr "PackageKit-servicepakke"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:1
+#. SECURITY:
+#. - Normal users do not require admin authentication to accept new
+#. licence agreements.
+#. - Change this to 'auth_admin' for environments where users should not
+#. be given the option to make legal decisions.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:7
 msgid "Accept EULA"
 msgstr "Acceptér EULA"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:2
+#: ../policy/org.freedesktop.packagekit.policy.in.h:8
 msgid "Authentication is required to accept a EULA"
 msgstr "Godkendelse kræves for at acceptere en EULA"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:3
+#: ../policy/org.freedesktop.packagekit.policy.in.h:9
 msgid ""
 "Authentication is required to cancel a task that was not started by yourself"
 msgstr ""
 "Godkendelse kræves for at annullere en opgave, der ikke er startet af dig "
 "selv"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:4
+#: ../policy/org.freedesktop.packagekit.policy.in.h:10
 msgid "Authentication is required to change software source parameters"
 msgstr "Godkendelse kræves for at ændre softewarekildeparametre"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:5
+#: ../policy/org.freedesktop.packagekit.policy.in.h:11
 msgid ""
 "Authentication is required to consider a key used for signing packages as "
 "trusted"
@@ -1144,74 +1175,131 @@ msgstr ""
 "Godkendelse kræves for at overveje en nøgle brugt til signering af pakker "
 "som pålidelig"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:6
+#: ../policy/org.freedesktop.packagekit.policy.in.h:12
 msgid "Authentication is required to install a signed package"
 msgstr "Godkendelse kræves for at installere en signeret pakke"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:7
+#: ../policy/org.freedesktop.packagekit.policy.in.h:13
 msgid "Authentication is required to install an untrusted package"
 msgstr "Godkendelse kræves for at installere en upålidelig pakke"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:8
+#: ../policy/org.freedesktop.packagekit.policy.in.h:14
 msgid "Authentication is required to refresh the system sources"
 msgstr "Godkendelse kræves for at opdatere systemkilderne"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:9
+#: ../policy/org.freedesktop.packagekit.policy.in.h:15
 msgid "Authentication is required to remove packages"
 msgstr "Godkendelse kræves for at fjerne pakker"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:10
+#: ../policy/org.freedesktop.packagekit.policy.in.h:16
 msgid "Authentication is required to rollback a transaction"
 msgstr "Godkendelse kræves for at rulle en transaktion tilbage"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:11
+#: ../policy/org.freedesktop.packagekit.policy.in.h:17
 msgid ""
 "Authentication is required to set the network proxy used for downloading "
 "packages"
 msgstr ""
 "Godkendelse kræves for at sætte netværksproxyen brugt til hentning af pakker"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+#: ../policy/org.freedesktop.packagekit.policy.in.h:18
 msgid "Authentication is required to update packages"
 msgstr "Godkendelse kræves for at opdatere pakker"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:13
+#. SECURITY:
+#. - Normal users are allowed to cancel their own task without
+#. authentication, but a different user id needs the admin password
+#. to cancel another users task.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:24
 msgid "Cancel foreign task"
 msgstr "Annullér fremmed opgave"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:14
+#. SECURITY:
+#. - Normal users require admin authentication to enable or disable
+#. software sources as this can be used to enable new updates or
+#. install different versions of software.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:30
 msgid "Change software source parameters"
 msgstr "Ændr softwarekildeparametre"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:15
+#. SECURITY:
+#. - Normal users do not need authentication to install signed packages
+#. from signed repositories, as this cannot exploit a system.
+#. - Paranoid users (or parents!) can change this to 'auth_admin' or
+#. 'auth_admin_keep'.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:37
 msgid "Install signed package"
 msgstr "Installér signeret pakke"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:16
+#. SECURITY:
+#. - Normal users require admin authentication to install untrusted or
+#. unrecognised packages, as allowing users to do this without a
+#. password would be a massive security hole.
+#. - This is not retained as each package should be authenticated.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:44
 msgid "Install untrusted local file"
 msgstr "Installér upålidelig lokal fil"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:17
+#. SECURITY:
+#. - Normal users do not require admin authentication to refresh the
+#. cache, as this doesn't actually install or remove software.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:49
 msgid "Refresh system sources"
 msgstr "Opdatér systemkilder"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:18
+#. SECURITY:
+#. - Normal users require admin authentication to remove packages as
+#. this can make the system unbootable or stop other applications from
+#. working.
+#. - Be sure to close the tool used to remove the packages after the
+#. admin authentication has been obtained, otherwise packages can still
+#. be removed. If this is not possible, change this authentication to
+#. 'auth_admin'.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:59
 msgid "Remove package"
 msgstr "Fjern pakke"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:19
+#. SECURITY:
+#. - Normal users require admin authentication to rollback system state
+#. as this will change a large number of packages, and could expose the
+#. system to previously patched security vulnerabilities.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:65
 msgid "Rollback to a previous transaction"
 msgstr "Rul tilbage til en tidligere overførsel"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:20
+#. SECURITY:
+#. - Normal users do not require admin authentication to set the proxy
+#. used for downloading packages.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:70
 msgid "Set network proxy"
 msgstr "Sæt netværksproxy"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:21
+#. SECURITY:
+#. - Normal users require admin authentication to add signing keys.
+#. - This implies adding an explicit trust, and should not be granted
+#. without a secure authentication.
+#. - This is not kept as each package should be authenticated.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:77
 msgid "Trust a key used for signing packages"
 msgstr "Betro en nøgle brugt til signering af pakker"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:22
+#. SECURITY:
+#. - Normal users do not require admin authentication to update the
+#. system as the packages will be signed, and the action is required
+#. to update the system when unattended.
+#. - Changing this to anything other than 'yes' will break unattended
+#. updates.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:85
 msgid "Update packages"
 msgstr "Opdatér pakker"
 
@@ -1286,7 +1374,8 @@ msgstr "Kunne ikke starte:"
 
 #: ../src/pk-polkit-action-lookup.c:143
 msgid "To install debugging packages, extra sources need to be enabled"
-msgstr "For at installere fejlsøgningspakker skal ekstra pakkearkiver aktiveres"
+msgstr ""
+"For at installere fejlsøgningspakker skal ekstra pakkearkiver aktiveres"
 
 #. TRANSLATORS: is not GPG signed
 #: ../src/pk-polkit-action-lookup.c:156 ../src/pk-polkit-action-lookup.c:175
commit 14c08cd229466169387c6b1aa0eff7bb4fa50f63
Author: Mounir Lamouri (volkmar) <mounir.lamouri at gmail.com>
Date:   Thu Jul 16 23:48:36 2009 +0200

    portage: get-updates with downgrade management and better security updates

diff --git a/backends/portage/portageBackend.py b/backends/portage/portageBackend.py
index 8db8a77..4fb91b1 100755
--- a/backends/portage/portageBackend.py
+++ b/backends/portage/portageBackend.py
@@ -875,10 +875,9 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
 
     def get_updates(self, filters):
         # NOTES:
-        # portage prefer not to update _ALL_ packages
-        # so we will only list updated packages in world, system or security
-        # TODO: downgrade ?
-        # FIXME: security updates on libs doesn't work
+        # because of a lot of things related to Gentoo,
+        # only world and system packages are can be listed as updates
+        # _except_ for security updates
 
         # UPDATE TYPES:
         # - blocked: wait for feedbacks
@@ -903,6 +902,7 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
 
         update_candidates = []
         cpv_updates = {}
+        cpv_downgra = {}
 
         # get system and world packages
         for s in ["system", "world"]:
@@ -919,7 +919,8 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
             cpv_dict_inst = self.get_cpv_slotted(cpv_list_inst)
             cpv_dict_avai = self.get_cpv_slotted(cpv_list_avai)
 
-            dict_entry = {}
+            dict_upda = {}
+            dict_down = {}
 
             # candidate slots are installed slots
             slots = cpv_dict_inst.keys()
@@ -928,10 +929,15 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
             for s in slots:
                 cpv_list_updates = []
                 cpv_inst = cpv_dict_inst[s][0] # only one install per slot
-                cpv_list_avai = cpv_dict_avai[s]
-                cpv_list_avai.reverse()
 
-                for cpv in cpv_list_avai:
+                # the slot can be outdated (not in the tree)
+                if s not in cpv_dict_avai:
+                    break
+
+                tmp_list_avai = cpv_dict_avai[s]
+                tmp_list_avai.reverse()
+
+                for cpv in tmp_list_avai:
                     if self.cmp_cpv(cpv_inst, cpv) == -1:
                         cpv_list_updates.append(cpv)
                     else: # because the list is sorted
@@ -939,7 +945,14 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
 
                 # no update for this slot
                 if len(cpv_list_updates) == 0:
-                    break
+                    if [cpv_inst] == portage.portdb.visible([cpv_inst]):
+                        break # really no update
+                    else:
+                        # that's actually a downgrade or even worst
+                        if len(tmp_list_avai) == 0:
+                            break # this package is not known in the tree...
+                        else:
+                            dict_down[s] = [tmp_list_avai.pop()]
 
                 cpv_list_updates = self.filter_free(cpv_list_updates, fltlist)
 
@@ -950,10 +963,12 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
                     best_cpv = portage.best(cpv_list_updates)
                     cpv_list_updates = [best_cpv]
 
-                dict_entry[s] = cpv_list_updates
+                dict_upda[s] = cpv_list_updates
 
-            if len(dict_entry) != 0:
-                cpv_updates[cp] = dict_entry
+            if len(dict_upda) != 0:
+                cpv_updates[cp] = dict_upda
+            if len(dict_down) != 0:
+                cpv_downgra[cp] = dict_down
 
         # get security updates
         for atom in portage.sets.base.InternalPackageSet(
@@ -968,6 +983,14 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
                             # cpv is a security update and removed from list
                             cpv_updates[atom.cp][slot].remove(cpv)
                             self.package(cpv, INFO_SECURITY)
+            else: # update also non-world and non-system packages if security
+                self.package(atom.cpv, INFO_SECURITY)
+
+        # downgrades
+        for cp in cpv_downgra:
+            for slot in cpv_downgra[cp]:
+                for cpv in cpv_downgra[cp][slot]:
+                    self.package(cpv, INFO_IMPORTANT)
 
         # normal updates
         for cp in cpv_updates:
commit 3679c0d28e37ab70eed4f6ab15488751b6796585
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jul 16 16:55:02 2009 +0100

    Correct the logic of the cancelled check in the recently added code

diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 9b7a709..2fad8fd 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1595,7 +1595,7 @@ pk_transaction_action_obtain_authorization_finished_cb (GObject *source_object,
 
 	/* failed because the request was cancelled */
 	ret = g_cancellable_is_cancelled (transaction->priv->cancellable);
-	if (!ret) {
+	if (ret) {
 		/* emit an ::StatusChanged, ::ErrorCode() and then ::Finished() */
 		pk_transaction_status_changed_emit (transaction, PK_STATUS_ENUM_FINISHED);
 		pk_transaction_error_code_emit (transaction, PK_ERROR_ENUM_NOT_AUTHORIZED, "The authentication was cancelled due to a timeout.");
commit c3b860b9db0cd6af4427c2369f66577a9525d1aa
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jul 16 16:53:33 2009 +0100

    Don't try to free an error that does not exist

diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index a55874d..9b7a709 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1600,7 +1600,6 @@ pk_transaction_action_obtain_authorization_finished_cb (GObject *source_object,
 		pk_transaction_status_changed_emit (transaction, PK_STATUS_ENUM_FINISHED);
 		pk_transaction_error_code_emit (transaction, PK_ERROR_ENUM_NOT_AUTHORIZED, "The authentication was cancelled due to a timeout.");
 		pk_transaction_finished_emit (transaction, PK_EXIT_ENUM_FAILED, 0);
-		g_error_free (error);
 		goto out;
 	}
 
commit 240577ad50357ccbaf465120d4b8e472952cd574
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jul 16 16:53:02 2009 +0100

    Factor out the DBus stuff from PkTransaction into a shared singleton

diff --git a/src/Makefile.am b/src/Makefile.am
index 78e7b00..d94d6de 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -54,6 +54,8 @@ shared_SOURCES =					\
 	pk-marshal.h					\
 	pk-lsof.c					\
 	pk-lsof.h					\
+	pk-dbus.c					\
+	pk-dbus.h					\
 	pk-transaction.c				\
 	pk-transaction.h				\
 	pk-transaction-extra.c				\
diff --git a/src/pk-dbus.c b/src/pk-dbus.c
new file mode 100644
index 0000000..2a0f519
--- /dev/null
+++ b/src/pk-dbus.c
@@ -0,0 +1,262 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <glib.h>
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-lowlevel.h>
+
+#include "pk-dbus.h"
+
+#include "egg-debug.h"
+
+#define PK_DBUS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_DBUS, PkDbusPrivate))
+
+struct PkDbusPrivate
+{
+	DBusGConnection		*connection;
+	DBusGProxy		*proxy_pid;
+};
+
+static gpointer pk_dbus_object = NULL;
+
+G_DEFINE_TYPE (PkDbus, pk_dbus, G_TYPE_OBJECT)
+
+/**
+ * pk_dbus_get_uid:
+ * @dbus: the #PkDbus instance
+ * @sender: the sender, usually got from dbus_g_method_get_dbus()
+ *
+ * Gets the process UID.
+ *
+ * Return value: the UID, or %G_MAXUINT if it could not be obtained
+ **/
+guint
+pk_dbus_get_uid (PkDbus *dbus, const gchar *sender)
+{
+	guint uid;
+	DBusError error;
+	DBusConnection *con;
+
+	g_return_val_if_fail (PK_IS_DBUS (dbus), G_MAXUINT);
+	g_return_val_if_fail (sender != NULL, G_MAXUINT);
+
+	dbus_error_init (&error);
+	con = dbus_g_connection_get_connection (dbus->priv->connection);
+	uid = dbus_bus_get_unix_user (con, sender, &error);
+	if (dbus_error_is_set (&error)) {
+		egg_warning ("Could not get uid for connection: %s %s", error.name, error.message);
+		uid = G_MAXUINT;
+		goto out;
+	}
+out:
+	return uid;
+}
+
+/**
+ * pk_dbus_get_pid:
+ * @dbus: the #PkDbus instance
+ * @sender: the sender, usually got from dbus_g_method_get_dbus()
+ *
+ * Gets the process ID.
+ *
+ * Return value: the PID, or %G_MAXUINT if it could not be obtained
+ **/
+guint
+pk_dbus_get_pid (PkDbus *dbus, const gchar *sender)
+{
+	guint pid = G_MAXUINT;
+	gboolean ret;
+	GError *error = NULL;
+
+	g_return_val_if_fail (PK_IS_DBUS (dbus), G_MAXUINT);
+	g_return_val_if_fail (dbus->priv->proxy_pid != NULL, G_MAXUINT);
+	g_return_val_if_fail (sender != NULL, G_MAXUINT);
+
+	/* get pid from DBus (quite slow) */
+	ret = dbus_g_proxy_call (dbus->priv->proxy_pid, "GetConnectionUnixProcessID", &error,
+				 G_TYPE_STRING, sender,
+				 G_TYPE_INVALID,
+				 G_TYPE_UINT, &pid,
+				 G_TYPE_INVALID);
+	if (!ret) {
+		egg_warning ("failed to get pid: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+out:
+	return pid;
+}
+
+/**
+ * pk_dbus_get_cmdline:
+ * @dbus: the #PkDbus instance
+ * @sender: the sender, usually got from dbus_g_method_get_dbus()
+ *
+ * Gets the command line for the ID.
+ *
+ * Return value: the cmdline, or %NULL if it could not be obtained
+ **/
+gchar *
+pk_dbus_get_cmdline (PkDbus *dbus, const gchar *sender)
+{
+	gboolean ret;
+	gchar *filename = NULL;
+	gchar *cmdline = NULL;
+	GError *error = NULL;
+	guint pid;
+
+	g_return_val_if_fail (PK_IS_DBUS (dbus), NULL);
+	g_return_val_if_fail (sender != NULL, NULL);
+
+	/* get pid */
+	pid = pk_dbus_get_pid (dbus, sender);
+	if (pid == G_MAXUINT) {
+		egg_warning ("failed to get PID");
+		goto out;
+	}
+
+	/* get command line from proc */
+	filename = g_strdup_printf ("/proc/%i/cmdline", pid);
+	ret = g_file_get_contents (filename, &cmdline, NULL, &error);
+	if (!ret) {
+		egg_warning ("failed to get cmdline: %s", error->message);
+		g_error_free (error);
+	}
+out:
+	g_free (filename);
+	return cmdline;
+}
+
+/**
+ * pk_dbus_get_session:
+ * @dbus: the #PkDbus instance
+ * @sender: the sender, usually got from dbus_g_method_get_dbus()
+ *
+ * Gets the ConsoleKit session for the ID.
+ *
+ * Return value: the session identifier, or %NULL if it could not be obtained
+ **/
+gchar *
+pk_dbus_get_session (PkDbus *dbus, const gchar *sender)
+{
+	g_return_val_if_fail (PK_IS_DBUS (dbus), NULL);
+	return NULL;
+}
+
+/**
+ * pk_dbus_finalize:
+ **/
+static void
+pk_dbus_finalize (GObject *object)
+{
+	PkDbus *dbus;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (PK_IS_DBUS (object));
+	dbus = PK_DBUS (object);
+
+	g_object_unref (dbus->priv->proxy_pid);
+
+	G_OBJECT_CLASS (pk_dbus_parent_class)->finalize (object);
+}
+
+/**
+ * pk_dbus_class_init:
+ **/
+static void
+pk_dbus_class_init (PkDbusClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	object_class->finalize = pk_dbus_finalize;
+
+	g_type_class_add_private (klass, sizeof (PkDbusPrivate));
+}
+
+/**
+ * pk_dbus_init:
+ *
+ * initializes the dbus class. NOTE: We expect dbus objects
+ * to *NOT* be removed or added during the session.
+ * We only control the first dbus object if there are more than one.
+ **/
+static void
+pk_dbus_init (PkDbus *dbus)
+{
+	GError *error = NULL;
+	dbus->priv = PK_DBUS_GET_PRIVATE (dbus);
+
+	/* connect to DBus so we can get the pid */
+	dbus->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL);
+	dbus->priv->proxy_pid = dbus_g_proxy_new_for_name_owner (dbus->priv->connection,
+								   "org.freedesktop.DBus",
+								   "/org/freedesktop/DBus/Bus",
+								   "org.freedesktop.DBus", &error);
+	if (dbus->priv->proxy_pid == NULL) {
+		egg_warning ("cannot connect to DBus: %s", error->message);
+		g_error_free (error);
+	}
+}
+
+/**
+ * pk_dbus_new:
+ * Return value: A new dbus class instance.
+ **/
+PkDbus *
+pk_dbus_new (void)
+{
+	if (pk_dbus_object != NULL) {
+		g_object_ref (pk_dbus_object);
+	} else {
+		pk_dbus_object = g_object_new (PK_TYPE_DBUS, NULL);
+		g_object_add_weak_pointer (pk_dbus_object, &pk_dbus_object);
+	}
+	return PK_DBUS (pk_dbus_object);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+egg_test_dbus (EggTest *test)
+{
+	PkDbus *dbus;
+
+	if (!egg_test_start (test, "PkDbus"))
+		return;
+
+	/************************************************************/
+	egg_test_title (test, "get an instance");
+	dbus = pk_dbus_new ();
+	egg_test_assert (test, dbus != NULL);
+
+	g_object_unref (dbus);
+
+	egg_test_end (test);
+}
+#endif
+
diff --git a/src/pk-dbus.h b/src/pk-dbus.h
new file mode 100644
index 0000000..61155ca
--- /dev/null
+++ b/src/pk-dbus.h
@@ -0,0 +1,64 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __PK_DBUS_H
+#define __PK_DBUS_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define PK_TYPE_DBUS		(pk_dbus_get_type ())
+#define PK_DBUS(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), PK_TYPE_DBUS, PkDbus))
+#define PK_DBUS_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), PK_TYPE_DBUS, PkDbusClass))
+#define PK_IS_DBUS(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), PK_TYPE_DBUS))
+#define PK_IS_DBUS_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), PK_TYPE_DBUS))
+#define PK_DBUS_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), PK_TYPE_DBUS, PkDbusClass))
+
+typedef struct PkDbusPrivate PkDbusPrivate;
+
+typedef struct
+{
+	GObject			 parent;
+	PkDbusPrivate		*priv;
+} PkDbus;
+
+typedef struct
+{
+	GObjectClass		 parent_class;
+} PkDbusClass;
+
+GType		 pk_dbus_get_type		(void);
+PkDbus		*pk_dbus_new			(void);
+
+guint		 pk_dbus_get_uid		(PkDbus		*dbus,
+						 const gchar	*sender);
+guint		 pk_dbus_get_pid		(PkDbus		*dbus,
+						 const gchar	*sender);
+gchar		*pk_dbus_get_cmdline		(PkDbus		*dbus,
+						 const gchar	*sender);
+gchar		*pk_dbus_get_session		(PkDbus		*dbus,
+						 const gchar	*sender);
+
+G_END_DECLS
+
+#endif /* __PK_DBUS_H */
+
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 0f8bf14..a55874d 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -63,6 +63,7 @@
 #include "pk-notify.h"
 #include "pk-transaction-extra.h"
 #include "pk-syslog.h"
+#include "pk-dbus.h"
 
 static void     pk_transaction_finalize		(GObject	    *object);
 static void     pk_transaction_dispose		(GObject	    *object);
@@ -100,13 +101,12 @@ struct PkTransactionPrivate
 	PkCache			*cache;
 	PkConf			*conf;
 	PkNotify		*notify;
+	PkDbus			*dbus;
 #ifdef USE_SECURITY_POLKIT
 	PolkitAuthority		*authority;
 	PolkitSubject		*subject;
 	GCancellable		*cancellable;
 #endif
-	DBusGConnection		*connection;
-	DBusGProxy		*proxy_pid;
 	PkTransactionExtra	*transaction_extra;
 	PkSyslog		*syslog;
 
@@ -1386,101 +1386,6 @@ pk_transaction_set_tid (PkTransaction *transaction, const gchar *tid)
 }
 
 /**
- * pk_transaction_get_uid:
- **/
-static guint
-pk_transaction_get_uid (PkTransaction *transaction, const gchar *sender)
-{
-	guint uid;
-	DBusError error;
-	DBusConnection *con;
-
-	g_return_val_if_fail (PK_IS_TRANSACTION (transaction), G_MAXUINT);
-	g_return_val_if_fail (sender != NULL, G_MAXUINT);
-
-	dbus_error_init (&error);
-	con = dbus_g_connection_get_connection (transaction->priv->connection);
-	uid = dbus_bus_get_unix_user (con, sender, &error);
-	if (dbus_error_is_set (&error)) {
-		egg_warning ("Could not get uid for connection: %s %s", error.name, error.message);
-		uid = G_MAXUINT;
-		goto out;
-	}
-out:
-	return uid;
-}
-
-#ifdef USE_SECURITY_POLKIT
-/**
- * pk_transaction_get_pid:
- **/
-static guint
-pk_transaction_get_pid (PkTransaction *transaction, PolkitSubject *subject)
-{
-	guint pid = G_MAXUINT;
-	gboolean ret;
-	gchar *sender = NULL;
-	GError *error = NULL;
-
-	g_return_val_if_fail (PK_IS_TRANSACTION (transaction), G_MAXUINT);
-	g_return_val_if_fail (transaction->priv->proxy_pid != NULL, G_MAXUINT);
-	g_return_val_if_fail (subject != NULL, G_MAXUINT);
-
-	/* this comes back as 'system-bus-name::1.127' */
-	sender = polkit_subject_to_string (subject);
-
-	/* get pid from DBus (quite slow) */
-	ret = dbus_g_proxy_call (transaction->priv->proxy_pid, "GetConnectionUnixProcessID", &error,
-				 G_TYPE_STRING, sender+16,
-				 G_TYPE_INVALID,
-				 G_TYPE_UINT, &pid,
-				 G_TYPE_INVALID);
-	if (!ret) {
-		egg_warning ("failed to get pid: %s", error->message);
-		g_error_free (error);
-		goto out;
-	}
-out:
-	g_free (sender);
-	return pid;
-}
-
-/**
- * pk_transaction_get_cmdline:
- **/
-static gchar *
-pk_transaction_get_cmdline (PkTransaction *transaction, PolkitSubject *subject)
-{
-	gboolean ret;
-	gchar *filename = NULL;
-	gchar *cmdline = NULL;
-	GError *error = NULL;
-	guint pid;
-
-	g_return_val_if_fail (PK_IS_TRANSACTION (transaction), NULL);
-	g_return_val_if_fail (subject != NULL, NULL);
-
-	/* get pid */
-	pid = pk_transaction_get_pid (transaction, subject);
-	if (pid == G_MAXUINT) {
-		egg_warning ("failed to get PID");
-		goto out;
-	}
-
-	/* get command line from proc */
-	filename = g_strdup_printf ("/proc/%i/cmdline", pid);
-	ret = g_file_get_contents (filename, &cmdline, NULL, &error);
-	if (!ret) {
-		egg_warning ("failed to get cmdline: %s", error->message);
-		g_error_free (error);
-	}
-out:
-	g_free (filename);
-	return cmdline;
-}
-#endif
-
-/**
  * pk_transaction_set_sender:
  */
 gboolean
@@ -1497,9 +1402,9 @@ pk_transaction_set_sender (PkTransaction *transaction, const gchar *sender)
 	/* we get the UID for all callers as we need to know when to cancel */
 #ifdef USE_SECURITY_POLKIT
 	transaction->priv->subject = polkit_system_bus_name_new (sender);
-	transaction->priv->cmdline = pk_transaction_get_cmdline (transaction, transaction->priv->subject);
+	transaction->priv->cmdline = pk_dbus_get_cmdline (transaction->priv->dbus, sender);
 #endif
-	transaction->priv->uid = pk_transaction_get_uid (transaction, sender);
+	transaction->priv->uid = pk_dbus_get_uid (transaction->priv->dbus, sender);
 
 	return TRUE;
 }
@@ -2084,7 +1989,7 @@ pk_transaction_cancel (PkTransaction *transaction, DBusGMethodInvocation *contex
 
 	/* get the UID of the caller */
 	sender = dbus_g_method_get_sender (context);
-	uid = pk_transaction_get_uid (transaction, sender);
+	uid = pk_dbus_get_uid (transaction->priv->dbus, sender);
 	g_free (sender);
 
 	/* check we got a valid value */
@@ -4466,8 +4371,6 @@ pk_transaction_class_init (PkTransactionClass *klass)
 static void
 pk_transaction_init (PkTransaction *transaction)
 {
-	GError *error = NULL;
-
 	transaction->priv = PK_TRANSACTION_GET_PRIVATE (transaction);
 	transaction->priv->finished = FALSE;
 	transaction->priv->running = FALSE;
@@ -4514,6 +4417,7 @@ pk_transaction_init (PkTransaction *transaction)
 	transaction->priv->package_list = pk_package_list_new ();
 	transaction->priv->transaction_list = pk_transaction_list_new ();
 	transaction->priv->syslog = pk_syslog_new ();
+	transaction->priv->dbus = pk_dbus_new ();
 #ifdef USE_SECURITY_POLKIT
 	transaction->priv->authority = polkit_authority_get ();
 	transaction->priv->cancellable = g_cancellable_new ();
@@ -4534,17 +4438,6 @@ pk_transaction_init (PkTransaction *transaction)
 	transaction->priv->monitor = egg_dbus_monitor_new ();
 	g_signal_connect (transaction->priv->monitor, "connection-changed",
 			  G_CALLBACK (pk_transaction_caller_active_changed_cb), transaction);
-
-	/* connect to DBus so we can get the pid */
-	transaction->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL);
-	transaction->priv->proxy_pid = dbus_g_proxy_new_for_name_owner (transaction->priv->connection,
-									"org.freedesktop.DBus",
-									"/org/freedesktop/DBus/Bus",
-									"org.freedesktop.DBus", &error);
-	if (transaction->priv->proxy_pid == NULL) {
-		egg_warning ("cannot connect to DBus: %s", error->message);
-		g_error_free (error);
-	}
 }
 
 /**
@@ -4615,6 +4508,7 @@ pk_transaction_finalize (GObject *object)
 	g_free (transaction->priv->cmdline);
 
 	g_object_unref (transaction->priv->conf);
+	g_object_unref (transaction->priv->dbus);
 	g_object_unref (transaction->priv->cache);
 	g_object_unref (transaction->priv->inhibit);
 	g_object_unref (transaction->priv->backend);
@@ -4622,7 +4516,6 @@ pk_transaction_finalize (GObject *object)
 	g_object_unref (transaction->priv->package_list);
 	g_object_unref (transaction->priv->transaction_list);
 	g_object_unref (transaction->priv->transaction_db);
-	g_object_unref (transaction->priv->proxy_pid);
 	g_object_unref (transaction->priv->notify);
 	g_object_unref (transaction->priv->syslog);
 	g_object_unref (transaction->priv->transaction_extra);
commit e1ebd363ebef5062a002551b46a784df0ddbadc5
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jul 16 14:55:34 2009 +0100

    trivial: whitespace nit

diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 8d1de6a..0f8bf14 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -107,7 +107,7 @@ struct PkTransactionPrivate
 #endif
 	DBusGConnection		*connection;
 	DBusGProxy		*proxy_pid;
-	PkTransactionExtra		*transaction_extra;
+	PkTransactionExtra	*transaction_extra;
 	PkSyslog		*syslog;
 
 	/* needed for gui coldplugging */
commit 6ca10fb9eb6291ceb03bc12e7045b9044a966399
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jul 16 14:55:17 2009 +0100

    Add a role property to PkClient for future use

diff --git a/lib/packagekit-glib/pk-client.c b/lib/packagekit-glib/pk-client.c
index 120312b..2f333bf 100644
--- a/lib/packagekit-glib/pk-client.c
+++ b/lib/packagekit-glib/pk-client.c
@@ -112,31 +112,37 @@ struct _PkClientPrivate
 	GError			*error;
 };
 
-typedef enum {
-	PK_CLIENT_DETAILS,
-	PK_CLIENT_ERROR_CODE,
-	PK_CLIENT_FILES,
-	PK_CLIENT_FINISHED,
-	PK_CLIENT_PACKAGE,
-	PK_CLIENT_PROGRESS_CHANGED,
-	PK_CLIENT_REQUIRE_RESTART,
-	PK_CLIENT_MESSAGE,
-	PK_CLIENT_TRANSACTION,
-	PK_CLIENT_DISTRO_UPGRADE,
-	PK_CLIENT_STATUS_CHANGED,
-	PK_CLIENT_UPDATE_DETAIL,
-	PK_CLIENT_REPO_SIGNATURE_REQUIRED,
-	PK_CLIENT_EULA_REQUIRED,
-	PK_CLIENT_CALLER_ACTIVE_CHANGED,
-	PK_CLIENT_REPO_DETAIL,
-	PK_CLIENT_ALLOW_CANCEL,
-	PK_CLIENT_CATEGORY,
-	PK_CLIENT_DESTROY,
-	PK_CLIENT_MEDIA_CHANGE_REQUIRED,
-	PK_CLIENT_LAST_SIGNAL
-} PkSignals;
-
-static guint signals [PK_CLIENT_LAST_SIGNAL] = { 0 };
+enum {
+	SIGNAL_DETAILS,
+	SIGNAL_ERROR_CODE,
+	SIGNAL_FILES,
+	SIGNAL_FINISHED,
+	SIGNAL_PACKAGE,
+	SIGNAL_PROGRESS_CHANGED,
+	SIGNAL_REQUIRE_RESTART,
+	SIGNAL_MESSAGE,
+	SIGNAL_TRANSACTION,
+	SIGNAL_DISTRO_UPGRADE,
+	SIGNAL_STATUS_CHANGED,
+	SIGNAL_UPDATE_DETAIL,
+	SIGNAL_REPO_SIGNATURE_REQUIRED,
+	SIGNAL_EULA_REQUIRED,
+	SIGNAL_CALLER_ACTIVE_CHANGED,
+	SIGNAL_REPO_DETAIL,
+	SIGNAL_ALLOW_CANCEL,
+	SIGNAL_CATEGORY,
+	SIGNAL_DESTROY,
+	SIGNAL_MEDIA_CHANGE_REQUIRED,
+	SIGNAL_LAST
+};
+
+enum {
+	PROP_0,
+	PROP_ROLE,
+	PROP_LAST,
+};
+
+static guint signals [SIGNAL_LAST] = { 0 };
 
 G_DEFINE_TYPE (PkClient, pk_client, G_TYPE_OBJECT)
 
@@ -510,7 +516,7 @@ pk_client_destroy_cb (DBusGProxy *proxy, PkClient *client)
 	g_object_ref (client);
 
 	egg_debug ("emit destroy %s", client->priv->tid);
-	g_signal_emit (client, signals [PK_CLIENT_DESTROY], 0);
+	g_signal_emit (client, signals [SIGNAL_DESTROY], 0);
 
 	/* unref what we previously ref'd */
 	g_object_unref (client);
@@ -545,7 +551,7 @@ pk_client_finished_cb (DBusGProxy *proxy, const gchar *exit_text, guint runtime,
 	 * in the ::Finished() handler */
 	client->priv->is_finishing = TRUE;
 
-	g_signal_emit (client, signals [PK_CLIENT_FINISHED], 0, exit_enum, runtime);
+	g_signal_emit (client, signals [SIGNAL_FINISHED], 0, exit_enum, runtime);
 
 	/* done callback */
 	client->priv->is_finishing = FALSE;
@@ -572,7 +578,7 @@ pk_client_progress_changed_cb (DBusGProxy *proxy, guint percentage, guint subper
 	g_return_if_fail (PK_IS_CLIENT (client));
 
 	egg_debug ("emit progress-changed %i, %i, %i, %i", percentage, subpercentage, elapsed, remaining);
-	g_signal_emit (client , signals [PK_CLIENT_PROGRESS_CHANGED], 0,
+	g_signal_emit (client , signals [SIGNAL_PROGRESS_CHANGED], 0,
 		       percentage, subpercentage, elapsed, remaining);
 }
 
@@ -583,7 +589,7 @@ static void
 pk_client_change_status (PkClient *client, PkStatusEnum status)
 {
 	egg_debug ("emit status-changed %s", pk_status_enum_to_text (status));
-	g_signal_emit (client , signals [PK_CLIENT_STATUS_CHANGED], 0, status);
+	g_signal_emit (client , signals [SIGNAL_STATUS_CHANGED], 0, status);
 	client->priv->last_status = status;
 }
 
@@ -622,7 +628,7 @@ pk_client_package_cb (DBusGProxy   *proxy,
 	obj = pk_package_obj_new (info, id, summary);
 
 	egg_debug ("emit package %s, %s, %s", info_text, package_id, summary);
-	g_signal_emit (client , signals [PK_CLIENT_PACKAGE], 0, obj);
+	g_signal_emit (client , signals [SIGNAL_PACKAGE], 0, obj);
 
 	/* cache */
 	if (client->priv->use_buffer || client->priv->synchronous)
@@ -647,7 +653,7 @@ pk_client_transaction_cb (DBusGProxy *proxy, const gchar *old_tid, const gchar *
 	obj = pk_transaction_obj_new_from_data (old_tid, timespec, succeeded, role, duration, data, uid, cmdline);
 	egg_debug ("emitting transaction %s, %s, %i, %s, %ims, %s, %i, %s", old_tid, timespec,
 		  succeeded, role_text, duration, data, uid, cmdline);
-	g_signal_emit (client, signals [PK_CLIENT_TRANSACTION], 0, obj);
+	g_signal_emit (client, signals [SIGNAL_TRANSACTION], 0, obj);
 
 	/* cache */
 	if (client->priv->use_buffer || client->priv->synchronous)
@@ -670,7 +676,7 @@ pk_client_distro_upgrade_cb (DBusGProxy *proxy, const gchar *type_text, const gc
 	type = pk_update_state_enum_from_text (type_text);
 	obj = pk_distro_upgrade_obj_new_from_data  (type, name, summary);
 	egg_debug ("emitting distro_upgrade %s, %s, %s", type_text, name, summary);
-	g_signal_emit (client, signals [PK_CLIENT_DISTRO_UPGRADE], 0, obj);
+	g_signal_emit (client, signals [SIGNAL_DISTRO_UPGRADE], 0, obj);
 
 	/* cache */
 	if (client->priv->use_buffer || client->priv->synchronous)
@@ -713,7 +719,7 @@ pk_client_update_detail_cb (DBusGProxy  *proxy, const gchar *package_id, const g
 						     bugzilla_url, cve_url, restart,
 						     update_text, changelog, state,
 						     issued, updated);
-	g_signal_emit (client, signals [PK_CLIENT_UPDATE_DETAIL], 0, detail);
+	g_signal_emit (client, signals [SIGNAL_UPDATE_DETAIL], 0, detail);
 
 	if (issued != NULL)
 		g_date_free (issued);
@@ -737,7 +743,7 @@ pk_client_category_cb (DBusGProxy  *proxy, const gchar *parent_id, const gchar *
 	egg_debug ("emit category %s, %s, %s, %s, %s", parent_id, cat_id, name, summary, icon);
 
 	category = pk_category_obj_new_from_data (parent_id, cat_id, name, summary, icon);
-	g_signal_emit (client, signals [PK_CLIENT_CATEGORY], 0, category);
+	g_signal_emit (client, signals [SIGNAL_CATEGORY], 0, category);
 
 	/* cache */
 	if (client->priv->use_buffer || client->priv->synchronous)
@@ -767,7 +773,7 @@ pk_client_details_cb (DBusGProxy *proxy, const gchar *package_id, const gchar *l
 		  package_id, license, group_text, description, url, (long int) size);
 
 	details = pk_details_obj_new_from_data (id, license, group, description, url, size);
-	g_signal_emit (client, signals [PK_CLIENT_DETAILS], 0, details);
+	g_signal_emit (client, signals [SIGNAL_DETAILS], 0, details);
 
 	pk_package_id_free (id);
 	pk_details_obj_free (details);
@@ -808,7 +814,7 @@ pk_client_files_cb (DBusGProxy *proxy, const gchar *package_id, const gchar *fil
 	g_return_if_fail (PK_IS_CLIENT (client));
 
 	egg_debug ("emit files %s, <lots of files>", package_id);
-	g_signal_emit (client , signals [PK_CLIENT_FILES], 0, package_id, filelist);
+	g_signal_emit (client , signals [SIGNAL_FILES], 0, package_id, filelist);
 
 	/* we are a callback from DownloadPackages */
 	if (client->priv->role == PK_ROLE_ENUM_DOWNLOAD_PACKAGES) {
@@ -835,7 +841,7 @@ pk_client_repo_signature_required_cb (DBusGProxy *proxy, const gchar *package_id
 		  package_id, repository_name, key_url, key_userid,
 		  key_id, key_fingerprint, key_timestamp, type_text);
 
-	g_signal_emit (client, signals [PK_CLIENT_REPO_SIGNATURE_REQUIRED], 0,
+	g_signal_emit (client, signals [SIGNAL_REPO_SIGNATURE_REQUIRED], 0,
 		       package_id, repository_name, key_url, key_userid, key_id, key_fingerprint, key_timestamp, type_text);
 }
 
@@ -851,7 +857,7 @@ pk_client_eula_required_cb (DBusGProxy *proxy, const gchar *eula_id, const gchar
 	egg_debug ("emit eula-required %s, %s, %s, %s",
 		  eula_id, package_id, vendor_name, license_agreement);
 
-	g_signal_emit (client, signals [PK_CLIENT_EULA_REQUIRED], 0,
+	g_signal_emit (client, signals [SIGNAL_EULA_REQUIRED], 0,
 		       eula_id, package_id, vendor_name, license_agreement);
 }
 
@@ -871,7 +877,7 @@ pk_client_media_change_required_cb (DBusGProxy *proxy,
 	media_type = pk_media_type_enum_from_text (media_type_text);
 	egg_debug ("emit media-change-required %s, %s, %s",
 		   media_type_text, media_id, media_text);
-	g_signal_emit (client, signals [PK_CLIENT_MEDIA_CHANGE_REQUIRED], 0,
+	g_signal_emit (client, signals [SIGNAL_MEDIA_CHANGE_REQUIRED], 0,
 		       media_type, media_id, media_text);
 }
 
@@ -885,7 +891,7 @@ pk_client_repo_detail_cb (DBusGProxy *proxy, const gchar *repo_id,
 	g_return_if_fail (PK_IS_CLIENT (client));
 
 	egg_debug ("emit repo-detail %s, %s, %i", repo_id, description, enabled);
-	g_signal_emit (client, signals [PK_CLIENT_REPO_DETAIL], 0, repo_id, description, enabled);
+	g_signal_emit (client, signals [SIGNAL_REPO_DETAIL], 0, repo_id, description, enabled);
 }
 
 /**
@@ -902,7 +908,7 @@ pk_client_error_code_cb (DBusGProxy  *proxy,
 
 	code = pk_error_enum_from_text (code_text);
 	egg_debug ("emit error-code %s, %s", pk_error_enum_to_text (code), details);
-	g_signal_emit (client , signals [PK_CLIENT_ERROR_CODE], 0, code, details);
+	g_signal_emit (client , signals [SIGNAL_ERROR_CODE], 0, code, details);
 }
 
 /**
@@ -914,7 +920,7 @@ pk_client_allow_cancel_cb (DBusGProxy *proxy, gboolean allow_cancel, PkClient *c
 	g_return_if_fail (PK_IS_CLIENT (client));
 
 	egg_debug ("emit allow-cancel %i", allow_cancel);
-	g_signal_emit (client , signals [PK_CLIENT_ALLOW_CANCEL], 0, allow_cancel);
+	g_signal_emit (client , signals [SIGNAL_ALLOW_CANCEL], 0, allow_cancel);
 }
 
 /**
@@ -972,7 +978,7 @@ pk_client_caller_active_changed_cb (DBusGProxy  *proxy,
 	g_return_if_fail (PK_IS_CLIENT (client));
 
 	egg_debug ("emit caller-active-changed %i", is_active);
-	g_signal_emit (client , signals [PK_CLIENT_CALLER_ACTIVE_CHANGED], 0, is_active);
+	g_signal_emit (client , signals [SIGNAL_CALLER_ACTIVE_CHANGED], 0, is_active);
 }
 
 /**
@@ -998,7 +1004,7 @@ pk_client_require_restart_cb (DBusGProxy  *proxy,
 		pk_obj_list_add (client->priv->require_restart_list, obj);
 
 	egg_debug ("emit require-restart %s, %s", pk_restart_enum_to_text (restart), package_id);
-	g_signal_emit (client , signals [PK_CLIENT_REQUIRE_RESTART], 0, obj);
+	g_signal_emit (client , signals [SIGNAL_REQUIRE_RESTART], 0, obj);
 	if (restart > client->priv->require_restart) {
 		client->priv->require_restart = restart;
 		egg_debug ("restart status now %s", pk_restart_enum_to_text (restart));
@@ -1018,7 +1024,7 @@ pk_client_message_cb (DBusGProxy  *proxy, const gchar *message_text, const gchar
 
 	message = pk_message_enum_from_text (message_text);
 	egg_debug ("emit message %i, %s", message, details);
-	g_signal_emit (client , signals [PK_CLIENT_MESSAGE], 0, message, details);
+	g_signal_emit (client , signals [SIGNAL_MESSAGE], 0, message, details);
 }
 
 /**
@@ -1306,7 +1312,7 @@ pk_client_transaction_timeout_cb (PkClient *client)
 
 	/* emit signal */
 	egg_debug ("emit error-code %i, %s", PK_ERROR_ENUM_TRANSACTION_CANCELLED, details);
-	g_signal_emit (client , signals [PK_CLIENT_ERROR_CODE], 0, PK_ERROR_ENUM_TRANSACTION_CANCELLED, details);
+	g_signal_emit (client , signals [SIGNAL_ERROR_CODE], 0, PK_ERROR_ENUM_TRANSACTION_CANCELLED, details);
 
 	/* set used */
 	client->priv->timeout_id = 0;
@@ -4098,14 +4104,56 @@ out:
 }
 
 /**
+ * pk_client_get_property:
+ **/
+static void
+pk_client_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+	PkClient *client;
+	client = PK_CLIENT (object);
+	switch (prop_id) {
+	case PROP_ROLE:
+		g_value_set_uint (value, client->priv->role);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+/**
+ * pk_client_set_property:
+ **/
+static void
+pk_client_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+	switch (prop_id) {
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+/**
  * pk_client_class_init:
  **/
 static void
 pk_client_class_init (PkClientClass *klass)
 {
+	GParamSpec *pspec;
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
 	object_class->finalize = pk_client_finalize;
+	object_class->get_property = pk_client_get_property;
+	object_class->set_property = pk_client_set_property;
+
+	/**
+	 * PkClient:role:
+	 */
+	pspec = g_param_spec_uint ("role", NULL, NULL,
+				   0, G_MAXUINT, 0,
+				   G_PARAM_READWRITE);
+	g_object_class_install_property (object_class, PROP_ROLE, pspec);
 
 	/**
 	 * PkClient::status-changed:
@@ -4115,7 +4163,7 @@ pk_client_class_init (PkClientClass *klass)
 	 * The ::status-changed signal is emitted when the transaction status
 	 * has changed.
 	 **/
-	signals [PK_CLIENT_STATUS_CHANGED] =
+	signals [SIGNAL_STATUS_CHANGED] =
 		g_signal_new ("status-changed",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, status_changed),
@@ -4132,7 +4180,7 @@ pk_client_class_init (PkClientClass *klass)
 	 * The ::progress-changed signal is emitted when the update list may have
 	 * changed and the client program may have to update some UI.
 	 **/
-	signals [PK_CLIENT_PROGRESS_CHANGED] =
+	signals [SIGNAL_PROGRESS_CHANGED] =
 		g_signal_new ("progress-changed",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, progress_changed),
@@ -4147,7 +4195,7 @@ pk_client_class_init (PkClientClass *klass)
 	 * The ::package signal is emitted when the update list may have
 	 * changed and the client program may have to update some UI.
 	 **/
-	signals [PK_CLIENT_PACKAGE] =
+	signals [SIGNAL_PACKAGE] =
 		g_signal_new ("package",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, package),
@@ -4161,7 +4209,7 @@ pk_client_class_init (PkClientClass *klass)
 	 * The ::transaction is emitted when the method GetOldTransactions() is
 	 * called, and the values are being replayed from a database.
 	 **/
-	signals [PK_CLIENT_TRANSACTION] =
+	signals [SIGNAL_TRANSACTION] =
 		g_signal_new ("transaction",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, transaction),
@@ -4175,7 +4223,7 @@ pk_client_class_init (PkClientClass *klass)
 	 * The ::distro_upgrade signal is emitted when the method GetDistroUpgrades() is
 	 * called, and the upgrade options are being sent.
 	 **/
-	signals [PK_CLIENT_DISTRO_UPGRADE] =
+	signals [SIGNAL_DISTRO_UPGRADE] =
 		g_signal_new ("distro-upgrade",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, distro_upgrade),
@@ -4189,7 +4237,7 @@ pk_client_class_init (PkClientClass *klass)
 	 * The ::update-detail signal is emitted when GetUpdateDetail() is
 	 * called on a set of package_id's.
 	 **/
-	signals [PK_CLIENT_UPDATE_DETAIL] =
+	signals [SIGNAL_UPDATE_DETAIL] =
 		g_signal_new ("update-detail",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, update_detail),
@@ -4202,7 +4250,7 @@ pk_client_class_init (PkClientClass *klass)
 	 *
 	 * The ::details signal is emitted when GetDetails() is called.
 	 **/
-	signals [PK_CLIENT_DETAILS] =
+	signals [SIGNAL_DETAILS] =
 		g_signal_new ("details",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, details),
@@ -4215,7 +4263,7 @@ pk_client_class_init (PkClientClass *klass)
 	 *
 	 * The ::files signal is emitted when the method GetFiles() is used.
 	 **/
-	signals [PK_CLIENT_FILES] =
+	signals [SIGNAL_FILES] =
 		g_signal_new ("files",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, files),
@@ -4236,7 +4284,7 @@ pk_client_class_init (PkClientClass *klass)
 	 * The ::repo-signature-required signal is emitted when the transaction
 	 * needs to fail for a signature prompt.
 	 **/
-	signals [PK_CLIENT_REPO_SIGNATURE_REQUIRED] =
+	signals [SIGNAL_REPO_SIGNATURE_REQUIRED] =
 		g_signal_new ("repo-signature-required",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, repo_signature_required),
@@ -4253,7 +4301,7 @@ pk_client_class_init (PkClientClass *klass)
 	 *
 	 * The ::eula signal is emitted when the transaction needs to fail for a EULA prompt.
 	 **/
-	signals [PK_CLIENT_EULA_REQUIRED] =
+	signals [SIGNAL_EULA_REQUIRED] =
 		g_signal_new ("eula-required",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, eula_required),
@@ -4272,7 +4320,7 @@ pk_client_class_init (PkClientClass *klass)
 	 *
 	 * This can only happen once in a transaction.
 	 **/
-	signals [PK_CLIENT_MEDIA_CHANGE_REQUIRED] =
+	signals [SIGNAL_MEDIA_CHANGE_REQUIRED] =
 		g_signal_new ("media-change-required",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, media_change_required),
@@ -4289,7 +4337,7 @@ pk_client_class_init (PkClientClass *klass)
 	 * The ::repo-detail signal is emitted when the method GetRepos() is
 	 * called.
 	 **/
-	signals [PK_CLIENT_REPO_DETAIL] =
+	signals [SIGNAL_REPO_DETAIL] =
 		g_signal_new ("repo-detail",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, repo_detail),
@@ -4306,7 +4354,7 @@ pk_client_class_init (PkClientClass *klass)
 	 *
 	 * This can only happen once in a transaction.
 	 **/
-	signals [PK_CLIENT_ERROR_CODE] =
+	signals [SIGNAL_ERROR_CODE] =
 		g_signal_new ("error-code",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, error_code),
@@ -4320,7 +4368,7 @@ pk_client_class_init (PkClientClass *klass)
 	 * The ::require-restart signal is emitted when the transaction
 	 * requires a application or session restart.
 	 **/
-	signals [PK_CLIENT_REQUIRE_RESTART] =
+	signals [SIGNAL_REQUIRE_RESTART] =
 		g_signal_new ("require-restart",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, require_restart),
@@ -4335,7 +4383,7 @@ pk_client_class_init (PkClientClass *klass)
 	 * The ::message signal is emitted when the transaction wants to tell
 	 * the user something.
 	 **/
-	signals [PK_CLIENT_MESSAGE] =
+	signals [SIGNAL_MESSAGE] =
 		g_signal_new ("message",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, message),
@@ -4352,7 +4400,7 @@ pk_client_class_init (PkClientClass *klass)
 	 * You probably want to enable and disable cancel buttons according to
 	 * this value.
 	 **/
-	signals [PK_CLIENT_ALLOW_CANCEL] =
+	signals [SIGNAL_ALLOW_CANCEL] =
 		g_signal_new ("allow-cancel",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, allow_cancel),
@@ -4366,7 +4414,7 @@ pk_client_class_init (PkClientClass *klass)
 	 * The ::caller-active-changed signal is emitted when the client that
 	 * issued the dbus method is exited.
 	 **/
-	signals [PK_CLIENT_CALLER_ACTIVE_CHANGED] =
+	signals [SIGNAL_CALLER_ACTIVE_CHANGED] =
 		g_signal_new ("caller-active-changed",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, caller_active_changed),
@@ -4379,7 +4427,7 @@ pk_client_class_init (PkClientClass *klass)
 	 *
 	 * The ::category signal is emitted when GetCategories() is called.
 	 **/
-	signals [PK_CLIENT_CATEGORY] =
+	signals [SIGNAL_CATEGORY] =
 		g_signal_new ("category",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, category),
@@ -4393,7 +4441,7 @@ pk_client_class_init (PkClientClass *klass)
 	 *
 	 * The ::finished signal is emitted when the transaction is complete.
 	 **/
-	signals [PK_CLIENT_FINISHED] =
+	signals [SIGNAL_FINISHED] =
 		g_signal_new ("finished",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, finished),
@@ -4407,7 +4455,7 @@ pk_client_class_init (PkClientClass *klass)
 	 * The ::destroy signal is emitted when the transaction has been
 	 * destroyed and is no longer available for use.
 	 **/
-	signals [PK_CLIENT_DESTROY] =
+	signals [SIGNAL_DESTROY] =
 		g_signal_new ("destroy",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (PkClientClass, destroy),
commit 864d8d52166386d58de9f0184d11740d846d4dd3
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jul 16 09:54:19 2009 +0100

    Detect when the PolicyKit authentication was timed out, and show this as a message to the user

diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 4c5295f..8d1de6a 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1681,22 +1681,35 @@ pk_transaction_action_obtain_authorization_finished_cb (GObject *source_object,
 {
 	PolkitAuthorizationResult *result;
 	gboolean ret;
+	gchar *message;
 	GError *error = NULL;
 
 	/* finish the call */
 	result = polkit_authority_check_authorization_finish (transaction->priv->authority, res, &error);
 	transaction->priv->waiting_for_auth = FALSE;
 
-	/* failed, maybe session authentication agent isn't running */
+	/* failed because the request was cancelled */
+	ret = g_cancellable_is_cancelled (transaction->priv->cancellable);
+	if (!ret) {
+		/* emit an ::StatusChanged, ::ErrorCode() and then ::Finished() */
+		pk_transaction_status_changed_emit (transaction, PK_STATUS_ENUM_FINISHED);
+		pk_transaction_error_code_emit (transaction, PK_ERROR_ENUM_NOT_AUTHORIZED, "The authentication was cancelled due to a timeout.");
+		pk_transaction_finished_emit (transaction, PK_EXIT_ENUM_FAILED, 0);
+		g_error_free (error);
+		goto out;
+	}
+
+	/* failed, maybe polkit is messed up? */
 	if (result == NULL) {
 		egg_warning ("failed to check for auth: %s", error->message);
 
 		/* emit an ::StatusChanged, ::ErrorCode() and then ::Finished() */
 		pk_transaction_status_changed_emit (transaction, PK_STATUS_ENUM_FINISHED);
-		pk_transaction_error_code_emit (transaction, PK_ERROR_ENUM_NOT_AUTHORIZED,
-						"failed to check for auth: maybe session authentication agent isn't running?");
+		message = g_strdup_printf ("failed to check for authentication: %s", error->message);
+		pk_transaction_error_code_emit (transaction, PK_ERROR_ENUM_NOT_AUTHORIZED, message);
 		pk_transaction_finished_emit (transaction, PK_EXIT_ENUM_FAILED, 0);
 		g_error_free (error);
+		g_free (message);
 		goto out;
 	}
 
@@ -1705,7 +1718,8 @@ pk_transaction_action_obtain_authorization_finished_cb (GObject *source_object,
 
 		/* emit an ::StatusChanged, ::ErrorCode() and then ::Finished() */
 		pk_transaction_status_changed_emit (transaction, PK_STATUS_ENUM_FINISHED);
-		pk_transaction_error_code_emit (transaction, PK_ERROR_ENUM_NOT_AUTHORIZED, "failed to obtain auth");
+		pk_transaction_error_code_emit (transaction, PK_ERROR_ENUM_NOT_AUTHORIZED,
+						"failed to obtain authentication");
 		pk_transaction_finished_emit (transaction, PK_EXIT_ENUM_FAILED, 0);
 
 		pk_syslog_add (transaction->priv->syslog, PK_SYSLOG_TYPE_AUTH, "uid %i failed to obtain auth", transaction->priv->uid);
commit ce49f887b895269900bb3fd0c409d8778deb287c
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jul 16 09:08:40 2009 +0100

    gtk-module: check for zero length data from FcNameUnparse to mitigate fd#22792

diff --git a/contrib/gtk-module/pk-gtk-module.c b/contrib/gtk-module/pk-gtk-module.c
index 0997a4b..0924986 100644
--- a/contrib/gtk-module/pk-gtk-module.c
+++ b/contrib/gtk-module/pk-gtk-module.c
@@ -172,13 +172,19 @@ pk_font_not_found (PangoLanguage *language)
 
 	/* convert to language */
 	lang = pango_language_to_string (language);
+	if (lang == NULL || lang[0] == '\0') {
+		g_warning ("failed to convert language to string");
+		goto out;
+	}
 
 	/* create the font tag used in as a package provides */
 	pat = FcPatternCreate ();
 	FcPatternAddString (pat, FC_LANG, (FcChar8 *) lang);
 	tag = (gchar *) FcNameUnparse (pat);
-	if (tag == NULL)
+	if (tag == NULL || tag[0] == '\0') {
+		g_warning ("failed to create font tag: %s", lang);
 		goto out;
+	}
 
 	/* add to array for processing in idle callback */
 	queue_install_fonts_tag (tag);
commit 2bce32ae48026cac32a0ba69124ba23c840a7687
Author: Mounir Lamouri (volkmar) <mounir.lamouri at gmail.com>
Date:   Thu Jul 16 01:52:49 2009 +0200

    portage: trivial: making pylint happy

diff --git a/backends/portage/portageBackend.py b/backends/portage/portageBackend.py
index 64d3016..d297fc5 100755
--- a/backends/portage/portageBackend.py
+++ b/backends/portage/portageBackend.py
@@ -337,7 +337,7 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
 
         for cpv in cpv_list:
             if self.is_installed(cpv) == installed:
-                if portage.pkgcmp(portage.pkgsplit(cpv),\
+                if portage.pkgcmp(portage.pkgsplit(cpv), \
                         portage.pkgsplit(newer)) == 1:
                     newer = cpv
 
commit 66a45740a7300cffbb30e9b068fd4e3cc7c11c23
Merge: ed2728c... 497c5a3...
Author: Mounir Lamouri (volkmar) <mounir.lamouri at gmail.com>
Date:   Thu Jul 16 01:49:37 2009 +0200

    Merge branch 'master' of git+ssh://volkmar@git.packagekit.org/srv/git/PackageKit

commit ed2728ccb7f77e56cad92cf076470a340b930695
Author: Mounir Lamouri (volkmar) <mounir.lamouri at gmail.com>
Date:   Thu Jul 16 01:49:24 2009 +0200

    portage: improve get-updates with security updates

diff --git a/backends/portage/portageBackend.py b/backends/portage/portageBackend.py
index 223fe81..6ed399a 100755
--- a/backends/portage/portageBackend.py
+++ b/backends/portage/portageBackend.py
@@ -821,34 +821,58 @@ class PackageKitPortageBackend(PackageKitBaseBackend, PackagekitPackage):
 
     def get_updates(self, filters):
         # NOTES:
-        # portage prefer not to update _ALL_ packages so we will only list updated
-        # packages in world or system
+        # portage prefer not to update _ALL_ packages
+        # so we will only list updated packages in world, system or security
+        # TODO: downgrade ?
+        # TODO: more than one updates for the same package ?
+
+        # UPDATE TYPES:
+        # - blocked: wait for feedbacks
+        # - low: TODO: --newuse
+        # - normal: default
+        # - important: none atm
+        # - security: from @security
+
+        # FILTERS:
+        # - installed: try to update non-installed packages and call me ;)
+        # - free: TODO
+        # - newest: TODO
 
-        # TODO: filters ?
-        # TODO: INFO
         self.status(STATUS_INFO)
         self.allow_cancel(True)
         self.percentage(None)
 
         # best way to get that ?
-        settings, trees, mtimedb = _emerge.load_emerge_config()
-        rootconfig = _emerge.RootConfig(self.portage_settings, trees["/"],
-                portage._sets.load_default_config(self.portage_settings, trees["/"]))
+        settings, trees, _ = _emerge.actions.load_emerge_config()
+        root_config = trees[self.portage_settings["ROOT"]]["root_config"]
 
+        security_updates = []
         cp_to_check = []
+        cpv_list = []
+
+        for atom in portage.sets.base.InternalPackageSet(
+                initial_atoms=root_config.setconfig.getSetAtoms("security")):
+            security_updates.append(atom.cpv)
 
         # get system and world sets
-        for s in ("system", "world"):
-            set = portage._sets.base.InternalPackageSet(
-                    initial_atoms=rootconfig.setconfig.getSetAtoms(s))
-            for cp in set:
-                cp_to_check.append(cp)
+        for s in ["system", "world"]:
+            set = portage.sets.base.InternalPackageSet(
+                    initial_atoms=root_config.setconfig.getSetAtoms(s))
+            for atom in set:
+                cp_to_check.append(atom.cp)
 
         # check if bestmatch is installed
         for cp in cp_to_check:
             best_cpv = portage.portdb.xmatch("bestmatch-visible", cp)
             if not self.vardb.cpv_exists(best_cpv):
-                self.package(best_cpv, INFO_NORMAL)
+                cpv_list.append(best_cpv)
+
+        # security updates
+        for cpv in security_updates:
+            self.package(cpv, INFO_SECURITY)
+        # regular updates
+        for cpv in cpv_list:
+            self.package(cpv, INFO_NORMAL)
 
     def install_packages(self, only_trusted, pkgs):
         self.status(STATUS_RUNNING)
commit 497c5a3ee803af9028d33ff87fdcf12eb541a061
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 15 22:13:27 2009 +0100

    Send an ErrorCode when the authentication agent fails to be contacted

diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index c6c534c..4c5295f 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1687,9 +1687,15 @@ pk_transaction_action_obtain_authorization_finished_cb (GObject *source_object,
 	result = polkit_authority_check_authorization_finish (transaction->priv->authority, res, &error);
 	transaction->priv->waiting_for_auth = FALSE;
 
-	/* failed */
+	/* failed, maybe session authentication agent isn't running */
 	if (result == NULL) {
 		egg_warning ("failed to check for auth: %s", error->message);
+
+		/* emit an ::StatusChanged, ::ErrorCode() and then ::Finished() */
+		pk_transaction_status_changed_emit (transaction, PK_STATUS_ENUM_FINISHED);
+		pk_transaction_error_code_emit (transaction, PK_ERROR_ENUM_NOT_AUTHORIZED,
+						"failed to check for auth: maybe session authentication agent isn't running?");
+		pk_transaction_finished_emit (transaction, PK_EXIT_ENUM_FAILED, 0);
 		g_error_free (error);
 		goto out;
 	}
commit 0e829a2928aa1ae37eb54179f822ab9d6165c453
Author: igor <igor at fedoraproject.org>
Date:   Wed Jul 15 18:13:28 2009 +0000

    Sending translation for Brazilian Portuguese

diff --git a/po/pt_BR.po b/po/pt_BR.po
index 1fe04fd..ca00248 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PackageKit\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-04-10 19:04+0000\n"
-"PO-Revision-Date: 2009-04-10 19:24-0300\n"
+"POT-Creation-Date: 2009-07-15 14:38+0000\n"
+"PO-Revision-Date: 2009-07-15 15:10-0300\n"
 "Last-Translator: Igor Pires Soares <igor at projetofedora.org>\n"
 "Language-Team: Brazilian Portuguese <fedora-trans-pt_br at redhat.com>\n"
 "MIME-Version: 1.0\n"
@@ -20,236 +20,260 @@ msgstr ""
 "X-Poedit-Country: BRAZIL\n"
 
 #. TRANSLATORS: this is an atomic transaction
-#: ../client/pk-console.c:234
+#: ../client/pk-console.c:231
 msgid "Transaction"
 msgstr "Transação"
 
 #. TRANSLATORS: this is the time the transaction was started in system timezone
-#: ../client/pk-console.c:236
+#: ../client/pk-console.c:233
 msgid "System time"
 msgstr "Horário do sistema"
 
 #. TRANSLATORS: this is if the transaction succeeded or not
-#: ../client/pk-console.c:238
+#: ../client/pk-console.c:235
 msgid "Succeeded"
 msgstr "Concluído"
 
 #. TRANSLATORS: if the repo is enabled
-#: ../client/pk-console.c:238
-#: ../client/pk-console.c:405
+#: ../client/pk-console.c:235
+#: ../client/pk-console.c:402
 msgid "True"
 msgstr "Verdadeiro"
 
-#: ../client/pk-console.c:238
-#: ../client/pk-console.c:405
+#: ../client/pk-console.c:235
+#: ../client/pk-console.c:402
 msgid "False"
 msgstr "Falso"
 
 #. TRANSLATORS: this is the transactions role, e.g. "update-system"
-#: ../client/pk-console.c:240
+#. TRANSLATORS: the trasaction role, e.g. update-system
+#: ../client/pk-console.c:237
+#: ../src/pk-polkit-action-lookup.c:256
 msgid "Role"
 msgstr "Modo"
 
 #. TRANSLATORS: this is The duration of the transaction
-#: ../client/pk-console.c:245
+#: ../client/pk-console.c:242
 msgid "Duration"
 msgstr "Duração"
 
-#: ../client/pk-console.c:245
+#: ../client/pk-console.c:242
 msgid "(seconds)"
 msgstr "(segundos)"
 
 #. TRANSLATORS: this is The command line used to do the action
-#: ../client/pk-console.c:249
+#. TRANSLATORS: the command line of the thing that wants the authentication
+#: ../client/pk-console.c:246
+#: ../src/pk-polkit-action-lookup.c:270
 msgid "Command line"
 msgstr "Linha de comando"
 
 #. TRANSLATORS: this is the user ID of the user that started the action
-#: ../client/pk-console.c:251
+#: ../client/pk-console.c:248
 msgid "User ID"
 msgstr "ID do usuário"
 
 #. TRANSLATORS: this is the username, e.g. hughsie
-#: ../client/pk-console.c:258
+#: ../client/pk-console.c:255
 msgid "Username"
 msgstr "Nome de usuário"
 
 #. TRANSLATORS: this is the users real name, e.g. "Richard Hughes"
-#: ../client/pk-console.c:262
+#: ../client/pk-console.c:259
 msgid "Real name"
 msgstr "Nome real"
 
-#: ../client/pk-console.c:270
+#: ../client/pk-console.c:267
 msgid "Affected packages:"
 msgstr "Pacotes afetados:"
 
-#: ../client/pk-console.c:272
+#: ../client/pk-console.c:269
 msgid "Affected packages: None"
 msgstr "Pacotes afetados: nenhum"
 
 #. TRANSLATORS: this is the distro, e.g. Fedora 10
-#: ../client/pk-console.c:297
+#: ../client/pk-console.c:294
 msgid "Distribution"
 msgstr "Distribuição"
 
 #. TRANSLATORS: this is type of update, stable or testing
-#: ../client/pk-console.c:299
+#: ../client/pk-console.c:296
 msgid "Type"
 msgstr "Tipo"
 
 #. TRANSLATORS: this is any summary text describing the upgrade
 #. TRANSLATORS: this is the summary of the group
-#: ../client/pk-console.c:301
-#: ../client/pk-console.c:324
+#: ../client/pk-console.c:298
+#: ../client/pk-console.c:321
 msgid "Summary"
 msgstr "Sumário"
 
 #. TRANSLATORS: this is the group category name
-#: ../client/pk-console.c:313
+#: ../client/pk-console.c:310
 msgid "Category"
 msgstr "Categoria"
 
 #. TRANSLATORS: this is group identifier
-#: ../client/pk-console.c:315
+#: ../client/pk-console.c:312
 msgid "ID"
 msgstr "ID"
 
 #. TRANSLATORS: this is the parent group
-#: ../client/pk-console.c:318
+#: ../client/pk-console.c:315
 msgid "Parent"
 msgstr "Pai"
 
 #. TRANSLATORS: this is the name of the parent group
-#: ../client/pk-console.c:321
+#: ../client/pk-console.c:318
 msgid "Name"
 msgstr "Nome"
 
 #. TRANSLATORS: this is preferred icon for the group
-#: ../client/pk-console.c:327
+#: ../client/pk-console.c:324
 msgid "Icon"
 msgstr "Ícone"
 
 #. TRANSLATORS: this is a header for the package that can be updated
-#: ../client/pk-console.c:342
+#: ../client/pk-console.c:339
 msgid "Details about the update:"
 msgstr "Detalhes sobre a atualização:"
 
 #. TRANSLATORS: details about the update, package name and version
-#: ../client/pk-console.c:344
+#: ../client/pk-console.c:341
 msgid "Package"
 msgstr "Pacote"
 
 #. TRANSLATORS: details about the update, any packages that this update updates
-#: ../client/pk-console.c:347
+#: ../client/pk-console.c:344
 msgid "Updates"
 msgstr "Atualiza"
 
 #. TRANSLATORS: details about the update, any packages that this update obsoletes
-#: ../client/pk-console.c:351
+#: ../client/pk-console.c:348
 msgid "Obsoletes"
 msgstr "Obsoletos"
 
 #. TRANSLATORS: details about the update, the vendor URLs
-#: ../client/pk-console.c:355
+#: ../client/pk-console.c:352
 msgid "Vendor"
 msgstr "Fornecedor"
 
 #. TRANSLATORS: details about the update, the bugzilla URLs
-#: ../client/pk-console.c:359
+#: ../client/pk-console.c:356
 msgid "Bugzilla"
 msgstr "Bugzilla"
 
 #. TRANSLATORS: details about the update, the CVE URLs
-#: ../client/pk-console.c:363
+#: ../client/pk-console.c:360
 msgid "CVE"
 msgstr "CVE"
 
 #. TRANSLATORS: details about the update, if the package requires a restart
-#: ../client/pk-console.c:367
+#: ../client/pk-console.c:364
 msgid "Restart"
 msgstr "Reinício"
 
 #. TRANSLATORS: details about the update, any description of the update
-#: ../client/pk-console.c:371
+#: ../client/pk-console.c:368
 msgid "Update text"
 msgstr "Descrição da atualização"
 
 #. TRANSLATORS: details about the update, the changelog for the package
-#: ../client/pk-console.c:375
+#: ../client/pk-console.c:372
 msgid "Changes"
 msgstr "Alterações"
 
 #. TRANSLATORS: details about the update, the ongoing state of the update
-#: ../client/pk-console.c:379
+#: ../client/pk-console.c:376
 msgid "State"
 msgstr "Estado"
 
 #. TRANSLATORS: details about the update, date the update was issued
-#: ../client/pk-console.c:384
+#: ../client/pk-console.c:381
 msgid "Issued"
 msgstr "Emissão"
 
 #. TRANSLATORS: details about the update, date the update was updated
-#: ../client/pk-console.c:389
+#: ../client/pk-console.c:386
 msgid "Updated"
 msgstr "Atualizado em"
 
-#: ../client/pk-console.c:476
-#: ../client/pk-console.c:478
+#: ../client/pk-console.c:473
+#: ../client/pk-console.c:475
 msgid "Percentage"
 msgstr "Porcentagem"
 
-#: ../client/pk-console.c:478
+#: ../client/pk-console.c:475
 msgid "Unknown"
 msgstr "Desconhecido"
 
 #. TRANSLATORS: a package requires the system to be restarted
-#: ../client/pk-console.c:529
+#: ../client/pk-console.c:517
 msgid "System restart required by:"
 msgstr "O reinício do sistema é requerido por:"
 
 #. TRANSLATORS: a package requires the session to be restarted
-#: ../client/pk-console.c:532
+#: ../client/pk-console.c:520
 msgid "Session restart required:"
 msgstr "É necessário reiniciar a sessão:"
 
+#. TRANSLATORS: a package requires the system to be restarted due to a security update
+#: ../client/pk-console.c:523
+msgid "System restart (security) required by:"
+msgstr "O reinício do sistema (por segurança) é requerido por:"
+
+#. TRANSLATORS: a package requires the session to be restarted due to a security update
+#: ../client/pk-console.c:526
+msgid "Session restart (security) required:"
+msgstr "É necessário reiniciar a sessão (por segurança):"
+
 #. TRANSLATORS: a package requires the application to be restarted
-#: ../client/pk-console.c:535
+#: ../client/pk-console.c:529
 msgid "Application restart required by:"
 msgstr "O reinício do aplicativo é requerido por:"
 
-#. TRANSLATORS: a package needs to restart they system
-#: ../client/pk-console.c:572
+#. TRANSLATORS: a package needs to restart their system
+#: ../client/pk-console.c:584
 msgid "Please restart the computer to complete the update."
 msgstr "Por favor, reinicie o computador para completar a atualização."
 
 #. TRANSLATORS: a package needs to restart the session
-#: ../client/pk-console.c:575
+#: ../client/pk-console.c:587
 msgid "Please logout and login to complete the update."
 msgstr "Por favor, encerre a sessão e inicie-a novamente para completar a atualização."
 
 #. TRANSLATORS: a package needs to restart the application
-#: ../client/pk-console.c:578
+#: ../client/pk-console.c:590
 msgid "Please restart the application as it is being used."
 msgstr "Por favor, reinicie o aplicativo que está sendo usado."
 
+#. TRANSLATORS: a package needs to restart their system (due to security)
+#: ../client/pk-console.c:593
+msgid "Please restart the computer to complete the update as important security updates have been installed."
+msgstr "Por favor, reinicie o computador para completar a atualização pois importantes atualizações de segurança foram instaladas."
+
+#. TRANSLATORS: a package needs to restart the session (due to security)
+#: ../client/pk-console.c:596
+msgid "Please logout and login to complete the update as important security updates have been installed."
+msgstr "Por favor, encerre a sessão e inicie-a novamente para completar a atualização pois importantes atualizações de segurança foram instaladas."
+
 #. TRANSLATORS: The package is already installed on the system
-#: ../client/pk-console.c:691
+#: ../client/pk-console.c:723
 #, c-format
 msgid "The package %s is already installed"
 msgstr "O pacote %s já está instalado"
 
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:699
+#: ../client/pk-console.c:731
 #, c-format
 msgid "The package %s could not be installed: %s"
 msgstr "O pacote %s não pôde ser instalado: %s"
 
 #. TRANSLATORS: There was a programming error that shouldn't happen. The detailed error follows
-#: ../client/pk-console.c:724
-#: ../client/pk-console.c:751
-#: ../client/pk-console.c:847
-#: ../client/pk-console.c:964
+#: ../client/pk-console.c:756
+#: ../client/pk-console.c:779
+#: ../client/pk-console.c:875
+#: ../client/pk-console.c:992
 #: ../client/pk-tools-common.c:62
 #: ../client/pk-tools-common.c:81
 #: ../client/pk-tools-common.c:89
@@ -258,417 +282,421 @@ msgid "Internal error: %s"
 msgstr "Erro interno: %s"
 
 #. TRANSLATORS: There was an error installing the packages. The detailed error follows
-#: ../client/pk-console.c:732
-#: ../client/pk-console.c:1360
+#: ../client/pk-console.c:764
+#: ../client/pk-console.c:1388
 #, c-format
 msgid "This tool could not install the packages: %s"
 msgstr "Esta ferramenta não pôde instalar os pacotes: %s"
 
 #. TRANSLATORS: There was an error installing the files. The detailed error follows
-#: ../client/pk-console.c:759
+#: ../client/pk-console.c:787
 #, c-format
 msgid "This tool could not install the files: %s"
 msgstr "Esta ferramenta não pôde instalar os arquivos: %s"
 
 #. TRANSLATORS: The package name was not found in the installed list. The detailed error follows
-#: ../client/pk-console.c:815
+#: ../client/pk-console.c:843
 #, c-format
 msgid "This tool could not remove %s: %s"
 msgstr "Esta ferramenta não pôde remover %s: %s"
 
 #. TRANSLATORS: There was an error removing the packages. The detailed error follows
-#: ../client/pk-console.c:838
-#: ../client/pk-console.c:876
-#: ../client/pk-console.c:909
+#: ../client/pk-console.c:866
+#: ../client/pk-console.c:904
+#: ../client/pk-console.c:937
 #, c-format
 msgid "This tool could not remove the packages: %s"
 msgstr "Esta ferramente não pôde remover os pacotes: %s"
 
 #. TRANSLATORS: When removing, we might have to remove other dependencies
-#: ../client/pk-console.c:888
+#: ../client/pk-console.c:916
 msgid "The following packages have to be removed:"
 msgstr "Os seguintes pacotes têm que ser removidos:"
 
 #. TRANSLATORS: We are checking if it's okay to remove a list of packages
-#: ../client/pk-console.c:895
+#: ../client/pk-console.c:923
 msgid "Proceed removing additional packages?"
 msgstr "Continuar com a remoção dos pacotes adicionais?"
 
 #. TRANSLATORS: We did not remove any packages
-#: ../client/pk-console.c:900
+#: ../client/pk-console.c:928
 msgid "The package removal was canceled!"
 msgstr "A remoção do pacote foi cancelada!"
 
 #. TRANSLATORS: The package name was not found in any software sources
-#: ../client/pk-console.c:941
+#: ../client/pk-console.c:969
 #, c-format
 msgid "This tool could not download the package %s as it could not be found"
 msgstr "Esta ferramenta não pôde baixar o pacote %s, pois ele não foi localizado"
 
 #. TRANSLATORS: Could not download the packages for some reason. The detailed error follows
-#: ../client/pk-console.c:972
+#: ../client/pk-console.c:1000
 #, c-format
 msgid "This tool could not download the packages: %s"
 msgstr "Esta ferramenta não pôde baixar os pacotes: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:999
-#: ../client/pk-console.c:1008
+#: ../client/pk-console.c:1027
+#: ../client/pk-console.c:1036
 #, c-format
 msgid "This tool could not update %s: %s"
 msgstr "Esta ferramenta não pôde atualizar %s: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:1030
-#: ../client/pk-console.c:1038
+#: ../client/pk-console.c:1058
+#: ../client/pk-console.c:1066
 #, c-format
 msgid "This tool could not get the requirements for %s: %s"
 msgstr "Esta ferramenta não pôde obter os requerimentos para %s: %s"
 
 #. TRANSLATORS: There was an error getting the dependencies for the package. The detailed error follows
-#: ../client/pk-console.c:1060
-#: ../client/pk-console.c:1068
+#: ../client/pk-console.c:1088
+#: ../client/pk-console.c:1096
 #, c-format
 msgid "This tool could not get the dependencies for %s: %s"
 msgstr "Esta ferramenta não pôde obter as dependências para %s: %s"
 
 #. TRANSLATORS: There was an error getting the details about the package. The detailed error follows
-#: ../client/pk-console.c:1090
-#: ../client/pk-console.c:1098
+#: ../client/pk-console.c:1118
+#: ../client/pk-console.c:1126
 #, c-format
 msgid "This tool could not get package details for %s: %s"
 msgstr "Esta ferramenta não pôde obter os detalhes do pacote para %s: %s"
 
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:1120
+#: ../client/pk-console.c:1148
 #, c-format
 msgid "This tool could not find the files for %s: %s"
 msgstr "Esta ferramenta não pôde localizar os arquivos para %s: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:1128
+#: ../client/pk-console.c:1156
 #, c-format
 msgid "This tool could not get the file list for %s: %s"
 msgstr "Esta ferramenta não pôde obter a lista de arquivos para %s: %s"
 
 #. TRANSLATORS: There was an error getting the list of packages. The filename follows
-#: ../client/pk-console.c:1150
+#: ../client/pk-console.c:1178
 #, c-format
 msgid "File already exists: %s"
 msgstr "O arquivo já existe: %s"
 
 #. TRANSLATORS: follows a list of packages to install
-#: ../client/pk-console.c:1155
-#: ../client/pk-console.c:1211
-#: ../client/pk-console.c:1286
+#: ../client/pk-console.c:1183
+#: ../client/pk-console.c:1239
+#: ../client/pk-console.c:1314
 msgid "Getting package list"
 msgstr "Obtendo lista de pacotes"
 
 #. TRANSLATORS: There was an error getting the list of packages. The detailed error follows
-#: ../client/pk-console.c:1161
-#: ../client/pk-console.c:1217
-#: ../client/pk-console.c:1292
+#: ../client/pk-console.c:1189
+#: ../client/pk-console.c:1245
+#: ../client/pk-console.c:1320
 #, c-format
 msgid "This tool could not get package list: %s"
 msgstr "Esta ferramente não pôde obter a lista de pacotes: %s"
 
 #. TRANSLATORS: There was an error saving the list
-#: ../client/pk-console.c:1172
+#: ../client/pk-console.c:1200
 #, c-format
 msgid "Failed to save to disk"
 msgstr "Falha ao salvar no disco"
 
 #. TRANSLATORS: There was an error getting the list. The filename follows
-#: ../client/pk-console.c:1206
-#: ../client/pk-console.c:1281
+#: ../client/pk-console.c:1234
+#: ../client/pk-console.c:1309
 #, c-format
 msgid "File does not exist: %s"
 msgstr "O arquivo não existe: %s"
 
 #. TRANSLATORS: header to a list of packages newly added
-#: ../client/pk-console.c:1238
+#: ../client/pk-console.c:1266
 msgid "Packages to add"
 msgstr "Pacotes a serem adicionados"
 
 #. TRANSLATORS: header to a list of packages removed
-#: ../client/pk-console.c:1246
+#: ../client/pk-console.c:1274
 msgid "Packages to remove"
 msgstr "Pacotes a serem removidos"
 
 #. TRANSLATORS: We didn't find any differences
-#: ../client/pk-console.c:1314
+#: ../client/pk-console.c:1342
 #, c-format
 msgid "No new packages need to be installed"
 msgstr "Nenhum pacote novo precisa ser instalado"
 
 #. TRANSLATORS: follows a list of packages to install
-#: ../client/pk-console.c:1320
+#: ../client/pk-console.c:1348
 msgid "To install"
 msgstr "Instalando"
 
 #. TRANSLATORS: searching takes some time....
-#: ../client/pk-console.c:1332
+#: ../client/pk-console.c:1360
 msgid "Searching for package: "
 msgstr "Pesquisando pelo pacote:"
 
 #. TRANSLATORS: package was not found -- this is the end of a string ended in ...
-#: ../client/pk-console.c:1336
+#: ../client/pk-console.c:1364
 msgid "not found."
 msgstr "não encontrado."
 
 #. TRANSLATORS: We didn't find any packages to install
-#: ../client/pk-console.c:1347
+#: ../client/pk-console.c:1375
 #, c-format
 msgid "No packages can be found to install"
 msgstr "Nenhum pacote pôde ser localizado para instalação"
 
 #. TRANSLATORS: installing new packages from package list
-#: ../client/pk-console.c:1353
+#. TRANSLATORS: we are now installing the debuginfo packages we found earlier
+#: ../client/pk-console.c:1381
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:868
+#, c-format
 msgid "Installing packages"
 msgstr "Instalando pacotes"
 
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:1389
+#: ../client/pk-console.c:1417
 #, c-format
 msgid "This tool could not find the update details for %s: %s"
 msgstr "Esta ferramenta não pôde localizar os detalhes de atualização para %s: %s"
 
 #. TRANSLATORS: There was an error getting the details about the update for the package. The detailed error follows
-#: ../client/pk-console.c:1397
+#: ../client/pk-console.c:1425
 #, c-format
 msgid "This tool could not get the update details for %s: %s"
 msgstr "Esta ferramenta não pôde obter os detalhes de atualização para %s: %s"
 
 #. TRANSLATORS: This was an unhandled error, and we don't have _any_ context
-#: ../client/pk-console.c:1443
+#: ../client/pk-console.c:1456
 msgid "Error:"
 msgstr "Erro:"
 
 #. TRANSLATORS: This a list of details about the package
-#: ../client/pk-console.c:1457
+#: ../client/pk-console.c:1470
 msgid "Package description"
 msgstr "Descrição do pacote"
 
 #. TRANSLATORS: This a message (like a little note that may be of interest) from the transaction
-#: ../client/pk-console.c:1473
+#: ../client/pk-console.c:1486
 msgid "Message:"
 msgstr "Mensagem:"
 
 #. TRANSLATORS: This a list files contained in the package
-#: ../client/pk-console.c:1501
+#: ../client/pk-console.c:1514
 msgid "Package files"
 msgstr "Arquivos do pacote"
 
 #. TRANSLATORS: This where the package has no files
-#: ../client/pk-console.c:1509
+#: ../client/pk-console.c:1522
 msgid "No files"
 msgstr "Nenhum arquivo"
 
 #. TRANSLATORS: This a request for a GPG key signature from the backend, which the client will prompt for later
-#: ../client/pk-console.c:1532
+#: ../client/pk-console.c:1545
 msgid "Repository signature required"
 msgstr "A assinatura do repositório é necessária"
 
 #. TRANSLATORS: This a prompt asking the user to import the security key
-#: ../client/pk-console.c:1542
+#: ../client/pk-console.c:1555
 msgid "Do you accept this signature?"
 msgstr "Você aceita essa assinatura?"
 
 #. TRANSLATORS: This is where the user declined the security key
-#: ../client/pk-console.c:1546
+#: ../client/pk-console.c:1559
 msgid "The signature was not accepted."
 msgstr "A assinatura não foi aceita."
 
 #. TRANSLATORS: This a request for a EULA
-#: ../client/pk-console.c:1580
+#: ../client/pk-console.c:1593
 msgid "End user license agreement required"
 msgstr "É necessário um contrato de licença para o usuário final"
 
 #. TRANSLATORS: This a prompt asking the user to agree to the license
-#: ../client/pk-console.c:1587
+#: ../client/pk-console.c:1600
 msgid "Do you agree to this license?"
 msgstr "Você concorda com a licença?"
 
 #. TRANSLATORS: This is where the user declined the license
-#: ../client/pk-console.c:1591
+#: ../client/pk-console.c:1604
 msgid "The license was refused."
 msgstr "A licença foi recusada."
 
 #. TRANSLATORS: This is when the daemon crashed, and we are up shit creek without a paddle
-#: ../client/pk-console.c:1620
+#: ../client/pk-console.c:1633
 msgid "The daemon crashed mid-transaction!"
 msgstr "O daemon travou no meio da transação!"
 
 #. TRANSLATORS: This is the header to the --help menu
-#: ../client/pk-console.c:1673
+#: ../client/pk-console.c:1686
 msgid "PackageKit Console Interface"
 msgstr "Interface em Console do PackageKit"
 
 #. these are commands we can use with pkcon
-#: ../client/pk-console.c:1675
+#: ../client/pk-console.c:1688
 msgid "Subcommands:"
 msgstr "Subcomandos:"
 
 #. TRANSLATORS: command line argument, if we should show debugging information
 #. TRANSLATORS: if we should show debugging data
-#: ../client/pk-console.c:1767
+#: ../client/pk-console.c:1780
 #: ../client/pk-generate-pack.c:185
 #: ../client/pk-monitor.c:125
-#: ../contrib/command-not-found/pk-command-not-found.c:518
-#: ../src/pk-main.c:199
+#: ../contrib/command-not-found/pk-command-not-found.c:521
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:532
+#: ../src/pk-main.c:211
 msgid "Show extra debugging information"
 msgstr "Mostrar informações extras de depuração"
 
 #. TRANSLATORS: command line argument, just show the version string
-#: ../client/pk-console.c:1770
+#: ../client/pk-console.c:1783
 #: ../client/pk-monitor.c:127
 msgid "Show the program version and exit"
 msgstr "Mostrar a versão do programa e sair"
 
 #. TRANSLATORS: command line argument, use a filter to narrow down results
-#: ../client/pk-console.c:1773
+#: ../client/pk-console.c:1786
 msgid "Set the filter, e.g. installed"
 msgstr "Definir o filtro, p. ex.: instalados"
 
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1776
+#: ../client/pk-console.c:1789
 msgid "Exit without waiting for actions to complete"
 msgstr "Sair sem esperar pelo término das ações"
 
 #. TRANSLATORS: This is when we could not connect to the system bus, and is fatal
-#: ../client/pk-console.c:1803
+#: ../client/pk-console.c:1816
 msgid "This tool could not connect to system DBUS."
 msgstr "Esta ferramenta não pôde conectar ao DBUS do sistema."
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1894
+#: ../client/pk-console.c:1905
 msgid "The filter specified was invalid"
 msgstr "O filtro especificado era inválido"
 
 #. TRANSLATORS: a search type can be name, details, file, etc
-#: ../client/pk-console.c:1912
+#: ../client/pk-console.c:1923
 msgid "A search type is required, e.g. name"
 msgstr "Um tipo de pesquisa é requerido, p. ex. nome"
 
 #. TRANSLATORS: the user needs to provide a search term
-#: ../client/pk-console.c:1918
-#: ../client/pk-console.c:1926
-#: ../client/pk-console.c:1934
-#: ../client/pk-console.c:1942
+#: ../client/pk-console.c:1929
+#: ../client/pk-console.c:1937
+#: ../client/pk-console.c:1945
+#: ../client/pk-console.c:1953
 msgid "A search term is required"
 msgstr "Um termo de pesquisa é requerido"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1948
+#: ../client/pk-console.c:1959
 msgid "Invalid search type"
 msgstr "Tipo de pesquisa inválido"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1954
+#: ../client/pk-console.c:1965
 msgid "A package name or filename to install is required"
 msgstr "O nome do pacote ou arquivo é requerido"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1962
+#: ../client/pk-console.c:1973
 msgid "A type, key_id and package_id are required"
 msgstr "Um tipo, key_id e package_id são requeridos"
 
 #. TRANSLATORS: the user did not specify what they wanted to remove
-#: ../client/pk-console.c:1970
+#: ../client/pk-console.c:1981
 msgid "A package name to remove is required"
 msgstr "O nome do pacote para remoção é requerido"
 
 #. TRANSLATORS: the user did not specify anything about what to download or where
-#: ../client/pk-console.c:1977
+#: ../client/pk-console.c:1988
 msgid "A destination directory and then the package names to download are required"
 msgstr "O diretório de destino seguido dos nomes dos pacotes a serem baixados é requerido"
 
 #. TRANSLATORS: the directory does not exist, so we can't continue
-#: ../client/pk-console.c:1983
+#: ../client/pk-console.c:1994
 msgid "Directory not found"
 msgstr "Diretório não encontrado"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1990
+#: ../client/pk-console.c:2001
 msgid "A licence identifier (eula-id) is required"
 msgstr "Um identificador de licença (eula-id) é requerido"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1999
+#: ../client/pk-console.c:2010
 msgid "A transaction identifier (tid) is required"
 msgstr "Um identificador de transação (tid) é requerido"
 
 #. TRANSLATORS: The user did not specify a package name
-#: ../client/pk-console.c:2015
+#: ../client/pk-console.c:2026
 msgid "A package name to resolve is required"
 msgstr "O nome de pacote a ser analisado é requerido"
 
 #. TRANSLATORS: The user did not specify a repository (software source) name
-#: ../client/pk-console.c:2023
-#: ../client/pk-console.c:2031
+#: ../client/pk-console.c:2034
+#: ../client/pk-console.c:2042
 msgid "A repository name is required"
 msgstr "O nome do repositório é requerido"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:2039
+#: ../client/pk-console.c:2050
 msgid "A repo name, parameter and value are required"
 msgstr "Um nome de repositório, parâmetro e um valor são requeridos"
 
 #. TRANSLATORS: The user didn't specify what action to use
-#: ../client/pk-console.c:2052
+#: ../client/pk-console.c:2063
 msgid "An action, e.g. 'update-system' is required"
 msgstr "Uma ação, p. ex. \"update-system\" é requerida"
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:2058
+#: ../client/pk-console.c:2069
 msgid "A correct role is required"
 msgstr "Um modo correto é requerido"
 
 #. TRANSLATORS: we keep a database updated with the time that an action was last executed
-#: ../client/pk-console.c:2064
+#: ../client/pk-console.c:2075
 msgid "Failed to get the time since this action was last completed"
 msgstr "Falha ao obter o tempo em que essa ação foi completada pela última vez"
 
 #. TRANSLATORS: The user did not provide a package name
 #. TRANSLATORS: This is when the user fails to supply the package name
-#: ../client/pk-console.c:2073
 #: ../client/pk-console.c:2084
-#: ../client/pk-console.c:2092
-#: ../client/pk-console.c:2108
-#: ../client/pk-console.c:2116
+#: ../client/pk-console.c:2095
+#: ../client/pk-console.c:2103
+#: ../client/pk-console.c:2119
+#: ../client/pk-console.c:2127
 #: ../client/pk-generate-pack.c:241
 msgid "A package name is required"
 msgstr "O nome do pacote é requerido"
 
 #. TRANSLATORS: each package "provides" certain things, e.g. mime(gstreamer-decoder-mp3), the user didn't specify it
-#: ../client/pk-console.c:2100
+#: ../client/pk-console.c:2111
 msgid "A package provide string is required"
 msgstr "É necessário especificar o que o pacote fornece"
 
 #. TRANSLATORS: The user didn't specify a filename to create as a list
-#: ../client/pk-console.c:2124
+#: ../client/pk-console.c:2135
 msgid "A list file name to create is required"
 msgstr "O nome de arquivo da lista a ser criada é requerido"
 
 #. TRANSLATORS: The user didn't specify a filename to open as a list
-#: ../client/pk-console.c:2133
-#: ../client/pk-console.c:2142
+#: ../client/pk-console.c:2144
+#: ../client/pk-console.c:2153
 msgid "A list file to open is required"
 msgstr "Uma lista de arquivos a serem abertos é requerida"
 
 #. TRANSLATORS: The user tried to use an unsupported option on the command line
-#: ../client/pk-console.c:2195
+#: ../client/pk-console.c:2206
 #, c-format
 msgid "Option '%s' is not supported"
 msgstr "A opção \"%s\" não é suportada"
 
 #. TRANSLATORS: User does not have permission to do this
-#: ../client/pk-console.c:2208
+#: ../client/pk-console.c:2219
 msgid "Incorrect privileges for this operation"
 msgstr "Privilégios incorretos para esta operação"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:2211
+#: ../client/pk-console.c:2222
 msgid "Command failed"
 msgstr "O comando falhou"
 
@@ -729,55 +757,60 @@ msgstr "Um diretório ou arquivo de saída é requerido"
 msgid "The package manager cannot perform this type of operation."
 msgstr "O gerenciador de pacotes não pode realizar este tipo de operação."
 
+#. TRANSLATORS: This is when the distro didn't include libarchive support into PK
+#: ../client/pk-generate-pack.c:280
+msgid "Service packs cannot be created as PackageKit was not built with libarchive support."
+msgstr "Os pacotes de serviço não podem ser criados já que o PackageKIt não foi compilado com suporte à libarchive."
+
 #. TRANSLATORS: the user specified an absolute path, but didn't get the extension correct
-#: ../client/pk-generate-pack.c:285
+#: ../client/pk-generate-pack.c:291
 msgid "If specifying a file, the service pack name must end with"
 msgstr "Se um arquivo for especificado, o nome do pacote de serviços deve terminar com"
 
 #. TRANSLATORS: This is when file already exists
-#: ../client/pk-generate-pack.c:301
+#: ../client/pk-generate-pack.c:307
 msgid "A pack with the same name already exists, do you want to overwrite it?"
 msgstr "Um pacote de serviços com o mesmo nome já existe, você deseja sobrescrevê-lo?"
 
 #. TRANSLATORS: This is when the pack was not overwritten
-#: ../client/pk-generate-pack.c:304
+#: ../client/pk-generate-pack.c:310
 msgid "The pack was not overwritten."
 msgstr "O pacote não foi sobrescrito"
 
 #. TRANSLATORS: This is when the temporary directory cannot be created, the directory name follows
-#: ../client/pk-generate-pack.c:317
+#: ../client/pk-generate-pack.c:323
 msgid "Failed to create directory:"
 msgstr "Falha ao criar o diretório:"
 
 #. TRANSLATORS: This is when the list of packages from the remote computer cannot be opened
-#: ../client/pk-generate-pack.c:327
+#: ../client/pk-generate-pack.c:333
 msgid "Failed to open package list."
 msgstr "Falha ao abrir a lista de pacotes"
 
 #. TRANSLATORS: The package name is being matched up to available packages
-#: ../client/pk-generate-pack.c:338
+#: ../client/pk-generate-pack.c:344
 msgid "Finding package name."
 msgstr "Localizando o nome do pacote."
 
 #. TRANSLATORS: This is when the package cannot be found in any software source. The detailed error follows
-#: ../client/pk-generate-pack.c:342
+#: ../client/pk-generate-pack.c:348
 #, c-format
 msgid "Failed to find package '%s': %s"
 msgstr "Falha ao localizar o pacote \"%s\": %s"
 
 #. TRANSLATORS: This is telling the user we are in the process of making the pack
-#: ../client/pk-generate-pack.c:359
+#: ../client/pk-generate-pack.c:365
 msgid "Creating service pack..."
 msgstr "Criando o pacote de serviços"
 
 #. TRANSLATORS: we succeeded in making the file
-#: ../client/pk-generate-pack.c:366
+#: ../client/pk-generate-pack.c:372
 #, c-format
 msgid "Service pack created '%s'"
 msgstr "Pacote de serviços \"%s\" criado"
 
 #. TRANSLATORS: we failed to make te file
-#: ../client/pk-generate-pack.c:371
+#: ../client/pk-generate-pack.c:377
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Falha ao criar \"%s\": %s"
@@ -809,128 +842,312 @@ msgid "Please enter a number from 1 to %i: "
 msgstr "Por favor, insira um número entre 1 e %i: "
 
 #. TRANSLATORS: we failed to find the package, this shouldn't happen
-#: ../contrib/command-not-found/pk-command-not-found.c:369
+#: ../contrib/command-not-found/pk-command-not-found.c:372
 msgid "Failed to search for file"
 msgstr "Falha ao pesquisar pelo arquivo"
 
 #. TRANSLATORS: we failed to launch the executable, the error follows
-#: ../contrib/command-not-found/pk-command-not-found.c:493
+#: ../contrib/command-not-found/pk-command-not-found.c:496
 msgid "Failed to launch:"
 msgstr "Falha ao executar:"
 
 #. TRANSLATORS: tool that gets called when the command is not found
-#: ../contrib/command-not-found/pk-command-not-found.c:534
+#: ../contrib/command-not-found/pk-command-not-found.c:537
 msgid "PackageKit Command Not Found"
 msgstr "Comando do PackageKit não localizado"
 
 #. TRANSLATORS: the prefix of all the output telling the user why it's not executing
-#: ../contrib/command-not-found/pk-command-not-found.c:556
+#: ../contrib/command-not-found/pk-command-not-found.c:560
 msgid "Command not found."
 msgstr "Comando não localizado."
 
 #. TRANSLATORS: tell the user what we think the command is
-#: ../contrib/command-not-found/pk-command-not-found.c:563
+#: ../contrib/command-not-found/pk-command-not-found.c:567
 msgid "Similar command is:"
 msgstr "O comando similar é:"
 
 #. TRANSLATORS: Ask the user if we should run the similar command
-#: ../contrib/command-not-found/pk-command-not-found.c:572
+#: ../contrib/command-not-found/pk-command-not-found.c:576
 msgid "Run similar command:"
 msgstr "Executar comando similar:"
 
 #. TRANSLATORS: show the user a list of commands that they could have meant
 #. TRANSLATORS: show the user a list of commands we could run
-#: ../contrib/command-not-found/pk-command-not-found.c:584
-#: ../contrib/command-not-found/pk-command-not-found.c:593
+#: ../contrib/command-not-found/pk-command-not-found.c:588
+#: ../contrib/command-not-found/pk-command-not-found.c:597
 msgid "Similar commands are:"
 msgstr "Os comandos similares são:"
 
 #. TRANSLATORS: ask the user to choose a file to run
-#: ../contrib/command-not-found/pk-command-not-found.c:600
+#: ../contrib/command-not-found/pk-command-not-found.c:604
 msgid "Please choose a command to run"
 msgstr "Por favor, escolha um comando a ser executado"
 
 #. TRANSLATORS: tell the user what package provides the command
-#: ../contrib/command-not-found/pk-command-not-found.c:615
+#: ../contrib/command-not-found/pk-command-not-found.c:619
 msgid "The package providing this file is:"
 msgstr "O pacote que fornece esse arquivo é:"
 
 #. TRANSLATORS: as the user if we want to install a package to provide the command
-#: ../contrib/command-not-found/pk-command-not-found.c:620
+#: ../contrib/command-not-found/pk-command-not-found.c:624
 #, c-format
 msgid "Install package '%s' to provide command '%s'?"
 msgstr "Instalar pacote \"%s\" para fornecer o comando \"%s\"?"
 
 #. TRANSLATORS: Show the user a list of packages that provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:641
+#: ../contrib/command-not-found/pk-command-not-found.c:645
 msgid "Packages providing this file are:"
 msgstr "Os pacotes que fornecem esse arquivo são:"
 
 #. TRANSLATORS: Show the user a list of packages that they can install to provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:650
+#: ../contrib/command-not-found/pk-command-not-found.c:654
 msgid "Suitable packages are:"
 msgstr "Os pacotes apropriados são:"
 
 #. get selection
 #. TRANSLATORS: ask the user to choose a file to install
-#: ../contrib/command-not-found/pk-command-not-found.c:658
+#: ../contrib/command-not-found/pk-command-not-found.c:662
 msgid "Please choose a package to install"
 msgstr "Por favor, escolha um pacote a ser instalado"
 
 #. TRANSLATORS: when we are getting data from the daemon
-#: ../contrib/browser-plugin/src/contents.cpp:298
+#: ../contrib/browser-plugin/pk-plugin-install.c:461
 msgid "Getting package information..."
 msgstr "Obtendo informações do pacote..."
 
 #. TRANSLATORS: run an applicaiton
-#: ../contrib/browser-plugin/src/contents.cpp:304
+#: ../contrib/browser-plugin/pk-plugin-install.c:467
 #, c-format
 msgid "Run %s"
 msgstr "Executar %s"
 
 #. TRANSLATORS: show the installed version of a package
-#: ../contrib/browser-plugin/src/contents.cpp:310
+#: ../contrib/browser-plugin/pk-plugin-install.c:473
 msgid "Installed version"
 msgstr "Versão instalada"
 
 #. TRANSLATORS: run the application now
-#: ../contrib/browser-plugin/src/contents.cpp:318
+#: ../contrib/browser-plugin/pk-plugin-install.c:481
 #, c-format
 msgid "Run version %s now"
 msgstr "Executar a versão %s agora"
 
 #. TRANSLATORS: run the application now
-#: ../contrib/browser-plugin/src/contents.cpp:324
+#: ../contrib/browser-plugin/pk-plugin-install.c:487
 msgid "Run now"
 msgstr "Executar agora"
 
 #. TRANSLATORS: update to a new version of the package
-#: ../contrib/browser-plugin/src/contents.cpp:330
+#: ../contrib/browser-plugin/pk-plugin-install.c:493
 #, c-format
 msgid "Update to version %s"
 msgstr "Atualizar para a versão %s"
 
 #. TRANSLATORS: To install a package
-#: ../contrib/browser-plugin/src/contents.cpp:336
+#: ../contrib/browser-plugin/pk-plugin-install.c:499
 #, c-format
 msgid "Install %s now"
 msgstr "Instalar %s agora"
 
 #. TRANSLATORS: the version of the package
-#: ../contrib/browser-plugin/src/contents.cpp:339
+#: ../contrib/browser-plugin/pk-plugin-install.c:502
 msgid "Version"
 msgstr "Versão"
 
 #. TRANSLATORS: noting found, so can't install
-#: ../contrib/browser-plugin/src/contents.cpp:344
+#: ../contrib/browser-plugin/pk-plugin-install.c:507
 msgid "No packages found for your system"
 msgstr "Nenhum pacote localizado para o seu sistema"
 
 #. TRANSLATORS: package is being installed
-#: ../contrib/browser-plugin/src/contents.cpp:349
+#: ../contrib/browser-plugin/pk-plugin-install.c:512
 msgid "Installing..."
 msgstr "Instalando..."
 
+#. TRANSLATORS: we are starting to install the packages
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:186
+msgid "Starting install"
+msgstr "Iniciando a instalação"
+
+#. TRANSLATORS: we couldn't find the package name, non-fatal
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:379
+#, c-format
+msgid "Failed to find the package %s, or already installed: %s"
+msgstr "Falha ao localizar o pacote %s ou ele já está instalado: %s"
+
+#. command line argument, simulate what would be done, but don't actually do it
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:535
+msgid "Don't actually install any packages, only simulate what would be installed"
+msgstr "Não instala os pacotes na realidade, apenas simula o que seria instalado"
+
+#. command line argument, do we skip packages that depend on the ones specified
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:538
+msgid "Do not install dependencies of the core packages"
+msgstr "Não instala dependências dos pacotes principais"
+
+#. command line argument, do we operate quietly
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:541
+msgid "Do not display information or progress"
+msgstr "Não exibe informações ou o progresso"
+
+#. TRANSLATORS: tool that gets called when the command is not found
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:559
+msgid "PackageKit Debuginfo Installer"
+msgstr "Instalador de Informações de Depuração do PackageKit"
+
+#. TRANSLATORS: the use needs to specify a list of package names on the command line
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:571
+#, c-format
+msgid "ERROR: Specify package names to install."
+msgstr "ERRO: Especifique os nomes dos pacotes a serem instalados."
+
+#. TRANSLATORS: we are getting the list of repositories
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:605
+#, c-format
+msgid "Getting sources list"
+msgstr "Obtendo lista de fontes"
+
+#. TRANSLATORS: all completed 100%
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:623
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:663
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:698
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:782
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:826
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:893
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:937
+#, c-format
+msgid "OK."
+msgstr "OK."
+
+#. TRANSLATORS: tell the user what we found
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:626
+#, c-format
+msgid "Found %i enabled and %i disabled sources."
+msgstr "Localizadas %i fontes habilitadas e %i desabilitadas."
+
+#. TRANSLATORS: we're finding repositories that match out pattern
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:633
+#, c-format
+msgid "Finding debugging sources"
+msgstr "Localizando fontes de depuração"
+
+#. TRANSLATORS: tell the user what we found
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:666
+#, c-format
+msgid "Found %i disabled debuginfo repos."
+msgstr "%i repositórios de informações de depuração desabilitados encontrados"
+
+#. TRANSLATORS: we're now enabling all the debug sources we found
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:673
+#, c-format
+msgid "Enabling debugging sources"
+msgstr "Habilitando fontes de depuração"
+
+#. TRANSLATORS: operation was not successful
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:683
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:767
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:811
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:878
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:922
+msgid "FAILED."
+msgstr "FALHOU."
+
+#. TRANSLATORS: tell the user how many we enabled
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:701
+#, c-format
+msgid "Enabled %i debugging sources."
+msgstr "%i fontes de depuração habilitadas."
+
+#. TRANSLATORS: we're now finding packages that match in all the repos
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:708
+#, c-format
+msgid "Finding debugging packages"
+msgstr "Localizando pacotes de depuração"
+
+#. TRANSLATORS: we couldn't find the package name, non-fatal
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:720
+#, c-format
+msgid "Failed to find the package %s: %s"
+msgstr "Falha ao localizar o pacote %s: %s"
+
+#. TRANSLATORS: we couldn't find the debuginfo package name, non-fatal
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:743
+#, c-format
+msgid "Failed to find the debuginfo package %s: %s"
+msgstr "Falha ao localizar o pacote de depuração %s: %s"
+
+#. TRANSLATORS: no debuginfo packages could be found to be installed
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:771
+#, c-format
+msgid "Found no packages to install."
+msgstr "Nenhum pacote localizado para ser instalado."
+
+#. TRANSLATORS: tell the user we found some packages, and then list them
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:785
+#, c-format
+msgid "Found %i packages:"
+msgstr "%i pacotes localizados:"
+
+#. TRANSLATORS: tell the user we are searching for deps
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:801
+#, c-format
+msgid "Finding packages that depend on these packages"
+msgstr "Localizando pacotes que dependem destes pacotes"
+
+#. TRANSLATORS: could not install, detailed error follows
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:814
+#, c-format
+msgid "Could not find dependant packages: %s"
+msgstr "Não foi possível localizar os pacotes dependentes: %s"
+
+#. TRANSLATORS: tell the user we found some more packages
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:830
+#, c-format
+msgid "Found %i extra packages."
+msgstr "%i pacotes extras localizados."
+
+#. TRANSLATORS: tell the user we found some more packages
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:834
+#, c-format
+msgid "No extra packages required."
+msgstr "Nenhum pacote extra é requerido."
+
+#. TRANSLATORS: tell the user we found some packages (and deps), and then list them
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:843
+#, c-format
+msgid "Found %i packages to install:"
+msgstr "%i pacotes localizados para serem instalados:"
+
+#. TRANSLATORS: simulate mode is a testing mode where we quit before the action
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:856
+#, c-format
+msgid "Not installing packages in simulate mode"
+msgstr "Os pacotes não serão instalados no modo de simulação"
+
+#. TRANSLATORS: coul dnot install, detailed error follows
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:881
+#, c-format
+msgid "Could not install packages: %s"
+msgstr "Não foi possível instalar os pacotes: %s"
+
+#. TRANSLATORS: we are now disabling all debuginfo repos we previously enabled
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:913
+#, c-format
+msgid "Disabling sources previously enabled"
+msgstr "Desabilitando fontes habilitadas anteriormente"
+
+#. TRANSLATORS: no debuginfo packages could be found to be installed, detailed error follows
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:925
+#, c-format
+msgid "Could not disable the debugging sources: %s"
+msgstr "Não foi possível desabilitar as fontes de depuração: %s"
+
+#. TRANSLATORS: we disabled all the debugging repos that we enabled before
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:940
+#, c-format
+msgid "Disabled %i debugging sources."
+msgstr "%i fontes de depuração desabilitadas."
+
 #: ../data/packagekit-catalog.xml.in.h:1
 msgid "PackageKit Catalog"
 msgstr "Catálogo do PackageKit"
@@ -943,91 +1160,154 @@ msgstr "Lista de Pacotes do PackageKit"
 msgid "PackageKit Service Pack"
 msgstr "Pacote de serviços do PackageKit"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:1
+#. SECURITY:
+#. - Normal users do not require admin authentication to accept new
+#. licence agreements.
+#. - Change this to 'auth_admin' for environments where users should not
+#. be given the option to make legal decisions.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:7
 msgid "Accept EULA"
 msgstr "Aceitar a licença EULA"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:2
+#: ../policy/org.freedesktop.packagekit.policy.in.h:8
 msgid "Authentication is required to accept a EULA"
 msgstr "É necessário autenticar para aceitar uma licença EULA"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:3
+#: ../policy/org.freedesktop.packagekit.policy.in.h:9
 msgid "Authentication is required to cancel a task that was not started by yourself"
 msgstr "É necessário autenticar para cancelar uma tarefa que não foi iniciada por você"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:4
+#: ../policy/org.freedesktop.packagekit.policy.in.h:10
 msgid "Authentication is required to change software source parameters"
 msgstr "É necessário autenticar para alterar os parâmetros das fontes de programas"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:5
+#: ../policy/org.freedesktop.packagekit.policy.in.h:11
 msgid "Authentication is required to consider a key used for signing packages as trusted"
 msgstr "É necessário autenticar para considerar uma chave usada para assinar pacotes como confiáveis"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:6
+#: ../policy/org.freedesktop.packagekit.policy.in.h:12
 msgid "Authentication is required to install a signed package"
 msgstr "É necessário autenticar para instalar um pacote assinado"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:7
+#: ../policy/org.freedesktop.packagekit.policy.in.h:13
 msgid "Authentication is required to install an untrusted package"
 msgstr "É necessário autenticar para instalar um pacote não confiável"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:8
+#: ../policy/org.freedesktop.packagekit.policy.in.h:14
 msgid "Authentication is required to refresh the system sources"
 msgstr "É necessário autenticar para recarregar as fontes do sistema"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:9
+#: ../policy/org.freedesktop.packagekit.policy.in.h:15
 msgid "Authentication is required to remove packages"
 msgstr "É necessário autenticar para remover pacotes"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:10
+#: ../policy/org.freedesktop.packagekit.policy.in.h:16
 msgid "Authentication is required to rollback a transaction"
 msgstr "É necessário autenticar para retroceder uma transação"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:11
+#: ../policy/org.freedesktop.packagekit.policy.in.h:17
 msgid "Authentication is required to set the network proxy used for downloading packages"
 msgstr "É necessário autenticar para definir o proxy de rede usado para baixar pacotes"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+#: ../policy/org.freedesktop.packagekit.policy.in.h:18
 msgid "Authentication is required to update packages"
 msgstr "É necessário autenticar para atualizar os pacotes"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:13
+#. SECURITY:
+#. - Normal users are allowed to cancel their own task without
+#. authentication, but a different user id needs the admin password
+#. to cancel another users task.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:24
 msgid "Cancel foreign task"
 msgstr "Cancelar tarefa externa"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:14
+#. SECURITY:
+#. - Normal users require admin authentication to enable or disable
+#. software sources as this can be used to enable new updates or
+#. install different versions of software.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:30
 msgid "Change software source parameters"
 msgstr "Altere parâmetros das fontes de programas"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:15
+#. SECURITY:
+#. - Normal users do not need authentication to install signed packages
+#. from signed repositories, as this cannot exploit a system.
+#. - Paranoid users (or parents!) can change this to 'auth_admin' or
+#. 'auth_admin_keep'.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:37
 msgid "Install signed package"
 msgstr "Instalar pacote assinado"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:16
+#. SECURITY:
+#. - Normal users require admin authentication to install untrusted or
+#. unrecognised packages, as allowing users to do this without a
+#. password would be a massive security hole.
+#. - This is not retained as each package should be authenticated.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:44
 msgid "Install untrusted local file"
 msgstr "Instalar arquivo local não confiável"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:17
+#. SECURITY:
+#. - Normal users do not require admin authentication to refresh the
+#. cache, as this doesn't actually install or remove software.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:49
 msgid "Refresh system sources"
 msgstr "Recarregar fontes do sistema"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:18
+#. SECURITY:
+#. - Normal users require admin authentication to remove packages as
+#. this can make the system unbootable or stop other applications from
+#. working.
+#. - Be sure to close the tool used to remove the packages after the
+#. admin authentication has been obtained, otherwise packages can still
+#. be removed. If this is not possible, change this authentication to
+#. 'auth_admin'.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:59
 msgid "Remove package"
 msgstr "Remover pacote"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:19
+#. SECURITY:
+#. - Normal users require admin authentication to rollback system state
+#. as this will change a large number of packages, and could expose the
+#. system to previously patched security vulnerabilities.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:65
 msgid "Rollback to a previous transaction"
 msgstr "Retroceder para uma transação anterior"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:20
+#. SECURITY:
+#. - Normal users do not require admin authentication to set the proxy
+#. used for downloading packages.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:70
 msgid "Set network proxy"
 msgstr "Definir um proxy de rede"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:21
+#. SECURITY:
+#. - Normal users require admin authentication to add signing keys.
+#. - This implies adding an explicit trust, and should not be granted
+#. without a secure authentication.
+#. - This is not kept as each package should be authenticated.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:77
 msgid "Trust a key used for signing packages"
 msgstr "Confiar numa chave usada para assinar pacotes"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:22
+#. SECURITY:
+#. - Normal users do not require admin authentication to update the
+#. system as the packages will be signed, and the action is required
+#. to update the system when unattended.
+#. - Changing this to anything other than 'yes' will break unattended
+#. updates.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:85
 msgid "Update packages"
 msgstr "Atualizar pacotes"
 
@@ -1052,51 +1332,81 @@ msgid "The org.freedesktop.PackageKit.conf file is not installed in the system d
 msgstr "O arquivo org.freedesktop.PackageKit.conf não está instalado no diretório do sistema:"
 
 #. TRANSLATORS: a backend is the system package tool, e.g. yum, apt
-#: ../src/pk-main.c:193
+#: ../src/pk-main.c:205
 msgid "Packaging backend to use, e.g. dummy"
 msgstr "O backend de empacotamento a ser utilizado, p. ex.: dummy"
 
 #. TRANSLATORS: if we should run in the background
-#: ../src/pk-main.c:196
+#: ../src/pk-main.c:208
 msgid "Daemonize and detach from the terminal"
 msgstr "Tornar um daemon e separar do terminal"
 
 #. TRANSLATORS: if we should not monitor how long we are inactive for
-#: ../src/pk-main.c:202
+#: ../src/pk-main.c:214
 msgid "Disable the idle timer"
 msgstr "Desabilitar o tempo de ociosidade"
 
 #. TRANSLATORS: show version
-#: ../src/pk-main.c:205
+#: ../src/pk-main.c:217
 msgid "Show version and exit"
 msgstr "Mostrar a versão e sair"
 
 #. TRANSLATORS: exit after we've started up, used for user profiling
-#: ../src/pk-main.c:208
+#: ../src/pk-main.c:220
 msgid "Exit after a small delay"
 msgstr "Sair após um pequeno atraso"
 
 #. TRANSLATORS: exit straight away, used for automatic profiling
-#: ../src/pk-main.c:211
+#: ../src/pk-main.c:223
 msgid "Exit after the engine has loaded"
 msgstr "Sair após o carregamento do mecanismo"
 
 #. TRANSLATORS: describing the service that is running
-#: ../src/pk-main.c:226
+#: ../src/pk-main.c:238
 msgid "PackageKit service"
 msgstr "Serviço do PackageKit"
 
 #. TRANSLATORS: fatal error, dbus is not running
-#: ../src/pk-main.c:263
+#: ../src/pk-main.c:275
 msgid "Cannot connect to the system bus"
 msgstr "Não foi possível conectar ao barramento do sistema"
 
-#. TRANSLATORS: cannot register on system bus, unknown reason
-#: ../src/pk-main.c:313
-#, c-format
+#. TRANSLATORS: cannot register on system bus, unknown reason -- geeky error follows
+#: ../src/pk-main.c:331
 msgid "Error trying to start:"
 msgstr "Erro ao tentar iniciar:"
 
+#: ../src/pk-polkit-action-lookup.c:143
+msgid "To install debugging packages, extra sources need to be enabled"
+msgstr "Fontes extras precisam ser habilitadas para a instalação dos pacotes de depuração"
+
+#. TRANSLATORS: is not GPG signed
+#: ../src/pk-polkit-action-lookup.c:156
+#: ../src/pk-polkit-action-lookup.c:175
+msgid "The software is not from a trusted source."
+msgstr "O programa não vem de uma fonte confiável."
+
+#. TRANSLATORS: user has to trust provider -- I know, this sucks
+#: ../src/pk-polkit-action-lookup.c:160
+msgid "Do not update this package unless you are sure it is safe to do so."
+msgstr "Não atualize este pacote a não ser que você esteja certo de que é seguro fazer isso."
+
+#. TRANSLATORS: warn the user that all bets are off
+#: ../src/pk-polkit-action-lookup.c:164
+#: ../src/pk-polkit-action-lookup.c:183
+msgid "Malicious software can damage your computer or cause other harm."
+msgstr "Programas maliciosos podem danificar o seu computador ou causar outros prejuízos."
+
+#. TRANSLATORS: user has to trust provider -- I know, this sucks
+#: ../src/pk-polkit-action-lookup.c:179
+msgid "Do not install this package unless you are sure it is safe to do so."
+msgstr "Não instale este pacote a não ser que você esteja certo de que é seguro fazer isso."
+
+#. TRANSLATORS: if the transaction is forced to install only trusted packages
+#: ../src/pk-polkit-action-lookup.c:263
+msgid "Only trusted"
+msgstr "Somente confiáveis"
+
 #~ msgid "The action, one of 'create', 'add', or 'remove'"
 #~ msgstr "A ação, uma entre as opções \"create\", \"add\" ou \"remove\""
 #~ msgid "Main cache file to use (if not specififed, default is used)"
@@ -1119,8 +1429,6 @@ msgstr "Erro ao tentar iniciar:"
 #~ msgstr "Você precisa especificar um tipo de pesquisa, p. ex. nome"
 #~ msgid "You need to specify a search term"
 #~ msgstr "Você precisa especificar um termo de pesquisa"
-#~ msgid "You need to specify a package or file to install"
-#~ msgstr "Você precisa especificar um pacote ou programa a ser instalado"
 #~ msgid "You need to specify a package to remove"
 #~ msgstr "Você precisa especificar um pacote a ser removido"
 #~ msgid "You need to specify a package name to resolve"
@@ -1165,8 +1473,6 @@ msgstr "Erro ao tentar iniciar:"
 #~ msgstr "Não foi possível localizar quais pacotes necessitam desse pacote"
 #~ msgid "Could not find details for"
 #~ msgstr "Não foi possível localizar os detalhes para"
-#~ msgid "Could not find a package match"
-#~ msgstr "Não foi possível encontrar um pacote correspondente"
 #~ msgid "failed to download: invalid package_id and/or directory"
 #~ msgstr "falha ao baixar: package_id e/ou diretório inválidos"
 #~ msgid "Could not find a valid metadata file"
commit ee770ab5714dc36d3d9dec3a9686d119658f6d43
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 15 16:54:42 2009 +0100

    Remove all instances of atoi, it's just not secure

diff --git a/lib/packagekit-glib/egg-string.c b/lib/packagekit-glib/egg-string.c
index 2e860df..e92526c 100644
--- a/lib/packagekit-glib/egg-string.c
+++ b/lib/packagekit-glib/egg-string.c
@@ -85,7 +85,7 @@ egg_strnumber (const gchar *text)
 /**
  * egg_strtoint:
  * @text: The text the convert
- * @value: The return numeric return value, or 0 if invalid.
+ * @value: The return numeric return value
  *
  * Converts a string into a signed integer value in a safe way.
  *
@@ -94,21 +94,29 @@ egg_strnumber (const gchar *text)
 gboolean
 egg_strtoint (const gchar *text, gint *value)
 {
-	gboolean ret;
-	ret = egg_strnumber (text);
-	if (!ret) {
-		*value = 0;
+	gchar *endptr = NULL;
+	gint64 value_raw;
+
+	/* parse */
+	value_raw = g_ascii_strtoll (text, &endptr, 10);
+
+	/* parsing error */
+	if (endptr == text)
 		return FALSE;
-	}
-	/* ITS4: ignore, we've already checked for validity */
-	*value = atoi (text);
+
+	/* out of range */
+	if (value_raw > G_MAXINT || value_raw < G_MININT)
+		return FALSE;
+
+	/* cast back down to value */
+	*value = (gint) value_raw;
 	return TRUE;
 }
 
 /**
  * egg_strtouint:
  * @text: The text the convert
- * @value: The return numeric return value, or 0 if invalid.
+ * @value: The return numeric return value
  *
  * Converts a string into a unsigned integer value in a safe way.
  *
@@ -117,14 +125,22 @@ egg_strtoint (const gchar *text, gint *value)
 gboolean
 egg_strtouint (const gchar *text, guint *value)
 {
-	gboolean ret;
-	gint temp;
-	ret = egg_strtoint (text, &temp);
-	if (ret == FALSE || temp < 0) {
-		*value = 0;
+	gchar *endptr = NULL;
+	guint64 value_raw;
+
+	/* parse */
+	value_raw = g_ascii_strtoull (text, &endptr, 10);
+
+	/* parsing error */
+	if (endptr == text)
 		return FALSE;
-	}
-	*value = (guint) temp;
+
+	/* out of range */
+	if (value_raw > G_MAXINT)
+		return FALSE;
+
+	/* cast back down to value */
+	*value = (guint) value_raw;
 	return TRUE;
 }
 
@@ -513,7 +529,7 @@ egg_string_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "don't convert invalid number");
 	ret = egg_strtoint ("dave", &value);
-	if (ret == FALSE && value == 0)
+	if (!ret)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "value is %i", value);
@@ -529,7 +545,7 @@ egg_string_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "convert invalid uint number");
 	ret = egg_strtouint ("-234", &uvalue);
-	if (ret == FALSE && uvalue == 0)
+	if (ret == FALSE)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "value is %i", uvalue);
diff --git a/src/pk-lsof.c b/src/pk-lsof.c
index 1211cc9..eeb7c7d 100644
--- a/src/pk-lsof.c
+++ b/src/pk-lsof.c
@@ -28,6 +28,7 @@
 #include <glib.h>
 
 #include "egg-debug.h"
+#include "egg-string.h"
 
 #include "pk-lsof.h"
 
@@ -175,7 +176,14 @@ pk_lsof_refresh (PkLsof *lsof)
 		value = &lines[i][1];
 		switch (mode) {
 		case 'p':
-			pid = atoi (value);
+
+			/* parse PID */
+			ret = egg_strtoint (value, &pid);
+			if (!ret) {
+				egg_warning ("failed to parse pid: '%s'", value);
+				pid = -1;
+				goto out;
+			}
 			break;
 		case 'f':
 			type = pk_lsof_type_from_text (value);
@@ -184,6 +192,10 @@ pk_lsof_refresh (PkLsof *lsof)
 			if (type == PK_LSOF_TYPE_DEL ||
 			    type == PK_LSOF_TYPE_MEM) {
 
+				/* no valid pid found */
+				if (pid == -1)
+					break;
+
 				/* not a system library */
 				if (strstr (value, "/lib/") == NULL)
 					break;
@@ -202,6 +214,7 @@ pk_lsof_refresh (PkLsof *lsof)
 			break;
 		}
 	}
+	ret = TRUE;
 out:
 	g_strfreev (lines);
 	g_free (stdout);
diff --git a/src/pk-transaction-extra.c b/src/pk-transaction-extra.c
index fdeeef3..d69b2c3 100644
--- a/src/pk-transaction-extra.c
+++ b/src/pk-transaction-extra.c
@@ -606,11 +606,20 @@ pk_transaction_extra_update_process_list (PkTransactionExtra *post)
 		if (!ret)
 			goto out;
 
-		/* is run by our UID */
-		uid = atoi (contents);
+		/* parse UID */
+		ret = egg_strtouint (contents, &uid);
+		if (!ret) {
+			egg_warning ("failed to parse uid: '%s'", contents);
+			goto out;
+		}
+
+		/* parse PID */
+		ret = egg_strtoint (name, &pid);
+		if (!ret) {
+			egg_warning ("failed to parse pid: '%s'", name);
+			goto out;
+		}
 
-		/* get the exec for the pid */
-		pid = atoi (name);
 #ifdef USE_SECURITY_POLKIT
 		exec = dkp_post_trans_get_cmdline (pid);
 		if (exec == NULL)
@@ -826,7 +835,11 @@ pk_transaction_extra_get_uid (PkTransactionExtra *post, guint pid)
 	}
 
 	/* convert from text */
-	uid = atoi (uid_text);
+	ret = egg_strtoint (uid_text, &uid);
+	if (!ret) {
+		egg_warning ("failed to parse uid: '%s'", uid_text);
+		goto out;
+	}
 out:
 	g_free (filename);
 	g_free (uid_text);
commit 5a94f45917e0d6e144a8cfb2fef8c26923e3553b
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 15 15:19:48 2009 +0100

    Allow a NULL object in the PkClientPool functions

diff --git a/lib/packagekit-glib/pk-client-pool.c b/lib/packagekit-glib/pk-client-pool.c
index 0ff84f8..54fd7ea 100644
--- a/lib/packagekit-glib/pk-client-pool.c
+++ b/lib/packagekit-glib/pk-client-pool.c
@@ -92,6 +92,7 @@ pk_client_pool_remove (PkClientPool *pool, PkClient *client)
 	guint i;
 
 	g_return_val_if_fail (PK_IS_CLIENT_POOL (pool), FALSE);
+	g_return_val_if_fail (client != NULL, FALSE);
 
 	egg_debug ("client %p removed from pool", client);
 	ret = g_ptr_array_remove (pool->priv->client_array, client);
@@ -187,7 +188,9 @@ out:
 static void
 pk_client_pool_free_obj (PkClientPoolObj *obj)
 {
-	g_object_unref (obj->object);
+	/* only unref the object if it is valid */
+	if (obj->object != NULL)
+		g_object_unref (obj->object);
 	g_free (obj->signal_name);
 	g_free (obj);
 }
@@ -209,6 +212,9 @@ pk_client_pool_disconnect (PkClientPool *pool, const gchar *signal_name)
 	PkClientPoolObj *obj;
 	guint i;
 
+	g_return_val_if_fail (PK_IS_CLIENT_POOL (pool), FALSE);
+	g_return_val_if_fail (signal_name != NULL, FALSE);
+
 	/* find signal name */
 	obj = pk_client_pool_find_obj (pool, signal_name);
 	if (obj == NULL) {
@@ -253,6 +259,7 @@ pk_client_pool_connect (PkClientPool *pool, const gchar *signal_name, GCallback
 	gboolean ret = TRUE;
 
 	g_return_val_if_fail (PK_IS_CLIENT_POOL (pool), FALSE);
+	g_return_val_if_fail (signal_name != NULL, FALSE);
 
 	/* check if signal has already been added */
 	obj = pk_client_pool_find_obj (pool, signal_name);
@@ -274,7 +281,10 @@ pk_client_pool_connect (PkClientPool *pool, const gchar *signal_name, GCallback
 	obj = g_new0 (PkClientPoolObj, 1);
 	obj->signal_name = g_strdup (signal_name);
 	obj->c_handler = c_handler;
-	obj->object = g_object_ref (object);
+	obj->object = NULL;
+	/* only ref the object if it is valid */
+	if (object != NULL)
+		obj->object = g_object_ref (object);
 	g_ptr_array_add (pool->priv->obj_array, obj);
 out:
 	return ret;
commit 960f010f9b6af0c173bddd6e741111f11be71948
Merge: ff1e67a... 41f47ba...
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 15 15:05:54 2009 +0100

    Merge branch 'master' of git+ssh://hughsie@git.packagekit.org/srv/git/PackageKit

commit ff1e67aa127d8b7183b406675c36014514492d1c
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 15 15:05:10 2009 +0100

    plugin: use PkClientPool in the browser plugin

diff --git a/contrib/browser-plugin/pk-plugin-install.c b/contrib/browser-plugin/pk-plugin-install.c
index 7d18d4c..e138d9a 100644
--- a/contrib/browser-plugin/pk-plugin-install.c
+++ b/contrib/browser-plugin/pk-plugin-install.c
@@ -55,7 +55,7 @@ struct PkPluginInstallPrivate
 	gchar			*display_name;
 	gchar			**package_names;
 	PangoLayout		*pango_layout;
-	GPtrArray		*clients;
+	PkClientPool		*client_pool;
 	DBusGProxy		*install_package_proxy;
 	DBusGProxyCall		*install_package_call;
 };
@@ -254,8 +254,6 @@ pk_plugin_install_package_cb (PkClient *client, const PkPackageObj *obj, PkPlugi
 	}
 }
 
-static void pk_plugin_install_remove_client (PkPluginInstall *self, PkClient *client);
-
 /**
  * pk_plugin_install_error_code_cb:
  **/
@@ -263,14 +261,11 @@ static void
 pk_plugin_install_error_code_cb (PkClient *client, PkErrorCodeEnum code, const gchar *details, PkPluginInstall *self)
 {
 	pk_warning ("Error getting data from PackageKit: %s\n", details);
-	pk_plugin_install_remove_client (self, client);
 
-	if (self->priv->clients->len == 0) {
-		if (self->priv->status == IN_PROGRESS) {
-			pk_plugin_install_set_status (self, UNAVAILABLE);
-			pk_plugin_install_clear_layout (self);
-			pk_plugin_install_refresh (self);
-		}
+	if (self->priv->status == IN_PROGRESS) {
+		pk_plugin_install_set_status (self, UNAVAILABLE);
+		pk_plugin_install_clear_layout (self);
+		pk_plugin_install_refresh (self);
 	}
 }
 
@@ -280,35 +275,10 @@ pk_plugin_install_error_code_cb (PkClient *client, PkErrorCodeEnum code, const g
 static void
 pk_plugin_install_finished_cb (PkClient *client, PkExitEnum exit, guint runtime, PkPluginInstall *self)
 {
-	pk_plugin_install_remove_client (self, client);
-
-	if (self->priv->clients->len == 0) {
-		if (self->priv->status == IN_PROGRESS) {
-			pk_plugin_install_set_status (self, UNAVAILABLE);
-			pk_plugin_install_clear_layout (self);
-			pk_plugin_install_refresh (self);
-		}
-	}
-}
-
-/**
- * pk_plugin_install_remove_client:
- **/
-static void
-pk_plugin_install_remove_client (PkPluginInstall *self, PkClient *client)
-{
-	guint i;
-	PkClient *client_tmp;
-	for (i=0; i<self->priv->clients->len; i++) {
-		client_tmp = g_ptr_array_index (self->priv->clients, i);
-		if (client_tmp == client) {
-			g_ptr_array_remove_index (self->priv->clients, i);
-			g_signal_handlers_disconnect_by_func (client, (void *)pk_plugin_install_package_cb, self);
-			g_signal_handlers_disconnect_by_func (client, (void *)pk_plugin_install_error_code_cb, self);
-			g_signal_handlers_disconnect_by_func (client, (void *)pk_plugin_install_finished_cb, self);
-			g_object_unref (client);
-			break;
-		}
+	if (self->priv->status == IN_PROGRESS) {
+		pk_plugin_install_set_status (self, UNAVAILABLE);
+		pk_plugin_install_clear_layout (self);
+		pk_plugin_install_refresh (self);
 	}
 }
 
@@ -321,6 +291,10 @@ pk_plugin_install_recheck (PkPluginInstall *self)
 	guint i;
 	const gchar *data;
 	gchar **package_ids;
+	GError *error = NULL;
+	PkClient *client;
+	gboolean ret;
+
 	self->priv->status = IN_PROGRESS;
 	pk_plugin_install_set_available_version (self, NULL);
 	pk_plugin_install_set_available_package_name (self, NULL);
@@ -336,23 +310,21 @@ pk_plugin_install_recheck (PkPluginInstall *self)
 	}
 
 	for (i=0; self->priv->package_names[i] != NULL; i++) {
-		GError *error = NULL;
-		PkClient *client = pk_client_new ();
-		g_signal_connect (client, "package", G_CALLBACK (pk_plugin_install_package_cb), self);
-		g_signal_connect (client, "error-code", G_CALLBACK (pk_plugin_install_error_code_cb), self);
-		g_signal_connect (client, "finished", G_CALLBACK (pk_plugin_install_finished_cb), self);
 		package_ids = pk_package_ids_from_id (self->priv->package_names[i]);
-		if (!pk_client_resolve (client, PK_FILTER_ENUM_NONE, package_ids, &error)) {
+		client = pk_client_pool_create (self->priv->client_pool);
+
+		/* do async resolve */
+		ret = pk_client_resolve (client, PK_FILTER_ENUM_NONE, package_ids, &error);
+		if (!ret) {
 			pk_warning ("%s", error->message);
 			g_clear_error (&error);
-			g_object_unref (client);
-		} else {
-			g_ptr_array_add (self->priv->clients, client);
+			pk_client_pool_remove (self->priv->client_pool, client);
 		}
 		g_strfreev (package_ids);
+		g_object_unref (client);
 	}
 
-	if (self->priv->clients->len == 0 && self->priv->status == IN_PROGRESS) {
+	if (pk_client_pool_get_size (self->priv->client_pool) == 0 && self->priv->status == IN_PROGRESS) {
 		pk_plugin_install_set_status (self, UNAVAILABLE);
 		pk_plugin_install_clear_layout (self);
 		pk_plugin_install_refresh (self);
@@ -916,9 +888,7 @@ pk_plugin_install_finalize (GObject *object)
 	}
 
 	/* remove clients */
-	while (self->priv->clients->len > 0)
-		pk_plugin_install_remove_client (self, g_ptr_array_index (self->priv->clients, 0));
-	g_ptr_array_free (self->priv->clients, TRUE);
+	g_object_unref (self->priv->client_pool);
 
 	G_OBJECT_CLASS (pk_plugin_install_parent_class)->finalize (object);
 }
@@ -957,9 +927,14 @@ pk_plugin_install_init (PkPluginInstall *self)
 	self->priv->display_name = NULL;
 	self->priv->package_names = NULL;
 	self->priv->pango_layout = NULL;
-	self->priv->clients = g_ptr_array_new ();
 	self->priv->install_package_proxy = NULL;
 	self->priv->install_package_call = NULL;
+
+	/* use a client pool to do everything async */
+	self->priv->client_pool = pk_client_pool_new ();
+	pk_client_pool_connect (self->priv->client_pool, "package", G_CALLBACK (pk_plugin_install_package_cb), G_OBJECT (self));
+	pk_client_pool_connect (self->priv->client_pool, "error-code", G_CALLBACK (pk_plugin_install_error_code_cb), G_OBJECT (self));
+	pk_client_pool_connect (self->priv->client_pool, "finished", G_CALLBACK (pk_plugin_install_finished_cb), G_OBJECT (self));
 }
 
 /**
commit 82976eb076145ce8b5d60e395f956377e914412f
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 15 15:04:41 2009 +0100

    glib: Add a PkClientPool object to better manage async clients

diff --git a/lib/packagekit-glib/Makefile.am b/lib/packagekit-glib/Makefile.am
index 4051486..5f92eb5 100644
--- a/lib/packagekit-glib/Makefile.am
+++ b/lib/packagekit-glib/Makefile.am
@@ -51,6 +51,7 @@ libpackagekit_glib_include_HEADERS =				\
 	pk-bitfield.h						\
 	pk-common.h						\
 	pk-client.h						\
+	pk-client-pool.h					\
 	pk-catalog.h						\
 	pk-control.h						\
 	pk-task-list.h						\
@@ -102,6 +103,8 @@ libpackagekit_glib_la_SOURCES =					\
 	pk-common.h						\
 	pk-client.c						\
 	pk-client.h						\
+	pk-client-pool.c					\
+	pk-client-pool.h					\
 	pk-catalog.c						\
 	pk-catalog.h						\
 	pk-control.c						\
diff --git a/lib/packagekit-glib/packagekit.h b/lib/packagekit-glib/packagekit.h
index b01131b..8536509 100644
--- a/lib/packagekit-glib/packagekit.h
+++ b/lib/packagekit-glib/packagekit.h
@@ -29,6 +29,7 @@
 #include <packagekit-glib/pk-catalog.h>
 #include <packagekit-glib/pk-category-obj.h>
 #include <packagekit-glib/pk-client.h>
+#include <packagekit-glib/pk-client-pool.h>
 #include <packagekit-glib/pk-common.h>
 #include <packagekit-glib/pk-connection.h>
 #include <packagekit-glib/pk-control.h>
diff --git a/lib/packagekit-glib/pk-client-pool.c b/lib/packagekit-glib/pk-client-pool.c
new file mode 100644
index 0000000..0ff84f8
--- /dev/null
+++ b/lib/packagekit-glib/pk-client-pool.c
@@ -0,0 +1,391 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:pk-client-pool
+ * @short_description: A pool of clients that can be treated as one abstract client
+ *
+ * These provide a way to do many async methods without keeping track of each one --
+ * all the destruction is handled transparently.
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#include "egg-debug.h"
+
+#include <packagekit-glib/pk-client.h>
+#include <packagekit-glib/pk-common.h>
+#include <packagekit-glib/pk-client-pool.h>
+
+static void     pk_client_pool_finalize	(GObject            *object);
+
+#define PK_CLIENT_POOL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_CLIENT_POOL, PkClientPoolPrivate))
+
+typedef struct {
+	gchar		*signal_name;
+	GCallback	 c_handler;
+	GObject		*object;
+} PkClientPoolObj;
+
+/**
+ * PkClientPoolPrivate:
+ *
+ * Private #PkClientPool data
+ **/
+struct _PkClientPoolPrivate
+{
+	GPtrArray		*client_array;
+	GPtrArray		*obj_array;
+};
+
+G_DEFINE_TYPE (PkClientPool, pk_client_pool, PK_TYPE_OBJ_LIST)
+
+/**
+ * pk_client_pool_get_size:
+ * @pool: the %PkClientPool object
+ *
+ * This returns the number of clients held in the pool
+ *
+ * Return value: the size of the pool
+ **/
+guint
+pk_client_pool_get_size	(PkClientPool *pool)
+{
+	g_return_val_if_fail (PK_IS_CLIENT_POOL (pool), 0);
+	return pool->priv->client_array->len;
+}
+
+/**
+ * pk_client_pool_remove:
+ * @pool: the %PkClientPool object
+ * @client: the %PkClient object to remove
+ *
+ * Removes a %PkClient instance that is not going to be run, or failed to be run.
+ *
+ * Return value: %TRUE if the client was removed.
+ **/
+gboolean
+pk_client_pool_remove (PkClientPool *pool, PkClient *client)
+{
+	PkClientPoolObj *obj;
+	gboolean ret;
+	guint i;
+
+	g_return_val_if_fail (PK_IS_CLIENT_POOL (pool), FALSE);
+
+	egg_debug ("client %p removed from pool", client);
+	ret = g_ptr_array_remove (pool->priv->client_array, client);
+	if (!ret) {
+		egg_warning ("failed to remove %p", client);
+		goto out;
+	}
+
+	/* disconnect all objects */
+	for (i=0; i<pool->priv->obj_array->len; i++) {
+		obj = g_ptr_array_index (pool->priv->obj_array, i);
+		g_signal_handlers_disconnect_by_func (client, obj->c_handler, obj->object);
+	}
+
+	/* unref object */
+	g_object_unref (client);
+out:
+	return ret;
+}
+
+/**
+ * pk_client_pool_destroy_cb:
+ **/
+static void
+pk_client_pool_destroy_cb (PkClient *client, PkClientPool *pool)
+{
+	pk_client_pool_remove (pool, client);
+}
+
+/**
+ * pk_client_pool_create:
+ * @pool: the %PkClientPool object
+ *
+ * This creates a %PkClient instance and puts it in the pool. It also connects
+ * up and previously connected methods.
+ *
+ * Return value: a %PkClient instance, or %NULL for an error. You must free this using g_object_unref() when done.
+ **/
+PkClient *
+pk_client_pool_create (PkClientPool *pool)
+{
+	PkClient *client;
+	PkClientPoolObj *obj;
+	guint i;
+
+	g_return_val_if_fail (PK_IS_CLIENT_POOL (pool), NULL);
+
+	client = pk_client_new ();
+
+	/* we unref the client on destroy */
+	g_signal_connect (client, "destroy",
+			  G_CALLBACK (pk_client_pool_destroy_cb), pool);
+
+	/* connect up all signals already added */
+	for (i=0; i<pool->priv->obj_array->len; i++) {
+		obj = g_ptr_array_index (pool->priv->obj_array, i);
+		egg_debug ("connecting up %s to client", obj->signal_name);
+		g_signal_connect (client, obj->signal_name, obj->c_handler, obj->object);
+	}
+
+	/* add to array */
+	g_ptr_array_add (pool->priv->client_array, g_object_ref (client));
+	egg_debug ("added %p to pool", client);
+
+	return client;
+}
+
+/**
+ * pk_client_pool_find_obj:
+ **/
+static PkClientPoolObj *
+pk_client_pool_find_obj (PkClientPool *pool, const gchar *signal_name)
+{
+	PkClientPoolObj *obj;
+	guint i;
+
+	/* disconnect on all objects */
+	for (i=0; i<pool->priv->obj_array->len; i++) {
+		obj = g_ptr_array_index (pool->priv->obj_array, i);
+		if (g_strcmp0 (obj->signal_name, signal_name) == 0)
+			goto out;
+	}
+
+	/* not found */
+	obj = NULL;
+out:
+	return obj;
+}
+
+/**
+ * pk_client_pool_free_obj:
+ **/
+static void
+pk_client_pool_free_obj (PkClientPoolObj *obj)
+{
+	g_object_unref (obj->object);
+	g_free (obj->signal_name);
+	g_free (obj);
+}
+
+/**
+ * pk_client_pool_disconnect:
+ * @pool: the %PkClientPool object
+ * @signal_name: the signal name, e.g. "finished"
+ *
+ * This disconnects up a signal from all the clients already in the pool.
+ *
+ * Return value: %TRUE if the signal was found and removed
+ **/
+gboolean
+pk_client_pool_disconnect (PkClientPool *pool, const gchar *signal_name)
+{
+	gboolean ret = TRUE;
+	PkClient *client;
+	PkClientPoolObj *obj;
+	guint i;
+
+	/* find signal name */
+	obj = pk_client_pool_find_obj (pool, signal_name);
+	if (obj == NULL) {
+		egg_warning ("failed to find signal name %s", signal_name);
+		ret = FALSE;
+		goto out;
+	}
+
+	egg_debug ("disconnected %s", signal_name);
+
+	/* disconnect on all objects */
+	for (i=0; i<pool->priv->client_array->len; i++) {
+		client = g_ptr_array_index (pool->priv->client_array, i);
+		g_signal_handlers_disconnect_by_func (client, obj->c_handler, obj->object);
+	}
+
+	/* remove obj so we don't apply it on new clients */
+	g_ptr_array_remove (pool->priv->client_array, obj);
+	pk_client_pool_free_obj (obj);
+
+out:
+	return ret;
+}
+
+/**
+ * pk_client_pool_connect:
+ * @pool: the %PkClientPool object
+ * @signal_name: the signal name, e.g. "finished"
+ * @c_handler: the %GCallback for the signal
+ * @object: the object to pass to the handler
+ *
+ * This connects up a signal to all the clients already in the pool.
+ *
+ * Return value: %TRUE if the signal was setup
+ **/
+gboolean
+pk_client_pool_connect (PkClientPool *pool, const gchar *signal_name, GCallback c_handler, GObject *object)
+{
+	PkClient *client;
+	PkClientPoolObj *obj;
+	guint i;
+	gboolean ret = TRUE;
+
+	g_return_val_if_fail (PK_IS_CLIENT_POOL (pool), FALSE);
+
+	/* check if signal has already been added */
+	obj = pk_client_pool_find_obj (pool, signal_name);
+	if (obj != NULL) {
+		egg_warning ("already added signal %s", signal_name);
+		ret = FALSE;
+		goto out;
+	}
+
+	egg_debug ("connected %s", signal_name);
+
+	/* add to existing clients */
+	for (i=0; i<pool->priv->client_array->len; i++) {
+		client = g_ptr_array_index (pool->priv->client_array, i);
+		g_signal_connect (client, signal_name, c_handler, object);
+	}
+
+	/* save so we can add to future clients */
+	obj = g_new0 (PkClientPoolObj, 1);
+	obj->signal_name = g_strdup (signal_name);
+	obj->c_handler = c_handler;
+	obj->object = g_object_ref (object);
+	g_ptr_array_add (pool->priv->obj_array, obj);
+out:
+	return ret;
+}
+
+/**
+ * pk_client_pool_class_init:
+ * @klass: The PkClientPoolClass
+ **/
+static void
+pk_client_pool_class_init (PkClientPoolClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	object_class->finalize = pk_client_pool_finalize;
+	g_type_class_add_private (klass, sizeof (PkClientPoolPrivate));
+}
+
+/**
+ * pk_client_pool_init:
+ **/
+static void
+pk_client_pool_init (PkClientPool *pool)
+{
+	g_return_if_fail (pool != NULL);
+	g_return_if_fail (PK_IS_CLIENT_POOL (pool));
+
+	pool->priv = PK_CLIENT_POOL_GET_PRIVATE (pool);
+	pool->priv->client_array = g_ptr_array_new ();
+	pool->priv->obj_array = g_ptr_array_new ();
+}
+
+/**
+ * pk_client_pool_finalize:
+ * @object: The object to finalize
+ **/
+static void
+pk_client_pool_finalize (GObject *object)
+{
+	PkClientPool *pool;
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (PK_IS_CLIENT_POOL (object));
+	pool = PK_CLIENT_POOL (object);
+	g_return_if_fail (pool->priv != NULL);
+
+	g_ptr_array_foreach (pool->priv->client_array, (GFunc) g_object_unref, NULL);
+	g_ptr_array_free (pool->priv->client_array, TRUE);
+	g_ptr_array_foreach (pool->priv->obj_array, (GFunc) pk_client_pool_free_obj, NULL);
+	g_ptr_array_free (pool->priv->obj_array, TRUE);
+
+	G_OBJECT_CLASS (pk_client_pool_parent_class)->finalize (object);
+}
+
+/**
+ * pk_client_pool_new:
+ *
+ * Return value: a new PkClientPool object.
+ **/
+PkClientPool *
+pk_client_pool_new (void)
+{
+	PkClientPool *pool;
+	pool = g_object_new (PK_TYPE_CLIENT_POOL, NULL);
+	return PK_CLIENT_POOL (pool);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+pk_client_pool_test (EggTest *test)
+{
+	PkClientPool *pool;
+	PkClient *client;
+	guint size;
+
+	if (!egg_test_start (test, "PkClientPool"))
+		return;
+
+	/************************************************************/
+	egg_test_title (test, "create");
+	pool = pk_client_pool_new ();
+	egg_test_assert (test, pool != NULL);
+
+	/************************************************************/
+	egg_test_title (test, "make sure size is zero");
+	size = pk_client_pool_get_size (pool);
+	if (size == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "size: %i", size);
+
+	/************************************************************/
+	egg_test_title (test, "create entry");
+	client = pk_client_pool_create (pool);
+	g_object_unref (client);
+	egg_test_assert (test, (client != NULL));
+
+	/************************************************************/
+	egg_test_title (test, "make sure size is one");
+	size = pk_client_pool_get_size (pool);
+	if (size == 1)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "size: %i", size);
+
+	g_object_unref (pool);
+
+	egg_test_end (test);
+}
+#endif
+
diff --git a/lib/packagekit-glib/pk-client-pool.h b/lib/packagekit-glib/pk-client-pool.h
new file mode 100644
index 0000000..0ead195
--- /dev/null
+++ b/lib/packagekit-glib/pk-client-pool.h
@@ -0,0 +1,78 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#if !defined (__PACKAGEKIT_H_INSIDE__) && !defined (PK_COMPILATION)
+#error "Only <packagekit.h> can be included directly."
+#endif
+
+#ifndef __PK_CLIENT_POOL_H
+#define __PK_CLIENT_POOL_H
+
+#include <glib-object.h>
+#include <packagekit-glib/pk-client.h>
+
+G_BEGIN_DECLS
+
+#define PK_TYPE_CLIENT_POOL		(pk_client_pool_get_type ())
+#define PK_CLIENT_POOL(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), PK_TYPE_CLIENT_POOL, PkClientPool))
+#define PK_CLIENT_POOL_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), PK_TYPE_CLIENT_POOL, PkClientPoolClass))
+#define PK_IS_CLIENT_POOL(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), PK_TYPE_CLIENT_POOL))
+#define PK_IS_CLIENT_POOL_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), PK_TYPE_CLIENT_POOL))
+#define PK_CLIENT_POOL_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), PK_TYPE_CLIENT_POOL, PkClientPoolClass))
+
+typedef struct _PkClientPoolPrivate	PkClientPoolPrivate;
+typedef struct _PkClientPool		PkClientPool;
+typedef struct _PkClientPoolClass	PkClientPoolClass;
+
+struct _PkClientPool
+{
+	 PkObjList		 parent;
+	 PkClientPoolPrivate	*priv;
+};
+
+struct _PkClientPoolClass
+{
+	PkObjListClass		parent_class;
+	/* Padding for future expansion */
+	void (*_pk_reserved1) (void);
+	void (*_pk_reserved2) (void);
+	void (*_pk_reserved3) (void);
+	void (*_pk_reserved4) (void);
+	void (*_pk_reserved5) (void);
+};
+
+GType			 pk_client_pool_get_type	(void);
+PkClientPool		*pk_client_pool_new		(void);
+guint			 pk_client_pool_get_size	(PkClientPool	*pool);
+PkClient		*pk_client_pool_create		(PkClientPool	*pool);
+gboolean		 pk_client_pool_remove		(PkClientPool	*pool,
+							 PkClient	*client);
+gboolean		 pk_client_pool_connect		(PkClientPool	*pool,
+							 const gchar	*signal_name,
+							 GCallback	 c_handler,
+							 GObject	*object);
+gboolean		 pk_client_pool_disconnect	(PkClientPool	*pool,
+							 const gchar	*signal_name);
+
+G_END_DECLS
+
+#endif /* __PK_CLIENT_POOL_H */
+
diff --git a/lib/packagekit-glib/pk-self-test.c b/lib/packagekit-glib/pk-self-test.c
index b5fe22a..d26e485 100644
--- a/lib/packagekit-glib/pk-self-test.c
+++ b/lib/packagekit-glib/pk-self-test.c
@@ -39,6 +39,7 @@ void pk_common_test (EggTest *test);
 void pk_enum_test_list (EggTest *test);
 void pk_desktop_test (EggTest *test);
 void pk_client_test (EggTest *test);
+void pk_client_pool_test (EggTest *test);
 void pk_control_test (EggTest *test);
 void pk_task_list_test (EggTest *test);
 void pk_catalog_test (EggTest *test);
@@ -57,6 +58,7 @@ main (int argc, char **argv)
 
 	/* tests go here */
 	egg_string_test (test);
+	pk_client_pool_test (test);
 	pk_obj_list_test (test);
 	pk_common_test (test);
 	pk_package_id_test (test);
commit a5d5b2b9ce39b4011d0f2632a26e7c0c6eee378c
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 15 14:34:53 2009 +0100

    glib: Fix the signal type for destroy, and protect against unref in the handler

diff --git a/lib/packagekit-glib/pk-client.c b/lib/packagekit-glib/pk-client.c
index f0a3ddd..120312b 100644
--- a/lib/packagekit-glib/pk-client.c
+++ b/lib/packagekit-glib/pk-client.c
@@ -506,8 +506,14 @@ pk_client_destroy_cb (DBusGProxy *proxy, PkClient *client)
 		g_main_loop_quit (client->priv->loop);
 	}
 
+	/* ref in case we unref the PkClient in ::destroy */
+	g_object_ref (client);
+
 	egg_debug ("emit destroy %s", client->priv->tid);
 	g_signal_emit (client, signals [PK_CLIENT_DESTROY], 0);
+
+	/* unref what we previously ref'd */
+	g_object_unref (client);
 }
 
 /**
@@ -520,8 +526,7 @@ pk_client_finished_cb (DBusGProxy *proxy, const gchar *exit_text, guint runtime,
 
 	g_return_if_fail (PK_IS_CLIENT (client));
 
-	/* ref in case we unref the PkClient in ::finished --
-	 * see https://bugzilla.novell.com/show_bug.cgi?id=390929 for rationale */
+	/* ref in case we unref the PkClient in ::finished */
 	g_object_ref (client);
 
 	/* stop the timeout timer if running */
@@ -4405,7 +4410,7 @@ pk_client_class_init (PkClientClass *klass)
 	signals [PK_CLIENT_DESTROY] =
 		g_signal_new ("destroy",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (PkClientClass, finished),
+			      G_STRUCT_OFFSET (PkClientClass, destroy),
 			      NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
 
 	g_type_class_add_private (klass, sizeof (PkClientPrivate));
diff --git a/lib/packagekit-glib/pk-client.h b/lib/packagekit-glib/pk-client.h
index d3a4f17..d20874a 100644
--- a/lib/packagekit-glib/pk-client.h
+++ b/lib/packagekit-glib/pk-client.h
@@ -152,11 +152,11 @@ struct _PkClientClass
 							 PkMediaTypeEnum type,
 							 const gchar	*media_id,
 							 const gchar	*media_text);
+	void		(* destroy)			(PkClient	*client);
 	/* Padding for future expansion */
 	void (*_pk_reserved1) (void);
 	void (*_pk_reserved2) (void);
 	void (*_pk_reserved3) (void);
-	void (*_pk_reserved4) (void);
 };
 
 GQuark		 pk_client_error_quark			(void);
commit 41f47bae480763562de569dc1f836b1babdebbd4
Author: logan <logan at fedoraproject.org>
Date:   Wed Jul 15 13:00:13 2009 +0000

    Sending translation for Spanish

diff --git a/po/es.po b/po/es.po
index 617493b..fd16fc9 100644
--- a/po/es.po
+++ b/po/es.po
@@ -9,8 +9,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: packagekit\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-06-19 08:14+0000\n"
-"PO-Revision-Date: 2009-06-19 11:03-0300\n"
+"POT-Creation-Date: 2009-07-15 10:32+0000\n"
+"PO-Revision-Date: 2009-07-15 09:58-0300\n"
 "Last-Translator: Héctor Daniel Cabrera <h.daniel.cabrera at gmail.com>\n"
 "Language-Team: Fedora Spanish <fedora-trans-es at redhat.com>\n"
 "MIME-Version: 1.0\n"
@@ -47,7 +47,7 @@ msgstr "Falso"
 #. TRANSLATORS: this is the transactions role, e.g. "update-system"
 #. TRANSLATORS: the trasaction role, e.g. update-system
 #: ../client/pk-console.c:237
-#: ../src/pk-polkit-action-lookup.c:228
+#: ../src/pk-polkit-action-lookup.c:256
 msgid "Role"
 msgstr "Rol"
 
@@ -61,7 +61,9 @@ msgid "(seconds)"
 msgstr "(segundos)"
 
 #. TRANSLATORS: this is The command line used to do the action
+#. TRANSLATORS: the command line of the thing that wants the authentication
 #: ../client/pk-console.c:246
+#: ../src/pk-polkit-action-lookup.c:270
 msgid "Command line"
 msgstr "Línea de comandos"
 
@@ -214,43 +216,63 @@ msgstr "Se necesita reiniciar el sistema debido a:"
 msgid "Session restart required:"
 msgstr "Se necesita reiniciar la sesión:"
 
-#. TRANSLATORS: a package requires the application to be restarted
+#. TRANSLATORS: a package requires the system to be restarted due to a security update
 #: ../client/pk-console.c:523
+msgid "System restart (security) required by:"
+msgstr "Reinicio del sistema (seguridad) solicitado por:"
+
+#. TRANSLATORS: a package requires the session to be restarted due to a security update
+#: ../client/pk-console.c:526
+msgid "Session restart (security) required:"
+msgstr "Reinicio de la sesión (seguridad) solicitado por:"
+
+#. TRANSLATORS: a package requires the application to be restarted
+#: ../client/pk-console.c:529
 msgid "Application restart required by:"
 msgstr "Se necesita reiniciar una aplicación debido a:"
 
-#. TRANSLATORS: a package needs to restart they system
-#: ../client/pk-console.c:578
+#. TRANSLATORS: a package needs to restart their system
+#: ../client/pk-console.c:584
 msgid "Please restart the computer to complete the update."
 msgstr "Reinicie el equipo para completar la actualización."
 
 #. TRANSLATORS: a package needs to restart the session
-#: ../client/pk-console.c:581
+#: ../client/pk-console.c:587
 msgid "Please logout and login to complete the update."
 msgstr "Cierre la sesión y vuelva a entrar para completar la actualización."
 
 #. TRANSLATORS: a package needs to restart the application
-#: ../client/pk-console.c:584
+#: ../client/pk-console.c:590
 msgid "Please restart the application as it is being used."
 msgstr "Reinicie la aplicación que está usando."
 
+#. TRANSLATORS: a package needs to restart their system (due to security)
+#: ../client/pk-console.c:593
+msgid "Please restart the computer to complete the update as important security updates have been installed."
+msgstr "Por favor, reinicie el equipo para completar la actualización, ya que se han instalado actualizaciones de seguridad importantes."
+
+#. TRANSLATORS: a package needs to restart the session (due to security)
+#: ../client/pk-console.c:596
+msgid "Please logout and login to complete the update as important security updates have been installed."
+msgstr "Por favor, cierre la sesión y vuelva a registrarse para completar la actualización, ya que se han instalado actualizaciones de seguridad importantes."
+
 #. TRANSLATORS: The package is already installed on the system
-#: ../client/pk-console.c:711
+#: ../client/pk-console.c:723
 #, c-format
 msgid "The package %s is already installed"
 msgstr "El paquete %s ya está instalado"
 
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:719
+#: ../client/pk-console.c:731
 #, c-format
 msgid "The package %s could not be installed: %s"
 msgstr "No se pudo instalar el paquete %s: %s"
 
 #. TRANSLATORS: There was a programming error that shouldn't happen. The detailed error follows
-#: ../client/pk-console.c:744
-#: ../client/pk-console.c:767
-#: ../client/pk-console.c:863
-#: ../client/pk-console.c:980
+#: ../client/pk-console.c:756
+#: ../client/pk-console.c:779
+#: ../client/pk-console.c:875
+#: ../client/pk-console.c:992
 #: ../client/pk-tools-common.c:62
 #: ../client/pk-tools-common.c:81
 #: ../client/pk-tools-common.c:89
@@ -259,417 +281,421 @@ msgid "Internal error: %s"
 msgstr "Error interno: %s"
 
 #. TRANSLATORS: There was an error installing the packages. The detailed error follows
-#: ../client/pk-console.c:752
-#: ../client/pk-console.c:1376
+#: ../client/pk-console.c:764
+#: ../client/pk-console.c:1388
 #, c-format
 msgid "This tool could not install the packages: %s"
 msgstr "Esta herramienta no pudo instalar los paquetes: %s"
 
 #. TRANSLATORS: There was an error installing the files. The detailed error follows
-#: ../client/pk-console.c:775
+#: ../client/pk-console.c:787
 #, c-format
 msgid "This tool could not install the files: %s"
 msgstr "Esta herramienta no pudo instalar los archivos: %s"
 
 #. TRANSLATORS: The package name was not found in the installed list. The detailed error follows
-#: ../client/pk-console.c:831
+#: ../client/pk-console.c:843
 #, c-format
 msgid "This tool could not remove %s: %s"
 msgstr "Esta herramienta no pudo eliminar %s: %s"
 
 #. TRANSLATORS: There was an error removing the packages. The detailed error follows
-#: ../client/pk-console.c:854
-#: ../client/pk-console.c:892
-#: ../client/pk-console.c:925
+#: ../client/pk-console.c:866
+#: ../client/pk-console.c:904
+#: ../client/pk-console.c:937
 #, c-format
 msgid "This tool could not remove the packages: %s"
 msgstr "Esta herramienta no pudo eliminar los paquetes: %s"
 
 #. TRANSLATORS: When removing, we might have to remove other dependencies
-#: ../client/pk-console.c:904
+#: ../client/pk-console.c:916
 msgid "The following packages have to be removed:"
 msgstr "Se eliminarán los siguientes paquetes:"
 
 #. TRANSLATORS: We are checking if it's okay to remove a list of packages
-#: ../client/pk-console.c:911
+#: ../client/pk-console.c:923
 msgid "Proceed removing additional packages?"
 msgstr "¿Proceder con la eliminación de los paquetes adicionales?"
 
 #. TRANSLATORS: We did not remove any packages
-#: ../client/pk-console.c:916
+#: ../client/pk-console.c:928
 msgid "The package removal was canceled!"
 msgstr "Se canceló la eliminación de paquetes"
 
 #. TRANSLATORS: The package name was not found in any software sources
-#: ../client/pk-console.c:957
+#: ../client/pk-console.c:969
 #, c-format
 msgid "This tool could not download the package %s as it could not be found"
 msgstr "Esta herramienta no pudo descargar el paquete %s debido a que no se encontró"
 
 #. TRANSLATORS: Could not download the packages for some reason. The detailed error follows
-#: ../client/pk-console.c:988
+#: ../client/pk-console.c:1000
 #, c-format
 msgid "This tool could not download the packages: %s"
 msgstr "Esta herramienta no pudo descargar los paquetes: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:1015
-#: ../client/pk-console.c:1024
+#: ../client/pk-console.c:1027
+#: ../client/pk-console.c:1036
 #, c-format
 msgid "This tool could not update %s: %s"
 msgstr "Esta herramienta no pudo actualizar %s: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:1046
-#: ../client/pk-console.c:1054
+#: ../client/pk-console.c:1058
+#: ../client/pk-console.c:1066
 #, c-format
 msgid "This tool could not get the requirements for %s: %s"
 msgstr "Esta herramienta no pudo obtener los requerimientos de %s: %s"
 
 #. TRANSLATORS: There was an error getting the dependencies for the package. The detailed error follows
-#: ../client/pk-console.c:1076
-#: ../client/pk-console.c:1084
+#: ../client/pk-console.c:1088
+#: ../client/pk-console.c:1096
 #, c-format
 msgid "This tool could not get the dependencies for %s: %s"
 msgstr "Esta herramienta no pudo obtener las dependencias de %s: %s"
 
 #. TRANSLATORS: There was an error getting the details about the package. The detailed error follows
-#: ../client/pk-console.c:1106
-#: ../client/pk-console.c:1114
+#: ../client/pk-console.c:1118
+#: ../client/pk-console.c:1126
 #, c-format
 msgid "This tool could not get package details for %s: %s"
 msgstr "Esta herramienta no pudo obtener los detalles del paquete %s: %s"
 
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:1136
+#: ../client/pk-console.c:1148
 #, c-format
 msgid "This tool could not find the files for %s: %s"
 msgstr "Esta herramienta no pudo encontrar los archivos de %s: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:1144
+#: ../client/pk-console.c:1156
 #, c-format
 msgid "This tool could not get the file list for %s: %s"
 msgstr "Esta herramienta no pudo obtener la lista de archivos de %s: %s"
 
 #. TRANSLATORS: There was an error getting the list of packages. The filename follows
-#: ../client/pk-console.c:1166
+#: ../client/pk-console.c:1178
 #, c-format
 msgid "File already exists: %s"
 msgstr "El archivo ya existe: %s"
 
 #. TRANSLATORS: follows a list of packages to install
-#: ../client/pk-console.c:1171
-#: ../client/pk-console.c:1227
-#: ../client/pk-console.c:1302
+#: ../client/pk-console.c:1183
+#: ../client/pk-console.c:1239
+#: ../client/pk-console.c:1314
 msgid "Getting package list"
 msgstr "Obteniendo la lista de paquetes"
 
 #. TRANSLATORS: There was an error getting the list of packages. The detailed error follows
-#: ../client/pk-console.c:1177
-#: ../client/pk-console.c:1233
-#: ../client/pk-console.c:1308
+#: ../client/pk-console.c:1189
+#: ../client/pk-console.c:1245
+#: ../client/pk-console.c:1320
 #, c-format
 msgid "This tool could not get package list: %s"
 msgstr "Esta herramienta no pudo obtener la lista de paquetes: %s"
 
 #. TRANSLATORS: There was an error saving the list
-#: ../client/pk-console.c:1188
+#: ../client/pk-console.c:1200
 #, c-format
 msgid "Failed to save to disk"
 msgstr "Falló al guardar en el disco"
 
 #. TRANSLATORS: There was an error getting the list. The filename follows
-#: ../client/pk-console.c:1222
-#: ../client/pk-console.c:1297
+#: ../client/pk-console.c:1234
+#: ../client/pk-console.c:1309
 #, c-format
 msgid "File does not exist: %s"
 msgstr "El archivo no existe: %s"
 
 #. TRANSLATORS: header to a list of packages newly added
-#: ../client/pk-console.c:1254
+#: ../client/pk-console.c:1266
 msgid "Packages to add"
 msgstr "Paquetes para añadir"
 
 #. TRANSLATORS: header to a list of packages removed
-#: ../client/pk-console.c:1262
+#: ../client/pk-console.c:1274
 msgid "Packages to remove"
 msgstr "Paquetes para eliminar"
 
 #. TRANSLATORS: We didn't find any differences
-#: ../client/pk-console.c:1330
+#: ../client/pk-console.c:1342
 #, c-format
 msgid "No new packages need to be installed"
 msgstr "No hay paquetes nuevos para instalar"
 
 #. TRANSLATORS: follows a list of packages to install
-#: ../client/pk-console.c:1336
+#: ../client/pk-console.c:1348
 msgid "To install"
 msgstr "Para instalar"
 
 #. TRANSLATORS: searching takes some time....
-#: ../client/pk-console.c:1348
+#: ../client/pk-console.c:1360
 msgid "Searching for package: "
 msgstr "Buscando el paquete: "
 
 #. TRANSLATORS: package was not found -- this is the end of a string ended in ...
-#: ../client/pk-console.c:1352
+#: ../client/pk-console.c:1364
 msgid "not found."
 msgstr "no encontrado."
 
 #. TRANSLATORS: We didn't find any packages to install
-#: ../client/pk-console.c:1363
+#: ../client/pk-console.c:1375
 #, c-format
 msgid "No packages can be found to install"
 msgstr "No se encontró ningún paquete para instalar"
 
 #. TRANSLATORS: installing new packages from package list
-#: ../client/pk-console.c:1369
+#. TRANSLATORS: we are now installing the debuginfo packages we found earlier
+#: ../client/pk-console.c:1381
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:868
+#, c-format
 msgid "Installing packages"
 msgstr "Instalando paquetes"
 
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:1405
+#: ../client/pk-console.c:1417
 #, c-format
 msgid "This tool could not find the update details for %s: %s"
 msgstr "Esta herramienta no pudo encontrar los detalles de actualización de %s: %s"
 
 #. TRANSLATORS: There was an error getting the details about the update for the package. The detailed error follows
-#: ../client/pk-console.c:1413
+#: ../client/pk-console.c:1425
 #, c-format
 msgid "This tool could not get the update details for %s: %s"
 msgstr "Esta herramienta no pudo obtener los detalles de actualización de %s: %s"
 
 #. TRANSLATORS: This was an unhandled error, and we don't have _any_ context
-#: ../client/pk-console.c:1444
+#: ../client/pk-console.c:1456
 msgid "Error:"
 msgstr "Error:"
 
 #. TRANSLATORS: This a list of details about the package
-#: ../client/pk-console.c:1458
+#: ../client/pk-console.c:1470
 msgid "Package description"
 msgstr "Descripción del paquete"
 
 #. TRANSLATORS: This a message (like a little note that may be of interest) from the transaction
-#: ../client/pk-console.c:1474
+#: ../client/pk-console.c:1486
 msgid "Message:"
 msgstr "Mensaje:"
 
 #. TRANSLATORS: This a list files contained in the package
-#: ../client/pk-console.c:1502
+#: ../client/pk-console.c:1514
 msgid "Package files"
 msgstr "Archivos del paquete"
 
 #. TRANSLATORS: This where the package has no files
-#: ../client/pk-console.c:1510
+#: ../client/pk-console.c:1522
 msgid "No files"
 msgstr "No hay archivos"
 
 #. TRANSLATORS: This a request for a GPG key signature from the backend, which the client will prompt for later
-#: ../client/pk-console.c:1533
+#: ../client/pk-console.c:1545
 msgid "Repository signature required"
 msgstr "Se requiere la firma del repositorio"
 
 #. TRANSLATORS: This a prompt asking the user to import the security key
-#: ../client/pk-console.c:1543
+#: ../client/pk-console.c:1555
 msgid "Do you accept this signature?"
 msgstr "¿Acepta esta firma?"
 
 #. TRANSLATORS: This is where the user declined the security key
-#: ../client/pk-console.c:1547
+#: ../client/pk-console.c:1559
 msgid "The signature was not accepted."
 msgstr "No se aceptó la firma."
 
 #. TRANSLATORS: This a request for a EULA
-#: ../client/pk-console.c:1581
+#: ../client/pk-console.c:1593
 msgid "End user license agreement required"
 msgstr "Se requiere un acuerdo de licencia de usuario final"
 
 #. TRANSLATORS: This a prompt asking the user to agree to the license
-#: ../client/pk-console.c:1588
+#: ../client/pk-console.c:1600
 msgid "Do you agree to this license?"
 msgstr "¿Está de acuerdo con esta licencia?"
 
 #. TRANSLATORS: This is where the user declined the license
-#: ../client/pk-console.c:1592
+#: ../client/pk-console.c:1604
 msgid "The license was refused."
 msgstr "Se rechazó la licencia."
 
 #. TRANSLATORS: This is when the daemon crashed, and we are up shit creek without a paddle
-#: ../client/pk-console.c:1621
+#: ../client/pk-console.c:1633
 msgid "The daemon crashed mid-transaction!"
 msgstr "El demonio se colgó en medio de una transacción."
 
 #. TRANSLATORS: This is the header to the --help menu
-#: ../client/pk-console.c:1674
+#: ../client/pk-console.c:1686
 msgid "PackageKit Console Interface"
 msgstr "Interfaz de consola de PackageKit"
 
 #. these are commands we can use with pkcon
-#: ../client/pk-console.c:1676
+#: ../client/pk-console.c:1688
 msgid "Subcommands:"
 msgstr "Subcomandos:"
 
 #. TRANSLATORS: command line argument, if we should show debugging information
 #. TRANSLATORS: if we should show debugging data
-#: ../client/pk-console.c:1768
+#: ../client/pk-console.c:1780
 #: ../client/pk-generate-pack.c:185
 #: ../client/pk-monitor.c:125
 #: ../contrib/command-not-found/pk-command-not-found.c:521
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:532
 #: ../src/pk-main.c:211
 msgid "Show extra debugging information"
 msgstr "Mostrar información extra de depuración"
 
 #. TRANSLATORS: command line argument, just show the version string
-#: ../client/pk-console.c:1771
+#: ../client/pk-console.c:1783
 #: ../client/pk-monitor.c:127
 msgid "Show the program version and exit"
 msgstr "Mostrar la versión del programa y salir"
 
 #. TRANSLATORS: command line argument, use a filter to narrow down results
-#: ../client/pk-console.c:1774
+#: ../client/pk-console.c:1786
 msgid "Set the filter, e.g. installed"
 msgstr "Establecer el filtro, ej. instalado"
 
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1777
+#: ../client/pk-console.c:1789
 msgid "Exit without waiting for actions to complete"
 msgstr "Salir sin esperar que las acciones se completen"
 
 #. TRANSLATORS: This is when we could not connect to the system bus, and is fatal
-#: ../client/pk-console.c:1804
+#: ../client/pk-console.c:1816
 msgid "This tool could not connect to system DBUS."
 msgstr "Esta herramienta no se pudo conectar al DBUS del sistema."
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1893
+#: ../client/pk-console.c:1905
 msgid "The filter specified was invalid"
 msgstr "El filtro especificado fue inválido"
 
 #. TRANSLATORS: a search type can be name, details, file, etc
-#: ../client/pk-console.c:1911
+#: ../client/pk-console.c:1923
 msgid "A search type is required, e.g. name"
 msgstr "Se necesita un tipo de búsqueda, por ejemplo, nombre"
 
 #. TRANSLATORS: the user needs to provide a search term
-#: ../client/pk-console.c:1917
-#: ../client/pk-console.c:1925
-#: ../client/pk-console.c:1933
-#: ../client/pk-console.c:1941
+#: ../client/pk-console.c:1929
+#: ../client/pk-console.c:1937
+#: ../client/pk-console.c:1945
+#: ../client/pk-console.c:1953
 msgid "A search term is required"
 msgstr "Se necesita un término de búsqueda"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1947
+#: ../client/pk-console.c:1959
 msgid "Invalid search type"
 msgstr "Tipo de búsqueda inválido"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1953
+#: ../client/pk-console.c:1965
 msgid "A package name or filename to install is required"
 msgstr "Se requiere un nombre de paquete o nombre de archivo para instalar"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1961
+#: ../client/pk-console.c:1973
 msgid "A type, key_id and package_id are required"
 msgstr "Se necesita un tipo, key_id y package_id"
 
 #. TRANSLATORS: the user did not specify what they wanted to remove
-#: ../client/pk-console.c:1969
+#: ../client/pk-console.c:1981
 msgid "A package name to remove is required"
 msgstr "Necesita un nombre de paquete para eliminar"
 
 #. TRANSLATORS: the user did not specify anything about what to download or where
-#: ../client/pk-console.c:1976
+#: ../client/pk-console.c:1988
 msgid "A destination directory and then the package names to download are required"
 msgstr "Se debe especificar el directorio destino y luego los nombres paquetes para descargar"
 
 #. TRANSLATORS: the directory does not exist, so we can't continue
-#: ../client/pk-console.c:1982
+#: ../client/pk-console.c:1994
 msgid "Directory not found"
 msgstr "Directorio no encontrado"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1989
+#: ../client/pk-console.c:2001
 msgid "A licence identifier (eula-id) is required"
 msgstr "Se necesita un identificador de licencia (eula-id)"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1998
+#: ../client/pk-console.c:2010
 msgid "A transaction identifier (tid) is required"
 msgstr "Se necesita un identificador de transacción (tid)"
 
 #. TRANSLATORS: The user did not specify a package name
-#: ../client/pk-console.c:2014
+#: ../client/pk-console.c:2026
 msgid "A package name to resolve is required"
 msgstr "Se necesita un nombre de paquete para resolver"
 
 #. TRANSLATORS: The user did not specify a repository (software source) name
-#: ../client/pk-console.c:2022
-#: ../client/pk-console.c:2030
+#: ../client/pk-console.c:2034
+#: ../client/pk-console.c:2042
 msgid "A repository name is required"
 msgstr "Se necesita un nombre de repositorio"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:2038
+#: ../client/pk-console.c:2050
 msgid "A repo name, parameter and value are required"
 msgstr "Debe especificar un nombre de repositorio, parámetro y valor"
 
 #. TRANSLATORS: The user didn't specify what action to use
-#: ../client/pk-console.c:2051
+#: ../client/pk-console.c:2063
 msgid "An action, e.g. 'update-system' is required"
 msgstr "Debe especificar una acción, por ejemplo, «update-system»"
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:2057
+#: ../client/pk-console.c:2069
 msgid "A correct role is required"
 msgstr "Se necesita un rol correcto"
 
 #. TRANSLATORS: we keep a database updated with the time that an action was last executed
-#: ../client/pk-console.c:2063
+#: ../client/pk-console.c:2075
 msgid "Failed to get the time since this action was last completed"
 msgstr "Falló al obtener la hora de la última vez que se completó esta acción"
 
 #. TRANSLATORS: The user did not provide a package name
 #. TRANSLATORS: This is when the user fails to supply the package name
-#: ../client/pk-console.c:2072
-#: ../client/pk-console.c:2083
-#: ../client/pk-console.c:2091
-#: ../client/pk-console.c:2107
-#: ../client/pk-console.c:2115
+#: ../client/pk-console.c:2084
+#: ../client/pk-console.c:2095
+#: ../client/pk-console.c:2103
+#: ../client/pk-console.c:2119
+#: ../client/pk-console.c:2127
 #: ../client/pk-generate-pack.c:241
 msgid "A package name is required"
 msgstr "Se necesita un nombre de paquete"
 
 #. TRANSLATORS: each package "provides" certain things, e.g. mime(gstreamer-decoder-mp3), the user didn't specify it
-#: ../client/pk-console.c:2099
+#: ../client/pk-console.c:2111
 msgid "A package provide string is required"
 msgstr "Se necesita la cadena de lo que proporciona el paquete"
 
 #. TRANSLATORS: The user didn't specify a filename to create as a list
-#: ../client/pk-console.c:2123
+#: ../client/pk-console.c:2135
 msgid "A list file name to create is required"
 msgstr "Se necesita un nombre de archivo de la lista"
 
 #. TRANSLATORS: The user didn't specify a filename to open as a list
-#: ../client/pk-console.c:2132
-#: ../client/pk-console.c:2141
+#: ../client/pk-console.c:2144
+#: ../client/pk-console.c:2153
 msgid "A list file to open is required"
 msgstr "Se necesita un archivo de lista para abrir"
 
 #. TRANSLATORS: The user tried to use an unsupported option on the command line
-#: ../client/pk-console.c:2194
+#: ../client/pk-console.c:2206
 #, c-format
 msgid "Option '%s' is not supported"
 msgstr "La opción «%s» no está soportada"
 
 #. TRANSLATORS: User does not have permission to do this
-#: ../client/pk-console.c:2207
+#: ../client/pk-console.c:2219
 msgid "Incorrect privileges for this operation"
 msgstr "Privilegios incorrectos para esta operación"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:2210
+#: ../client/pk-console.c:2222
 msgid "Command failed"
 msgstr "Falló el comando"
 
@@ -884,59 +910,243 @@ msgid "Please choose a package to install"
 msgstr "Elija un paquete para instalar"
 
 #. TRANSLATORS: when we are getting data from the daemon
-#: ../contrib/browser-plugin/src/contents.cpp:299
+#: ../contrib/browser-plugin/pk-plugin-install.c:461
 msgid "Getting package information..."
 msgstr "Extrayendo información del paquete..."
 
 #. TRANSLATORS: run an applicaiton
-#: ../contrib/browser-plugin/src/contents.cpp:305
+#: ../contrib/browser-plugin/pk-plugin-install.c:467
 #, c-format
 msgid "Run %s"
 msgstr "Ejecutar %s"
 
 #. TRANSLATORS: show the installed version of a package
-#: ../contrib/browser-plugin/src/contents.cpp:311
+#: ../contrib/browser-plugin/pk-plugin-install.c:473
 msgid "Installed version"
 msgstr "Versión instalada"
 
 #. TRANSLATORS: run the application now
-#: ../contrib/browser-plugin/src/contents.cpp:319
+#: ../contrib/browser-plugin/pk-plugin-install.c:481
 #, c-format
 msgid "Run version %s now"
 msgstr "Ejecutar la versión %s ahora"
 
 #. TRANSLATORS: run the application now
-#: ../contrib/browser-plugin/src/contents.cpp:325
+#: ../contrib/browser-plugin/pk-plugin-install.c:487
 msgid "Run now"
 msgstr "Ejecutar ahora"
 
 #. TRANSLATORS: update to a new version of the package
-#: ../contrib/browser-plugin/src/contents.cpp:331
+#: ../contrib/browser-plugin/pk-plugin-install.c:493
 #, c-format
 msgid "Update to version %s"
 msgstr "Actualizar a la versión %s"
 
 #. TRANSLATORS: To install a package
-#: ../contrib/browser-plugin/src/contents.cpp:337
+#: ../contrib/browser-plugin/pk-plugin-install.c:499
 #, c-format
 msgid "Install %s now"
 msgstr "Instalar %s ahora"
 
 #. TRANSLATORS: the version of the package
-#: ../contrib/browser-plugin/src/contents.cpp:340
+#: ../contrib/browser-plugin/pk-plugin-install.c:502
 msgid "Version"
 msgstr "Versión"
 
 #. TRANSLATORS: noting found, so can't install
-#: ../contrib/browser-plugin/src/contents.cpp:345
+#: ../contrib/browser-plugin/pk-plugin-install.c:507
 msgid "No packages found for your system"
 msgstr "No se encontró ningún paquete para su sistema"
 
 #. TRANSLATORS: package is being installed
-#: ../contrib/browser-plugin/src/contents.cpp:350
+#: ../contrib/browser-plugin/pk-plugin-install.c:512
 msgid "Installing..."
 msgstr "Instalando..."
 
+#. TRANSLATORS: we are starting to install the packages
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:186
+msgid "Starting install"
+msgstr "Iniciando la instalación"
+
+#. TRANSLATORS: we couldn't find the package name, non-fatal
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:379
+#, c-format
+msgid "Failed to find the package %s, or already installed: %s"
+msgstr "No se ha podido encontrar el paquete %s, o tal vez ya se encuentre instalado: %s"
+
+#. command line argument, simulate what would be done, but don't actually do it
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:535
+msgid "Don't actually install any packages, only simulate what would be installed"
+msgstr "No se instala ningún paquete realmente, solo se indica cuáles serían instalados"
+
+#. command line argument, do we skip packages that depend on the ones specified
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:538
+msgid "Do not install dependencies of the core packages"
+msgstr "No se instalan dependencias de los paquetes principales"
+
+#. command line argument, do we operate quietly
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:541
+msgid "Do not display information or progress"
+msgstr "No se muestra información ni progreso"
+
+#. TRANSLATORS: tool that gets called when the command is not found
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:559
+msgid "PackageKit Debuginfo Installer"
+msgstr "Instalador de depuración de errores de PackageKit"
+
+#. TRANSLATORS: the use needs to specify a list of package names on the command line
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:571
+#, c-format
+msgid "ERROR: Specify package names to install."
+msgstr "ERROR: Debe especificar los nombres de los paquetes a instalar."
+
+#. TRANSLATORS: we are getting the list of repositories
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:605
+#, c-format
+msgid "Getting sources list"
+msgstr "Obteniendo lista desde las fuentes"
+
+#. TRANSLATORS: all completed 100%
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:623
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:663
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:698
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:782
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:826
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:893
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:937
+#, c-format
+msgid "OK."
+msgstr "OK."
+
+#. TRANSLATORS: tell the user what we found
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:626
+#, c-format
+msgid "Found %i enabled and %i disabled sources."
+msgstr "Se han encontrado %i fuentes activas y %i fuentes deshabilitadas."
+
+#. TRANSLATORS: we're finding repositories that match out pattern
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:633
+#, c-format
+msgid "Finding debugging sources"
+msgstr "Buscando fuentes para depuración"
+
+#. TRANSLATORS: tell the user what we found
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:666
+#, c-format
+msgid "Found %i disabled debuginfo repos."
+msgstr "Se han encontrado %i repositorios deshabilitados para depuración."
+
+#. TRANSLATORS: we're now enabling all the debug sources we found
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:673
+#, c-format
+msgid "Enabling debugging sources"
+msgstr "Habilitando fuentes para depuración"
+
+#. TRANSLATORS: operation was not successful
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:683
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:767
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:811
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:878
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:922
+msgid "FAILED."
+msgstr "FALLO."
+
+#. TRANSLATORS: tell the user how many we enabled
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:701
+#, c-format
+msgid "Enabled %i debugging sources."
+msgstr "Se han habilitado %i fuentes para depuración."
+
+#. TRANSLATORS: we're now finding packages that match in all the repos
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:708
+#, c-format
+msgid "Finding debugging packages"
+msgstr "Buscando paquetes de depuración."
+
+#. TRANSLATORS: we couldn't find the package name, non-fatal
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:720
+#, c-format
+msgid "Failed to find the package %s: %s"
+msgstr "Falló al buscar el paquete %s: %s"
+
+#. TRANSLATORS: we couldn't find the debuginfo package name, non-fatal
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:743
+#, c-format
+msgid "Failed to find the debuginfo package %s: %s"
+msgstr "Fallo al buscar el paquete de depuración %s: %s"
+
+#. TRANSLATORS: no debuginfo packages could be found to be installed
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:771
+#, c-format
+msgid "Found no packages to install."
+msgstr "No se han encontrado paquetes para instalar."
+
+#. TRANSLATORS: tell the user we found some packages, and then list them
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:785
+#, c-format
+msgid "Found %i packages:"
+msgstr "Se han encontrado %i paquetes:"
+
+#. TRANSLATORS: tell the user we are searching for deps
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:801
+#, c-format
+msgid "Finding packages that depend on these packages"
+msgstr "Buscando paquetes que dependan de esos paquetes."
+
+#. TRANSLATORS: could not install, detailed error follows
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:814
+#, c-format
+msgid "Could not find dependant packages: %s"
+msgstr "No se han podido encontrar paquetes dependientes: %s"
+
+#. TRANSLATORS: tell the user we found some more packages
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:830
+#, c-format
+msgid "Found %i extra packages."
+msgstr "Se han encontrado %i paquetes extra."
+
+#. TRANSLATORS: tell the user we found some more packages
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:834
+#, c-format
+msgid "No extra packages required."
+msgstr "No son necesarios paquetes extra."
+
+#. TRANSLATORS: tell the user we found some packages (and deps), and then list them
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:843
+#, c-format
+msgid "Found %i packages to install:"
+msgstr "Se han encontrado %i paquetes para instalar:"
+
+#. TRANSLATORS: simulate mode is a testing mode where we quit before the action
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:856
+#, c-format
+msgid "Not installing packages in simulate mode"
+msgstr "No se instalan paquetes en modo de simulación"
+
+#. TRANSLATORS: coul dnot install, detailed error follows
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:881
+#, c-format
+msgid "Could not install packages: %s"
+msgstr "No se han podido instalar paquetes: %s"
+
+#. TRANSLATORS: we are now disabling all debuginfo repos we previously enabled
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:913
+#, c-format
+msgid "Disabling sources previously enabled"
+msgstr "Deshabilitando fuentes previamente habilitadas"
+
+#. TRANSLATORS: no debuginfo packages could be found to be installed, detailed error follows
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:925
+#, c-format
+msgid "Could not disable the debugging sources: %s"
+msgstr "No es posible deshabilitar las fuentes para depuración:%s"
+
+#. TRANSLATORS: we disabled all the debugging repos that we enabled before
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:940
+#, c-format
+msgid "Disabled %i debugging sources."
+msgstr "Se han deshabilitado %i fuentes para la depuración. "
+
 #: ../data/packagekit-catalog.xml.in.h:1
 msgid "PackageKit Catalog"
 msgstr "Catálogo de PackageKit"
@@ -949,91 +1159,154 @@ msgstr "Lista de paquetes de PackageKit"
 msgid "PackageKit Service Pack"
 msgstr "Paquete de servicio de PackageKit"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:1
+#. SECURITY:
+#. - Normal users do not require admin authentication to accept new
+#. licence agreements.
+#. - Change this to 'auth_admin' for environments where users should not
+#. be given the option to make legal decisions.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:7
 msgid "Accept EULA"
 msgstr "Aceptar EULA"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:2
+#: ../policy/org.freedesktop.packagekit.policy.in.h:8
 msgid "Authentication is required to accept a EULA"
 msgstr "Se necesita autenticación para aceptar una EULA"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:3
+#: ../policy/org.freedesktop.packagekit.policy.in.h:9
 msgid "Authentication is required to cancel a task that was not started by yourself"
 msgstr "Se necesita autenticación para cancelar una tarea que no inició usted"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:4
+#: ../policy/org.freedesktop.packagekit.policy.in.h:10
 msgid "Authentication is required to change software source parameters"
 msgstr "Se necesita autenticación para cambiar los parámetros de fuente de software"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:5
+#: ../policy/org.freedesktop.packagekit.policy.in.h:11
 msgid "Authentication is required to consider a key used for signing packages as trusted"
 msgstr "Se necesita autenticación para considerar una clave usada para firmar paquetes como confiable"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:6
+#: ../policy/org.freedesktop.packagekit.policy.in.h:12
 msgid "Authentication is required to install a signed package"
 msgstr "Se necesita autenticación para instalar un paquete firmado"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:7
+#: ../policy/org.freedesktop.packagekit.policy.in.h:13
 msgid "Authentication is required to install an untrusted package"
 msgstr "Se necesita autenticación para instalar un paquete no confiable"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:8
+#: ../policy/org.freedesktop.packagekit.policy.in.h:14
 msgid "Authentication is required to refresh the system sources"
 msgstr "Se necesita autenticación para refrescar las fuentes del sistema"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:9
+#: ../policy/org.freedesktop.packagekit.policy.in.h:15
 msgid "Authentication is required to remove packages"
 msgstr "Se necesita autenticación para eliminar paquetes"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:10
+#: ../policy/org.freedesktop.packagekit.policy.in.h:16
 msgid "Authentication is required to rollback a transaction"
 msgstr "Se necesita autenticación para deshacer una transacción"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:11
+#: ../policy/org.freedesktop.packagekit.policy.in.h:17
 msgid "Authentication is required to set the network proxy used for downloading packages"
 msgstr "Se necesita autenticación para cambiar el proxy de red usado para descargar paquetes"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+#: ../policy/org.freedesktop.packagekit.policy.in.h:18
 msgid "Authentication is required to update packages"
 msgstr "Se necesita autenticación para actualizar paquetes"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:13
+#. SECURITY:
+#. - Normal users are allowed to cancel their own task without
+#. authentication, but a different user id needs the admin password
+#. to cancel another users task.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:24
 msgid "Cancel foreign task"
 msgstr "Cancelar tarea externa"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:14
+#. SECURITY:
+#. - Normal users require admin authentication to enable or disable
+#. software sources as this can be used to enable new updates or
+#. install different versions of software.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:30
 msgid "Change software source parameters"
 msgstr "Cambiar los parámetros de fuente de software"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:15
+#. SECURITY:
+#. - Normal users do not need authentication to install signed packages
+#. from signed repositories, as this cannot exploit a system.
+#. - Paranoid users (or parents!) can change this to 'auth_admin' or
+#. 'auth_admin_keep'.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:37
 msgid "Install signed package"
 msgstr "Instalar paquete firmado"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:16
+#. SECURITY:
+#. - Normal users require admin authentication to install untrusted or
+#. unrecognised packages, as allowing users to do this without a
+#. password would be a massive security hole.
+#. - This is not retained as each package should be authenticated.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:44
 msgid "Install untrusted local file"
 msgstr "Instalar archivo local no-confiable"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:17
+#. SECURITY:
+#. - Normal users do not require admin authentication to refresh the
+#. cache, as this doesn't actually install or remove software.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:49
 msgid "Refresh system sources"
 msgstr "Refrescar las fuentes del sistema"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:18
+#. SECURITY:
+#. - Normal users require admin authentication to remove packages as
+#. this can make the system unbootable or stop other applications from
+#. working.
+#. - Be sure to close the tool used to remove the packages after the
+#. admin authentication has been obtained, otherwise packages can still
+#. be removed. If this is not possible, change this authentication to
+#. 'auth_admin'.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:59
 msgid "Remove package"
 msgstr "Eliminar paquete"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:19
+#. SECURITY:
+#. - Normal users require admin authentication to rollback system state
+#. as this will change a large number of packages, and could expose the
+#. system to previously patched security vulnerabilities.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:65
 msgid "Rollback to a previous transaction"
 msgstr "Deshacer hasta una transacción anterior"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:20
+#. SECURITY:
+#. - Normal users do not require admin authentication to set the proxy
+#. used for downloading packages.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:70
 msgid "Set network proxy"
 msgstr "Establecer el proxy de la red"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:21
+#. SECURITY:
+#. - Normal users require admin authentication to add signing keys.
+#. - This implies adding an explicit trust, and should not be granted
+#. without a secure authentication.
+#. - This is not kept as each package should be authenticated.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:77
 msgid "Trust a key used for signing packages"
 msgstr "Confiar en una llave usada para firmar paquetes"
 
-#: ../policy/org.freedesktop.packagekit.policy.in.h:22
+#. SECURITY:
+#. - Normal users do not require admin authentication to update the
+#. system as the packages will be signed, and the action is required
+#. to update the system when unattended.
+#. - Changing this to anything other than 'yes' will break unattended
+#. updates.
+#.
+#: ../policy/org.freedesktop.packagekit.policy.in.h:85
 msgid "Update packages"
 msgstr "Actualizar paquetes"
 
@@ -1102,30 +1375,34 @@ msgstr "No se pudo conectar con el bus del sistema"
 msgid "Error trying to start:"
 msgstr "Error intentando iniciar:"
 
+#: ../src/pk-polkit-action-lookup.c:143
+msgid "To install debugging packages, extra sources need to be enabled"
+msgstr "Para poder instalar paquetes de depuración, es necesario habilitar nuevas fuentes"
+
 #. TRANSLATORS: is not GPG signed
-#: ../src/pk-polkit-action-lookup.c:128
-#: ../src/pk-polkit-action-lookup.c:147
+#: ../src/pk-polkit-action-lookup.c:156
+#: ../src/pk-polkit-action-lookup.c:175
 msgid "The software is not from a trusted source."
 msgstr "El software no proviene de una fuente confiable."
 
 #. TRANSLATORS: user has to trust provider -- I know, this sucks
-#: ../src/pk-polkit-action-lookup.c:132
+#: ../src/pk-polkit-action-lookup.c:160
 msgid "Do not update this package unless you are sure it is safe to do so."
 msgstr "No actualice este paquete a menos que sepa con certeza que es seguro hacerlo."
 
 #. TRANSLATORS: warn the user that all bets are off
-#: ../src/pk-polkit-action-lookup.c:136
-#: ../src/pk-polkit-action-lookup.c:155
+#: ../src/pk-polkit-action-lookup.c:164
+#: ../src/pk-polkit-action-lookup.c:183
 msgid "Malicious software can damage your computer or cause other harm."
 msgstr "Un software considerado maligno puede provocar diferentes clases de daño, por ejemplo, podría dañar su computadora. "
 
 #. TRANSLATORS: user has to trust provider -- I know, this sucks
-#: ../src/pk-polkit-action-lookup.c:151
+#: ../src/pk-polkit-action-lookup.c:179
 msgid "Do not install this package unless you are sure it is safe to do so."
 msgstr "No instale este paquete a menos que sepa con certeza que es seguro hacerlo."
 
 #. TRANSLATORS: if the transaction is forced to install only trusted packages
-#: ../src/pk-polkit-action-lookup.c:235
+#: ../src/pk-polkit-action-lookup.c:263
 msgid "Only trusted"
 msgstr "Solo confiable"
 
@@ -1149,8 +1426,6 @@ msgstr "Solo confiable"
 #~ msgstr "Debe especificar el tipo de búsqueda, por ejemplo, nombre"
 #~ msgid "You need to specify a search term"
 #~ msgstr "Debe especificar un término de búsqueda"
-#~ msgid "You need to specify a package or file to install"
-#~ msgstr "Debe especificar un paquete o archivo a instalar"
 #~ msgid "You need to specify a package to remove"
 #~ msgstr "Debe especificar un paquete a eliminar"
 #~ msgid "You need to specify a package name to resolve"
@@ -1189,8 +1464,6 @@ msgstr "Solo confiable"
 #~ msgstr "No se pudo encontrar cuales paquetes requiere este paquete"
 #~ msgid "Could not find details for"
 #~ msgstr "No se pudieron obtener los detalles de "
-#~ msgid "Could not find a package match"
-#~ msgstr "No se pudo encontrar un paquete coincidente"
 
 #, fuzzy
 #~ msgid "Could not set database readonly"
commit 5eac377f45a125563feb3ef38e020acafcfe78c5
Author: anipeter <anipeter at fedoraproject.org>
Date:   Wed Jul 15 11:50:33 2009 +0000

    Sending translation for Malayalam

diff --git a/po/ml.po b/po/ml.po
index bfe85d9..59e2e29 100644
--- a/po/ml.po
+++ b/po/ml.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: packagekit.master.ml\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-05-06 02:19+0000\n"
-"PO-Revision-Date: 2009-05-07 13:24+0530\n"
+"POT-Creation-Date: 2009-07-15 02:51+0000\n"
+"PO-Revision-Date: 2009-07-15 17:19+0530\n"
 "Last-Translator: \n"
 "Language-Team:  <en at li.org>\n"
 "MIME-Version: 1.0\n"
@@ -17,230 +17,260 @@ msgstr ""
 "X-Generator: KBabel 1.11.4\n"
 
 #. TRANSLATORS: this is an atomic transaction
-#: ../client/pk-console.c:234
+#: ../client/pk-console.c:231
 msgid "Transaction"
 msgstr "ഇടപാടു്"
 
 #. TRANSLATORS: this is the time the transaction was started in system timezone
-#: ../client/pk-console.c:236
+#: ../client/pk-console.c:233
 msgid "System time"
 msgstr "സിസ്റ്റം സമയം"
 
 #. TRANSLATORS: this is if the transaction succeeded or not
-#: ../client/pk-console.c:238
+#: ../client/pk-console.c:235
 msgid "Succeeded"
 msgstr "ഇടപാടു് പൂര്‍ത്തിയായി"
 
 #. TRANSLATORS: if the repo is enabled
-#: ../client/pk-console.c:238 ../client/pk-console.c:405
+#: ../client/pk-console.c:235 ../client/pk-console.c:402
 msgid "True"
 msgstr "True"
 
-#: ../client/pk-console.c:238 ../client/pk-console.c:405
+#: ../client/pk-console.c:235 ../client/pk-console.c:402
 msgid "False"
 msgstr "False"
 
 #. TRANSLATORS: this is the transactions role, e.g. "update-system"
-#: ../client/pk-console.c:240
+#. TRANSLATORS: the trasaction role, e.g. update-system
+#: ../client/pk-console.c:237 ../src/pk-polkit-action-lookup.c:256
 msgid "Role"
 msgstr "റോള്‍"
 
 #. TRANSLATORS: this is The duration of the transaction
-#: ../client/pk-console.c:245
+#: ../client/pk-console.c:242
 msgid "Duration"
 msgstr "സമയം"
 
-#: ../client/pk-console.c:245
+#: ../client/pk-console.c:242
 msgid "(seconds)"
 msgstr "(സെക്കന്‍ഡുകള്‍)"
 
 #. TRANSLATORS: this is The command line used to do the action
-#: ../client/pk-console.c:249
+#. TRANSLATORS: the command line of the thing that wants the authentication
+#: ../client/pk-console.c:246 ../src/pk-polkit-action-lookup.c:270
 msgid "Command line"
 msgstr "കമാന്‍ഡ് ലൈന്‍"
 
 #. TRANSLATORS: this is the user ID of the user that started the action
-#: ../client/pk-console.c:251
+#: ../client/pk-console.c:248
 msgid "User ID"
 msgstr "ഉപയോക്താവിനുള്ള ID"
 
 #. TRANSLATORS: this is the username, e.g. hughsie
-#: ../client/pk-console.c:258
+#: ../client/pk-console.c:255
 msgid "Username"
 msgstr "ഉപയോക്തൃനാമം"
 
 #. TRANSLATORS: this is the users real name, e.g. "Richard Hughes"
-#: ../client/pk-console.c:262
+#: ../client/pk-console.c:259
 msgid "Real name"
 msgstr "യഥാര്‍ത്ഥ പേരു്"
 
-#: ../client/pk-console.c:270
+#: ../client/pk-console.c:267
 msgid "Affected packages:"
 msgstr "ബാധിച്ച പാക്കേജുകള്‍:"
 
-#: ../client/pk-console.c:272
+#: ../client/pk-console.c:269
 msgid "Affected packages: None"
 msgstr "ബാധിച്ച പാക്കേജുകള്‍: ഒന്നുമില്ല"
 
 #. TRANSLATORS: this is the distro, e.g. Fedora 10
-#: ../client/pk-console.c:297
+#: ../client/pk-console.c:294
 msgid "Distribution"
 msgstr "വിതരണം"
 
 #. TRANSLATORS: this is type of update, stable or testing
-#: ../client/pk-console.c:299
+#: ../client/pk-console.c:296
 msgid "Type"
 msgstr "തരം"
 
 #. TRANSLATORS: this is any summary text describing the upgrade
 #. TRANSLATORS: this is the summary of the group
-#: ../client/pk-console.c:301 ../client/pk-console.c:324
+#: ../client/pk-console.c:298 ../client/pk-console.c:321
 msgid "Summary"
 msgstr "സമ്മറി"
 
 #. TRANSLATORS: this is the group category name
-#: ../client/pk-console.c:313
+#: ../client/pk-console.c:310
 msgid "Category"
 msgstr "വിഭാഗം"
 
 #. TRANSLATORS: this is group identifier
-#: ../client/pk-console.c:315
+#: ../client/pk-console.c:312
 msgid "ID"
 msgstr "ID"
 
 #. TRANSLATORS: this is the parent group
-#: ../client/pk-console.c:318
+#: ../client/pk-console.c:315
 msgid "Parent"
 msgstr "പേരന്റ്"
 
 #. TRANSLATORS: this is the name of the parent group
-#: ../client/pk-console.c:321
+#: ../client/pk-console.c:318
 msgid "Name"
 msgstr "പേരു്"
 
 #. TRANSLATORS: this is preferred icon for the group
-#: ../client/pk-console.c:327
+#: ../client/pk-console.c:324
 msgid "Icon"
 msgstr "ചിഹ്നം"
 
 #. TRANSLATORS: this is a header for the package that can be updated
-#: ../client/pk-console.c:342
+#: ../client/pk-console.c:339
 msgid "Details about the update:"
 msgstr "പരിഷ്കരണങ്ങള്‍ സംബന്ധിച്ചുള്ള വിശദാംശങ്ങള്‍:"
 
 #. TRANSLATORS: details about the update, package name and version
-#: ../client/pk-console.c:344
+#: ../client/pk-console.c:341
 msgid "Package"
 msgstr "പാക്കേജ്"
 
 #. TRANSLATORS: details about the update, any packages that this update updates
-#: ../client/pk-console.c:347
+#: ../client/pk-console.c:344
 msgid "Updates"
 msgstr "പരിഷ്കരണങ്ങള്‍"
 
 #. TRANSLATORS: details about the update, any packages that this update obsoletes
-#: ../client/pk-console.c:351
+#: ../client/pk-console.c:348
 msgid "Obsoletes"
 msgstr "വേണ്ടെന്നു് വച്ചവ"
 
 #. TRANSLATORS: details about the update, the vendor URLs
-#: ../client/pk-console.c:355
+#: ../client/pk-console.c:352
 msgid "Vendor"
 msgstr "കച്ചവടക്കാരന്‍"
 
 #. TRANSLATORS: details about the update, the bugzilla URLs
-#: ../client/pk-console.c:359
+#: ../client/pk-console.c:356
 msgid "Bugzilla"
 msgstr "Bugzilla"
 
 #. TRANSLATORS: details about the update, the CVE URLs
-#: ../client/pk-console.c:363
+#: ../client/pk-console.c:360
 msgid "CVE"
 msgstr "CVE"
 
 #. TRANSLATORS: details about the update, if the package requires a restart
-#: ../client/pk-console.c:367
+#: ../client/pk-console.c:364
 msgid "Restart"
 msgstr "വീണ്ടും ആരംഭിക്കുക"
 
 #. TRANSLATORS: details about the update, any description of the update
-#: ../client/pk-console.c:371
+#: ../client/pk-console.c:368
 msgid "Update text"
 msgstr "പരിഷ്കരിച്ച വാചകം"
 
 #. TRANSLATORS: details about the update, the changelog for the package
-#: ../client/pk-console.c:375
+#: ../client/pk-console.c:372
 msgid "Changes"
 msgstr "മാറ്റങ്ങള്‍"
 
 #. TRANSLATORS: details about the update, the ongoing state of the update
-#: ../client/pk-console.c:379
+#: ../client/pk-console.c:376
 msgid "State"
 msgstr "അവസ്ഥ"
 
 #. TRANSLATORS: details about the update, date the update was issued
-#: ../client/pk-console.c:384
+#: ../client/pk-console.c:381
 msgid "Issued"
 msgstr "നല്‍കിയതു്"
 
 #. TRANSLATORS: details about the update, date the update was updated
-#: ../client/pk-console.c:389
+#: ../client/pk-console.c:386
 msgid "Updated"
 msgstr "പരിഷ്കരിച്ചിരിക്കുന്നു"
 
-#: ../client/pk-console.c:476 ../client/pk-console.c:478
+#: ../client/pk-console.c:473 ../client/pk-console.c:475
 msgid "Percentage"
 msgstr "ശതമാനം"
 
-#: ../client/pk-console.c:478
+#: ../client/pk-console.c:475
 msgid "Unknown"
 msgstr "അപരിചിതം"
 
 #. TRANSLATORS: a package requires the system to be restarted
-#: ../client/pk-console.c:529
+#: ../client/pk-console.c:517
 msgid "System restart required by:"
 msgstr "സിസ്റ്റം വീണ്ടും ആരംഭിക്കുന്നതു് ആവശ്യമുള്ളതു്:"
 
 #. TRANSLATORS: a package requires the session to be restarted
-#: ../client/pk-console.c:532
+#: ../client/pk-console.c:520
 msgid "Session restart required:"
 msgstr "സെഷന്‍ വീണ്ടും ആരംഭിക്കേണ്ടതുണ്ടു്:"
 
+#. TRANSLATORS: a package requires the system to be restarted due to a security update
+#: ../client/pk-console.c:523
+msgid "System restart (security) required by:"
+msgstr "സിസ്റ്റം വീണ്ടും ആരംഭിക്കുന്നതു് (സുരക്ഷാ പരിഷ്കരണം) ആവശ്യമുള്ളതു്:"
+
+#. TRANSLATORS: a package requires the session to be restarted due to a security update
+#: ../client/pk-console.c:526
+msgid "Session restart (security) required:"
+msgstr "സെഷന്‍ വീണ്ടും ആരംഭിക്കുന്നതു് (സുരക്ഷാ പരിഷ്കരണം) ആവശ്യമുള്ളതു്:"
+
 #. TRANSLATORS: a package requires the application to be restarted
-#: ../client/pk-console.c:535
+#: ../client/pk-console.c:529
 msgid "Application restart required by:"
 msgstr "പ്രയോഗം വീണ്ടും ആരംഭിക്കേണ്ടതു് ആവശ്യമുള്ളതു്:"
 
-#. TRANSLATORS: a package needs to restart they system
-#: ../client/pk-console.c:572
+#. TRANSLATORS: a package needs to restart their system
+#: ../client/pk-console.c:584
 msgid "Please restart the computer to complete the update."
 msgstr "പരിഷ്കരണങ്ങള്‍ പൂര്‍ത്തിയാക്കുന്നതിനായി ദയവായി നിങ്ങളുടെ കമ്പ്യൂട്ടര്‍ വീണ്ടും ആരംഭിക്കുക."
 
 #. TRANSLATORS: a package needs to restart the session
-#: ../client/pk-console.c:575
+#: ../client/pk-console.c:587
 msgid "Please logout and login to complete the update."
 msgstr "പരിഷ്കരണങ്ങള്‍ പൂര്‍ത്തിയാക്കുന്നതിനായി ദയവായി ലോഗൌട്ട് ചെയ്ത് ലോഗിന്‍ ചെയ്യുക."
 
 #. TRANSLATORS: a package needs to restart the application
-#: ../client/pk-console.c:578
+#: ../client/pk-console.c:590
 msgid "Please restart the application as it is being used."
 msgstr "ഈ പ്രയോഗം ഉപയോഗിക്കേണ്ടപ്പോള്‍ തന്നെ വീണ്ടും ആരംഭിക്കുക."
 
+#. TRANSLATORS: a package needs to restart their system (due to security)
+#: ../client/pk-console.c:593
+msgid ""
+"Please restart the computer to complete the update as important security "
+"updates have been installed."
+msgstr ""
+"പ്രധാന സുരക്ഷാ പുതുമകള്‍ കാരണം പരിഷ്കരണം പൂര്‍ത്തിയാക്കുന്നതിനായി ദയവായി "
+"നിങ്ങളുടെ കമ്പ്യൂട്ടര്‍ വീണ്ടും ആരംഭിക്കുക."
+
+#. TRANSLATORS: a package needs to restart the session (due to security)
+#: ../client/pk-console.c:596
+msgid ""
+"Please logout and login to complete the update as important security updates "
+"have been installed."
+msgstr ""
+"പ്രധാന സുരക്ഷാ പുതുമകള്‍ കാരണം പരിഷ്കരണം പൂര്‍ത്തിയാക്കുന്നതിനായി ദയവായി "
+"ലോഗൌട്ട് ചെയ്ത് ലോഗിന്‍ ചെയ്യുക."
+
 #. TRANSLATORS: The package is already installed on the system
-#: ../client/pk-console.c:691
+#: ../client/pk-console.c:723
 #, c-format
 msgid "The package %s is already installed"
 msgstr "%s എന്ന പാക്കേജ് നിലവില്‍ കമ്പ്യൂട്ടറില്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്തിരിക്കുന്നു."
 
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:699
+#: ../client/pk-console.c:731
 #, c-format
 msgid "The package %s could not be installed: %s"
 msgstr "%s എന്ന പാക്കേജ് നിങ്ങളുടെ കമ്പ്യൂട്ടറില്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യുവാന്‍ സാധ്യമായില്ല: %s"
 
 #. TRANSLATORS: There was a programming error that shouldn't happen. The detailed error follows
-#: ../client/pk-console.c:724 ../client/pk-console.c:751
-#: ../client/pk-console.c:847 ../client/pk-console.c:964
+#: ../client/pk-console.c:756 ../client/pk-console.c:779
+#: ../client/pk-console.c:875 ../client/pk-console.c:992
 #: ../client/pk-tools-common.c:62 ../client/pk-tools-common.c:81
 #: ../client/pk-tools-common.c:89
 #, c-format
@@ -248,399 +278,403 @@ msgid "Internal error: %s"
 msgstr "ആന്തരിക പിശക്: %s"
 
 #. TRANSLATORS: There was an error installing the packages. The detailed error follows
-#: ../client/pk-console.c:732 ../client/pk-console.c:1360
+#: ../client/pk-console.c:764 ../client/pk-console.c:1388
 #, c-format
 msgid "This tool could not install the packages: %s"
 msgstr "ഈ പ്രയോഗത്തിനു് പാക്കേജുകള്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യുവാന്‍ സാധ്യമല്ല: %s"
 
 #. TRANSLATORS: There was an error installing the files. The detailed error follows
-#: ../client/pk-console.c:759
+#: ../client/pk-console.c:787
 #, c-format
 msgid "This tool could not install the files: %s"
 msgstr "ഈ പ്രയോഗത്തിനു് ഫയലുകള്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യുവാന്‍ സാധ്യമല്ല: %s"
 
 #. TRANSLATORS: The package name was not found in the installed list. The detailed error follows
-#: ../client/pk-console.c:815
+#: ../client/pk-console.c:843
 #, c-format
 msgid "This tool could not remove %s: %s"
 msgstr "ഈ പ്രയോഗത്തിനു് %s നീക്കം ചെയ്യുവാന്‍ സാധ്യമായില്ല: %s"
 
 #. TRANSLATORS: There was an error removing the packages. The detailed error follows
-#: ../client/pk-console.c:838 ../client/pk-console.c:876
-#: ../client/pk-console.c:909
+#: ../client/pk-console.c:866 ../client/pk-console.c:904
+#: ../client/pk-console.c:937
 #, c-format
 msgid "This tool could not remove the packages: %s"
 msgstr "ഈ പ്രയോഗത്തിനു് പാക്കേജുകള്‍ നീക്കം ചെയ്യുവാന്‍ സാധ്യമല്ല: %s"
 
 #. TRANSLATORS: When removing, we might have to remove other dependencies
-#: ../client/pk-console.c:888
+#: ../client/pk-console.c:916
 msgid "The following packages have to be removed:"
 msgstr "താഴെ പറയുന്ന പാക്കേജുകള്‍ നീക്കം ചെയ്യേണ്ടതുണ്ടു്."
 
 #. TRANSLATORS: We are checking if it's okay to remove a list of packages
-#: ../client/pk-console.c:895
+#: ../client/pk-console.c:923
 msgid "Proceed removing additional packages?"
 msgstr "അഡീഷണലായ പാക്കേജുകള്‍ നീക്കം ചെയ്യാമല്ലോ?"
 
 #. TRANSLATORS: We did not remove any packages
-#: ../client/pk-console.c:900
+#: ../client/pk-console.c:928
 msgid "The package removal was canceled!"
 msgstr "പാക്കേജ് നീക്കം ചെയ്യല്‍ റദ്ദാക്കിയിരിക്കുന്നു!"
 
 #. TRANSLATORS: The package name was not found in any software sources
-#: ../client/pk-console.c:941
+#: ../client/pk-console.c:969
 #, c-format
 msgid "This tool could not download the package %s as it could not be found"
 msgstr "%s പാക്കേജ് ലഭ്യമല്ലാത്തതിനാല്‍ ഈ പ്രയോഗത്തിനു് അതു് ഇന്‍സ്റ്റോള്‍ ചെയ്യുവാന്‍ സാധ്യമായില്ല"
 
 #. TRANSLATORS: Could not download the packages for some reason. The detailed error follows
-#: ../client/pk-console.c:972
+#: ../client/pk-console.c:1000
 #, c-format
 msgid "This tool could not download the packages: %s"
 msgstr "ഈ പ്രയോഗത്തിനു് പാക്കേജുകള്‍ ഡൌണ്‍ലോട് ചെയ്യുവാന്‍ സാധ്യമല്ല: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:999 ../client/pk-console.c:1008
+#: ../client/pk-console.c:1027 ../client/pk-console.c:1036
 #, c-format
 msgid "This tool could not update %s: %s"
 msgstr "ഈ പ്രയോഗത്തിനു് %s പരിഷ്കരിക്കുവാന്‍ സാധ്യമല്ല: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:1030 ../client/pk-console.c:1038
+#: ../client/pk-console.c:1058 ../client/pk-console.c:1066
 #, c-format
 msgid "This tool could not get the requirements for %s: %s"
 msgstr "%s-നു് ആവശ്യമുള്ളവ ലഭ്യമാക്കുവാന്‍ ഈ പ്രയോഗത്തിനു് സാധ്യമായില്ല: %s"
 
 #. TRANSLATORS: There was an error getting the dependencies for the package. The detailed error follows
-#: ../client/pk-console.c:1060 ../client/pk-console.c:1068
+#: ../client/pk-console.c:1088 ../client/pk-console.c:1096
 #, c-format
 msgid "This tool could not get the dependencies for %s: %s"
 msgstr "%s-നുള്ള ഡിപന്‍ഡന്‍സികള്‍ ലഭ്യമാക്കുവാന്‍ ഈ പ്രയോഗത്തിനു് സാധ്യമായില്ല: %s"
 
 #. TRANSLATORS: There was an error getting the details about the package. The detailed error follows
-#: ../client/pk-console.c:1090 ../client/pk-console.c:1098
+#: ../client/pk-console.c:1118 ../client/pk-console.c:1126
 #, c-format
 msgid "This tool could not get package details for %s: %s"
 msgstr "%s-നുള്ള പാക്കേജിന്റെ വിശദാംശങ്ങള്‍ ലഭ്യമാക്കുവാന്‍ ഈ പ്രയോഗത്തിനു് സാധ്യമായില്ല: %s"
 
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:1120
+#: ../client/pk-console.c:1148
 #, c-format
 msgid "This tool could not find the files for %s: %s"
 msgstr "%s-നുള്ള ഫയലുകള്‍ ലഭ്യമാക്കുവാന്‍ ഈ പ്രയോഗത്തിനു് സാധ്യമായില്ല: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:1128
+#: ../client/pk-console.c:1156
 #, c-format
 msgid "This tool could not get the file list for %s: %s"
 msgstr "%s-നുള്ള ഫയലുകളുടെ പട്ടിക ലഭ്യമാക്കുവാന്‍ ഈ പ്രയോഗത്തിനു് സാധ്യമായില്ല: %s"
 
 #. TRANSLATORS: There was an error getting the list of packages. The filename follows
-#: ../client/pk-console.c:1150
+#: ../client/pk-console.c:1178
 #, c-format
 msgid "File already exists: %s"
 msgstr "ഫയല്‍ നിലവിലുണ്ടു്: %s"
 
 #. TRANSLATORS: follows a list of packages to install
-#: ../client/pk-console.c:1155 ../client/pk-console.c:1211
-#: ../client/pk-console.c:1286
+#: ../client/pk-console.c:1183 ../client/pk-console.c:1239
+#: ../client/pk-console.c:1314
 msgid "Getting package list"
 msgstr "പാക്കേജ് സംബന്ധിച്ചുള്ള വിവരം ലഭ്യമാകുന്നു"
 
 #. TRANSLATORS: There was an error getting the list of packages. The detailed error follows
-#: ../client/pk-console.c:1161 ../client/pk-console.c:1217
-#: ../client/pk-console.c:1292
+#: ../client/pk-console.c:1189 ../client/pk-console.c:1245
+#: ../client/pk-console.c:1320
 #, c-format
 msgid "This tool could not get package list: %s"
 msgstr "ഈ പ്രയോഗത്തിനു് പാക്കേജുകളുടെ പട്ടിക ലഭ്യമാക്കുവാന്‍ സാധ്യമായില്ല: %s"
 
 #. TRANSLATORS: There was an error saving the list
-#: ../client/pk-console.c:1172
+#: ../client/pk-console.c:1200
 #, c-format
 msgid "Failed to save to disk"
 msgstr "ഡിസ്കിലേക്കു് സൂക്ഷിക്കുവാന്‍ സാധ്യമായില്ല"
 
 #. TRANSLATORS: There was an error getting the list. The filename follows
-#: ../client/pk-console.c:1206 ../client/pk-console.c:1281
+#: ../client/pk-console.c:1234 ../client/pk-console.c:1309
 #, c-format
 msgid "File does not exist: %s"
 msgstr "ഫയല്‍ നിലവിലില്ല: %s"
 
 #. TRANSLATORS: header to a list of packages newly added
-#: ../client/pk-console.c:1238
+#: ../client/pk-console.c:1266
 msgid "Packages to add"
 msgstr "ചേര്‍ക്കുവാനുള്ള പാക്കേജുകള്‍"
 
 #. TRANSLATORS: header to a list of packages removed
-#: ../client/pk-console.c:1246
+#: ../client/pk-console.c:1274
 msgid "Packages to remove"
 msgstr "നീക്കം ചെയ്യുവാനുള്ള പാക്കേജുകള്‍"
 
 #. TRANSLATORS: We didn't find any differences
-#: ../client/pk-console.c:1314
+#: ../client/pk-console.c:1342
 #, c-format
 msgid "No new packages need to be installed"
 msgstr "പുതിയ പാക്കേജുകള്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യുവാന്‍ സാധ്യമായില്ല"
 
 #. TRANSLATORS: follows a list of packages to install
-#: ../client/pk-console.c:1320
+#: ../client/pk-console.c:1348
 msgid "To install"
 msgstr "ഇന്‍സ്റ്റോള്‍ ചെയ്യുവാനുള്ള പാക്കേജുകള്‍"
 
 #. TRANSLATORS: searching takes some time....
-#: ../client/pk-console.c:1332
+#: ../client/pk-console.c:1360
 msgid "Searching for package: "
 msgstr "പാക്കേജിനായി തെരയുന്നു: "
 
 #. TRANSLATORS: package was not found -- this is the end of a string ended in ...
-#: ../client/pk-console.c:1336
+#: ../client/pk-console.c:1364
 msgid "not found."
 msgstr "ലഭ്യമായില്ല."
 
 #. TRANSLATORS: We didn't find any packages to install
-#: ../client/pk-console.c:1347
+#: ../client/pk-console.c:1375
 #, c-format
 msgid "No packages can be found to install"
 msgstr "ഇന്‍സ്റ്റോള്‍ ചെയ്യുന്നതിനുള്ള പാക്കേജുകള്‍ ലഭ്യമല്ല"
 
 #. TRANSLATORS: installing new packages from package list
-#: ../client/pk-console.c:1353
+#. TRANSLATORS: we are now installing the debuginfo packages we found earlier
+#: ../client/pk-console.c:1381
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:868
+#, c-format
 msgid "Installing packages"
 msgstr "പാക്കേജുകള്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യുന്നു"
 
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:1389
+#: ../client/pk-console.c:1417
 #, c-format
 msgid "This tool could not find the update details for %s: %s"
 msgstr "%s-നു് പരിഷ്കരണത്തിനുള്ള വിശദാംശങ്ങള്‍ ലഭ്യമാക്കുവാന്‍ ഈ പ്രയോഗത്തിനു് സാധ്യമായില്ല: %s"
 
 #. TRANSLATORS: There was an error getting the details about the update for the package. The detailed error follows
-#: ../client/pk-console.c:1397
+#: ../client/pk-console.c:1425
 #, c-format
 msgid "This tool could not get the update details for %s: %s"
 msgstr "%s-നു് പരിഷ്കരണത്തിനുള്ള വിശദാംശങ്ങള്‍ ലഭ്യമാക്കുവാന്‍ ഈ പ്രയോഗത്തിനു് സാധ്യമായില്ല: %s"
 
 #. TRANSLATORS: This was an unhandled error, and we don't have _any_ context
-#: ../client/pk-console.c:1443
+#: ../client/pk-console.c:1456
 msgid "Error:"
 msgstr "പിശക്:"
 
 #. TRANSLATORS: This a list of details about the package
-#: ../client/pk-console.c:1457
+#: ../client/pk-console.c:1470
 msgid "Package description"
 msgstr "പാക്കേജ് വിശദാംശങ്ങള്‍"
 
 #. TRANSLATORS: This a message (like a little note that may be of interest) from the transaction
-#: ../client/pk-console.c:1473
+#: ../client/pk-console.c:1486
 msgid "Message:"
 msgstr "സന്ദേശം:"
 
 #. TRANSLATORS: This a list files contained in the package
-#: ../client/pk-console.c:1501
+#: ../client/pk-console.c:1514
 msgid "Package files"
 msgstr "പാക്കേജിലുള്ള ഫയലുകള്‍"
 
 #. TRANSLATORS: This where the package has no files
-#: ../client/pk-console.c:1509
+#: ../client/pk-console.c:1522
 msgid "No files"
 msgstr "ഫയലുകള്‍ ലഭ്യമല്ല"
 
 #. TRANSLATORS: This a request for a GPG key signature from the backend, which the client will prompt for later
-#: ../client/pk-console.c:1532
+#: ../client/pk-console.c:1545
 msgid "Repository signature required"
 msgstr "സംഭരണിയ്ക്കുള്ള ജിപിജി ഒപ്പ് ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: This a prompt asking the user to import the security key
-#: ../client/pk-console.c:1542
+#: ../client/pk-console.c:1555
 msgid "Do you accept this signature?"
 msgstr "ഈ ഓപ്പ് നിങ്ങള്‍ അംഗീകരിക്കുന്നുവോ?"
 
 #. TRANSLATORS: This is where the user declined the security key
-#: ../client/pk-console.c:1546
+#: ../client/pk-console.c:1559
 msgid "The signature was not accepted."
 msgstr "ഒപ്പ് സ്വീകരിക്കുന്നില്ല."
 
 #. TRANSLATORS: This a request for a EULA
-#: ../client/pk-console.c:1580
+#: ../client/pk-console.c:1593
 msgid "End user license agreement required"
 msgstr "ഉപയോക്താവിനുള്ള ലൈസന്‍സ് എഗ്രീമെന്റ് ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: This a prompt asking the user to agree to the license
-#: ../client/pk-console.c:1587
+#: ../client/pk-console.c:1600
 msgid "Do you agree to this license?"
 msgstr "നിങ്ങള്‍ ഈ ലൈസന്‍സ് സ്വീകരിക്കുന്നുവോ?"
 
 #. TRANSLATORS: This is where the user declined the license
-#: ../client/pk-console.c:1591
+#: ../client/pk-console.c:1604
 msgid "The license was refused."
 msgstr "ലൈസന്‍സ് നിഷേധിച്ചിരിക്കുന്നു."
 
 #. TRANSLATORS: This is when the daemon crashed, and we are up shit creek without a paddle
-#: ../client/pk-console.c:1620
+#: ../client/pk-console.c:1633
 msgid "The daemon crashed mid-transaction!"
 msgstr "ഡെമണ്‍ തകര്‍ന്നിരിക്കുന്നു!"
 
 #. TRANSLATORS: This is the header to the --help menu
-#: ../client/pk-console.c:1673
+#: ../client/pk-console.c:1686
 msgid "PackageKit Console Interface"
 msgstr "പാക്കേജ്കിറ്റ് കണ്‍സോള്‍ ഇന്റര്‍ഫെയിസ്"
 
 #. these are commands we can use with pkcon
-#: ../client/pk-console.c:1675
+#: ../client/pk-console.c:1688
 msgid "Subcommands:"
 msgstr "സബ്കമാന്‍ഡുകള്‍:"
 
 #. TRANSLATORS: command line argument, if we should show debugging information
 #. TRANSLATORS: if we should show debugging data
-#: ../client/pk-console.c:1767 ../client/pk-generate-pack.c:185
+#: ../client/pk-console.c:1780 ../client/pk-generate-pack.c:185
 #: ../client/pk-monitor.c:125
-#: ../contrib/command-not-found/pk-command-not-found.c:518
-#: ../src/pk-main.c:201
+#: ../contrib/command-not-found/pk-command-not-found.c:521
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:532
+#: ../src/pk-main.c:211
 msgid "Show extra debugging information"
 msgstr "കൂടുതല്‍ ഡീബഗ്ഗിങ് വിവരം കാണിക്കുക"
 
 #. TRANSLATORS: command line argument, just show the version string
-#: ../client/pk-console.c:1770 ../client/pk-monitor.c:127
+#: ../client/pk-console.c:1783 ../client/pk-monitor.c:127
 msgid "Show the program version and exit"
 msgstr "പ്രോഗ്രാമിന്റെ പതിപ്പ് കാണിച്ചശേഷം പുറത്ത് കടക്കുക"
 
 #. TRANSLATORS: command line argument, use a filter to narrow down results
-#: ../client/pk-console.c:1773
+#: ../client/pk-console.c:1786
 msgid "Set the filter, e.g. installed"
 msgstr "ഫില്‍‌റ്റര്‍ ക്രമികരിക്കുക, e.g. ഇന്‍സ്റ്റോള്‍ ചെയ്തിരിക്കുന്നു"
 
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1776
+#: ../client/pk-console.c:1789
 msgid "Exit without waiting for actions to complete"
 msgstr "പൂര്‍ത്തിയാകുന്നതിനുള്ള പ്രവര്‍ത്തികള്‍ക്കായി കാത്തിരിക്കാതെ പുറത്ത് കടക്കുക"
 
 #. TRANSLATORS: This is when we could not connect to the system bus, and is fatal
-#: ../client/pk-console.c:1803
+#: ../client/pk-console.c:1816
 msgid "This tool could not connect to system DBUS."
 msgstr "സിസ്റ്റം ഡീബസിലേക്ക് കണക്ട് ചെയ്യുവാന്‍ ഈ പ്രയോഗത്തിനു് സാധ്യമല്ല."
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1894
+#: ../client/pk-console.c:1905
 msgid "The filter specified was invalid"
 msgstr "നല്‍കിയ ഫില്‍‌റ്റര്‍ തെറ്റാണു്"
 
 #. TRANSLATORS: a search type can be name, details, file, etc
-#: ../client/pk-console.c:1912
+#: ../client/pk-console.c:1923
 msgid "A search type is required, e.g. name"
 msgstr "തെരയുന്നതിനുള്ള തരം ആവശ്യമുണ്ടു്, ഉദാ. പേരു്"
 
 #. TRANSLATORS: the user needs to provide a search term
-#: ../client/pk-console.c:1918 ../client/pk-console.c:1926
-#: ../client/pk-console.c:1934 ../client/pk-console.c:1942
+#: ../client/pk-console.c:1929 ../client/pk-console.c:1937
+#: ../client/pk-console.c:1945 ../client/pk-console.c:1953
 msgid "A search term is required"
 msgstr "തെരയുന്നതിനുള്ള വാചകം ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1948
+#: ../client/pk-console.c:1959
 msgid "Invalid search type"
 msgstr "തെറ്റായ തരത്തിലുള്ള തെരച്ചില്‍"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1954
+#: ../client/pk-console.c:1965
 msgid "A package name or filename to install is required"
 msgstr "ഇന്‍സ്റ്റോള്‍ ചെയ്യുന്നതിനുള്ള പാക്കേജിന്റെ പേരു് അല്ലെങ്കില്‍ ഫയലിന്റെ പേരു് ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1962
+#: ../client/pk-console.c:1973
 msgid "A type, key_id and package_id are required"
 msgstr "ഏത് തരം, key_id, package_id എന്നിവ ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: the user did not specify what they wanted to remove
-#: ../client/pk-console.c:1970
+#: ../client/pk-console.c:1981
 msgid "A package name to remove is required"
 msgstr "നീക്കം ചെയ്യുവാനുള്ള പാക്കേജിന്റെ പേരു് ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: the user did not specify anything about what to download or where
-#: ../client/pk-console.c:1977
+#: ../client/pk-console.c:1988
 msgid "A destination directory and then the package names to download are required"
 msgstr "ഏതു് ഡയറക്ടറി എന്നും ഡൌണ്‍ലോട് ചെയ്യുവാനുള്ള പാക്കേജുകളും ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: the directory does not exist, so we can't continue
-#: ../client/pk-console.c:1983
+#: ../client/pk-console.c:1994
 msgid "Directory not found"
 msgstr "ഡയറക്ടറി ലഭ്യമല്ല"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1990
+#: ../client/pk-console.c:2001
 msgid "A licence identifier (eula-id) is required"
 msgstr "ലൈസന്‍സ് ഐഡന്റിഫയര്‍ (eula-id) ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1999
+#: ../client/pk-console.c:2010
 msgid "A transaction identifier (tid) is required"
 msgstr "ഒരു ട്രാന്‍സാക്ഷന്‍ ഐഡന്റിഫയര്‍ (tid) ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: The user did not specify a package name
-#: ../client/pk-console.c:2015
+#: ../client/pk-console.c:2026
 msgid "A package name to resolve is required"
 msgstr "റിസോള്‍വ് ചെയ്യുവാനുള്ള പാക്കേജിന്റെ പേരു് ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: The user did not specify a repository (software source) name
-#: ../client/pk-console.c:2023 ../client/pk-console.c:2031
+#: ../client/pk-console.c:2034 ../client/pk-console.c:2042
 msgid "A repository name is required"
 msgstr "സംഭരണിയ്ക്കുള്ള പേരു് ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:2039
+#: ../client/pk-console.c:2050
 msgid "A repo name, parameter and value are required"
 msgstr "ഒരു റിപ്പോയുടെ പേരും പരാമീറ്റരും മൂല്ല്യവും ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: The user didn't specify what action to use
-#: ../client/pk-console.c:2052
+#: ../client/pk-console.c:2063
 msgid "An action, e.g. 'update-system' is required"
 msgstr "ഒരു പ്രവര്‍ത്തി ആവശ്യമുണ്ടു്, ഉദാ. 'update-system'"
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:2058
+#: ../client/pk-console.c:2069
 msgid "A correct role is required"
 msgstr "ശരിയായ റോള്‍ ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: we keep a database updated with the time that an action was last executed
-#: ../client/pk-console.c:2064
+#: ../client/pk-console.c:2075
 msgid "Failed to get the time since this action was last completed"
 msgstr "ഈ പ്രവര്‍ത്തി അവസാനമായി പൂര്‍ത്തിയാക്കിയ സമയം ലഭ്യമായില്ല"
 
 #. TRANSLATORS: The user did not provide a package name
 #. TRANSLATORS: This is when the user fails to supply the package name
-#: ../client/pk-console.c:2073 ../client/pk-console.c:2084
-#: ../client/pk-console.c:2092 ../client/pk-console.c:2108
-#: ../client/pk-console.c:2116 ../client/pk-generate-pack.c:241
+#: ../client/pk-console.c:2084 ../client/pk-console.c:2095
+#: ../client/pk-console.c:2103 ../client/pk-console.c:2119
+#: ../client/pk-console.c:2127 ../client/pk-generate-pack.c:241
 msgid "A package name is required"
 msgstr "പാക്കേജിന്റ് പേരു് ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: each package "provides" certain things, e.g. mime(gstreamer-decoder-mp3), the user didn't specify it
-#: ../client/pk-console.c:2100
+#: ../client/pk-console.c:2111
 msgid "A package provide string is required"
 msgstr "പാക്കേജ് ലഭ്യമാക്കുന്ന സ്ട്രിങ് ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: The user didn't specify a filename to create as a list
-#: ../client/pk-console.c:2124
+#: ../client/pk-console.c:2135
 msgid "A list file name to create is required"
 msgstr "ലിസ്റ്റായി ഉണ്ടാക്കുവാനുള്ള ഫയലിന്റെ നാമം ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: The user didn't specify a filename to open as a list
-#: ../client/pk-console.c:2133 ../client/pk-console.c:2142
+#: ../client/pk-console.c:2144 ../client/pk-console.c:2153
 msgid "A list file to open is required"
 msgstr "ലിസ്റ്റായി തുറക്കുവാനുള്ള ഫയലിന്റെ നാമം ആവശ്യമുണ്ടു്"
 
 #. TRANSLATORS: The user tried to use an unsupported option on the command line
-#: ../client/pk-console.c:2195
+#: ../client/pk-console.c:2206
 #, c-format
 msgid "Option '%s' is not supported"
 msgstr "'%s' എന്ന ഐച്ഛികത്തിനുള്ള പിന്തുണ ലഭ്യമല്ല"
 
 #. TRANSLATORS: User does not have permission to do this
-#: ../client/pk-console.c:2208
+#: ../client/pk-console.c:2219
 msgid "Incorrect privileges for this operation"
 msgstr "ഈ പ്രക്രിയ നടപ്പിലാക്കുന്നതിനുള്ള തെറ്റായ അനുമതികള്‍"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:2211
+#: ../client/pk-console.c:2222
 msgid "Command failed"
 msgstr "നിര്‍ദ്ദേശം പരാജയപ്പെട്ടു"
 
@@ -667,7 +701,9 @@ msgstr "ചേര്‍ക്കേണ്ടാത്ത ഡിപന്‍ഡà´
 #. TRANSLATORS: the output location
 #: ../client/pk-generate-pack.c:191
 msgid "The output file or directory (the current directory is used if ommitted)"
-msgstr "ഔട്ട്പുട്ട് ഫയല്‍ അല്ലെങ്കില്‍ ഡയറക്ടറി (നല്‍കിയിട്ടില്ല എങ്കില്‍ നിലവിലുള്ള ഡയറക്ടറി ആണു് ഉപയോഗിക്കുന്നതു്)"
+msgstr ""
+"ഔട്ട്പുട്ട് ഫയല്‍ അല്ലെങ്കില്‍ ഡയറക്ടറി (നല്‍കിയിട്ടില്ല എങ്കില്‍ നിലവിലുള്ള ഡയറക്ടറി ആണു് "
+"ഉപയോഗിക്കുന്നതു്)"
 
 #. TRANSLATORS: put a list of packages in the pack
 #: ../client/pk-generate-pack.c:194
@@ -700,55 +736,64 @@ msgstr "ഒരു ഔട്ട്പുട്ട് ഡയറക്ടറി അ
 msgid "The package manager cannot perform this type of operation."
 msgstr "പാക്കേജ് നിരീക്ഷകനു് ഈ തരത്തിലുള്ള പ്രക്രിയ നടത്തുവാന്‍ സാധ്യമല്ല"
 
+#. TRANSLATORS: This is when the distro didn't include libarchive support into PK
+#: ../client/pk-generate-pack.c:280
+msgid ""
+"Service packs cannot be created as PackageKit was not built with libarchive "
+"support."
+msgstr ""
+"libarchive പിന്തുണ ഇല്ലാതെ PackageKit ഉണ്ടാക്കിയതിനാല്‍, സര്‍വീസ് പാക്കുകള്‍ "
+"ലഭ്യമാകുന്നതല്ല."
+
 #. TRANSLATORS: the user specified an absolute path, but didn't get the extension correct
-#: ../client/pk-generate-pack.c:285
+#: ../client/pk-generate-pack.c:291
 msgid "If specifying a file, the service pack name must end with"
 msgstr "ഒരു ഫയല്‍ നല്‍കുന്നു എങ്കില്‍, സര്‍വീസ് പാക്ക് അവസാനിക്കേണ്ടതു്"
 
 #. TRANSLATORS: This is when file already exists
-#: ../client/pk-generate-pack.c:301
+#: ../client/pk-generate-pack.c:307
 msgid "A pack with the same name already exists, do you want to overwrite it?"
 msgstr "ഇതേ പേരില്‍ ഒരു ഫയല്‍ നിലവിലുണ്ടു്, അതു് മാറ്റി എഴുതണമോ?"
 
 #. TRANSLATORS: This is when the pack was not overwritten
-#: ../client/pk-generate-pack.c:304
+#: ../client/pk-generate-pack.c:310
 msgid "The pack was not overwritten."
 msgstr "ഫയല്‍ തിരുത്തിയെഴുതിയിട്ടില്ല."
 
 #. TRANSLATORS: This is when the temporary directory cannot be created, the directory name follows
-#: ../client/pk-generate-pack.c:317
+#: ../client/pk-generate-pack.c:323
 msgid "Failed to create directory:"
 msgstr "ഡയറക്ടറി ഉണ്ടാക്കുന്നതില്‍ പരാജയം:"
 
 #. TRANSLATORS: This is when the list of packages from the remote computer cannot be opened
-#: ../client/pk-generate-pack.c:327
+#: ../client/pk-generate-pack.c:333
 msgid "Failed to open package list."
 msgstr "പാക്കേജുകളുടെ പട്ടിക തുറക്കുന്നതില്‍ പരാജയം."
 
 #. TRANSLATORS: The package name is being matched up to available packages
-#: ../client/pk-generate-pack.c:338
+#: ../client/pk-generate-pack.c:344
 msgid "Finding package name."
 msgstr "പാക്കേജിന്റെ പേര് കണ്ടുപിടിക്കുന്നു."
 
 #. TRANSLATORS: This is when the package cannot be found in any software source. The detailed error follows
-#: ../client/pk-generate-pack.c:342
+#: ../client/pk-generate-pack.c:348
 #, c-format
 msgid "Failed to find package '%s': %s"
 msgstr "'%s' എന്ന പാക്കേജ് കണ്ടുപിടിക്കുവാനായില്ല: %s"
 
 #. TRANSLATORS: This is telling the user we are in the process of making the pack
-#: ../client/pk-generate-pack.c:359
+#: ../client/pk-generate-pack.c:365
 msgid "Creating service pack..."
 msgstr "സര്‍വീസ് പാക്ക് ഉണ്ടാക്കുന്നു..."
 
 #. TRANSLATORS: we succeeded in making the file
-#: ../client/pk-generate-pack.c:366
+#: ../client/pk-generate-pack.c:372
 #, c-format
 msgid "Service pack created '%s'"
 msgstr "'%s' സര്‍വീസ് പാക്ക് ഉണ്ടാക്കിയിരിക്കുന്നു"
 
 #. TRANSLATORS: we failed to make te file
-#: ../client/pk-generate-pack.c:371
+#: ../client/pk-generate-pack.c:377
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "'%s' ഉണ്ടാക്കുന്നതില്‍ പരാജയം: %s"
@@ -780,128 +825,312 @@ msgid "Please enter a number from 1 to %i: "
 msgstr "ദയവായി 1 മുതല്‍ %i വരെയുള്ള ഒരു അക്കം നല്‍കുക: "
 
 #. TRANSLATORS: we failed to find the package, this shouldn't happen
-#: ../contrib/command-not-found/pk-command-not-found.c:369
+#: ../contrib/command-not-found/pk-command-not-found.c:372
 msgid "Failed to search for file"
 msgstr "ഫയല്‍ കണ്ടുപിടിക്കുന്നതില്‍ പരാജയപ്പെട്ടു"
 
 #. TRANSLATORS: we failed to launch the executable, the error follows
-#: ../contrib/command-not-found/pk-command-not-found.c:493
+#: ../contrib/command-not-found/pk-command-not-found.c:496
 msgid "Failed to launch:"
 msgstr "ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു:"
 
 #. TRANSLATORS: tool that gets called when the command is not found
-#: ../contrib/command-not-found/pk-command-not-found.c:534
+#: ../contrib/command-not-found/pk-command-not-found.c:537
 msgid "PackageKit Command Not Found"
 msgstr "പാക്കേജ്കിറ്റ് കമാന്‍ഡ് ലഭ്യമായില്ല"
 
 #. TRANSLATORS: the prefix of all the output telling the user why it's not executing
-#: ../contrib/command-not-found/pk-command-not-found.c:557
+#: ../contrib/command-not-found/pk-command-not-found.c:560
 msgid "Command not found."
 msgstr "കമാന്‍ഡ് ലഭ്യമായില്ല."
 
 #. TRANSLATORS: tell the user what we think the command is
-#: ../contrib/command-not-found/pk-command-not-found.c:564
+#: ../contrib/command-not-found/pk-command-not-found.c:567
 msgid "Similar command is:"
 msgstr "ഇതു് പോലുള്ള കമാന്‍ഡ്:"
 
 #. TRANSLATORS: Ask the user if we should run the similar command
-#: ../contrib/command-not-found/pk-command-not-found.c:573
+#: ../contrib/command-not-found/pk-command-not-found.c:576
 msgid "Run similar command:"
 msgstr "ഇതുപോലുള്ള കമാന്‍ഡ് പ്രവര്‍ത്തിക്കുക:"
 
 #. TRANSLATORS: show the user a list of commands that they could have meant
 #. TRANSLATORS: show the user a list of commands we could run
-#: ../contrib/command-not-found/pk-command-not-found.c:585
-#: ../contrib/command-not-found/pk-command-not-found.c:594
+#: ../contrib/command-not-found/pk-command-not-found.c:588
+#: ../contrib/command-not-found/pk-command-not-found.c:597
 msgid "Similar commands are:"
 msgstr "ഇതു് പോലുള്ള കമാന്‍ഡുകള്‍:"
 
 #. TRANSLATORS: ask the user to choose a file to run
-#: ../contrib/command-not-found/pk-command-not-found.c:601
+#: ../contrib/command-not-found/pk-command-not-found.c:604
 msgid "Please choose a command to run"
 msgstr "പ്രവര്‍ത്തിപ്പിക്കുന്നതിനുള്ള കമാന്‍ഡ് ദയവായി തെരഞ്ഞെടുക്കുക"
 
 #. TRANSLATORS: tell the user what package provides the command
-#: ../contrib/command-not-found/pk-command-not-found.c:616
+#: ../contrib/command-not-found/pk-command-not-found.c:619
 msgid "The package providing this file is:"
 msgstr "ഈ ഫയല്‍ ലഭ്യമാക്കുന്ന പാക്കേജ്:"
 
 #. TRANSLATORS: as the user if we want to install a package to provide the command
-#: ../contrib/command-not-found/pk-command-not-found.c:621
+#: ../contrib/command-not-found/pk-command-not-found.c:624
 #, c-format
 msgid "Install package '%s' to provide command '%s'?"
 msgstr "'%s' പാക്കേജ് ഇന്‍സ്റ്റോള്‍ ചെയ്യുക, ഇതു് '%s' നിര്‍ദ്ദേശം നല്‍കുന്നു?"
 
 #. TRANSLATORS: Show the user a list of packages that provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:642
+#: ../contrib/command-not-found/pk-command-not-found.c:645
 msgid "Packages providing this file are:"
 msgstr "ഈ ഫയല്‍ ലഭ്യമാക്കുന്ന പാക്കേജുകള്‍:"
 
 #. TRANSLATORS: Show the user a list of packages that they can install to provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:651
+#: ../contrib/command-not-found/pk-command-not-found.c:654
 msgid "Suitable packages are:"
 msgstr "ഉചിതമായ പാക്കേജുകള്‍:"
 
 #. get selection
 #. TRANSLATORS: ask the user to choose a file to install
-#: ../contrib/command-not-found/pk-command-not-found.c:659
+#: ../contrib/command-not-found/pk-command-not-found.c:662
 msgid "Please choose a package to install"
 msgstr "ദയവായി ഇന്‍സ്റ്റോള്‍ ചെയ്യുന്നതിനായി ഒരു പാക്കേജ് തെരഞ്ഞെടുക്കുക"
 
 #. TRANSLATORS: when we are getting data from the daemon
-#: ../contrib/browser-plugin/src/contents.cpp:298
+#: ../contrib/browser-plugin/src/contents.cpp:299
 msgid "Getting package information..."
 msgstr "പാക്കേജ് സംബന്ധിച്ചുള്ള വിവരം ലഭ്യമാകുന്നു..."
 
 #. TRANSLATORS: run an applicaiton
-#: ../contrib/browser-plugin/src/contents.cpp:304
+#: ../contrib/browser-plugin/src/contents.cpp:305
 #, c-format
 msgid "Run %s"
 msgstr "%s പ്രവര്‍ത്തിപ്പിക്കുക"
 
 #. TRANSLATORS: show the installed version of a package
-#: ../contrib/browser-plugin/src/contents.cpp:310
+#: ../contrib/browser-plugin/src/contents.cpp:311
 msgid "Installed version"
 msgstr "ഇന്‍സ്റ്റോള്‍ ചെയ്തിരിക്കുന്ന പതിപ്പ്"
 
 #. TRANSLATORS: run the application now
-#: ../contrib/browser-plugin/src/contents.cpp:318
+#: ../contrib/browser-plugin/src/contents.cpp:319
 #, c-format
 msgid "Run version %s now"
 msgstr "%s എന്ന പതിപ്പ് ഉടന്‍ പ്രവര്‍ത്തിപ്പിക്കുക"
 
 #. TRANSLATORS: run the application now
-#: ../contrib/browser-plugin/src/contents.cpp:324
+#: ../contrib/browser-plugin/src/contents.cpp:325
 msgid "Run now"
 msgstr "ഉടന്‍ പ്രവര്‍ത്തിപ്പിക്കുക"
 
 #. TRANSLATORS: update to a new version of the package
-#: ../contrib/browser-plugin/src/contents.cpp:330
+#: ../contrib/browser-plugin/src/contents.cpp:331
 #, c-format
 msgid "Update to version %s"
 msgstr "%s എന്ന പതിപ്പിലേക്ക് പരിഷ്കരിക്കുക"
 
 #. TRANSLATORS: To install a package
-#: ../contrib/browser-plugin/src/contents.cpp:336
+#: ../contrib/browser-plugin/src/contents.cpp:337
 #, c-format
 msgid "Install %s now"
 msgstr "%s ഉടന്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യുക"
 
 #. TRANSLATORS: the version of the package
-#: ../contrib/browser-plugin/src/contents.cpp:339
+#: ../contrib/browser-plugin/src/contents.cpp:340
 msgid "Version"
 msgstr "പതിപ്പ്"
 
 #. TRANSLATORS: noting found, so can't install
-#: ../contrib/browser-plugin/src/contents.cpp:344
+#: ../contrib/browser-plugin/src/contents.cpp:345
 msgid "No packages found for your system"
 msgstr "നിങ്ങളുടെ സിസ്റ്റമില്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യുന്നതിനുള്ള പാക്കേജുകള്‍ ലഭ്യമല്ല"
 
 #. TRANSLATORS: package is being installed
-#: ../contrib/browser-plugin/src/contents.cpp:349
+#: ../contrib/browser-plugin/src/contents.cpp:350
 msgid "Installing..."
 msgstr "ഇന്‍സ്റ്റോള്‍ ചെയ്യുന്നു..."
 
+#. TRANSLATORS: we are starting to install the packages
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:186
+msgid "Starting install"
+msgstr "ഇന്‍സ്റ്റോള്‍ ചെയ്യുവാന്‍ ആരംഭിക്കുന്നു"
+
+#. TRANSLATORS: we couldn't find the package name, non-fatal
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:379
+#, c-format
+msgid "Failed to find the package %s, or already installed: %s"
+msgstr "%s എന്ന പാക്കേജ് നിലവില്‍ ലഭ്യമല്ല അല്ലെങ്കില്‍ കമ്പ്യൂട്ടറില്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്തിരിക്കുന്നു: %s"
+
+#. command line argument, simulate what would be done, but don't actually do it
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:535
+msgid "Don't actually install any packages, only simulate what would be installed"
+msgstr "പാക്കേജുകള്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യേണ്ട പകരം, ഇന്‍സ്റ്റോള്‍ ചെയ്യേണ്ടവ സിമുലേറ്റ് ചെയ്യുക"
+
+#. command line argument, do we skip packages that depend on the ones specified
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:538
+msgid "Do not install dependencies of the core packages"
+msgstr "കോര്‍ പാക്കേജുകളുടെ ഡിപന്‍ഡന്‍സികള്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യരുതു്"
+
+#. command line argument, do we operate quietly
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:541
+msgid "Do not display information or progress"
+msgstr "വിവരം അല്ലെങ്കില്‍ പുരോഗതി ലഭ്യമാക്കേണ്ട"
+
+#. TRANSLATORS: tool that gets called when the command is not found
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:559
+msgid "PackageKit Debuginfo Installer"
+msgstr "PackageKit Debuginfo Installer"
+
+#. TRANSLATORS: the use needs to specify a list of package names on the command line
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:571
+#, c-format
+msgid "ERROR: Specify package names to install."
+msgstr "പിശക്: ഇന്‍സ്റ്റോള്‍ ചെയ്യുവാനുള്ള പാക്കേജുകള്‍ വ്യക്തമാക്കുക."
+
+#. TRANSLATORS: we are getting the list of repositories
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:605
+#, c-format
+msgid "Getting sources list"
+msgstr "റിപ്പോസിറ്ററികളുടെ വിവരം ലഭ്യമാകുന്നു"
+
+#. TRANSLATORS: all completed 100%
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:623
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:663
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:698
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:782
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:826
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:893
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:937
+#, c-format
+msgid "OK."
+msgstr "ശരി."
+
+#. TRANSLATORS: tell the user what we found
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:626
+#, c-format
+msgid "Found %i enabled and %i disabled sources."
+msgstr "%i സജ്ജമാക്കിയവയും %i പ്രവര്‍ത്തന രഹിതവുമായ സോഴ്സുകള്‍ ലഭ്യമാണു്."
+
+#. TRANSLATORS: we're finding repositories that match out pattern
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:633
+#, c-format
+msgid "Finding debugging sources"
+msgstr "ഡീബഗ്ഗിങ് സോഴ്സുകള്‍ ലഭ്യമാക്കുന്നു"
+
+#. TRANSLATORS: tell the user what we found
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:666
+#, c-format
+msgid "Found %i disabled debuginfo repos."
+msgstr "പ്രവര്‍ത്തന രഹിതമായ %i debuginfo റിപ്പോകള്‍ ലഭ്യമാക്കിയിരിക്കുന്നു."
+
+#. TRANSLATORS: we're now enabling all the debug sources we found
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:673
+#, c-format
+msgid "Enabling debugging sources"
+msgstr "ഡീബഗ്ഗിങ് സോഴ്സുകള്‍ സജ്ജമാക്കുന്നു"
+
+#. TRANSLATORS: operation was not successful
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:683
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:767
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:811
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:878
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:922
+msgid "FAILED."
+msgstr "FAILED."
+
+#. TRANSLATORS: tell the user how many we enabled
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:701
+#, c-format
+msgid "Enabled %i debugging sources."
+msgstr "%i ഡീബഗ്ഗിങ് സോഴ്സുകള്‍ സജ്ജമാക്കിയിരിക്കുന്നു."
+
+#. TRANSLATORS: we're now finding packages that match in all the repos
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:708
+#, c-format
+msgid "Finding debugging packages"
+msgstr "എല്ലാ റിപ്പോകളിലുമുള്ള പാക്കേജുകള്‍ (ഡീബഗ്ഗിങ്) കണ്ടുപിടിക്കുന്നു."
+
+#. TRANSLATORS: we couldn't find the package name, non-fatal
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:720
+#, c-format
+msgid "Failed to find the package %s: %s"
+msgstr "%s എന്ന പാക്കേജ് കണ്ടുപിടിക്കുവാനായില്ല: %s"
+
+#. TRANSLATORS: we couldn't find the debuginfo package name, non-fatal
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:743
+#, c-format
+msgid "Failed to find the debuginfo package %s: %s"
+msgstr "debuginfo പാക്കേജ് %s കണ്ടുപിടിക്കുവാനായില്ല: %s"
+
+#. TRANSLATORS: no debuginfo packages could be found to be installed
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:771
+#, c-format
+msgid "Found no packages to install."
+msgstr "ഇന്‍സ്റ്റോള്‍ ചെയ്യുവാന്‍ പാക്കേജുകള്‍ ലഭ്യമായില്ല."
+
+#. TRANSLATORS: tell the user we found some packages, and then list them
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:785
+#, c-format
+msgid "Found %i packages:"
+msgstr "%i പാക്കേജുകള്‍ ലഭ്യമായി:"
+
+#. TRANSLATORS: tell the user we are searching for deps
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:801
+#, c-format
+msgid "Finding packages that depend on these packages"
+msgstr "ഈ പാക്കേജുകളെ ആശ്രയിക്കുന്ന പാക്കേജുകള്‍ ലഭ്യമാക്കുന്നു"
+
+#. TRANSLATORS: could not install, detailed error follows
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:814
+#, c-format
+msgid "Could not find dependant packages: %s"
+msgstr "ഡിപന്‍ഡന്റ് പാക്കേജുകള്‍ കണ്ടുപിടിക്കുവാനായില്ല: %s"
+
+#. TRANSLATORS: tell the user we found some more packages
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:830
+#, c-format
+msgid "Found %i extra packages."
+msgstr "അധികമായ %i പാക്കേജുകള്‍ ലഭ്യമായിരിക്കുന്നു."
+
+#. TRANSLATORS: tell the user we found some more packages
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:834
+#, c-format
+msgid "No extra packages required."
+msgstr "അധികമായ പാക്കേജുകള്‍ ആവശ്യമില്ല."
+
+#. TRANSLATORS: tell the user we found some packages (and deps), and then list them
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:843
+#, c-format
+msgid "Found %i packages to install:"
+msgstr "%i പാക്കേജുകള്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യുവാനുണ്ടു്:"
+
+#. TRANSLATORS: simulate mode is a testing mode where we quit before the action
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:856
+#, c-format
+msgid "Not installing packages in simulate mode"
+msgstr "സിമുലേറ്റ് മോഡില്‍ പാക്കേജുകള്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യുന്നതല്ല"
+
+#. TRANSLATORS: coul dnot install, detailed error follows
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:881
+#, c-format
+msgid "Could not install packages: %s"
+msgstr "പാക്കേജുകള്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യുവാന്‍ സാധ്യമല്ല: %s"
+
+#. TRANSLATORS: we are now disabling all debuginfo repos we previously enabled
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:913
+#, c-format
+msgid "Disabling sources previously enabled"
+msgstr "മുമ്പ് സജ്ജമാക്കിയ സോഴ്സുകള്‍ പ്രവര്‍ത്തന രഹിതമാക്കുന്നു"
+
+#. TRANSLATORS: no debuginfo packages could be found to be installed, detailed error follows
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:925
+#, c-format
+msgid "Could not disable the debugging sources: %s"
+msgstr "ഡീബഗ്ഗിങ് സോഴ്സുകള്‍ പ്രവര്‍ത്തന രഹിതമാക്കുവാന്‍ സാധിച്ചില്ല: %s"
+
+#. TRANSLATORS: we disabled all the debugging repos that we enabled before
+#: ../contrib/debuginfo-install/pk-debuginfo-install.c:940
+#, c-format
+msgid "Disabled %i debugging sources."
+msgstr "%i ഡീബഗ്ഗിങ് സോഴ്സുകള്‍ പ്രവര്‍ത്തന രഹിതമാക്കിയിരിക്കുന്നു."
+
 #: ../data/packagekit-catalog.xml.in.h:1
 msgid "PackageKit Catalog"
 msgstr "പാക്കേജ്കിറ്റിനുള്ള കാറ്റലോഗ്"
@@ -935,8 +1164,8 @@ msgid ""
 "Authentication is required to consider a key used for signing packages as "
 "trusted"
 msgstr ""
-"പാക്കേജ് ഒപ്പിടുന്നതിനായി ഉപയോഗിക്കുന്ന ഒരു കീ വിശ്വസനീയമെന്നു് കരുതുന്നതിനായി "
-"ആധികാരികത ഉറപ്പാക്കേണ്ടതുണ്ടു്"
+"പാക്കേജ് ഒപ്പിടുന്നതിനായി ഉപയോഗിക്കുന്ന ഒരു കീ വിശ്വസനീയമെന്നു് കരുതുന്നതിനായി ആധികാരികത "
+"ഉറപ്പാക്കേണ്ടതുണ്ടു്"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:6
 msgid "Authentication is required to install a signed package"
@@ -963,8 +1192,8 @@ msgid ""
 "Authentication is required to set the network proxy used for downloading "
 "packages"
 msgstr ""
-"പാക്കേജുകള്‍ ഡൌണ്‍ലോട് ചെയ്യുന്നതിനുള്ള നെറ്റ്‌വര്‍ക്ക് പ്രോക്സി സജ്ജമാക്കുന്നതിനായി "
-"ആധികാരികത ഉറപ്പാക്കേണ്ടതുണ്ടു്."
+"പാക്കേജുകള്‍ ഡൌണ്‍ലോട് ചെയ്യുന്നതിനുള്ള നെറ്റ്‌വര്‍ക്ക് പ്രോക്സി സജ്ജമാക്കുന്നതിനായി ആധികാരികത "
+"ഉറപ്പാക്കേണ്ടതുണ്ടു്."
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:12
 msgid "Authentication is required to update packages"
@@ -1033,48 +1262,76 @@ msgid ""
 msgstr "സിസ്റ്റം ഡയറക്ടറിയില്‍ org.freedesktop.PackageKit.conf ഫയല്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്തിട്ടില്ല:"
 
 #. TRANSLATORS: a backend is the system package tool, e.g. yum, apt
-#: ../src/pk-main.c:195
+#: ../src/pk-main.c:205
 msgid "Packaging backend to use, e.g. dummy"
 msgstr "ഉപയോഗിക്കുന്നതിനായി ബാക്കെന്‍ഡ് പാക്കേജ് ചെയ്യുന്നു, ഉദാ. dummy"
 
 #. TRANSLATORS: if we should run in the background
-#: ../src/pk-main.c:198
+#: ../src/pk-main.c:208
 msgid "Daemonize and detach from the terminal"
 msgstr "ഡെമണൈസ് ചെയ്ത് ടെര്‍മിനലില്‍ നിന്നും വേര്‍പെടുത്തുക"
 
 #. TRANSLATORS: if we should not monitor how long we are inactive for
-#: ../src/pk-main.c:204
+#: ../src/pk-main.c:214
 msgid "Disable the idle timer"
 msgstr "ഐഡില്‍ ടൈമര്‍ പ്രവര്‍ത്തന രഹിതമാക്കുക"
 
 #. TRANSLATORS: show version
-#: ../src/pk-main.c:207
+#: ../src/pk-main.c:217
 msgid "Show version and exit"
 msgstr "പതിപ്പ് കാണിച്ചശേഷം പുറത്ത് കടക്കുക"
 
 #. TRANSLATORS: exit after we've started up, used for user profiling
-#: ../src/pk-main.c:210
+#: ../src/pk-main.c:220
 msgid "Exit after a small delay"
 msgstr "ഒരു ചെറിയ താമസത്തിനു് ശേഷം പുറത്ത് കടക്കുക"
 
 #. TRANSLATORS: exit straight away, used for automatic profiling
-#: ../src/pk-main.c:213
+#: ../src/pk-main.c:223
 msgid "Exit after the engine has loaded"
 msgstr "എഞ്ചിന്‍ ലഭ്യമാക്കിയ ശേഷം പുറത്ത് കടക്കുക"
 
 #. TRANSLATORS: describing the service that is running
-#: ../src/pk-main.c:228
+#: ../src/pk-main.c:238
 msgid "PackageKit service"
 msgstr "പാക്കേജ്കിറ്റ് സര്‍വീസ്"
 
 #. TRANSLATORS: fatal error, dbus is not running
-#: ../src/pk-main.c:265
+#: ../src/pk-main.c:275
 msgid "Cannot connect to the system bus"
 msgstr "സിസ്റ്റം ബസിലേക്ക് കണക്ട് ചെയ്യുവാന്‍ സാധ്യമായില്ല"
 
-#. TRANSLATORS: cannot register on system bus, unknown reason
-#: ../src/pk-main.c:317
-#, c-format
+#. TRANSLATORS: cannot register on system bus, unknown reason -- geeky error follows
+#: ../src/pk-main.c:331
 msgid "Error trying to start:"
 msgstr "ആരംഭിക്കുന്നതിനിടെ പിശക് സംഭവിച്ചിരിക്കുന്നു:"
 
+#: ../src/pk-polkit-action-lookup.c:143
+msgid "To install debugging packages, extra sources need to be enabled"
+msgstr "ഡീബഗ്ഗിങ് പാക്കേജുകള്‍ ഇന്‍സ്റ്റോള്‍ ചെയ്യുന്നതിനായി, അധികമായ സോഴ്സുകള്‍ സജ്ജമാക്കേണ്ടതുണ്ടു്"
+
+#. TRANSLATORS: is not GPG signed
+#: ../src/pk-polkit-action-lookup.c:156 ../src/pk-polkit-action-lookup.c:175
+msgid "The software is not from a trusted source."
+msgstr "സോഫ്റ്റ്‌വെയര്‍ ഒരു ട്രസ്റ്റഡ് സോഴ്സില്‍ നിന്നുമല്ല."
+
+#. TRANSLATORS: user has to trust provider -- I know, this sucks
+#: ../src/pk-polkit-action-lookup.c:160
+msgid "Do not update this package unless you are sure it is safe to do so."
+msgstr "ഈ പാക്കേജ് സുരക്ഷിതമാണു് എന്നുറപ്പു് വരുത്താതെ ഇതു് പരിഷ്കരിക്കരുത്."
+
+#. TRANSLATORS: warn the user that all bets are off
+#: ../src/pk-polkit-action-lookup.c:164 ../src/pk-polkit-action-lookup.c:183
+msgid "Malicious software can damage your computer or cause other harm."
+msgstr "അപകടകരമായ സോഫ്റ്റ്‌വെയര്‍ നിങ്ങളുടെ കമ്പ്യൂട്ടറിനെ നശിപ്പിക്കുന്നു."
+
+#. TRANSLATORS: user has to trust provider -- I know, this sucks
+#: ../src/pk-polkit-action-lookup.c:179
+msgid "Do not install this package unless you are sure it is safe to do so."
+msgstr "ഈ പാക്കേജ് സുരക്ഷിതമാണു് എന്നുറപ്പു് വരുത്താതെ ഇതു് ഇന്‍സ്റ്റോള്‍ ചെയ്യരുതു്."
+
+#. TRANSLATORS: if the transaction is forced to install only trusted packages
+#: ../src/pk-polkit-action-lookup.c:263
+msgid "Only trusted"
+msgstr "ട്രസ്റ്റഡ് മാത്രം"
+


More information about the PackageKit-commit mailing list