rpms/cups/devel cups-lspp.patch,1.2,1.3 cups.spec,1.250,1.251
fedora-cvs-commits at redhat.com
fedora-cvs-commits at redhat.com
Mon Aug 21 16:26:30 UTC 2006
- Previous message (by thread): rpms/util-linux/devel util-linux-login.pamd, NONE, 1.1 util-linux-remote.pamd, NONE, 1.1 util-linux-2.13-mount-context.patch, 1.1, 1.2 util-linux.spec, 1.138, 1.139 util-linux-selinux.pamd, 1.7, NONE
- Next message (by thread): rpms/control-center/devel control-center-2.15.91-fix-thumbnailing.patch, NONE, 1.1 control-center.spec, 1.170, 1.171 control-center-2.15.90-fix-thumbnailing.patch, 1.1, NONE
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Author: twaugh
Update of /cvs/dist/rpms/cups/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv8357
Modified Files:
cups-lspp.patch cups.spec
Log Message:
* Mon Aug 21 2006 Tim Waugh <twaugh at redhat.com> 1:1.2.2-14
- Updated LSPP patch (bug #203376).
cups-lspp.patch:
Makedefs.in | 2
config-scripts/cups-lspp.m4 | 36 +++++
config.h.in | 7 +
configure.in | 2
cups/cups.h | 8 +
data/Makefile | 5
data/mls | 277 ++++++++++++++++++++++++++++++++++++++++++++
data/selinux | 277 ++++++++++++++++++++++++++++++++++++++++++++
data/te | 277 ++++++++++++++++++++++++++++++++++++++++++++
scheduler/Makefile | 6
scheduler/client.c | 101 +++++++++++++++-
scheduler/client.h | 14 ++
scheduler/conf.c | 46 +++++++
scheduler/conf.h | 8 +
scheduler/ipp.c | 271 +++++++++++++++++++++++++++++++++++++++++++
scheduler/job.c | 155 ++++++++++++++++++++++++
scheduler/job.h | 11 +
scheduler/lspp-access.c | 56 ++++++++
scheduler/main.c | 32 +++++
scheduler/printers.c | 45 +++++++
20 files changed, 1630 insertions(+), 6 deletions(-)
Index: cups-lspp.patch
===================================================================
RCS file: /cvs/dist/rpms/cups/devel/cups-lspp.patch,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- cups-lspp.patch 2 Aug 2006 09:37:30 -0000 1.2
+++ cups-lspp.patch 21 Aug 2006 16:26:28 -0000 1.3
@@ -1,6 +1,5 @@
-diff -burN cups-1.2.2-vanilla/config.h.in cups-1.2.2/config.h.in
---- cups-1.2.2-vanilla/config.h.in 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/config.h.in 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/config.h.in 2006-08-10 11:42:42.000000000 -0400
++++ cups-1.2.2/config.h.in 2006-08-07 06:19:33.000000000 -0400
@@ -443,6 +443,13 @@
#undef HAVE_APPLETALK_AT_PROTO_H
@@ -15,9 +14,8 @@
#endif /* !_CUPS_CONFIG_H_ */
/*
-diff -burN cups-1.2.2-vanilla/configure.in cups-1.2.2/configure.in
---- cups-1.2.2-vanilla/configure.in 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/configure.in 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/configure.in 2006-08-10 11:43:02.000000000 -0400
++++ cups-1.2.2/configure.in 2006-08-07 06:19:33.000000000 -0400
@@ -47,6 +47,8 @@
sinclude(config-scripts/cups-pdf.m4)
sinclude(config-scripts/cups-scripting.m4)
@@ -27,9 +25,47 @@
INSTALL_LANGUAGES=""
UNINSTALL_LANGUAGES=""
LANGFILES=""
-diff -burN cups-1.2.2-vanilla/cups/cups.h cups-1.2.2/cups/cups.h
---- cups-1.2.2-vanilla/cups/cups.h 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/cups/cups.h 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/config-scripts/cups-lspp.m4 1969-12-31 19:00:00.000000000 -0500
++++ cups-1.2.2/config-scripts/cups-lspp.m4 2006-08-07 06:19:33.000000000 -0400
+@@ -0,0 +1,36 @@
++dnl
++dnl LSPP code for the Common UNIX Printing System (CUPS).
++dnl
++dnl Copyright 2005-2006 by Hewlett-Packard Development Company, L.P.
++dnl
++dnl This program is free software; you can redistribute it and/or modify
++dnl it under the terms of the GNU General Public License as published by
++dnl the Free Software Foundation; version 2.
++dnl
++dnl This program is distributed in the hope that it will be useful, but
++dnl WITHOUT ANY WARRANTY; without even the implied warranty of
++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++dnl General Public License for more details.
++dnl
++dnl You should have received a copy of the GNU General Public License
++dnl along with this program; if not, write to the Free Software Foundation,
++dnl Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301 USA
++dnl
++
++dnl Are we trying to meet LSPP requirements
++AC_ARG_ENABLE(lspp, [ --enable-lspp turn on auditing and label support, default=no])
++
++if test x"$enable_lspp" != xno; then
++ case "$uname" in
++ Linux)
++ AC_CHECK_LIB(audit,audit_log_user_message, [LIBAUDIT="-laudit" AC_SUBST(LIBAUDIT)])
++ AC_CHECK_HEADER(libaudit.h)
++ AC_CHECK_LIB(selinux,getpeercon, [LIBSELINUX="-lselinux" AC_SUBST(LIBSELINUX)])
++ AC_CHECK_HEADER(selinux/selinux.h)
++ AC_DEFINE(WITH_LSPP)
++ ;;
++ *)
++ # All others
++ ;;
++ esac
++fi
+--- cups-1.2.2-8/cups/cups.h 2006-08-10 11:43:02.000000000 -0400
++++ cups-1.2.2/cups/cups.h 2006-08-07 06:19:33.000000000 -0400
@@ -24,6 +24,8 @@
* This file is subject to the Apple OS-Developed Software exception.
*/
@@ -52,9 +88,8 @@
/*
* Types and structures...
*/
-diff -burN cups-1.2.2-vanilla/data/Makefile cups-1.2.2/data/Makefile
---- cups-1.2.2-vanilla/data/Makefile 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/data/Makefile 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/data/Makefile 2006-08-10 11:43:02.000000000 -0400
++++ cups-1.2.2/data/Makefile 2006-08-07 06:19:33.000000000 -0400
@@ -34,7 +34,10 @@
secret \
standard \
@@ -67,9 +102,8 @@
CHARMAPS = \
euc-cn.txt \
-diff -burN cups-1.2.2-vanilla/data/mls cups-1.2.2/data/mls
---- cups-1.2.2-vanilla/data/mls 1969-12-31 19:00:00.000000000 -0500
-+++ cups-1.2.2/data/mls 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/data/mls 1969-12-31 19:00:00.000000000 -0500
++++ cups-1.2.2/data/mls 2006-08-07 06:19:33.000000000 -0400
@@ -0,0 +1,277 @@
+%!PS-Adobe-3.0
+%%BoundingBox: 0 0 612 792
@@ -348,9 +382,8 @@
+% End of "$Id$".
+%
+%%EOF
-diff -burN cups-1.2.2-vanilla/data/selinux cups-1.2.2/data/selinux
---- cups-1.2.2-vanilla/data/selinux 1969-12-31 19:00:00.000000000 -0500
-+++ cups-1.2.2/data/selinux 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/data/selinux 1969-12-31 19:00:00.000000000 -0500
++++ cups-1.2.2/data/selinux 2006-08-07 06:19:33.000000000 -0400
@@ -0,0 +1,277 @@
+%!PS-Adobe-3.0
+%%BoundingBox: 0 0 612 792
@@ -629,9 +662,8 @@
+% End of "$Id$".
+%
+%%EOF
-diff -burN cups-1.2.2-vanilla/data/te cups-1.2.2/data/te
---- cups-1.2.2-vanilla/data/te 1969-12-31 19:00:00.000000000 -0500
-+++ cups-1.2.2/data/te 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/data/te 1969-12-31 19:00:00.000000000 -0500
++++ cups-1.2.2/data/te 2006-08-07 06:19:33.000000000 -0400
@@ -0,0 +1,277 @@
+%!PS-Adobe-3.0
+%%BoundingBox: 0 0 612 792
@@ -910,9 +942,8 @@
+% End of "$Id$".
+%
+%%EOF
-diff -burN cups-1.2.2-vanilla/Makedefs.in cups-1.2.2/Makedefs.in
---- cups-1.2.2-vanilla/Makedefs.in 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/Makedefs.in 2006-08-01 07:08:43.000000000 -0400
+--- cups-1.2.2-8/Makedefs.in 2006-08-10 11:43:02.000000000 -0400
++++ cups-1.2.2/Makedefs.in 2006-08-07 06:19:33.000000000 -0400
@@ -135,7 +135,7 @@
@LDFLAGS@ @RELROFLAG@ @PIEFLAGS@ $(OPTIM)
LINKCUPS = @LINKCUPS@ $(SSLLIBS)
@@ -922,9 +953,8 @@
OPTIM = @OPTIM@
OPTIONS =
PAMLIBS = @PAMLIBS@
-diff -burN cups-1.2.2-vanilla/scheduler/client.c cups-1.2.2/scheduler/client.c
---- cups-1.2.2-vanilla/scheduler/client.c 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/scheduler/client.c 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/scheduler/client.c 2006-08-10 11:43:02.000000000 -0400
++++ cups-1.2.2/scheduler/client.c 2006-08-07 06:19:33.000000000 -0400
@@ -43,12 +43,17 @@
* make_certificate() - Make a self-signed SSL/TLS certificate.
* pipe_command() - Pipe the output of a command to the remote client.
@@ -1067,9 +1097,8 @@
/*
* 'pipe_command()' - Pipe the output of a command to the remote client.
*/
-diff -burN cups-1.2.2-vanilla/scheduler/client.h cups-1.2.2/scheduler/client.h
---- cups-1.2.2-vanilla/scheduler/client.h 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/scheduler/client.h 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/scheduler/client.h 2006-08-10 11:43:02.000000000 -0400
++++ cups-1.2.2/scheduler/client.h 2006-08-07 06:19:33.000000000 -0400
@@ -22,6 +22,13 @@
* WWW: http://www.cups.org
*/
@@ -1105,9 +1134,8 @@
/*
-diff -burN cups-1.2.2-vanilla/scheduler/conf.c cups-1.2.2/scheduler/conf.c
---- cups-1.2.2-vanilla/scheduler/conf.c 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/scheduler/conf.c 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/scheduler/conf.c 2006-08-10 11:43:02.000000000 -0400
++++ cups-1.2.2/scheduler/conf.c 2006-08-14 06:09:33.000000000 -0400
@@ -35,6 +35,7 @@
* read_configuration() - Read a configuration file.
* read_location() - Read a <Location path> definition.
@@ -1146,41 +1174,52 @@
/*
-@@ -377,6 +387,16 @@
+@@ -377,6 +387,7 @@
}
}
++
+ /*
+ * Numeric options...
+ */
+@@ -470,6 +481,16 @@
+
+ RunUser = getuid();
+
+#ifdef WITH_LSPP
+ /*
+ * ClassifyOverride is set during read_configuration, if its on, report it now
+ */
-+ if (ClassifyOverride)
++ if (ClassifyOverride && AuditLog != -1)
+ audit_log_user_message(AuditLog, AUDIT_USYS_CONFIG,
+ "[Config] ClassifyOverride=enabled Users can override print banners",
+ ServerName, NULL, NULL, 1);
+#endif /* WITH_LSPP */
+
/*
- * Numeric options...
+ * See if the ServerName is an IP address...
*/
-@@ -779,7 +799,16 @@
+@@ -779,7 +800,19 @@
cupsdClearString(&Classification);
if (Classification)
+ {
cupsdLogMessage(CUPSD_LOG_INFO, "Security set to \"%s\"", Classification);
+#ifdef WITH_LSPP
-+ audit_message = NULL;
-+ cupsdSetStringf(&audit_message, "[Config] Security level=%s", Classification);
-+ audit_log_user_message(AuditLog, AUDIT_LABEL_LEVEL_CHANGE, audit_message,
-+ ServerName, NULL, NULL, 1);
-+ free(audit_message);
++ if (AuditLog != -1)
++ {
++ audit_message = NULL;
++ cupsdSetStringf(&audit_message, "[Config] Security level=%s", Classification);
++ audit_log_user_message(AuditLog, AUDIT_LABEL_LEVEL_CHANGE, audit_message,
++ ServerName, NULL, NULL, 1);
++ free(audit_message);
++ }
+#endif /* WITH_LSPP */
+ }
/*
* Update the MaxClientsPerHost value, as needed...
-@@ -2233,7 +2262,6 @@
+@@ -2233,7 +2266,6 @@
cupsd_dirsvc_addr_t *dira; /* New browse address array */
@@ -1188,7 +1227,7 @@
if (NumBrowsers == 0)
dira = malloc(sizeof(cupsd_dirsvc_addr_t));
else
-@@ -3286,6 +3314,18 @@
+@@ -3286,6 +3318,18 @@
return (0);
}
@@ -1207,9 +1246,8 @@
/*
* End of "$Id$".
-diff -burN cups-1.2.2-vanilla/scheduler/conf.h cups-1.2.2/scheduler/conf.h
---- cups-1.2.2-vanilla/scheduler/conf.h 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/scheduler/conf.h 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/scheduler/conf.h 2006-08-10 11:43:02.000000000 -0400
++++ cups-1.2.2/scheduler/conf.h 2006-08-07 06:19:33.000000000 -0400
@@ -182,7 +182,6 @@
/* Number of MIME types */
VAR const char **MimeTypes VALUE(NULL);
@@ -1239,9 +1277,8 @@
/*
* End of "$Id$".
-diff -burN cups-1.2.2-vanilla/scheduler/ipp.c cups-1.2.2/scheduler/ipp.c
---- cups-1.2.2-vanilla/scheduler/ipp.c 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/scheduler/ipp.c 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/scheduler/ipp.c 2006-08-10 11:43:02.000000000 -0400
++++ cups-1.2.2/scheduler/ipp.c 2006-08-21 06:57:47.000000000 -0400
@@ -96,6 +96,9 @@
* validate_user() - Validate the user for the request.
*/
@@ -1267,7 +1304,7 @@
/*
* PPD default choice structure...
-@@ -1166,6 +1177,15 @@
+@@ -1166,6 +1177,18 @@
int kbytes; /* Size of print file */
int i; /* Looping var */
int lowerpagerange; /* Page range bound */
@@ -1279,11 +1316,14 @@
+ int acstatus; /* return value of the access check */
+ pid_t acpid; /* pid for the access check */
+ char *printerfile; /* device file pointed to by the printer */
++ char *userheader = NULL; /* User supplied job-sheets[0] */
++ char *userfooter = NULL; /* User supplied job-sheets[1] */
++ int override = 0; /* Was a banner overrode on a job */
+#endif /* WITH_LSPP */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_job(%p[%d], %s)", con,
-@@ -1342,6 +1362,97 @@
+@@ -1342,6 +1365,90 @@
return (NULL);
}
@@ -1316,19 +1356,8 @@
+ * Perform an access check so that if the user gets feedback at enqueue time
+ */
+
-+ printerfile = strdup(printer->device_uri);
-+ if ((printerfile = strrchr(printer->device_uri, '=')) == NULL)
-+ {
-+ if ((printerfile = strrchr(printer->device_uri, ':')) == NULL)
-+ {
-+ cupsdLogMessage(CUPSD_LOG_ERROR, "add_job: Unable to determine printer device file");
-+ send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to perform printer access check"));
-+ return (NULL);
-+ }
-+ }
-+
-+ printerfile++;
-+ if (strncmp(printerfile, "/dev/", 5) == 0)
++ printerfile = strstr(printer->device_uri, "/dev/");
++ if (printerfile != NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "add_job: Attempting an access check on printer device %s",
+ printerfile);
@@ -1341,7 +1370,7 @@
+ }
+
+ snprintf(buffer, sizeof(buffer), "%s/daemon/lspp-access", ServerBin);
-+ argv[0] = "access";
++ argv[0] = "lspp-access";
+ argv[1] = printerfile;
+ argv[2] = NULL;
+
@@ -1357,12 +1386,16 @@
+ /*
+ * The access check failed, so cancel the job and send an audit message
+ */
-+ audit_message = NULL;
-+ cupsdSetStringf(&audit_message, "job=%d auid=%u acct=%s obj=%s refused, unable to access printer=%s",
-+ job->id, con->auid, con->username, con->scon, printer->name);
-+ audit_log_user_message(AuditLog, AUDIT_USER_LABELED_EXPORT, audit_message,
-+ ServerName, NULL, NULL, 0);
-+ free(audit_message);
++ if (AuditLog != -1)
++ {
++ audit_message = NULL;
++ cupsdSetStringf(&audit_message, "job=%d auid=%u acct=%s obj=%s refused,"
++ "unable to access printer=%s", job->id, con->auid,
++ con->username, con->scon, printer->name);
++ audit_log_user_message(AuditLog, AUDIT_USER_LABELED_EXPORT, audit_message,
++ ServerName, NULL, NULL, 0);
++ free(audit_message);
++ }
+
+ send_ipp_status(con, IPP_NOT_AUTHORIZED, _("SELinux prohibits access to the printer"));
+ return (NULL);
@@ -1381,27 +1414,120 @@
job->dtype = dtype;
job->attrs = con->request;
con->request = NULL;
-@@ -1553,6 +1664,19 @@
-
- if (ClassifyOverride)
- {
+@@ -1537,6 +1644,29 @@
+ attr->values[0].string.text = _cupsStrAlloc(printer->job_sheets[0]);
+ attr->values[1].string.text = _cupsStrAlloc(printer->job_sheets[1]);
+ }
+#ifdef WITH_LSPP
++ else
++ {
++ /*
++ * The option was present, so capture the user supplied strings
++ */
++ userheader = strdup(attr->values[0].string.text);
++
++ if (attr->num_values > 1)
++ userfooter = strdup(attr->values[1].string.text);
++
++ if ((strcmp(userheader, Classification) == 0)
++ && (strcmp(userfooter, Classification) == 0))
++ {
+ /*
-+ * The configuration allows for user's to Override the banner, so let them
++ * Since both values are Classification, the user is not trying to Override
+ */
++ free(userheader);
++ free(userfooter);
++ userheader = userfooter = NULL;
++ }
++ }
++#endif /* WITH_LSPP */
+
+ job->job_sheets = attr;
+
+@@ -1567,6 +1697,9 @@
+ "job-sheets=\"%s,none\", "
+ "job-originating-user-name=\"%s\"",
+ job->id, Classification, job->username);
++#ifdef WITH_LSPP
++ override = 1;
++#endif /* WITH_LSPP */
+ }
+ else if (attr->num_values == 2 &&
+ strcmp(attr->values[0].string.text,
+@@ -1585,6 +1718,9 @@
+ "job-originating-user-name=\"%s\"",
+ job->id, attr->values[0].string.text,
+ attr->values[1].string.text, job->username);
++#ifdef WITH_LSPP
++ override = 1;
++#endif /* WITH_LSPP */
+ }
+ else if (strcmp(attr->values[0].string.text, Classification) &&
+ strcmp(attr->values[0].string.text, "none") &&
+@@ -1605,6 +1741,9 @@
+ "job-originating-user-name=\"%s\"",
+ job->id, attr->values[0].string.text,
+ attr->values[1].string.text, job->username);
++#ifdef WITH_LSPP
++ override = 1;
++#endif /* WITH_LSPP */
+ }
+ }
+ else if (strcmp(attr->values[0].string.text, Classification) &&
+@@ -1645,9 +1784,52 @@
+ "job-sheets=\"%s\", "
+ "job-originating-user-name=\"%s\"",
+ job->id, Classification, job->username);
++#ifdef WITH_LSPP
++ override = 1;
++#endif /* WITH_LSPP */
++ }
++#ifdef WITH_LSPP
++ if (is_lspp_config() && AuditLog != -1)
++ {
+ audit_message = NULL;
-+ cupsdSetStringf(&audit_message, "job=%d user supplied classification \"%s\" \"%s\"",
-+ job->id,
-+ (attr->values[0].string.text)?attr->values[0].string.text:"none",
-+ (attr->values[1].string.text)?attr->values[1].string.text:"none");
-+ audit_log_user_message(AuditLog, AUDIT_LABEL_OVERRIDE, audit_message,
-+ ServerName, NULL, NULL, 1);
-+ free(audit_message);
-+#endif /* WITH_LSPP */
- if (!strcmp(attr->values[0].string.text, "none") &&
- (attr->num_values == 1 ||
- !strcmp(attr->values[1].string.text, "none")))
-@@ -3501,6 +3625,11 @@
++
++ if (userheader || userfooter)
++ {
++ if (!override)
++ {
++ /*
++ * The user overrode the banner, so audit it
++ */
++ cupsdSetStringf(&audit_message, "job=%d user supplied classification \"%s\" \"%s\""
++ " using \"%s\" \"%s\"", job->id, userheader,
++ userfooter, attr->values[0].string.text,
++ (attr->num_values > 1) ? attr->values[1].string.text : "(null)");
++ audit_log_user_message(AuditLog, AUDIT_LABEL_OVERRIDE, audit_message,
++ ServerName, NULL, NULL, 1);
++ }
++ else
++ {
++ /*
++ * The user tried to override the banner, audit the failure
++ */
++ cupsdSetStringf(&audit_message, "job=%d user supplied classification \"%s\" \"%s\""
++ ", ignored using \"%s\" \"%s\"", job->id, userheader,
++ userfooter, attr->values[0].string.text,
++ (attr->num_values > 1) ? attr->values[1].string.text : "(null)");
++ audit_log_user_message(AuditLog, AUDIT_LABEL_OVERRIDE, audit_message,
++ ServerName, NULL, NULL, 0);
++ }
++ free(audit_message);
+ }
+ }
+
++ if (userheader)
++ free(userheader);
++ if (userfooter)
++ free(userfooter);
++#endif /* WITH_LSPP */
++ }
++
+ /*
+ * See if we need to add the starting sheet...
+ */
+@@ -3501,6 +3683,11 @@
char attrname[255], /* Name of attribute */
*s; /* Pointer into name */
ipp_attribute_t *attr; /* Attribute */
@@ -1413,7 +1539,7 @@
cupsdLogMessage(CUPSD_LOG_DEBUG2, "copy_banner(%p[%d], %p[%d], %s)",
-@@ -3628,6 +3757,24 @@
+@@ -3628,6 +3815,24 @@
else
s = attrname;
@@ -1438,7 +1564,7 @@
if (!strcmp(s, "printer-name"))
{
cupsFilePuts(out, job->dest);
-@@ -5353,6 +5500,15 @@
+@@ -5353,6 +5558,15 @@
cupsd_printer_t *printer; /* Printer */
cups_array_t *list; /* Which job list... */
cups_array_t *ra; /* Requested attributes array */
@@ -1454,7 +1580,7 @@
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs(%p[%d], %s)", con, con->http.fd,
-@@ -5470,6 +5626,40 @@
+@@ -5470,6 +5684,40 @@
ra = create_requested_array(con->request);
@@ -1495,7 +1621,7 @@
/*
* OK, build a list of jobs for this printer...
*/
-@@ -5507,6 +5697,19 @@
+@@ -5507,6 +5755,19 @@
if (count > 0)
ippAddSeparator(con->response);
@@ -1515,7 +1641,7 @@
count ++;
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: count = %d", count);
-@@ -7935,12 +8138,22 @@
+@@ -7935,12 +8196,22 @@
* See if we need to add the ending sheet...
*/
@@ -1538,9 +1664,8 @@
/*
* Yes...
*/
-diff -burN cups-1.2.2-vanilla/scheduler/job.c cups-1.2.2/scheduler/job.c
---- cups-1.2.2-vanilla/scheduler/job.c 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/scheduler/job.c 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/scheduler/job.c 2006-08-10 11:43:02.000000000 -0400
++++ cups-1.2.2/scheduler/job.c 2006-08-17 10:38:41.000000000 -0400
@@ -68,6 +68,9 @@
* unload_job() - Unload a job from memory.
*/
@@ -1587,7 +1712,7 @@
job->sheets = ippFindAttribute(job->attrs, "job-media-sheets-completed",
IPP_TAG_INTEGER);
job->job_sheets = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME);
-@@ -2428,6 +2453,17 @@
+@@ -2428,6 +2453,18 @@
int remote_job; /* Remote print job? */
static char *options = NULL;/* Full list of options */
static int optlength = 0; /* Length of option buffer */
@@ -1595,6 +1720,7 @@
+ int acstatus = 0; /* return value of the access check */
+ pid_t acpid = -1; /* pid for the access check */
+ const char *mls_label = NULL; /* SL to put in classification env var */
++ char *label_template = NULL; /* SL to put in classification env var */
+ char *audit_message = NULL; /* Audit message string */
+ char *printerfile = NULL; /* Device file pointed to by the printer */
+ char *acargv[3]; /* Command line args */
@@ -1605,7 +1731,7 @@
cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job: id = %d, file = %d/%d",
-@@ -2709,6 +2745,76 @@
+@@ -2709,6 +2746,69 @@
cupsdLogMessage(CUPSD_LOG_DEBUG, "banner_page = %d", banner_page);
@@ -1615,20 +1741,13 @@
+ /*
+ * Perform an access check before printing, but only if the printer starts with /dev/
+ */
-+ printerfile = strdup(printer->device_uri);
-+ if ((printerfile = strrchr(printer->device_uri, '=')) == NULL)
-+ {
-+ if ((printerfile = strrchr(printer->device_uri, ':')) == NULL)
-+ {
-+ cupsdLogMessage(CUPSD_LOG_ERROR, "StartJob: Unable to determine printer device file");
-+ cupsdCancelJob(job, 0);
-+ return;
-+ }
-+ }
++ printerfile = strstr(printer->device_uri, "/dev/");
+
-+ printerfile++;
-+ if (strncmp(printerfile, "/dev/", 5) == 0)
++ if (printerfile != NULL)
+ {
++ cupsdLogMessage(CUPSD_LOG_DEBUG, "StartJob: Attempting to check access on printer device %s",
++ printerfile);
++
+ if (setexeccon(job->scon) != 0)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "StartJob: Unable to setexeccon to %s", job->scon);
@@ -1636,11 +1755,8 @@
+ return;
+ }
+
-+ cupsdLogMessage(CUPSD_LOG_DEBUG, "StartJob: Attempting to check access on printer device %s",
-+ printerfile);
-+
+ snprintf(buffer, sizeof(buffer), "%s/daemon/lspp-access", ServerBin);
-+ acargv[0] = "access";
++ acargv[0] = "lspp-access";
+ acargv[1] = printerfile;
+ acargv[2] = NULL;
+
@@ -1656,13 +1772,16 @@
+ /*
+ * The access check failed, so cancel the job and send an audit message
+ */
-+ audit_message = NULL;
-+ cupsdSetStringf(&audit_message, "job=%d auid=%u acct=%s obj=%s cancelled,"
-+ " unable to access printer=%s",
-+ job->id, job->auid, job->username, job->scon, printer->name);
-+ audit_log_user_message(AuditLog, AUDIT_USER_LABELED_EXPORT, audit_message,
-+ ServerName, NULL, NULL, 0);
-+ free(audit_message);
++ if (AuditLog != -1)
++ {
++ audit_message = NULL;
++ cupsdSetStringf(&audit_message, "job=%d auid=%u acct=%s obj=%s cancelled,"
++ " unable to access printer=%s",
++ job->id, job->auid, job->username, job->scon, printer->name);
++ audit_log_user_message(AuditLog, AUDIT_USER_LABELED_EXPORT, audit_message,
++ ServerName, NULL, NULL, 0);
++ free(audit_message);
++ }
+
+ cupsdCancelJob(job, 0);
+
@@ -1682,51 +1801,70 @@
/*
* Building the options string is harder than it needs to be, but
* for the moment we need to pass strings for command-line args and
-@@ -3026,6 +3132,41 @@
- envp[envc ++] = final_content_type;
- }
+@@ -3041,6 +3141,61 @@
+ snprintf(classification, sizeof(classification), "CLASSIFICATION=%s",
+ attr->values[0].string.text);
+#ifdef WITH_LSPP
-+ if (is_lspp_config())
-+ {
-+ if (job->scon == NULL)
-+ {
-+ audit_message = NULL;
-+ cupsdSetStringf(&audit_message, "job=%d auid=%u acct=%s printer=%s",
-+ job->id, job->auid, job->username, printer->name);
-+ audit_log_user_message(AuditLog, AUDIT_USER_UNLABELED_EXPORT, audit_message,
-+ ServerName, NULL, NULL, 1);
-+ free(audit_message);
-+ }
-+ else
++ if (is_lspp_config())
+ {
-+ job_context = context_new(job->scon);
-+ if (strcasecmp(Classification, MLS_CONFIG) == 0)
-+ mls_label = context_range_get(job_context);
-+ else if (strcasecmp(Classification, TE_CONFIG) == 0)
-+ mls_label = context_type_get(job_context);
-+ else // default is SELinux which means print the whole context
-+ mls_label = context_str(job_context);
-+ snprintf(classification, sizeof(classification), "CLASSIFICATION=%s",
-+ mls_label);
-+ envp[envc ++] = classification;
-+ audit_message = NULL;
-+ cupsdSetStringf(&audit_message, "job=%d auid=%u acct=%s printer=%s obj=%s",
-+ job->id, job->auid, job->username, printer->name, job->scon);
-+ audit_log_user_message(AuditLog, AUDIT_USER_LABELED_EXPORT, audit_message,
-+ ServerName, NULL, NULL, 1);
-+ context_free(job_context);
-+ free(audit_message);
++ if (job->scon == NULL)
++ {
++ if (AuditLog != -1)
++ {
++ audit_message = NULL;
++ cupsdSetStringf(&audit_message, "job=%d auid=%u acct=%s printer=%s title=%s",
++ job->id, job->auid, job->username, printer->name, title);
++ audit_log_user_message(AuditLog, AUDIT_USER_UNLABELED_EXPORT, audit_message,
++ ServerName, NULL, NULL, 1);
++ free(audit_message);
++ }
++ }
++ else
++ {
++ job_context = context_new(job->scon);
++
++ if ((attr = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME)) == NULL)
++ label_template = strdup(Classification);
++ else if (attr->num_values > 1 &&
++ strcmp(attr->values[1].string.text, "none") != 0)
++ label_template = strdup(attr->values[1].string.text);
++ else
++ label_template = strdup(attr->values[0].string.text);
++
++ if (strcasecmp(label_template, MLS_CONFIG) == 0)
++ mls_label = context_range_get(job_context);
++ else if (strcasecmp(label_template, TE_CONFIG) == 0)
++ mls_label = context_type_get(job_context);
++ else if (strcasecmp(label_template, SELINUX_CONFIG) == 0)
++ mls_label = context_str(job_context);
++
++ if (!mls_label)
++ mls_label = label_template;
++
++ snprintf(classification, sizeof(classification), "CLASSIFICATION=%s", mls_label);
++
++ if (AuditLog != -1)
++ {
++ audit_message = NULL;
++ cupsdSetStringf(&audit_message, "job=%d auid=%u acct=%s printer=%s title=%s"
++ " obj=%s label=%s", job->id, job->auid, job->username,
++ printer->name, title, job->scon, mls_label);
++ audit_log_user_message(AuditLog, AUDIT_USER_LABELED_EXPORT, audit_message,
++ ServerName, NULL, NULL, 1);
++ free(audit_message);
++ }
++ context_free(job_context);
++ free(label_template);
++ }
+ }
-+ }
-+ else
+#endif /* WITH_LSPP */
- if (Classification && !banner_page)
- {
- if ((attr = ippFindAttribute(job->attrs, "job-sheets",
-diff -burN cups-1.2.2-vanilla/scheduler/job.h cups-1.2.2/scheduler/job.h
---- cups-1.2.2-vanilla/scheduler/job.h 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/scheduler/job.h 2006-08-01 07:08:37.000000000 -0400
++
+ envp[envc ++] = classification;
+ }
+
+--- cups-1.2.2-8/scheduler/job.h 2006-08-10 11:43:02.000000000 -0400
++++ cups-1.2.2/scheduler/job.h 2006-08-07 06:19:33.000000000 -0400
@@ -22,6 +22,13 @@
* WWW: http://www.cups.org
*/
@@ -1752,9 +1890,67 @@
} cupsd_job_t;
-diff -burN cups-1.2.2-vanilla/scheduler/main.c cups-1.2.2/scheduler/main.c
---- cups-1.2.2-vanilla/scheduler/main.c 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/scheduler/main.c 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/scheduler/lspp-access.c 1969-12-31 19:00:00.000000000 -0500
++++ cups-1.2.2/scheduler/lspp-access.c 2006-08-07 06:19:33.000000000 -0400
+@@ -0,0 +1,56 @@
++/*
++ * Copyright (C) Hewlett-Packard Development Company, L.P., 2006
++ *
++ * 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
++ *
++ * Contents:
++ *
++ * main() - Main entry for the access checker.
++ */
++
++#include <stdio.h>
++#include <unistd.h>
++#include <string.h>
++
++int main(int argc, char *argv[]) {
++ int status = -1;
++ char filename[FILENAME_MAX+1] = {0};
++
++ if (argc < 2)
++ {
++ printf("Check for access to which file? ");
++ scanf("%s", (char *)&filename);
++ }
++ else
++ {
++ strncpy(filename, argv[1], FILENAME_MAX);
++ }
++
++ status = access(filename, R_OK|W_OK);
++
++ if (argc < 2)
++ {
++ /*
++ * Assume the user would like to hear the answer on the terminal
++ * since the filename was received interactively.
++ */
++ if (status != 0)
++ printf("Unable to access that file.\n");
++ else
++ printf("Access Granted\n");
++ }
++
++ return status;
++}
+--- cups-1.2.2-8/scheduler/main.c 2006-08-10 11:43:02.000000000 -0400
++++ cups-1.2.2/scheduler/main.c 2006-08-15 09:15:28.000000000 -0400
@@ -47,6 +47,8 @@
* usage() - Show scheduler usage.
*/
@@ -1774,17 +1970,35 @@
/*
* Local functions...
-@@ -351,6 +359,17 @@
+@@ -141,6 +146,9 @@
+ int launchd_idle_exit;
+ /* Idle exit on select timeout? */
+ #endif /* HAVE_LAUNCHD */
++#if WITH_LSPP
++ auditfail_t failmode; /* Action for audit_open failure */
++#endif /* WITH_LSPP */
+
+
+ /*
+@@ -351,6 +359,25 @@
#endif /* DEBUG */
}
+#ifdef WITH_LSPP
+ if ((AuditLog = audit_open()) < 0 )
+ {
-+ if (is_lspp_config())
++ if (get_auditfail_action(&failmode) == 0)
+ {
-+ fprintf(stderr, "cupsd: unable to start auditing");
-+ return -1;
++ if (failmode == FAIL_LOG)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to connect to audit subsystem.");
++ AuditLog = -1;
++ }
++ else if (failmode == FAIL_TERMINATE)
++ {
++ fprintf(stderr, "cupsd: unable to start auditing, terminating");
++ return -1;
++ }
+ }
+ }
+#endif /* WITH_LSPP */
@@ -1792,20 +2006,20 @@
/*
* Set the timezone info...
*/
-@@ -1115,6 +1142,10 @@
+@@ -1115,6 +1142,11 @@
free(input);
free(output);
+#ifdef WITH_LSPP
-+ audit_close(AuditLog);
++ if (AuditLog != -1)
++ audit_close(AuditLog);
+#endif /* WITH_LSPP */
+
return (!stop_scheduler);
}
-diff -burN cups-1.2.2-vanilla/scheduler/Makefile cups-1.2.2/scheduler/Makefile
---- cups-1.2.2-vanilla/scheduler/Makefile 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/scheduler/Makefile 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/scheduler/Makefile 2006-08-10 11:43:02.000000000 -0400
++++ cups-1.2.2/scheduler/Makefile 2006-08-07 06:19:33.000000000 -0400
@@ -54,6 +54,7 @@
OBJS = \
$(CUPSDOBJS) \
@@ -1844,9 +2058,8 @@
-$(RMDIR) $(STATEDIR)/certs
-$(RMDIR) $(STATEDIR)
-$(RMDIR) $(SERVERROOT)/ppd
-diff -burN cups-1.2.2-vanilla/scheduler/printers.c cups-1.2.2/scheduler/printers.c
---- cups-1.2.2-vanilla/scheduler/printers.c 2006-08-01 07:07:28.000000000 -0400
-+++ cups-1.2.2/scheduler/printers.c 2006-08-01 07:08:37.000000000 -0400
+--- cups-1.2.2-8/scheduler/printers.c 2006-08-10 11:43:02.000000000 -0400
++++ cups-1.2.2/scheduler/printers.c 2006-08-14 06:09:33.000000000 -0400
@@ -57,6 +57,8 @@
* printing desktop tools.
*/
@@ -1856,138 +2069,67 @@
/*
* Include necessary headers...
*/
-@@ -79,6 +81,9 @@
+@@ -79,6 +81,10 @@
static void write_irix_state(cupsd_printer_t *p);
#endif /* __sgi */
+#ifdef WITH_LSPP
+# include <libaudit.h>
++# include <selinux/context.h>
+#endif /* WITH_LSPP */
/*
* 'cupsdAddPrinter()' - Add a printer to the system.
-@@ -1472,6 +1477,9 @@
+@@ -1472,6 +1478,13 @@
"two-sided-long-edge",
"two-sided-short-edge"
};
+#ifdef WITH_LSPP
+ char *audit_message; /* Audit message string */
++ char *printerfile; /* Path to a local printer dev */
++ char *rangestr; /* Printer's range if its available */
++ security_context_t devcon; /* Printer SELinux context */
++ context_t printercon; /* context_t for the printer */
+#endif /* WITH_LSPP */
DEBUG_printf(("cupsdSetPrinterAttrs: entering name = %s, type = %x\n", p->name,
-@@ -1578,6 +1586,14 @@
+@@ -1578,6 +1591,38 @@
attr->values[1].string.text = _cupsStrAlloc(Classification ?
Classification : p->job_sheets[1]);
}
+#ifdef WITH_LSPP
-+ audit_message = NULL;
-+ cupsdSetStringf(&audit_message, "[Config] printer=%s uri=%s banners set to %s %s",
-+ p->name, p->device_uri, p->job_sheets[0], p->job_sheets[1]);
-+ audit_log_user_message(AuditLog, AUDIT_LABEL_LEVEL_CHANGE, audit_message,
-+ ServerName, NULL, NULL, 1);
-+ free(audit_message);
-+#endif /* WITH_LSPP */
- }
-
- printer_type = p->type;
---- /dev/null 2006-07-21 09:48:40.571484750 +0100
-+++ cups-1.2.2/config-scripts/cups-lspp.m4 2006-07-21 12:42:40.000000000 +0100
-@@ -0,0 +1,36 @@
-+dnl
-+dnl LSPP code for the Common UNIX Printing System (CUPS).
-+dnl
-+dnl Copyright 2005-2006 by Hewlett-Packard Development Company, L.P.
-+dnl
-+dnl This program is free software; you can redistribute it and/or modify
-+dnl it under the terms of the GNU General Public License as published by
-+dnl the Free Software Foundation; version 2.
-+dnl
-+dnl This program is distributed in the hope that it will be useful, but
-+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
-+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+dnl General Public License for more details.
-+dnl
-+dnl You should have received a copy of the GNU General Public License
-+dnl along with this program; if not, write to the Free Software Foundation,
-+dnl Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301 USA
-+dnl
-+
-+dnl Are we trying to meet LSPP requirements
-+AC_ARG_ENABLE(lspp, [ --enable-lspp turn on auditing and label support, default=no])
-+
-+if test x"$enable_lspp" != xno; then
-+ case "$uname" in
-+ Linux)
-+ AC_CHECK_LIB(audit,audit_log_user_message, [LIBAUDIT="-laudit" AC_SUBST(LIBAUDIT)])
-+ AC_CHECK_HEADER(libaudit.h)
-+ AC_CHECK_LIB(selinux,getpeercon, [LIBSELINUX="-lselinux" AC_SUBST(LIBSELINUX)])
-+ AC_CHECK_HEADER(selinux/selinux.h)
-+ AC_DEFINE(WITH_LSPP)
-+ ;;
-+ *)
-+ # All others
-+ ;;
-+ esac
-+fi
---- /dev/null 2006-07-21 09:48:40.571484750 +0100
-+++ cups-1.2.2/scheduler/lspp-access.c 2006-07-21 12:42:40.000000000 +0100
-@@ -0,0 +1,56 @@
-+/*
-+ * Copyright (C) Hewlett-Packard Development Company, L.P., 2006
-+ *
-+ * 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
-+ *
-+ * Contents:
-+ *
-+ * main() - Main entry for the access checker.
-+ */
-+
-+#include <stdio.h>
-+#include <unistd.h>
-+#include <string.h>
++ if (AuditLog != -1)
++ {
++ audit_message = NULL;
++ rangestr = NULL;
++ printercon = 0;
++ printerfile = strstr(p->device_uri, "/dev/");
+
-+int main(int argc, char *argv[]) {
-+ int status = -1;
-+ char filename[FILENAME_MAX+1] = {0};
++ if (printerfile != NULL)
++ {
++ if (getfilecon(printerfile, &devcon) == -1)
++ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdSetPrinterAttrs: Unable to get printer context");
++ else
++ printercon = context_new(devcon);
+
-+ if (argc < 2)
-+ {
-+ printf("Check for access to which file? ");
-+ scanf("%s", (char *)&filename);
-+ }
-+ else
-+ {
-+ strncpy(filename, argv[1], FILENAME_MAX);
-+ }
++ if (context_range_get(printercon))
++ rangestr = strdup(context_range_get(printercon));
++ }
+
-+ status = access(filename, R_OK|W_OK);
++ if (rangestr == NULL)
++ rangestr = strdup("unknown");
+
-+ if (argc < 2)
-+ {
-+ /*
-+ * Assume the user would like to hear the answer on the terminal
-+ * since the filename was received interactively.
-+ */
-+ if (status != 0)
-+ printf("Unable to access that file.\n");
-+ else
-+ printf("Access Granted\n");
-+ }
-+
-+ return status;
-+}
-
-
++ cupsdSetStringf(&audit_message, "[Config] printer=%s uri=%s banners set to %s %s has range %s",
++ p->name, p->device_uri, p->job_sheets[0], p->job_sheets[1], rangestr);
++ audit_log_user_message(AuditLog, AUDIT_LABEL_LEVEL_CHANGE, audit_message,
++ ServerName, NULL, NULL, 1);
++ if (printercon)
++ context_free(printercon);
++ free(rangestr);
++ free(audit_message);
++ }
++#endif /* WITH_LSPP */
+ }
+
+ printer_type = p->type;
Index: cups.spec
===================================================================
RCS file: /cvs/dist/rpms/cups/devel/cups.spec,v
retrieving revision 1.250
retrieving revision 1.251
diff -u -r1.250 -r1.251
--- cups.spec 18 Aug 2006 20:11:38 -0000 1.250
+++ cups.spec 21 Aug 2006 16:26:28 -0000 1.251
@@ -6,7 +6,7 @@
Summary: Common Unix Printing System
Name: cups
Version: 1.2.2
-Release: 13
+Release: 14
License: GPL
Group: System Environment/Daemons
Source: ftp://ftp.easysw.com/pub/cups/%{version}/cups-%{version}-source.tar.bz2
@@ -420,6 +420,9 @@
%{cups_serverbin}/daemon/cups-lpd
%changelog
+* Mon Aug 21 2006 Tim Waugh <twaugh at redhat.com> 1:1.2.2-14
+- Updated LSPP patch (bug #203376).
+
* Fri Aug 18 2006 Jesse Keating <jkeating at redhat.com> - 1:1.2.2-13
- rebuilt with latest binutils to pick up 64K -z commonpagesize on ppc*
(#203001)
- Previous message (by thread): rpms/util-linux/devel util-linux-login.pamd, NONE, 1.1 util-linux-remote.pamd, NONE, 1.1 util-linux-2.13-mount-context.patch, 1.1, 1.2 util-linux.spec, 1.138, 1.139 util-linux-selinux.pamd, 1.7, NONE
- Next message (by thread): rpms/control-center/devel control-center-2.15.91-fix-thumbnailing.patch, NONE, 1.1 control-center.spec, 1.170, 1.171 control-center-2.15.90-fix-thumbnailing.patch, 1.1, NONE
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the fedora-cvs-commits
mailing list