2006-08-31 20:26:32 +04:00
# ifndef _INCLUDE_ADS_H_
# define _INCLUDE_ADS_H_
2001-11-20 14:32:16 +03:00
/*
header for ads ( active directory ) library routines
basically this is a wrapper around ldap
*/
2009-06-12 16:27:19 +04:00
# include "../libds/common/flags.h"
2009-09-17 02:21:01 +04:00
# define TOK_ID_KRB_AP_REQ ((const uint8_t *)"\x01\x00")
# define TOK_ID_KRB_AP_REP ((const uint8_t *)"\x02\x00")
# define TOK_ID_KRB_ERROR ((const uint8_t *)"\x03\x00")
# define TOK_ID_GSS_GETMIC ((const uint8_t *)"\x01\x01")
# define TOK_ID_GSS_WRAP ((const uint8_t *)"\x02\x01")
2006-05-18 20:08:28 +04:00
enum wb_posix_mapping {
2006-06-27 05:03:58 +04:00
WB_POSIX_MAP_UNKNOWN = - 1 ,
2006-05-18 20:08:28 +04:00
WB_POSIX_MAP_TEMPLATE = 0 ,
WB_POSIX_MAP_SFU = 1 ,
2007-06-26 13:15:37 +04:00
WB_POSIX_MAP_SFU20 = 2 ,
WB_POSIX_MAP_RFC2307 = 3 ,
WB_POSIX_MAP_UNIXINFO = 4
2006-05-18 20:08:28 +04:00
} ;
2007-07-17 14:13:53 +04: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 15:14:42 +04:00
ADS_STATUS ( * wrap ) ( struct ads_struct * , uint8 * buf , uint32 len ) ;
2007-07-17 14:13:53 +04:00
ADS_STATUS ( * unwrap ) ( struct ads_struct * ) ;
2007-07-18 12:15:42 +04:00
void ( * disconnect ) ( struct ads_struct * ) ;
2007-07-17 14:13:53 +04:00
} ;
2007-07-18 11:45:16 +04:00
enum ads_saslwrap_type {
ADS_SASLWRAP_TYPE_PLAIN = 1 ,
ADS_SASLWRAP_TYPE_SIGN = 2 ,
ADS_SASLWRAP_TYPE_SEAL = 4
2007-07-25 12:09:34 +04:00
} ;
2007-07-18 11:45:16 +04:00
2007-07-17 14:13:53 +04:00
typedef struct ads_struct {
2004-03-23 01:49:40 +03:00
int is_mine ; /* do I own this structure's memory? */
2002-08-17 21:00:51 +04:00
/* info needed to find the server */
struct {
char * realm ;
char * workgroup ;
char * ldap_server ;
2008-06-27 18: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 21:00:51 +04:00
} server ;
/* info needed to authenticate */
struct {
char * realm ;
char * password ;
char * user_name ;
char * kdc_server ;
2002-09-25 19:19:00 +04:00
unsigned flags ;
int time_offset ;
2007-02-08 20:02:39 +03:00
time_t tgt_expire ;
time_t tgs_expire ;
2006-02-04 01:19:41 +03:00
time_t renewable ;
2002-08-17 21:00:51 +04:00
} auth ;
/* info derived from the servers config */
struct {
2006-08-31 05:20:21 +04:00
uint32 flags ; /* cldap flags identifying the services. */
2002-08-17 21:00:51 +04:00
char * realm ;
char * bind_path ;
char * ldap_server_name ;
2006-08-31 08:14:08 +04:00
char * server_site_name ;
char * client_site_name ;
2002-09-25 19:19:00 +04:00
time_t current_time ;
2007-07-11 17:32:57 +04:00
char * schema_path ;
char * config_path ;
2002-08-17 21:00:51 +04:00
} config ;
2007-07-16 15:08:00 +04:00
/* info about the current LDAP connection */
2007-07-16 19:31:01 +04:00
# ifdef HAVE_LDAP
2007-07-16 15:08:00 +04:00
struct {
LDAP * ld ;
2007-10-25 01:16:54 +04:00
struct sockaddr_storage ss ; /* the ip of the active connection, if any */
2007-07-16 15:08:00 +04:00
time_t last_attempt ; /* last attempt to reconnect */
int port ;
2007-07-16 18:35:33 +04:00
2007-07-18 11:45:16 +04:00
enum ads_saslwrap_type wrap_type ;
2007-07-16 20:08:24 +04:00
# ifdef HAVE_LDAP_SASL_WRAPPING
2007-07-16 18:35:33 +04:00
Sockbuf_IO_Desc * sbiod ; /* lowlevel state for LDAP wrapping */
2007-07-18 11:45:16 +04:00
# endif /* HAVE_LDAP_SASL_WRAPPING */
2007-07-17 14:13:53 +04: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 21:41:47 +04:00
# define ADS_SASL_WRAPPING_IN_MAX_WRAPPED 0x0FFFFFFF
uint32 max_wrapped ;
uint32 min_wrapped ;
2007-07-17 14:13:53 +04:00
uint32 size ;
uint8 * buf ;
} in ;
struct {
uint32 ofs ;
uint32 left ;
2007-08-02 21:41:47 +04:00
# define ADS_SASL_WRAPPING_OUT_MAX_WRAPPED 0x00A00000
uint32 max_unwrapped ;
2007-07-17 15:14:42 +04:00
uint32 sig_size ;
2007-07-17 14:13:53 +04:00
uint32 size ;
uint8 * buf ;
} out ;
2007-07-16 15:08:00 +04:00
} ldap ;
2007-07-16 20:08:24 +04:00
# endif /* HAVE_LDAP */
2007-01-24 04:48:08 +03:00
} ADS_STRUCT ;
2005-06-29 18:03:53 +04:00
2007-01-24 04:48:08 +03: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 21:35:21 +04:00
char * posix_uid_attr ;
2007-01-24 04:48:08 +03:00
} ;
2005-06-29 18:03:53 +04:00
2001-11-20 14:32:16 +03:00
2001-12-19 15:21:12 +03:00
2002-02-11 18:48:34 +03:00
# ifdef HAVE_ADS
typedef LDAPMod * * ADS_MODLIST ;
# else
typedef void * * ADS_MODLIST ;
# endif
2001-12-19 15:21:12 +03:00
/* macros to simplify error returning */
2002-09-25 19:19:00 +04:00
# define ADS_ERROR(rc) ADS_ERROR_LDAP(rc)
2004-01-09 17:54:33 +03: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 15:21:12 +03:00
2004-01-09 17:54:33 +03: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 15:21:12 +03:00
# define ADS_SUCCESS ADS_ERROR(0)
2001-11-20 14:32:16 +03:00
2006-05-18 20:08:28 +04:00
# define ADS_ERROR_HAVE_NO_MEMORY(x) do { \
if ( ! ( x ) ) { \
return ADS_ERROR ( LDAP_NO_MEMORY ) ; \
} \
} while ( 0 )
2001-12-05 12:19:25 +03:00
/* time between reconnect attempts */
# define ADS_RECONNECT_TIME 5
2002-04-10 17:25:40 +04:00
/* ldap control oids */
2005-06-29 18:03:53 +04: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-04 01:19:41 +03:00
# define ADS_ASQ_OID "1.2.840.113556.1.4.1504"
2006-05-18 23:34:25 +04:00
# define ADS_EXTENDED_DN_OID "1.2.840.113556.1.4.529"
2007-06-26 13:15:37 +04:00
# define ADS_SD_FLAGS_OID "1.2.840.113556.1.4.801"
2005-06-29 18:03:53 +04:00
2007-06-26 13:15:37 +04:00
/* ldap attribute oids (Services for Unix 3.0, 3.5) */
2005-06-29 18:03:53 +04: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 17:28:41 +03: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 21:35:21 +04:00
# define ADS_ATTR_SFU_UID_OID "1.2.840.113556.1.6.18.1.309"
2002-04-10 17:25:40 +04:00
2007-06-26 13:15:37 +04: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 21:35:21 +04:00
# define ADS_ATTR_SFU20_UID_OID "1.2.840.113556.1.4.7000.187.102"
2007-06-26 13:15:37 +04:00
2006-05-18 20:08:28 +04: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 21:35:21 +04:00
# define ADS_ATTR_RFC2307_UID_OID "0.9.2342.19200300.100.1.1"
2006-05-18 20:08:28 +04:00
2005-10-21 16:50:39 +04: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 21:00:51 +04:00
# define ADS_PINGS 0x0000FFFF /* Ping response */
2002-09-25 19:19:00 +04:00
/* ads auth control flags */
2008-06-24 14:11:06 +04: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 05:55:00 +03:00
/* Kerberos environment variable names */
# define KRB5_ENV_CCNAME "KRB5CCNAME"
2003-03-18 01:45:16 +03: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-18 01:58:24 +03: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-28 00:22:12 +04:00
# ifndef HAVE_AP_OPTS_USE_SUBKEY
2003-03-18 01:58:24 +03:00
# define AP_OPTS_USE_SUBKEY 0
# endif
2004-10-06 20:21:35 +04:00
# define WELL_KNOWN_GUID_COMPUTERS "AA312825768811D1ADED00C04FD8D5CD"
# define WELL_KNOWN_GUID_USERS "A9D1CA15768811D1ADED00C04FD8D5CD"
2006-04-25 16:24:25 +04: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 11:54:06 +04:00
# ifndef KRB5KRB_ERR_RESPONSE_TOO_BIG
# define KRB5KRB_ERR_RESPONSE_TOO_BIG (-1765328332L)
# endif
2006-04-25 16:53:38 +04:00
# ifdef HAVE_KRB5
2006-04-25 16:24:25 +04:00
typedef struct {
# if defined(HAVE_MAGIC_IN_KRB5_ADDRESS) && defined(HAVE_ADDRTYPE_IN_KRB5_ADDRESS) /* MIT */
krb5_address * * addrs ;
2006-04-25 16:53:38 +04:00
# elif defined(HAVE_KRB5_ADDRESSES) /* Heimdal */
2006-04-25 16:24:25 +04:00
krb5_addresses * addrs ;
2006-04-25 16:53:38 +04:00
# else
# error UNKNOWN_KRB5_ADDRESS_TYPE
2008-08-29 13:38:02 +04:00
# endif /* defined(HAVE_MAGIC_IN_KRB5_ADDRESS) && defined(HAVE_ADDRTYPE_IN_KRB5_ADDRESS) */
2006-04-25 16:24:25 +04:00
} smb_krb5_addresses ;
2006-05-18 23:34:25 +04:00
2008-08-22 18:08:00 +04: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 16:52:10 +04:00
# define KRB5_KEY_TYPE(k) ((k)->enctype)
2008-08-22 18:08:00 +04: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 16:52:10 +04: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 13:38:02 +04:00
# endif /* HAVE_KRB5_KEYTAB_ENTRY_KEY */
# endif /* HAVE_KRB5 */
2008-08-22 16:52:10 +04:00
2006-05-18 23:34:25 +04: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 13:39:08 +04:00
2007-08-30 19:39:51 +04:00
# define ADS_IGNORE_PRINCIPAL "not_defined_in_RFC4178@please_ignore"
2007-05-14 13:50:39 +04:00
# endif /* _INCLUDE_ADS_H_ */