sssd  2.6.1
data_provider.h
1 /*
2  SSSD
3 
4  Data Provider, private header file
5 
6  Copyright (C) Simo Sorce <ssorce@redhat.com> 2008
7 
8  This program is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 3 of the License, or
11  (at your option) any later version.
12 
13  This program is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 #ifndef __DATA_PROVIDER_H__
23 #define __DATA_PROVIDER_H__
24 
25 #include "config.h"
26 
27 #include <stdint.h>
28 #include <sys/un.h>
29 #include <errno.h>
30 #include <stdbool.h>
31 #ifdef USE_KEYRING
32 #include <sys/types.h>
33 #include <keyutils.h>
34 #endif
35 #include <talloc.h>
36 #include <tevent.h>
37 #include <ldb.h>
38 #include <dbus/dbus.h>
39 
40 #include "util/util.h"
41 #include "confdb/confdb.h"
42 #include "sss_client/sss_cli.h"
43 #include "util/authtok.h"
44 #include "util/sss_pam_data.h"
45 #include "providers/data_provider_req.h"
46 
47 #define DATA_PROVIDER_VERSION 0x0001
48 #define DATA_PROVIDER_PIPE "private/sbus-dp"
49 
50 #define DP_PATH "/org/freedesktop/sssd/dataprovider"
51  /* end of group pamHandler */
115 
116 #define DP_ERR_DECIDE -1
117 #define DP_ERR_OK 0
118 #define DP_ERR_OFFLINE 1
119 #define DP_ERR_TIMEOUT 2
120 #define DP_ERR_FATAL 3
121 
122 #define BE_FILTER_NAME 1
123 #define BE_FILTER_IDNUM 2
124 #define BE_FILTER_ENUM 3
125 #define BE_FILTER_SECID 4
126 #define BE_FILTER_UUID 5
127 #define BE_FILTER_CERT 6
128 #define BE_FILTER_WILDCARD 7
129 #define BE_FILTER_ADDR 8
130 
131 #define DP_SEC_ID "secid"
132 #define DP_CERT "cert"
133 /* sizeof() counts the trailing \0 so we must subtract 1 for the string
134  * length */
135 #define DP_SEC_ID_LEN (sizeof(DP_SEC_ID) - 1)
136 #define DP_CERT_LEN (sizeof(DP_CERT) - 1)
137 
138 #define DP_WILDCARD "wildcard"
139 #define DP_WILDCARD_LEN (sizeof(DP_WILDCARD) - 1)
140 
141 #define EXTRA_NAME_IS_UPN "U"
142 #define EXTRA_INPUT_MAYBE_WITH_VIEW "V"
143 
144 /* from dp_auth_util.c */
145 #define SSS_SERVER_INFO 0x80000000
146 
147 #define SSS_KRB5_INFO 0x40000000
148 #define SSS_LDAP_INFO 0x20000000
149 #define SSS_PROXY_INFO 0x10000000
150 
151 #define SSS_KRB5_INFO_TGT_LIFETIME (SSS_SERVER_INFO|SSS_KRB5_INFO|0x01)
152 #define SSS_KRB5_INFO_UPN (SSS_SERVER_INFO|SSS_KRB5_INFO|0x02)
153 
154 bool dp_pack_pam_request(DBusMessage *msg, struct pam_data *pd);
155 bool dp_unpack_pam_request(DBusMessage *msg, TALLOC_CTX *mem_ctx,
156  struct pam_data **new_pd, DBusError *dbus_error);
157 
158 bool dp_pack_pam_response(DBusMessage *msg, struct pam_data *pd);
159 bool dp_unpack_pam_response(DBusMessage *msg, struct pam_data *pd,
160  DBusError *dbus_error);
161 
162 void dp_id_callback(DBusPendingCall *pending, void *ptr);
163 
164 /* from dp_sbus.c */
165 int dp_get_sbus_address(TALLOC_CTX *mem_ctx,
166  char **address, const char *domain_name);
167 
168 
169 /* Reserved filter name for request which waits until the files provider finishes mirroring
170  * the file content
171  */
172 #define DP_REQ_OPT_FILES_INITGR "files_initgr_request"
173 
174 /* Helpers */
175 
176 #define NULL_STRING { .string = NULL }
177 #define NULL_BLOB { .blob = { NULL, 0 } }
178 #define NULL_NUMBER { .number = 0 }
179 #define BOOL_FALSE { .boolean = false }
180 #define BOOL_TRUE { .boolean = true }
181 
182 enum dp_opt_type {
183  DP_OPT_STRING,
184  DP_OPT_BLOB,
185  DP_OPT_NUMBER,
186  DP_OPT_BOOL
187 };
188 
189 struct dp_opt_blob {
190  uint8_t *data;
191  size_t length;
192 };
193 
194 union dp_opt_value {
195  const char *cstring;
196  char *string;
197  struct dp_opt_blob blob;
198  int number;
199  bool boolean;
200 };
201 
202 struct dp_option {
203  const char *opt_name;
204  enum dp_opt_type type;
205  union dp_opt_value def_val;
206  union dp_opt_value val;
207 };
208 
209 #define DP_OPTION_TERMINATOR { NULL, 0, NULL_STRING, NULL_STRING }
210 
211 void dp_option_inherit(char **inherit_opt_list,
212  int option,
213  struct dp_option *parent_opts,
214  struct dp_option *subdom_opts);
215 
216 int dp_get_options(TALLOC_CTX *memctx,
217  struct confdb_ctx *cdb,
218  const char *conf_path,
219  struct dp_option *def_opts,
220  int num_opts,
221  struct dp_option **_opts);
222 
223 int dp_copy_options(TALLOC_CTX *memctx,
224  struct dp_option *src_opts,
225  int num_opts,
226  struct dp_option **_opts);
227 
228 int dp_copy_defaults(TALLOC_CTX *memctx,
229  struct dp_option *src_opts,
230  int num_opts,
231  struct dp_option **_opts);
232 
233 const char *_dp_opt_get_cstring(struct dp_option *opts,
234  int id, const char *location);
235 char *_dp_opt_get_string(struct dp_option *opts,
236  int id, const char *location);
237 struct dp_opt_blob _dp_opt_get_blob(struct dp_option *opts,
238  int id, const char *location);
239 int _dp_opt_get_int(struct dp_option *opts,
240  int id, const char *location);
241 bool _dp_opt_get_bool(struct dp_option *opts,
242  int id, const char *location);
243 #define dp_opt_get_cstring(o, i) _dp_opt_get_cstring(o, i, __FUNCTION__)
244 #define dp_opt_get_string(o, i) _dp_opt_get_string(o, i, __FUNCTION__)
245 #define dp_opt_get_blob(o, i) _dp_opt_get_blob(o, i, __FUNCTION__)
246 #define dp_opt_get_int(o, i) _dp_opt_get_int(o, i, __FUNCTION__)
247 #define dp_opt_get_bool(o, i) _dp_opt_get_bool(o, i, __FUNCTION__)
248 
249 int _dp_opt_set_string(struct dp_option *opts, int id,
250  const char *s, const char *location);
251 int _dp_opt_set_blob(struct dp_option *opts, int id,
252  struct dp_opt_blob b, const char *location);
253 int _dp_opt_set_int(struct dp_option *opts, int id,
254  int i, const char *location);
255 int _dp_opt_set_bool(struct dp_option *opts, int id,
256  bool b, const char *location);
257 #define dp_opt_set_string(o, i, v) _dp_opt_set_string(o, i, v, __FUNCTION__)
258 #define dp_opt_set_blob(o, i, v) _dp_opt_set_blob(o, i, v, __FUNCTION__)
259 #define dp_opt_set_int(o, i, v) _dp_opt_set_int(o, i, v, __FUNCTION__)
260 #define dp_opt_set_bool(o, i, v) _dp_opt_set_bool(o, i, v, __FUNCTION__)
261 
262 /* Generic Data Provider options */
263 
264 /* Resolver DP options */
265 enum dp_res_opts {
266  DP_RES_OPT_FAMILY_ORDER,
267  DP_RES_OPT_RESOLVER_TIMEOUT,
268  DP_RES_OPT_RESOLVER_OP_TIMEOUT,
269  DP_RES_OPT_RESOLVER_SERVER_TIMEOUT,
270  DP_RES_OPT_DNS_DOMAIN,
271 
272  DP_RES_OPTS /* attrs counter */
273 };
274 
275 #endif /* __DATA_PROVIDER_ */