summaryrefslogtreecommitdiff
path: root/cups/usersys.c
diff options
context:
space:
mode:
authorMichael R Sweet <michael.r.sweet@gmail.com>2019-04-15 17:22:25 -0400
committerMichael R Sweet <michael.r.sweet@gmail.com>2019-04-15 17:22:25 -0400
commit59cd12c6d2cea932f3133e6cb2bf710262be3f57 (patch)
treea6fd8e8d94ea73fca66ff174f038e5cce0901fa8 /cups/usersys.c
parent4c00fa533f99ed1b17fa14d33e2fd42c54c45bea (diff)
downloadcups-59cd12c6d2cea932f3133e6cb2bf710262be3f57.tar.gz
Add UserAgentTokens config directive (Issue #5555)
cups/cups-private.h: - Add enum and value for UserAgentTokens directive. cups/usersys.c: - _cups_finalize_conf(): Copy UserAgentTokens value to globals. - _cups_init_conf(): Set default UserAgentTokens value and grab prefs. - _cups_read_conf(): Look for UserAgentTokens value. - _cups_set_uatokens(): Set UserAgentTokens value. - cupsSetUserAgent(): Support UserAgentTokens values.
Diffstat (limited to 'cups/usersys.c')
-rw-r--r--cups/usersys.c96
1 files changed, 90 insertions, 6 deletions
diff --git a/cups/usersys.c b/cups/usersys.c
index 6b2833766..497681e27 100644
--- a/cups/usersys.c
+++ b/cups/usersys.c
@@ -40,6 +40,7 @@
# define kCUPSPrintingPrefs CFSTR(".GlobalPreferences")
# define kPREFIX "AirPrint"
# endif /* TARGET_OS_OSX */
+# define kUserAgentTokensKey CFSTR(kPREFIX "UserAgentTokens")
# define kAllowAnyRootKey CFSTR(kPREFIX "AllowAnyRoot")
# define kAllowExpiredCertsKey CFSTR(kPREFIX "AllowExpiredCerts")
# define kEncryptionKey CFSTR(kPREFIX "Encryption")
@@ -62,6 +63,7 @@
typedef struct _cups_client_conf_s /**** client.conf config data ****/
{
+ _cups_uatokens_t uatokens; /* UserAgentTokens values */
#ifdef HAVE_SSL
int ssl_options, /* SSLOptions values */
ssl_min_version,/* Minimum SSL/TLS version */
@@ -103,6 +105,7 @@ static void cups_set_server_name(_cups_client_conf_t *cc, const char *value);
#ifdef HAVE_SSL
static void cups_set_ssl_options(_cups_client_conf_t *cc, const char *value);
#endif /* HAVE_SSL */
+static void cups_set_uatokens(_cups_client_conf_t *cc, const char *value);
static void cups_set_user(_cups_client_conf_t *cc, const char *value);
@@ -518,6 +521,29 @@ cupsSetUserAgent(const char *user_agent)/* I - User-Agent string or @code NULL@
return;
}
+ if (cg->uatokens < _CUPS_UATOKENS_OS)
+ {
+ switch (cg->uatokens)
+ {
+ default :
+ case _CUPS_UATOKENS_NONE :
+ cg->user_agent[0] = '\0';
+ break;
+ case _CUPS_UATOKENS_PRODUCT_ONLY :
+ strlcpy(cg->user_agent, "CUPS IPP", sizeof(cg->user_agent));
+ break;
+ case _CUPS_UATOKENS_MAJOR :
+ snprintf(cg->user_agent, sizeof(cg->user_agent), "CUPS/%d IPP/2", CUPS_VERSION_MAJOR);
+ break;
+ case _CUPS_UATOKENS_MINOR :
+ snprintf(cg->user_agent, sizeof(cg->user_agent), "CUPS/%d.%d IPP/2.1", CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR);
+ break;
+ case _CUPS_UATOKENS_MINIMAL :
+ strlcpy(cg->user_agent, CUPS_MINIMAL " IPP/2.1", sizeof(cg->user_agent));
+ break;
+ }
+ }
+
#ifdef _WIN32
/*
* Gather Windows version information for the User-Agent string...
@@ -550,7 +576,10 @@ cupsSetUserAgent(const char *user_agent)/* I - User-Agent string or @code NULL@
break;
}
- snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (Windows %d.%d; %s) IPP/2.0", version.dwMajorVersion, version.dwMinorVersion, machine);
+ if (cg->uatokens == _CUPS_UATOKENS_OS)
+ snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (Windows %d.%d) IPP/2.0", version.dwMajorVersion, version.dwMinorVersion);
+ else
+ snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (Windows %d.%d; %s) IPP/2.0", version.dwMajorVersion, version.dwMinorVersion, machine);
#elif defined(__APPLE__)
/*
@@ -566,9 +595,16 @@ cupsSetUserAgent(const char *user_agent)/* I - User-Agent string or @code NULL@
strlcpy(version, "unknown", sizeof(version));
# if TARGET_OS_OSX
- snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (macOS %s; %s) IPP/2.0", version, name.machine);
+ if (cg->uatokens == _CUPS_UATOKENS_OS)
+ snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (macOS %s) IPP/2.0", version);
+ else
+ snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (macOS %s; %s) IPP/2.0", version, name.machine);
+
# else
- snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (iOS %s; %s) IPP/2.0", version, name.machine);
+ if (cg->uatokens == _CUPS_UATOKENS_OS)
+ snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (iOS %s) IPP/2.0", version);
+ else
+ snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (iOS %s; %s) IPP/2.0", version, name.machine);
# endif /* TARGET_OS_OSX */
#else
@@ -578,7 +614,10 @@ cupsSetUserAgent(const char *user_agent)/* I - User-Agent string or @code NULL@
uname(&name);
- snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (%s %s; %s) IPP/2.0", name.sysname, name.release, name.machine);
+ if (cg->uatokens == _CUPS_UATOKENS_OS)
+ snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (%s %s) IPP/2.0", name.sysname, name.release);
+ else
+ snprintf(cg->user_agent, sizeof(cg->user_agent), CUPS_MINIMAL " (%s %s; %s) IPP/2.0", name.sysname, name.release, name.machine);
#endif /* _WIN32 */
}
@@ -980,6 +1019,8 @@ _cupsSetDefaults(void)
cups_finalize_client_conf(&cc);
+ cg->uatokens = cc.uatokens;
+
if (cg->encryption == (http_encryption_t)-1)
cg->encryption = cc.encryption;
@@ -1222,6 +1263,8 @@ cups_init_client_conf(
memset(cc, 0, sizeof(_cups_client_conf_t));
+ cc->uatokens = _CUPS_UATOKENS_MINIMAL;
+
#if defined(__APPLE__) && !TARGET_OS_OSX
cups_set_user(cc, "mobile");
#endif /* __APPLE__ && !TARGET_OS_OSX */
@@ -1241,8 +1284,9 @@ cups_init_client_conf(
* everything...)
*/
-#if defined(__APPLE__) && defined(HAVE_SSL)
+#if defined(__APPLE__)
char sval[1024]; /* String value */
+# ifdef HAVE_SSL
int bval; /* Boolean value */
if (cups_apple_get_boolean(kAllowAnyRootKey, &bval))
@@ -1278,7 +1322,13 @@ cups_init_client_conf(
if (cups_apple_get_boolean(kValidateCertsKey, &bval))
cc->validate_certs = bval;
-#endif /* __APPLE__ && HAVE_SSL */
+# endif /* HAVE_SSL */
+
+ if (cups_apple_get_string(kUserAgentTokensKey, sval, sizeof(sval)))
+ {
+ cups_set_uatokens(cc, sval);
+ }
+#endif /* __APPLE__ */
}
@@ -1315,6 +1365,8 @@ cups_read_client_conf(
#endif /* !__APPLE__ */
else if (!_cups_strcasecmp(line, "User") && value)
cups_set_user(cc, value);
+ else if (!_cups_strcasecmp(line, "UserAgentTokens") && value)
+ cups_set_uatokens(cc, value);
else if (!_cups_strcasecmp(line, "TrustOnFirstUse") && value)
cc->trust_first = cups_boolean_value(value);
else if (!_cups_strcasecmp(line, "AllowAnyRoot") && value)
@@ -1485,6 +1537,38 @@ cups_set_ssl_options(
/*
+ * 'cups_set_uatokens()' - Set the UserAgentTokens value.
+ */
+
+static void
+cups_set_uatokens(
+ _cups_client_conf_t *cc, /* I - client.conf values */
+ const char *value) /* I - Value */
+{
+ int i; /* Looping var */
+ static const char * const uatokens[] =/* UserAgentTokens values */
+ {
+ "NONE",
+ "PRODUCTONLY",
+ "MAJOR",
+ "MINOR",
+ "MINIMAL",
+ "OS",
+ "FULL"
+ };
+
+ for (i = 0; i < (int)(sizeof(uatokens) / sizeof(uatokens[0])); i ++)
+ {
+ if (!_cups_strcasecmp(value, uatokens[i]))
+ {
+ cc->uatokens = (_cups_uatokens_t)i;
+ return;
+ }
+ }
+}
+
+
+/*
* 'cups_set_user()' - Set the User value.
*/