diff options
Diffstat (limited to 'WWW/Library/Implementation/HTAAProt.c')
-rw-r--r-- | WWW/Library/Implementation/HTAAProt.c | 736 |
1 files changed, 366 insertions, 370 deletions
diff --git a/WWW/Library/Implementation/HTAAProt.c b/WWW/Library/Implementation/HTAAProt.c index 516b4885..192b974c 100644 --- a/WWW/Library/Implementation/HTAAProt.c +++ b/WWW/Library/Implementation/HTAAProt.c @@ -1,68 +1,70 @@ /* MODULE HTAAProt.c -** PROTECTION FILE PARSING MODULE -** -** AUTHORS: -** AL Ari Luotonen luotonen@dxcern.cern.ch -** MD Mark Donszelmann duns@vxdeop.cern.ch -** -** HISTORY: -** 20 Oct 93 AL Now finds uid/gid for nobody/nogroup by name -** (doesn't use default 65534 right away). -** Also understands negative uids/gids. -** 14 Nov 93 MD Added VMS compatibility -** -** BUGS: -** -** -*/ + * PROTECTION FILE PARSING MODULE + * + * AUTHORS: + * AL Ari Luotonen luotonen@dxcern.cern.ch + * MD Mark Donszelmann duns@vxdeop.cern.ch + * + * HISTORY: + * 20 Oct 93 AL Now finds uid/gid for nobody/nogroup by name + * (doesn't use default 65534 right away). + * Also understands negative uids/gids. + * 14 Nov 93 MD Added VMS compatibility + * + * BUGS: + * + * + */ #include <HTUtils.h> #ifndef VMS #ifndef NOUSERS -#include <pwd.h> /* Unix password file routine: getpwnam() */ -#include <grp.h> /* Unix group file routine: getgrnam() */ +#include <pwd.h> /* Unix password file routine: getpwnam() */ +#include <grp.h> /* Unix group file routine: getgrnam() */ #endif /* NOUSERS */ #endif /* not VMS */ #include <HTAAUtil.h> -#include <HTLex.h> /* Lexical analysor */ -#include <HTAAProt.h> /* Implemented here */ +#include <HTLex.h> /* Lexical analysor */ +#include <HTAAProt.h> /* Implemented here */ #include <LYUtils.h> #include <LYLeaks.h> -#define NOBODY 65534 /* -2 in 16-bit environment */ -#define NONESUCH 65533 /* -3 in 16-bit environment */ +#define NOBODY 65534 /* -2 in 16-bit environment */ +#define NONESUCH 65533 /* -3 in 16-bit environment */ /* -** Protection setup caching -*/ + * Protection setup caching + */ typedef struct { - char * prot_filename; - HTAAProt * prot; + char *prot_filename; + HTAAProt *prot; } HTAAProtCache; -static HTList * prot_cache = NULL; /* Protection setup cache. */ -static HTAAProt *default_prot = NULL; /* Default protection. */ -static HTAAProt *current_prot = NULL; /* Current protection mode */ +static HTList *prot_cache = NULL; /* Protection setup cache. */ +static HTAAProt *default_prot = NULL; /* Default protection. */ +static HTAAProt *current_prot = NULL; /* Current protection mode */ + /* which is set up by callbacks */ - /* from the rule system when */ + /* from the rule system when */ /* a "protect" rule is matched. */ #ifndef NOUSERS /* static isNumber() -** DOES A CHARACTER STRING REPRESENT A NUMBER -*/ -static BOOL isNumber (const char * s) + * DOES A CHARACTER STRING REPRESENT A NUMBER + */ +static BOOL isNumber(const char *s) { const char *cur = s; - if (isEmpty(s)) return NO; + if (isEmpty(s)) + return NO; if (*cur == '-') - cur++; /* Allow initial minus sign in a number */ + cur++; /* Allow initial minus sign in a number */ while (*cur) { if (*cur < '0' || *cur > '9') @@ -73,136 +75,130 @@ static BOOL isNumber (const char * s) } #endif /* !NOUSERS */ - #if defined (NOUSERS) /* PUBLIC HTAA_getUidName() -** GET THE USER ID NAME (VMS ONLY) -** ON ENTRY: -** No arguments. -** -** ON EXIT: -** returns the user name -** Default is "" (nobody). -*/ -char * HTAA_getUidName (void) + * GET THE USER ID NAME (VMS ONLY) + * ON ENTRY: + * No arguments. + * + * ON EXIT: + * returns the user name + * Default is "" (nobody). + */ +char *HTAA_getUidName(void) { if (current_prot && current_prot->uid_name - && (0 != strcmp(current_prot->uid_name,"nobody")) ) - return(current_prot->uid_name); + && (0 != strcmp(current_prot->uid_name, "nobody"))) + return (current_prot->uid_name); else - return(""); + return (""); } /* PUBLIC HTAA_getFileName -** GET THE FILENAME (VMS ONLY) -** ON ENTRY: -** No arguments. -** -** ON EXIT: -** returns the filename -*/ -char * HTAA_getFileName (void) + * GET THE FILENAME (VMS ONLY) + * ON ENTRY: + * No arguments. + * + * ON EXIT: + * returns the filename + */ +char *HTAA_getFileName(void) { if (current_prot && current_prot->filename) - return(current_prot->filename); + return (current_prot->filename); else - return(""); + return (""); } #else /* not VMS */ /* PUBLIC HTAA_getUid() -** GET THE USER ID TO CHANGE THE PROCESS UID TO -** ON ENTRY: -** No arguments. -** -** ON EXIT: -** returns the uid number to give to setuid() system call. -** Default is 65534 (nobody). -*/ -int HTAA_getUid (void) + * GET THE USER ID TO CHANGE THE PROCESS UID TO + * ON ENTRY: + * No arguments. + * + * ON EXIT: + * returns the uid number to give to setuid() system call. + * Default is 65534 (nobody). + */ +int HTAA_getUid(void) { int uid; - if (current_prot && current_prot->uid_name) { + if (current_prot && current_prot->uid_name) { if (isNumber(current_prot->uid_name)) { uid = atoi(current_prot->uid_name); - if ((*HTAA_UidToName (uid)) != '\0') { + if ((*HTAA_UidToName(uid)) != '\0') { return uid; } - } - else { /* User name (not a number) */ - if ((uid = HTAA_NameToUid (current_prot->uid_name)) != NONESUCH) { + } else { /* User name (not a number) */ + if ((uid = HTAA_NameToUid(current_prot->uid_name)) != NONESUCH) { return uid; } } } /* - ** Ok, then let's get uid for nobody. - */ - if ((uid = HTAA_NameToUid ("nobody")) != NONESUCH) { + * Ok, then let's get uid for nobody. + */ + if ((uid = HTAA_NameToUid("nobody")) != NONESUCH) { return uid; } /* - ** Ok, then use default. - */ - return NOBODY; /* nobody */ + * Ok, then use default. + */ + return NOBODY; /* nobody */ } - /* PUBLIC HTAA_getGid() -** GET THE GROUP ID TO CHANGE THE PROCESS GID TO -** ON ENTRY: -** No arguments. -** -** ON EXIT: -** returns the uid number to give to setgid() system call. -** Default is 65534 (nogroup). -*/ -int HTAA_getGid (void) + * GET THE GROUP ID TO CHANGE THE PROCESS GID TO + * ON ENTRY: + * No arguments. + * + * ON EXIT: + * returns the uid number to give to setgid() system call. + * Default is 65534 (nogroup). + */ +int HTAA_getGid(void) { int gid; - if (current_prot && current_prot->gid_name) { + if (current_prot && current_prot->gid_name) { if (isNumber(current_prot->gid_name)) { gid = atoi(current_prot->gid_name); if (*HTAA_GidToName(gid) != '\0') { return gid; } - } - else { /* Group name (not number) */ - if ((gid = HTAA_NameToGid (current_prot->gid_name)) != NONESUCH) { + } else { /* Group name (not number) */ + if ((gid = HTAA_NameToGid(current_prot->gid_name)) != NONESUCH) { return gid; } } } /* - ** Ok, then let's get gid for nogroup. - */ - if ((gid = HTAA_NameToGid ("nogroup")) != NONESUCH) { + * Ok, then let's get gid for nogroup. + */ + if ((gid = HTAA_NameToGid("nogroup")) != NONESUCH) { return gid; } /* - ** Ok, then use default. - */ - return NOBODY; /* nogroup */ + * Ok, then use default. + */ + return NOBODY; /* nogroup */ } #endif /* not VMS */ - /* static HTAA_setIds() -** SET UID AND GID (AS NAMES OR NUMBERS) -** TO HTAAProt STRUCTURE -** ON ENTRY: -** prot destination. -** ids is a string like "james.www" or "1422.69" etc. -** giving uid and gid. -** -** ON EXIT: -** returns nothing. -*/ -static void HTAA_setIds (HTAAProt * prot, - const char * ids) + * SET UID AND GID (AS NAMES OR NUMBERS) + * TO HTAAProt STRUCTURE + * ON ENTRY: + * prot destination. + * ids is a string like "james.www" or "1422.69" etc. + * giving uid and gid. + * + * ON EXIT: + * returns nothing. + */ +static void HTAA_setIds(HTAAProt *prot, const char *ids) { if (ids) { char *local_copy = NULL; @@ -211,34 +207,30 @@ static void HTAA_setIds (HTAAProt * prot, StrAllocCopy(local_copy, ids); point = strchr(local_copy, '.'); if (point) { - *(point++) = (char)0; + *(point++) = (char) 0; StrAllocCopy(prot->gid_name, point); - } - else { + } else { StrAllocCopy(prot->gid_name, "nogroup"); } StrAllocCopy(prot->uid_name, local_copy); FREE(local_copy); - } - else { + } else { StrAllocCopy(prot->uid_name, "nobody"); StrAllocCopy(prot->gid_name, "nogroup"); } } - /* static HTAA_parseProtFile() -** PARSE A PROTECTION SETUP FILE AND -** PUT THE RESULT IN A HTAAProt STRUCTURE -** ON ENTRY: -** prot destination structure. -** fp open protection file. -** -** ON EXIT: -** returns nothing. -*/ -static void HTAA_parseProtFile (HTAAProt * prot, - FILE * fp) + * PARSE A PROTECTION SETUP FILE AND + * PUT THE RESULT IN A HTAAProt STRUCTURE + * ON ENTRY: + * prot destination structure. + * fp open protection file. + * + * ON EXIT: + * returns nothing. + */ +static void HTAA_parseProtFile(HTAAProt *prot, FILE *fp) { if (prot && fp) { LexItem lex_item; @@ -249,7 +241,7 @@ static void HTAA_parseProtFile (HTAAProt * prot, while (lex_item == LEX_REC_SEP) /* Ignore empty lines */ lex_item = lex(fp); - if (lex_item == LEX_EOF) /* End of file */ + if (lex_item == LEX_EOF) /* End of file */ break; if (lex_item == LEX_ALPH_STR) { /* Valid setup record */ @@ -258,112 +250,114 @@ static void HTAA_parseProtFile (HTAAProt * prot, if (LEX_FIELD_SEP != (lex_item = lex(fp))) unlex(lex_item); /* If someone wants to use colon */ - /* after field name it's ok, but */ - /* not required. Here we read it.*/ + /* after field name it's ok, but */ + /* not required. Here we read it. */ - if (0==strncasecomp(fieldname, "Auth", 4)) { + if (0 == strncasecomp(fieldname, "Auth", 4)) { lex_item = lex(fp); while (lex_item == LEX_ALPH_STR) { HTAAScheme scheme = HTAAScheme_enum(HTlex_buffer); + if (scheme != HTAA_UNKNOWN) { if (!prot->valid_schemes) prot->valid_schemes = HTList_new(); - HTList_addObject(prot->valid_schemes,(void*)scheme); + HTList_addObject(prot->valid_schemes, (void *) scheme); CTRACE((tfp, "%s %s `%s'\n", - "HTAA_parseProtFile: valid", - "authentication scheme:", - HTAAScheme_name(scheme))); + "HTAA_parseProtFile: valid", + "authentication scheme:", + HTAAScheme_name(scheme))); } else { CTRACE((tfp, "%s %s `%s'\n", - "HTAA_parseProtFile: unknown", - "authentication scheme:", - HTlex_buffer)); + "HTAA_parseProtFile: unknown", + "authentication scheme:", + HTlex_buffer)); } if (LEX_ITEM_SEP != (lex_item = lex(fp))) break; /* - ** Here lex_item == LEX_ITEM_SEP; after item separator - ** it is ok to have one or more newlines (LEX_REC_SEP) - ** and they are ignored (continuation line). - */ + * Here lex_item == LEX_ITEM_SEP; after item separator + * it is ok to have one or more newlines (LEX_REC_SEP) + * and they are ignored (continuation line). + */ do { lex_item = lex(fp); } while (lex_item == LEX_REC_SEP); - } /* while items in list */ - } /* if "Authenticate" */ - - else if (0==strncasecomp(fieldname, "mask", 4)) { + } /* while items in list */ + } + /* if "Authenticate" */ + else if (0 == strncasecomp(fieldname, "mask", 4)) { prot->mask_group = HTAA_parseGroupDef(fp); - lex_item=LEX_REC_SEP; /*groupdef parser read this already*/ + lex_item = LEX_REC_SEP; /*groupdef parser read this already */ if (TRACE) { if (prot->mask_group) { fprintf(tfp, "HTAA_parseProtFile: Mask group:\n"); HTAA_printGroupDef(prot->mask_group); - } else fprintf(tfp, "HTAA_parseProtFile: Mask group syntax error\n"); + } else + fprintf(tfp, + "HTAA_parseProtFile: Mask group syntax error\n"); } - } /* if "Mask" */ - - else { /* Just a name-value pair, put it to assoclist */ + } + /* if "Mask" */ + else { /* Just a name-value pair, put it to assoclist */ if (LEX_ALPH_STR == (lex_item = lex(fp))) { if (!prot->values) prot->values = HTAssocList_new(); HTAssocList_add(prot->values, fieldname, HTlex_buffer); - lex_item = lex(fp); /* Read record separator */ + lex_item = lex(fp); /* Read record separator */ CTRACE((tfp, "%s `%s' bound to value `%s'\n", - "HTAA_parseProtFile: Name", - fieldname, HTlex_buffer)); + "HTAA_parseProtFile: Name", + fieldname, HTlex_buffer)); } - } /* else name-value pair */ + } /* else name-value pair */ - } /* if valid field */ - - if (lex_item != LEX_EOF && lex_item != LEX_REC_SEP) { + } + /* if valid field */ + if (lex_item != LEX_EOF && lex_item != LEX_REC_SEP) { CTRACE((tfp, "%s %s %d (that line ignored)\n", - "HTAA_parseProtFile: Syntax error", - "in protection setup file at line", - HTlex_line)); + "HTAA_parseProtFile: Syntax error", + "in protection setup file at line", + HTlex_line)); do { lex_item = lex(fp); } while (lex_item != LEX_EOF && lex_item != LEX_REC_SEP); - } /* if syntax error */ - } /* while not end-of-file */ + } /* if syntax error */ + } /* while not end-of-file */ FREE(fieldname); - } /* if valid parameters */ + } /* if valid parameters */ } - /* static HTAAProt_new() -** ALLOCATE A NEW HTAAProt STRUCTURE AND -** INITIALIZE IT FROM PROTECTION SETUP FILE -** ON ENTRY: -** cur_docname current filename after rule translations. -** prot_filename protection setup file name. -** If NULL, not an error. -** ids Uid and gid names or numbers, -** examples: -** james ( <=> james.nogroup) -** .www ( <=> nobody.www) -** james.www -** james.69 -** 1422.69 -** 1422.www -** -** May be NULL, defaults to nobody.nogroup. -** Should be NULL, if prot_file is NULL. -** -** ON EXIT: -** returns returns a new and initialized protection -** setup structure. -** If setup file is already read in (found -** in cache), only sets uid_name and gid -** fields, and returns that. -*/ -static HTAAProt *HTAAProt_new (const char * cur_docname, - const char * prot_filename, - const char * ids) + * ALLOCATE A NEW HTAAProt STRUCTURE AND + * INITIALIZE IT FROM PROTECTION SETUP FILE + * ON ENTRY: + * cur_docname current filename after rule translations. + * prot_filename protection setup file name. + * If NULL, not an error. + * ids Uid and gid names or numbers, + * examples: + * james ( <=> james.nogroup) + * .www ( <=> nobody.www) + * james.www + * james.69 + * 1422.69 + * 1422.www + * + * May be NULL, defaults to nobody.nogroup. + * Should be NULL, if prot_file is NULL. + * + * ON EXIT: + * returns returns a new and initialized protection + * setup structure. + * If setup file is already read in (found + * in cache), only sets uid_name and gid + * fields, and returns that. + */ +static HTAAProt *HTAAProt_new(const char *cur_docname, + const char *prot_filename, + const char *ids) { HTList *cur = prot_cache; HTAAProtCache *cache_item = NULL; @@ -373,28 +367,28 @@ static HTAAProt *HTAAProt_new (const char * cur_docname, if (!prot_cache) prot_cache = HTList_new(); - while (NULL != (cache_item = (HTAAProtCache*)HTList_nextObject(cur))) { + while (NULL != (cache_item = (HTAAProtCache *) HTList_nextObject(cur))) { if (!strcmp(cache_item->prot_filename, prot_filename)) break; } if (cache_item) { prot = cache_item->prot; CTRACE((tfp, "%s `%s' already in cache\n", - "HTAAProt_new: Protection file", prot_filename)); + "HTAAProt_new: Protection file", prot_filename)); } else { CTRACE((tfp, "HTAAProt_new: Loading protection file `%s'\n", - prot_filename)); + prot_filename)); if ((prot = typecalloc(HTAAProt)) == 0) - outofmem(__FILE__, "HTAAProt_new"); + outofmem(__FILE__, "HTAAProt_new"); - prot->template = NULL; - prot->filename = NULL; - prot->uid_name = NULL; - prot->gid_name = NULL; + prot->template = NULL; + prot->filename = NULL; + prot->uid_name = NULL; + prot->gid_name = NULL; prot->valid_schemes = HTList_new(); - prot->mask_group= NULL; /* Masking disabled by defaults */ - prot->values = HTAssocList_new(); + prot->mask_group = NULL; /* Masking disabled by defaults */ + prot->values = HTAssocList_new(); if (prot_filename && NULL != (fp = fopen(prot_filename, TXT_R))) { HTAA_parseProtFile(prot, fp); @@ -404,11 +398,11 @@ static HTAAProt *HTAAProt_new (const char * cur_docname, cache_item->prot = prot; cache_item->prot_filename = NULL; StrAllocCopy(cache_item->prot_filename, prot_filename); - HTList_addObject(prot_cache, (void*)cache_item); + HTList_addObject(prot_cache, (void *) cache_item); } else { CTRACE((tfp, "HTAAProt_new: %s `%s'\n", - "Unable to open protection setup file", - NONNULL(prot_filename))); + "Unable to open protection setup file", + NONNULL(prot_filename))); } } @@ -419,29 +413,28 @@ static HTAAProt *HTAAProt_new (const char * cur_docname, return prot; } - /* PUBLIC HTAA_setDefaultProtection() -** SET THE DEFAULT PROTECTION MODE -** (called by rule system when a -** "defprot" rule is matched) -** ON ENTRY: -** cur_docname is the current result of rule translations. -** prot_filename is the protection setup file (second argument -** for "defprot" rule, optional) -** ids contains user and group names separated by -** a dot, corresponding to the uid -** gid under which the server should run, -** default is "nobody.nogroup" (third argument -** for "defprot" rule, optional; can be given -** only if protection setup file is also given). -** -** ON EXIT: -** returns nothing. -** Sets the module-wide variable default_prot. -*/ -void HTAA_setDefaultProtection (const char * cur_docname, - const char * prot_filename, - const char * ids) + * SET THE DEFAULT PROTECTION MODE + * (called by rule system when a + * "defprot" rule is matched) + * ON ENTRY: + * cur_docname is the current result of rule translations. + * prot_filename is the protection setup file (second argument + * for "defprot" rule, optional) + * ids contains user and group names separated by + * a dot, corresponding to the uid + * gid under which the server should run, + * default is "nobody.nogroup" (third argument + * for "defprot" rule, optional; can be given + * only if protection setup file is also given). + * + * ON EXIT: + * returns nothing. + * Sets the module-wide variable default_prot. + */ +void HTAA_setDefaultProtection(const char *cur_docname, + const char *prot_filename, + const char *ids) { default_prot = NULL; /* Not free()'d because this is in cache */ @@ -449,34 +442,33 @@ void HTAA_setDefaultProtection (const char * cur_docname, default_prot = HTAAProt_new(cur_docname, prot_filename, ids); } else { CTRACE((tfp, "%s %s\n", - "HTAA_setDefaultProtection: ERROR: Protection file", - "not specified (obligatory for DefProt rule)!!\n")); + "HTAA_setDefaultProtection: ERROR: Protection file", + "not specified (obligatory for DefProt rule)!!\n")); } } - /* PUBLIC HTAA_setCurrentProtection() -** SET THE CURRENT PROTECTION MODE -** (called by rule system when a -** "protect" rule is matched) -** ON ENTRY: -** cur_docname is the current result of rule translations. -** prot_filename is the protection setup file (second argument -** for "protect" rule, optional) -** ids contains user and group names separated by -** a dot, corresponding to the uid -** gid under which the server should run, -** default is "nobody.nogroup" (third argument -** for "protect" rule, optional; can be given -** only if protection setup file is also given). -** -** ON EXIT: -** returns nothing. -** Sets the module-wide variable current_prot. -*/ -void HTAA_setCurrentProtection (const char * cur_docname, - const char * prot_filename, - const char * ids) + * SET THE CURRENT PROTECTION MODE + * (called by rule system when a + * "protect" rule is matched) + * ON ENTRY: + * cur_docname is the current result of rule translations. + * prot_filename is the protection setup file (second argument + * for "protect" rule, optional) + * ids contains user and group names separated by + * a dot, corresponding to the uid + * gid under which the server should run, + * default is "nobody.nogroup" (third argument + * for "protect" rule, optional; can be given + * only if protection setup file is also given). + * + * ON EXIT: + * returns nothing. + * Sets the module-wide variable current_prot. + */ +void HTAA_setCurrentProtection(const char *cur_docname, + const char *prot_filename, + const char *ids) { current_prot = NULL; /* Not free()'d because this is in cache */ @@ -487,63 +479,61 @@ void HTAA_setCurrentProtection (const char * cur_docname, current_prot = default_prot; HTAA_setIds(current_prot, ids); CTRACE((tfp, "%s %s %s\n", - "HTAA_setCurrentProtection: Protection file", - "not specified for Protect rule", - "-- using default protection")); + "HTAA_setCurrentProtection: Protection file", + "not specified for Protect rule", + "-- using default protection")); } else { CTRACE((tfp, "%s %s %s\n", - "HTAA_setCurrentProtection: ERROR: Protection", - "file not specified for Protect rule, and", - "default protection is not set!!")); + "HTAA_setCurrentProtection: ERROR: Protection", + "file not specified for Protect rule, and", + "default protection is not set!!")); } } } - /* PUBLIC HTAA_getCurrentProtection() -** GET CURRENT PROTECTION SETUP STRUCTURE -** (this is set up by callbacks made from -** the rule system when matching "protect" -** (and "defprot") rules) -** ON ENTRY: -** HTTranslate() must have been called before calling -** this function. -** -** ON EXIT: -** returns a HTAAProt structure representing the -** protection setup of the HTTranslate()'d file. -** This must not be free()'d. -*/ -HTAAProt *HTAA_getCurrentProtection (void) + * GET CURRENT PROTECTION SETUP STRUCTURE + * (this is set up by callbacks made from + * the rule system when matching "protect" + * (and "defprot") rules) + * ON ENTRY: + * HTTranslate() must have been called before calling + * this function. + * + * ON EXIT: + * returns a HTAAProt structure representing the + * protection setup of the HTTranslate()'d file. + * This must not be free()'d. + */ +HTAAProt *HTAA_getCurrentProtection(void) { return current_prot; } - /* PUBLIC HTAA_getDefaultProtection() -** GET DEFAULT PROTECTION SETUP STRUCTURE -** AND SET IT TO CURRENT PROTECTION -** (this is set up by callbacks made from -** the rule system when matching "defprot" -** rules) -** ON ENTRY: -** HTTranslate() must have been called before calling -** this function. -** -** ON EXIT: -** returns a HTAAProt structure representing the -** default protection setup of the HTTranslate()'d -** file (if HTAA_getCurrentProtection() returned -** NULL, i.e., if there is no "protect" rule -** but ACL exists, and we need to know default -** protection settings). -** This must not be free()'d. -** IMPORTANT: -** As a side-effect this tells the protection system that -** the file is in fact protected and sets the current -** protection mode to default. -*/ -HTAAProt *HTAA_getDefaultProtection (void) + * GET DEFAULT PROTECTION SETUP STRUCTURE + * AND SET IT TO CURRENT PROTECTION + * (this is set up by callbacks made from + * the rule system when matching "defprot" + * rules) + * ON ENTRY: + * HTTranslate() must have been called before calling + * this function. + * + * ON EXIT: + * returns a HTAAProt structure representing the + * default protection setup of the HTTranslate()'d + * file (if HTAA_getCurrentProtection() returned + * NULL, i.e., if there is no "protect" rule + * but ACL exists, and we need to know default + * protection settings). + * This must not be free()'d. + * IMPORTANT: + * As a side-effect this tells the protection system that + * the file is in fact protected and sets the current + * protection mode to default. + */ +HTAAProt *HTAA_getDefaultProtection(void) { if (!current_prot) { current_prot = default_prot; @@ -552,28 +542,27 @@ HTAAProt *HTAA_getDefaultProtection (void) return current_prot; } - /* SERVER INTERNAL HTAA_clearProtections() -** CLEAR DOCUMENT PROTECTION MODE -** (ALSO DEFAULT PROTECTION) -** (called by the rule system) -** ON ENTRY: -** No arguments. -** -** ON EXIT: -** returns nothing. -** Frees the memory used by protection information. -*/ -void HTAA_clearProtections (void) + * CLEAR DOCUMENT PROTECTION MODE + * (ALSO DEFAULT PROTECTION) + * (called by the rule system) + * ON ENTRY: + * No arguments. + * + * ON EXIT: + * returns nothing. + * Frees the memory used by protection information. + */ +void HTAA_clearProtections(void) { - current_prot = NULL; /* These are not freed because */ - default_prot = NULL; /* they are actually in cache. */ + current_prot = NULL; /* These are not freed because */ + default_prot = NULL; /* they are actually in cache. */ } typedef struct { - char *name; - int user; - } USER_DATA; + char *name; + int user; +} USER_DATA; #ifndef NOUSERS static HTList *known_grp = NULL; @@ -582,10 +571,11 @@ static BOOL uidgid_cache_inited = NO; #endif #ifdef LY_FIND_LEAKS -static void clear_uidgid_cache (void) +static void clear_uidgid_cache(void) { #ifndef NOUSERS USER_DATA *data; + if (known_grp) { while ((data = HTList_removeLastObject(known_grp)) != NULL) { FREE(data->name); @@ -605,9 +595,10 @@ static void clear_uidgid_cache (void) #endif /* LY_FIND_LEAKS */ #ifndef NOUSERS -static void save_gid_info (char * name, int user) +static void save_gid_info(char *name, int user) { USER_DATA *data = typecalloc(USER_DATA); + if (!data) return; if (!known_grp) { @@ -621,14 +612,15 @@ static void save_gid_info (char * name, int user) } StrAllocCopy(data->name, name); data->user = user; - HTList_addObject (known_grp, data); + HTList_addObject(known_grp, data); } #endif /* NOUSERS */ #ifndef NOUSERS -static void save_uid_info (char * name, int user) +static void save_uid_info(char *name, int user) { USER_DATA *data = typecalloc(USER_DATA); + if (!data) return; if (!known_pwd) { @@ -642,36 +634,37 @@ static void save_uid_info (char * name, int user) } StrAllocCopy(data->name, name); data->user = user; - HTList_addObject (known_pwd, data); + HTList_addObject(known_pwd, data); } #endif /* !NOUSERS */ /* PUBLIC HTAA_UidToName -** GET THE USER NAME -** ON ENTRY: -** The user-id -** -** ON EXIT: -** returns the user name, or an empty string if not found. -*/ -char * HTAA_UidToName (int uid) + * GET THE USER NAME + * ON ENTRY: + * The user-id + * + * ON EXIT: + * returns the user name, or an empty string if not found. + */ +char *HTAA_UidToName(int uid) { #ifndef NOUSERS struct passwd *pw; HTList *me = known_pwd; while (HTList_nextObject(me)) { - USER_DATA *data = (USER_DATA *)(me->object); + USER_DATA *data = (USER_DATA *) (me->object); + if (uid == data->user) return data->name; } if ((pw = getpwuid(uid)) != 0 - && pw->pw_name != 0) { + && pw->pw_name != 0) { CTRACE((tfp, "%s(%d) returned (%s:%d:...)\n", - "HTAA_UidToName: getpwuid", - uid, - pw->pw_name, (int) pw->pw_uid)); + "HTAA_UidToName: getpwuid", + uid, + pw->pw_name, (int) pw->pw_uid)); save_uid_info(pw->pw_name, (int) pw->pw_uid); return pw->pw_name; } @@ -680,30 +673,31 @@ char * HTAA_UidToName (int uid) } /* PUBLIC HTAA_NameToUid -** GET THE USER ID -** ON ENTRY: -** The user-name -** -** ON EXIT: -** returns the user id, or NONESUCH if not found. -*/ -int HTAA_NameToUid (char * name) + * GET THE USER ID + * ON ENTRY: + * The user-name + * + * ON EXIT: + * returns the user id, or NONESUCH if not found. + */ +int HTAA_NameToUid(char *name) { #ifndef NOUSERS struct passwd *pw; HTList *me = known_pwd; while (HTList_nextObject(me)) { - USER_DATA *data = (USER_DATA *)(me->object); + USER_DATA *data = (USER_DATA *) (me->object); + if (!strcmp(name, data->name)) return data->user; } if ((pw = getpwnam(name)) != 0) { CTRACE((tfp, "%s(%s) returned (%s:%d:...)\n", - "HTAA_NameToUid: getpwnam", - name, - pw->pw_name, (int) pw->pw_uid)); + "HTAA_NameToUid: getpwnam", + name, + pw->pw_name, (int) pw->pw_uid)); save_uid_info(pw->pw_name, (int) pw->pw_uid); return (int) pw->pw_uid; } @@ -712,31 +706,32 @@ int HTAA_NameToUid (char * name) } /* PUBLIC HTAA_GidToName -** GET THE GROUP NAME -** ON ENTRY: -** The group-id -** -** ON EXIT: -** returns the group name, or an empty string if not found. -*/ -char * HTAA_GidToName (int gid) + * GET THE GROUP NAME + * ON ENTRY: + * The group-id + * + * ON EXIT: + * returns the group name, or an empty string if not found. + */ +char *HTAA_GidToName(int gid) { #ifndef NOUSERS struct group *gr; HTList *me = known_grp; while (HTList_nextObject(me)) { - USER_DATA *data = (USER_DATA *)(me->object); + USER_DATA *data = (USER_DATA *) (me->object); + if (gid == data->user) return data->name; } if ((gr = getgrgid(gid)) != 0 - && gr->gr_name != 0) { + && gr->gr_name != 0) { CTRACE((tfp, "%s(%d) returned (%s:%d:...)\n", - "HTAA_GidToName: getgrgid", - gid, - gr->gr_name, (int) gr->gr_gid)); + "HTAA_GidToName: getgrgid", + gid, + gr->gr_name, (int) gr->gr_gid)); save_gid_info(gr->gr_name, (int) gr->gr_gid); return gr->gr_name; } @@ -745,30 +740,31 @@ char * HTAA_GidToName (int gid) } /* PUBLIC HTAA_NameToGid -** GET THE GROUP ID -** ON ENTRY: -** The group-name -** -** ON EXIT: -** returns the group id, or NONESUCH if not found. -*/ -int HTAA_NameToGid (char * name) + * GET THE GROUP ID + * ON ENTRY: + * The group-name + * + * ON EXIT: + * returns the group id, or NONESUCH if not found. + */ +int HTAA_NameToGid(char *name) { #ifndef NOUSERS struct group *gr; HTList *me = known_grp; while (HTList_nextObject(me)) { - USER_DATA *data = (USER_DATA *)(me->object); + USER_DATA *data = (USER_DATA *) (me->object); + if (!strcmp(name, data->name)) return data->user; } if ((gr = getgrnam(name)) != 0) { CTRACE((tfp, "%s(%s) returned (%s:%d:...)\n", - "HTAA_NameToGid: getgrnam", - name, - gr->gr_name, (int) gr->gr_gid)); + "HTAA_NameToGid: getgrnam", + name, + gr->gr_name, (int) gr->gr_gid)); save_gid_info(gr->gr_name, (int) gr->gr_gid); return (int) gr->gr_gid; } |