ypldap.h revision 290935
1290931Srodrigc/* $OpenBSD: ypldap.h,v 1.16 2015/01/16 06:40:22 deraadt Exp $ */ 2290931Srodrigc/* $FreeBSD: head/usr.sbin/ypldap/ypldap.h 290935 2015-11-16 17:02:34Z rodrigc $ */ 3290931Srodrigc 4290931Srodrigc/* 5290931Srodrigc * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org> 6290931Srodrigc * 7290931Srodrigc * Permission to use, copy, modify, and distribute this software for any 8290931Srodrigc * purpose with or without fee is hereby granted, provided that the above 9290931Srodrigc * copyright notice and this permission notice appear in all copies. 10290931Srodrigc * 11290931Srodrigc * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12290931Srodrigc * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13290931Srodrigc * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14290931Srodrigc * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15290931Srodrigc * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16290931Srodrigc * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17290931Srodrigc * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18290931Srodrigc */ 19290931Srodrigc 20290931Srodrigc#include <imsg.h> 21290931Srodrigc 22290931Srodrigc#define YPLDAP_USER "_ypldap" 23290931Srodrigc#define YPLDAP_CONF_FILE "/etc/ypldap.conf" 24290931Srodrigc#define DEFAULT_INTERVAL 600 25290931Srodrigc#define LINE_WIDTH 1024 26290931Srodrigc#define FILTER_WIDTH 128 27290931Srodrigc#define ATTR_WIDTH 32 28290931Srodrigc 29290931Srodrigc#define MAX_SERVERS_DNS 8 30290931Srodrigc 31290931Srodrigcenum imsg_type { 32290931Srodrigc IMSG_NONE, 33290931Srodrigc IMSG_CONF_START, 34290931Srodrigc IMSG_CONF_IDM, 35290931Srodrigc IMSG_CONF_END, 36290931Srodrigc IMSG_START_UPDATE, 37290931Srodrigc IMSG_END_UPDATE, 38290931Srodrigc IMSG_TRASH_UPDATE, 39290931Srodrigc IMSG_PW_ENTRY, 40290931Srodrigc IMSG_GRP_ENTRY, 41290931Srodrigc IMSG_HOST_DNS 42290931Srodrigc}; 43290931Srodrigc 44290931Srodrigcstruct ypldap_addr { 45290931Srodrigc struct ypldap_addr *next; 46290931Srodrigc struct sockaddr_storage ss; 47290931Srodrigc}; 48290931Srodrigc 49290931Srodrigcenum { 50290931Srodrigc PROC_MAIN, 51290931Srodrigc PROC_CLIENT 52290931Srodrigc} ypldap_process; 53290931Srodrigc 54290931Srodrigcstruct userent { 55290931Srodrigc RB_ENTRY(userent) ue_name_node; 56290931Srodrigc RB_ENTRY(userent) ue_uid_node; 57290931Srodrigc uid_t ue_uid; 58290931Srodrigc char *ue_line; 59290931Srodrigc char *ue_netid_line; 60290931Srodrigc gid_t ue_gid; 61290931Srodrigc}; 62290931Srodrigc 63290931Srodrigcstruct groupent { 64290931Srodrigc RB_ENTRY(groupent) ge_name_node; 65290931Srodrigc RB_ENTRY(groupent) ge_gid_node; 66290931Srodrigc gid_t ge_gid; 67290931Srodrigc char *ge_line; 68290931Srodrigc}; 69290931Srodrigc 70290931Srodrigcenum client_state { 71290931Srodrigc STATE_NONE, 72290931Srodrigc STATE_DNS_INPROGRESS, 73290931Srodrigc STATE_DNS_TEMPFAIL, 74290931Srodrigc STATE_DNS_DONE, 75290931Srodrigc STATE_LDAP_FAIL, 76290931Srodrigc STATE_LDAP_DONE 77290931Srodrigc}; 78290931Srodrigc 79290931Srodrigc/* 80290931Srodrigc * beck, djm, dlg: pay attention to the struct name 81290931Srodrigc */ 82290931Srodrigcstruct idm { 83290931Srodrigc TAILQ_ENTRY(idm) idm_entry; 84290931Srodrigc u_int32_t idm_id; 85290935Srodrigc char idm_name[MAXHOSTNAMELEN]; 86290931Srodrigc#define F_SSL 0x00100000 87290931Srodrigc#define F_CONFIGURING 0x00200000 88290931Srodrigc#define F_NEEDAUTH 0x00400000 89290931Srodrigc#define F_FIXED_ATTR(n) (1<<n) 90290931Srodrigc#define F_LIST(n) (1<<n) 91290931Srodrigc enum client_state idm_state; 92290931Srodrigc u_int32_t idm_flags; /* lower 20 reserved */ 93290931Srodrigc u_int32_t idm_list; 94290931Srodrigc struct ypldap_addr *idm_addr; 95290931Srodrigc in_port_t idm_port; 96290931Srodrigc char idm_binddn[LINE_WIDTH]; 97290931Srodrigc char idm_bindcred[LINE_WIDTH]; 98290931Srodrigc char idm_basedn[LINE_WIDTH]; 99290931Srodrigc char idm_groupdn[LINE_WIDTH]; 100290931Srodrigc#define FILTER_USER 1 101290931Srodrigc#define FILTER_GROUP 0 102290931Srodrigc char idm_filters[2][FILTER_WIDTH]; 103290931Srodrigc#define ATTR_NAME 0 104290931Srodrigc#define ATTR_PASSWD 1 105290931Srodrigc#define ATTR_UID 2 106290931Srodrigc#define ATTR_GID 3 107290931Srodrigc#define ATTR_CLASS 4 108290931Srodrigc#define ATTR_CHANGE 5 109290931Srodrigc#define ATTR_EXPIRE 6 110290931Srodrigc#define ATTR_GECOS 7 111290931Srodrigc#define ATTR_DIR 8 112290931Srodrigc#define ATTR_SHELL 9 113290931Srodrigc#define ATTR_GR_NAME 10 114290931Srodrigc#define ATTR_GR_PASSWD 11 115290931Srodrigc#define ATTR_GR_GID 12 116290931Srodrigc#define ATTR_GR_MEMBERS 13 117290931Srodrigc#define ATTR_MAX 10 118290931Srodrigc#define ATTR_GR_MIN 10 119290931Srodrigc#define ATTR_GR_MAX 14 120290931Srodrigc char idm_attrs[14][ATTR_WIDTH]; 121290931Srodrigc struct env *idm_env; 122290931Srodrigc struct event idm_ev; 123290931Srodrigc#ifdef SSL 124290931Srodrigc struct ssl *idm_ssl; 125290931Srodrigc#endif 126290931Srodrigc}; 127290931Srodrigc 128290931Srodrigcstruct idm_req { 129290931Srodrigc union { 130290931Srodrigc uid_t ik_uid; 131290931Srodrigc uid_t ik_gid; 132290931Srodrigc } ir_key; 133290931Srodrigc char ir_line[LINE_WIDTH]; 134290931Srodrigc}; 135290931Srodrigc 136290931Srodrigcstruct imsgev { 137290931Srodrigc struct imsgbuf ibuf; 138290931Srodrigc void (*handler)(int, short, void *); 139290931Srodrigc struct event ev; 140290931Srodrigc void *data; 141290931Srodrigc short events; 142290931Srodrigc}; 143290931Srodrigc 144290931Srodrigcstruct env { 145290931Srodrigc#define YPLDAP_OPT_VERBOSE 0x01 146290931Srodrigc#define YPLDAP_OPT_NOACTION 0x02 147290931Srodrigc u_int8_t sc_opts; 148290931Srodrigc#define YPMAP_PASSWD_BYNAME 0x00000001 149290931Srodrigc#define YPMAP_PASSWD_BYUID 0x00000002 150290931Srodrigc#define YPMAP_MASTER_PASSWD_BYNAME 0x00000004 151290931Srodrigc#define YPMAP_MASTER_PASSWD_BYUID 0x00000008 152290931Srodrigc#define YPMAP_GROUP_BYNAME 0x00000010 153290931Srodrigc#define YPMAP_GROUP_BYGID 0x00000020 154290931Srodrigc#define YPMAP_NETID_BYNAME 0x00000040 155290931Srodrigc u_int32_t sc_flags; 156290931Srodrigc 157290931Srodrigc u_int32_t sc_maxid; 158290931Srodrigc 159290935Srodrigc char sc_domainname[MAXHOSTNAMELEN]; 160290931Srodrigc struct timeval sc_conf_tv; 161290931Srodrigc struct event sc_conf_ev; 162290931Srodrigc TAILQ_HEAD(idm_list, idm) sc_idms; 163290931Srodrigc struct imsgev *sc_iev; 164290931Srodrigc struct imsgev *sc_iev_dns; 165290931Srodrigc 166290931Srodrigc RB_HEAD(user_name_tree,userent) *sc_user_names; 167290931Srodrigc RB_HEAD(user_uid_tree,userent) sc_user_uids; 168290931Srodrigc RB_HEAD(group_name_tree,groupent)*sc_group_names; 169290931Srodrigc RB_HEAD(group_gid_tree,groupent) sc_group_gids; 170290931Srodrigc struct user_name_tree *sc_user_names_t; 171290931Srodrigc struct group_name_tree *sc_group_names_t; 172290931Srodrigc size_t sc_user_line_len; 173290931Srodrigc size_t sc_group_line_len; 174290931Srodrigc char *sc_user_lines; 175290931Srodrigc char *sc_group_lines; 176290931Srodrigc 177290931Srodrigc struct yp_data *sc_yp; 178290931Srodrigc 179290931Srodrigc int update_trashed; 180290931Srodrigc}; 181290931Srodrigc 182290931Srodrigc/* log.c */ 183290931Srodrigcvoid log_init(int); 184290931Srodrigcvoid log_warn(const char *, ...); 185290931Srodrigcvoid log_warnx(const char *, ...); 186290931Srodrigcvoid log_info(const char *, ...); 187290931Srodrigcvoid log_debug(const char *, ...); 188290931Srodrigcvoid logit(int, const char *, ...); 189290931Srodrigcvoid vlog(int, const char *, va_list); 190290931Srodrigc__dead void fatal(const char *); 191290931Srodrigc__dead void fatalx(const char *); 192290931Srodrigc 193290931Srodrigc/* parse.y */ 194290931Srodrigcint parse_config(struct env *, const char *, int); 195290931Srodrigcint cmdline_symset(char *); 196290931Srodrigc 197290931Srodrigc/* ldapclient.c */ 198290931Srodrigcpid_t ldapclient(int []); 199290931Srodrigc 200290931Srodrigc/* ypldap.c */ 201290931Srodrigcvoid purge_config(struct env *); 202290931Srodrigcvoid imsg_event_add(struct imsgev *); 203290931Srodrigcint imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, 204290931Srodrigc pid_t, int, void *, u_int16_t); 205290931Srodrigc 206290931Srodrigc/* entries.c */ 207290931Srodrigcvoid flatten_entries(struct env *); 208290931Srodrigcint userent_name_cmp(struct userent *, struct userent *); 209290931Srodrigcint userent_uid_cmp(struct userent *, struct userent *); 210290931Srodrigcint groupent_name_cmp(struct groupent *, struct groupent *); 211290931Srodrigcint groupent_gid_cmp(struct groupent *, struct groupent *); 212290931SrodrigcRB_PROTOTYPE( user_name_tree, userent, ue_name_node, userent_name_cmp); 213290931SrodrigcRB_PROTOTYPE( user_uid_tree, userent, ue_uid_node, userent_uid_cmp); 214290931SrodrigcRB_PROTOTYPE( group_name_tree, groupent, ge_name_node, groupent_name_cmp); 215290931SrodrigcRB_PROTOTYPE( group_gid_tree, groupent, ge_gid_node, groupent_gid_cmp); 216290931Srodrigc 217290931Srodrigc/* yp.c */ 218290931Srodrigcvoid yp_init(struct env *); 219290931Srodrigcvoid yp_enable_events(void); 220290931Srodrigc 221290931Srodrigc/* ypldap_dns.c */ 222290931Srodrigcpid_t ypldap_dns(int[2], struct passwd *); 223