Blob Blame History Raw
diff --git a/cups/cups-private.h b/cups/cups-private.h
index 4ec4e68..f436e3e 100644
--- a/cups/cups-private.h
+++ b/cups/cups-private.h
@@ -64,6 +64,7 @@ typedef struct _cups_globals_s		/**** CUPS global state data ****/
 			*cups_serverroot,
 					/* CUPS_SERVERROOT environment var */
 			*cups_statedir,	/* CUPS_STATEDIR environment var */
+			*home,		/* HOME environment var */
 			*localedir;	/* LOCALDIR environment var */
 
   /* adminutil.c */
diff --git a/cups/dest.c b/cups/dest.c
index fd635b1..bc07eb1 100644
--- a/cups/dest.c
+++ b/cups/dest.c
@@ -1752,7 +1752,6 @@ cupsGetNamedDest(http_t     *http,	/* I - Connection to server or @code CUPS_HTT
   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 */
@@ -1784,13 +1783,13 @@ cupsGetNamedDest(http_t     *http,	/* I - Connection to server or @code CUPS_HTT
       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);
 
@@ -1896,9 +1895,9 @@ cupsGetNamedDest(http_t     *http,	/* I - Connection to server or @code CUPS_HTT
   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);
   }
@@ -2036,9 +2035,6 @@ cupsSetDests2(http_t      *http,	/* I - Connection to server or @code CUPS_HTTP_
   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 */
@@ -2072,27 +2068,18 @@ cupsSetDests2(http_t      *http,	/* I - Connection to server or @code CUPS_HTTP_
 
   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", cg->home);
+    if (access(filename, 0))
+      mkdir(filename, 0700);
 
-      snprintf(filename, sizeof(filename), "%s/.cups", 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...
@@ -2273,7 +2260,7 @@ _cupsUserDefault(char   *name,		/* I - Name buffer */
   * system preferences...
   */
 
-  if ((locprinter = _cupsAppleCopyDefaultPrinter()) != NULL)
+  if (!getenv("CUPS_NO_APPLE_DEFAULT") && (locprinter = _cupsAppleCopyDefaultPrinter()) != NULL)
   {
     CFStringGetCString(locprinter, name, (CFIndex)namesize, kCFStringEncodingUTF8);
     CFRelease(locprinter);
@@ -3396,10 +3383,9 @@ cups_enum_dests(
   int           i, j,			/* Looping vars */
                 num_dests;              /* Number of destinations */
   cups_dest_t   *dests = NULL,          /* Destinations */
-                *dest,                  /* Current destination */
-                *user_dest;		/* User destination */
+                *dest;			/* Current destination */
   cups_option_t	*option;		/* Current option */
-  char          *user_default;          /* User default printer */
+  const char	*user_default;		/* Default printer from environment */
 #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
   int           count,                  /* Number of queries started */
                 completed,              /* Number of completed queries */
@@ -3430,7 +3416,6 @@ cups_enum_dests(
 #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 */
 
@@ -3455,13 +3440,35 @@ cups_enum_dests(
 
   memset(&data, 0, sizeof(data));
 
-  if ((user_default = _cupsUserDefault(data.def_name, sizeof(data.def_name))) == NULL)
+  user_default = _cupsUserDefault(data.def_name, sizeof(data.def_name));
+
+  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 (cg->home)
   {
-    const char *defprinter = cupsGetDefault2(http);
-					/* Server default, if any */
+    snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home);
 
-    if (defprinter)
-      strlcpy(data.def_name, defprinter, sizeof(data.def_name));
+    data.num_dests = cups_get_dests(filename, NULL, NULL, 1, user_default != NULL, data.num_dests, &data.dests);
+  }
+
+  if (!user_default && (dest = cupsGetDest(NULL, NULL, data.num_dests, data.dests)) != NULL)
+  {
+   /*
+    * Use an lpoptions default printer...
+    */
+
+    if (dest->instance)
+      snprintf(data.def_name, sizeof(data.def_name), "%s/%s", dest->name, dest->instance);
+    else
+      strlcpy(data.def_name, dest->name, sizeof(data.def_name));
+  }
+  else
+  {
+    const char	*default_printer;	/* Server default printer */
+
+    if ((default_printer = cupsGetDefault2(http)) != NULL)
+      strlcpy(data.def_name, default_printer, sizeof(data.def_name));
   }
 
   if (data.def_name[0])
@@ -3476,16 +3483,6 @@ cups_enum_dests(
 
   DEBUG_printf(("1cups_enum_dests: def_name=\"%s\", def_instance=\"%s\"", data.def_name, data.def_instance));
 
-  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)
-  {
-    snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", home);
-
-    data.num_dests = cups_get_dests(filename, NULL, NULL, 1, user_default != NULL, data.num_dests, &data.dests);
-  }
-
  /*
   * Get ready to enumerate...
   */
@@ -3523,8 +3520,9 @@ cups_enum_dests(
          i > 0 && (!cancel || !*cancel);
          i --, dest ++)
     {
+      cups_dest_t	*user_dest;	/* Destination from lpoptions */
 #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-      const char *device_uri;    /* Device URI */
+      const char	*device_uri;	/* Device URI */
 #endif /* HAVE_DNSSD || HAVE_AVAHI */
 
       if ((user_dest = cupsGetDest(dest->name, dest->instance, data.num_dests, data.dests)) != NULL)
@@ -3793,6 +3791,8 @@ cups_enum_dests(
 
         if ((device->type & mask) == type)
         {
+          cups_dest_t	*user_dest;	/* Destination from lpoptions */
+
           dest = &device->dest;
 
 	  if ((user_dest = cupsGetDest(dest->name, dest->instance, data.num_dests, data.dests)) != NULL)
diff --git a/cups/globals.c b/cups/globals.c
index 28c993b..3882b78 100644
--- a/cups/globals.c
+++ b/cups/globals.c
@@ -18,6 +18,9 @@
  */
 
 #include "cups-private.h"
+#ifndef _WIN32
+#  include <pwd.h>
+#endif /* !_WIN32 */
 
 
 /*
@@ -276,6 +279,8 @@ cups_globals_alloc(void)
   if ((cg->localedir = getenv("LOCALEDIR")) == NULL)
     cg->localedir = localedir;
 
+  cg->home = getenv("HOME");
+
 #else
 #  ifdef HAVE_GETEUID
   if ((geteuid() != getuid() && getuid()) || getegid() != getgid())
@@ -314,6 +319,18 @@ cups_globals_alloc(void)
 
     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 */
 
diff --git a/cups/tls-darwin.c b/cups/tls-darwin.c
index c4f0ccb..f2259fe 100644
--- a/cups/tls-darwin.c
+++ b/cups/tls-darwin.c
@@ -1935,7 +1935,8 @@ static const char *			/* O - Keychain path */
 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 */
 
 
  /*
@@ -1944,8 +1945,8 @@ http_cdsa_default_path(char   *buffer,	/* I - Path buffer */
   * 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);
 
diff --git a/cups/tls-gnutls.c b/cups/tls-gnutls.c
index 1dc1b2a..c195c63 100644
--- a/cups/tls-gnutls.c
+++ b/cups/tls-gnutls.c
@@ -931,12 +931,13 @@ static const char *			/* O - Path or NULL on error */
 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));
@@ -947,7 +948,7 @@ http_gnutls_default_path(char   *buffer,/* I - Path 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));
diff --git a/cups/usersys.c b/cups/usersys.c
index 781f27b..2a57aa9 100644
--- a/cups/usersys.c
+++ b/cups/usersys.c
@@ -877,7 +877,6 @@ void
 _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 */
@@ -903,19 +902,13 @@ _cupsSetDefaults(void)
     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);