ypldap.h revision 303975
1274955Ssvnmir/*	$OpenBSD: ypldap.h,v 1.16 2015/01/16 06:40:22 deraadt Exp $ */
2274955Ssvnmir/*	$FreeBSD: releng/11.0/usr.sbin/ypldap/ypldap.h 297907 2016-04-13 03:36:34Z araujo $ */
3353358Sdim
4353358Sdim/*
5353358Sdim * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
6274955Ssvnmir *
7274955Ssvnmir * Permission to use, copy, modify, and distribute this software for any
8274955Ssvnmir * purpose with or without fee is hereby granted, provided that the above
9274955Ssvnmir * copyright notice and this permission notice appear in all copies.
10274955Ssvnmir *
11274955Ssvnmir * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12274955Ssvnmir * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13314564Sdim * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14314564Sdim * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15314564Sdim * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16314564Sdim * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17314564Sdim * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18314564Sdim */
19274955Ssvnmir
20314564Sdim#include <imsg.h>
21314564Sdim
22314564Sdim#define YPLDAP_USER		"_ypldap"
23314564Sdim#define YPLDAP_CONF_FILE	"/etc/ypldap.conf"
24314564Sdim#define DEFAULT_INTERVAL	600
25314564Sdim#define LINE_WIDTH		1024
26314564Sdim#define FILTER_WIDTH		128
27314564Sdim#define ATTR_WIDTH		32
28314564Sdim
29314564Sdim#define        MAX_SERVERS_DNS                 8
30314564Sdim
31314564Sdimenum imsg_type {
32314564Sdim	IMSG_NONE,
33314564Sdim	IMSG_CONF_START,
34314564Sdim	IMSG_CONF_IDM,
35314564Sdim	IMSG_CONF_END,
36314564Sdim	IMSG_START_UPDATE,
37314564Sdim	IMSG_END_UPDATE,
38314564Sdim	IMSG_TRASH_UPDATE,
39314564Sdim	IMSG_PW_ENTRY,
40314564Sdim	IMSG_GRP_ENTRY,
41314564Sdim	IMSG_HOST_DNS
42314564Sdim};
43314564Sdim
44314564Sdimstruct ypldap_addr {
45314564Sdim	TAILQ_ENTRY(ypldap_addr)	next;
46314564Sdim	struct sockaddr_storage         ss;
47314564Sdim};
48314564SdimTAILQ_HEAD(ypldap_addr_list, ypldap_addr);
49314564Sdim
50314564Sdimenum {
51314564Sdim	PROC_MAIN,
52314564Sdim	PROC_CLIENT
53314564Sdim} ypldap_process;
54314564Sdim
55314564Sdimstruct userent {
56314564Sdim	RB_ENTRY(userent)		 ue_name_node;
57314564Sdim	RB_ENTRY(userent)		 ue_uid_node;
58314564Sdim	uid_t				 ue_uid;
59314564Sdim	char				*ue_line;
60314564Sdim	char				*ue_netid_line;
61314564Sdim	gid_t				 ue_gid;
62314564Sdim};
63314564Sdim
64314564Sdimstruct groupent {
65314564Sdim	RB_ENTRY(groupent)		 ge_name_node;
66314564Sdim	RB_ENTRY(groupent)		 ge_gid_node;
67314564Sdim	gid_t				 ge_gid;
68314564Sdim	char				*ge_line;
69314564Sdim};
70314564Sdim
71314564Sdimenum client_state {
72314564Sdim        STATE_NONE,
73314564Sdim        STATE_DNS_INPROGRESS,
74314564Sdim        STATE_DNS_TEMPFAIL,
75314564Sdim        STATE_DNS_DONE,
76314564Sdim	STATE_LDAP_FAIL,
77314564Sdim	STATE_LDAP_DONE
78314564Sdim};
79314564Sdim
80314564Sdim/*
81314564Sdim * beck, djm, dlg: pay attention to the struct name
82314564Sdim */
83314564Sdimstruct idm {
84314564Sdim	TAILQ_ENTRY(idm)		 idm_entry;
85314564Sdim	u_int32_t                        idm_id;
86274955Ssvnmir	char				 idm_name[MAXHOSTNAMELEN];
87274955Ssvnmir#define F_SSL				 0x00100000
88280031Sdim#define F_CONFIGURING			 0x00200000
89280031Sdim#define F_NEEDAUTH			 0x00400000
90274955Ssvnmir#define F_FIXED_ATTR(n)			 (1<<n)
91360784Sdim#define F_LIST(n)                        (1<<n)
92327952Sdim	enum client_state		 idm_state;
93314564Sdim	u_int32_t			 idm_flags; /* lower 20 reserved */
94327952Sdim	u_int32_t			 idm_list;
95327952Sdim	struct ypldap_addr_list		 idm_addr;
96327952Sdim	in_port_t			 idm_port;
97280031Sdim	char				 idm_binddn[LINE_WIDTH];
98314564Sdim	char				 idm_bindcred[LINE_WIDTH];
99327952Sdim	char				 idm_basedn[LINE_WIDTH];
100314564Sdim	char				 idm_groupdn[LINE_WIDTH];
101274955Ssvnmir#define FILTER_USER			 1
102314564Sdim#define FILTER_GROUP			 0
103327952Sdim	char				 idm_filters[2][FILTER_WIDTH];
104327952Sdim#define ATTR_NAME			 0
105327952Sdim#define ATTR_PASSWD			 1
106327952Sdim#define ATTR_UID			 2
107327952Sdim#define ATTR_GID			 3
108274955Ssvnmir#define ATTR_CLASS			 4
109274955Ssvnmir#define ATTR_CHANGE			 5
110274955Ssvnmir#define ATTR_EXPIRE			 6
111314564Sdim#define ATTR_GECOS			 7
112327952Sdim#define ATTR_DIR			 8
113274955Ssvnmir#define ATTR_SHELL			 9
114327952Sdim#define ATTR_GR_NAME			 10
115327952Sdim#define ATTR_GR_PASSWD			 11
116327952Sdim#define ATTR_GR_GID			 12
117314564Sdim#define ATTR_GR_MEMBERS			 13
118314564Sdim#define ATTR_MAX			 10
119314564Sdim#define ATTR_GR_MIN			 10
120314564Sdim#define ATTR_GR_MAX			 14
121327952Sdim	char				 idm_attrs[14][ATTR_WIDTH];
122341825Sdim	struct env			*idm_env;
123280031Sdim	struct event			 idm_ev;
124280031Sdim#ifdef SSL
125327952Sdim	struct ssl			*idm_ssl;
126280031Sdim#endif
127280031Sdim};
128327952Sdim
129327952Sdimstruct idm_req {
130274955Ssvnmir	union {
131314564Sdim		uid_t			 ik_uid;
132314564Sdim		uid_t			 ik_gid;
133314564Sdim	}				 ir_key;
134314564Sdim	char				 ir_line[LINE_WIDTH];
135314564Sdim};
136314564Sdim
137314564Sdimstruct imsgev {
138314564Sdim	struct imsgbuf		 ibuf;
139314564Sdim	void			(*handler)(int, short, void *);
140314564Sdim	struct event		 ev;
141314564Sdim	void			*data;
142314564Sdim	short			 events;
143341825Sdim};
144314564Sdim
145314564Sdimstruct env {
146314564Sdim#define YPLDAP_OPT_VERBOSE		 0x01
147327952Sdim#define YPLDAP_OPT_NOACTION		 0x02
148327952Sdim	u_int8_t			 sc_opts;
149327952Sdim#define YPMAP_PASSWD_BYNAME		 0x00000001
150327952Sdim#define YPMAP_PASSWD_BYUID		 0x00000002
151314564Sdim#define YPMAP_MASTER_PASSWD_BYNAME	 0x00000004
152314564Sdim#define YPMAP_MASTER_PASSWD_BYUID	 0x00000008
153314564Sdim#define YPMAP_GROUP_BYNAME		 0x00000010
154314564Sdim#define YPMAP_GROUP_BYGID		 0x00000020
155314564Sdim#define YPMAP_NETID_BYNAME		 0x00000040
156314564Sdim	u_int32_t			 sc_flags;
157314564Sdim
158314564Sdim	u_int32_t			 sc_maxid;
159314564Sdim
160314564Sdim	char				 sc_domainname[MAXHOSTNAMELEN];
161314564Sdim	struct timeval			 sc_conf_tv;
162314564Sdim	struct event			 sc_conf_ev;
163314564Sdim	TAILQ_HEAD(idm_list, idm)	 sc_idms;
164314564Sdim	struct imsgev			*sc_iev;
165314564Sdim	struct imsgev			*sc_iev_dns;
166309124Sdim
167327952Sdim	RB_HEAD(user_name_tree,userent)	 *sc_user_names;
168327952Sdim	RB_HEAD(user_uid_tree,userent)	 sc_user_uids;
169274955Ssvnmir	RB_HEAD(group_name_tree,groupent)*sc_group_names;
170314564Sdim	RB_HEAD(group_gid_tree,groupent) sc_group_gids;
171314564Sdim	struct user_name_tree		 *sc_user_names_t;
172314564Sdim	struct group_name_tree		 *sc_group_names_t;
173314564Sdim	size_t				 sc_user_line_len;
174314564Sdim	size_t				 sc_group_line_len;
175314564Sdim	char				*sc_user_lines;
176314564Sdim	char				*sc_group_lines;
177314564Sdim
178341825Sdim	struct yp_data			*sc_yp;
179314564Sdim
180314564Sdim	int				 update_trashed;
181341825Sdim};
182314564Sdim
183314564Sdim/* log.c */
184314564Sdimvoid		 log_init(int);
185314564Sdimvoid		 log_warn(const char *, ...);
186314564Sdimvoid		 log_warnx(const char *, ...);
187314564Sdimvoid		 log_info(const char *, ...);
188314564Sdimvoid		 log_debug(const char *, ...);
189314564Sdimvoid		 logit(int, const char *, ...);
190314564Sdimvoid		 vlog(int, const char *, va_list);
191314564Sdim__dead2 void	 fatal(const char *);
192314564Sdim__dead2 void	 fatalx(const char *);
193314564Sdim
194314564Sdim/* parse.y */
195314564Sdimint		 parse_config(struct env *, const char *, int);
196314564Sdimint		 cmdline_symset(char *);
197314564Sdim
198314564Sdim/* ldapclient.c */
199314564Sdimpid_t		 ldapclient(int []);
200314564Sdim
201314564Sdim/* ypldap.c */
202314564Sdimvoid		 purge_config(struct env *);
203314564Sdimvoid		 imsg_event_add(struct imsgev *);
204314564Sdimint	 	 imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t,
205314564Sdim		    pid_t, int, void *, u_int16_t);
206314564Sdim
207314564Sdim/* entries.c */
208314564Sdimvoid		 flatten_entries(struct env *);
209314564Sdimint		 userent_name_cmp(struct userent *, struct userent *);
210314564Sdimint		 userent_uid_cmp(struct userent *, struct userent *);
211327952Sdimint		 groupent_name_cmp(struct groupent *, struct groupent *);
212309124Sdimint		 groupent_gid_cmp(struct groupent *, struct groupent *);
213327952SdimRB_PROTOTYPE(	 user_name_tree, userent, ue_name_node, userent_name_cmp);
214327952SdimRB_PROTOTYPE(	 user_uid_tree, userent, ue_uid_node, userent_uid_cmp);
215327952SdimRB_PROTOTYPE(	 group_name_tree, groupent, ge_name_node, groupent_name_cmp);
216274955SsvnmirRB_PROTOTYPE(	 group_gid_tree, groupent, ge_gid_node, groupent_gid_cmp);
217314564Sdim
218314564Sdim/* yp.c */
219314564Sdimvoid		 yp_init(struct env *);
220314564Sdimvoid		 yp_enable_events(void);
221314564Sdim
222314564Sdim/* ypldap_dns.c */
223314564Sdimpid_t		 ypldap_dns(int[2], struct passwd *);
224314564Sdim