- Update to 0.0.4
This commit is contained in:
parent
35801778dd
commit
19f4fe8e85
@ -1 +1 @@
|
|||||||
cups-pk-helper-0.0.3.tar.bz2
|
cups-pk-helper-0.0.4.tar.bz2
|
||||||
|
@ -1,639 +0,0 @@
|
|||||||
--- src/cups.c 2009-02-27 14:55:03.000000000 +0100
|
|
||||||
+++ src/cups.c 2009-02-27 14:53:40.000000000 +0100
|
|
||||||
@@ -182,17 +182,16 @@ cph_cups_init (CphCups *cups)
|
|
||||||
gboolean
|
|
||||||
cph_cups_reconnect (CphCups *cups)
|
|
||||||
{
|
|
||||||
- gint return_value = -1;
|
|
||||||
- gint i;
|
|
||||||
+ int return_value = -1;
|
|
||||||
+ int i;
|
|
||||||
|
|
||||||
cups->priv->reconnecting = TRUE;
|
|
||||||
|
|
||||||
for (i = 0; i < MAX_RECONNECT_ATTEMPTS; i++) {
|
|
||||||
- return_value = httpReconnect (cups->priv->connection);
|
|
||||||
- if (return_value == 0) {
|
|
||||||
- break;
|
|
||||||
- }
|
|
||||||
- g_usleep (RECONNECT_DELAY);
|
|
||||||
+ return_value = httpReconnect (cups->priv->connection);
|
|
||||||
+ if (return_value == 0)
|
|
||||||
+ break;
|
|
||||||
+ g_usleep (RECONNECT_DELAY);
|
|
||||||
}
|
|
||||||
|
|
||||||
cups->priv->reconnecting = FALSE;
|
|
||||||
@@ -347,6 +346,7 @@ _CPH_CUPS_IS_VALID (ppd_filename, "PPD f
|
|
||||||
_CPH_CUPS_IS_VALID (job_sheet, "job sheet", FALSE)
|
|
||||||
_CPH_CUPS_IS_VALID (error_policy, "error policy", FALSE)
|
|
||||||
_CPH_CUPS_IS_VALID (op_policy, "op policy", FALSE)
|
|
||||||
+_CPH_CUPS_IS_VALID (job_hold_until, "job hold until", FALSE)
|
|
||||||
|
|
||||||
/* Check for users. Those are some printable strings, which souldn't be NULL.
|
|
||||||
* They should also not be empty, but it appears that it's possible to carry
|
|
||||||
@@ -411,7 +411,7 @@ _cph_cups_add_class_uri (ipp_t *req
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cph_cups_add_job_uri (ipp_t *request,
|
|
||||||
- gint job_id)
|
|
||||||
+ int job_id)
|
|
||||||
{
|
|
||||||
char uri[HTTP_MAX_URI + 1];
|
|
||||||
|
|
||||||
@@ -585,12 +585,18 @@ _cph_cups_send_new_printer_class_request
|
|
||||||
static gboolean
|
|
||||||
_cph_cups_send_new_simple_job_request (CphCups *cups,
|
|
||||||
ipp_op_t op,
|
|
||||||
- gint job_id,
|
|
||||||
+ int job_id,
|
|
||||||
+ const char *user_name,
|
|
||||||
CphResource resource)
|
|
||||||
{
|
|
||||||
ipp_t *request;
|
|
||||||
|
|
||||||
request = ippNewRequest (op);
|
|
||||||
+
|
|
||||||
+ if (user_name != NULL)
|
|
||||||
+ ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_NAME,
|
|
||||||
+ "requesting-user-name", NULL, user_name);
|
|
||||||
+
|
|
||||||
_cph_cups_add_job_uri (request, job_id);
|
|
||||||
|
|
||||||
return _cph_cups_send_request (cups, request, resource);
|
|
||||||
@@ -598,18 +604,23 @@ _cph_cups_send_new_simple_job_request (C
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
_cph_cups_send_new_job_attributes_request (CphCups *cups,
|
|
||||||
- gint job_id,
|
|
||||||
+ int job_id,
|
|
||||||
const char *name,
|
|
||||||
const char *value,
|
|
||||||
+ const char *user_name,
|
|
||||||
CphResource resource)
|
|
||||||
{
|
|
||||||
cups_option_t *options = NULL;
|
|
||||||
ipp_t *request;
|
|
||||||
- gint num_options = 0;
|
|
||||||
+ int num_options = 0;
|
|
||||||
|
|
||||||
request = ippNewRequest (IPP_SET_JOB_ATTRIBUTES);
|
|
||||||
_cph_cups_add_job_uri (request, job_id);
|
|
||||||
|
|
||||||
+ if (user_name != NULL)
|
|
||||||
+ ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_NAME,
|
|
||||||
+ "requesting-user-name", NULL, user_name);
|
|
||||||
+
|
|
||||||
num_options = cupsAddOption (name, value,
|
|
||||||
num_options, &options);
|
|
||||||
cupsEncodeOptions (request, num_options, options);
|
|
||||||
@@ -894,6 +905,7 @@ cph_cups_file_get (CphCups *cups,
|
|
||||||
|
|
||||||
/* reset the internal status: we'll use the cups status */
|
|
||||||
_cph_cups_set_internal_status (cups, NULL);
|
|
||||||
+
|
|
||||||
cups->priv->last_status = cupsGetFile (cups->priv->connection,
|
|
||||||
resource, filename);
|
|
||||||
|
|
||||||
@@ -908,6 +920,7 @@ cph_cups_file_get (CphCups *cups,
|
|
||||||
chown (filename, uid, gid);
|
|
||||||
|
|
||||||
_cph_cups_set_internal_status (cups, NULL);
|
|
||||||
+
|
|
||||||
cups->priv->last_status = cupsGetFile (cups->priv->connection,
|
|
||||||
resource, filename);
|
|
||||||
}
|
|
||||||
@@ -1687,41 +1700,78 @@ cph_cups_server_set_settings (CphCups
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
-cph_cups_job_cancel (CphCups *cups,
|
|
||||||
- gint job_id)
|
|
||||||
+cph_cups_job_cancel (CphCups *cups,
|
|
||||||
+ int job_id,
|
|
||||||
+ const char *user_name)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (CPH_IS_CUPS (cups), FALSE);
|
|
||||||
|
|
||||||
return _cph_cups_send_new_simple_job_request (cups, IPP_CANCEL_JOB,
|
|
||||||
job_id,
|
|
||||||
+ user_name,
|
|
||||||
CPH_RESOURCE_ADMIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
-cph_cups_job_restart (CphCups *cups,
|
|
||||||
- gint job_id)
|
|
||||||
+cph_cups_job_restart (CphCups *cups,
|
|
||||||
+ int job_id,
|
|
||||||
+ const char *user_name)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (CPH_IS_CUPS (cups), FALSE);
|
|
||||||
|
|
||||||
return _cph_cups_send_new_simple_job_request (cups, IPP_RESTART_JOB,
|
|
||||||
job_id,
|
|
||||||
+ user_name,
|
|
||||||
CPH_RESOURCE_ADMIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
cph_cups_job_set_hold_until (CphCups *cups,
|
|
||||||
- gint job_id,
|
|
||||||
- const char *job_hold_until)
|
|
||||||
+ int job_id,
|
|
||||||
+ const char *job_hold_until,
|
|
||||||
+ const char *user_name)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (CPH_IS_CUPS (cups), FALSE);
|
|
||||||
|
|
||||||
+ if (!_cph_cups_is_job_hold_until_valid (cups, job_hold_until))
|
|
||||||
+ return FALSE;
|
|
||||||
+
|
|
||||||
return _cph_cups_send_new_job_attributes_request (cups,
|
|
||||||
job_id,
|
|
||||||
"job-hold-until",
|
|
||||||
job_hold_until,
|
|
||||||
+ user_name,
|
|
||||||
CPH_RESOURCE_ADMIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
+CphJobStatus
|
|
||||||
+cph_cups_job_get_status (CphCups *cups,
|
|
||||||
+ int job_id,
|
|
||||||
+ const char *user)
|
|
||||||
+{
|
|
||||||
+ CphJobStatus status = CPH_JOB_STATUS_INVALID;
|
|
||||||
+ cups_job_t *jobs;
|
|
||||||
+ int num_jobs = 0;
|
|
||||||
+ int i;
|
|
||||||
+
|
|
||||||
+ g_return_val_if_fail (CPH_IS_CUPS (cups), CPH_JOB_STATUS_INVALID);
|
|
||||||
+
|
|
||||||
+ num_jobs = cupsGetJobs2 (cups->priv->connection, &jobs, NULL, 0, 0);
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < num_jobs; i++) {
|
|
||||||
+ if (jobs[i].id == job_id) {
|
|
||||||
+ status = CPH_JOB_STATUS_NOT_OWNED_BY_USER;
|
|
||||||
+ if (user != NULL && g_strcmp0 (jobs[i].user, user) == 0)
|
|
||||||
+ status = CPH_JOB_STATUS_OWNED_BY_USER;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ cupsFreeJobs (num_jobs, jobs);
|
|
||||||
+
|
|
||||||
+ return status;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/******************************************************
|
|
||||||
* Non-object functions
|
|
||||||
******************************************************/
|
|
||||||
@@ -1788,28 +1838,3 @@ cph_cups_is_printer_uri_local (const cha
|
|
||||||
/* we don't know, so we assume it's not local */
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
-
|
|
||||||
-gboolean
|
|
||||||
-cph_cups_is_job_owner (CphCups *cups,
|
|
||||||
- gint job_id,
|
|
||||||
- const char *user)
|
|
||||||
-{
|
|
||||||
- cups_job_t *jobs;
|
|
||||||
- gboolean user_job = FALSE;
|
|
||||||
- gint num_jobs = 0;
|
|
||||||
- gint i;
|
|
||||||
-
|
|
||||||
- g_return_val_if_fail (CPH_IS_CUPS (cups), FALSE);
|
|
||||||
-
|
|
||||||
- if (user == NULL)
|
|
||||||
- return FALSE;
|
|
||||||
-
|
|
||||||
- num_jobs = cupsGetJobs2 (cups->priv->connection, &jobs, NULL, 0, 0);
|
|
||||||
-
|
|
||||||
- for (i = 0; i < num_jobs; i++) {
|
|
||||||
- if (jobs[i].id == job_id && g_strcmp0 (jobs[i].user, user) == 0)
|
|
||||||
- user_job = TRUE;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- return user_job;
|
|
||||||
-}
|
|
||||||
--- src/cups.h 2009-02-27 14:55:03.000000000 +0100
|
|
||||||
+++ src/cups.h 2009-02-27 14:53:40.000000000 +0100
|
|
||||||
@@ -48,6 +48,13 @@ typedef struct
|
|
||||||
GObjectClass parent_class;
|
|
||||||
} CphCupsClass;
|
|
||||||
|
|
||||||
+typedef enum
|
|
||||||
+{
|
|
||||||
+ CPH_JOB_STATUS_INVALID,
|
|
||||||
+ CPH_JOB_STATUS_OWNED_BY_USER,
|
|
||||||
+ CPH_JOB_STATUS_NOT_OWNED_BY_USER
|
|
||||||
+} CphJobStatus;
|
|
||||||
+
|
|
||||||
GType cph_cups_get_type (void);
|
|
||||||
|
|
||||||
CphCups *cph_cups_new (void);
|
|
||||||
@@ -161,18 +168,21 @@ gboolean cph_cups_is_printer_local (CphC
|
|
||||||
gboolean cph_cups_is_printer_uri_local (const char *uri);
|
|
||||||
|
|
||||||
gboolean cph_cups_job_cancel (CphCups *cups,
|
|
||||||
- gint job_id);
|
|
||||||
+ int job_id,
|
|
||||||
+ const char *user_name);
|
|
||||||
|
|
||||||
gboolean cph_cups_job_restart (CphCups *cups,
|
|
||||||
- gint job_id);
|
|
||||||
+ int job_id,
|
|
||||||
+ const char *user_name);
|
|
||||||
|
|
||||||
gboolean cph_cups_job_set_hold_until (CphCups *cups,
|
|
||||||
- gint job_id,
|
|
||||||
- const char *job_hold_until);
|
|
||||||
-
|
|
||||||
-gboolean cph_cups_is_job_owner (CphCups *cups,
|
|
||||||
- gint job_id,
|
|
||||||
- const char *user);
|
|
||||||
+ int job_id,
|
|
||||||
+ const char *job_hold_until,
|
|
||||||
+ const char *user_name);
|
|
||||||
+
|
|
||||||
+CphJobStatus cph_cups_job_get_status (CphCups *cups,
|
|
||||||
+ int job_id,
|
|
||||||
+ const char *user);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
--- src/cups-pk-helper-mechanism.c 2009-02-27 14:55:03.000000000 +0100
|
|
||||||
+++ src/cups-pk-helper-mechanism.c 2009-02-27 14:53:40.000000000 +0100
|
|
||||||
@@ -47,8 +47,6 @@
|
|
||||||
|
|
||||||
#include <polkit-dbus/polkit-dbus.h>
|
|
||||||
|
|
||||||
-#include <cups/cups.h>
|
|
||||||
-
|
|
||||||
#include <pwd.h>
|
|
||||||
|
|
||||||
#include "cups-pk-helper-mechanism.h"
|
|
||||||
@@ -470,6 +468,28 @@ _cph_mechanism_get_action_for_name (CphM
|
|
||||||
return "printer-remote-edit";
|
|
||||||
}
|
|
||||||
|
|
||||||
+char *
|
|
||||||
+_cph_mechanism_get_callers_user_name (CphMechanism *mechanism,
|
|
||||||
+ DBusGMethodInvocation *context)
|
|
||||||
+{
|
|
||||||
+ unsigned long sender_uid;
|
|
||||||
+ struct passwd *password_entry;
|
|
||||||
+ DBusError dbus_error;
|
|
||||||
+ gchar *sender;
|
|
||||||
+ char *user_name = NULL;
|
|
||||||
+
|
|
||||||
+ sender = dbus_g_method_get_sender (context);
|
|
||||||
+ dbus_error_init (&dbus_error);
|
|
||||||
+ sender_uid = dbus_bus_get_unix_user (dbus_g_connection_get_connection (mechanism->priv->system_bus_connection), sender, &dbus_error);
|
|
||||||
+ password_entry = getpwuid ((uid_t) sender_uid);
|
|
||||||
+
|
|
||||||
+ if (password_entry != NULL)
|
|
||||||
+ user_name = g_strdup (password_entry->pw_name);
|
|
||||||
+
|
|
||||||
+ g_free (sender);
|
|
||||||
+
|
|
||||||
+ return user_name;
|
|
||||||
+}
|
|
||||||
|
|
||||||
/* helpers */
|
|
||||||
|
|
||||||
@@ -902,18 +922,21 @@ cph_mechanism_printer_set_default (CphMe
|
|
||||||
DBusGMethodInvocation *context)
|
|
||||||
{
|
|
||||||
gboolean ret;
|
|
||||||
- const char *action;
|
|
||||||
+ const char *last_action;
|
|
||||||
|
|
||||||
reset_killtimer (mechanism);
|
|
||||||
|
|
||||||
- action = _cph_mechanism_get_action_for_name (mechanism, name);
|
|
||||||
+ last_action = _cph_mechanism_get_action_for_name (mechanism, name);
|
|
||||||
if (!_check_polkit_for_action_v (mechanism, context,
|
|
||||||
"printeraddremove",
|
|
||||||
+ /* this is not the last check because
|
|
||||||
+ * it's likely most useful to the user
|
|
||||||
+ * to give "printer-X-edit" powers */
|
|
||||||
+ "printer-default",
|
|
||||||
/* quite important, since it's
|
|
||||||
* automatically called after adding a
|
|
||||||
* printer */
|
|
||||||
- action,
|
|
||||||
- "printer-set-default",
|
|
||||||
+ last_action,
|
|
||||||
NULL))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
@@ -930,19 +953,21 @@ cph_mechanism_printer_set_enabled (CphMe
|
|
||||||
DBusGMethodInvocation *context)
|
|
||||||
{
|
|
||||||
gboolean ret;
|
|
||||||
- const char *action;
|
|
||||||
+ const char *last_action;
|
|
||||||
|
|
||||||
reset_killtimer (mechanism);
|
|
||||||
|
|
||||||
- action = _cph_mechanism_get_action_for_name (mechanism, name);
|
|
||||||
-
|
|
||||||
+ last_action = _cph_mechanism_get_action_for_name (mechanism, name);
|
|
||||||
if (!_check_polkit_for_action_v (mechanism, context,
|
|
||||||
"printeraddremove",
|
|
||||||
+ /* this is not the last check because
|
|
||||||
+ * it's likely most useful to the user
|
|
||||||
+ * to give "printer-X-edit" powers */
|
|
||||||
+ "printer-enable",
|
|
||||||
/* quite important, since it's
|
|
||||||
* automatically called after adding a
|
|
||||||
* printer */
|
|
||||||
- action,
|
|
||||||
- "printer-enable",
|
|
||||||
+ last_action,
|
|
||||||
NULL))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
@@ -1013,115 +1038,114 @@ cph_mechanism_server_set_settings (CphMe
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
-gchar *
|
|
||||||
-cph_mechanism_get_callers_user_name (CphMechanism *mechanism,
|
|
||||||
- DBusGMethodInvocation *context)
|
|
||||||
-{
|
|
||||||
- unsigned long sender_uid;
|
|
||||||
- struct passwd *password_entry;
|
|
||||||
- const gchar *sender;
|
|
||||||
- DBusError dbus_error;
|
|
||||||
- gchar *user_name = NULL;
|
|
||||||
-
|
|
||||||
- sender = dbus_g_method_get_sender (context);
|
|
||||||
- dbus_error_init (&dbus_error);
|
|
||||||
- sender_uid = dbus_bus_get_unix_user (dbus_g_connection_get_connection (mechanism->priv->system_bus_connection), sender, &dbus_error);
|
|
||||||
- password_entry = getpwuid ((uid_t) sender_uid);
|
|
||||||
-
|
|
||||||
- if (password_entry != NULL) {
|
|
||||||
- user_name = g_strdup(password_entry->pw_name);
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- return user_name;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
gboolean
|
|
||||||
cph_mechanism_job_cancel (CphMechanism *mechanism,
|
|
||||||
- gint id,
|
|
||||||
+ int id,
|
|
||||||
DBusGMethodInvocation *context)
|
|
||||||
{
|
|
||||||
- gboolean ret;
|
|
||||||
- gboolean callers_job = FALSE;
|
|
||||||
- char *user_name = NULL;
|
|
||||||
+ CphJobStatus job_status;
|
|
||||||
+ gboolean ret;
|
|
||||||
+ char *user_name = NULL;
|
|
||||||
|
|
||||||
reset_killtimer (mechanism);
|
|
||||||
|
|
||||||
- user_name = cph_mechanism_get_callers_user_name (mechanism, context);
|
|
||||||
- callers_job = cph_cups_is_job_owner (mechanism->priv->cups, id, user_name);
|
|
||||||
- g_free (user_name);
|
|
||||||
+ user_name = _cph_mechanism_get_callers_user_name (mechanism, context);
|
|
||||||
+ job_status = cph_cups_job_get_status (mechanism->priv->cups, id, user_name);
|
|
||||||
|
|
||||||
- if (callers_job) {
|
|
||||||
- if (!_check_polkit_for_action (mechanism, context, "job-cancel"))
|
|
||||||
- return FALSE;
|
|
||||||
- }
|
|
||||||
- else {
|
|
||||||
- if (!_check_polkit_for_action (mechanism, context, "job-cancel-another-owner"))
|
|
||||||
+ switch (job_status) {
|
|
||||||
+ case CPH_JOB_STATUS_OWNED_BY_USER: {
|
|
||||||
+ if (!_check_polkit_for_action_v (mechanism, context, "job-not-owned-edit", "job-edit", NULL))
|
|
||||||
+ return FALSE;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ case CPH_JOB_STATUS_NOT_OWNED_BY_USER: {
|
|
||||||
+ if (!_check_polkit_for_action (mechanism, context, "job-not-owned-edit"))
|
|
||||||
+ return FALSE;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ case CPH_JOB_STATUS_INVALID:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
- ret = cph_cups_job_cancel (mechanism->priv->cups, id);
|
|
||||||
+ ret = cph_cups_job_cancel (mechanism->priv->cups, id, user_name);
|
|
||||||
_cph_mechanism_return_error (mechanism, context, !ret);
|
|
||||||
|
|
||||||
+ g_free (user_name);
|
|
||||||
+
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
cph_mechanism_job_restart (CphMechanism *mechanism,
|
|
||||||
- gint id,
|
|
||||||
+ int id,
|
|
||||||
DBusGMethodInvocation *context)
|
|
||||||
{
|
|
||||||
- gboolean ret;
|
|
||||||
- gboolean callers_job = FALSE;
|
|
||||||
- char *user_name = NULL;
|
|
||||||
+ CphJobStatus job_status;
|
|
||||||
+ gboolean ret;
|
|
||||||
+ char *user_name = NULL;
|
|
||||||
|
|
||||||
reset_killtimer (mechanism);
|
|
||||||
|
|
||||||
- user_name = cph_mechanism_get_callers_user_name (mechanism, context);
|
|
||||||
- callers_job = cph_cups_is_job_owner (mechanism->priv->cups, id, user_name);
|
|
||||||
- g_free (user_name);
|
|
||||||
+ user_name = _cph_mechanism_get_callers_user_name (mechanism, context);
|
|
||||||
+ job_status = cph_cups_job_get_status (mechanism->priv->cups, id, user_name);
|
|
||||||
|
|
||||||
- if (callers_job) {
|
|
||||||
- if (!_check_polkit_for_action (mechanism, context, "job-restart"))
|
|
||||||
- return FALSE;
|
|
||||||
- }
|
|
||||||
- else {
|
|
||||||
- if (!_check_polkit_for_action (mechanism, context, "job-restart-another-owner"))
|
|
||||||
+ switch (job_status) {
|
|
||||||
+ case CPH_JOB_STATUS_OWNED_BY_USER: {
|
|
||||||
+ if (!_check_polkit_for_action_v (mechanism, context, "job-not-owned-edit", "job-edit", NULL))
|
|
||||||
+ return FALSE;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ case CPH_JOB_STATUS_NOT_OWNED_BY_USER: {
|
|
||||||
+ if (!_check_polkit_for_action (mechanism, context, "job-not-owned-edit"))
|
|
||||||
+ return FALSE;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ case CPH_JOB_STATUS_INVALID:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
- ret = cph_cups_job_restart (mechanism->priv->cups, id);
|
|
||||||
+ ret = cph_cups_job_restart (mechanism->priv->cups, id, user_name);
|
|
||||||
_cph_mechanism_return_error (mechanism, context, !ret);
|
|
||||||
|
|
||||||
+ g_free (user_name);
|
|
||||||
+
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
cph_mechanism_job_set_hold_until (CphMechanism *mechanism,
|
|
||||||
- gint id,
|
|
||||||
+ int id,
|
|
||||||
const char *job_hold_until,
|
|
||||||
DBusGMethodInvocation *context)
|
|
||||||
{
|
|
||||||
- gboolean ret;
|
|
||||||
- gboolean callers_job = FALSE;
|
|
||||||
- char *user_name = NULL;
|
|
||||||
+ CphJobStatus job_status;
|
|
||||||
+ gboolean ret;
|
|
||||||
+ char *user_name = NULL;
|
|
||||||
|
|
||||||
reset_killtimer (mechanism);
|
|
||||||
|
|
||||||
- user_name = cph_mechanism_get_callers_user_name (mechanism, context);
|
|
||||||
- callers_job = cph_cups_is_job_owner (mechanism->priv->cups, id, user_name);
|
|
||||||
- g_free (user_name);
|
|
||||||
+ user_name = _cph_mechanism_get_callers_user_name (mechanism, context);
|
|
||||||
+ job_status = cph_cups_job_get_status (mechanism->priv->cups, id, user_name);
|
|
||||||
|
|
||||||
- if (callers_job) {
|
|
||||||
- if (!_check_polkit_for_action (mechanism, context, "job-set-hold-until"))
|
|
||||||
- return FALSE;
|
|
||||||
- }
|
|
||||||
- else {
|
|
||||||
- if (!_check_polkit_for_action (mechanism, context, "job-set-hold-until-another-owner"))
|
|
||||||
+ switch (job_status) {
|
|
||||||
+ case CPH_JOB_STATUS_OWNED_BY_USER: {
|
|
||||||
+ if (!_check_polkit_for_action_v (mechanism, context, "job-not-owned-edit", "job-edit", NULL))
|
|
||||||
+ return FALSE;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ case CPH_JOB_STATUS_NOT_OWNED_BY_USER: {
|
|
||||||
+ if (!_check_polkit_for_action (mechanism, context, "job-not-owned-edit"))
|
|
||||||
+ return FALSE;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ case CPH_JOB_STATUS_INVALID:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
- ret = cph_cups_job_set_hold_until (mechanism->priv->cups, id, job_hold_until);
|
|
||||||
+ ret = cph_cups_job_set_hold_until (mechanism->priv->cups, id, job_hold_until, user_name);
|
|
||||||
_cph_mechanism_return_error (mechanism, context, !ret);
|
|
||||||
|
|
||||||
+ g_free (user_name);
|
|
||||||
+
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
--- src/cups-pk-helper-mechanism.h 2009-02-27 14:55:03.000000000 +0100
|
|
||||||
+++ src/cups-pk-helper-mechanism.h 2009-02-27 14:53:40.000000000 +0100
|
|
||||||
@@ -222,17 +222,17 @@ cph_mechanism_server_set_settings (CphMe
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
cph_mechanism_job_cancel (CphMechanism *mechanism,
|
|
||||||
- gint id,
|
|
||||||
+ int id,
|
|
||||||
DBusGMethodInvocation *context);
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
cph_mechanism_job_restart (CphMechanism *mechanism,
|
|
||||||
- gint id,
|
|
||||||
+ int id,
|
|
||||||
DBusGMethodInvocation *context);
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
cph_mechanism_job_set_hold_until (CphMechanism *mechanism,
|
|
||||||
- gint id,
|
|
||||||
+ int id,
|
|
||||||
const char *job_hold_until,
|
|
||||||
DBusGMethodInvocation *context);
|
|
||||||
|
|
||||||
--- src/org.opensuse.CupsPkHelper.Mechanism.conf 2008-09-19 12:48:34.000000000 +0200
|
|
||||||
+++ src/org.opensuse.CupsPkHelper.Mechanism.conf 2009-02-06 15:39:25.000000000 +0100
|
|
||||||
@@ -8,12 +8,11 @@
|
|
||||||
<!-- Only root can own the service -->
|
|
||||||
<policy user="root">
|
|
||||||
<allow own="org.opensuse.CupsPkHelper.Mechanism"/>
|
|
||||||
- <allow send_interface="org.opensuse.CupsPkHelper.Mechanism"/>
|
|
||||||
</policy>
|
|
||||||
|
|
||||||
<!-- Allow anyone to invoke methods on the interfaces -->
|
|
||||||
<policy context="default">
|
|
||||||
- <allow send_interface="org.opensuse.CupsPkHelper.Mechanism"/>
|
|
||||||
+ <allow send_destination="org.opensuse.CupsPkHelper.Mechanism"/>
|
|
||||||
</policy>
|
|
||||||
|
|
||||||
</busconfig>
|
|
||||||
--- src/org.opensuse.cupspkhelper.mechanism.policy.in 2009-02-27 14:55:03.000000000 +0100
|
|
||||||
+++ src/org.opensuse.cupspkhelper.mechanism.policy.in 2009-02-27 14:53:40.000000000 +0100
|
|
||||||
@@ -68,54 +68,18 @@
|
|
||||||
</defaults>
|
|
||||||
</action>
|
|
||||||
|
|
||||||
- <action id="org.opensuse.cupspkhelper.mechanism.job-cancel">
|
|
||||||
- <_description>Cancel a job</_description>
|
|
||||||
- <_message>Privileges are required to cancel a job.</_message>
|
|
||||||
+ <action id="org.opensuse.cupspkhelper.mechanism.job-edit">
|
|
||||||
+ <_description>Restart/Cancel/Edit a job</_description>
|
|
||||||
+ <_message>Privileges are required to restart/cancel/edit a job.</_message>
|
|
||||||
<defaults>
|
|
||||||
<allow_inactive>no</allow_inactive>
|
|
||||||
<allow_active>auth_self</allow_active>
|
|
||||||
</defaults>
|
|
||||||
</action>
|
|
||||||
|
|
||||||
- <action id="org.opensuse.cupspkhelper.mechanism.job-cancel-another-owner">
|
|
||||||
- <_description>Cancel a job owned by another user</_description>
|
|
||||||
- <_message>Privileges are required to cancel a job owned by another user.</_message>
|
|
||||||
- <defaults>
|
|
||||||
- <allow_inactive>no</allow_inactive>
|
|
||||||
- <allow_active>auth_admin</allow_active>
|
|
||||||
- </defaults>
|
|
||||||
- </action>
|
|
||||||
-
|
|
||||||
- <action id="org.opensuse.cupspkhelper.mechanism.job-restart">
|
|
||||||
- <_description>Restart a job</_description>
|
|
||||||
- <_message>Privileges are required to restart a job.</_message>
|
|
||||||
- <defaults>
|
|
||||||
- <allow_inactive>no</allow_inactive>
|
|
||||||
- <allow_active>yes</allow_active>
|
|
||||||
- </defaults>
|
|
||||||
- </action>
|
|
||||||
-
|
|
||||||
- <action id="org.opensuse.cupspkhelper.mechanism.job-restart-another-owner">
|
|
||||||
- <_description>Restart a job owned by another user</_description>
|
|
||||||
- <_message>Privileges are required to restart a job owned by another user.</_message>
|
|
||||||
- <defaults>
|
|
||||||
- <allow_inactive>no</allow_inactive>
|
|
||||||
- <allow_active>auth_admin</allow_active>
|
|
||||||
- </defaults>
|
|
||||||
- </action>
|
|
||||||
-
|
|
||||||
- <action id="org.opensuse.cupspkhelper.mechanism.job-set-hold-until">
|
|
||||||
- <_description>Set hold-until time of a job</_description>
|
|
||||||
- <_message>Privileges are required to set hold-until time of a job.</_message>
|
|
||||||
- <defaults>
|
|
||||||
- <allow_inactive>no</allow_inactive>
|
|
||||||
- <allow_active>yes</allow_active>
|
|
||||||
- </defaults>
|
|
||||||
- </action>
|
|
||||||
-
|
|
||||||
- <action id="org.opensuse.cupspkhelper.mechanism.job-set-hold-until-another-owner">
|
|
||||||
- <_description>Set hold-until time of a job owned by another user</_description>
|
|
||||||
- <_message>Privileges are required to set hold-until time of a job owned by another user.</_message>
|
|
||||||
+ <action id="org.opensuse.cupspkhelper.mechanism.job-not-owned-edit">
|
|
||||||
+ <_description>Restart/Cancel/Edit a job owned by another user</_description>
|
|
||||||
+ <_message>Privileges are required to restart/cancel/edit a job owned by another user.</_message>
|
|
||||||
<defaults>
|
|
||||||
<allow_inactive>no</allow_inactive>
|
|
||||||
<allow_active>auth_admin</allow_active>
|
|
@ -1,150 +0,0 @@
|
|||||||
--- src/cups.c 2009-02-13 11:55:38.000000000 +0100
|
|
||||||
+++ src/cups.c 2009-02-13 11:57:39.000000000 +0100
|
|
||||||
@@ -45,6 +45,9 @@
|
|
||||||
|
|
||||||
#include "cups.h"
|
|
||||||
|
|
||||||
+#define MAX_RECONNECT_ATTEMPTS 100
|
|
||||||
+#define RECONNECT_DELAY 100000
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
getPrinters
|
|
||||||
getDests
|
|
||||||
@@ -114,6 +117,7 @@ struct CphCupsPrivate
|
|
||||||
http_t *connection;
|
|
||||||
ipp_status_t last_status;
|
|
||||||
char *internal_status;
|
|
||||||
+ gboolean reconnecting;
|
|
||||||
};
|
|
||||||
|
|
||||||
static GObject *cph_cups_constructor (GType type,
|
|
||||||
@@ -172,6 +176,31 @@ cph_cups_init (CphCups *cups)
|
|
||||||
cups->priv->connection = NULL;
|
|
||||||
cups->priv->last_status = IPP_OK;
|
|
||||||
cups->priv->internal_status = NULL;
|
|
||||||
+ cups->priv->reconnecting = FALSE;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+gboolean
|
|
||||||
+cph_cups_reconnect (CphCups *cups)
|
|
||||||
+{
|
|
||||||
+ gint return_value = -1;
|
|
||||||
+ gint i;
|
|
||||||
+
|
|
||||||
+ cups->priv->reconnecting = TRUE;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < MAX_RECONNECT_ATTEMPTS; i++) {
|
|
||||||
+ return_value = httpReconnect (cups->priv->connection);
|
|
||||||
+ if (return_value == 0) {
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ g_usleep (RECONNECT_DELAY);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ cups->priv->reconnecting = FALSE;
|
|
||||||
+
|
|
||||||
+ if (return_value == 0)
|
|
||||||
+ return TRUE;
|
|
||||||
+ else
|
|
||||||
+ return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
@@ -848,6 +877,10 @@ cph_cups_file_get (CphCups *cups,
|
|
||||||
const char *resource,
|
|
||||||
const char *filename)
|
|
||||||
{
|
|
||||||
+ struct stat file_stat;
|
|
||||||
+ uid_t uid = 0;
|
|
||||||
+ gid_t gid = 0;
|
|
||||||
+
|
|
||||||
g_return_val_if_fail (CPH_IS_CUPS (cups), FALSE);
|
|
||||||
|
|
||||||
if (!_cph_cups_is_resource_valid (cups, resource))
|
|
||||||
@@ -855,12 +888,31 @@ cph_cups_file_get (CphCups *cups,
|
|
||||||
if (!_cph_cups_is_filename_valid (cups, filename))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
+ stat (filename, &file_stat);
|
|
||||||
+ uid = file_stat.st_uid;
|
|
||||||
+ gid = file_stat.st_gid;
|
|
||||||
+
|
|
||||||
/* reset the internal status: we'll use the cups status */
|
|
||||||
_cph_cups_set_internal_status (cups, NULL);
|
|
||||||
-
|
|
||||||
cups->priv->last_status = cupsGetFile (cups->priv->connection,
|
|
||||||
resource, filename);
|
|
||||||
|
|
||||||
+ if (cups->priv->last_status != HTTP_OK) {
|
|
||||||
+ int fd;
|
|
||||||
+
|
|
||||||
+ if (cph_cups_reconnect (cups)) {
|
|
||||||
+
|
|
||||||
+ /* if cupsGetFile fail then filename is erased */
|
|
||||||
+ fd = open (filename, O_CREAT, S_IRUSR | S_IWUSR);
|
|
||||||
+ close (fd);
|
|
||||||
+ chown (filename, uid, gid);
|
|
||||||
+
|
|
||||||
+ _cph_cups_set_internal_status (cups, NULL);
|
|
||||||
+ cups->priv->last_status = cupsGetFile (cups->priv->connection,
|
|
||||||
+ resource, filename);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
return cups->priv->last_status == HTTP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -882,6 +934,9 @@ cph_cups_file_put (CphCups *cups,
|
|
||||||
cups->priv->last_status = cupsPutFile (cups->priv->connection,
|
|
||||||
resource, filename);
|
|
||||||
|
|
||||||
+ /* CUPS is being restarted, so we need to reconnect */
|
|
||||||
+ cph_cups_reconnect (cups);
|
|
||||||
+
|
|
||||||
return (cups->priv->last_status == HTTP_OK ||
|
|
||||||
cups->priv->last_status == HTTP_CREATED);
|
|
||||||
}
|
|
||||||
@@ -1613,6 +1668,9 @@ cph_cups_server_set_settings (CphCups
|
|
||||||
retval = cupsAdminSetServerSettings (cups->priv->connection,
|
|
||||||
num_settings, cups_settings);
|
|
||||||
|
|
||||||
+ /* CUPS is being restarted, so we need to reconnect */
|
|
||||||
+ cph_cups_reconnect (cups);
|
|
||||||
+
|
|
||||||
cupsFreeOptions (num_settings, cups_settings);
|
|
||||||
|
|
||||||
if (retval == 0) {
|
|
||||||
--- src/cups-pk-helper-mechanism.c 2009-02-13 11:55:38.000000000 +0100
|
|
||||||
+++ src/cups-pk-helper-mechanism.c 2009-02-13 11:55:52.000000000 +0100
|
|
||||||
@@ -60,7 +60,8 @@
|
|
||||||
static gboolean
|
|
||||||
do_exit (gpointer user_data)
|
|
||||||
{
|
|
||||||
- g_object_unref (CPH_MECHANISM (user_data));
|
|
||||||
+ if (user_data != NULL)
|
|
||||||
+ g_object_unref (CPH_MECHANISM (user_data));
|
|
||||||
|
|
||||||
exit (0);
|
|
||||||
|
|
||||||
@@ -540,10 +541,6 @@ cph_mechanism_file_put (CphMechanism
|
|
||||||
ret = cph_cups_file_put (mechanism->priv->cups, resource, filename);
|
|
||||||
_cph_mechanism_return_error (mechanism, context, !ret);
|
|
||||||
|
|
||||||
- /* TODO: this is a workaround for bnc#447422
|
|
||||||
- * https://bugzilla.novell.com/show_bug.cgi?id=447422 */
|
|
||||||
- do_exit (NULL);
|
|
||||||
-
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
--- src/org.opensuse.cupspkhelper.mechanism.policy.in 2009-02-13 11:55:38.000000000 +0100
|
|
||||||
+++ src/org.opensuse.cupspkhelper.mechanism.policy.in 2009-02-13 11:55:52.000000000 +0100
|
|
||||||
@@ -114,7 +114,7 @@
|
|
||||||
</action>
|
|
||||||
|
|
||||||
<action id="org.opensuse.cupspkhelper.mechanism.job-set-hold-until-another-owner">
|
|
||||||
- <_description>Set hold-until time of a job owned by another</_description>
|
|
||||||
+ <_description>Set hold-until time of a job owned by another user</_description>
|
|
||||||
<_message>Privileges are required to set hold-until time of a job owned by another user.</_message>
|
|
||||||
<defaults>
|
|
||||||
<allow_inactive>no</allow_inactive>
|
|
@ -1,6 +1,6 @@
|
|||||||
Name: cups-pk-helper
|
Name: cups-pk-helper
|
||||||
Version: 0.0.3
|
Version: 0.0.4
|
||||||
Release: 6%{?dist}
|
Release: 1%{?dist}
|
||||||
Summary: A helper that makes system-config-printer use PolicyKit
|
Summary: A helper that makes system-config-printer use PolicyKit
|
||||||
|
|
||||||
Group: System Environment/Base
|
Group: System Environment/Base
|
||||||
@ -8,12 +8,6 @@ License: GPLv2+
|
|||||||
URL: http://www.vuntz.net/download/cups-pk-helper/
|
URL: http://www.vuntz.net/download/cups-pk-helper/
|
||||||
Source0: http://www.vuntz.net/download/cups-pk-helper/cups-pk-helper-%{version}.tar.bz2
|
Source0: http://www.vuntz.net/download/cups-pk-helper/cups-pk-helper-%{version}.tar.bz2
|
||||||
|
|
||||||
Patch0: dependencies.patch
|
|
||||||
Patch1: pk_order.patch
|
|
||||||
Patch2: pk_jobs.patch
|
|
||||||
Patch3: cph_reconnect.patch
|
|
||||||
Patch4: cph_policies.patch
|
|
||||||
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||||
|
|
||||||
BuildRequires: cups-devel >= 1.2
|
BuildRequires: cups-devel >= 1.2
|
||||||
@ -26,6 +20,10 @@ BuildRequires: intltool >= 0.40.0
|
|||||||
BuildRequires: gettext-devel >= 0.17
|
BuildRequires: gettext-devel >= 0.17
|
||||||
|
|
||||||
Requires: python >= 2.4
|
Requires: python >= 2.4
|
||||||
|
Requires: cups-libs >= 1.2
|
||||||
|
Requires: dbus >= 1.2
|
||||||
|
Requires: dbus-glib >= 0.74
|
||||||
|
Requires: glib2 >= 2.14.0
|
||||||
|
|
||||||
|
|
||||||
%description
|
%description
|
||||||
@ -35,12 +33,6 @@ interfaces available under control of PolicyKit.
|
|||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
|
|
||||||
%patch0 -p0 -b .dependencies
|
|
||||||
%patch1 -p0 -b .pk-order
|
|
||||||
%patch2 -p0 -b .pk-jobs
|
|
||||||
%patch3 -p0 -b .cph-reconnect
|
|
||||||
%patch4 -p0 -b .cph-policies
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%configure
|
%configure
|
||||||
make %{?_smp_mflags}
|
make %{?_smp_mflags}
|
||||||
@ -66,6 +58,9 @@ rm -rf $RPM_BUILD_ROOT
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Mar 31 2009 Marek Kasik <mkasik@redhat.com> - 0.0.4-1
|
||||||
|
- Update to 0.0.4
|
||||||
|
|
||||||
* Fri Feb 27 2009 Marek Kasik <mkasik@redhat.com> - 0.0.3-6
|
* Fri Feb 27 2009 Marek Kasik <mkasik@redhat.com> - 0.0.3-6
|
||||||
- Replace job-cancel, job-restart and job-set-hold-until with job-edit
|
- Replace job-cancel, job-restart and job-set-hold-until with job-edit
|
||||||
- Replace job-cancel-another-owner, job-restart-another-owner
|
- Replace job-cancel-another-owner, job-restart-another-owner
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
diff -up ./configure.ac.orig ./configure.ac
|
|
||||||
--- ./configure.ac.orig 2008-11-21 07:33:43.000000000 +0100
|
|
||||||
+++ ./configure.ac 2009-01-14 13:49:17.000000000 +0100
|
|
||||||
@@ -56,9 +56,9 @@ PKG_CHECK_MODULES(CUPS_PK, glib-2.0 >= $
|
|
||||||
AC_SUBST(CUPS_PK_CFLAGS)
|
|
||||||
AC_SUBST(CUPS_PK_LIBS)
|
|
||||||
|
|
||||||
-PKG_CHECK_MODULES(CUPS_PK_GNOME, gtk+-2.0 >= $GTK_REQUIRED \
|
|
||||||
- dbus-1 >= $DBUS_REQUIRED \
|
|
||||||
- dbus-glib-1 >= $DBUS_GLIB_REQUIRED)
|
|
||||||
+PKG_CHECK_MODULES(CUPS_PK_GNOME, gtk2 >= $GTK_REQUIRED \
|
|
||||||
+ dbus >= $DBUS_REQUIRED \
|
|
||||||
+ dbus-glib >= $DBUS_GLIB_REQUIRED)
|
|
||||||
AC_SUBST(CUPS_PK_GNOME_CFLAGS)
|
|
||||||
AC_SUBST(CUPS_PK_GNOME_LIBS)
|
|
||||||
|
|
402
pk_jobs.patch
402
pk_jobs.patch
@ -1,402 +0,0 @@
|
|||||||
--- src/cups.c 2009-01-28 12:51:49.000000000 +0100
|
|
||||||
+++ src/cups.c 2009-01-28 10:59:36.000000000 +0100
|
|
||||||
@@ -381,6 +381,18 @@ _cph_cups_add_class_uri (ipp_t *req
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
+_cph_cups_add_job_uri (ipp_t *request,
|
|
||||||
+ gint job_id)
|
|
||||||
+{
|
|
||||||
+ char uri[HTTP_MAX_URI + 1];
|
|
||||||
+
|
|
||||||
+ g_snprintf (uri, sizeof (uri),
|
|
||||||
+ "ipp://localhost/jobs/%d", job_id);
|
|
||||||
+ ippAddString (request, IPP_TAG_OPERATION, IPP_TAG_URI,
|
|
||||||
+ "job-uri", NULL, uri);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void
|
|
||||||
_cph_cups_set_internal_status (CphCups *cups,
|
|
||||||
const char *status)
|
|
||||||
{
|
|
||||||
@@ -541,6 +553,41 @@ _cph_cups_send_new_printer_class_request
|
|
||||||
return _cph_cups_send_request (cups, request, CPH_RESOURCE_ADMIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
+static gboolean
|
|
||||||
+_cph_cups_send_new_simple_job_request (CphCups *cups,
|
|
||||||
+ ipp_op_t op,
|
|
||||||
+ gint job_id,
|
|
||||||
+ CphResource resource)
|
|
||||||
+{
|
|
||||||
+ ipp_t *request;
|
|
||||||
+
|
|
||||||
+ request = ippNewRequest (op);
|
|
||||||
+ _cph_cups_add_job_uri (request, job_id);
|
|
||||||
+
|
|
||||||
+ return _cph_cups_send_request (cups, request, resource);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static gboolean
|
|
||||||
+_cph_cups_send_new_job_attributes_request (CphCups *cups,
|
|
||||||
+ gint job_id,
|
|
||||||
+ const char *name,
|
|
||||||
+ const char *value,
|
|
||||||
+ CphResource resource)
|
|
||||||
+{
|
|
||||||
+ cups_option_t *options = NULL;
|
|
||||||
+ ipp_t *request;
|
|
||||||
+ gint num_options = 0;
|
|
||||||
+
|
|
||||||
+ request = ippNewRequest (IPP_SET_JOB_ATTRIBUTES);
|
|
||||||
+ _cph_cups_add_job_uri (request, job_id);
|
|
||||||
+
|
|
||||||
+ num_options = cupsAddOption (name, value,
|
|
||||||
+ num_options, &options);
|
|
||||||
+ cupsEncodeOptions (request, num_options, options);
|
|
||||||
+
|
|
||||||
+ return _cph_cups_send_request (cups, request, resource);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static int
|
|
||||||
_cph_cups_class_has_printer (CphCups *cups,
|
|
||||||
const char *class_name,
|
|
||||||
@@ -1581,6 +1628,42 @@ cph_cups_server_set_settings (CphCups
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
+gboolean
|
|
||||||
+cph_cups_job_cancel (CphCups *cups,
|
|
||||||
+ gint job_id)
|
|
||||||
+{
|
|
||||||
+ g_return_val_if_fail (CPH_IS_CUPS (cups), FALSE);
|
|
||||||
+
|
|
||||||
+ return _cph_cups_send_new_simple_job_request (cups, IPP_CANCEL_JOB,
|
|
||||||
+ job_id,
|
|
||||||
+ CPH_RESOURCE_ADMIN);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+gboolean
|
|
||||||
+cph_cups_job_restart (CphCups *cups,
|
|
||||||
+ gint job_id)
|
|
||||||
+{
|
|
||||||
+ g_return_val_if_fail (CPH_IS_CUPS (cups), FALSE);
|
|
||||||
+
|
|
||||||
+ return _cph_cups_send_new_simple_job_request (cups, IPP_RESTART_JOB,
|
|
||||||
+ job_id,
|
|
||||||
+ CPH_RESOURCE_ADMIN);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+gboolean
|
|
||||||
+cph_cups_job_set_hold_until (CphCups *cups,
|
|
||||||
+ gint job_id,
|
|
||||||
+ const char *job_hold_until)
|
|
||||||
+{
|
|
||||||
+ g_return_val_if_fail (CPH_IS_CUPS (cups), FALSE);
|
|
||||||
+
|
|
||||||
+ return _cph_cups_send_new_job_attributes_request (cups,
|
|
||||||
+ job_id,
|
|
||||||
+ "job-hold-until",
|
|
||||||
+ job_hold_until,
|
|
||||||
+ CPH_RESOURCE_ADMIN);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/******************************************************
|
|
||||||
* Non-object functions
|
|
||||||
******************************************************/
|
|
||||||
@@ -1647,3 +1730,28 @@ cph_cups_is_printer_uri_local (const cha
|
|
||||||
/* we don't know, so we assume it's not local */
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+gboolean
|
|
||||||
+cph_cups_is_job_owner (CphCups *cups,
|
|
||||||
+ gint job_id,
|
|
||||||
+ const char *user)
|
|
||||||
+{
|
|
||||||
+ cups_job_t *jobs;
|
|
||||||
+ gboolean user_job = FALSE;
|
|
||||||
+ gint num_jobs = 0;
|
|
||||||
+ gint i;
|
|
||||||
+
|
|
||||||
+ g_return_val_if_fail (CPH_IS_CUPS (cups), FALSE);
|
|
||||||
+
|
|
||||||
+ if (user == NULL)
|
|
||||||
+ return FALSE;
|
|
||||||
+
|
|
||||||
+ num_jobs = cupsGetJobs2 (cups->priv->connection, &jobs, NULL, 0, 0);
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < num_jobs; i++) {
|
|
||||||
+ if (jobs[i].id == job_id && g_strcmp0 (jobs[i].user, user) == 0)
|
|
||||||
+ user_job = TRUE;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return user_job;
|
|
||||||
+}
|
|
||||||
--- src/cups.h 2008-11-21 01:50:42.000000000 +0100
|
|
||||||
+++ src/cups.h 2009-01-27 17:33:00.000000000 +0100
|
|
||||||
@@ -160,6 +160,20 @@ gboolean cph_cups_is_printer_local (CphC
|
|
||||||
|
|
||||||
gboolean cph_cups_is_printer_uri_local (const char *uri);
|
|
||||||
|
|
||||||
+gboolean cph_cups_job_cancel (CphCups *cups,
|
|
||||||
+ gint job_id);
|
|
||||||
+
|
|
||||||
+gboolean cph_cups_job_restart (CphCups *cups,
|
|
||||||
+ gint job_id);
|
|
||||||
+
|
|
||||||
+gboolean cph_cups_job_set_hold_until (CphCups *cups,
|
|
||||||
+ gint job_id,
|
|
||||||
+ const char *job_hold_until);
|
|
||||||
+
|
|
||||||
+gboolean cph_cups_is_job_owner (CphCups *cups,
|
|
||||||
+ gint job_id,
|
|
||||||
+ const char *user);
|
|
||||||
+
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* CPH_CUPS_H */
|
|
||||||
--- src/cups-pk-helper-mechanism.c 2009-01-28 12:51:49.000000000 +0100
|
|
||||||
+++ src/cups-pk-helper-mechanism.c 2009-01-28 11:39:16.000000000 +0100
|
|
||||||
@@ -47,6 +47,10 @@
|
|
||||||
|
|
||||||
#include <polkit-dbus/polkit-dbus.h>
|
|
||||||
|
|
||||||
+#include <cups/cups.h>
|
|
||||||
+
|
|
||||||
+#include <pwd.h>
|
|
||||||
+
|
|
||||||
#include "cups-pk-helper-mechanism.h"
|
|
||||||
#include "cups-pk-helper-mechanism-glue.h"
|
|
||||||
#include "cups.h"
|
|
||||||
@@ -1011,3 +1015,116 @@ cph_mechanism_server_set_settings (CphMe
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+gchar *
|
|
||||||
+cph_mechanism_get_callers_user_name (CphMechanism *mechanism,
|
|
||||||
+ DBusGMethodInvocation *context)
|
|
||||||
+{
|
|
||||||
+ unsigned long sender_uid;
|
|
||||||
+ struct passwd *password_entry;
|
|
||||||
+ const gchar *sender;
|
|
||||||
+ DBusError dbus_error;
|
|
||||||
+ gchar *user_name = NULL;
|
|
||||||
+
|
|
||||||
+ sender = dbus_g_method_get_sender (context);
|
|
||||||
+ dbus_error_init (&dbus_error);
|
|
||||||
+ sender_uid = dbus_bus_get_unix_user (dbus_g_connection_get_connection (mechanism->priv->system_bus_connection), sender, &dbus_error);
|
|
||||||
+ password_entry = getpwuid ((uid_t) sender_uid);
|
|
||||||
+
|
|
||||||
+ if (password_entry != NULL) {
|
|
||||||
+ user_name = g_strdup(password_entry->pw_name);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return user_name;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+gboolean
|
|
||||||
+cph_mechanism_job_cancel (CphMechanism *mechanism,
|
|
||||||
+ gint id,
|
|
||||||
+ DBusGMethodInvocation *context)
|
|
||||||
+{
|
|
||||||
+ gboolean ret;
|
|
||||||
+ gboolean callers_job = FALSE;
|
|
||||||
+ char *user_name = NULL;
|
|
||||||
+
|
|
||||||
+ reset_killtimer (mechanism);
|
|
||||||
+
|
|
||||||
+ user_name = cph_mechanism_get_callers_user_name (mechanism, context);
|
|
||||||
+ callers_job = cph_cups_is_job_owner (mechanism->priv->cups, id, user_name);
|
|
||||||
+ g_free (user_name);
|
|
||||||
+
|
|
||||||
+ if (callers_job) {
|
|
||||||
+ if (!_check_polkit_for_action (mechanism, context, "job-cancel"))
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ if (!_check_polkit_for_action (mechanism, context, "job-cancel-another-owner"))
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ ret = cph_cups_job_cancel (mechanism->priv->cups, id);
|
|
||||||
+ _cph_mechanism_return_error (mechanism, context, !ret);
|
|
||||||
+
|
|
||||||
+ return TRUE;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+gboolean
|
|
||||||
+cph_mechanism_job_restart (CphMechanism *mechanism,
|
|
||||||
+ gint id,
|
|
||||||
+ DBusGMethodInvocation *context)
|
|
||||||
+{
|
|
||||||
+ gboolean ret;
|
|
||||||
+ gboolean callers_job = FALSE;
|
|
||||||
+ char *user_name = NULL;
|
|
||||||
+
|
|
||||||
+ reset_killtimer (mechanism);
|
|
||||||
+
|
|
||||||
+ user_name = cph_mechanism_get_callers_user_name (mechanism, context);
|
|
||||||
+ callers_job = cph_cups_is_job_owner (mechanism->priv->cups, id, user_name);
|
|
||||||
+ g_free (user_name);
|
|
||||||
+
|
|
||||||
+ if (callers_job) {
|
|
||||||
+ if (!_check_polkit_for_action (mechanism, context, "job-restart"))
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ if (!_check_polkit_for_action (mechanism, context, "job-restart-another-owner"))
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ ret = cph_cups_job_restart (mechanism->priv->cups, id);
|
|
||||||
+ _cph_mechanism_return_error (mechanism, context, !ret);
|
|
||||||
+
|
|
||||||
+ return TRUE;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+gboolean
|
|
||||||
+cph_mechanism_job_set_hold_until (CphMechanism *mechanism,
|
|
||||||
+ gint id,
|
|
||||||
+ const char *job_hold_until,
|
|
||||||
+ DBusGMethodInvocation *context)
|
|
||||||
+{
|
|
||||||
+ gboolean ret;
|
|
||||||
+ gboolean callers_job = FALSE;
|
|
||||||
+ char *user_name = NULL;
|
|
||||||
+
|
|
||||||
+ reset_killtimer (mechanism);
|
|
||||||
+
|
|
||||||
+ user_name = cph_mechanism_get_callers_user_name (mechanism, context);
|
|
||||||
+ callers_job = cph_cups_is_job_owner (mechanism->priv->cups, id, user_name);
|
|
||||||
+ g_free (user_name);
|
|
||||||
+
|
|
||||||
+ if (callers_job) {
|
|
||||||
+ if (!_check_polkit_for_action (mechanism, context, "job-set-hold-until"))
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ if (!_check_polkit_for_action (mechanism, context, "job-set-hold-until-another-owner"))
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ ret = cph_cups_job_set_hold_until (mechanism->priv->cups, id, job_hold_until);
|
|
||||||
+ _cph_mechanism_return_error (mechanism, context, !ret);
|
|
||||||
+
|
|
||||||
+ return TRUE;
|
|
||||||
+}
|
|
||||||
--- src/cups-pk-helper-mechanism.h 2008-11-21 01:57:03.000000000 +0100
|
|
||||||
+++ src/cups-pk-helper-mechanism.h 2009-01-27 17:31:20.000000000 +0100
|
|
||||||
@@ -220,6 +220,22 @@ cph_mechanism_server_set_settings (CphMe
|
|
||||||
GHashTable *settings,
|
|
||||||
DBusGMethodInvocation *context);
|
|
||||||
|
|
||||||
+gboolean
|
|
||||||
+cph_mechanism_job_cancel (CphMechanism *mechanism,
|
|
||||||
+ gint id,
|
|
||||||
+ DBusGMethodInvocation *context);
|
|
||||||
+
|
|
||||||
+gboolean
|
|
||||||
+cph_mechanism_job_restart (CphMechanism *mechanism,
|
|
||||||
+ gint id,
|
|
||||||
+ DBusGMethodInvocation *context);
|
|
||||||
+
|
|
||||||
+gboolean
|
|
||||||
+cph_mechanism_job_set_hold_until (CphMechanism *mechanism,
|
|
||||||
+ gint id,
|
|
||||||
+ const char *job_hold_until,
|
|
||||||
+ DBusGMethodInvocation *context);
|
|
||||||
+
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* CPH_MECHANISM_H */
|
|
||||||
--- src/cups-pk-helper-mechanism.xml 2008-11-21 01:55:52.000000000 +0100
|
|
||||||
+++ src/cups-pk-helper-mechanism.xml 2009-01-27 17:26:57.000000000 +0100
|
|
||||||
@@ -174,5 +174,23 @@
|
|
||||||
<arg name="error" direction="out" type="s"/>
|
|
||||||
</method>
|
|
||||||
|
|
||||||
+ <method name="JobCancel">
|
|
||||||
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
|
|
||||||
+ <arg name="jobid" direction="in" type="i"/>
|
|
||||||
+ <arg name="error" direction="out" type="s"/>
|
|
||||||
+ </method>
|
|
||||||
+
|
|
||||||
+ <method name="JobRestart">
|
|
||||||
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
|
|
||||||
+ <arg name="jobid" direction="in" type="i"/>
|
|
||||||
+ <arg name="error" direction="out" type="s"/>
|
|
||||||
+ </method>
|
|
||||||
+
|
|
||||||
+ <method name="JobSetHoldUntil">
|
|
||||||
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
|
|
||||||
+ <arg name="jobid" direction="in" type="i"/>
|
|
||||||
+ <arg name="job_hold_until" direction="in" type="s"/>
|
|
||||||
+ <arg name="error" direction="out" type="s"/>
|
|
||||||
+ </method>
|
|
||||||
</interface>
|
|
||||||
</node>
|
|
||||||
--- src/org.opensuse.cupspkhelper.mechanism.policy.in 2008-11-21 00:58:16.000000000 +0100
|
|
||||||
+++ src/org.opensuse.cupspkhelper.mechanism.policy.in 2009-01-28 12:47:49.000000000 +0100
|
|
||||||
@@ -68,6 +68,60 @@
|
|
||||||
</defaults>
|
|
||||||
</action>
|
|
||||||
|
|
||||||
+ <action id="org.opensuse.cupspkhelper.mechanism.job-cancel">
|
|
||||||
+ <_description>Cancel a job</_description>
|
|
||||||
+ <_message>Privileges are required to cancel a job.</_message>
|
|
||||||
+ <defaults>
|
|
||||||
+ <allow_inactive>no</allow_inactive>
|
|
||||||
+ <allow_active>auth_self</allow_active>
|
|
||||||
+ </defaults>
|
|
||||||
+ </action>
|
|
||||||
+
|
|
||||||
+ <action id="org.opensuse.cupspkhelper.mechanism.job-cancel-another-owner">
|
|
||||||
+ <_description>Cancel a job owned by another user</_description>
|
|
||||||
+ <_message>Privileges are required to cancel a job owned by another user.</_message>
|
|
||||||
+ <defaults>
|
|
||||||
+ <allow_inactive>no</allow_inactive>
|
|
||||||
+ <allow_active>auth_admin</allow_active>
|
|
||||||
+ </defaults>
|
|
||||||
+ </action>
|
|
||||||
+
|
|
||||||
+ <action id="org.opensuse.cupspkhelper.mechanism.job-restart">
|
|
||||||
+ <_description>Restart a job</_description>
|
|
||||||
+ <_message>Privileges are required to restart a job.</_message>
|
|
||||||
+ <defaults>
|
|
||||||
+ <allow_inactive>no</allow_inactive>
|
|
||||||
+ <allow_active>yes</allow_active>
|
|
||||||
+ </defaults>
|
|
||||||
+ </action>
|
|
||||||
+
|
|
||||||
+ <action id="org.opensuse.cupspkhelper.mechanism.job-restart-another-owner">
|
|
||||||
+ <_description>Restart a job owned by another user</_description>
|
|
||||||
+ <_message>Privileges are required to restart a job owned by another user.</_message>
|
|
||||||
+ <defaults>
|
|
||||||
+ <allow_inactive>no</allow_inactive>
|
|
||||||
+ <allow_active>auth_admin</allow_active>
|
|
||||||
+ </defaults>
|
|
||||||
+ </action>
|
|
||||||
+
|
|
||||||
+ <action id="org.opensuse.cupspkhelper.mechanism.job-set-hold-until">
|
|
||||||
+ <_description>Set hold-until time of a job</_description>
|
|
||||||
+ <_message>Privileges are required to set hold-until time of a job.</_message>
|
|
||||||
+ <defaults>
|
|
||||||
+ <allow_inactive>no</allow_inactive>
|
|
||||||
+ <allow_active>yes</allow_active>
|
|
||||||
+ </defaults>
|
|
||||||
+ </action>
|
|
||||||
+
|
|
||||||
+ <action id="org.opensuse.cupspkhelper.mechanism.job-set-hold-until-another-owner">
|
|
||||||
+ <_description>Set hold-until time of a job owned by another</_description>
|
|
||||||
+ <_message>Privileges are required to set hold-until time of a job owned by another user.</_message>
|
|
||||||
+ <defaults>
|
|
||||||
+ <allow_inactive>no</allow_inactive>
|
|
||||||
+ <allow_active>auth_admin</allow_active>
|
|
||||||
+ </defaults>
|
|
||||||
+ </action>
|
|
||||||
+
|
|
||||||
<!-- Deprecated -->
|
|
||||||
<action id="org.opensuse.cupspkhelper.mechanism.printeraddremove">
|
|
||||||
<_description>Add/Remove/Edit a printer</_description>
|
|
@ -1,65 +0,0 @@
|
|||||||
--- src/cups.c 2008-11-21 07:04:28.000000000 +0100
|
|
||||||
+++ src/cups.c 2009-01-23 16:28:07.000000000 +0100
|
|
||||||
@@ -1606,6 +1606,7 @@ cph_cups_is_printer_uri_local (const cha
|
|
||||||
g_str_has_prefix (lower_uri, "beh:") ||
|
|
||||||
g_str_has_prefix (lower_uri, "scsi:") ||
|
|
||||||
g_str_has_prefix (lower_uri, "serial:") ||
|
|
||||||
+ g_str_has_prefix (lower_uri, "file:") ||
|
|
||||||
g_str_has_prefix (lower_uri, "pipe:")) {
|
|
||||||
g_free (lower_uri);
|
|
||||||
return TRUE;
|
|
||||||
--- src/cups-pk-helper-mechanism.c 2008-11-21 07:28:20.000000000 +0100
|
|
||||||
+++ src/cups-pk-helper-mechanism.c 2009-01-26 13:54:44.000000000 +0100
|
|
||||||
@@ -901,21 +901,18 @@ cph_mechanism_printer_set_default (CphMe
|
|
||||||
DBusGMethodInvocation *context)
|
|
||||||
{
|
|
||||||
gboolean ret;
|
|
||||||
- const char *last_action;
|
|
||||||
+ const char *action;
|
|
||||||
|
|
||||||
reset_killtimer (mechanism);
|
|
||||||
|
|
||||||
- last_action = _cph_mechanism_get_action_for_name (mechanism, name);
|
|
||||||
+ action = _cph_mechanism_get_action_for_name (mechanism, name);
|
|
||||||
if (!_check_polkit_for_action_v (mechanism, context,
|
|
||||||
"printeraddremove",
|
|
||||||
- /* this is not the last check because
|
|
||||||
- * it's likely most useful to the user
|
|
||||||
- * to give "printer-X-edit" powers */
|
|
||||||
- "printer-default",
|
|
||||||
/* quite important, since it's
|
|
||||||
* automatically called after adding a
|
|
||||||
* printer */
|
|
||||||
- last_action,
|
|
||||||
+ action,
|
|
||||||
+ "printer-set-default",
|
|
||||||
NULL))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
@@ -932,21 +929,19 @@ cph_mechanism_printer_set_enabled (CphMe
|
|
||||||
DBusGMethodInvocation *context)
|
|
||||||
{
|
|
||||||
gboolean ret;
|
|
||||||
- const char *last_action;
|
|
||||||
+ const char *action;
|
|
||||||
|
|
||||||
reset_killtimer (mechanism);
|
|
||||||
|
|
||||||
- last_action = _cph_mechanism_get_action_for_name (mechanism, name);
|
|
||||||
+ action = _cph_mechanism_get_action_for_name (mechanism, name);
|
|
||||||
+
|
|
||||||
if (!_check_polkit_for_action_v (mechanism, context,
|
|
||||||
"printeraddremove",
|
|
||||||
- /* this is not the last check because
|
|
||||||
- * it's likely most useful to the user
|
|
||||||
- * to give "printer-X-edit" powers */
|
|
||||||
- "printer-enable",
|
|
||||||
/* quite important, since it's
|
|
||||||
* automatically called after adding a
|
|
||||||
* printer */
|
|
||||||
- last_action,
|
|
||||||
+ action,
|
|
||||||
+ "printer-enable",
|
|
||||||
NULL))
|
|
||||||
return FALSE;
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user