- Add "home" global pointing to the user's home directory.
- Use it instead of getenv("HOME") everywhere we needed it.
permissions are wrong (Issue #5658)
- Added paint can labels to Dymo driver (Issue #5662)
- The `--with-dbusdir` option was ignored by the configure script (Issue #5671)
+- Sandboxed applications were not able to get the default printer (Issue #5676)
- Log file access controls were not preserved by `cupsctl` (Issue #5677)
- Default printers set with `lpoptions` did not work in all cases (Issue #5681)
- The IPP backend did not detect all cases where a job should be retried using
*cups_serverroot,
/* CUPS_SERVERROOT environment var */
*cups_statedir, /* CUPS_STATEDIR environment var */
+ *home, /* HOME environment var */
*localedir; /* LOCALDIR environment var */
/* adminutil.c */
cups_dest_t *dest; /* Destination */
char filename[1024], /* Path to lpoptions */
defname[256]; /* Default printer name */
- const char *home = getenv("HOME"); /* Home directory */
int set_as_default = 0; /* Set returned destination as default */
ipp_op_t op = IPP_OP_GET_PRINTER_ATTRIBUTES;
/* IPP operation to get server ops */
else
instance = NULL;
}
- else if (home)
+ else if (cg->home)
{
/*
* No default in the environment, try the user's lpoptions files...
*/
- snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", home);
+ snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home);
dest_name = cups_get_default(filename, defname, sizeof(defname), &instance);
snprintf(filename, sizeof(filename), "%s/lpoptions", cg->cups_serverroot);
cups_get_dests(filename, dest_name, instance, 0, 1, 1, &dest);
- if (home)
+ if (cg->home)
{
- snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", home);
+ snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home);
cups_get_dests(filename, dest_name, instance, 0, 1, 1, &dest);
}
cups_option_t *option; /* Current option */
_ipp_option_t *match; /* Matching attribute for option */
FILE *fp; /* File pointer */
-#ifndef _WIN32
- const char *home; /* HOME environment variable */
-#endif /* _WIN32 */
char filename[1024]; /* lpoptions file */
int num_temps; /* Number of temporary destinations */
cups_dest_t *temps = NULL, /* Temporary destinations */
snprintf(filename, sizeof(filename), "%s/lpoptions", cg->cups_serverroot);
-#ifndef _WIN32
- if (getuid())
+ if (cg->home)
{
/*
- * Point to user defaults...
+ * Create ~/.cups subdirectory...
*/
- if ((home = getenv("HOME")) != NULL)
- {
- /*
- * Create ~/.cups subdirectory...
- */
-
- snprintf(filename, sizeof(filename), "%s/.cups", home);
- if (access(filename, 0))
- mkdir(filename, 0700);
+ snprintf(filename, sizeof(filename), "%s/.cups", cg->home);
+ if (access(filename, 0))
+ mkdir(filename, 0700);
- snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", home);
- }
+ snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home);
}
-#endif /* !_WIN32 */
/*
* Try to open the file...
#else
_cups_getdata_t data; /* Data for callback */
#endif /* HAVE_DNSSD || HAVE_AVAHI */
- const char *home; /* HOME environment variable */
char filename[1024]; /* Local lpoptions file */
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
snprintf(filename, sizeof(filename), "%s/lpoptions", cg->cups_serverroot);
data.num_dests = cups_get_dests(filename, NULL, NULL, 1, user_default != NULL, data.num_dests, &data.dests);
- if ((home = getenv("HOME")) != NULL)
+ if (cg->home)
{
- snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", home);
+ snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home);
data.num_dests = cups_get_dests(filename, NULL, NULL, 1, user_default != NULL, data.num_dests, &data.dests);
}
/*
* Global variable access routines for CUPS.
*
- * Copyright 2007-2015 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright © 2007-2019 by Apple Inc.
+ * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
*
- * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
+ * Licensed under Apache License v2.0. See the file "LICENSE" for more
+ * information.
*/
/*
*/
#include "cups-private.h"
+#ifndef _WIN32
+# include <pwd.h>
+#endif /* !_WIN32 */
/*
if ((cg->localedir = getenv("LOCALEDIR")) == NULL)
cg->localedir = localedir;
+ cg->home = getenv("HOME");
+
#else
# ifdef HAVE_GETEUID
if ((geteuid() != getuid() && getuid()) || getegid() != getgid())
if ((cg->localedir = getenv("LOCALEDIR")) == NULL)
cg->localedir = CUPS_LOCALEDIR;
+
+# ifndef __APPLE__ /* Sandboxing now exposes the container as the home directory */
+ cg->home = getenv("HOME");
+#endif /* !__APPLE__ */
+ }
+
+ if (!cg->home)
+ {
+ struct passwd *pw; /* User info */
+
+ if ((pw = getpwuid(getuid())) != NULL)
+ cg->home = _cupsStrAlloc(pw->pw_dir);
}
#endif /* _WIN32 */
+ fprintf(stderr, "Using \"%s\" as home directory.\n", cg->home);
+
return (cg);
}
http_cdsa_default_path(char *buffer, /* I - Path buffer */
size_t bufsize) /* I - Size of buffer */
{
- const char *home = getenv("HOME"); /* HOME environment variable */
+ _cups_globals_t *cg = _cupsGlobals();
+ /* Pointer to library globals */
/*
* 10.11.4 (!), so we need to create our own keychain just for CUPS.
*/
- if (getuid() && home)
- snprintf(buffer, bufsize, "%s/.cups/ssl.keychain", home);
+ if (cg->home)
+ snprintf(buffer, bufsize, "%s/.cups/ssl.keychain", cg->home);
else
strlcpy(buffer, "/etc/cups/ssl.keychain", bufsize);
http_gnutls_default_path(char *buffer,/* I - Path buffer */
size_t bufsize)/* I - Size of path buffer */
{
- const char *home = getenv("HOME"); /* HOME environment variable */
+ _cups_globals_t *cg = _cupsGlobals();
+ /* Pointer to library globals */
- if (getuid() && home)
+ if (cg->home)
{
- snprintf(buffer, bufsize, "%s/.cups", home);
+ snprintf(buffer, bufsize, "%s/.cups", cg->home);
if (access(buffer, 0))
{
DEBUG_printf(("1http_gnutls_default_path: Making directory \"%s\".", buffer));
}
}
- snprintf(buffer, bufsize, "%s/.cups/ssl", home);
+ snprintf(buffer, bufsize, "%s/.cups/ssl", cg->home);
if (access(buffer, 0))
{
DEBUG_printf(("1http_gnutls_default_path: Making directory \"%s\".", buffer));
_cupsSetDefaults(void)
{
cups_file_t *fp; /* File */
- const char *home; /* Home directory of user */
char filename[1024]; /* Filename */
_cups_client_conf_t cc; /* client.conf values */
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
cupsFileClose(fp);
}
-# ifdef HAVE_GETEUID
- if ((geteuid() == getuid() || !getuid()) && getegid() == getgid() && (home = getenv("HOME")) != NULL)
-# elif !defined(_WIN32)
- if (getuid() && (home = getenv("HOME")) != NULL)
-# else
- if ((home = getenv("HOME")) != NULL)
-# endif /* HAVE_GETEUID */
+ if (cg->home)
{
/*
* Look for ~/.cups/client.conf...
*/
- snprintf(filename, sizeof(filename), "%s/.cups/client.conf", home);
+ snprintf(filename, sizeof(filename), "%s/.cups/client.conf", cg->home);
if ((fp = cupsFileOpen(filename, "r")) != NULL)
{
cups_read_client_conf(fp, &cc);