summaryrefslogtreecommitdiff
path: root/scheduler/auth.c
diff options
context:
space:
mode:
Diffstat (limited to 'scheduler/auth.c')
-rw-r--r--scheduler/auth.c151
1 files changed, 90 insertions, 61 deletions
diff --git a/scheduler/auth.c b/scheduler/auth.c
index e71cfaa40..89011f7db 100644
--- a/scheduler/auth.c
+++ b/scheduler/auth.c
@@ -1,5 +1,5 @@
;/*
- * "$Id: auth.c 5043 2006-02-01 18:55:16Z mike $"
+ * "$Id: auth.c 5083 2006-02-06 02:57:43Z mike $"
*
* Authorization routines for the Common UNIX Printing System (CUPS).
*
@@ -45,6 +45,7 @@
* cupsdIsAuthorized() - Check to see if the user is authorized...
* add_allow() - Add an allow mask to the location.
* add_deny() - Add a deny mask to the location.
+ * compare_locations() - Compare two locations.
* cups_crypt() - Encrypt the password using the DES or MD5
* algorithms, as needed.
* pam_func() - PAM conversation function.
@@ -73,6 +74,9 @@
#ifdef HAVE_USERSEC_H
# include <usersec.h>
#endif /* HAVE_USERSEC_H */
+#ifdef HAVE_MEMBERSHIP_H
+# include <membership.h>
+#endif /* HAVE_MEMBERSHIP_H */
/*
@@ -81,6 +85,8 @@
static cupsd_authmask_t *add_allow(cupsd_location_t *loc);
static cupsd_authmask_t *add_deny(cupsd_location_t *loc);
+static int compare_locations(cupsd_location_t *a,
+ cupsd_location_t *b);
#if !HAVE_LIBPAM
static char *cups_crypt(const char *pw, const char *salt);
#endif /* !HAVE_LIBPAM */
@@ -125,30 +131,32 @@ cupsdAddLocation(const char *location) /* I - Location path */
/*
- * Try to allocate memory for the new location.
+ * Make sure the locations array is created...
*/
- if (NumLocations == 0)
- temp = malloc(sizeof(cupsd_location_t));
- else
- temp = realloc(Locations, sizeof(cupsd_location_t) * (NumLocations + 1));
+ if (!Locations)
+ Locations = cupsArrayNew((cups_array_func_t)compare_locations, NULL);
- if (temp == NULL)
+ if (!Locations)
return (NULL);
- Locations = temp;
- temp += NumLocations;
- NumLocations ++;
+ /*
+ * Try to allocate memory for the new location.
+ */
+
+ if ((temp = calloc(1, sizeof(cupsd_location_t))) == NULL)
+ return (NULL);
/*
* Initialize the record and copy the name over...
*/
- memset(temp, 0, sizeof(cupsd_location_t));
- strlcpy(temp->location, location, sizeof(temp->location));
- temp->length = strlen(temp->location);
+ temp->location = strdup(location);
+ temp->length = strlen(temp->location);
- cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdAddLocation: added location \'%s\'",
+ cupsArrayAdd(Locations, temp);
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddLocation: added location \'%s\'",
location);
/*
@@ -218,7 +226,7 @@ cupsdAllowHost(cupsd_location_t *loc, /* I - Location to add to */
if ((temp = add_allow(loc)) == NULL)
return;
- if (strcasecmp(name, "@LOCAL") == 0)
+ if (!strcasecmp(name, "@LOCAL"))
{
/*
* Allow *interface*...
@@ -228,7 +236,7 @@ cupsdAllowHost(cupsd_location_t *loc, /* I - Location to add to */
temp->mask.name.name = strdup("*");
temp->mask.name.length = 1;
}
- else if (strncasecmp(name, "@IF(", 4) == 0)
+ else if (!strncasecmp(name, "@IF(", 4))
{
/*
* Allow *interface*...
@@ -900,8 +908,8 @@ cupsdCheckAuth(
if (name_len >= masks->mask.name.length &&
masks->mask.name.name[0] == '.' &&
- strcasecmp(name + name_len - masks->mask.name.length,
- masks->mask.name.name) == 0)
+ !strcasecmp(name + name_len - masks->mask.name.length,
+ masks->mask.name.name))
return (1);
break;
@@ -941,6 +949,11 @@ cupsdCheckGroup(
int i; /* Looping var */
struct group *group; /* System group info */
char junk[33]; /* MD5 password (not used) */
+#ifdef HAVE_MBR_UID_TO_UUID
+ uuid_t useruuid, /* UUID for username */
+ groupuuid; /* UUID for groupname */
+ int is_member; /* True if user is a member of group */
+#endif /* HAVE_MBR_UID_TO_UUID */
cupsdLogMessage(CUPSD_LOG_DEBUG2,
@@ -980,6 +993,19 @@ cupsdCheckGroup(
if (user && group && group->gr_gid == user->pw_gid)
return (1);
+#ifdef HAVE_MBR_UID_TO_UUID
+ /*
+ * Check group membership through MacOS X membership API...
+ */
+
+ if (user && group)
+ if (!mbr_uid_to_uuid(user->pw_uid, useruuid))
+ if (!mbr_gid_to_uuid(group->gr_gid, groupuuid))
+ if (!mbr_check_membership(useruuid, groupuuid, &is_member))
+ if (is_member)
+ return (1);
+#endif /* HAVE_MBR_UID_TO_UUID */
+
/*
* Username not found, group not found, or user is not part of the
* system group... Check for a user and group in the MD5 password
@@ -1006,20 +1032,12 @@ cupsdCopyLocation(
cupsd_location_t **loc) /* IO - Original location */
{
int i; /* Looping var */
- int locindex; /* Index into Locations array */
cupsd_location_t *temp; /* New location */
char location[HTTP_MAX_URI];
/* Location of resource */
/*
- * Add the new location, updating the original location
- * pointer as needed...
- */
-
- locindex = *loc - Locations;
-
- /*
* Use a local copy of location because cupsdAddLocation may cause
* this memory to be moved...
*/
@@ -1029,8 +1047,6 @@ cupsdCopyLocation(
if ((temp = cupsdAddLocation(location)) == NULL)
return (NULL);
- *loc = Locations + locindex;
-
/*
* Copy the information from the original location to the new one.
*/
@@ -1053,7 +1069,8 @@ cupsdCopyLocation(
cupsdLogMessage(CUPSD_LOG_ERROR,
"cupsdCopyLocation: Unable to allocate memory for %d names: %s",
temp->num_names, strerror(errno));
- NumLocations --;
+
+ cupsdDeleteLocation(temp);
return (NULL);
}
@@ -1064,7 +1081,7 @@ cupsdCopyLocation(
"cupsdCopyLocation: Unable to copy name \"%s\": %s",
(*loc)->names[i], strerror(errno));
- NumLocations --;
+ cupsdDeleteLocation(temp);
return (NULL);
}
}
@@ -1080,7 +1097,7 @@ cupsdCopyLocation(
cupsdLogMessage(CUPSD_LOG_ERROR,
"cupsdCopyLocation: Unable to allocate memory for %d allow rules: %s",
temp->num_allow, strerror(errno));
- NumLocations --;
+ cupsdDeleteLocation(temp);
return (NULL);
}
@@ -1096,7 +1113,7 @@ cupsdCopyLocation(
cupsdLogMessage(CUPSD_LOG_ERROR,
"cupsdCopyLocation: Unable to copy allow name \"%s\": %s",
(*loc)->allow[i].mask.name.name, strerror(errno));
- NumLocations --;
+ cupsdDeleteLocation(temp);
return (NULL);
}
break;
@@ -1118,7 +1135,7 @@ cupsdCopyLocation(
cupsdLogMessage(CUPSD_LOG_ERROR,
"cupsdCopyLocation: Unable to allocate memory for %d deny rules: %s",
temp->num_deny, strerror(errno));
- NumLocations --;
+ cupsdDeleteLocation(temp);
return (NULL);
}
@@ -1134,7 +1151,7 @@ cupsdCopyLocation(
cupsdLogMessage(CUPSD_LOG_ERROR,
"cupsdCopyLocation: Unable to copy deny name \"%s\": %s",
(*loc)->deny[i].mask.name.name, strerror(errno));
- NumLocations --;
+ cupsdDeleteLocation(temp);
return (NULL);
}
break;
@@ -1156,7 +1173,6 @@ cupsdCopyLocation(
void
cupsdDeleteAllLocations(void)
{
- int i; /* Looping var */
cupsd_location_t *loc; /* Current location */
@@ -1164,18 +1180,17 @@ cupsdDeleteAllLocations(void)
* Free all of the allow/deny records first...
*/
- for (i = NumLocations, loc = Locations; i > 0; i --, loc ++)
+ for (loc = (cupsd_location_t *)cupsArrayFirst(Locations);
+ loc;
+ loc = (cupsd_location_t *)cupsArrayNext(Locations))
cupsdDeleteLocation(loc);
/*
* Then free the location array...
*/
- if (NumLocations > 0)
- free(Locations);
-
- Locations = NULL;
- NumLocations = 0;
+ cupsArrayDelete(Locations);
+ Locations = NULL;
}
@@ -1191,6 +1206,8 @@ cupsdDeleteLocation(
cupsd_authmask_t *mask; /* Current mask */
+ cupsArrayRemove(Locations, loc);
+
for (i = loc->num_names - 1; i >= 0; i --)
free(loc->names[i]);
@@ -1210,6 +1227,9 @@ cupsdDeleteLocation(
if (loc->num_deny > 0)
free(loc->deny);
+
+ free(loc->location);
+ free(loc);
}
@@ -1233,7 +1253,7 @@ cupsdDenyHost(cupsd_location_t *loc, /* I - Location to add to */
if ((temp = add_deny(loc)) == NULL)
return;
- if (strcasecmp(name, "@LOCAL") == 0)
+ if (!strcasecmp(name, "@LOCAL"))
{
/*
* Deny *interface*...
@@ -1243,7 +1263,7 @@ cupsdDenyHost(cupsd_location_t *loc, /* I - Location to add to */
temp->mask.name.name = strdup("*");
temp->mask.name.length = 1;
}
- else if (strncasecmp(name, "@IF(", 4) == 0)
+ else if (!strncasecmp(name, "@IF(", 4))
{
/*
* Deny *interface*...
@@ -1312,7 +1332,6 @@ cupsd_location_t * /* O - Location that matches */
cupsdFindBest(const char *path, /* I - Resource path */
http_state_t state) /* I - HTTP state/request */
{
- int i; /* Looping var */
char uri[HTTP_MAX_URI],
/* URI in request... */
*uriptr; /* Pointer into URI */
@@ -1370,7 +1389,9 @@ cupsdFindBest(const char *path, /* I - Resource path */
best = NULL;
bestlen = 0;
- for (i = NumLocations, loc = Locations; i > 0; i --, loc ++)
+ for (loc = (cupsd_location_t *)cupsArrayFirst(Locations);
+ loc;
+ loc = (cupsd_location_t *)cupsArrayNext(Locations))
{
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: Location %s Limit %x",
loc->location, loc->limit);
@@ -1382,7 +1403,7 @@ cupsdFindBest(const char *path, /* I - Resource path */
*/
if (loc->length > bestlen &&
- strncasecmp(uri, loc->location, loc->length) == 0 &&
+ !strncasecmp(uri, loc->location, loc->length) &&
loc->location[0] == '/' &&
(limit & loc->limit) != 0)
{
@@ -1425,18 +1446,12 @@ cupsdFindBest(const char *path, /* I - Resource path */
cupsd_location_t * /* O - Location that matches */
cupsdFindLocation(const char *location) /* I - Connection */
{
- int i; /* Looping var */
+ cupsd_location_t key; /* Search key */
- /*
- * Loop through the list of locations to find a match...
- */
+ key.location = (char *)location;
- for (i = 0; i < NumLocations; i ++)
- if (!strcasecmp(Locations[i].location, location))
- return (Locations + i);
-
- return (NULL);
+ return ((cupsd_location_t *)cupsArrayFind(Locations, &key));
}
@@ -1478,8 +1493,8 @@ cupsdGetMD5Passwd(const char *username, /* I - Username */
continue;
}
- if (strcmp(username, tempuser) == 0 &&
- (group == NULL || strcmp(group, tempgroup) == 0))
+ if (!strcmp(username, tempuser) &&
+ (group == NULL || !strcmp(group, tempgroup)))
{
/*
* Found the password entry!
@@ -1557,7 +1572,8 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */
best = con->best;
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdIsAuthorized: level=AUTH_%s, type=AUTH_%s, satisfy=AUTH_SATISFY_%s, num_names=%d",
+ "cupsdIsAuthorized: level=AUTH_%s, type=AUTH_%s, "
+ "satisfy=AUTH_SATISFY_%s, num_names=%d",
levels[best->level], types[best->type],
best->satisfy ? "ANY" : "ALL", best->num_names);
@@ -1656,7 +1672,8 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */
* See if encryption is required...
*/
- if (best->encryption >= HTTP_ENCRYPT_REQUIRED && !con->http.tls)
+ if (best->encryption >= HTTP_ENCRYPT_REQUIRED && !con->http.tls &&
+ best->satisfy == AUTH_SATISFY_ALL)
{
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"cupsdIsAuthorized: Need upgrade to TLS...");
@@ -1889,6 +1906,18 @@ add_deny(cupsd_location_t *loc) /* I - Location to add to */
}
+/*
+ * 'compare_locations()' - Compare two locations.
+ */
+
+static int /* O - Result of comparison */
+compare_locations(cupsd_location_t *a, /* I - First location */
+ cupsd_location_t *b) /* I - Second location */
+{
+ return (strcmp(b->location, a->location));
+}
+
+
#if !HAVE_LIBPAM
/*
* 'cups_crypt()' - Encrypt the password using the DES or MD5 algorithms,
@@ -1899,7 +1928,7 @@ static char * /* O - Encrypted password */
cups_crypt(const char *pw, /* I - Password string */
const char *salt) /* I - Salt (key) string */
{
- if (strncmp(salt, "$1$", 3) == 0)
+ if (!strncmp(salt, "$1$", 3))
{
/*
* Use MD5 passwords without the benefit of PAM; this is for
@@ -2127,5 +2156,5 @@ to64(char *s, /* O - Output string */
/*
- * End of "$Id: auth.c 5043 2006-02-01 18:55:16Z mike $".
+ * End of "$Id: auth.c 5083 2006-02-06 02:57:43Z mike $".
*/