/********************************************************************/

/**                     Microsoft LAN Manager                      **/

/** Copyright (c) 1987-2001 Microsoft Corporation, All Rights Reserved **/
/********************************************************************/

/********************************************************************
 *								    *
 *  About this file ...  ACCESS.H				    *
 *								    *
 *  This file contains information about the NetUser, NetGroup,     *
 *  NetAccess, and NetAccounts APIs.  There is a section for each   *
 *  set of APIs.  Each section contains:			    *
 *								    *
 *	Function prototypes.					    *
 *								    *
 *	Data structure templates.				    *
 *								    *
 *	Definition of special values.				    *
 *								    *
 *								    *
 *  NOTE:  You must include NETCONS.H before this file, since this  *
 *	   file	depends on values defined in NETCONS.H.		    *
 *								    *
 *	   This file is always included by LAN.H		    *
 *								    *
 ********************************************************************/




/****************************************************************
 *								*
 *	  	User Class			                *
 *								*
 ****************************************************************/

#if (defined( INCL_NETUSER ) || !defined( LAN_INCLUDED )) \
    && !defined( NETUSER_INCLUDED )

#define NETUSER_INCLUDED


/****************************************************************
 *								*
 *	  	Function prototypes - USER			*
 *								*
 ****************************************************************/

extern API_FUNCTION
  NetUserAdd ( const char far * pszServer,
               short            sLevel,
               char far *       pbBuffer,
               unsigned short   cbBuffer );

extern API_FUNCTION
  NetUserDel ( const char far * pszServer,
               char far *       pszUserName );

extern API_FUNCTION
  NetUserEnum ( const char far *     pszServer,
                short                sLevel,
                char far *           pbBuffer,
                unsigned short       cbBuffer,
                unsigned short far * pcEntriesRead,
                unsigned short far * pcTotalAvail );

extern API_FUNCTION
  NetUserGetInfo ( const char far *     pszServer,
                   char far *           pszUserName,
                   short                sLevel,
                   char far *           pbBuffer,
                   unsigned short       cbBuffer,
                   unsigned short far * pcbTotalAvail );

extern API_FUNCTION
  NetUserSetInfo ( const char far * pszServer,
                   char far *       pszUserName,
                   short            sLevel,
                   char far *       pbBuffer,
                   unsigned short   cbBuffer,
                   short            sParmNum );

extern API_FUNCTION
  NetUserPasswordSet ( const char far * pszServer,
                       char far *       pszUserName,
                       char far *       pszOldPassword,
                       char far *       pszNewPassword );

extern API_FUNCTION
  NetUserGetGroups ( const char far *     pszServer,
                     const char far *     pszUserName,
                     short                sLevel,
                     char far *           pbBuffer,
                     unsigned short       cbBuffer,
                     unsigned short far * pcEntriesRead,
                     unsigned short far * pcTotalAvail );

extern API_FUNCTION
  NetUserSetGroups ( const char far * pszServer,
                     const char far * pszUserName,
                     short            sLevel,
                     char far *       pbBuffer,
                     unsigned short   cbBuffer,
                     unsigned short   cEntries );

extern API_FUNCTION
  NetUserModalsGet ( const char far *     pszServer,
                     short                sLevel,
                     char far *           pbBuffer,
                     unsigned short       cbBuffer,
                     unsigned short far * pcbTotalAvail );

extern API_FUNCTION
  NetUserModalsSet ( const char far * pszServer,
                     short            sLevel,
                     char far *       pbBuffer,
                     unsigned short   cbBuffer,
                     short            sParmNum );

extern API_FUNCTION
  NetUserValidate ( char far *           pszReserved,
                    char far *           pszUserName,
                    char far *           pszPassword,
                    unsigned short far * pusPrivilege );

extern API_FUNCTION
  NetUserValidate2 ( char far *           pszReserved1,
                     short                sLevel,
                     char far *           pbBuffer,
                     unsigned short       cbBuffer,
                     unsigned short       usReserved2,
                     unsigned short far * pcbTotalAvail );



/****************************************************************
 *								*
 *              Data structure templates - USER			*
 *								*
 ****************************************************************/

struct user_info_0 {
	char usri0_name[UNLEN+1];
};	/* user_info_0 */

struct user_info_1 {
	char 		usri1_name[UNLEN+1];
    	char 		usri1_pad_1;
    	char 		usri1_password[ENCRYPTED_PWLEN];/* See note below */
    	long 		usri1_password_age;
    	unsigned short 	usri1_priv;			/* See values below */
    	char far *	usri1_home_dir;
    	char far *	usri1_comment;
    	unsigned short 	usri1_flags;			/* See values below */
    	char far *	usri1_script_path;
};	/* user_info_1 */

/*
 *	NOTE:  The maximum length of a user password is PWLEN.  The
 *	field usri1_password contains extra room for transporting
 *	the encrypted form of the password over the network.  When
 *	setting the user's password, check length vs. PWLEN, not
 *	the size of this field.  PWLEN is defined in NETCONS.H.
 */



struct user_info_2 {
    	char           	usri2_name[UNLEN+1];
    	char           	usri2_pad_1;
    	char           	usri2_password[ENCRYPTED_PWLEN];
    	long           	usri2_password_age;
    	unsigned short 	usri2_priv;
    	char far *     	usri2_home_dir;
    	char far *     	usri2_comment;
    	unsigned short 	usri2_flags;
    	char far *     	usri2_script_path;
    	unsigned long 	usri2_auth_flags;
    	char far *     	usri2_full_name;
    	char far *     	usri2_usr_comment;
    	char far *     	usri2_parms;
    	char far *     	usri2_workstations;
    	long	   	usri2_last_logon;
    	long	   	usri2_last_logoff;
    	long  	   	usri2_acct_expires;
    	unsigned long  	usri2_max_storage;
    	unsigned short 	usri2_units_per_week;
    	unsigned char far *   	usri2_logon_hours;
    	unsigned short 	usri2_bad_pw_count;
    	unsigned short 	usri2_num_logons;
	char far *	usri2_logon_server;
    	unsigned short 	usri2_country_code;
    	unsigned short 	usri2_code_page;
};	/* user_info_2 */


struct user_info_10 {
    	char           	usri10_name[UNLEN+1];
    	char           	usri10_pad_1;
    	char far *     	usri10_comment;
    	char far *     	usri10_usr_comment;
    	char far *     	usri10_full_name;
};	/* user_info_10 */

struct user_info_11 {
    	char           	usri11_name[UNLEN+1];
    	char           	usri11_pad_1;
    	char far *     	usri11_comment;
    	char far *     	usri11_usr_comment;
    	char far *     	usri11_full_name;
	unsigned short	usri11_priv;
    	unsigned long 	usri11_auth_flags;
    	long           	usri11_password_age;
    	char far *     	usri11_home_dir;
    	char far *     	usri11_parms;
    	long  	   	usri11_last_logon;
    	long  	   	usri11_last_logoff;
    	unsigned short 	usri11_bad_pw_count;
    	unsigned short 	usri11_num_logons;
	char far *	usri11_logon_server;
    	unsigned short 	usri11_country_code;
	char far *	usri11_workstations;
    	unsigned long 	usri11_max_storage;
    	unsigned short 	usri11_units_per_week;
	char far *	usri11_logon_hours;
	unsigned short	usri11_code_page;
};	/* user_info_11 */

/*
 *	For User Modals
*/

struct	user_modals_info_0 {
	unsigned short	usrmod0_min_passwd_len;
	unsigned long	usrmod0_max_passwd_age;
	unsigned long	usrmod0_min_passwd_age;
	unsigned long	usrmod0_force_logoff;
	unsigned short	usrmod0_password_hist_len;
	unsigned short	usrmod0_reserved1;
};	/* user_modals_info_0 */


struct	user_modals_info_1 {
	unsigned short	usrmod1_role;
	char far *	usrmod1_primary;
};	/* user_modals_info_1 */



/*
 *	For User Logon Validation
*/

struct user_logon_req_1 {
	char		usrreq1_name[UNLEN+1];
	char		usrreq1_pad_1;
	char		usrreq1_password[SESSION_PWLEN];
	char far *	usrreq1_workstation;
};	/* user_logon_req_1 */
	

struct user_logon_info_0 {
    	char      	usrlog0_eff_name[UNLEN+1];
    	char      	usrlog0_pad_1;
};	/* user_logon_info_0 */

struct user_logon_info_1 {
    	unsigned short 	usrlog1_code;
    	char           	usrlog1_eff_name[UNLEN+1];
    	char      	usrlog1_pad_1;
    	unsigned short 	usrlog1_priv;
    	unsigned long  	usrlog1_auth_flags;
    	unsigned short 	usrlog1_num_logons;
    	unsigned short 	usrlog1_bad_pw_count;
    	unsigned long 	usrlog1_last_logon;
    	unsigned long 	usrlog1_last_logoff;
    	unsigned long  	usrlog1_logoff_time;
    	unsigned long  	usrlog1_kickoff_time;
    	long           	usrlog1_password_age;
    	unsigned long  	usrlog1_pw_can_change;
    	unsigned long  	usrlog1_pw_must_change;
    	char far *     	usrlog1_computer;
    	char far *     	usrlog1_domain;
    	char far *     	usrlog1_script_path;
    	unsigned long  	usrlog1_reserved1;
};	/* user_logon_info_1 */


struct user_logon_info_2 {
    	char           	usrlog2_eff_name[UNLEN+1];
    	char      	usrlog2_pad_1;
    	char far *     	usrlog2_computer;
    	char far *     	usrlog2_full_name;
    	char far *     	usrlog2_usrcomment;
    	unsigned long 	usrlog2_logon_time;
};	/* user_logon_info_2 */



struct user_logoff_req_1 {
	char		usrlfreq1_name[UNLEN+1];
	char		usrlfreq1_pad_1;
	char		usrlfreq1_workstation[CNLEN+1];
};	/* user_logoff_req_1 */
	
struct user_logoff_info_1 {
	unsigned short	usrlogf1_code;
	unsigned long	usrlogf1_duration;
	unsigned short	usrlogf1_num_logons;
};	/* user_logoff_info_1 */

/****************************************************************
 *								*
 *	  	Special values and constants - USER		*
 *								*
 ****************************************************************/


/*
 *	Bit masks for field usriX_flags of user_info_X (X = 0/1).
 */

#define		UF_SCRIPT		0x1
#define 	UF_ACCOUNTDISABLE	0x2
#define 	UF_DELETE_PROHIBITED	0x4
#define 	UF_HOMEDIR_REQUIRED	0x8
#define         UF_LOCKOUT              0x10
#define 	UF_PASSWD_NOTREQD	0x20
#define 	UF_PASSWD_CANT_CHANGE	0x40

/*
 *	Bit masks for field usri2_auth_flags of user_info_2.
*/

#define		AF_OP_PRINT		0x1
#define		AF_OP_COMM		0x2
#define		AF_OP_SERVER		0x4
#define		AF_OP_ACCOUNTS		0x8


/*
 *	UAS role manifests under NETLOGON
 */
#define		UAS_ROLE_STANDALONE	0
#define		UAS_ROLE_MEMBER		1
#define		UAS_ROLE_BACKUP		2
#define		UAS_ROLE_PRIMARY	3

/*
 *	Values for parmnum for NetUserSetInfo.
 */

/* LM1.0 style */
#define 	U1_ALL			0
#define 	U1_NAME			1
#define 	U1_PAD			2
#define 	U1_PASSWD		3
#define 	U1_PASSWDAGE		4
#define 	U1_PRIV			5
#define 	U1_DIR			6
#define 	U1_COMMENT		7
#define 	U1_USER_FLAGS		8
#define 	U1_SCRIPT_PATH		9


/* LM2.0 style */
#ifndef  PARMNUM_ALL
#define		PARMNUM_ALL		0
#endif

#define		PARMNUM_NAME		1
#define 	PARMNUM_PAD		2
#define 	PARMNUM_PASSWD		3
#define 	PARMNUM_PASSWDAGE	4
#define 	PARMNUM_PRIV		5
#define 	PARMNUM_DIR		6
#define 	PARMNUM_COMMENT		7
#define 	PARMNUM_USER_FLAGS	8
#define 	PARMNUM_SCRIPT_PATH	9
#define		PARMNUM_AUTH_FLAGS	10
#define		PARMNUM_FULL_NAME	11
#define		PARMNUM_USR_COMMENT	12
#define		PARMNUM_PARMS		13
#define		PARMNUM_WORKSTATIONS	14
#define		PARMNUM_LAST_LOGON	15
#define		PARMNUM_LAST_LOGOFF	16
#define		PARMNUM_ACCT_EXPIRES	17
#define		PARMNUM_MAX_STORAGE	18
#define		PARMNUM_UNITS_PER_WEEK	19
#define		PARMNUM_LOGON_HOURS	20
#define		PARMNUM_BADPW_COUNT	21
#define		PARMNUM_NUM_LOGONS	22
#define		PARMNUM_LOGON_SERVER	23
#define		PARMNUM_COUNTRY_CODE	24
#define		PARMNUM_CODE_PAGE	25

/*
 *	For SetInfo call (parmnum 0) when password change not required
 */
#define 	NULL_USERSETINFO_PASSWD 	"              "



#define		TIMEQ_FOREVER			((unsigned long) -1L)
#define		USER_MAXSTORAGE_UNLIMITED	((unsigned long) -1L)
#define		USER_NO_LOGOFF			((unsigned long) -1L)
#define		UNITS_PER_DAY			24
#define		UNITS_PER_WEEK			UNITS_PER_DAY * 7


/*
 *	Privilege levels (user_info_X field usriX_priv (X = 0/1)).
 */
#define		USER_PRIV_MASK		0x3
#define 	USER_PRIV_GUEST		0
#define 	USER_PRIV_USER		1
#define 	USER_PRIV_ADMIN		2

/*
 *	user modals related defaults
 */
#define		MAX_PASSWD_LEN		PWLEN
#define 	DEF_MIN_PWLEN		6
#define		DEF_PWUNIQUENESS	5
#define		DEF_MAX_PWHIST		8
#define		DEF_MAX_PWAGE		TIMEQ_FOREVER              /* forever */
#define		DEF_MIN_PWAGE		(unsigned long) 0L         /* 0 days */
#define		DEF_FORCE_LOGOFF	(unsigned long) 0xffffffff /* never */
#define		DEF_MAX_BADPW		0			   /* no limit*/
#define		ONE_DAY			(unsigned long) 01*24*3600 /* 01 day  */
/*
 *	User Logon Validation (codes returned)
*/
#define		VALIDATED_LOGON		0
#define 	PASSWORD_EXPIRED	2
#define 	NON_VALIDATED_LOGON	3

#define		VALID_LOGOFF		1


/*
 *	parmnum manifests for user modals
*/

#define		MODAL0_PARMNUM_ALL		0
#define		MODAL0_PARMNUM_MIN_LEN		1
#define		MODAL0_PARMNUM_MAX_AGE		2
#define		MODAL0_PARMNUM_MIN_AGE		3
#define		MODAL0_PARMNUM_FORCEOFF		4
#define		MODAL0_PARMNUM_HISTLEN		5
#define		MODAL0_PARMNUM_RESERVED1	6

#define		MODAL1_PARMNUM_ALL		0
#define		MODAL1_PARMNUM_ROLE		1
#define		MODAL1_PARMNUM_PRIMARY		2


#endif /* NETUSER_INCLUDED */


/****************************************************************
 *								*
 *	  	Group Class			                *
 *								*
 ****************************************************************/

#if (defined( INCL_NETGROUP ) || !defined( LAN_INCLUDED )) \
    && !defined( NETGROUP_INCLUDED )

#define NETGROUP_INCLUDED


/****************************************************************
 *								*
 *	  	Function prototypes - GROUP			*
 *								*
 ****************************************************************/

extern API_FUNCTION
  NetGroupAdd ( const char far * pszServer,
                short            sLevel,
                char far *       pbBuffer,
                unsigned short   cbBuffer );

extern API_FUNCTION
  NetGroupDel ( const char far * pszServer,
                char far *       pszGroupName );

extern API_FUNCTION
  NetGroupEnum ( const char far *     pszServer,
                 short                sLevel,
                 char far *           pbBuffer,
                 unsigned short       cbBuffer,
                 unsigned short far * pcEntriesRead,
                 unsigned short far * pcTotalAvail );

extern API_FUNCTION
  NetGroupAddUser ( const char far * pszServer,
                    char far *       pszGroupName,
                    char far *       pszUserName );

extern API_FUNCTION
  NetGroupDelUser ( const char far * pszServer,
                    char far *       pszGroupName,
                    char far *       pszUserName );

extern API_FUNCTION
  NetGroupGetUsers ( const char far *     pszServer,
                     const char far *     pszGroupName,
                     short                sLevel,
                     char far *           pbBuffer,
                     unsigned short       cbBuffer,
                     unsigned short far * pcEntriesRead,
                     unsigned short far * pcTotalAvail );

extern API_FUNCTION
  NetGroupSetUsers ( const char far * pszServer,
                     const char far * pszGroupName,
                     short            sLevel,
                     char far *       pbBuffer,
                     unsigned short   cbBuffer,
                     unsigned short   cEntries );

extern API_FUNCTION
  NetGroupGetInfo ( const char far *     pszServer,
                    char far *           pszGroupName,
                    short                sLevel,
                    char far *           pbBuffer,
                    unsigned short       cbBuffer,
                    unsigned short far * pcbTotalAvail );

extern API_FUNCTION
  NetGroupSetInfo ( const char far * pszServer,
                    char far *       pszGroupName,
                    short            sLevel,
                    char far *       pbBuffer,
                    unsigned short   cbBuffer,
                    short            sParmNum );


/****************************************************************
 *                                                              *
 *             Data structure templates - GROUP                 *
 *                                                              *
 ****************************************************************/


struct group_info_0 {
    	char 		grpi0_name[GNLEN+1];
};	/* group_info_0 */

struct group_info_1 {
    	char      	grpi1_name[GNLEN+1];
    	char      	grpi1_pad;
    	char far *	grpi1_comment;
};	/* group_info_1 */

struct group_users_info_0 {
    	char 		grui0_name[UNLEN+1];
};	/* group_users_info_0 */



/****************************************************************
 *								*
 *	  	Special values and constants - GROUP		*
 *								*
 ****************************************************************/

#define		GROUPIDMASK	0x8000	/* MSB set if uid refers to a group */

/*
 * 	Predefined group for all normal users, administrators and guests
 *	LOCAL is a special group for pinball local security.
*/

#define 	GROUP_SPECIALGRP_USERS		"USERS"
#define 	GROUP_SPECIALGRP_ADMINS		"ADMINS"
#define 	GROUP_SPECIALGRP_GUESTS		"GUESTS"
#define 	GROUP_SPECIALGRP_LOCAL		"LOCAL"


/*
 *	parmnum manifests for SetInfo calls (only comment is settable)
*/

#define		GRP1_PARMNUM_ALL	0
#define		GRP1_PARMNUM_NAME	1
#define		GRP1_PARMNUM_COMMENT	2

#endif /* NETGROUP_INCLUDED */

/****************************************************************
 *                                                              *
 *                 Access Class                                 *
 *                                                              *
 ****************************************************************/

#if (defined( INCL_NETACCESS ) || !defined( LAN_INCLUDED )) \
    && !defined( NETACCESS_INCLUDED )

#define NETACCESS_INCLUDED


/****************************************************************
 *                                                              *
 *                  Function prototypes - ACCESS                *
 *                                                              *
 ****************************************************************/

extern API_FUNCTION
  NetAccessAdd ( const char far * pszServer,
                 short            sLevel,
                 char far *       pbBuffer,
                 unsigned short   cbBuffer );

extern API_FUNCTION
  NetAccessCheck ( char far *           pszReserved,
                   char far *           pszUserName,
                   char far *           pszResource,
                   unsigned short       usOperation,
                   unsigned short far * pusResult );

extern API_FUNCTION
  NetAccessDel ( const char far * pszServer,
                 char far *       pszResource );

extern API_FUNCTION
  NetAccessEnum ( const char far *     pszServer,
                  char far *           pszBasePath,
                  short                fsRecursive,
                  short                sLevel,
                  char far *           pbBuffer,
                  unsigned short       cbBuffer,
                  unsigned short far * pcEntriesRead,
                  unsigned short far * pcTotalAvail );

extern API_FUNCTION
  NetAccessGetInfo ( const char far *     pszServer,
                     char far *           pszResource,
                     short                sLevel,
                     char far *           pbBuffer,
                     unsigned short       cbBuffer,
                     unsigned short far * pcbTotalAvail );

extern API_FUNCTION
  NetAccessSetInfo ( const char far * pszServer,
                     char far *       pszResource,
                     short            sLevel,
                     char far *       pbBuffer,
                     unsigned short   cbBuffer,
                     short            sParmNum );

extern API_FUNCTION
  NetAccessGetUserPerms ( char far *           pszServer,
                          char far *           pszUgName,
                          char far *           pszResource,
                          unsigned short far * pusPerms );


/****************************************************************
 *								*
 *	  	Data structure templates - ACCESS		*
 *								*
 ****************************************************************/

struct access_list {
    	char   		acl_ugname[UNLEN+1];
    	char   		acl_ugname_pad_1;
    	short  		acl_access;
};	/* access_list */

struct access_info_0 {
    	char far * 	acc0_resource_name;
};	/* access_info_0 */

struct access_info_1 {
    	char  far * 	acc1_resource_name;
    	short 		acc1_attr; 		  	/* See values below */
    	short 		acc1_count;
};	/* access_info_1 */

/****************************************************************
 *								*
 *	  	Special values and constants - ACCESS		*
 *								*
 ****************************************************************/

/*
 *	Maximum number of permission entries for each resource.
 */

#define MAXPERMENTRIES  64


/*
 *	Bit values for the access permissions.  ACCESS_ALL is a handy
 *	way to specify maximum permissions.  These are used in
 *	acl_access field of access_list structures.
 */
#define		ACCESS_NONE	0
#define 	ACCESS_ALL     (ACCESS_READ|ACCESS_WRITE|ACCESS_CREATE|ACCESS_EXEC|ACCESS_DELETE|ACCESS_ATRIB|ACCESS_PERM)
#define 	ACCESS_READ   	0x1
#define 	ACCESS_WRITE  	0x2
#define 	ACCESS_CREATE 	0x4
#define 	ACCESS_EXEC   	0x8
#define 	ACCESS_DELETE 	0x10
#define 	ACCESS_ATRIB  	0x20
#define 	ACCESS_PERM   	0x40

#define 	ACCESS_GROUP  	0x8000

/*
 *	Bit values for the acc1_attr field of the access_info_1 structure.
 *      Only one bit is currently defined.
 */

#define 	ACCESS_AUDIT		0x1

/*
 *	Parmnum value for NetAccessSetInfo.
 */

#define 	ACCESS_ATTR_PARMNUM 	2


/*
 *	ACCESS_LETTERS defines a letter for each bit position in
 *	the acl_access field of struct access_list.  Note that some
 *	bits have a corresponding letter of ' ' (space).
 */

#define 	ACCESS_LETTERS 		"RWCXDAP         "


#endif /* NETACCESS_INCLUDED */

/****************************************************************
 *								*
 *	  	Domain Class			                *
 *								*
 ****************************************************************/

#if (defined( INCL_NETDOMAIN ) || !defined( LAN_INCLUDED )) \
    && !defined( NETDOMAIN_INCLUDED )

#define NETDOMAIN_INCLUDED


/****************************************************************
 *                                                              *
 *                  Function prototypes - DOMAIN                *
 *                                                              *
 ****************************************************************/

extern API_FUNCTION
  NetGetDCName ( const char far * pszServer,
                 const char far * pszDomain,
                 char far *       pbBuffer,
                 unsigned short   cbBuffer );

extern API_FUNCTION
  NetLogonEnum ( const char far *     pszServer,
                 short                sLevel,
                 char far *           pbBuffer,
                 unsigned short       cbBuffer,
                 unsigned short far * pcEntriesRead,
                 unsigned short far * pcTotalAvail );


/****************************************************************
 *								*
 *	  	Special values and constants - DOMAIN		*
 *								*
 ****************************************************************/

#define		LOGON_INFO_UNKNOWN	-1


#endif /* NETDOMAIN_INCLUDED */

/****************************************************************
 *								*
 *	  	Accounts Class			                *
 *								*
 ****************************************************************/

#if (defined( INCL_NETACCOUNTS ) || !defined( LAN_INCLUDED )) \
    && !defined( NETACCOUNTS_INCLUDED )

#define NETACCOUNTS_INCLUDED

/****************************************************************
 *								*
 *	  	Function prototypes - ACCOUNTS			*
 *								*
 ****************************************************************/

extern API_FUNCTION
  NetAccountsReplicate( char far * pszServer,
			unsigned long	 ulReserved );

#endif /* NETACCOUNTS_INCLUDED */