/* variable name starts with */
"HTTP_",
"SSL_",
+ "GRST_",
/* variable name is */
"AUTH_TYPE=",
environ = cleanenv;
}
+int GRSTexecGetMapping(char **target_uname, char **target_gname,
+ char *map_x509dn)
+{
+ return 1;
+}
+
int main(int argc, char *argv[])
{
int userdir = 0; /* ~userdir flag */
uid_t uid; /* user information */
gid_t gid; /* target group placeholder */
+ char *mapping_type; /* suexec / X509DN / directory */
+ char *map_x509dn; /* DN to use as pool acct. key */
+ char *map_directory; /* directory as pool acct. key */
char *target_uname; /* target user name */
char *target_gname; /* target group name */
char *target_homedir; /* target home directory */
log_err("too few arguments\n");
exit(101);
}
- target_uname = argv[1];
- target_gname = argv[2];
+
+ mapping_type = getenv("GRST_EXEC_MAPPING");
+ if ((mapping_type == NULL) ||
+ (mapping_type[0] == '\0') ||
+ (strcasecmp(mapping_type, "suexec") == 0))
+ {
+ target_uname = argv[1];
+ target_gname = argv[2];
+ mapping_type = NULL;
+ }
+ else if (strcasecmp(mapping_type, "X509DN") == 0)
+ {
+ map_x509dn = getenv("SSL_CLIENT_S_DN");
+ if (map_x509dn == NULL)
+ {
+ log_err("No SSL_CLIENT_S_DN despite X509DN mapping\n");
+ exit(151);
+ }
+
+ if (GRSTexecGetMapping(&target_uname, &target_gname, map_x509dn)
+ != 0)
+ {
+ log_err("GRSTexecGetMapping() failed mapping \"%s\"\n",
+ map_x509dn);
+ exit(152);
+ }
+ }
+ else if (strcasecmp(mapping_type, "directory") == 0)
+ {
+ map_directory = getenv("GRST_EXEC_MAP_DIR");
+ if (map_directory == NULL)
+ {
+ log_err("No GRST_EXEC_MAP_DIR despite directory mapping\n");
+ exit(153);
+ }
+
+ if (GRSTexecGetMapping(&target_uname, &target_gname, map_directory)
+ != 0)
+ {
+ log_err("GRSTexecGetMapping() failed mapping \"%s\"\n",
+ map_directory);
+ exit(154);
+ }
+ }
+ else
+ {
+ log_err("mapping type \"%s\" not recognised\n", mapping_type);
+ exit(155);
+ }
+
cmd = argv[3];
/*