[packagekit] packagekit: Branch 'master' - 11 commits
Richard Hughes
hughsient at kemper.freedesktop.org
Tue Oct 16 13:29:03 PDT 2007
HACKING | 85 ++++++++++++++++++++++++++
TODO | 3
backends/yum/helpers/yumBackend.py | 13 ----
client/pk-console.c | 59 +++++++-----------
client/pk-monitor.c | 2
docs/config.xsl | 1
libpackagekit/pk-common.c | 100 +++++++++++++++++++++++++++++++
libpackagekit/pk-common.h | 1
libpackagekit/pk-task-list.c | 31 ++++++---
libpackagekit/pk-task-list.h | 4 -
src/pk-engine.c | 118 +++++++++++++++++++++++++++++++++++++
src/pk-engine.h | 1
12 files changed, 359 insertions(+), 59 deletions(-)
New commits:
commit d48de972ab2d5e1acc74c6846b239f0452ec3cf6
Author: Richard Hughes <richard at hughsie.com>
Date: Tue Oct 16 21:27:11 2007 +0100
be really paranoid about bad chars in user supplied strings
diff --git a/TODO b/TODO
index 50caeba..bb731c8 100644
--- a/TODO
+++ b/TODO
@@ -28,6 +28,3 @@ To do rollbacks sanely in PK we need a few things:
*** Use resolve for pkcon operations ***
'pkcon install zsh' should work as well as 'pkcon install "zsh;1.0;i386;repo"'
-*** check all user input for bad chars... ***
-Be really paranoid....
-
diff --git a/src/pk-engine.c b/src/pk-engine.c
index b69a405..bf5dc49 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -138,6 +138,7 @@ pk_engine_error_get_type (void)
ENUM_ENTRY (PK_ENGINE_ERROR_PACKAGE_ID_INVALID, "PackageIdInvalid"),
ENUM_ENTRY (PK_ENGINE_ERROR_SEARCH_INVALID, "SearchInvalid"),
ENUM_ENTRY (PK_ENGINE_ERROR_FILTER_INVALID, "FilterInvalid"),
+ ENUM_ENTRY (PK_ENGINE_ERROR_INPUT_INVALID, "InputInvalid"),
ENUM_ENTRY (PK_ENGINE_ERROR_INVALID_STATE, "InvalidState"),
ENUM_ENTRY (PK_ENGINE_ERROR_INITIALIZE_FAILED, "InitializeFailed"),
{ 0, 0, 0 }
@@ -988,6 +989,7 @@ gboolean
pk_engine_search_check (const gchar *search, GError **error)
{
guint size;
+ gboolean ret;
/* ITS4: ignore, not used for allocation */
size = strlen (search);
@@ -1017,6 +1019,12 @@ pk_engine_search_check (const gchar *search, GError **error)
"Invalid search containing '?'");
return FALSE;
}
+ ret = pk_validate_input (search);
+ if (ret == FALSE) {
+ g_set_error (error, PK_ENGINE_ERROR, PK_ENGINE_ERROR_INPUT_INVALID,
+ "Invalid search term");
+ return FALSE;
+ }
return TRUE;
}
@@ -1028,6 +1036,14 @@ pk_engine_filter_check (const gchar *filter, GError **error)
{
gboolean ret;
+ /* check for invalid input */
+ ret = pk_validate_input (filter);
+ if (ret == FALSE) {
+ g_set_error (error, PK_ENGINE_ERROR, PK_ENGINE_ERROR_INPUT_INVALID,
+ "Invalid filter term");
+ return FALSE;
+ }
+
/* check for invalid filter */
ret = pk_filter_check (filter);
if (ret == FALSE) {
@@ -1262,6 +1278,14 @@ pk_engine_resolve (PkEngine *engine, const gchar *tid, const gchar *package, GEr
return FALSE;
}
+ /* check for sanity */
+ ret = pk_validate_input (package);
+ if (ret == FALSE) {
+ g_set_error (error, PK_ENGINE_ERROR, PK_ENGINE_ERROR_INPUT_INVALID,
+ "Invalid input passed to daemon");
+ return FALSE;
+ }
+
/* create a new backend */
item->backend = pk_engine_backend_new (engine);
if (item->backend == NULL) {
@@ -1301,6 +1325,14 @@ pk_engine_get_depends (PkEngine *engine, const gchar *tid, const gchar *package_
return FALSE;
}
+ /* check for sanity */
+ ret = pk_validate_input (package_id);
+ if (ret == FALSE) {
+ *error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_INPUT_INVALID,
+ "Invalid input passed to daemon");
+ return FALSE;
+ }
+
/* check package_id */
ret = pk_package_id_check (package_id);
if (ret == FALSE) {
@@ -1348,6 +1380,14 @@ pk_engine_get_requires (PkEngine *engine, const gchar *tid, const gchar *package
return FALSE;
}
+ /* check for sanity */
+ ret = pk_validate_input (package_id);
+ if (ret == FALSE) {
+ *error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_INPUT_INVALID,
+ "Invalid input passed to daemon");
+ return FALSE;
+ }
+
/* check package_id */
ret = pk_package_id_check (package_id);
if (ret == FALSE) {
@@ -1395,6 +1435,14 @@ pk_engine_get_update_detail (PkEngine *engine, const gchar *tid, const gchar *pa
return FALSE;
}
+ /* check for sanity */
+ ret = pk_validate_input (package_id);
+ if (ret == FALSE) {
+ *error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_INPUT_INVALID,
+ "Invalid input passed to daemon");
+ return FALSE;
+ }
+
/* check package_id */
ret = pk_package_id_check (package_id);
if (ret == FALSE) {
@@ -1442,6 +1490,22 @@ pk_engine_get_description (PkEngine *engine, const gchar *tid, const gchar *pack
return FALSE;
}
+ /* check for sanity */
+ ret = pk_validate_input (package_id);
+ if (ret == FALSE) {
+ *error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_INPUT_INVALID,
+ "Invalid input passed to daemon");
+ return FALSE;
+ }
+
+ /* check package_id */
+ ret = pk_package_id_check (package_id);
+ if (ret == FALSE) {
+ *error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_PACKAGE_ID_INVALID,
+ "The package id '%s' is not valid", package_id);
+ return FALSE;
+ }
+
/* create a new backend */
item->backend = pk_engine_backend_new (engine);
if (item->backend == NULL) {
@@ -1542,6 +1606,15 @@ pk_engine_remove_package (PkEngine *engine, const gchar *tid, const gchar *packa
return;
}
+ /* check for sanity */
+ ret = pk_validate_input (package_id);
+ if (ret == FALSE) {
+ error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_INPUT_INVALID,
+ "Invalid input passed to daemon");
+ dbus_g_method_return_error (context, error);
+ return;
+ }
+
/* check package_id */
ret = pk_package_id_check (package_id);
if (ret == FALSE) {
@@ -1604,6 +1677,15 @@ pk_engine_install_package (PkEngine *engine, const gchar *tid, const gchar *pack
return;
}
+ /* check for sanity */
+ ret = pk_validate_input (package_id);
+ if (ret == FALSE) {
+ error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_INPUT_INVALID,
+ "Invalid input passed to daemon");
+ dbus_g_method_return_error (context, error);
+ return;
+ }
+
/* check package_id */
ret = pk_package_id_check (package_id);
if (ret == FALSE) {
@@ -1728,6 +1810,15 @@ pk_engine_rollback (PkEngine *engine, const gchar *tid, const gchar *transaction
return;
}
+ /* check for sanity */
+ ret = pk_validate_input (transaction_id);
+ if (ret == FALSE) {
+ error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_INPUT_INVALID,
+ "Invalid input passed to daemon");
+ dbus_g_method_return_error (context, error);
+ return;
+ }
+
/* check with PolicyKit if the action is allowed from this client - if not, set an error */
ret = pk_engine_action_is_allowed (engine, context, PK_ROLE_ENUM_ROLLBACK, &error);
if (ret == FALSE) {
@@ -1781,6 +1872,15 @@ pk_engine_update_package (PkEngine *engine, const gchar *tid, const gchar *packa
return;
}
+ /* check for sanity */
+ ret = pk_validate_input (package_id);
+ if (ret == FALSE) {
+ error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_INPUT_INVALID,
+ "Invalid input passed to daemon");
+ dbus_g_method_return_error (context, error);
+ return;
+ }
+
/* check package_id */
ret = pk_package_id_check (package_id);
if (ret == FALSE) {
@@ -1882,6 +1982,15 @@ pk_engine_repo_enable (PkEngine *engine, const gchar *tid, const gchar *repo_id,
return;
}
+ /* check for sanity */
+ ret = pk_validate_input (repo_id);
+ if (ret == FALSE) {
+ error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_INPUT_INVALID,
+ "Invalid input passed to daemon");
+ dbus_g_method_return_error (context, error);
+ return;
+ }
+
/* check with PolicyKit if the action is allowed from this client - if not, set an error */
ret = pk_engine_action_is_allowed (engine, context, PK_ROLE_ENUM_REPO_ENABLE, &error);
if (ret == FALSE) {
@@ -1936,6 +2045,15 @@ pk_engine_repo_set_data (PkEngine *engine, const gchar *tid, const gchar *repo_i
return;
}
+ /* check for sanity */
+ ret = pk_validate_input (repo_id);
+ if (ret == FALSE) {
+ error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_INPUT_INVALID,
+ "Invalid input passed to daemon");
+ dbus_g_method_return_error (context, error);
+ return;
+ }
+
/* check with PolicyKit if the action is allowed from this client - if not, set an error */
ret = pk_engine_action_is_allowed (engine, context, PK_ROLE_ENUM_REPO_SET_DATA, &error);
if (ret == FALSE) {
diff --git a/src/pk-engine.h b/src/pk-engine.h
index 06f1af1..d725527 100644
--- a/src/pk-engine.h
+++ b/src/pk-engine.h
@@ -64,6 +64,7 @@ typedef enum
PK_ENGINE_ERROR_PACKAGE_ID_INVALID,
PK_ENGINE_ERROR_SEARCH_INVALID,
PK_ENGINE_ERROR_FILTER_INVALID,
+ PK_ENGINE_ERROR_INPUT_INVALID,
PK_ENGINE_ERROR_INVALID_STATE,
PK_ENGINE_ERROR_INITIALIZE_FAILED,
PK_ENGINE_ERROR_LAST
commit d519939318b933e4b517b4d6b14ae290989022bb
Author: Richard Hughes <richard at hughsie.com>
Date: Tue Oct 16 21:23:34 2007 +0100
only wait in pkcon if the command succeeded
diff --git a/client/pk-console.c b/client/pk-console.c
index 6bc6e82..eac675b 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -201,6 +201,7 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
const gchar *mode;
const gchar *value = NULL;
const gchar *details = NULL;
+ gboolean wait = FALSE;
guint remove;
PkEnumList *elist;
@@ -224,8 +225,7 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
remove = 2;
goto out;
} else {
- pk_client_search_name (client, "none", details);
- pk_client_wait ();
+ wait = pk_client_search_name (client, "none", details);
remove = 3;
}
} else if (strcmp (value, "details") == 0) {
@@ -234,8 +234,7 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
remove = 2;
goto out;
} else {
- pk_client_search_details (client, "none", details);
- pk_client_wait ();
+ wait = pk_client_search_details (client, "none", details);
remove = 3;
}
} else if (strcmp (value, "group") == 0) {
@@ -244,8 +243,7 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
remove = 2;
goto out;
} else {
- pk_client_search_group (client, "none", details);
- pk_client_wait ();
+ wait = pk_client_search_group (client, "none", details);
remove = 3;
}
} else if (strcmp (value, "file") == 0) {
@@ -254,8 +252,7 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
remove = 2;
goto out;
} else {
- pk_client_search_file (client, "none", details);
- pk_client_wait ();
+ wait = pk_client_search_file (client, "none", details);
remove = 3;
}
} else {
@@ -267,8 +264,7 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
remove = 1;
goto out;
} else {
- pk_client_install_package (client, value);
- pk_client_wait ();
+ wait = pk_client_install_package (client, value);
remove = 2;
}
} else if (strcmp (mode, "remove") == 0) {
@@ -277,8 +273,7 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
remove = 1;
goto out;
} else {
- pk_client_remove_package (client, value, FALSE);
- pk_client_wait ();
+ wait = pk_client_remove_package (client, value, FALSE);
remove = 2;
}
} else if (strcmp (mode, "update") == 0) {
@@ -287,8 +282,7 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
remove = 1;
goto out;
} else {
- pk_client_update_package (client, value);
- pk_client_wait ();
+ wait = pk_client_update_package (client, value);
remove = 2;
}
} else if (strcmp (mode, "resolve") == 0) {
@@ -297,8 +291,7 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
remove = 1;
goto out;
} else {
- pk_client_resolve (client, value);
- pk_client_wait ();
+ wait = pk_client_resolve (client, value);
remove = 2;
}
} else if (strcmp (mode, "enable-repo") == 0) {
@@ -316,7 +309,7 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
remove = 1;
goto out;
} else {
- pk_client_repo_enable (client, value, FALSE);
+ wait = pk_client_repo_enable (client, value, FALSE);
remove = 2;
}
} else if (strcmp (mode, "get") == 0) {
@@ -330,8 +323,7 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
remove = 2;
goto out;
} else {
- pk_client_get_depends (client, details);
- pk_client_wait ();
+ wait = pk_client_get_depends (client, details);
remove = 3;
}
} else if (strcmp (value, "updatedetail") == 0) {
@@ -340,8 +332,7 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
remove = 2;
goto out;
} else {
- pk_client_get_update_detail (client, details);
- pk_client_wait ();
+ wait = pk_client_get_update_detail (client, details);
remove = 3;
}
} else if (strcmp (value, "requires") == 0) {
@@ -350,8 +341,7 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
remove = 2;
goto out;
} else {
- pk_client_get_requires (client, details);
- pk_client_wait ();
+ wait = pk_client_get_requires (client, details);
remove = 3;
}
} else if (strcmp (value, "description") == 0) {
@@ -360,13 +350,11 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
remove = 2;
goto out;
} else {
- pk_client_get_description (client, details);
- pk_client_wait ();
+ wait = pk_client_get_description (client, details);
remove = 3;
}
} else if (strcmp (value, "updates") == 0) {
- pk_client_get_updates (client);
- pk_client_wait ();
+ wait = pk_client_get_updates (client);
remove = 2;
} else if (strcmp (value, "actions") == 0) {
elist = pk_client_get_actions (client);
@@ -379,8 +367,7 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
g_object_unref (elist);
remove = 2;
} else if (strcmp (value, "repos") == 0) {
- pk_client_get_repo_list (client);
- pk_client_wait ();
+ wait = pk_client_get_repo_list (client);
remove = 2;
} else if (strcmp (value, "groups") == 0) {
elist = pk_client_get_groups (client);
@@ -388,22 +375,26 @@ pk_console_parse_multiple_commands (PkClient *client, GPtrArray *array, GError *
g_object_unref (elist);
remove = 2;
} else if (strcmp (value, "transactions") == 0) {
- pk_client_get_old_transactions (client, 10);
- pk_client_wait ();
+ wait = pk_client_get_old_transactions (client, 10);
remove = 2;
} else {
g_set_error (error, 0, 0, "invalid get type");
}
} else if (strcmp (mode, "update-system") == 0) {
- pk_client_update_system (client);
+ wait = pk_client_update_system (client);
} else if (strcmp (mode, "refresh") == 0) {
- pk_client_refresh_cache (client, FALSE);
+ wait = pk_client_refresh_cache (client, FALSE);
} else if (strcmp (mode, "force-refresh") == 0) {
- pk_client_refresh_cache (client, TRUE);
+ wait = pk_client_refresh_cache (client, TRUE);
} else {
g_set_error (error, 0, 0, "option not yet supported");
}
+ /* only wait if success */
+ if (wait == TRUE) {
+ pk_client_wait ();
+ }
+
out:
/* remove the right number of items from the pointer index */
g_ptr_array_remove_index (array, 0);
commit b6ed41ce83115b585597a0f3453702d6a375b74f
Author: Richard Hughes <richard at hughsie.com>
Date: Tue Oct 16 20:14:08 2007 +0100
add funtionality to validate input
diff --git a/libpackagekit/pk-common.c b/libpackagekit/pk-common.c
index e36b427..e5c5d4d 100644
--- a/libpackagekit/pk-common.c
+++ b/libpackagekit/pk-common.c
@@ -114,6 +114,59 @@ out:
}
/**
+ * pk_validate_input_char:
+ **/
+static gboolean
+pk_validate_input_char (gchar item)
+{
+ switch (item) {
+ case ' ':
+ case '$':
+ case '`':
+ case '\'':
+ case '"':
+ case '^':
+ case '[':
+ case ']':
+ case '{':
+ case '}':
+ case '@':
+ case '#':
+ case '/':
+ case '\\':
+ case '<':
+ case '>':
+ case '|':
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/**
+ * pk_validate_input:
+ **/
+gboolean
+pk_validate_input (const gchar *text)
+{
+ guint i;
+ guint length;
+
+ /* ITS4: ignore, not used for allocation and checked for oversize */
+ length = strlen (text);
+ for (i=0; i<length; i++) {
+ if (i > 1024) {
+ pk_debug ("input too long!");
+ return FALSE;
+ }
+ if (pk_validate_input_char (text[i]) == FALSE) {
+ pk_debug ("invalid char in text!");
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+/**
* pk_string_id_split:
*
* You need to use g_strfreev on the returned value
@@ -237,6 +290,53 @@ libst_common (LibSelfTest *test)
}
/************************************************************
+ **************** validate text **************
+ ************************************************************/
+ libst_title (test, "validate correct char 1");
+ ret = pk_validate_input_char ('a');
+ if (ret == TRUE) {
+ libst_success (test, NULL);
+ } else {
+ libst_failed (test, NULL);
+ }
+
+ /************************************************************/
+ libst_title (test, "validate correct char 2");
+ ret = pk_validate_input_char ('~');
+ if (ret == TRUE) {
+ libst_success (test, NULL);
+ } else {
+ libst_failed (test, NULL);
+ }
+
+ /************************************************************/
+ libst_title (test, "validate incorrect char");
+ ret = pk_validate_input_char ('$');
+ if (ret == FALSE) {
+ libst_success (test, NULL);
+ } else {
+ libst_failed (test, NULL);
+ }
+
+ /************************************************************/
+ libst_title (test, "validate incorrect text");
+ ret = pk_validate_input ("richard$hughes");
+ if (ret == FALSE) {
+ libst_success (test, NULL);
+ } else {
+ libst_failed (test, NULL);
+ }
+
+ /************************************************************/
+ libst_title (test, "validate correct text");
+ ret = pk_validate_input ("richardhughes");
+ if (ret == TRUE) {
+ libst_success (test, NULL);
+ } else {
+ libst_failed (test, NULL);
+ }
+
+ /************************************************************
**************** string_id ****************
************************************************************/
libst_title (test, "test pass 1");
diff --git a/libpackagekit/pk-common.h b/libpackagekit/pk-common.h
index 9877227..194cf07 100644
--- a/libpackagekit/pk-common.h
+++ b/libpackagekit/pk-common.h
@@ -30,6 +30,7 @@ G_BEGIN_DECLS
#define PK_DBUS_PATH "/org/freedesktop/PackageKit"
#define PK_DBUS_INTERFACE "org.freedesktop.PackageKit"
+gboolean pk_validate_input (const gchar *text);
gboolean pk_filter_check (const gchar *filter);
gchar **pk_string_id_split (const gchar *id,
guint parts);
commit 5283dedcff3b6fc8bcd61f7c9de4443766046662
Author: Richard Hughes <richard at hughsie.com>
Date: Tue Oct 16 19:13:18 2007 +0100
don't use pk_task_list_get_lastest, instead use get_length an get_item to avoid exposing the private array data
diff --git a/client/pk-monitor.c b/client/pk-monitor.c
index 457e3c5..e65da20 100644
--- a/client/pk-monitor.c
+++ b/client/pk-monitor.c
@@ -68,7 +68,6 @@ main (int argc, char *argv[])
{
PkTaskList *tlist;
gboolean ret;
- GPtrArray *task_list;
GMainLoop *loop;
PkConnection *pconnection;
gboolean connected;
@@ -122,7 +121,6 @@ main (int argc, char *argv[])
if (ret == FALSE) {
g_error ("cannot refresh transaction list");
}
- task_list = pk_task_list_get_latest (tlist);
pk_task_list_print (tlist);
g_main_loop_run (loop);
diff --git a/libpackagekit/pk-task-list.c b/libpackagekit/pk-task-list.c
index 88ac84f..352f415 100644
--- a/libpackagekit/pk-task-list.c
+++ b/libpackagekit/pk-task-list.c
@@ -266,16 +266,29 @@ pk_task_list_refresh (PkTaskList *tlist)
}
/**
- * pk_task_list_get_latest:
- *
- * DO NOT FREE THIS.
+ * pk_task_list_get_size:
**/
-GPtrArray *
-pk_task_list_get_latest (PkTaskList *tlist)
+guint
+pk_task_list_get_size (PkTaskList *tlist)
{
- g_return_val_if_fail (tlist != NULL, FALSE);
- g_return_val_if_fail (PK_IS_TASK_LIST (tlist), FALSE);
- return tlist->priv->task_list;
+ g_return_val_if_fail (tlist != NULL, 0);
+ g_return_val_if_fail (PK_IS_TASK_LIST (tlist), 0);
+ return tlist->priv->task_list->len;
+}
+
+/**
+ * pk_task_list_get_item:
+ **/
+PkTaskListItem *
+pk_task_list_get_item (PkTaskList *tlist, guint item)
+{
+ g_return_val_if_fail (tlist != NULL, NULL);
+ g_return_val_if_fail (PK_IS_TASK_LIST (tlist), NULL);
+ if (item >= tlist->priv->task_list->len) {
+ pk_debug ("item too large!");
+ return NULL;
+ }
+ return g_ptr_array_index (tlist->priv->task_list, item);
}
/**
@@ -336,7 +349,7 @@ pk_task_list_init (PkTaskList *tlist)
tlist->priv->task_list = g_ptr_array_new ();
/* force a refresh so we have valid data*/
- pk_task_list_get_latest (tlist);
+ pk_task_list_refresh (tlist);
}
/**
diff --git a/libpackagekit/pk-task-list.h b/libpackagekit/pk-task-list.h
index d03c54b..f5eb779 100644
--- a/libpackagekit/pk-task-list.h
+++ b/libpackagekit/pk-task-list.h
@@ -66,7 +66,9 @@ gboolean pk_task_list_print (PkTaskList *tlist);
gboolean pk_task_list_free (PkTaskList *tlist);
gboolean pk_task_list_contains_role (PkTaskList *tlist,
PkRoleEnum role);
-GPtrArray *pk_task_list_get_latest (PkTaskList *tlist);
+guint pk_task_list_get_size (PkTaskList *tlist);
+PkTaskListItem *pk_task_list_get_item (PkTaskList *tlist,
+ guint item);
G_END_DECLS
commit ef1018a15a85a41a01047473f8f1215fe9d48cbe
Author: Richard Hughes <richard at hughsie.com>
Date: Tue Oct 16 19:12:32 2007 +0100
update TODO
diff --git a/TODO b/TODO
index 29edde6..50caeba 100644
--- a/TODO
+++ b/TODO
@@ -27,3 +27,7 @@ To do rollbacks sanely in PK we need a few things:
*** Use resolve for pkcon operations ***
'pkcon install zsh' should work as well as 'pkcon install "zsh;1.0;i386;repo"'
+
+*** check all user input for bad chars... ***
+Be really paranoid....
+
commit b67f344af6bcceea275598bb80042c5cb5ba9f00
Author: Richard Hughes <richard at hughsie.com>
Date: Tue Oct 16 19:11:07 2007 +0100
add some more details to HACKING
diff --git a/HACKING b/HACKING
index 91f724c..5e037e5 100644
--- a/HACKING
+++ b/HACKING
@@ -14,6 +14,60 @@ Please consider enabling git's default pre-commit hook:
This hook will run before every checkin, and check your changes for
suspicious use of whitespace.
+In the C files use the following convention.
+The number of spaces and tabs are very important!
+
+ /* map the roles to policykit rules */
+ if (role == PK_ROLE_ENUM_UPDATE_PACKAGE ||
+ role == PK_ROLE_ENUM_UPDATE_SYSTEM) {
+ policy = "org.freedesktop.packagekit.update";
+ } else if (role == PK_ROLE_ENUM_REMOVE_PACKAGE) {
+ policy = "org.freedesktop.packagekit.remove";
+ }
+
+and please DO NOT use "!" for a null pointer or boolean - it's too easy to miss
+in an audit...
+
+ /* check the search term */
+ ret = pk_engine_search_check (search, error);
+ if (ret == FALSE) {
+ return FALSE;
+ }
+
+Functions are nearly always the same format, gtk-doc is optional:
+
+/**
+ * pk_engine_search_name:
+ **/
+gboolean
+pk_engine_search_name (PkEngine *engine, const gchar *search, GError **error)
+{
+ gboolean ret;
+ PkTransactionItem *item;
+
+ g_return_val_if_fail (engine != NULL, FALSE);
+ g_return_val_if_fail (PK_IS_ENGINE (engine), FALSE);
+
+ return TRUE;
+}
+
+Finally: DO NOT COMMIT TRAILING WHITESPACE.
+
+Security
+--------
+Remember:
+* The daemon is running as the root user
+ - no FIXME or TODO code please
+* If the daemon crashes, then that's a DOS
+* Text from the user (over the dbus interface) is insecure!
+ - even filters and enumerated values can be wrong
+ - users can use dbus-send to do bad stuff as users
+* Never allocate a buffer on user input
+* Output from backends is trusted, they are run from standard locations
+
+Use flawfinder to find obvious security problems. Use "ITS4: ignore" if you are
+totally 100% sure that it's not a problem.
+
Submitting Patches
------------------
Use 'git format-patch' to generate patches against a checked out copy
@@ -32,3 +86,4 @@ For Example:
Send these patches in an introductory email as attachments to
packagekit-list at lists.freedesktop.org
+
commit 2c6696725a8ac58fd9fdf0ad32c3b48df42ca79d
Author: James Bowes <jbowes at dangerouslyinc.com>
Date: Tue Oct 16 13:58:32 2007 -0400
HACKING: mention the pre-commit hook for whitespace
diff --git a/HACKING b/HACKING
index eea5ad1..91f724c 100644
--- a/HACKING
+++ b/HACKING
@@ -3,7 +3,16 @@ Hacking PackageKit
Coding Style
------------
Please stick to the existing coding style.
-Tabs should be set equivalent to 8 spaces.
+Tabs should be hard (not expanded to spaces), and set equivalent to
+8 spaces.
+
+Please consider enabling git's default pre-commit hook:
+
+ $> cd PackageKit
+ $> chmod +x .git/hooks/pre-commit
+
+This hook will run before every checkin, and check your changes for
+suspicious use of whitespace.
Submitting Patches
------------------
commit b496d15c569045fdfae340c0ef340597fd2d4327
Author: James Bowes <jbowes at dangerouslyinc.com>
Date: Tue Oct 16 13:42:39 2007 -0400
TODO: add note about pkcon falling back to resolve
diff --git a/TODO b/TODO
index 42de879..29edde6 100644
--- a/TODO
+++ b/TODO
@@ -25,3 +25,5 @@ Have different permissions for signed and unsigned repos.
To do rollbacks sanely in PK we need a few things:
* allow transaction data to be changed in _db
+*** Use resolve for pkcon operations ***
+'pkcon install zsh' should work as well as 'pkcon install "zsh;1.0;i386;repo"'
commit cc23644fa1844fec29831502faef0b923c6372ca
Author: James Bowes <jbowes at dangerouslyinc.com>
Date: Tue Oct 16 09:26:33 2007 -0400
HACKING: Add a 'Submitting Patches' section
diff --git a/HACKING b/HACKING
index 739058e..eea5ad1 100644
--- a/HACKING
+++ b/HACKING
@@ -4,3 +4,22 @@ Coding Style
------------
Please stick to the existing coding style.
Tabs should be set equivalent to 8 spaces.
+
+Submitting Patches
+------------------
+Use 'git format-patch' to generate patches against a checked out copy
+of the source.
+
+For Example:
+
+ $> cd PackageKit
+ HACK HACK HACK
+ $> git commit -m "My first commit"
+ HACK HACK HACK
+ $> git commit -m "My second commit"
+ $> git format-patch -M HEAD^^
+ 0001-My-first-commit.patch
+ 0002-My-second-commit.patch
+
+Send these patches in an introductory email as attachments to
+packagekit-list at lists.freedesktop.org
commit 9ab797a4efcbd0a9c1d68f24693659262d6ea6a9
Author: James Bowes <jbowes at dangerouslyinc.com>
Date: Tue Oct 16 09:16:51 2007 -0400
yum: Move _setup_yum calls to _init__, since everything uses it.
diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index 3981486..dda133a 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -51,6 +51,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
def __init__(self,args):
PackageKitBaseBackend.__init__(self,args)
self.yumbase = PackageKitYumBase()
+ self._setup_yum()
def _get_package_ver(self,po):
''' return the a ver as epoch:version-release or version-release, if epoch=0'''
@@ -162,7 +163,6 @@ class PackageKitYumBackend(PackageKitBaseBackend):
self.allow_interrupt(True)
self.percentage(None)
- self._setup_yum()
#self.yumbase.conf.cache = 1 # Only look in cache.
fltlist = filters.split(';')
found = {}
@@ -314,7 +314,6 @@ class PackageKitYumBackend(PackageKitBaseBackend):
self.allow_interrupt(True)
self.percentage(None)
- self._setup_yum()
name = package.split(';')[0]
pkg,inst = self._findPackage(package)
results = {}
@@ -341,7 +340,6 @@ class PackageKitYumBackend(PackageKitBaseBackend):
self.allow_interrupt(False)
self.percentage(0)
- self._setup_yum()
txmbr = self.yumbase.update() # Add all updates to Transaction
if txmbr:
self._runYumTransaction()
@@ -355,7 +353,6 @@ class PackageKitYumBackend(PackageKitBaseBackend):
self.allow_interrupt(True);
self.percentage(0)
- self._setup_yum()
pct = 0
try:
if len(self.yumbase.repos.listEnabled()) == 0:
@@ -387,8 +384,6 @@ class PackageKitYumBackend(PackageKitBaseBackend):
self.allow_interrupt(True);
self.percentage(None)
- self._setup_yum()
-
# Get installed packages
installedByKey = self.yumbase.rpmdb.searchNevra(name=name)
for pkg in installedByKey:
@@ -412,7 +407,6 @@ class PackageKitYumBackend(PackageKitBaseBackend):
self.allow_interrupt(False)
self.percentage(0)
- self._setup_yum()
pkg,inst = self._findPackage(package)
if pkg:
if inst:
@@ -512,7 +506,6 @@ class PackageKitYumBackend(PackageKitBaseBackend):
self.percentage(0)
pkgs_to_inst = []
- self._setup_yum()
self.yumbase.conf.gpgcheck=0
self._localInstall(inst_file)
try:
@@ -532,7 +525,6 @@ class PackageKitYumBackend(PackageKitBaseBackend):
self.allow_interrupt(False);
self.percentage(0)
- self._setup_yum()
pkg,inst = self._findPackage(package)
if pkg:
txmbr = self.yumbase.update(name=pkg.name)
@@ -610,7 +602,6 @@ class PackageKitYumBackend(PackageKitBaseBackend):
self.allow_interrupt(False);
self.percentage(0)
- self._setup_yum()
pkg,inst = self._findPackage( package)
if pkg and inst:
txmbr = self.yumbase.remove(name=pkg.name)
@@ -632,7 +623,6 @@ class PackageKitYumBackend(PackageKitBaseBackend):
self.allow_interrupt(True)
self.percentage(None)
- self._setup_yum()
pkg,inst = self._findPackage(package)
if pkg:
pkgver = self._get_package_ver(pkg)
@@ -673,7 +663,6 @@ class PackageKitYumBackend(PackageKitBaseBackend):
self.allow_interrupt(True)
self.percentage(None)
- self._setup_yum()
md = UpdateMetadata()
# Added extra Update Metadata
for repo in self.yumbase.repos.listEnabled():
commit 6df03eea8616654de72b36068c0dd3d5200725d2
Author: Richard Hughes <richard at hughsie.com>
Date: Tue Oct 16 18:37:40 2007 +0100
make the html reference file utf8
diff --git a/docs/config.xsl b/docs/config.xsl
index 1ae0c22..1cb097e 100644
--- a/docs/config.xsl
+++ b/docs/config.xsl
@@ -5,5 +5,6 @@
<xsl:param name="html.stylesheet" select="'docbook.css'"/>
<xsl:param name="use.id.as.filename" select="1"/>
<xsl:param name="chunk.section.depth" select="0"/>
+ <xsl:output method="html" encoding="UTF-8" indent="no"/>
</xsl:stylesheet>
More information about the PackageKit
mailing list