2006-08-31 16:26:32 +00:00
# ifndef _INCLUDE_ADS_H_
# define _INCLUDE_ADS_H_
2001-11-20 11:32:16 +00:00
/*
header for ads ( active directory ) library routines
basically this is a wrapper around ldap
*/
2009-06-12 14:27:19 +02:00
# include "../libds/common/flags.h"
2006-05-18 16:08:28 +00:00
enum wb_posix_mapping {
2006-06-27 01:03:58 +00:00
WB_POSIX_MAP_UNKNOWN = - 1 ,
2006-05-18 16:08:28 +00:00
WB_POSIX_MAP_TEMPLATE = 0 ,
WB_POSIX_MAP_SFU = 1 ,
2007-06-26 09:15:37 +00:00
WB_POSIX_MAP_SFU20 = 2 ,
WB_POSIX_MAP_RFC2307 = 3 ,
WB_POSIX_MAP_UNIXINFO = 4
2006-05-18 16:08:28 +00:00
} ;
2007-07-17 10:13:53 +00:00
/* there are 5 possible types of errors the ads subsystem can produce */
enum ads_error_type { ENUM_ADS_ERROR_KRB5 , ENUM_ADS_ERROR_GSS ,
ENUM_ADS_ERROR_LDAP , ENUM_ADS_ERROR_SYSTEM , ENUM_ADS_ERROR_NT } ;
typedef struct {
enum ads_error_type error_type ;
union err_state {
int rc ;
NTSTATUS nt_status ;
} err ;
/* For error_type = ENUM_ADS_ERROR_GSS minor_status describe GSS API error */
/* Where rc represents major_status of GSS API error */
int minor_status ;
} ADS_STATUS ;
struct ads_struct ;
struct ads_saslwrap_ops {
const char * name ;
2007-07-17 11:14:42 +00:00
ADS_STATUS ( * wrap ) ( struct ads_struct * , uint8 * buf , uint32 len ) ;
2007-07-17 10:13:53 +00:00
ADS_STATUS ( * unwrap ) ( struct ads_struct * ) ;
2007-07-18 08:15:42 +00:00
void ( * disconnect ) ( struct ads_struct * ) ;
2007-07-17 10:13:53 +00:00
} ;
2007-07-18 07:45:16 +00:00
enum ads_saslwrap_type {
ADS_SASLWRAP_TYPE_PLAIN = 1 ,
ADS_SASLWRAP_TYPE_SIGN = 2 ,
ADS_SASLWRAP_TYPE_SEAL = 4
2007-07-25 08:09:34 +00:00
} ;
2007-07-18 07:45:16 +00:00
2007-07-17 10:13:53 +00:00
typedef struct ads_struct {
2004-03-22 22:49:40 +00:00
int is_mine ; /* do I own this structure's memory? */
2002-08-17 17:00:51 +00:00
/* info needed to find the server */
struct {
char * realm ;
char * workgroup ;
char * ldap_server ;
2008-06-27 10:22:39 -04:00
int foreign ; /* set to 1 if connecting to a foreign
* realm */
bool gc ; /* Is this a global catalog server? */
2002-08-17 17:00:51 +00:00
} server ;
/* info needed to authenticate */
struct {
char * realm ;
char * password ;
char * user_name ;
char * kdc_server ;
2002-09-25 15:19:00 +00:00
unsigned flags ;
int time_offset ;
2007-02-08 17:02:39 +00:00
time_t tgt_expire ;
time_t tgs_expire ;
2006-02-03 22:19:41 +00:00
time_t renewable ;
2002-08-17 17:00:51 +00:00
} auth ;
/* info derived from the servers config */
struct {
2006-08-31 01:20:21 +00:00
uint32 flags ; /* cldap flags identifying the services. */
2002-08-17 17:00:51 +00:00
char * realm ;
char * bind_path ;
char * ldap_server_name ;
2006-08-31 04:14:08 +00:00
char * server_site_name ;
char * client_site_name ;
2002-09-25 15:19:00 +00:00
time_t current_time ;
2007-07-11 13:32:57 +00:00
char * schema_path ;
char * config_path ;
2002-08-17 17:00:51 +00:00
} config ;
2007-07-16 11:08:00 +00:00
/* info about the current LDAP connection */
2007-07-16 15:31:01 +00:00
# ifdef HAVE_LDAP
2007-07-16 11:08:00 +00:00
struct {
LDAP * ld ;
2007-10-24 14:16:54 -07:00
struct sockaddr_storage ss ; /* the ip of the active connection, if any */
2007-07-16 11:08:00 +00:00
time_t last_attempt ; /* last attempt to reconnect */
int port ;
2007-07-16 14:35:33 +00:00
2007-07-18 07:45:16 +00:00
enum ads_saslwrap_type wrap_type ;
2007-07-16 16:08:24 +00:00
# ifdef HAVE_LDAP_SASL_WRAPPING
2007-07-16 14:35:33 +00:00
Sockbuf_IO_Desc * sbiod ; /* lowlevel state for LDAP wrapping */
2007-07-18 07:45:16 +00:00
# endif /* HAVE_LDAP_SASL_WRAPPING */
2007-07-17 10:13:53 +00:00
TALLOC_CTX * mem_ctx ;
const struct ads_saslwrap_ops * wrap_ops ;
void * wrap_private_data ;
struct {
uint32 ofs ;
uint32 needed ;
uint32 left ;
2007-08-02 17:41:47 +00:00
# define ADS_SASL_WRAPPING_IN_MAX_WRAPPED 0x0FFFFFFF
uint32 max_wrapped ;
uint32 min_wrapped ;
2007-07-17 10:13:53 +00:00
uint32 size ;
uint8 * buf ;
} in ;
struct {
uint32 ofs ;
uint32 left ;
2007-08-02 17:41:47 +00:00
# define ADS_SASL_WRAPPING_OUT_MAX_WRAPPED 0x00A00000
uint32 max_unwrapped ;
2007-07-17 11:14:42 +00:00
uint32 sig_size ;
2007-07-17 10:13:53 +00:00
uint32 size ;
uint8 * buf ;
} out ;
2007-07-16 11:08:00 +00:00
} ldap ;
2007-07-16 16:08:24 +00:00
# endif /* HAVE_LDAP */
2007-01-24 01:48:08 +00:00
} ADS_STRUCT ;
2005-06-29 14:03:53 +00:00
2007-01-24 01:48:08 +00:00
/* used to remember the names of the posix attributes in AD */
/* see the rfc2307 & sfu nss backends */
struct posix_schema {
char * posix_homedir_attr ;
char * posix_shell_attr ;
char * posix_uidnumber_attr ;
char * posix_gidnumber_attr ;
char * posix_gecos_attr ;
* Allow an admin to define the "uid" attribute for a RFC2307
user object in AD to be the username alias.
For example:
$ net ads search "(uid=coffeedude)"
distinguishedName: CN=Gerald W. Carter,CN=Users,DC=pink,DC=plainjoe,DC=org
sAMAccountName: gcarter
memberOf: CN=UnixUsers,CN=Users,DC=pink,DC=plainjoe,DC=org
memberOf: CN=Domain Admins,CN=Users,DC=pink,DC=plainjoe,DC=org
memberOf: CN=Enterprise Admins,CN=Users,DC=pink,DC=plainjoe,DC=org
memberOf: CN=Schema Admins,CN=Users,DC=pink,DC=plainjoe,DC=org
uid: coffeedude
uidNumber: 10000
gidNumber: 10000
unixHomeDirectory: /home/gcarter
loginShell: /bin/bash
$ ssh coffeedude@192.168.56.91
Password:
coffeedude@orville:~$ id
uid=10000(coffeedude) gid=10000(PINK\unixusers) groups=10000(PINK\unixusers)
$ getent passwd PINK\\gcarter
coffeedude:*:10000:10000::/home/gcarter:/bin/bash
$ getent passwd coffeedude
coffeedude:*:10000:10000::/home/gcarter:/bin/bash
$ getent group PINK\\Unixusers
PINK\unixusers:x:10000:coffeedude
2008-09-16 10:35:21 -07:00
char * posix_uid_attr ;
2007-01-24 01:48:08 +00:00
} ;
2005-06-29 14:03:53 +00:00
2001-11-20 11:32:16 +00:00
2001-12-19 12:21:12 +00:00
2002-02-11 15:48:34 +00:00
# ifdef HAVE_ADS
typedef LDAPMod * * ADS_MODLIST ;
# else
typedef void * * ADS_MODLIST ;
# endif
2001-12-19 12:21:12 +00:00
/* macros to simplify error returning */
2002-09-25 15:19:00 +00:00
# define ADS_ERROR(rc) ADS_ERROR_LDAP(rc)
2004-01-09 14:54:33 +00:00
# define ADS_ERROR_LDAP(rc) ads_build_error(ENUM_ADS_ERROR_LDAP, rc, 0)
# define ADS_ERROR_SYSTEM(rc) ads_build_error(ENUM_ADS_ERROR_SYSTEM, rc?rc:EINVAL, 0)
# define ADS_ERROR_KRB5(rc) ads_build_error(ENUM_ADS_ERROR_KRB5, rc, 0)
# define ADS_ERROR_GSS(rc, minor) ads_build_error(ENUM_ADS_ERROR_GSS, rc, minor)
# define ADS_ERROR_NT(rc) ads_build_nt_error(ENUM_ADS_ERROR_NT,rc)
2001-12-19 12:21:12 +00:00
2004-01-09 14:54:33 +00:00
# define ADS_ERR_OK(status) ((status.error_type == ENUM_ADS_ERROR_NT) ? NT_STATUS_IS_OK(status.err.nt_status):(status.err.rc == 0))
2001-12-19 12:21:12 +00:00
# define ADS_SUCCESS ADS_ERROR(0)
2001-11-20 11:32:16 +00:00
2006-05-18 16:08:28 +00:00
# define ADS_ERROR_HAVE_NO_MEMORY(x) do { \
if ( ! ( x ) ) { \
return ADS_ERROR ( LDAP_NO_MEMORY ) ; \
} \
} while ( 0 )
2001-12-05 09:19:25 +00:00
/* time between reconnect attempts */
# define ADS_RECONNECT_TIME 5
2002-04-10 13:25:40 +00:00
/* ldap control oids */
2005-06-29 14:03:53 +00:00
# define ADS_PAGE_CTL_OID "1.2.840.113556.1.4.319"
# define ADS_NO_REFERRALS_OID "1.2.840.113556.1.4.1339"
# define ADS_SERVER_SORT_OID "1.2.840.113556.1.4.473"
# define ADS_PERMIT_MODIFY_OID "1.2.840.113556.1.4.1413"
2006-02-03 22:19:41 +00:00
# define ADS_ASQ_OID "1.2.840.113556.1.4.1504"
2006-05-18 19:34:25 +00:00
# define ADS_EXTENDED_DN_OID "1.2.840.113556.1.4.529"
2007-06-26 09:15:37 +00:00
# define ADS_SD_FLAGS_OID "1.2.840.113556.1.4.801"
2005-06-29 14:03:53 +00:00
2007-06-26 09:15:37 +00:00
/* ldap attribute oids (Services for Unix 3.0, 3.5) */
2005-06-29 14:03:53 +00:00
# define ADS_ATTR_SFU_UIDNUMBER_OID "1.2.840.113556.1.6.18.1.310"
# define ADS_ATTR_SFU_GIDNUMBER_OID "1.2.840.113556.1.6.18.1.311"
# define ADS_ATTR_SFU_HOMEDIR_OID "1.2.840.113556.1.6.18.1.344"
# define ADS_ATTR_SFU_SHELL_OID "1.2.840.113556.1.6.18.1.312"
2006-02-23 14:28:41 +00:00
# define ADS_ATTR_SFU_GECOS_OID "1.2.840.113556.1.6.18.1.337"
* Allow an admin to define the "uid" attribute for a RFC2307
user object in AD to be the username alias.
For example:
$ net ads search "(uid=coffeedude)"
distinguishedName: CN=Gerald W. Carter,CN=Users,DC=pink,DC=plainjoe,DC=org
sAMAccountName: gcarter
memberOf: CN=UnixUsers,CN=Users,DC=pink,DC=plainjoe,DC=org
memberOf: CN=Domain Admins,CN=Users,DC=pink,DC=plainjoe,DC=org
memberOf: CN=Enterprise Admins,CN=Users,DC=pink,DC=plainjoe,DC=org
memberOf: CN=Schema Admins,CN=Users,DC=pink,DC=plainjoe,DC=org
uid: coffeedude
uidNumber: 10000
gidNumber: 10000
unixHomeDirectory: /home/gcarter
loginShell: /bin/bash
$ ssh coffeedude@192.168.56.91
Password:
coffeedude@orville:~$ id
uid=10000(coffeedude) gid=10000(PINK\unixusers) groups=10000(PINK\unixusers)
$ getent passwd PINK\\gcarter
coffeedude:*:10000:10000::/home/gcarter:/bin/bash
$ getent passwd coffeedude
coffeedude:*:10000:10000::/home/gcarter:/bin/bash
$ getent group PINK\\Unixusers
PINK\unixusers:x:10000:coffeedude
2008-09-16 10:35:21 -07:00
# define ADS_ATTR_SFU_UID_OID "1.2.840.113556.1.6.18.1.309"
2002-04-10 13:25:40 +00:00
2007-06-26 09:15:37 +00:00
/* ldap attribute oids (Services for Unix 2.0) */
# define ADS_ATTR_SFU20_UIDNUMBER_OID "1.2.840.113556.1.4.7000.187.70"
# define ADS_ATTR_SFU20_GIDNUMBER_OID "1.2.840.113556.1.4.7000.187.71"
# define ADS_ATTR_SFU20_HOMEDIR_OID "1.2.840.113556.1.4.7000.187.106"
# define ADS_ATTR_SFU20_SHELL_OID "1.2.840.113556.1.4.7000.187.72"
# define ADS_ATTR_SFU20_GECOS_OID "1.2.840.113556.1.4.7000.187.97"
* Allow an admin to define the "uid" attribute for a RFC2307
user object in AD to be the username alias.
For example:
$ net ads search "(uid=coffeedude)"
distinguishedName: CN=Gerald W. Carter,CN=Users,DC=pink,DC=plainjoe,DC=org
sAMAccountName: gcarter
memberOf: CN=UnixUsers,CN=Users,DC=pink,DC=plainjoe,DC=org
memberOf: CN=Domain Admins,CN=Users,DC=pink,DC=plainjoe,DC=org
memberOf: CN=Enterprise Admins,CN=Users,DC=pink,DC=plainjoe,DC=org
memberOf: CN=Schema Admins,CN=Users,DC=pink,DC=plainjoe,DC=org
uid: coffeedude
uidNumber: 10000
gidNumber: 10000
unixHomeDirectory: /home/gcarter
loginShell: /bin/bash
$ ssh coffeedude@192.168.56.91
Password:
coffeedude@orville:~$ id
uid=10000(coffeedude) gid=10000(PINK\unixusers) groups=10000(PINK\unixusers)
$ getent passwd PINK\\gcarter
coffeedude:*:10000:10000::/home/gcarter:/bin/bash
$ getent passwd coffeedude
coffeedude:*:10000:10000::/home/gcarter:/bin/bash
$ getent group PINK\\Unixusers
PINK\unixusers:x:10000:coffeedude
2008-09-16 10:35:21 -07:00
# define ADS_ATTR_SFU20_UID_OID "1.2.840.113556.1.4.7000.187.102"
2007-06-26 09:15:37 +00:00
2006-05-18 16:08:28 +00:00
/* ldap attribute oids (RFC2307) */
# define ADS_ATTR_RFC2307_UIDNUMBER_OID "1.3.6.1.1.1.1.0"
# define ADS_ATTR_RFC2307_GIDNUMBER_OID "1.3.6.1.1.1.1.1"
# define ADS_ATTR_RFC2307_HOMEDIR_OID "1.3.6.1.1.1.1.3"
# define ADS_ATTR_RFC2307_SHELL_OID "1.3.6.1.1.1.1.4"
# define ADS_ATTR_RFC2307_GECOS_OID "1.3.6.1.1.1.1.2"
* Allow an admin to define the "uid" attribute for a RFC2307
user object in AD to be the username alias.
For example:
$ net ads search "(uid=coffeedude)"
distinguishedName: CN=Gerald W. Carter,CN=Users,DC=pink,DC=plainjoe,DC=org
sAMAccountName: gcarter
memberOf: CN=UnixUsers,CN=Users,DC=pink,DC=plainjoe,DC=org
memberOf: CN=Domain Admins,CN=Users,DC=pink,DC=plainjoe,DC=org
memberOf: CN=Enterprise Admins,CN=Users,DC=pink,DC=plainjoe,DC=org
memberOf: CN=Schema Admins,CN=Users,DC=pink,DC=plainjoe,DC=org
uid: coffeedude
uidNumber: 10000
gidNumber: 10000
unixHomeDirectory: /home/gcarter
loginShell: /bin/bash
$ ssh coffeedude@192.168.56.91
Password:
coffeedude@orville:~$ id
uid=10000(coffeedude) gid=10000(PINK\unixusers) groups=10000(PINK\unixusers)
$ getent passwd PINK\\gcarter
coffeedude:*:10000:10000::/home/gcarter:/bin/bash
$ getent passwd coffeedude
coffeedude:*:10000:10000::/home/gcarter:/bin/bash
$ getent group PINK\\Unixusers
PINK\unixusers:x:10000:coffeedude
2008-09-16 10:35:21 -07:00
# define ADS_ATTR_RFC2307_UID_OID "0.9.2342.19200300.100.1.1"
2006-05-18 16:08:28 +00:00
2005-10-21 12:50:39 +00:00
/* ldap bitwise searches */
# define ADS_LDAP_MATCHING_RULE_BIT_AND "1.2.840.113556.1.4.803"
# define ADS_LDAP_MATCHING_RULE_BIT_OR "1.2.840.113556.1.4.804"
2002-08-17 17:00:51 +00:00
# define ADS_PINGS 0x0000FFFF /* Ping response */
# define ADS_DNS_CONTROLLER 0x20000000 /* DomainControllerName is a DNS name*/
# define ADS_DNS_DOMAIN 0x40000000 /* DomainName is a DNS name */
# define ADS_DNS_FOREST 0x80000000 /* DnsForestName is a DNS name */
2002-09-25 15:19:00 +00:00
/* ads auth control flags */
2008-06-24 12:11:06 +02:00
# define ADS_AUTH_DISABLE_KERBEROS 0x0001
# define ADS_AUTH_NO_BIND 0x0002
# define ADS_AUTH_ANON_BIND 0x0004
# define ADS_AUTH_SIMPLE_BIND 0x0008
# define ADS_AUTH_ALLOW_NTLMSSP 0x0010
# define ADS_AUTH_SASL_SIGN 0x0020
# define ADS_AUTH_SASL_SEAL 0x0040
# define ADS_AUTH_SASL_FORCE 0x0080
# define ADS_AUTH_USER_CREDS 0x0100
2003-02-24 02:55:00 +00:00
/* Kerberos environment variable names */
# define KRB5_ENV_CCNAME "KRB5CCNAME"
2003-03-17 22:45:16 +00:00
/* Heimdal uses a slightly different name */
# if defined(HAVE_ENCTYPE_ARCFOUR_HMAC_MD5)
# define ENCTYPE_ARCFOUR_HMAC ENCTYPE_ARCFOUR_HMAC_MD5
# endif
2003-03-17 22:58:24 +00:00
/* The older versions of heimdal that don't have this
define don ' t seem to use it anyway . I ' m told they
always use a subkey */
2003-08-27 20:22:12 +00:00
# ifndef HAVE_AP_OPTS_USE_SUBKEY
2003-03-17 22:58:24 +00:00
# define AP_OPTS_USE_SUBKEY 0
# endif
2004-10-06 16:21:35 +00:00
# define WELL_KNOWN_GUID_COMPUTERS "AA312825768811D1ADED00C04FD8D5CD"
# define WELL_KNOWN_GUID_USERS "A9D1CA15768811D1ADED00C04FD8D5CD"
2006-04-25 12:24:25 +00:00
# ifndef KRB5_ADDR_NETBIOS
# define KRB5_ADDR_NETBIOS 0x14
# endif
r16336: Fix Klocwork ID's 1087, 1095, 1096, 1098, 1099, 1101, 1102, 1105, 1107, 1109,
1111
Volker
(This used to be commit def075baf873b24c522d09ddc0141d84431a1fae)
2006-06-18 07:54:06 +00:00
# ifndef KRB5KRB_ERR_RESPONSE_TOO_BIG
# define KRB5KRB_ERR_RESPONSE_TOO_BIG (-1765328332L)
# endif
2006-04-25 12:53:38 +00:00
# ifdef HAVE_KRB5
2006-04-25 12:24:25 +00:00
typedef struct {
# if defined(HAVE_MAGIC_IN_KRB5_ADDRESS) && defined(HAVE_ADDRTYPE_IN_KRB5_ADDRESS) /* MIT */
krb5_address * * addrs ;
2006-04-25 12:53:38 +00:00
# elif defined(HAVE_KRB5_ADDRESSES) /* Heimdal */
2006-04-25 12:24:25 +00:00
krb5_addresses * addrs ;
2006-04-25 12:53:38 +00:00
# else
# error UNKNOWN_KRB5_ADDRESS_TYPE
2008-08-29 11:38:02 +02:00
# endif /* defined(HAVE_MAGIC_IN_KRB5_ADDRESS) && defined(HAVE_ADDRTYPE_IN_KRB5_ADDRESS) */
2006-04-25 12:24:25 +00:00
} smb_krb5_addresses ;
2006-05-18 19:34:25 +00:00
2008-08-22 16:08:00 +02:00
# ifdef HAVE_KRB5_KEYBLOCK_KEYVALUE /* Heimdal */
# define KRB5_KEY_TYPE(k) ((k)->keytype)
# define KRB5_KEY_LENGTH(k) ((k)->keyvalue.length)
# define KRB5_KEY_DATA(k) ((k)->keyvalue.data)
# define KRB5_KEY_DATA_CAST void
# else /* MIT */
2008-08-22 14:52:10 +02:00
# define KRB5_KEY_TYPE(k) ((k)->enctype)
2008-08-22 16:08:00 +02:00
# define KRB5_KEY_LENGTH(k) ((k)->length)
# define KRB5_KEY_DATA(k) ((k)->contents)
# define KRB5_KEY_DATA_CAST krb5_octet
# endif /* HAVE_KRB5_KEYBLOCK_KEYVALUE */
2008-08-22 14:52:10 +02:00
# ifdef HAVE_KRB5_KEYTAB_ENTRY_KEY /* MIT */
# define KRB5_KT_KEY(k) (&(k)->key)
# elif HAVE_KRB5_KEYTAB_ENTRY_KEYBLOCK /* Heimdal */
# define KRB5_KT_KEY(k) (&(k)->keyblock)
# else
# error krb5_keytab_entry has no key or keyblock member
2008-08-29 11:38:02 +02:00
# endif /* HAVE_KRB5_KEYTAB_ENTRY_KEY */
# endif /* HAVE_KRB5 */
2008-08-22 14:52:10 +02:00
2006-05-18 19:34:25 +00:00
enum ads_extended_dn_flags {
ADS_EXTENDED_DN_HEX_STRING = 0 ,
ADS_EXTENDED_DN_STRING = 1 /* not supported on win2k */
} ;
/* this is probably not very well suited to pass other controls generically but
* is good enough for the extended dn control where it is only used for atm */
typedef struct {
const char * control ;
int val ;
int critical ;
} ads_control ;
2007-07-11 09:39:08 +00:00
2007-08-30 15:39:51 +00:00
# define ADS_IGNORE_PRINCIPAL "not_defined_in_RFC4178@please_ignore"
2007-05-14 09:50:39 +00:00
# endif /* _INCLUDE_ADS_H_ */