/*                                   PROTECTION SETUP FILE

 */

#ifndef HTAAPROT_H
#define HTAAPROT_H

#include <HTGroup.h>
#include <HTAssoc.h>

/*

Server's Representation of Document (Tree) Protections

 */

typedef struct {
    char *        template;     /* Template for this protection         */
    char *        filename;     /* Current document file                */
    char *        uid_name;     /* Effective uid (name of it)           */
    char *        gid_name;     /* Effective gid (name of it)           */
    GroupDef *    mask_group;   /* Allowed users and IP addresses       */
    HTList *      valid_schemes;/* Valid authentication schemes         */
    HTAssocList * values;       /* Association list for scheme specific */
                                /* parameters.                          */
} HTAAProt;
/*

Callbacks for rule system

   The following three functioncs are called by the rule system:

      HTAA_clearProtections() when starting to translate a filename

      HTAA_setDefaultProtection() when "defprot" rule is matched

      HTAA_setCurrentProtection() when "protect" rule is matched

   Protection setup files are cached by these functions.

 */

/* 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)
**      eff_ids         contains user and group names separated by
**                      a dot, corresponding to the effective 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.
*/
extern void HTAA_setDefaultProtection PARAMS((CONST char *      cur_docname,
                                              CONST char *      prot_filename,
                                              CONST char *      eff_ids));



/* 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)
**      eff_ids         contains user and group names separated by
**                      a dot, corresponding to the effective 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.
*/
extern void HTAA_setCurrentProtection PARAMS((CONST char *      cur_docname,
                                              CONST char *      prot_filename,
                                              CONST char *      eff_ids));


/* 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.
*/
extern void HTAA_clearProtections NOPARAMS;
/*

Getting Protection Settings

      HTAA_getCurrentProtection() returns the current protection mode (if there was a
      "protect" rule). NULL, if no "protect" rule has been matched.

      HTAA_getDefaultProtection() sets the current protection mode to what it was set to
      by "defprot" rule and also returns it (therefore after this call also
      HTAA_getCurrentProtection() returns the same structure.

 */

/* 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.
*/
extern HTAAProt *HTAA_getCurrentProtection NOPARAMS;



/* PUBLIC                                       HTAA_getDefaultProtection()
**              GET DEFAULT PROTECTION SETUP STRUCTURE
**              (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.
*/
extern HTAAProt *HTAA_getDefaultProtection NOPARAMS;
/*

Get User and Group IDs to Which Set to

 */

#ifndef 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).
*/
extern int HTAA_getUid NOPARAMS;


/* 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).
*/
extern int HTAA_getGid NOPARAMS;
#endif /* not VMS */
/*

   For VMS:

 */

#ifdef VMS
/* PUBLIC                                                       HTAA_getUidName()
**              GET THE USER ID NAME (VMS ONLY)
** ON ENTRY:
**      No arguments.
**
** ON EXIT:
**      returns the user name
**              Default is "" (nobody).
*/
extern char * HTAA_getUidName NOPARAMS;

/* PUBLIC                                                       HTAA_getFileName
**              GET THE FILENAME (VMS ONLY)
** ON ENTRY:
**      No arguments.
**
** ON EXIT:
**      returns the filename
*/
extern char * HTAA_getFileName NOPARAMS;
#endif /* VMS */

/* PUBLIC                                                       HTAA_UidToName
**              GET THE USER NAME
** ON ENTRY:
**      The user-id
**
** ON EXIT:
**      returns the user name
*/
extern char * HTAA_UidToName PARAMS((int uid));
/* PUBLIC                                                       HTAA_NameToUid
**              GET THE USER ID
** ON ENTRY:
**      The user-name
**
** ON EXIT:
**      returns the user id
*/
extern int HTAA_NameToUid PARAMS((char *name));
/* PUBLIC                                                       HTAA_GidToName
**              GET THE GROUP NAME
** ON ENTRY:
**      The group-id
**
** ON EXIT:
**      returns the group name
*/
extern char * HTAA_GidToName PARAMS((int gid));
/* PUBLIC                                                       HTAA_NameToGid
**              GET THE GROUP ID
** ON ENTRY:
**      The group-name
**
** ON EXIT:
**      returns the group id
*/
extern int HTAA_NameToGid PARAMS((char *name));

#endif /* not HTAAPROT_H */
