# Group File Routines

    #ifndef HTGROUP_H
    #define HTGROUP_H

    #include "HTUtils.h"
    #include "HTList.h"

    #ifdef SHORT_NAMES
    #define HTAApGrD	HTAA_parseGroupDef
    #define HTAArGrR	HTAA_resolveGroupReferences
    #define HTAApGrD	HTAA_printGroupDef
    #define HTAAGD_d	GroupDef_delete
    #define HTAAuIIG	HTAA_userAndInetInGroup
    #endif /* SHORT_NAMES */

    typedef HTList GroupDefList;
    typedef HTList ItemList;

    typedef struct {
        char *	group_name;
        ItemList *	item_list;
    } GroupDef;

    /*
    ** Access Authorization failure reasons
    */
    typedef enum {
        HTAA_OK,		/* 200 OK				*/
        HTAA_OK_GATEWAY,	/* 200 OK, acting as a gateway		*/
        HTAA_NO_AUTH,	/* 401 Unauthorized, not authenticated	*/
        HTAA_NOT_MEMBER,	/* 401 Unauthorized, not authorized	*/
        HTAA_IP_MASK,	/* 403 Forbidden by IP mask		*/
        HTAA_BY_RULE,	/* 403 Forbidden by rule		*/
        HTAA_NO_ACL,	/* 403 Forbidden, ACL non-existent	*/
        HTAA_NO_ENTRY,	/* 403 Forbidden, no ACL entry		*/
        HTAA_SETUP_ERROR,	/* 403 Forbidden, server setup error	*/
        HTAA_DOTDOT,	/* 403 Forbidden, URL with /../ illegal	*/
        HTAA_HTBIN,		/* 403 Forbidden, /htbin not enabled	*/
        HTAA_NOT_FOUND	/* 404 Not found, or read protected	*/
    } HTAAFailReason;

## Group definition grammar

string
  "sequence of alphanumeric characters"
user_name
  string
group_name
  string
group_ref
  group_name
user_def
  user_name | group_ref
user_def_list
  user_def { ',' user_def }
user_part
  user_def | '(' user_def_list ')'
templ
  "sequence of alphanumeric characters and '*'s"
ip_number_mask
  templ '.' templ '.' templ '.' templ
domain_name_mask
  templ { '.' templ }
address
  ip_number_mask | domain_name_mask
address_def
  address
address_def_list
  address_def { ',' address_def }
address_part
  address_def | '(' address_def_list ')'
item
  [user_part] ['@' address_part]
item_list
  item { ',' item }
group_def
  item_list
group_decl
  group_name ':' group_def

### Parse Group Definition

    PUBLIC GroupDef *HTAA_parseGroupDef PARAMS((FILE * fp));

## Fill in Pointers to referenced Group Definitions in a Group Definition

References to groups (by their name) are resolved from `group_def_list` and pointers to those structures are added to `group_def.`

    PUBLIC void HTAA_resolveGroupReferences PARAMS((GroupDef *     group_def,
    						GroupDefList * group_def_list));

## Read Group File (and do caching)

If group file is already in cache returns a pointer to previously read group definition list.

    PUBLIC GroupDefList *HTAA_readGroupFile PARAMS((CONST char * filename));

## Delete Group Definition

Groups in cache should never be freed by this function. This should only be used to free group definitions read by `HTAA_parseGroupDef.`

    PUBLIC void GroupDef_delete PARAMS((GroupDef * group_def));

## Print Out Group Definition (for trace purposes)

    PUBLIC void HTAA_printGroupDef PARAMS((GroupDef * group_def));

## Does a User Belong to a Given Set of Groups

This function checks both the username and the internet address.

    /* PUBLIC					HTAA_userAndInetInGroup()
    **		CHECK IF USER BELONGS TO TO A GIVEN GROUP
    **		AND THAT THE CONNECTION COMES FROM AN
    **		ADDRESS THAT IS ALLOWED BY THAT GROUP
    ** ON ENTRY:
    **	group		the group definition structure.
    **	username	connecting user.
    **	ip_number	browser host IP number, optional.
    **	ip_name		browser host IP name, optional.
    **			However, one of ip_number or ip_name
    **			must be given.
    ** ON EXIT:
    **	returns		HTAA_IP_MASK, if IP address mask was
    **			reason for failing.
    **			HTAA_NOT_MEMBER, if user does not belong
    **			to the group.
    **			HTAA_OK if both IP address and user are ok.
    */
    PUBLIC HTAAFailReason HTAA_userAndInetInGroup PARAMS((GroupDef * group,
    						      char *     username,
    						      char *     ip_number,
    						      char *     ip_name));

    #endif /* not HTGROUP_H */

End of file HTGroup.h.