File: | /dev/shm/scanbuild/../sssd/src/providers/ipa/ipa_s2n_exop.c |
Location: | line 1328, column 24 |
Description: | The left operand of '==' is a garbage value |
1 | /* | |||
2 | SSSD | |||
3 | ||||
4 | IPA Helper routines - external users and groups with s2n plugin | |||
5 | ||||
6 | Copyright (C) Sumit Bose <sbose@redhat.com> - 2011 | |||
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 | #include "util/util.h" | |||
23 | #include "util/sss_nss.h" | |||
24 | #include "db/sysdb.h" | |||
25 | #include "providers/ldap/sdap_async_private.h" | |||
26 | #include "providers/ldap/ldap_common.h" | |||
27 | #include "providers/ipa/ipa_id.h" | |||
28 | #include "providers/ipa/ipa_subdomains.h" | |||
29 | ||||
30 | enum input_types { | |||
31 | INP_SID = 1, | |||
32 | INP_NAME, | |||
33 | INP_POSIX_UID, | |||
34 | INP_POSIX_GID | |||
35 | }; | |||
36 | ||||
37 | enum request_types { | |||
38 | REQ_SIMPLE = 1, | |||
39 | REQ_FULL, | |||
40 | REQ_FULL_WITH_MEMBERS | |||
41 | }; | |||
42 | ||||
43 | enum response_types { | |||
44 | RESP_SID = 1, | |||
45 | RESP_NAME, | |||
46 | RESP_USER, | |||
47 | RESP_GROUP, | |||
48 | RESP_USER_GROUPLIST, | |||
49 | RESP_GROUP_MEMBERS | |||
50 | }; | |||
51 | ||||
52 | /* ==Sid2Name Extended Operation============================================= */ | |||
53 | #define EXOP_SID2NAME_OID"2.16.840.1.113730.3.8.10.4" "2.16.840.1.113730.3.8.10.4" | |||
54 | #define EXOP_SID2NAME_V1_OID"2.16.840.1.113730.3.8.10.4.1" "2.16.840.1.113730.3.8.10.4.1" | |||
55 | ||||
56 | struct ipa_s2n_exop_state { | |||
57 | struct sdap_handle *sh; | |||
58 | ||||
59 | struct sdap_op *op; | |||
60 | ||||
61 | char *retoid; | |||
62 | struct berval *retdata; | |||
63 | }; | |||
64 | ||||
65 | static void ipa_s2n_exop_done(struct sdap_op *op, | |||
66 | struct sdap_msg *reply, | |||
67 | int error, void *pvt); | |||
68 | ||||
69 | static struct tevent_req *ipa_s2n_exop_send(TALLOC_CTX *mem_ctx, | |||
70 | struct tevent_context *ev, | |||
71 | struct sdap_handle *sh, | |||
72 | bool_Bool is_v1, | |||
73 | int timeout, | |||
74 | struct berval *bv) | |||
75 | { | |||
76 | struct tevent_req *req = NULL((void*)0); | |||
77 | struct ipa_s2n_exop_state *state; | |||
78 | int ret; | |||
79 | int msgid; | |||
80 | ||||
81 | req = tevent_req_create(mem_ctx, &state, struct ipa_s2n_exop_state)_tevent_req_create((mem_ctx), (&state), sizeof(struct ipa_s2n_exop_state ), "struct ipa_s2n_exop_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "81"); | |||
82 | if (!req) return NULL((void*)0); | |||
83 | ||||
84 | state->sh = sh; | |||
85 | state->retoid = NULL((void*)0); | |||
86 | state->retdata = NULL((void*)0); | |||
87 | ||||
88 | DEBUG(SSSDBG_TRACE_FUNC, "Executing extended operation\n")do { int __debug_macro_level = 0x0400; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 88, __FUNCTION__, __debug_macro_level, "Executing extended operation\n" ); } } while (0); | |||
89 | ||||
90 | ret = ldap_extended_operation(state->sh->ldap, | |||
91 | is_v1 ? EXOP_SID2NAME_V1_OID"2.16.840.1.113730.3.8.10.4.1" : EXOP_SID2NAME_OID"2.16.840.1.113730.3.8.10.4", | |||
92 | bv, NULL((void*)0), NULL((void*)0), &msgid); | |||
93 | if (ret == -1 || msgid == -1) { | |||
94 | DEBUG(SSSDBG_CRIT_FAILURE, "ldap_extended_operation failed\n")do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 94, __FUNCTION__, __debug_macro_level, "ldap_extended_operation failed\n" ); } } while (0); | |||
95 | ret = ERR_NETWORK_IO; | |||
96 | goto fail; | |||
97 | } | |||
98 | DEBUG(SSSDBG_TRACE_INTERNAL, "ldap_extended_operation sent, msgid = %d\n",do { int __debug_macro_level = 0x2000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 99, __FUNCTION__, __debug_macro_level, "ldap_extended_operation sent, msgid = %d\n" , msgid); } } while (0) | |||
99 | msgid)do { int __debug_macro_level = 0x2000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 99, __FUNCTION__, __debug_macro_level, "ldap_extended_operation sent, msgid = %d\n" , msgid); } } while (0); | |||
100 | ||||
101 | ret = sdap_op_add(state, ev, state->sh, msgid, ipa_s2n_exop_done, req, | |||
102 | timeout, &state->op); | |||
103 | if (ret) { | |||
104 | DEBUG(SSSDBG_CRIT_FAILURE, "Failed to set up operation!\n")do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 104, __FUNCTION__, __debug_macro_level, "Failed to set up operation!\n" ); } } while (0); | |||
105 | ret = ERR_INTERNAL; | |||
106 | goto fail; | |||
107 | } | |||
108 | ||||
109 | return req; | |||
110 | ||||
111 | fail: | |||
112 | tevent_req_error(req, ret)_tevent_req_error(req, ret, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "112"); | |||
113 | tevent_req_post(req, ev); | |||
114 | return req; | |||
115 | } | |||
116 | ||||
117 | static void ipa_s2n_exop_done(struct sdap_op *op, | |||
118 | struct sdap_msg *reply, | |||
119 | int error, void *pvt) | |||
120 | { | |||
121 | struct tevent_req *req = talloc_get_type(pvt, struct tevent_req)(struct tevent_req *)talloc_check_name(pvt, "struct tevent_req" ); | |||
122 | struct ipa_s2n_exop_state *state = tevent_req_data(req,(struct ipa_s2n_exop_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_exop_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "123") | |||
123 | struct ipa_s2n_exop_state)(struct ipa_s2n_exop_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_exop_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "123"); | |||
124 | int ret; | |||
125 | char *errmsg = NULL((void*)0); | |||
126 | char *retoid = NULL((void*)0); | |||
127 | struct berval *retdata = NULL((void*)0); | |||
128 | int result; | |||
129 | ||||
130 | if (error) { | |||
131 | tevent_req_error(req, error)_tevent_req_error(req, error, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "131"); | |||
132 | return; | |||
133 | } | |||
134 | ||||
135 | ret = ldap_parse_result(state->sh->ldap, reply->msg, | |||
136 | &result, NULL((void*)0), &errmsg, NULL((void*)0), | |||
137 | NULL((void*)0), 0); | |||
138 | if (ret != LDAP_SUCCESS0x00) { | |||
139 | DEBUG(SSSDBG_OP_FAILURE, "ldap_parse_result failed (%d)\n",do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 140, __FUNCTION__, __debug_macro_level, "ldap_parse_result failed (%d)\n" , state->op->msgid); } } while (0) | |||
140 | state->op->msgid)do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 140, __FUNCTION__, __debug_macro_level, "ldap_parse_result failed (%d)\n" , state->op->msgid); } } while (0); | |||
141 | ret = ERR_NETWORK_IO; | |||
142 | goto done; | |||
143 | } | |||
144 | ||||
145 | DEBUG(result == LDAP_SUCCESS ? SSSDBG_TRACE_FUNC : SSSDBG_OP_FAILURE,do { int __debug_macro_level = result == 0x00 ? 0x0400 : 0x0040 ; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020) )))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c", 147 , __FUNCTION__, __debug_macro_level, "ldap_extended_operation result: %s(%d), %s.\n" , sss_ldap_err2string(result), result, errmsg); } } while (0) | |||
146 | "ldap_extended_operation result: %s(%d), %s.\n",do { int __debug_macro_level = result == 0x00 ? 0x0400 : 0x0040 ; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020) )))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c", 147 , __FUNCTION__, __debug_macro_level, "ldap_extended_operation result: %s(%d), %s.\n" , sss_ldap_err2string(result), result, errmsg); } } while (0) | |||
147 | sss_ldap_err2string(result), result, errmsg)do { int __debug_macro_level = result == 0x00 ? 0x0400 : 0x0040 ; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020) )))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c", 147 , __FUNCTION__, __debug_macro_level, "ldap_extended_operation result: %s(%d), %s.\n" , sss_ldap_err2string(result), result, errmsg); } } while (0); | |||
148 | ||||
149 | if (result != LDAP_SUCCESS0x00) { | |||
150 | DEBUG(SSSDBG_OP_FAILURE, "ldap_extended_operation failed, " \do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 151, __FUNCTION__, __debug_macro_level, "ldap_extended_operation failed, " "server logs might contain more details.\n"); } } while (0) | |||
151 | "server logs might contain more details.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 151, __FUNCTION__, __debug_macro_level, "ldap_extended_operation failed, " "server logs might contain more details.\n"); } } while (0); | |||
152 | ret = ERR_NETWORK_IO; | |||
153 | goto done; | |||
154 | } | |||
155 | ||||
156 | ret = ldap_parse_extended_result(state->sh->ldap, reply->msg, | |||
157 | &retoid, &retdata, 0); | |||
158 | if (ret != LDAP_SUCCESS0x00) { | |||
159 | DEBUG(SSSDBG_OP_FAILURE, "ldap_parse_extendend_result failed (%d)\n",do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 160, __FUNCTION__, __debug_macro_level, "ldap_parse_extendend_result failed (%d)\n" , ret); } } while (0) | |||
160 | ret)do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 160, __FUNCTION__, __debug_macro_level, "ldap_parse_extendend_result failed (%d)\n" , ret); } } while (0); | |||
161 | ret = ERR_NETWORK_IO; | |||
162 | goto done; | |||
163 | } | |||
164 | ||||
165 | state->retoid = talloc_strdup(state, retoid); | |||
166 | if (state->retoid == NULL((void*)0)) { | |||
167 | DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 167, __FUNCTION__, __debug_macro_level, "talloc_strdup failed.\n" ); } } while (0); | |||
168 | ret = ENOMEM12; | |||
169 | goto done; | |||
170 | } | |||
171 | ||||
172 | state->retdata = talloc(state, struct berval)(struct berval *)talloc_named_const(state, sizeof(struct berval ), "struct berval"); | |||
173 | if (state->retdata == NULL((void*)0)) { | |||
174 | DEBUG(SSSDBG_OP_FAILURE, "talloc failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 174, __FUNCTION__, __debug_macro_level, "talloc failed.\n") ; } } while (0); | |||
175 | ret = ENOMEM12; | |||
176 | goto done; | |||
177 | } | |||
178 | state->retdata->bv_len = retdata->bv_len; | |||
179 | state->retdata->bv_val = talloc_memdup(state->retdata, retdata->bv_val,_talloc_memdup(state->retdata, retdata->bv_val, retdata ->bv_len, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "180" ) | |||
180 | retdata->bv_len)_talloc_memdup(state->retdata, retdata->bv_val, retdata ->bv_len, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "180" ); | |||
181 | if (state->retdata->bv_val == NULL((void*)0)) { | |||
182 | DEBUG(SSSDBG_OP_FAILURE, "talloc_memdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 182, __FUNCTION__, __debug_macro_level, "talloc_memdup failed.\n" ); } } while (0); | |||
183 | ret = ENOMEM12; | |||
184 | goto done; | |||
185 | } | |||
186 | ||||
187 | ret = EOK0; | |||
188 | ||||
189 | done: | |||
190 | ldap_memfree(errmsg); | |||
191 | ldap_memfree(retoid); | |||
192 | ber_bvfree(retdata); | |||
193 | if (ret == EOK0) { | |||
194 | tevent_req_done(req)_tevent_req_done(req, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "194"); | |||
195 | } else { | |||
196 | tevent_req_error(req, ret)_tevent_req_error(req, ret, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "196"); | |||
197 | } | |||
198 | } | |||
199 | ||||
200 | static int ipa_s2n_exop_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx, | |||
201 | char **retoid, struct berval **retdata) | |||
202 | { | |||
203 | struct ipa_s2n_exop_state *state = tevent_req_data(req,(struct ipa_s2n_exop_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_exop_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "204") | |||
204 | struct ipa_s2n_exop_state)(struct ipa_s2n_exop_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_exop_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "204"); | |||
205 | ||||
206 | TEVENT_REQ_RETURN_ON_ERROR(req)do { enum tevent_req_state TRROEstate; uint64_t TRROEerr; if ( tevent_req_is_error(req, &TRROEstate, &TRROEerr)) { if (TRROEstate == TEVENT_REQ_USER_ERROR && TRROEerr != 0 ) { return TRROEerr; } return ERR_INTERNAL; } } while (0); | |||
207 | ||||
208 | *retoid = talloc_steal(mem_ctx, state->retoid)({ __typeof__(state->retoid) __talloc_steal_ret = (__typeof__ (state->retoid))_talloc_steal_loc((mem_ctx),(state->retoid ), "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "208"); __talloc_steal_ret ; }); | |||
209 | *retdata = talloc_steal(mem_ctx, state->retdata)({ __typeof__(state->retdata) __talloc_steal_ret = (__typeof__ (state->retdata))_talloc_steal_loc((mem_ctx),(state->retdata ), "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "209"); __talloc_steal_ret ; }); | |||
210 | ||||
211 | return EOK0; | |||
212 | } | |||
213 | ||||
214 | static errno_t talloc_ber_flatten(TALLOC_CTX *mem_ctx, BerElement *ber, | |||
215 | struct berval **_bv) | |||
216 | { | |||
217 | int ret; | |||
218 | struct berval *bv = NULL((void*)0); | |||
219 | struct berval *tbv = NULL((void*)0); | |||
220 | ||||
221 | ret = ber_flatten(ber, &bv); | |||
222 | if (ret == -1) { | |||
223 | ret = EFAULT14; | |||
224 | goto done; | |||
225 | } | |||
226 | ||||
227 | tbv = talloc_zero(mem_ctx, struct berval)(struct berval *)_talloc_zero(mem_ctx, sizeof(struct berval), "struct berval"); | |||
228 | if (tbv == NULL((void*)0)) { | |||
229 | ret = ENOMEM12; | |||
230 | goto done; | |||
231 | } | |||
232 | ||||
233 | tbv->bv_len = bv->bv_len; | |||
234 | tbv->bv_val = talloc_memdup(tbv, bv->bv_val, bv->bv_len)_talloc_memdup(tbv, bv->bv_val, bv->bv_len, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "234"); | |||
235 | if (tbv->bv_val == NULL((void*)0)) { | |||
236 | ret = ENOMEM12; | |||
237 | goto done; | |||
238 | } | |||
239 | ||||
240 | ret = EOK0; | |||
241 | ||||
242 | done: | |||
243 | ber_bvfree(bv); | |||
244 | if (ret == EOK0) { | |||
245 | *_bv = tbv; | |||
246 | } else { | |||
247 | talloc_free(tbv)_talloc_free(tbv, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "247"); | |||
248 | } | |||
249 | ||||
250 | return ret; | |||
251 | } | |||
252 | ||||
253 | /* The extended operation expect the following ASN.1 encoded request data: | |||
254 | * | |||
255 | * ExtdomRequestValue ::= SEQUENCE { | |||
256 | * inputType ENUMERATED { | |||
257 | * sid (1), | |||
258 | * name (2), | |||
259 | * posix uid (3), | |||
260 | * posix gid (3) | |||
261 | * }, | |||
262 | * requestType ENUMERATED { | |||
263 | * simple (1), | |||
264 | * full (2) | |||
265 | * full_with_members (3) | |||
266 | * }, | |||
267 | * data InputData | |||
268 | * } | |||
269 | * | |||
270 | * InputData ::= CHOICE { | |||
271 | * sid OCTET STRING, | |||
272 | * name NameDomainData | |||
273 | * uid PosixUid, | |||
274 | * gid PosixGid | |||
275 | * } | |||
276 | * | |||
277 | * NameDomainData ::= SEQUENCE { | |||
278 | * domain_name OCTET STRING, | |||
279 | * object_name OCTET STRING | |||
280 | * } | |||
281 | * | |||
282 | * PosixUid ::= SEQUENCE { | |||
283 | * domain_name OCTET STRING, | |||
284 | * uid INTEGER | |||
285 | * } | |||
286 | * | |||
287 | * PosixGid ::= SEQUENCE { | |||
288 | * domain_name OCTET STRING, | |||
289 | * gid INTEGER | |||
290 | * } | |||
291 | * | |||
292 | */ | |||
293 | ||||
294 | static errno_t s2n_encode_request(TALLOC_CTX *mem_ctx, | |||
295 | const char *domain_name, | |||
296 | int entry_type, | |||
297 | enum request_types request_type, | |||
298 | struct req_input *req_input, | |||
299 | struct berval **_bv) | |||
300 | { | |||
301 | BerElement *ber = NULL((void*)0); | |||
302 | int ret; | |||
303 | ||||
304 | ber = ber_alloc_t( LBER_USE_DER0x01 ); | |||
305 | if (ber == NULL((void*)0)) { | |||
306 | return ENOMEM12; | |||
307 | } | |||
308 | ||||
309 | switch (entry_type) { | |||
310 | case BE_REQ_USER0x0001: | |||
311 | case BE_REQ_USER_AND_GROUP0x0012: /* the extdom exop does not care if the | |||
312 | ID belongs to a user or a group */ | |||
313 | if (req_input->type == REQ_INP_NAME) { | |||
314 | ret = ber_printf(ber, "{ee{ss}}", INP_NAME, request_type, | |||
315 | domain_name, | |||
316 | req_input->inp.name); | |||
317 | } else if (req_input->type == REQ_INP_ID) { | |||
318 | ret = ber_printf(ber, "{ee{si}}", INP_POSIX_UID, request_type, | |||
319 | domain_name, | |||
320 | req_input->inp.id); | |||
321 | } else { | |||
322 | DEBUG(SSSDBG_OP_FAILURE, "Unexpected input type [%d].\n",do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 323, __FUNCTION__, __debug_macro_level, "Unexpected input type [%d].\n" , req_input->type == REQ_INP_ID); } } while (0) | |||
323 | req_input->type == REQ_INP_ID)do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 323, __FUNCTION__, __debug_macro_level, "Unexpected input type [%d].\n" , req_input->type == REQ_INP_ID); } } while (0); | |||
324 | ret = EINVAL22; | |||
325 | goto done; | |||
326 | } | |||
327 | break; | |||
328 | case BE_REQ_GROUP0x0002: | |||
329 | if (req_input->type == REQ_INP_NAME) { | |||
330 | ret = ber_printf(ber, "{ee{ss}}", INP_NAME, request_type, | |||
331 | domain_name, | |||
332 | req_input->inp.name); | |||
333 | } else if (req_input->type == REQ_INP_ID) { | |||
334 | ret = ber_printf(ber, "{ee{si}}", INP_POSIX_GID, request_type, | |||
335 | domain_name, | |||
336 | req_input->inp.id); | |||
337 | } else { | |||
338 | DEBUG(SSSDBG_OP_FAILURE, "Unexpected input type [%d].\n",do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 339, __FUNCTION__, __debug_macro_level, "Unexpected input type [%d].\n" , req_input->type == REQ_INP_ID); } } while (0) | |||
339 | req_input->type == REQ_INP_ID)do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 339, __FUNCTION__, __debug_macro_level, "Unexpected input type [%d].\n" , req_input->type == REQ_INP_ID); } } while (0); | |||
340 | ret = EINVAL22; | |||
341 | goto done; | |||
342 | } | |||
343 | break; | |||
344 | case BE_REQ_BY_SECID0x0011: | |||
345 | if (req_input->type == REQ_INP_SECID) { | |||
346 | ret = ber_printf(ber, "{ees}", INP_SID, request_type, | |||
347 | req_input->inp.secid); | |||
348 | } else { | |||
349 | DEBUG(SSSDBG_OP_FAILURE, "Unexpected input type [%d].\n",do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 350, __FUNCTION__, __debug_macro_level, "Unexpected input type [%d].\n" , req_input->type == REQ_INP_ID); } } while (0) | |||
350 | req_input->type == REQ_INP_ID)do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 350, __FUNCTION__, __debug_macro_level, "Unexpected input type [%d].\n" , req_input->type == REQ_INP_ID); } } while (0); | |||
351 | ret = EINVAL22; | |||
352 | goto done; | |||
353 | } | |||
354 | break; | |||
355 | default: | |||
356 | ret = EINVAL22; | |||
357 | goto done; | |||
358 | } | |||
359 | if (ret == -1) { | |||
360 | ret = EFAULT14; | |||
361 | goto done; | |||
362 | } | |||
363 | ||||
364 | ret = talloc_ber_flatten(mem_ctx, ber, _bv); | |||
365 | if (ret != EOK0) { | |||
366 | goto done; | |||
367 | } | |||
368 | ||||
369 | ret = EOK0; | |||
370 | ||||
371 | done: | |||
372 | ber_free(ber, 1); | |||
373 | ||||
374 | return ret; | |||
375 | } | |||
376 | ||||
377 | /* If the extendend operation is successful it returns the following ASN.1 | |||
378 | * encoded response: | |||
379 | * | |||
380 | * ExtdomResponseValue ::= SEQUENCE { | |||
381 | * responseType ENUMERATED { | |||
382 | * sid (1), | |||
383 | * name (2), | |||
384 | * posix_user (3), | |||
385 | * posix_group (4), | |||
386 | * posix_user_grouplist (5), | |||
387 | * posix_group_members (6) | |||
388 | * }, | |||
389 | * data OutputData | |||
390 | * } | |||
391 | * | |||
392 | * OutputData ::= CHOICE { | |||
393 | * sid OCTET STRING, | |||
394 | * name NameDomainData, | |||
395 | * user PosixUser, | |||
396 | * group PosixGroup, | |||
397 | * usergrouplist PosixUserGrouplist, | |||
398 | * groupmembers PosixGroupMembers | |||
399 | * | |||
400 | * } | |||
401 | * | |||
402 | * NameDomainData ::= SEQUENCE { | |||
403 | * domain_name OCTET STRING, | |||
404 | * object_name OCTET STRING | |||
405 | * } | |||
406 | * | |||
407 | * PosixUser ::= SEQUENCE { | |||
408 | * domain_name OCTET STRING, | |||
409 | * user_name OCTET STRING, | |||
410 | * uid INTEGER | |||
411 | * gid INTEGER | |||
412 | * } | |||
413 | * | |||
414 | * PosixGroup ::= SEQUENCE { | |||
415 | * domain_name OCTET STRING, | |||
416 | * group_name OCTET STRING, | |||
417 | * gid INTEGER | |||
418 | * } | |||
419 | * | |||
420 | * PosixUserGrouplist ::= SEQUENCE { | |||
421 | * domain_name OCTET STRING, | |||
422 | * user_name OCTET STRING, | |||
423 | * uid INTEGER, | |||
424 | * gid INTEGER, | |||
425 | * gecos OCTET STRING, | |||
426 | * home_directory OCTET STRING, | |||
427 | * shell OCTET STRING, | |||
428 | * grouplist GroupNameList | |||
429 | * } | |||
430 | * | |||
431 | * GroupNameList ::= SEQUENCE OF OCTET STRING | |||
432 | * | |||
433 | * PosixGroupMembers ::= SEQUENCE { | |||
434 | * domain_name OCTET STRING, | |||
435 | * group_name OCTET STRING, | |||
436 | * gid INTEGER, | |||
437 | * members GroupMemberList | |||
438 | * } | |||
439 | * | |||
440 | * GroupMemberList ::= SEQUENCE OF OCTET STRING | |||
441 | */ | |||
442 | ||||
443 | struct resp_attrs { | |||
444 | enum response_types response_type; | |||
445 | char *domain_name; | |||
446 | union { | |||
447 | struct passwd user; | |||
448 | struct group group; | |||
449 | char *sid_str; | |||
450 | char *name; | |||
451 | } a; | |||
452 | size_t ngroups; | |||
453 | char **groups; | |||
454 | struct sysdb_attrs *sysdb_attrs; | |||
455 | }; | |||
456 | ||||
457 | static errno_t get_extra_attrs(BerElement *ber, struct resp_attrs *resp_attrs) | |||
458 | { | |||
459 | ber_tag_t tag; | |||
460 | ber_len_t ber_len; | |||
461 | char *ber_cookie; | |||
462 | char *name; | |||
463 | struct berval **values; | |||
464 | struct ldb_val v; | |||
465 | int ret; | |||
466 | size_t c; | |||
467 | ||||
468 | if (resp_attrs->sysdb_attrs == NULL((void*)0)) { | |||
469 | resp_attrs->sysdb_attrs = sysdb_new_attrs(resp_attrs); | |||
470 | if (resp_attrs->sysdb_attrs == NULL((void*)0)) { | |||
471 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_new_attrs failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 471, __FUNCTION__, __debug_macro_level, "sysdb_new_attrs failed.\n" ); } } while (0); | |||
472 | return ENOMEM12; | |||
473 | } | |||
474 | } | |||
475 | ||||
476 | DEBUG(SSSDBG_TRACE_ALL, "Found new sequence.\n")do { int __debug_macro_level = 0x4000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 476, __FUNCTION__, __debug_macro_level, "Found new sequence.\n" ); } } while (0); | |||
477 | for (tag = ber_first_element(ber, &ber_len, &ber_cookie); | |||
478 | tag != LBER_DEFAULT((ber_tag_t) -1); | |||
479 | tag = ber_next_element(ber, &ber_len, ber_cookie)) { | |||
480 | ||||
481 | tag = ber_scanf(ber, "{a{V}}", &name, &values); | |||
482 | if (tag == LBER_ERROR((ber_tag_t) -1)) { | |||
483 | DEBUG(SSSDBG_OP_FAILURE, "ber_scanf failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 483, __FUNCTION__, __debug_macro_level, "ber_scanf failed.\n" ); } } while (0); | |||
484 | return EINVAL22; | |||
485 | } | |||
486 | DEBUG(SSSDBG_TRACE_ALL, "Extra attribute [%s].\n", name)do { int __debug_macro_level = 0x4000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 486, __FUNCTION__, __debug_macro_level, "Extra attribute [%s].\n" , name); } } while (0); | |||
487 | ||||
488 | for (c = 0; values[c] != NULL((void*)0); c++) { | |||
489 | ||||
490 | v.data = (uint8_t *) values[c]->bv_val; | |||
491 | v.length = values[c]->bv_len; | |||
492 | ||||
493 | ret = sysdb_attrs_add_val(resp_attrs->sysdb_attrs, name, &v); | |||
494 | if (ret != EOK0) { | |||
495 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_attrs_add_val failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 495, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_val failed.\n" ); } } while (0); | |||
496 | ldap_memfree(name); | |||
497 | ber_bvecfree(values); | |||
498 | return ret; | |||
499 | } | |||
500 | } | |||
501 | ||||
502 | ldap_memfree(name); | |||
503 | ber_bvecfree(values); | |||
504 | } | |||
505 | ||||
506 | return EOK0; | |||
507 | } | |||
508 | ||||
509 | static errno_t add_v1_user_data(BerElement *ber, struct resp_attrs *attrs) | |||
510 | { | |||
511 | ber_tag_t tag; | |||
512 | ber_len_t ber_len; | |||
513 | int ret; | |||
514 | char *gecos = NULL((void*)0); | |||
515 | char *homedir = NULL((void*)0); | |||
516 | char *shell = NULL((void*)0); | |||
517 | char **list = NULL((void*)0); | |||
518 | size_t c; | |||
519 | ||||
520 | tag = ber_scanf(ber, "aaa", &gecos, &homedir, &shell); | |||
521 | if (tag == LBER_ERROR((ber_tag_t) -1)) { | |||
522 | DEBUG(SSSDBG_OP_FAILURE, "ber_scanf failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 522, __FUNCTION__, __debug_macro_level, "ber_scanf failed.\n" ); } } while (0); | |||
523 | ret = EINVAL22; | |||
524 | goto done; | |||
525 | } | |||
526 | ||||
527 | if (gecos == NULL((void*)0) || *gecos == '\0') { | |||
528 | attrs->a.user.pw_gecos = NULL((void*)0); | |||
529 | } else { | |||
530 | attrs->a.user.pw_gecos = talloc_strdup(attrs, gecos); | |||
531 | if (attrs->a.user.pw_gecos == NULL((void*)0)) { | |||
532 | DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 532, __FUNCTION__, __debug_macro_level, "talloc_strdup failed.\n" ); } } while (0); | |||
533 | ret = ENOMEM12; | |||
534 | goto done; | |||
535 | } | |||
536 | } | |||
537 | ||||
538 | if (homedir == NULL((void*)0) || *homedir == '\0') { | |||
539 | attrs->a.user.pw_dir = NULL((void*)0); | |||
540 | } else { | |||
541 | attrs->a.user.pw_dir = talloc_strdup(attrs, homedir); | |||
542 | if (attrs->a.user.pw_dir == NULL((void*)0)) { | |||
543 | DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 543, __FUNCTION__, __debug_macro_level, "talloc_strdup failed.\n" ); } } while (0); | |||
544 | ret = ENOMEM12; | |||
545 | goto done; | |||
546 | } | |||
547 | } | |||
548 | ||||
549 | if (shell == NULL((void*)0) || *shell == '\0') { | |||
550 | attrs->a.user.pw_shell = NULL((void*)0); | |||
551 | } else { | |||
552 | attrs->a.user.pw_shell = talloc_strdup(attrs, shell); | |||
553 | if (attrs->a.user.pw_shell == NULL((void*)0)) { | |||
554 | DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 554, __FUNCTION__, __debug_macro_level, "talloc_strdup failed.\n" ); } } while (0); | |||
555 | ret = ENOMEM12; | |||
556 | goto done; | |||
557 | } | |||
558 | } | |||
559 | ||||
560 | tag = ber_scanf(ber, "{v}", &list); | |||
561 | if (tag == LBER_ERROR((ber_tag_t) -1)) { | |||
562 | DEBUG(SSSDBG_OP_FAILURE, "ber_scanf failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 562, __FUNCTION__, __debug_macro_level, "ber_scanf failed.\n" ); } } while (0); | |||
563 | ret = EINVAL22; | |||
564 | goto done; | |||
565 | } | |||
566 | ||||
567 | for (attrs->ngroups = 0; list[attrs->ngroups] != NULL((void*)0); | |||
568 | attrs->ngroups++); | |||
569 | ||||
570 | if (attrs->ngroups > 0) { | |||
571 | attrs->groups = talloc_zero_array(attrs, char *, attrs->ngroups + 1)(char * *)_talloc_zero_array(attrs, sizeof(char *), attrs-> ngroups + 1, "char *"); | |||
572 | if (attrs->groups == NULL((void*)0)) { | |||
573 | DEBUG(SSSDBG_OP_FAILURE, "talloc_array failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 573, __FUNCTION__, __debug_macro_level, "talloc_array failed.\n" ); } } while (0); | |||
574 | ret = ENOMEM12; | |||
575 | goto done; | |||
576 | } | |||
577 | ||||
578 | for (c = 0; c < attrs->ngroups; c++) { | |||
579 | attrs->groups[c] = talloc_strdup(attrs->groups, | |||
580 | list[c]); | |||
581 | if (attrs->groups[c] == NULL((void*)0)) { | |||
582 | DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 582, __FUNCTION__, __debug_macro_level, "talloc_strdup failed.\n" ); } } while (0); | |||
583 | ret = ENOMEM12; | |||
584 | goto done; | |||
585 | } | |||
586 | } | |||
587 | } | |||
588 | ||||
589 | tag = ber_peek_tag(ber, &ber_len); | |||
590 | DEBUG(SSSDBG_TRACE_ALL, "BER tag is [%d]\n", (int) tag)do { int __debug_macro_level = 0x4000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 590, __FUNCTION__, __debug_macro_level, "BER tag is [%d]\n" , (int) tag); } } while (0); | |||
591 | if (tag == LBER_SEQUENCE((ber_tag_t) 0x30UL)) { | |||
592 | ret = get_extra_attrs(ber, attrs); | |||
593 | if (ret != EOK0) { | |||
594 | DEBUG(SSSDBG_OP_FAILURE, "get_extra_attrs failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 594, __FUNCTION__, __debug_macro_level, "get_extra_attrs failed.\n" ); } } while (0); | |||
595 | goto done; | |||
596 | } | |||
597 | } | |||
598 | ||||
599 | ||||
600 | ret = EOK0; | |||
601 | ||||
602 | done: | |||
603 | ber_memfree(gecos); | |||
604 | ber_memfree(homedir); | |||
605 | ber_memfree(shell); | |||
606 | ber_memvfree((void **) list); | |||
607 | ||||
608 | return ret; | |||
609 | } | |||
610 | ||||
611 | static errno_t add_v1_group_data(BerElement *ber, struct resp_attrs *attrs) | |||
612 | { | |||
613 | ber_tag_t tag; | |||
614 | ber_len_t ber_len; | |||
615 | int ret; | |||
616 | char **list = NULL((void*)0); | |||
617 | size_t c; | |||
618 | ||||
619 | tag = ber_scanf(ber, "{v}", &list); | |||
620 | if (tag == LBER_ERROR((ber_tag_t) -1)) { | |||
621 | DEBUG(SSSDBG_OP_FAILURE, "ber_scanf failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 621, __FUNCTION__, __debug_macro_level, "ber_scanf failed.\n" ); } } while (0); | |||
622 | ret = EINVAL22; | |||
623 | goto done; | |||
624 | } | |||
625 | ||||
626 | if (list != NULL((void*)0)) { | |||
627 | for (attrs->ngroups = 0; list[attrs->ngroups] != NULL((void*)0); | |||
628 | attrs->ngroups++); | |||
629 | ||||
630 | if (attrs->ngroups > 0) { | |||
631 | attrs->a.group.gr_mem = talloc_zero_array(attrs, char *,(char * *)_talloc_zero_array(attrs, sizeof(char *), attrs-> ngroups + 1, "char *") | |||
632 | attrs->ngroups + 1)(char * *)_talloc_zero_array(attrs, sizeof(char *), attrs-> ngroups + 1, "char *"); | |||
633 | if (attrs->a.group.gr_mem == NULL((void*)0)) { | |||
634 | DEBUG(SSSDBG_OP_FAILURE, "talloc_array failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 634, __FUNCTION__, __debug_macro_level, "talloc_array failed.\n" ); } } while (0); | |||
635 | ret = ENOMEM12; | |||
636 | goto done; | |||
637 | } | |||
638 | ||||
639 | for (c = 0; c < attrs->ngroups; c++) { | |||
640 | attrs->a.group.gr_mem[c] = | |||
641 | talloc_strdup(attrs->a.group.gr_mem, | |||
642 | list[c]); | |||
643 | if (attrs->a.group.gr_mem[c] == NULL((void*)0)) { | |||
644 | DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 644, __FUNCTION__, __debug_macro_level, "talloc_strdup failed.\n" ); } } while (0); | |||
645 | ret = ENOMEM12; | |||
646 | goto done; | |||
647 | } | |||
648 | } | |||
649 | } | |||
650 | } else { | |||
651 | attrs->a.group.gr_mem = talloc_zero_array(attrs, char *, 1)(char * *)_talloc_zero_array(attrs, sizeof(char *), 1, "char *" ); | |||
652 | if (attrs->a.group.gr_mem == NULL((void*)0)) { | |||
653 | DEBUG(SSSDBG_OP_FAILURE, "talloc_array failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 653, __FUNCTION__, __debug_macro_level, "talloc_array failed.\n" ); } } while (0); | |||
654 | ret = ENOMEM12; | |||
655 | goto done; | |||
656 | } | |||
657 | } | |||
658 | ||||
659 | tag = ber_peek_tag(ber, &ber_len); | |||
660 | DEBUG(SSSDBG_TRACE_ALL, "BER tag is [%d]\n", (int) tag)do { int __debug_macro_level = 0x4000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 660, __FUNCTION__, __debug_macro_level, "BER tag is [%d]\n" , (int) tag); } } while (0); | |||
661 | if (tag == LBER_SEQUENCE((ber_tag_t) 0x30UL)) { | |||
662 | ret = get_extra_attrs(ber, attrs); | |||
663 | if (ret != EOK0) { | |||
664 | DEBUG(SSSDBG_OP_FAILURE, "get_extra_attrs failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 664, __FUNCTION__, __debug_macro_level, "get_extra_attrs failed.\n" ); } } while (0); | |||
665 | goto done; | |||
666 | } | |||
667 | } | |||
668 | ||||
669 | ret = EOK0; | |||
670 | ||||
671 | done: | |||
672 | ber_memvfree((void **) list); | |||
673 | ||||
674 | return ret; | |||
675 | } | |||
676 | ||||
677 | static errno_t ipa_s2n_save_objects(struct sss_domain_info *dom, | |||
678 | struct req_input *req_input, | |||
679 | struct resp_attrs *attrs, | |||
680 | struct resp_attrs *simple_attrs, | |||
681 | const char *view_name, | |||
682 | struct sysdb_attrs *override_attrs); | |||
683 | ||||
684 | static errno_t s2n_response_to_attrs(TALLOC_CTX *mem_ctx, | |||
685 | char *retoid, | |||
686 | struct berval *retdata, | |||
687 | struct resp_attrs **resp_attrs) | |||
688 | { | |||
689 | BerElement *ber = NULL((void*)0); | |||
690 | ber_tag_t tag; | |||
691 | int ret; | |||
692 | enum response_types type; | |||
693 | char *domain_name = NULL((void*)0); | |||
694 | char *name = NULL((void*)0); | |||
695 | uid_t uid; | |||
696 | gid_t gid; | |||
697 | struct resp_attrs *attrs = NULL((void*)0); | |||
698 | char *sid_str; | |||
699 | bool_Bool is_v1 = false0; | |||
700 | ||||
701 | if (retoid == NULL((void*)0) || retdata == NULL((void*)0)) { | |||
702 | DEBUG(SSSDBG_OP_FAILURE, "Missing OID or data.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 702, __FUNCTION__, __debug_macro_level, "Missing OID or data.\n" ); } } while (0); | |||
703 | return EINVAL22; | |||
704 | } | |||
705 | ||||
706 | if (strcmp(retoid, EXOP_SID2NAME_V1_OID)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (retoid) && __builtin_constant_p ("2.16.840.1.113730.3.8.10.4.1" ) && (__s1_len = strlen (retoid), __s2_len = strlen ( "2.16.840.1.113730.3.8.10.4.1"), (!((size_t)(const void *)((retoid ) + 1) - (size_t)(const void *)(retoid) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("2.16.840.1.113730.3.8.10.4.1" ) + 1) - (size_t)(const void *)("2.16.840.1.113730.3.8.10.4.1" ) == 1) || __s2_len >= 4)) ? __builtin_strcmp (retoid, "2.16.840.1.113730.3.8.10.4.1" ) : (__builtin_constant_p (retoid) && ((size_t)(const void *)((retoid) + 1) - (size_t)(const void *)(retoid) == 1) && (__s1_len = strlen (retoid), __s1_len < 4) ? ( __builtin_constant_p ("2.16.840.1.113730.3.8.10.4.1") && ((size_t)(const void *)(("2.16.840.1.113730.3.8.10.4.1") + 1 ) - (size_t)(const void *)("2.16.840.1.113730.3.8.10.4.1") == 1) ? __builtin_strcmp (retoid, "2.16.840.1.113730.3.8.10.4.1" ) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("2.16.840.1.113730.3.8.10.4.1"); int __result = (((const unsigned char *) (const char *) (retoid) )[0] - __s2[0]); if (__s1_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (retoid ))[1] - __s2[1]); if (__s1_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (retoid ))[2] - __s2[2]); if (__s1_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) (retoid ))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ( "2.16.840.1.113730.3.8.10.4.1") && ((size_t)(const void *)(("2.16.840.1.113730.3.8.10.4.1") + 1) - (size_t)(const void *)("2.16.840.1.113730.3.8.10.4.1") == 1) && (__s2_len = strlen ("2.16.840.1.113730.3.8.10.4.1"), __s2_len < 4) ? (__builtin_constant_p (retoid) && ((size_t)(const void *)((retoid) + 1) - (size_t)(const void *)(retoid) == 1) ? __builtin_strcmp (retoid, "2.16.840.1.113730.3.8.10.4.1") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (retoid); int __result = (((const unsigned char *) ( const char *) ("2.16.840.1.113730.3.8.10.4.1"))[0] - __s2[0]) ; if (__s2_len > 0 && __result == 0) { __result = ( ((const unsigned char *) (const char *) ("2.16.840.1.113730.3.8.10.4.1" ))[1] - __s2[1]); if (__s2_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("2.16.840.1.113730.3.8.10.4.1" ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) ("2.16.840.1.113730.3.8.10.4.1" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (retoid , "2.16.840.1.113730.3.8.10.4.1")))); }) == 0) { | |||
707 | is_v1 = true1; | |||
708 | } else if (strcmp(retoid, EXOP_SID2NAME_OID)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (retoid) && __builtin_constant_p ("2.16.840.1.113730.3.8.10.4" ) && (__s1_len = strlen (retoid), __s2_len = strlen ( "2.16.840.1.113730.3.8.10.4"), (!((size_t)(const void *)((retoid ) + 1) - (size_t)(const void *)(retoid) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("2.16.840.1.113730.3.8.10.4" ) + 1) - (size_t)(const void *)("2.16.840.1.113730.3.8.10.4") == 1) || __s2_len >= 4)) ? __builtin_strcmp (retoid, "2.16.840.1.113730.3.8.10.4" ) : (__builtin_constant_p (retoid) && ((size_t)(const void *)((retoid) + 1) - (size_t)(const void *)(retoid) == 1) && (__s1_len = strlen (retoid), __s1_len < 4) ? ( __builtin_constant_p ("2.16.840.1.113730.3.8.10.4") && ((size_t)(const void *)(("2.16.840.1.113730.3.8.10.4") + 1) - (size_t)(const void *)("2.16.840.1.113730.3.8.10.4") == 1) ? __builtin_strcmp (retoid, "2.16.840.1.113730.3.8.10.4") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("2.16.840.1.113730.3.8.10.4"); int __result = (((const unsigned char *) (const char *) (retoid))[0] - __s2[0]); if ( __s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (retoid))[1] - __s2[1]); if ( __s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (retoid))[2] - __s2[2]); if ( __s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (retoid))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("2.16.840.1.113730.3.8.10.4" ) && ((size_t)(const void *)(("2.16.840.1.113730.3.8.10.4" ) + 1) - (size_t)(const void *)("2.16.840.1.113730.3.8.10.4") == 1) && (__s2_len = strlen ("2.16.840.1.113730.3.8.10.4" ), __s2_len < 4) ? (__builtin_constant_p (retoid) && ((size_t)(const void *)((retoid) + 1) - (size_t)(const void * )(retoid) == 1) ? __builtin_strcmp (retoid, "2.16.840.1.113730.3.8.10.4" ) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (retoid); int __result = (((const unsigned char *) (const char *) ("2.16.840.1.113730.3.8.10.4"))[0] - __s2 [0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ("2.16.840.1.113730.3.8.10.4" ))[1] - __s2[1]); if (__s2_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("2.16.840.1.113730.3.8.10.4" ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) ("2.16.840.1.113730.3.8.10.4" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (retoid , "2.16.840.1.113730.3.8.10.4")))); }) == 0) { | |||
709 | is_v1 = false0; | |||
710 | } else { | |||
711 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 713, __FUNCTION__, __debug_macro_level, "Result has wrong OID, expected [%s] or [%s], got [%s].\n" , "2.16.840.1.113730.3.8.10.4", "2.16.840.1.113730.3.8.10.4.1" , retoid); } } while (0) | |||
712 | "Result has wrong OID, expected [%s] or [%s], got [%s].\n",do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 713, __FUNCTION__, __debug_macro_level, "Result has wrong OID, expected [%s] or [%s], got [%s].\n" , "2.16.840.1.113730.3.8.10.4", "2.16.840.1.113730.3.8.10.4.1" , retoid); } } while (0) | |||
713 | EXOP_SID2NAME_OID, EXOP_SID2NAME_V1_OID, retoid)do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 713, __FUNCTION__, __debug_macro_level, "Result has wrong OID, expected [%s] or [%s], got [%s].\n" , "2.16.840.1.113730.3.8.10.4", "2.16.840.1.113730.3.8.10.4.1" , retoid); } } while (0); | |||
714 | return EINVAL22; | |||
715 | } | |||
716 | ||||
717 | ber = ber_init(retdata); | |||
718 | if (ber == NULL((void*)0)) { | |||
719 | DEBUG(SSSDBG_OP_FAILURE, "ber_init failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 719, __FUNCTION__, __debug_macro_level, "ber_init failed.\n" ); } } while (0); | |||
720 | return EINVAL22; | |||
721 | } | |||
722 | ||||
723 | tag = ber_scanf(ber, "{e", &type); | |||
724 | if (tag == LBER_ERROR((ber_tag_t) -1)) { | |||
725 | DEBUG(SSSDBG_OP_FAILURE, "ber_scanf failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 725, __FUNCTION__, __debug_macro_level, "ber_scanf failed.\n" ); } } while (0); | |||
726 | ret = EINVAL22; | |||
727 | goto done; | |||
728 | } | |||
729 | ||||
730 | attrs = talloc_zero(mem_ctx, struct resp_attrs)(struct resp_attrs *)_talloc_zero(mem_ctx, sizeof(struct resp_attrs ), "struct resp_attrs"); | |||
731 | if (attrs == NULL((void*)0)) { | |||
732 | DEBUG(SSSDBG_OP_FAILURE, "talloc_zero failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 732, __FUNCTION__, __debug_macro_level, "talloc_zero failed.\n" ); } } while (0); | |||
733 | ret = ENOMEM12; | |||
734 | goto done; | |||
735 | } | |||
736 | ||||
737 | switch (type) { | |||
738 | case RESP_USER: | |||
739 | case RESP_USER_GROUPLIST: | |||
740 | tag = ber_scanf(ber, "{aaii", &domain_name, &name, &uid, &gid); | |||
741 | if (tag == LBER_ERROR((ber_tag_t) -1)) { | |||
742 | DEBUG(SSSDBG_OP_FAILURE, "ber_scanf failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 742, __FUNCTION__, __debug_macro_level, "ber_scanf failed.\n" ); } } while (0); | |||
743 | ret = EINVAL22; | |||
744 | goto done; | |||
745 | } | |||
746 | ||||
747 | /* Winbind is not consistent with the case of the returned user | |||
748 | * name. In general all names should be lower case but there are | |||
749 | * bug in some version of winbind which might lead to upper case | |||
750 | * letters in the name. To be on the safe side we explicitly | |||
751 | * lowercase the name. */ | |||
752 | attrs->a.user.pw_name = sss_tc_utf8_str_tolower(attrs, name); | |||
753 | if (attrs->a.user.pw_name == NULL((void*)0)) { | |||
754 | DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 754, __FUNCTION__, __debug_macro_level, "talloc_strdup failed.\n" ); } } while (0); | |||
755 | ret = ENOMEM12; | |||
756 | goto done; | |||
757 | } | |||
758 | ||||
759 | attrs->a.user.pw_uid = uid; | |||
760 | attrs->a.user.pw_gid = gid; | |||
761 | ||||
762 | if (is_v1 && type == RESP_USER_GROUPLIST) { | |||
763 | ret = add_v1_user_data(ber, attrs); | |||
764 | if (ret != EOK0) { | |||
765 | DEBUG(SSSDBG_OP_FAILURE, "add_v1_user_data failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 765, __FUNCTION__, __debug_macro_level, "add_v1_user_data failed.\n" ); } } while (0); | |||
766 | goto done; | |||
767 | } | |||
768 | } | |||
769 | ||||
770 | tag = ber_scanf(ber, "}}"); | |||
771 | if (tag == LBER_ERROR((ber_tag_t) -1)) { | |||
772 | DEBUG(SSSDBG_OP_FAILURE, "ber_scanf failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 772, __FUNCTION__, __debug_macro_level, "ber_scanf failed.\n" ); } } while (0); | |||
773 | ret = EINVAL22; | |||
774 | goto done; | |||
775 | } | |||
776 | ||||
777 | break; | |||
778 | case RESP_GROUP: | |||
779 | case RESP_GROUP_MEMBERS: | |||
780 | tag = ber_scanf(ber, "{aai", &domain_name, &name, &gid); | |||
781 | if (tag == LBER_ERROR((ber_tag_t) -1)) { | |||
782 | DEBUG(SSSDBG_OP_FAILURE, "ber_scanf failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 782, __FUNCTION__, __debug_macro_level, "ber_scanf failed.\n" ); } } while (0); | |||
783 | ret = EINVAL22; | |||
784 | goto done; | |||
785 | } | |||
786 | ||||
787 | /* Winbind is not consistent with the case of the returned user | |||
788 | * name. In general all names should be lower case but there are | |||
789 | * bug in some version of winbind which might lead to upper case | |||
790 | * letters in the name. To be on the safe side we explicitly | |||
791 | * lowercase the name. */ | |||
792 | attrs->a.group.gr_name = sss_tc_utf8_str_tolower(attrs, name); | |||
793 | if (attrs->a.group.gr_name == NULL((void*)0)) { | |||
794 | DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 794, __FUNCTION__, __debug_macro_level, "talloc_strdup failed.\n" ); } } while (0); | |||
795 | ret = ENOMEM12; | |||
796 | goto done; | |||
797 | } | |||
798 | ||||
799 | attrs->a.group.gr_gid = gid; | |||
800 | ||||
801 | if (is_v1 && type == RESP_GROUP_MEMBERS) { | |||
802 | ret = add_v1_group_data(ber, attrs); | |||
803 | if (ret != EOK0) { | |||
804 | DEBUG(SSSDBG_OP_FAILURE, "add_v1_group_data failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 804, __FUNCTION__, __debug_macro_level, "add_v1_group_data failed.\n" ); } } while (0); | |||
805 | goto done; | |||
806 | } | |||
807 | } | |||
808 | ||||
809 | tag = ber_scanf(ber, "}}"); | |||
810 | if (tag == LBER_ERROR((ber_tag_t) -1)) { | |||
811 | DEBUG(SSSDBG_OP_FAILURE, "ber_scanf failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 811, __FUNCTION__, __debug_macro_level, "ber_scanf failed.\n" ); } } while (0); | |||
812 | ret = EINVAL22; | |||
813 | goto done; | |||
814 | } | |||
815 | ||||
816 | break; | |||
817 | case RESP_SID: | |||
818 | tag = ber_scanf(ber, "a}", &sid_str); | |||
819 | if (tag == LBER_ERROR((ber_tag_t) -1)) { | |||
820 | DEBUG(SSSDBG_OP_FAILURE, "ber_scanf failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 820, __FUNCTION__, __debug_macro_level, "ber_scanf failed.\n" ); } } while (0); | |||
821 | ret = EINVAL22; | |||
822 | goto done; | |||
823 | } | |||
824 | ||||
825 | attrs->a.sid_str = talloc_strdup(attrs, sid_str); | |||
826 | if (attrs->a.sid_str == NULL((void*)0)) { | |||
827 | DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 827, __FUNCTION__, __debug_macro_level, "talloc_strdup failed.\n" ); } } while (0); | |||
828 | ret = ENOMEM12; | |||
829 | goto done; | |||
830 | } | |||
831 | break; | |||
832 | case RESP_NAME: | |||
833 | tag = ber_scanf(ber, "{aa}", &domain_name, &name); | |||
834 | if (tag == LBER_ERROR((ber_tag_t) -1)) { | |||
835 | DEBUG(SSSDBG_OP_FAILURE, "ber_scanf failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 835, __FUNCTION__, __debug_macro_level, "ber_scanf failed.\n" ); } } while (0); | |||
836 | ret = EINVAL22; | |||
837 | goto done; | |||
838 | } | |||
839 | ||||
840 | attrs->a.name = sss_tc_utf8_str_tolower(attrs, name); | |||
841 | if (attrs->a.name == NULL((void*)0)) { | |||
842 | DEBUG(SSSDBG_OP_FAILURE, "sss_tc_utf8_str_tolower failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 842, __FUNCTION__, __debug_macro_level, "sss_tc_utf8_str_tolower failed.\n" ); } } while (0); | |||
843 | ret = ENOMEM12; | |||
844 | goto done; | |||
845 | } | |||
846 | break; | |||
847 | default: | |||
848 | DEBUG(SSSDBG_OP_FAILURE, "Unexpected response type [%d].\n",do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 849, __FUNCTION__, __debug_macro_level, "Unexpected response type [%d].\n" , type); } } while (0) | |||
849 | type)do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 849, __FUNCTION__, __debug_macro_level, "Unexpected response type [%d].\n" , type); } } while (0); | |||
850 | ret = EINVAL22; | |||
851 | goto done; | |||
852 | } | |||
853 | ||||
854 | attrs->response_type = type; | |||
855 | if (type != RESP_SID) { | |||
856 | attrs->domain_name = talloc_strdup(attrs, domain_name); | |||
857 | if (attrs->domain_name == NULL((void*)0)) { | |||
858 | DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 858, __FUNCTION__, __debug_macro_level, "talloc_strdup failed.\n" ); } } while (0); | |||
859 | ret = ENOMEM12; | |||
860 | goto done; | |||
861 | } | |||
862 | } | |||
863 | ||||
864 | ret = EOK0; | |||
865 | ||||
866 | done: | |||
867 | ber_memfree(domain_name); | |||
868 | ber_memfree(name); | |||
869 | ber_free(ber, 1); | |||
870 | ||||
871 | if (ret == EOK0) { | |||
872 | *resp_attrs = attrs; | |||
873 | } else { | |||
874 | talloc_free(attrs)_talloc_free(attrs, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "874"); | |||
875 | } | |||
876 | ||||
877 | return ret; | |||
878 | } | |||
879 | ||||
880 | struct ipa_s2n_get_fqlist_state { | |||
881 | struct tevent_context *ev; | |||
882 | struct ipa_id_ctx *ipa_ctx; | |||
883 | struct sss_domain_info *dom; | |||
884 | struct sdap_handle *sh; | |||
885 | struct req_input req_input; | |||
886 | char **fqname_list; | |||
887 | size_t fqname_idx; | |||
888 | int exop_timeout; | |||
889 | int entry_type; | |||
890 | enum request_types request_type; | |||
891 | struct resp_attrs *attrs; | |||
892 | struct sss_domain_info *obj_domain; | |||
893 | struct sysdb_attrs *override_attrs; | |||
894 | }; | |||
895 | ||||
896 | static errno_t ipa_s2n_get_fqlist_step(struct tevent_req *req); | |||
897 | static void ipa_s2n_get_fqlist_get_override_done(struct tevent_req *subreq); | |||
898 | static void ipa_s2n_get_fqlist_next(struct tevent_req *subreq); | |||
899 | static errno_t ipa_s2n_get_fqlist_save_step(struct tevent_req *req); | |||
900 | ||||
901 | static struct tevent_req *ipa_s2n_get_fqlist_send(TALLOC_CTX *mem_ctx, | |||
902 | struct tevent_context *ev, | |||
903 | struct ipa_id_ctx *ipa_ctx, | |||
904 | struct sss_domain_info *dom, | |||
905 | struct sdap_handle *sh, | |||
906 | int exop_timeout, | |||
907 | int entry_type, | |||
908 | enum request_types request_type, | |||
909 | char **fqname_list) | |||
910 | { | |||
911 | int ret; | |||
912 | struct ipa_s2n_get_fqlist_state *state; | |||
913 | struct tevent_req *req; | |||
914 | ||||
915 | req = tevent_req_create(mem_ctx, &state, struct ipa_s2n_get_fqlist_state)_tevent_req_create((mem_ctx), (&state), sizeof(struct ipa_s2n_get_fqlist_state ), "struct ipa_s2n_get_fqlist_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "915"); | |||
916 | if (req == NULL((void*)0)) { | |||
917 | return NULL((void*)0); | |||
918 | } | |||
919 | ||||
920 | state->ev = ev; | |||
921 | state->ipa_ctx = ipa_ctx; | |||
922 | state->dom = dom; | |||
923 | state->sh = sh; | |||
924 | state->fqname_list = fqname_list; | |||
925 | state->fqname_idx = 0; | |||
926 | state->req_input.type = REQ_INP_NAME; | |||
927 | state->req_input.inp.name = NULL((void*)0); | |||
928 | state->exop_timeout = exop_timeout; | |||
929 | state->entry_type = entry_type; | |||
930 | state->request_type = request_type; | |||
931 | state->attrs = NULL((void*)0); | |||
932 | state->override_attrs = NULL((void*)0); | |||
933 | ||||
934 | ret = ipa_s2n_get_fqlist_step(req); | |||
935 | if (ret != EOK0) { | |||
936 | DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_get_fqlist_step failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 936, __FUNCTION__, __debug_macro_level, "ipa_s2n_get_fqlist_step failed.\n" ); } } while (0); | |||
937 | goto done; | |||
938 | } | |||
939 | ||||
940 | done: | |||
941 | if (ret != EOK0) { | |||
942 | tevent_req_error(req, ret)_tevent_req_error(req, ret, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "942"); | |||
943 | tevent_req_post(req, ev); | |||
944 | } | |||
945 | ||||
946 | return req; | |||
947 | } | |||
948 | ||||
949 | static errno_t ipa_s2n_get_fqlist_step(struct tevent_req *req) | |||
950 | { | |||
951 | int ret; | |||
952 | struct ipa_s2n_get_fqlist_state *state = tevent_req_data(req,(struct ipa_s2n_get_fqlist_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_get_fqlist_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "953") | |||
953 | struct ipa_s2n_get_fqlist_state)(struct ipa_s2n_get_fqlist_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_get_fqlist_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "953"); | |||
954 | struct berval *bv_req; | |||
955 | struct tevent_req *subreq; | |||
956 | struct sss_domain_info *parent_domain; | |||
957 | char *fqname = NULL((void*)0); | |||
958 | char *domain_name = NULL((void*)0); | |||
959 | ||||
960 | parent_domain = get_domains_head(state->dom); | |||
961 | ||||
962 | ret = sss_parse_name(state, parent_domain->names, | |||
963 | state->fqname_list[state->fqname_idx], | |||
964 | &domain_name, &fqname); | |||
965 | if (ret != EOK0) { | |||
966 | DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse name '%s' [%d]: %s\n",do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 968, __FUNCTION__, __debug_macro_level, "Unable to parse name '%s' [%d]: %s\n" , state->fqname_list[state->fqname_idx], ret, sss_strerror (ret)); } } while (0) | |||
967 | state->fqname_list[state->fqname_idx],do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 968, __FUNCTION__, __debug_macro_level, "Unable to parse name '%s' [%d]: %s\n" , state->fqname_list[state->fqname_idx], ret, sss_strerror (ret)); } } while (0) | |||
968 | ret, sss_strerror(ret))do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 968, __FUNCTION__, __debug_macro_level, "Unable to parse name '%s' [%d]: %s\n" , state->fqname_list[state->fqname_idx], ret, sss_strerror (ret)); } } while (0); | |||
969 | return ret; | |||
970 | } | |||
971 | ||||
972 | if (domain_name) { | |||
973 | state->obj_domain = find_domain_by_name(parent_domain, | |||
974 | domain_name, true1); | |||
975 | if (state->obj_domain == NULL((void*)0)) { | |||
976 | DEBUG(SSSDBG_OP_FAILURE, "find_domain_by_name failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 976, __FUNCTION__, __debug_macro_level, "find_domain_by_name failed.\n" ); } } while (0); | |||
977 | return ENOMEM12; | |||
978 | } | |||
979 | } else { | |||
980 | state->obj_domain = parent_domain; | |||
981 | } | |||
982 | ||||
983 | state->req_input.inp.name = fqname; | |||
984 | ||||
985 | ret = s2n_encode_request(state, state->obj_domain->name, state->entry_type, | |||
986 | state->request_type, | |||
987 | &state->req_input, &bv_req); | |||
988 | if (ret != EOK0) { | |||
989 | DEBUG(SSSDBG_OP_FAILURE, "s2n_encode_request failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 989, __FUNCTION__, __debug_macro_level, "s2n_encode_request failed.\n" ); } } while (0); | |||
990 | return ret; | |||
991 | } | |||
992 | ||||
993 | subreq = ipa_s2n_exop_send(state, state->ev, state->sh, true1, | |||
994 | state->exop_timeout, bv_req); | |||
995 | if (subreq == NULL((void*)0)) { | |||
996 | DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_exop_send failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 996, __FUNCTION__, __debug_macro_level, "ipa_s2n_exop_send failed.\n" ); } } while (0); | |||
997 | return ENOMEM12; | |||
998 | } | |||
999 | tevent_req_set_callback(subreq, ipa_s2n_get_fqlist_next, req); | |||
1000 | ||||
1001 | return EOK0; | |||
1002 | } | |||
1003 | ||||
1004 | static void ipa_s2n_get_fqlist_next(struct tevent_req *subreq) | |||
1005 | { | |||
1006 | int ret; | |||
1007 | struct tevent_req *req = tevent_req_callback_data(subreq,(struct tevent_req *)_talloc_get_type_abort(_tevent_req_callback_data (subreq), "struct tevent_req", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1008") | |||
1008 | struct tevent_req)(struct tevent_req *)_talloc_get_type_abort(_tevent_req_callback_data (subreq), "struct tevent_req", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1008"); | |||
1009 | struct ipa_s2n_get_fqlist_state *state = tevent_req_data(req,(struct ipa_s2n_get_fqlist_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_get_fqlist_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1010") | |||
1010 | struct ipa_s2n_get_fqlist_state)(struct ipa_s2n_get_fqlist_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_get_fqlist_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1010"); | |||
1011 | char *retoid = NULL((void*)0); | |||
1012 | struct berval *retdata = NULL((void*)0); | |||
1013 | const char *sid_str; | |||
1014 | struct be_acct_req *ar; | |||
1015 | ||||
1016 | ret = ipa_s2n_exop_recv(subreq, state, &retoid, &retdata); | |||
1017 | talloc_zfree(subreq)do { _talloc_free(((void *)((uintptr_t)(subreq))), "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1017"); subreq = ((void*)0); } while(0); | |||
1018 | if (ret != EOK0) { | |||
1019 | DEBUG(SSSDBG_OP_FAILURE, "s2n exop request failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1019, __FUNCTION__, __debug_macro_level, "s2n exop request failed.\n" ); } } while (0); | |||
1020 | goto fail; | |||
1021 | } | |||
1022 | ||||
1023 | talloc_zfree(state->attrs)do { _talloc_free(((void *)((uintptr_t)(state->attrs))), "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1023"); state->attrs = ((void*)0); } while(0); | |||
1024 | ret = s2n_response_to_attrs(state, retoid, retdata, &state->attrs); | |||
1025 | if (ret != EOK0) { | |||
1026 | DEBUG(SSSDBG_OP_FAILURE, "s2n_response_to_attrs failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1026, __FUNCTION__, __debug_macro_level, "s2n_response_to_attrs failed.\n" ); } } while (0); | |||
1027 | goto fail; | |||
1028 | } | |||
1029 | ||||
1030 | if (strcmp(state->ipa_ctx->view_name, SYSDB_DEFAULT_VIEW_NAME)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (state->ipa_ctx->view_name) && __builtin_constant_p ("default") && (__s1_len = strlen (state->ipa_ctx ->view_name), __s2_len = strlen ("default"), (!((size_t)(const void *)((state->ipa_ctx->view_name) + 1) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("default") + 1) - ( size_t)(const void *)("default") == 1) || __s2_len >= 4)) ? __builtin_strcmp (state->ipa_ctx->view_name, "default" ) : (__builtin_constant_p (state->ipa_ctx->view_name) && ((size_t)(const void *)((state->ipa_ctx->view_name) + 1 ) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) && (__s1_len = strlen (state->ipa_ctx->view_name ), __s1_len < 4) ? (__builtin_constant_p ("default") && ((size_t)(const void *)(("default") + 1) - (size_t)(const void *)("default") == 1) ? __builtin_strcmp (state->ipa_ctx-> view_name, "default") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("default"); int __result = (((const unsigned char *) (const char *) (state-> ipa_ctx->view_name))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (state->ipa_ctx->view_name))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (state->ipa_ctx->view_name ))[2] - __s2[2]); if (__s1_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) (state-> ipa_ctx->view_name))[3] - __s2[3]); } } __result; }))) : ( __builtin_constant_p ("default") && ((size_t)(const void *)(("default") + 1) - (size_t)(const void *)("default") == 1 ) && (__s2_len = strlen ("default"), __s2_len < 4) ? (__builtin_constant_p (state->ipa_ctx->view_name) && ((size_t)(const void *)((state->ipa_ctx->view_name) + 1 ) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) ? __builtin_strcmp (state->ipa_ctx->view_name, "default" ) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (state->ipa_ctx->view_name); int __result = (((const unsigned char *) (const char *) ("default" ))[0] - __s2[0]); if (__s2_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("default" ))[1] - __s2[1]); if (__s2_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("default" ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) ("default" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (state ->ipa_ctx->view_name, "default")))); }) == 0) { | |||
1031 | ret = ipa_s2n_get_fqlist_save_step(req); | |||
1032 | if (ret == EOK0) { | |||
1033 | tevent_req_done(req)_tevent_req_done(req, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1033"); | |||
1034 | } else if (ret != EAGAIN11) { | |||
1035 | DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_get_fqlist_save_step failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1035, __FUNCTION__, __debug_macro_level, "ipa_s2n_get_fqlist_save_step failed.\n" ); } } while (0); | |||
1036 | goto fail; | |||
1037 | } | |||
1038 | ||||
1039 | return; | |||
1040 | } | |||
1041 | ||||
1042 | ret = sysdb_attrs_get_string(state->attrs->sysdb_attrs, SYSDB_SID_STR"objectSIDString", | |||
1043 | &sid_str); | |||
1044 | if (ret != EOK0) { | |||
1045 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_attrs_get_string failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1045, __FUNCTION__, __debug_macro_level, "sysdb_attrs_get_string failed.\n" ); } } while (0); | |||
1046 | goto fail; | |||
1047 | } | |||
1048 | ||||
1049 | ret = get_be_acct_req_for_sid(state, sid_str, state->obj_domain->name, &ar); | |||
1050 | if (ret != EOK0) { | |||
1051 | DEBUG(SSSDBG_OP_FAILURE, "get_be_acct_req_for_sid failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1051, __FUNCTION__, __debug_macro_level, "get_be_acct_req_for_sid failed.\n" ); } } while (0); | |||
1052 | goto fail; | |||
1053 | } | |||
1054 | ||||
1055 | subreq = ipa_get_ad_override_send(state, state->ev, | |||
1056 | state->ipa_ctx->sdap_id_ctx, | |||
1057 | state->ipa_ctx->ipa_options, | |||
1058 | dp_opt_get_string(state->ipa_ctx->ipa_options->basic,_dp_opt_get_string(state->ipa_ctx->ipa_options->basic , IPA_KRB5_REALM, __FUNCTION__) | |||
1059 | IPA_KRB5_REALM)_dp_opt_get_string(state->ipa_ctx->ipa_options->basic , IPA_KRB5_REALM, __FUNCTION__), | |||
1060 | state->ipa_ctx->view_name, | |||
1061 | ar); | |||
1062 | if (subreq == NULL((void*)0)) { | |||
1063 | DEBUG(SSSDBG_OP_FAILURE, "ipa_get_ad_override_send failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1063, __FUNCTION__, __debug_macro_level, "ipa_get_ad_override_send failed.\n" ); } } while (0); | |||
1064 | ret = ENOMEM12; | |||
1065 | goto fail; | |||
1066 | } | |||
1067 | tevent_req_set_callback(subreq, ipa_s2n_get_fqlist_get_override_done, req); | |||
1068 | ||||
1069 | return; | |||
1070 | ||||
1071 | fail: | |||
1072 | tevent_req_error(req,ret)_tevent_req_error(req, ret, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1072"); | |||
1073 | return; | |||
1074 | } | |||
1075 | ||||
1076 | static void ipa_s2n_get_fqlist_get_override_done(struct tevent_req *subreq) | |||
1077 | { | |||
1078 | int ret; | |||
1079 | struct tevent_req *req = tevent_req_callback_data(subreq,(struct tevent_req *)_talloc_get_type_abort(_tevent_req_callback_data (subreq), "struct tevent_req", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1080") | |||
1080 | struct tevent_req)(struct tevent_req *)_talloc_get_type_abort(_tevent_req_callback_data (subreq), "struct tevent_req", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1080"); | |||
1081 | struct ipa_s2n_get_fqlist_state *state = tevent_req_data(req,(struct ipa_s2n_get_fqlist_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_get_fqlist_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1082") | |||
1082 | struct ipa_s2n_get_fqlist_state)(struct ipa_s2n_get_fqlist_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_get_fqlist_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1082"); | |||
1083 | ||||
1084 | ret = ipa_get_ad_override_recv(subreq, NULL((void*)0), state, &state->override_attrs); | |||
1085 | talloc_zfree(subreq)do { _talloc_free(((void *)((uintptr_t)(subreq))), "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1085"); subreq = ((void*)0); } while(0); | |||
1086 | if (ret != EOK0) { | |||
1087 | DEBUG(SSSDBG_OP_FAILURE, "IPA override lookup failed: %d\n", ret)do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1087, __FUNCTION__, __debug_macro_level, "IPA override lookup failed: %d\n" , ret); } } while (0); | |||
1088 | goto fail; | |||
1089 | } | |||
1090 | ||||
1091 | ret = ipa_s2n_get_fqlist_save_step(req); | |||
1092 | if (ret == EOK0) { | |||
1093 | tevent_req_done(req)_tevent_req_done(req, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1093"); | |||
1094 | } else if (ret != EAGAIN11) { | |||
1095 | DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_get_fqlist_save_step failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1095, __FUNCTION__, __debug_macro_level, "ipa_s2n_get_fqlist_save_step failed.\n" ); } } while (0); | |||
1096 | goto fail; | |||
1097 | } | |||
1098 | ||||
1099 | return; | |||
1100 | ||||
1101 | fail: | |||
1102 | tevent_req_error(req,ret)_tevent_req_error(req, ret, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1102"); | |||
1103 | return; | |||
1104 | } | |||
1105 | ||||
1106 | static errno_t ipa_s2n_get_fqlist_save_step(struct tevent_req *req) | |||
1107 | { | |||
1108 | int ret; | |||
1109 | struct ipa_s2n_get_fqlist_state *state = tevent_req_data(req,(struct ipa_s2n_get_fqlist_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_get_fqlist_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1110") | |||
1110 | struct ipa_s2n_get_fqlist_state)(struct ipa_s2n_get_fqlist_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_get_fqlist_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1110"); | |||
1111 | ||||
1112 | ret = ipa_s2n_save_objects(state->dom, &state->req_input, state->attrs, | |||
1113 | NULL((void*)0), state->ipa_ctx->view_name, | |||
1114 | state->override_attrs); | |||
1115 | if (ret != EOK0) { | |||
1116 | DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_save_objects failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1116, __FUNCTION__, __debug_macro_level, "ipa_s2n_save_objects failed.\n" ); } } while (0); | |||
1117 | return ret; | |||
1118 | } | |||
1119 | ||||
1120 | state->fqname_idx++; | |||
1121 | if (state->fqname_list[state->fqname_idx] == NULL((void*)0)) { | |||
1122 | return EOK0; | |||
1123 | } | |||
1124 | ||||
1125 | ret = ipa_s2n_get_fqlist_step(req); | |||
1126 | if (ret != EOK0) { | |||
1127 | DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_get_fqlist_step failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1127, __FUNCTION__, __debug_macro_level, "ipa_s2n_get_fqlist_step failed.\n" ); } } while (0); | |||
1128 | return ret; | |||
1129 | } | |||
1130 | ||||
1131 | return EAGAIN11; | |||
1132 | } | |||
1133 | ||||
1134 | static int ipa_s2n_get_fqlist_recv(struct tevent_req *req) | |||
1135 | { | |||
1136 | TEVENT_REQ_RETURN_ON_ERROR(req)do { enum tevent_req_state TRROEstate; uint64_t TRROEerr; if ( tevent_req_is_error(req, &TRROEstate, &TRROEerr)) { if (TRROEstate == TEVENT_REQ_USER_ERROR && TRROEerr != 0 ) { return TRROEerr; } return ERR_INTERNAL; } } while (0); | |||
1137 | ||||
1138 | return EOK0; | |||
1139 | } | |||
1140 | ||||
1141 | struct ipa_s2n_get_user_state { | |||
1142 | struct tevent_context *ev; | |||
1143 | struct ipa_id_ctx *ipa_ctx; | |||
1144 | struct sdap_options *opts; | |||
1145 | struct sss_domain_info *dom; | |||
1146 | struct sdap_handle *sh; | |||
1147 | struct req_input *req_input; | |||
1148 | int entry_type; | |||
1149 | enum request_types request_type; | |||
1150 | struct resp_attrs *attrs; | |||
1151 | struct resp_attrs *simple_attrs; | |||
1152 | struct sysdb_attrs *override_attrs; | |||
1153 | int exop_timeout; | |||
1154 | }; | |||
1155 | ||||
1156 | static void ipa_s2n_get_user_done(struct tevent_req *subreq); | |||
1157 | ||||
1158 | struct tevent_req *ipa_s2n_get_acct_info_send(TALLOC_CTX *mem_ctx, | |||
1159 | struct tevent_context *ev, | |||
1160 | struct ipa_id_ctx *ipa_ctx, | |||
1161 | struct sdap_options *opts, | |||
1162 | struct sss_domain_info *dom, | |||
1163 | struct sysdb_attrs *override_attrs, | |||
1164 | struct sdap_handle *sh, | |||
1165 | int entry_type, | |||
1166 | struct req_input *req_input) | |||
1167 | { | |||
1168 | struct ipa_s2n_get_user_state *state; | |||
1169 | struct tevent_req *req; | |||
1170 | struct tevent_req *subreq; | |||
1171 | struct berval *bv_req = NULL((void*)0); | |||
1172 | int ret = EFAULT14; | |||
1173 | bool_Bool is_v1 = false0; | |||
1174 | ||||
1175 | req = tevent_req_create(mem_ctx, &state, struct ipa_s2n_get_user_state)_tevent_req_create((mem_ctx), (&state), sizeof(struct ipa_s2n_get_user_state ), "struct ipa_s2n_get_user_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1175"); | |||
1176 | if (req == NULL((void*)0)) { | |||
1177 | return NULL((void*)0); | |||
1178 | } | |||
1179 | ||||
1180 | state->ev = ev; | |||
1181 | state->ipa_ctx = ipa_ctx; | |||
1182 | state->opts = opts; | |||
1183 | state->dom = dom; | |||
1184 | state->sh = sh; | |||
1185 | state->req_input = req_input; | |||
1186 | state->entry_type = entry_type; | |||
1187 | state->attrs = NULL((void*)0); | |||
1188 | state->simple_attrs = NULL((void*)0); | |||
1189 | state->exop_timeout = dp_opt_get_int(opts->basic, SDAP_SEARCH_TIMEOUT)_dp_opt_get_int(opts->basic, SDAP_SEARCH_TIMEOUT, __FUNCTION__ ); | |||
1190 | state->override_attrs = override_attrs; | |||
1191 | ||||
1192 | if (sdap_is_extension_supported(sh, EXOP_SID2NAME_V1_OID)sdap_check_sup_list(&((sh)->supported_extensions), "2.16.840.1.113730.3.8.10.4.1" )) { | |||
1193 | state->request_type = REQ_FULL_WITH_MEMBERS; | |||
1194 | is_v1 = true1; | |||
1195 | } else if (sdap_is_extension_supported(sh, EXOP_SID2NAME_OID)sdap_check_sup_list(&((sh)->supported_extensions), "2.16.840.1.113730.3.8.10.4" )) { | |||
1196 | state->request_type = REQ_FULL; | |||
1197 | is_v1 = false0; | |||
1198 | } else { | |||
1199 | DEBUG(SSSDBG_CRIT_FAILURE, "Extdom not supported on the server, "do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1200, __FUNCTION__, __debug_macro_level, "Extdom not supported on the server, " "cannot resolve objects from trusted domains.\n"); } } while (0) | |||
1200 | "cannot resolve objects from trusted domains.\n")do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1200, __FUNCTION__, __debug_macro_level, "Extdom not supported on the server, " "cannot resolve objects from trusted domains.\n"); } } while (0); | |||
1201 | ret = EIO5; | |||
1202 | goto fail; | |||
1203 | } | |||
1204 | ||||
1205 | ret = s2n_encode_request(state, dom->name, entry_type, state->request_type, | |||
1206 | req_input, &bv_req); | |||
1207 | if (ret != EOK0) { | |||
1208 | goto fail; | |||
1209 | } | |||
1210 | ||||
1211 | subreq = ipa_s2n_exop_send(state, state->ev, state->sh, is_v1, | |||
1212 | state->exop_timeout, bv_req); | |||
1213 | if (subreq == NULL((void*)0)) { | |||
1214 | DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_exop_send failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1214, __FUNCTION__, __debug_macro_level, "ipa_s2n_exop_send failed.\n" ); } } while (0); | |||
1215 | ret = ENOMEM12; | |||
1216 | goto fail; | |||
1217 | } | |||
1218 | tevent_req_set_callback(subreq, ipa_s2n_get_user_done, req); | |||
1219 | ||||
1220 | return req; | |||
1221 | ||||
1222 | fail: | |||
1223 | tevent_req_error(req, ret)_tevent_req_error(req, ret, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1223"); | |||
1224 | tevent_req_post(req, ev); | |||
1225 | ||||
1226 | return req; | |||
1227 | } | |||
1228 | ||||
1229 | static errno_t process_members(struct sss_domain_info *domain, | |||
1230 | struct sysdb_attrs *group_attrs, | |||
1231 | char **members, | |||
1232 | TALLOC_CTX *mem_ctx, char ***_missing_members) | |||
1233 | { | |||
1234 | int ret; | |||
1235 | size_t c; | |||
1236 | TALLOC_CTX *tmp_ctx; | |||
1237 | struct ldb_message *msg; | |||
1238 | const char *dn_str; | |||
1239 | struct sss_domain_info *obj_domain; | |||
1240 | struct sss_domain_info *parent_domain; | |||
1241 | char **missing_members = NULL((void*)0); | |||
1242 | size_t miss_count; | |||
| ||||
1243 | ||||
1244 | if (members == NULL((void*)0)) { | |||
1245 | DEBUG(SSSDBG_TRACE_INTERNAL, "No members\n")do { int __debug_macro_level = 0x2000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1245, __FUNCTION__, __debug_macro_level, "No members\n"); } } while (0); | |||
1246 | return EOK0; | |||
1247 | } | |||
1248 | ||||
1249 | tmp_ctx = talloc_new(NULL)talloc_named_const(((void*)0), 0, "talloc_new: " "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1249"); | |||
1250 | if (tmp_ctx == NULL((void*)0)) { | |||
1251 | DEBUG(SSSDBG_OP_FAILURE, "talloc_new failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1251, __FUNCTION__, __debug_macro_level, "talloc_new failed.\n" ); } } while (0); | |||
1252 | return ENOMEM12; | |||
1253 | } | |||
1254 | ||||
1255 | if (_missing_members != NULL((void*)0) && mem_ctx != NULL((void*)0)) { | |||
1256 | /* count members */ | |||
1257 | for (c = 0; members[c] != NULL((void*)0); c++); | |||
1258 | missing_members = talloc_zero_array(tmp_ctx, char *, c + 1)(char * *)_talloc_zero_array(tmp_ctx, sizeof(char *), c + 1, "char *" ); | |||
1259 | if (missing_members == NULL((void*)0)) { | |||
1260 | DEBUG(SSSDBG_OP_FAILURE, "talloc_array_zero failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1260, __FUNCTION__, __debug_macro_level, "talloc_array_zero failed.\n" ); } } while (0); | |||
1261 | ret = ENOMEM12; | |||
1262 | goto done; | |||
1263 | } | |||
1264 | miss_count = 0; | |||
1265 | } | |||
1266 | ||||
1267 | parent_domain = get_domains_head(domain); | |||
1268 | ||||
1269 | for (c = 0; members[c] != NULL((void*)0); c++) { | |||
1270 | obj_domain = find_domain_by_object_name(parent_domain, members[c]); | |||
1271 | if (obj_domain == NULL((void*)0)) { | |||
1272 | DEBUG(SSSDBG_OP_FAILURE, "find_domain_by_object_name failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1272, __FUNCTION__, __debug_macro_level, "find_domain_by_object_name failed.\n" ); } } while (0); | |||
1273 | ret = ENOMEM12; | |||
1274 | goto done; | |||
1275 | } | |||
1276 | ||||
1277 | ret = sysdb_search_user_by_name(tmp_ctx, obj_domain, members[c], NULL((void*)0), | |||
1278 | &msg); | |||
1279 | if (ret == EOK0) { | |||
1280 | if (group_attrs != NULL((void*)0)) { | |||
1281 | dn_str = ldb_dn_get_linearized(msg->dn); | |||
1282 | if (dn_str == NULL((void*)0)) { | |||
1283 | DEBUG(SSSDBG_OP_FAILURE, "ldb_dn_get_linearized failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1283, __FUNCTION__, __debug_macro_level, "ldb_dn_get_linearized failed.\n" ); } } while (0); | |||
1284 | goto done; | |||
1285 | } | |||
1286 | ||||
1287 | DEBUG(SSSDBG_TRACE_ALL, "Adding member [%s][%s]\n",do { int __debug_macro_level = 0x4000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1288, __FUNCTION__, __debug_macro_level, "Adding member [%s][%s]\n" , members[c], dn_str); } } while (0) | |||
1288 | members[c], dn_str)do { int __debug_macro_level = 0x4000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1288, __FUNCTION__, __debug_macro_level, "Adding member [%s][%s]\n" , members[c], dn_str); } } while (0); | |||
1289 | ||||
1290 | ret = sysdb_attrs_add_string(group_attrs, SYSDB_MEMBER"member", dn_str); | |||
1291 | if (ret != EOK0) { | |||
1292 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1293, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_string failed.\n" ); } } while (0) | |||
1293 | "sysdb_attrs_add_string failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1293, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_string failed.\n" ); } } while (0); | |||
1294 | goto done; | |||
1295 | } | |||
1296 | } | |||
1297 | } else if (ret == ENOENT2) { | |||
1298 | if (group_attrs != NULL((void*)0)) { | |||
1299 | DEBUG(SSSDBG_TRACE_ALL, "Adding ghost member [%s]\n",do { int __debug_macro_level = 0x4000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1300, __FUNCTION__, __debug_macro_level, "Adding ghost member [%s]\n" , members[c]); } } while (0) | |||
1300 | members[c])do { int __debug_macro_level = 0x4000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1300, __FUNCTION__, __debug_macro_level, "Adding ghost member [%s]\n" , members[c]); } } while (0); | |||
1301 | ||||
1302 | ret = sysdb_attrs_add_string(group_attrs, SYSDB_GHOST"ghost", | |||
1303 | members[c]); | |||
1304 | if (ret != EOK0) { | |||
1305 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1306, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_string failed.\n" ); } } while (0) | |||
1306 | "sysdb_attrs_add_string failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1306, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_string failed.\n" ); } } while (0); | |||
1307 | goto done; | |||
1308 | } | |||
1309 | } | |||
1310 | ||||
1311 | if (missing_members != NULL((void*)0)) { | |||
1312 | missing_members[miss_count] = talloc_strdup(missing_members, | |||
1313 | members[c]); | |||
1314 | if (missing_members[miss_count] == NULL((void*)0)) { | |||
1315 | DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1315, __FUNCTION__, __debug_macro_level, "talloc_strdup failed.\n" ); } } while (0); | |||
1316 | ret = ENOMEM12; | |||
1317 | goto done; | |||
1318 | } | |||
1319 | miss_count++; | |||
1320 | } | |||
1321 | } else { | |||
1322 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_search_user_by_name failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1322, __FUNCTION__, __debug_macro_level, "sysdb_search_user_by_name failed.\n" ); } } while (0); | |||
1323 | goto done; | |||
1324 | } | |||
1325 | } | |||
1326 | ||||
1327 | if (_missing_members != NULL((void*)0)) { | |||
1328 | if (miss_count == 0) { | |||
| ||||
1329 | *_missing_members = NULL((void*)0); | |||
1330 | } else { | |||
1331 | if (mem_ctx != NULL((void*)0)) { | |||
1332 | *_missing_members = talloc_steal(mem_ctx, missing_members)({ __typeof__(missing_members) __talloc_steal_ret = (__typeof__ (missing_members))_talloc_steal_loc((mem_ctx),(missing_members ), "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1332"); __talloc_steal_ret ; }); | |||
1333 | } else { | |||
1334 | DEBUG(SSSDBG_CRIT_FAILURE,do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1335, __FUNCTION__, __debug_macro_level, "Missing memory context for missing members list.\n" ); } } while (0) | |||
1335 | "Missing memory context for missing members list.\n")do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1335, __FUNCTION__, __debug_macro_level, "Missing memory context for missing members list.\n" ); } } while (0); | |||
1336 | ret = EINVAL22; | |||
1337 | goto done; | |||
1338 | } | |||
1339 | } | |||
1340 | } | |||
1341 | ||||
1342 | ret = EOK0; | |||
1343 | done: | |||
1344 | talloc_free(tmp_ctx)_talloc_free(tmp_ctx, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1344"); | |||
1345 | ||||
1346 | return ret; | |||
1347 | } | |||
1348 | ||||
1349 | static errno_t get_group_dn_list(TALLOC_CTX *mem_ctx, | |||
1350 | struct sss_domain_info *dom, | |||
1351 | size_t ngroups, char **groups, | |||
1352 | struct ldb_dn ***_dn_list, | |||
1353 | char ***_missing_groups) | |||
1354 | { | |||
1355 | int ret; | |||
1356 | size_t c; | |||
1357 | TALLOC_CTX *tmp_ctx; | |||
1358 | struct ldb_dn **dn_list = NULL((void*)0); | |||
1359 | char **missing_groups = NULL((void*)0); | |||
1360 | struct ldb_message *msg = NULL((void*)0); | |||
1361 | size_t n_dns = 0; | |||
1362 | size_t n_missing = 0; | |||
1363 | struct sss_domain_info *obj_domain; | |||
1364 | struct sss_domain_info *parent_domain; | |||
1365 | ||||
1366 | tmp_ctx = talloc_new(NULL)talloc_named_const(((void*)0), 0, "talloc_new: " "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1366"); | |||
1367 | if (tmp_ctx == NULL((void*)0)) { | |||
1368 | DEBUG(SSSDBG_OP_FAILURE, "talloc_new failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1368, __FUNCTION__, __debug_macro_level, "talloc_new failed.\n" ); } } while (0); | |||
1369 | return ENOMEM12; | |||
1370 | } | |||
1371 | ||||
1372 | dn_list = talloc_zero_array(tmp_ctx, struct ldb_dn *, ngroups + 1)(struct ldb_dn * *)_talloc_zero_array(tmp_ctx, sizeof(struct ldb_dn *), ngroups + 1, "struct ldb_dn *"); | |||
1373 | missing_groups = talloc_zero_array(tmp_ctx, char *, ngroups + 1)(char * *)_talloc_zero_array(tmp_ctx, sizeof(char *), ngroups + 1, "char *"); | |||
1374 | if (dn_list == NULL((void*)0) || missing_groups == NULL((void*)0)) { | |||
1375 | DEBUG(SSSDBG_OP_FAILURE, "talloc_array_zero failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1375, __FUNCTION__, __debug_macro_level, "talloc_array_zero failed.\n" ); } } while (0); | |||
1376 | ret = ENOMEM12; | |||
1377 | goto done; | |||
1378 | } | |||
1379 | ||||
1380 | parent_domain = (dom->parent == NULL((void*)0)) ? dom : dom->parent; | |||
1381 | ||||
1382 | for (c = 0; c < ngroups; c++) { | |||
1383 | obj_domain = find_domain_by_object_name(parent_domain, groups[c]); | |||
1384 | if (obj_domain == NULL((void*)0)) { | |||
1385 | DEBUG(SSSDBG_OP_FAILURE, "find_domain_by_object_name failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1385, __FUNCTION__, __debug_macro_level, "find_domain_by_object_name failed.\n" ); } } while (0); | |||
1386 | ret = ENOMEM12; | |||
1387 | goto done; | |||
1388 | } | |||
1389 | ||||
1390 | ret = sysdb_search_group_by_name(tmp_ctx, obj_domain, groups[c], NULL((void*)0), | |||
1391 | &msg); | |||
1392 | if (ret == EOK0) { | |||
1393 | dn_list[n_dns] = ldb_dn_copy(dn_list, msg->dn); | |||
1394 | if (dn_list[n_dns] == NULL((void*)0)) { | |||
1395 | DEBUG(SSSDBG_OP_FAILURE, "ldb_dn_copy failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1395, __FUNCTION__, __debug_macro_level, "ldb_dn_copy failed.\n" ); } } while (0); | |||
1396 | ret = ENOMEM12; | |||
1397 | goto done; | |||
1398 | } | |||
1399 | n_dns++; | |||
1400 | } else if (ret == ENOENT2) { | |||
1401 | missing_groups[n_missing] = talloc_strdup(missing_groups, | |||
1402 | groups[c]); | |||
1403 | if (missing_groups[n_missing] == NULL((void*)0)) { | |||
1404 | DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1404, __FUNCTION__, __debug_macro_level, "talloc_strdup failed.\n" ); } } while (0); | |||
1405 | ret = ENOMEM12; | |||
1406 | goto done; | |||
1407 | } | |||
1408 | n_missing++; | |||
1409 | } else { | |||
1410 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_search_group_by_name failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1410, __FUNCTION__, __debug_macro_level, "sysdb_search_group_by_name failed.\n" ); } } while (0); | |||
1411 | goto done; | |||
1412 | } | |||
1413 | } | |||
1414 | ||||
1415 | if (n_missing != 0) { | |||
1416 | *_missing_groups = talloc_steal(mem_ctx, missing_groups)({ __typeof__(missing_groups) __talloc_steal_ret = (__typeof__ (missing_groups))_talloc_steal_loc((mem_ctx),(missing_groups) , "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1416"); __talloc_steal_ret ; }); | |||
1417 | } else { | |||
1418 | *_missing_groups = NULL((void*)0); | |||
1419 | } | |||
1420 | ||||
1421 | if (n_dns != 0) { | |||
1422 | *_dn_list = talloc_steal(mem_ctx, dn_list)({ __typeof__(dn_list) __talloc_steal_ret = (__typeof__(dn_list ))_talloc_steal_loc((mem_ctx),(dn_list), "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1422"); __talloc_steal_ret; }); | |||
1423 | } else { | |||
1424 | *dn_list = NULL((void*)0); | |||
1425 | } | |||
1426 | ||||
1427 | ret = EOK0; | |||
1428 | ||||
1429 | done: | |||
1430 | talloc_free(tmp_ctx)_talloc_free(tmp_ctx, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1430"); | |||
1431 | ||||
1432 | return ret; | |||
1433 | } | |||
1434 | ||||
1435 | static void ipa_s2n_get_fqlist_done(struct tevent_req *subreq); | |||
1436 | static void ipa_s2n_get_user_get_override_done(struct tevent_req *subreq); | |||
1437 | static void ipa_s2n_get_user_done(struct tevent_req *subreq) | |||
1438 | { | |||
1439 | struct tevent_req *req = tevent_req_callback_data(subreq,(struct tevent_req *)_talloc_get_type_abort(_tevent_req_callback_data (subreq), "struct tevent_req", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1440") | |||
1440 | struct tevent_req)(struct tevent_req *)_talloc_get_type_abort(_tevent_req_callback_data (subreq), "struct tevent_req", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1440"); | |||
1441 | struct ipa_s2n_get_user_state *state = tevent_req_data(req,(struct ipa_s2n_get_user_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_get_user_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1442") | |||
1442 | struct ipa_s2n_get_user_state)(struct ipa_s2n_get_user_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_get_user_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1442"); | |||
1443 | int ret; | |||
1444 | char *retoid = NULL((void*)0); | |||
1445 | struct berval *retdata = NULL((void*)0); | |||
1446 | struct resp_attrs *attrs = NULL((void*)0); | |||
1447 | struct berval *bv_req = NULL((void*)0); | |||
1448 | char **missing_list = NULL((void*)0); | |||
1449 | struct ldb_dn **group_dn_list = NULL((void*)0); | |||
1450 | const char *sid_str; | |||
1451 | struct be_acct_req *ar; | |||
1452 | ||||
1453 | ret = ipa_s2n_exop_recv(subreq, state, &retoid, &retdata); | |||
1454 | talloc_zfree(subreq)do { _talloc_free(((void *)((uintptr_t)(subreq))), "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1454"); subreq = ((void*)0); } while(0); | |||
1455 | if (ret != EOK0) { | |||
1456 | DEBUG(SSSDBG_OP_FAILURE, "s2n exop request failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1456, __FUNCTION__, __debug_macro_level, "s2n exop request failed.\n" ); } } while (0); | |||
1457 | goto done; | |||
1458 | } | |||
1459 | ||||
1460 | switch (state->request_type) { | |||
1461 | case REQ_FULL_WITH_MEMBERS: | |||
1462 | case REQ_FULL: | |||
1463 | ret = s2n_response_to_attrs(state, retoid, retdata, &attrs); | |||
1464 | if (ret != EOK0) { | |||
1465 | DEBUG(SSSDBG_OP_FAILURE, "s2n_response_to_attrs failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1465, __FUNCTION__, __debug_macro_level, "s2n_response_to_attrs failed.\n" ); } } while (0); | |||
1466 | goto done; | |||
1467 | } | |||
1468 | ||||
1469 | if (!(strcasecmp(state->dom->name, attrs->domain_name) == 0 || | |||
1470 | (state->dom->flat_name != NULL((void*)0) && | |||
1471 | strcasecmp(state->dom->flat_name, attrs->domain_name) == 0))) { | |||
1472 | DEBUG(SSSDBG_OP_FAILURE, "Unexpected domain name returned, "do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1477, __FUNCTION__, __debug_macro_level, "Unexpected domain name returned, " "expected [%s] or [%s], got [%s].\n", state->dom->name , state->dom->flat_name == ((void*)0) ? "" : state-> dom->flat_name, attrs->domain_name); } } while (0) | |||
1473 | "expected [%s] or [%s], got [%s].\n",do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1477, __FUNCTION__, __debug_macro_level, "Unexpected domain name returned, " "expected [%s] or [%s], got [%s].\n", state->dom->name , state->dom->flat_name == ((void*)0) ? "" : state-> dom->flat_name, attrs->domain_name); } } while (0) | |||
1474 | state->dom->name,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1477, __FUNCTION__, __debug_macro_level, "Unexpected domain name returned, " "expected [%s] or [%s], got [%s].\n", state->dom->name , state->dom->flat_name == ((void*)0) ? "" : state-> dom->flat_name, attrs->domain_name); } } while (0) | |||
1475 | state->dom->flat_name == NULL ? "" :do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1477, __FUNCTION__, __debug_macro_level, "Unexpected domain name returned, " "expected [%s] or [%s], got [%s].\n", state->dom->name , state->dom->flat_name == ((void*)0) ? "" : state-> dom->flat_name, attrs->domain_name); } } while (0) | |||
1476 | state->dom->flat_name,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1477, __FUNCTION__, __debug_macro_level, "Unexpected domain name returned, " "expected [%s] or [%s], got [%s].\n", state->dom->name , state->dom->flat_name == ((void*)0) ? "" : state-> dom->flat_name, attrs->domain_name); } } while (0) | |||
1477 | attrs->domain_name)do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1477, __FUNCTION__, __debug_macro_level, "Unexpected domain name returned, " "expected [%s] or [%s], got [%s].\n", state->dom->name , state->dom->flat_name == ((void*)0) ? "" : state-> dom->flat_name, attrs->domain_name); } } while (0); | |||
1478 | ret = EINVAL22; | |||
1479 | goto done; | |||
1480 | } | |||
1481 | ||||
1482 | state->attrs = attrs; | |||
1483 | ||||
1484 | if (attrs->response_type == RESP_USER_GROUPLIST) { | |||
1485 | ret = get_group_dn_list(state, state->dom, | |||
1486 | attrs->ngroups, attrs->groups, | |||
1487 | &group_dn_list, &missing_list); | |||
1488 | if (ret != EOK0) { | |||
1489 | DEBUG(SSSDBG_OP_FAILURE, "get_group_dn_list failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1489, __FUNCTION__, __debug_macro_level, "get_group_dn_list failed.\n" ); } } while (0); | |||
1490 | goto done; | |||
1491 | } | |||
1492 | ||||
1493 | if (missing_list != NULL((void*)0)) { | |||
1494 | subreq = ipa_s2n_get_fqlist_send(state, state->ev, | |||
1495 | state->ipa_ctx, state->dom, | |||
1496 | state->sh, state->exop_timeout, | |||
1497 | BE_REQ_GROUP0x0002, | |||
1498 | REQ_FULL_WITH_MEMBERS, | |||
1499 | missing_list); | |||
1500 | if (subreq == NULL((void*)0)) { | |||
1501 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1502, __FUNCTION__, __debug_macro_level, "ipa_s2n_get_fqlist_send failed.\n" ); } } while (0) | |||
1502 | "ipa_s2n_get_fqlist_send failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1502, __FUNCTION__, __debug_macro_level, "ipa_s2n_get_fqlist_send failed.\n" ); } } while (0); | |||
1503 | ret = ENOMEM12; | |||
1504 | goto done; | |||
1505 | } | |||
1506 | tevent_req_set_callback(subreq, ipa_s2n_get_fqlist_done, | |||
1507 | req); | |||
1508 | ||||
1509 | return; | |||
1510 | } | |||
1511 | break; | |||
1512 | } else if (attrs->response_type == RESP_GROUP_MEMBERS) { | |||
1513 | ret = process_members(state->dom, NULL((void*)0), attrs->a.group.gr_mem, | |||
1514 | state, &missing_list); | |||
1515 | if (ret != EOK0) { | |||
1516 | DEBUG(SSSDBG_OP_FAILURE, "process_members failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1516, __FUNCTION__, __debug_macro_level, "process_members failed.\n" ); } } while (0); | |||
1517 | goto done; | |||
1518 | } | |||
1519 | ||||
1520 | if (missing_list != NULL((void*)0)) { | |||
1521 | subreq = ipa_s2n_get_fqlist_send(state, state->ev, | |||
1522 | state->ipa_ctx, state->dom, | |||
1523 | state->sh, state->exop_timeout, | |||
1524 | BE_REQ_USER0x0001, | |||
1525 | REQ_FULL_WITH_MEMBERS, | |||
1526 | missing_list); | |||
1527 | if (subreq == NULL((void*)0)) { | |||
1528 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1529, __FUNCTION__, __debug_macro_level, "ipa_s2n_get_fqlist_send failed.\n" ); } } while (0) | |||
1529 | "ipa_s2n_get_fqlist_send failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1529, __FUNCTION__, __debug_macro_level, "ipa_s2n_get_fqlist_send failed.\n" ); } } while (0); | |||
1530 | ret = ENOMEM12; | |||
1531 | goto done; | |||
1532 | } | |||
1533 | tevent_req_set_callback(subreq, ipa_s2n_get_fqlist_done, | |||
1534 | req); | |||
1535 | ||||
1536 | return; | |||
1537 | } | |||
1538 | break; | |||
1539 | } | |||
1540 | ||||
1541 | if (state->req_input->type == REQ_INP_SECID) { | |||
1542 | /* We already know the SID, we do not have to read it. */ | |||
1543 | break; | |||
1544 | } | |||
1545 | ||||
1546 | state->request_type = REQ_SIMPLE; | |||
1547 | ||||
1548 | ret = s2n_encode_request(state, state->dom->name, state->entry_type, | |||
1549 | state->request_type, state->req_input, | |||
1550 | &bv_req); | |||
1551 | if (ret != EOK0) { | |||
1552 | goto done; | |||
1553 | } | |||
1554 | ||||
1555 | subreq = ipa_s2n_exop_send(state, state->ev, state->sh, false0, | |||
1556 | state->exop_timeout, bv_req); | |||
1557 | if (subreq == NULL((void*)0)) { | |||
1558 | DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_exop_send failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1558, __FUNCTION__, __debug_macro_level, "ipa_s2n_exop_send failed.\n" ); } } while (0); | |||
1559 | ret = ENOMEM12; | |||
1560 | goto done; | |||
1561 | } | |||
1562 | tevent_req_set_callback(subreq, ipa_s2n_get_user_done, req); | |||
1563 | ||||
1564 | return; | |||
1565 | ||||
1566 | case REQ_SIMPLE: | |||
1567 | ret = s2n_response_to_attrs(state, retoid, retdata, | |||
1568 | &state->simple_attrs); | |||
1569 | if (ret != EOK0) { | |||
1570 | DEBUG(SSSDBG_OP_FAILURE, "s2n_response_to_attrs failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1570, __FUNCTION__, __debug_macro_level, "s2n_response_to_attrs failed.\n" ); } } while (0); | |||
1571 | goto done; | |||
1572 | } | |||
1573 | ||||
1574 | break; | |||
1575 | default: | |||
1576 | DEBUG(SSSDBG_CRIT_FAILURE, "Unexpected request type.\n")do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1576, __FUNCTION__, __debug_macro_level, "Unexpected request type.\n" ); } } while (0); | |||
1577 | ret = EINVAL22; | |||
1578 | goto done; | |||
1579 | } | |||
1580 | ||||
1581 | if (state->attrs == NULL((void*)0)) { | |||
1582 | DEBUG(SSSDBG_CRIT_FAILURE, "Missing data of full request.\n")do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1582, __FUNCTION__, __debug_macro_level, "Missing data of full request.\n" ); } } while (0); | |||
1583 | ret = EINVAL22; | |||
1584 | goto done; | |||
1585 | } | |||
1586 | ||||
1587 | if (state->simple_attrs != NULL((void*)0) | |||
1588 | && state->simple_attrs->response_type == RESP_SID) { | |||
1589 | sid_str = state->simple_attrs->a.sid_str; | |||
1590 | ret = EOK0; | |||
1591 | } else if (state->attrs->sysdb_attrs != NULL((void*)0)) { | |||
1592 | ret = sysdb_attrs_get_string(state->attrs->sysdb_attrs, SYSDB_SID_STR"objectSIDString", | |||
1593 | &sid_str); | |||
1594 | } else if (state->req_input->type == REQ_INP_SECID) { | |||
1595 | sid_str = state->req_input->inp.secid; | |||
1596 | ret = EOK0; | |||
1597 | } else { | |||
1598 | DEBUG(SSSDBG_TRACE_FUNC, "No SID available.\n")do { int __debug_macro_level = 0x0400; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1598, __FUNCTION__, __debug_macro_level, "No SID available.\n" ); } } while (0); | |||
1599 | ret = ENOENT2; | |||
1600 | } | |||
1601 | ||||
1602 | if (ret == ENOENT2 | |||
1603 | || strcmp(state->ipa_ctx->view_name,__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (state->ipa_ctx->view_name) && __builtin_constant_p ("default") && (__s1_len = strlen (state->ipa_ctx ->view_name), __s2_len = strlen ("default"), (!((size_t)(const void *)((state->ipa_ctx->view_name) + 1) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("default") + 1) - ( size_t)(const void *)("default") == 1) || __s2_len >= 4)) ? __builtin_strcmp (state->ipa_ctx->view_name, "default" ) : (__builtin_constant_p (state->ipa_ctx->view_name) && ((size_t)(const void *)((state->ipa_ctx->view_name) + 1 ) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) && (__s1_len = strlen (state->ipa_ctx->view_name ), __s1_len < 4) ? (__builtin_constant_p ("default") && ((size_t)(const void *)(("default") + 1) - (size_t)(const void *)("default") == 1) ? __builtin_strcmp (state->ipa_ctx-> view_name, "default") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("default"); int __result = (((const unsigned char *) (const char *) (state-> ipa_ctx->view_name))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (state->ipa_ctx->view_name))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (state->ipa_ctx->view_name ))[2] - __s2[2]); if (__s1_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) (state-> ipa_ctx->view_name))[3] - __s2[3]); } } __result; }))) : ( __builtin_constant_p ("default") && ((size_t)(const void *)(("default") + 1) - (size_t)(const void *)("default") == 1 ) && (__s2_len = strlen ("default"), __s2_len < 4) ? (__builtin_constant_p (state->ipa_ctx->view_name) && ((size_t)(const void *)((state->ipa_ctx->view_name) + 1 ) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) ? __builtin_strcmp (state->ipa_ctx->view_name, "default" ) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (state->ipa_ctx->view_name); int __result = (((const unsigned char *) (const char *) ("default" ))[0] - __s2[0]); if (__s2_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("default" ))[1] - __s2[1]); if (__s2_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("default" ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) ("default" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (state ->ipa_ctx->view_name, "default")))); }) | |||
1604 | SYSDB_DEFAULT_VIEW_NAME)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (state->ipa_ctx->view_name) && __builtin_constant_p ("default") && (__s1_len = strlen (state->ipa_ctx ->view_name), __s2_len = strlen ("default"), (!((size_t)(const void *)((state->ipa_ctx->view_name) + 1) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("default") + 1) - ( size_t)(const void *)("default") == 1) || __s2_len >= 4)) ? __builtin_strcmp (state->ipa_ctx->view_name, "default" ) : (__builtin_constant_p (state->ipa_ctx->view_name) && ((size_t)(const void *)((state->ipa_ctx->view_name) + 1 ) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) && (__s1_len = strlen (state->ipa_ctx->view_name ), __s1_len < 4) ? (__builtin_constant_p ("default") && ((size_t)(const void *)(("default") + 1) - (size_t)(const void *)("default") == 1) ? __builtin_strcmp (state->ipa_ctx-> view_name, "default") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("default"); int __result = (((const unsigned char *) (const char *) (state-> ipa_ctx->view_name))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (state->ipa_ctx->view_name))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (state->ipa_ctx->view_name ))[2] - __s2[2]); if (__s1_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) (state-> ipa_ctx->view_name))[3] - __s2[3]); } } __result; }))) : ( __builtin_constant_p ("default") && ((size_t)(const void *)(("default") + 1) - (size_t)(const void *)("default") == 1 ) && (__s2_len = strlen ("default"), __s2_len < 4) ? (__builtin_constant_p (state->ipa_ctx->view_name) && ((size_t)(const void *)((state->ipa_ctx->view_name) + 1 ) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) ? __builtin_strcmp (state->ipa_ctx->view_name, "default" ) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (state->ipa_ctx->view_name); int __result = (((const unsigned char *) (const char *) ("default" ))[0] - __s2[0]); if (__s2_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("default" ))[1] - __s2[1]); if (__s2_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("default" ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) ("default" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (state ->ipa_ctx->view_name, "default")))); }) == 0) { | |||
1605 | ret = ipa_s2n_save_objects(state->dom, state->req_input, state->attrs, | |||
1606 | state->simple_attrs, NULL((void*)0), NULL((void*)0)); | |||
1607 | if (ret != EOK0) { | |||
1608 | DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_save_objects failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1608, __FUNCTION__, __debug_macro_level, "ipa_s2n_save_objects failed.\n" ); } } while (0); | |||
1609 | goto done; | |||
1610 | } | |||
1611 | } else if (ret == EOK0) { | |||
1612 | ret = get_be_acct_req_for_sid(state, sid_str, state->dom->name, &ar); | |||
1613 | if (ret != EOK0) { | |||
1614 | DEBUG(SSSDBG_OP_FAILURE, "get_be_acct_req_for_sid failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1614, __FUNCTION__, __debug_macro_level, "get_be_acct_req_for_sid failed.\n" ); } } while (0); | |||
1615 | goto done; | |||
1616 | } | |||
1617 | ||||
1618 | subreq = ipa_get_ad_override_send(state, state->ev, | |||
1619 | state->ipa_ctx->sdap_id_ctx, | |||
1620 | state->ipa_ctx->ipa_options, | |||
1621 | dp_opt_get_string(state->ipa_ctx->ipa_options->basic,_dp_opt_get_string(state->ipa_ctx->ipa_options->basic , IPA_KRB5_REALM, __FUNCTION__) | |||
1622 | IPA_KRB5_REALM)_dp_opt_get_string(state->ipa_ctx->ipa_options->basic , IPA_KRB5_REALM, __FUNCTION__), | |||
1623 | state->ipa_ctx->view_name, | |||
1624 | ar); | |||
1625 | if (subreq == NULL((void*)0)) { | |||
1626 | DEBUG(SSSDBG_OP_FAILURE, "ipa_get_ad_override_send failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1626, __FUNCTION__, __debug_macro_level, "ipa_get_ad_override_send failed.\n" ); } } while (0); | |||
1627 | ret = ENOMEM12; | |||
1628 | goto done; | |||
1629 | } | |||
1630 | tevent_req_set_callback(subreq, ipa_s2n_get_user_get_override_done, | |||
1631 | req); | |||
1632 | ||||
1633 | return; | |||
1634 | } else { | |||
1635 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_attrs_get_string failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1635, __FUNCTION__, __debug_macro_level, "sysdb_attrs_get_string failed.\n" ); } } while (0); | |||
1636 | goto done; | |||
1637 | } | |||
1638 | ||||
1639 | done: | |||
1640 | if (ret == EOK0) { | |||
1641 | tevent_req_done(req)_tevent_req_done(req, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1641"); | |||
1642 | } else { | |||
1643 | tevent_req_error(req, ret)_tevent_req_error(req, ret, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1643"); | |||
1644 | } | |||
1645 | return; | |||
1646 | } | |||
1647 | ||||
1648 | static errno_t get_groups_dns(TALLOC_CTX *mem_ctx, struct sss_domain_info *dom, | |||
1649 | char **name_list, char ***_dn_list) | |||
1650 | { | |||
1651 | int ret; | |||
1652 | TALLOC_CTX *tmp_ctx; | |||
1653 | int c; | |||
1654 | struct sss_domain_info *root_domain; | |||
1655 | char **dn_list; | |||
1656 | ||||
1657 | if (name_list == NULL((void*)0)) { | |||
1658 | *_dn_list = NULL((void*)0); | |||
1659 | return EOK0; | |||
1660 | } | |||
1661 | ||||
1662 | /* To handle cross-domain memberships we have to check the domain for | |||
1663 | * each group the member should be added or deleted. Since sub-domains | |||
1664 | * use fully-qualified names by default any short name can only belong | |||
1665 | * to the root/head domain. find_domain_by_object_name() will return | |||
1666 | * the domain given in the first argument if the second argument is a | |||
1667 | * a short name hence we always use root_domain as first argument. */ | |||
1668 | root_domain = get_domains_head(dom); | |||
1669 | if (root_domain->fqnames) { | |||
1670 | DEBUG(SSSDBG_TRACE_FUNC,do { int __debug_macro_level = 0x0400; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1673, __FUNCTION__, __debug_macro_level, "Root domain uses fully-qualified names, " "objects might not be correctly added to groups with " "short names.\n" ); } } while (0) | |||
1671 | "Root domain uses fully-qualified names, " \do { int __debug_macro_level = 0x0400; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1673, __FUNCTION__, __debug_macro_level, "Root domain uses fully-qualified names, " "objects might not be correctly added to groups with " "short names.\n" ); } } while (0) | |||
1672 | "objects might not be correctly added to groups with " \do { int __debug_macro_level = 0x0400; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1673, __FUNCTION__, __debug_macro_level, "Root domain uses fully-qualified names, " "objects might not be correctly added to groups with " "short names.\n" ); } } while (0) | |||
1673 | "short names.\n")do { int __debug_macro_level = 0x0400; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1673, __FUNCTION__, __debug_macro_level, "Root domain uses fully-qualified names, " "objects might not be correctly added to groups with " "short names.\n" ); } } while (0); | |||
1674 | } | |||
1675 | ||||
1676 | tmp_ctx = talloc_new(NULL)talloc_named_const(((void*)0), 0, "talloc_new: " "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1676"); | |||
1677 | if (tmp_ctx == NULL((void*)0)) { | |||
1678 | DEBUG(SSSDBG_OP_FAILURE, "talloc_new failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1678, __FUNCTION__, __debug_macro_level, "talloc_new failed.\n" ); } } while (0); | |||
1679 | return ENOMEM12; | |||
1680 | } | |||
1681 | ||||
1682 | for (c = 0; name_list[c] != NULL((void*)0); c++); | |||
1683 | ||||
1684 | dn_list = talloc_zero_array(tmp_ctx, char *, c + 1)(char * *)_talloc_zero_array(tmp_ctx, sizeof(char *), c + 1, "char *" ); | |||
1685 | if (dn_list == NULL((void*)0)) { | |||
1686 | DEBUG(SSSDBG_OP_FAILURE, "talloc_zero_array failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1686, __FUNCTION__, __debug_macro_level, "talloc_zero_array failed.\n" ); } } while (0); | |||
1687 | ret = ENOMEM12; | |||
1688 | goto done; | |||
1689 | } | |||
1690 | ||||
1691 | for (c = 0; name_list[c] != NULL((void*)0); c++) { | |||
1692 | dom = find_domain_by_object_name(root_domain, name_list[c]); | |||
1693 | if (dom == NULL((void*)0)) { | |||
1694 | DEBUG(SSSDBG_CRIT_FAILURE,do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1695, __FUNCTION__, __debug_macro_level, "Cannot find domain for [%s].\n" , name_list[c]); } } while (0) | |||
1695 | "Cannot find domain for [%s].\n", name_list[c])do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1695, __FUNCTION__, __debug_macro_level, "Cannot find domain for [%s].\n" , name_list[c]); } } while (0); | |||
1696 | ret = ENOENT2; | |||
1697 | goto done; | |||
1698 | } | |||
1699 | ||||
1700 | /* This might fail if some unexpected cases are used. But current | |||
1701 | * sysdb code which handles group membership constructs DNs this way | |||
1702 | * as well, IPA names are lowercased and AD names by default will be | |||
1703 | * lowercased as well. If there are really use-cases which cause an | |||
1704 | * issue here, sysdb_group_strdn() has to be replaced by a proper | |||
1705 | * search. */ | |||
1706 | dn_list[c] = sysdb_group_strdn(dn_list, dom->name, name_list[c]); | |||
1707 | if (dn_list[c] == NULL((void*)0)) { | |||
1708 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_group_strdn failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1708, __FUNCTION__, __debug_macro_level, "sysdb_group_strdn failed.\n" ); } } while (0); | |||
1709 | ret = ENOMEM12; | |||
1710 | goto done; | |||
1711 | } | |||
1712 | } | |||
1713 | ||||
1714 | *_dn_list = talloc_steal(mem_ctx, dn_list)({ __typeof__(dn_list) __talloc_steal_ret = (__typeof__(dn_list ))_talloc_steal_loc((mem_ctx),(dn_list), "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1714"); __talloc_steal_ret; }); | |||
1715 | ret = EOK0; | |||
1716 | ||||
1717 | done: | |||
1718 | talloc_free(tmp_ctx)_talloc_free(tmp_ctx, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1718"); | |||
1719 | ||||
1720 | return ret; | |||
1721 | } | |||
1722 | ||||
1723 | static errno_t ipa_s2n_save_objects(struct sss_domain_info *dom, | |||
1724 | struct req_input *req_input, | |||
1725 | struct resp_attrs *attrs, | |||
1726 | struct resp_attrs *simple_attrs, | |||
1727 | const char *view_name, | |||
1728 | struct sysdb_attrs *override_attrs) | |||
1729 | { | |||
1730 | int ret; | |||
1731 | time_t now; | |||
1732 | uint64_t timeout = 10*60*60; /* FIXME: find a better timeout ! */ | |||
1733 | struct sss_nss_homedir_ctx homedir_ctx; | |||
1734 | char *name = NULL((void*)0); | |||
1735 | char *realm; | |||
1736 | char *upn = NULL((void*)0); | |||
1737 | gid_t gid; | |||
1738 | gid_t orig_gid = 0; | |||
1739 | TALLOC_CTX *tmp_ctx; | |||
1740 | const char *sid_str; | |||
1741 | const char *tmp_str; | |||
1742 | struct ldb_result *res; | |||
1743 | enum sysdb_member_type type; | |||
1744 | char **sysdb_grouplist; | |||
1745 | char **add_groups; | |||
1746 | char **add_groups_dns; | |||
1747 | char **del_groups; | |||
1748 | char **del_groups_dns; | |||
1749 | bool_Bool in_transaction = false0; | |||
1750 | int tret; | |||
1751 | ||||
1752 | tmp_ctx = talloc_new(NULL)talloc_named_const(((void*)0), 0, "talloc_new: " "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "1752"); | |||
1753 | if (tmp_ctx == NULL((void*)0)) { | |||
1754 | DEBUG(SSSDBG_OP_FAILURE, "talloc_new failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1754, __FUNCTION__, __debug_macro_level, "talloc_new failed.\n" ); } } while (0); | |||
1755 | return ENOMEM12; | |||
1756 | } | |||
1757 | ||||
1758 | now = time(NULL((void*)0)); | |||
1759 | ||||
1760 | if (attrs->sysdb_attrs == NULL((void*)0)) { | |||
1761 | attrs->sysdb_attrs = sysdb_new_attrs(attrs); | |||
1762 | if (attrs->sysdb_attrs == NULL((void*)0)) { | |||
1763 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_new_attrs failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1763, __FUNCTION__, __debug_macro_level, "sysdb_new_attrs failed.\n" ); } } while (0); | |||
1764 | ret = ENOMEM12; | |||
1765 | goto done; | |||
1766 | } | |||
1767 | } | |||
1768 | ||||
1769 | if (attrs->sysdb_attrs != NULL((void*)0)) { | |||
1770 | ret = sysdb_attrs_get_string(attrs->sysdb_attrs, | |||
1771 | ORIGINALAD_PREFIX"originalAD" SYSDB_NAME"name", &tmp_str); | |||
1772 | if (ret == EOK0) { | |||
1773 | name = talloc_strdup(tmp_ctx, tmp_str); | |||
1774 | if (name == NULL((void*)0)) { | |||
1775 | DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1775, __FUNCTION__, __debug_macro_level, "talloc_strdup failed.\n" ); } } while (0); | |||
1776 | ret = ENOMEM12; | |||
1777 | goto done; | |||
1778 | } | |||
1779 | DEBUG(SSSDBG_TRACE_ALL, "Found original AD name [%s].\n", name)do { int __debug_macro_level = 0x4000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1779, __FUNCTION__, __debug_macro_level, "Found original AD name [%s].\n" , name); } } while (0); | |||
1780 | } else if (ret == ENOENT2) { | |||
1781 | name = NULL((void*)0); | |||
1782 | } else { | |||
1783 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_attrs_get_string failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1783, __FUNCTION__, __debug_macro_level, "sysdb_attrs_get_string failed.\n" ); } } while (0); | |||
1784 | goto done; | |||
1785 | } | |||
1786 | ||||
1787 | ret = sysdb_attrs_get_string(attrs->sysdb_attrs, | |||
1788 | SYSDB_DEFAULT_OVERRIDE_NAME"defaultOverrideName", &tmp_str); | |||
1789 | if (ret == EOK0) { | |||
1790 | ret = sysdb_attrs_add_lc_name_alias(attrs->sysdb_attrs, tmp_str); | |||
1791 | if (ret != EOK0) { | |||
1792 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1793, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_lc_name_alias failed.\n" ); } } while (0) | |||
1793 | "sysdb_attrs_add_lc_name_alias failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1793, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_lc_name_alias failed.\n" ); } } while (0); | |||
1794 | goto done; | |||
1795 | } | |||
1796 | } else if (ret != ENOENT2) { | |||
1797 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_attrs_get_string failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1797, __FUNCTION__, __debug_macro_level, "sysdb_attrs_get_string failed.\n" ); } } while (0); | |||
1798 | goto done; | |||
1799 | } | |||
1800 | ||||
1801 | ret = sysdb_attrs_get_string(attrs->sysdb_attrs, SYSDB_UPN"userPrincipalName", &tmp_str); | |||
1802 | if (ret == EOK0) { | |||
1803 | upn = talloc_strdup(tmp_ctx, tmp_str); | |||
1804 | if (upn == NULL((void*)0)) { | |||
1805 | DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1805, __FUNCTION__, __debug_macro_level, "talloc_strdup failed.\n" ); } } while (0); | |||
1806 | ret = ENOMEM12; | |||
1807 | goto done; | |||
1808 | } | |||
1809 | DEBUG(SSSDBG_TRACE_ALL, "Found original AD upn [%s].\n", upn)do { int __debug_macro_level = 0x4000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1809, __FUNCTION__, __debug_macro_level, "Found original AD upn [%s].\n" , upn); } } while (0); | |||
1810 | } else if (ret == ENOENT2) { | |||
1811 | upn = NULL((void*)0); | |||
1812 | } else { | |||
1813 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_attrs_get_string failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1813, __FUNCTION__, __debug_macro_level, "sysdb_attrs_get_string failed.\n" ); } } while (0); | |||
1814 | goto done; | |||
1815 | } | |||
1816 | } | |||
1817 | ||||
1818 | switch (attrs->response_type) { | |||
1819 | case RESP_USER: | |||
1820 | case RESP_USER_GROUPLIST: | |||
1821 | type = SYSDB_MEMBER_USER; | |||
1822 | if (dom->subdomain_homedir | |||
1823 | && attrs->a.user.pw_dir == NULL((void*)0)) { | |||
1824 | ZERO_STRUCT(homedir_ctx)memset((char *)&(homedir_ctx), 0, sizeof(homedir_ctx)); | |||
1825 | homedir_ctx.username = attrs->a.user.pw_name; | |||
1826 | homedir_ctx.uid = attrs->a.user.pw_uid; | |||
1827 | homedir_ctx.domain = dom->name; | |||
1828 | homedir_ctx.flatname = dom->flat_name; | |||
1829 | homedir_ctx.config_homedir_substr = dom->homedir_substr; | |||
1830 | ||||
1831 | attrs->a.user.pw_dir = expand_homedir_template(attrs, | |||
1832 | dom->subdomain_homedir, | |||
1833 | &homedir_ctx); | |||
1834 | if (attrs->a.user.pw_dir == NULL((void*)0)) { | |||
1835 | ret = ENOMEM12; | |||
1836 | goto done; | |||
1837 | } | |||
1838 | } | |||
1839 | ||||
1840 | if (name == NULL((void*)0)) { | |||
1841 | /* we always use the fully qualified name for subdomain users */ | |||
1842 | name = sss_tc_fqname(tmp_ctx, dom->names, dom, | |||
1843 | attrs->a.user.pw_name); | |||
1844 | if (!name) { | |||
1845 | DEBUG(SSSDBG_OP_FAILURE, "failed to format user name.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1845, __FUNCTION__, __debug_macro_level, "failed to format user name.\n" ); } } while (0); | |||
1846 | ret = ENOMEM12; | |||
1847 | goto done; | |||
1848 | } | |||
1849 | } | |||
1850 | ||||
1851 | ret = sysdb_attrs_add_lc_name_alias(attrs->sysdb_attrs, name); | |||
1852 | if (ret != EOK0) { | |||
1853 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1854, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_lc_name_alias failed.\n" ); } } while (0) | |||
1854 | "sysdb_attrs_add_lc_name_alias failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1854, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_lc_name_alias failed.\n" ); } } while (0); | |||
1855 | goto done; | |||
1856 | } | |||
1857 | ||||
1858 | if (upn == NULL((void*)0)) { | |||
1859 | /* We also have to store a fake UPN here, because otherwise the | |||
1860 | * krb5 child later won't be able to properly construct one as | |||
1861 | * the username is fully qualified but the child doesn't have | |||
1862 | * access to the regex to deconstruct it */ | |||
1863 | /* FIXME: The real UPN is available from the PAC, we should get | |||
1864 | * it from there. */ | |||
1865 | realm = get_uppercase_realm(tmp_ctx, dom->name); | |||
1866 | if (!realm) { | |||
1867 | DEBUG(SSSDBG_OP_FAILURE, "failed to get realm.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1867, __FUNCTION__, __debug_macro_level, "failed to get realm.\n" ); } } while (0); | |||
1868 | ret = ENOMEM12; | |||
1869 | goto done; | |||
1870 | } | |||
1871 | upn = talloc_asprintf(tmp_ctx, "%s@%s", | |||
1872 | attrs->a.user.pw_name, realm); | |||
1873 | if (!upn) { | |||
1874 | DEBUG(SSSDBG_OP_FAILURE, "failed to format UPN.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1874, __FUNCTION__, __debug_macro_level, "failed to format UPN.\n" ); } } while (0); | |||
1875 | ret = ENOMEM12; | |||
1876 | goto done; | |||
1877 | } | |||
1878 | ||||
1879 | /* We might already have the SID or the UPN from other sources | |||
1880 | * hence sysdb_attrs_add_string_safe is used to avoid double | |||
1881 | * entries. */ | |||
1882 | ret = sysdb_attrs_add_string_safe(attrs->sysdb_attrs, SYSDB_UPN"userPrincipalName", | |||
1883 | upn); | |||
1884 | if (ret != EOK0) { | |||
1885 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1886, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_string failed.\n" ); } } while (0) | |||
1886 | "sysdb_attrs_add_string failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1886, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_string failed.\n" ); } } while (0); | |||
1887 | goto done; | |||
1888 | } | |||
1889 | } | |||
1890 | ||||
1891 | if (req_input->type == REQ_INP_SECID) { | |||
1892 | ret = sysdb_attrs_add_string_safe(attrs->sysdb_attrs, | |||
1893 | SYSDB_SID_STR"objectSIDString", | |||
1894 | req_input->inp.secid); | |||
1895 | if (ret != EOK0) { | |||
1896 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1897, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_string failed.\n" ); } } while (0) | |||
1897 | "sysdb_attrs_add_string failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1897, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_string failed.\n" ); } } while (0); | |||
1898 | goto done; | |||
1899 | } | |||
1900 | } | |||
1901 | ||||
1902 | if (simple_attrs != NULL((void*)0) | |||
1903 | && simple_attrs->response_type == RESP_SID) { | |||
1904 | ret = sysdb_attrs_add_string_safe(attrs->sysdb_attrs, | |||
1905 | SYSDB_SID_STR"objectSIDString", | |||
1906 | simple_attrs->a.sid_str); | |||
1907 | if (ret != EOK0) { | |||
1908 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1909, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_string failed.\n" ); } } while (0) | |||
1909 | "sysdb_attrs_add_string failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1909, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_string failed.\n" ); } } while (0); | |||
1910 | goto done; | |||
1911 | } | |||
1912 | } | |||
1913 | ||||
1914 | if (attrs->response_type == RESP_USER_GROUPLIST) { | |||
1915 | /* Since RESP_USER_GROUPLIST contains all group memberships it | |||
1916 | * is effectively an initgroups request hence | |||
1917 | * SYSDB_INITGR_EXPIRE will be set.*/ | |||
1918 | ret = sysdb_attrs_add_time_t(attrs->sysdb_attrs, | |||
1919 | SYSDB_INITGR_EXPIRE"initgrExpireTimestamp", | |||
1920 | time(NULL((void*)0)) + timeout); | |||
1921 | if (ret != EOK0) { | |||
1922 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1923, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_time_t failed.\n" ); } } while (0) | |||
1923 | "sysdb_attrs_add_time_t failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1923, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_time_t failed.\n" ); } } while (0); | |||
1924 | goto done; | |||
1925 | } | |||
1926 | } | |||
1927 | ||||
1928 | gid = 0; | |||
1929 | if (dom->mpg == false0) { | |||
1930 | gid = attrs->a.user.pw_gid; | |||
1931 | } else { | |||
1932 | /* The extdom plugin always returns the objects with the | |||
1933 | * default view applied. Since the GID is handled specially | |||
1934 | * for MPG domains we have add any overridden GID separately. | |||
1935 | */ | |||
1936 | ret = sysdb_attrs_get_uint32_t(attrs->sysdb_attrs, | |||
1937 | ORIGINALAD_PREFIX"originalAD" SYSDB_GIDNUM"gidNumber", | |||
1938 | &orig_gid); | |||
1939 | if (ret == EOK0 || ret == ENOENT2) { | |||
1940 | if ((orig_gid != 0 && orig_gid != attrs->a.user.pw_gid) | |||
1941 | || attrs->a.user.pw_uid != attrs->a.user.pw_gid) { | |||
1942 | ret = sysdb_attrs_add_uint32(attrs->sysdb_attrs, | |||
1943 | SYSDB_GIDNUM"gidNumber", | |||
1944 | attrs->a.user.pw_gid); | |||
1945 | if (ret != EOK0) { | |||
1946 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1947, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_uint32 failed.\n" ); } } while (0) | |||
1947 | "sysdb_attrs_add_uint32 failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1947, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_uint32 failed.\n" ); } } while (0); | |||
1948 | goto done; | |||
1949 | } | |||
1950 | } | |||
1951 | } else { | |||
1952 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1953, __FUNCTION__, __debug_macro_level, "sysdb_attrs_get_uint32_t failed.\n" ); } } while (0) | |||
1953 | "sysdb_attrs_get_uint32_t failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1953, __FUNCTION__, __debug_macro_level, "sysdb_attrs_get_uint32_t failed.\n" ); } } while (0); | |||
1954 | goto done; | |||
1955 | } | |||
1956 | } | |||
1957 | ||||
1958 | ret = sysdb_transaction_start(dom->sysdb); | |||
1959 | if (ret != EOK0) { | |||
1960 | DEBUG(SSSDBG_CRIT_FAILURE, "Failed to start transaction\n")do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1960, __FUNCTION__, __debug_macro_level, "Failed to start transaction\n" ); } } while (0); | |||
1961 | goto done; | |||
1962 | } | |||
1963 | in_transaction = true1; | |||
1964 | ||||
1965 | ret = sysdb_store_user(dom, name, NULL((void*)0), | |||
1966 | attrs->a.user.pw_uid, | |||
1967 | gid, attrs->a.user.pw_gecos, | |||
1968 | attrs->a.user.pw_dir, attrs->a.user.pw_shell, | |||
1969 | NULL((void*)0), attrs->sysdb_attrs, NULL((void*)0), | |||
1970 | timeout, now); | |||
1971 | if (ret != EOK0) { | |||
1972 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_store_user failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1972, __FUNCTION__, __debug_macro_level, "sysdb_store_user failed.\n" ); } } while (0); | |||
1973 | goto done; | |||
1974 | } | |||
1975 | ||||
1976 | if (attrs->response_type == RESP_USER_GROUPLIST) { | |||
1977 | ret = get_sysdb_grouplist(tmp_ctx, dom->sysdb, dom, name, | |||
1978 | &sysdb_grouplist); | |||
1979 | if (ret != EOK0) { | |||
1980 | DEBUG(SSSDBG_OP_FAILURE, "get_sysdb_grouplist failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1980, __FUNCTION__, __debug_macro_level, "get_sysdb_grouplist failed.\n" ); } } while (0); | |||
1981 | goto done; | |||
1982 | } | |||
1983 | ||||
1984 | ret = diff_string_lists(tmp_ctx, attrs->groups, sysdb_grouplist, | |||
1985 | &add_groups, &del_groups, NULL((void*)0)); | |||
1986 | if (ret != EOK0) { | |||
1987 | DEBUG(SSSDBG_OP_FAILURE, "diff_string_lists failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1987, __FUNCTION__, __debug_macro_level, "diff_string_lists failed.\n" ); } } while (0); | |||
1988 | goto done; | |||
1989 | } | |||
1990 | ||||
1991 | ret = get_groups_dns(tmp_ctx, dom, add_groups, &add_groups_dns); | |||
1992 | if (ret != EOK0) { | |||
1993 | DEBUG(SSSDBG_OP_FAILURE, "get_groups_dns failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1993, __FUNCTION__, __debug_macro_level, "get_groups_dns failed.\n" ); } } while (0); | |||
1994 | goto done; | |||
1995 | } | |||
1996 | ||||
1997 | ret = get_groups_dns(tmp_ctx, dom, del_groups, &del_groups_dns); | |||
1998 | if (ret != EOK0) { | |||
1999 | DEBUG(SSSDBG_OP_FAILURE, "get_groups_dns failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 1999, __FUNCTION__, __debug_macro_level, "get_groups_dns failed.\n" ); } } while (0); | |||
2000 | goto done; | |||
2001 | } | |||
2002 | ||||
2003 | DEBUG(SSSDBG_TRACE_INTERNAL, "Updating memberships for %s\n",do { int __debug_macro_level = 0x2000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2004, __FUNCTION__, __debug_macro_level, "Updating memberships for %s\n" , name); } } while (0) | |||
2004 | name)do { int __debug_macro_level = 0x2000; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2004, __FUNCTION__, __debug_macro_level, "Updating memberships for %s\n" , name); } } while (0); | |||
2005 | ret = sysdb_update_members_dn(dom, name, SYSDB_MEMBER_USER, | |||
2006 | (const char *const *) add_groups_dns, | |||
2007 | (const char *const *) del_groups_dns); | |||
2008 | if (ret != EOK0) { | |||
2009 | DEBUG(SSSDBG_CRIT_FAILURE, "Membership update failed [%d]: %s\n",do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2010, __FUNCTION__, __debug_macro_level, "Membership update failed [%d]: %s\n" , ret, sss_strerror(ret)); } } while (0) | |||
2010 | ret, sss_strerror(ret))do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2010, __FUNCTION__, __debug_macro_level, "Membership update failed [%d]: %s\n" , ret, sss_strerror(ret)); } } while (0); | |||
2011 | goto done; | |||
2012 | } | |||
2013 | } | |||
2014 | ||||
2015 | ret = sysdb_transaction_commit(dom->sysdb); | |||
2016 | if (ret != EOK0) { | |||
2017 | DEBUG(SSSDBG_CRIT_FAILURE, "Failed to commit transaction\n")do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2017, __FUNCTION__, __debug_macro_level, "Failed to commit transaction\n" ); } } while (0); | |||
2018 | goto done; | |||
2019 | } | |||
2020 | in_transaction = false0; | |||
2021 | ||||
2022 | break; | |||
2023 | case RESP_GROUP: | |||
2024 | case RESP_GROUP_MEMBERS: | |||
2025 | type = SYSDB_MEMBER_GROUP; | |||
2026 | ||||
2027 | if (0 != strcmp(dom->name, attrs->domain_name)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (dom->name) && __builtin_constant_p (attrs->domain_name ) && (__s1_len = strlen (dom->name), __s2_len = strlen (attrs->domain_name), (!((size_t)(const void *)((dom-> name) + 1) - (size_t)(const void *)(dom->name) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((attrs->domain_name ) + 1) - (size_t)(const void *)(attrs->domain_name) == 1) || __s2_len >= 4)) ? __builtin_strcmp (dom->name, attrs-> domain_name) : (__builtin_constant_p (dom->name) && ((size_t)(const void *)((dom->name) + 1) - (size_t)(const void *)(dom->name) == 1) && (__s1_len = strlen (dom ->name), __s1_len < 4) ? (__builtin_constant_p (attrs-> domain_name) && ((size_t)(const void *)((attrs->domain_name ) + 1) - (size_t)(const void *)(attrs->domain_name) == 1) ? __builtin_strcmp (dom->name, attrs->domain_name) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (attrs->domain_name); int __result = (((const unsigned char *) (const char *) (dom->name))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (dom->name))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (dom->name))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (dom->name))[3] - __s2[3]); } } __result ; }))) : (__builtin_constant_p (attrs->domain_name) && ((size_t)(const void *)((attrs->domain_name) + 1) - (size_t )(const void *)(attrs->domain_name) == 1) && (__s2_len = strlen (attrs->domain_name), __s2_len < 4) ? (__builtin_constant_p (dom->name) && ((size_t)(const void *)((dom->name ) + 1) - (size_t)(const void *)(dom->name) == 1) ? __builtin_strcmp (dom->name, attrs->domain_name) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (dom->name); int __result = (((const unsigned char *) ( const char *) (attrs->domain_name))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (attrs->domain_name))[1] - __s2[1] ); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (attrs->domain_name ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) (attrs-> domain_name))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (dom->name, attrs->domain_name)))); })) { | |||
2028 | dom = find_domain_by_name(get_domains_head(dom), | |||
2029 | attrs->domain_name, true1); | |||
2030 | if (dom == NULL((void*)0)) { | |||
2031 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2032, __FUNCTION__, __debug_macro_level, "Cannot find domain: [%s]\n" , attrs->domain_name); } } while (0) | |||
2032 | "Cannot find domain: [%s]\n", attrs->domain_name)do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2032, __FUNCTION__, __debug_macro_level, "Cannot find domain: [%s]\n" , attrs->domain_name); } } while (0); | |||
2033 | ret = EINVAL22; | |||
2034 | goto done; | |||
2035 | } | |||
2036 | } | |||
2037 | ||||
2038 | if (name == NULL((void*)0)) { | |||
2039 | name = attrs->a.group.gr_name; | |||
2040 | } | |||
2041 | ||||
2042 | if (IS_SUBDOMAIN(dom)((dom)->parent != ((void*)0))) { | |||
2043 | /* we always use the fully qualified name for subdomain users */ | |||
2044 | name = sss_tc_fqname(tmp_ctx, dom->names, dom, name); | |||
2045 | if (!name) { | |||
2046 | DEBUG(SSSDBG_OP_FAILURE, "failed to format user name,\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2046, __FUNCTION__, __debug_macro_level, "failed to format user name,\n" ); } } while (0); | |||
2047 | ret = ENOMEM12; | |||
2048 | goto done; | |||
2049 | } | |||
2050 | } | |||
2051 | DEBUG(SSSDBG_TRACE_FUNC, "Processing group %s\n", name)do { int __debug_macro_level = 0x0400; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2051, __FUNCTION__, __debug_macro_level, "Processing group %s\n" , name); } } while (0); | |||
2052 | ||||
2053 | ret = sysdb_attrs_add_lc_name_alias(attrs->sysdb_attrs, name); | |||
2054 | if (ret != EOK0) { | |||
2055 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2056, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_lc_name_alias failed.\n" ); } } while (0) | |||
2056 | "sysdb_attrs_add_lc_name_alias failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2056, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_lc_name_alias failed.\n" ); } } while (0); | |||
2057 | goto done; | |||
2058 | } | |||
2059 | ||||
2060 | /* We might already have the SID from other sources hence | |||
2061 | * sysdb_attrs_add_string_safe is used to avoid double entries. */ | |||
2062 | if (req_input->type == REQ_INP_SECID) { | |||
2063 | ret = sysdb_attrs_add_string_safe(attrs->sysdb_attrs, | |||
2064 | SYSDB_SID_STR"objectSIDString", | |||
2065 | req_input->inp.secid); | |||
2066 | if (ret != EOK0) { | |||
2067 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2068, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_string failed.\n" ); } } while (0) | |||
2068 | "sysdb_attrs_add_string failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2068, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_string failed.\n" ); } } while (0); | |||
2069 | goto done; | |||
2070 | } | |||
2071 | } | |||
2072 | ||||
2073 | if (simple_attrs != NULL((void*)0) | |||
2074 | && simple_attrs->response_type == RESP_SID) { | |||
2075 | ret = sysdb_attrs_add_string_safe(attrs->sysdb_attrs, | |||
2076 | SYSDB_SID_STR"objectSIDString", | |||
2077 | simple_attrs->a.sid_str); | |||
2078 | if (ret != EOK0) { | |||
2079 | DEBUG(SSSDBG_OP_FAILURE,do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2080, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_string failed.\n" ); } } while (0) | |||
2080 | "sysdb_attrs_add_string failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2080, __FUNCTION__, __debug_macro_level, "sysdb_attrs_add_string failed.\n" ); } } while (0); | |||
2081 | goto done; | |||
2082 | } | |||
2083 | } | |||
2084 | ||||
2085 | ret = process_members(dom, attrs->sysdb_attrs, | |||
2086 | attrs->a.group.gr_mem, NULL((void*)0), NULL((void*)0)); | |||
2087 | if (ret != EOK0) { | |||
2088 | DEBUG(SSSDBG_OP_FAILURE, "process_members failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2088, __FUNCTION__, __debug_macro_level, "process_members failed.\n" ); } } while (0); | |||
2089 | goto done; | |||
2090 | } | |||
2091 | ||||
2092 | ret = sysdb_store_group(dom, name, attrs->a.group.gr_gid, | |||
2093 | attrs->sysdb_attrs, timeout, now); | |||
2094 | if (ret != EOK0) { | |||
2095 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_store_group failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2095, __FUNCTION__, __debug_macro_level, "sysdb_store_group failed.\n" ); } } while (0); | |||
2096 | goto done; | |||
2097 | } | |||
2098 | break; | |||
2099 | default: | |||
2100 | DEBUG(SSSDBG_OP_FAILURE, "Unexpected response type [%d].\n",do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2101, __FUNCTION__, __debug_macro_level, "Unexpected response type [%d].\n" , attrs->response_type); } } while (0) | |||
2101 | attrs->response_type)do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2101, __FUNCTION__, __debug_macro_level, "Unexpected response type [%d].\n" , attrs->response_type); } } while (0); | |||
2102 | ret = EINVAL22; | |||
2103 | goto done; | |||
2104 | } | |||
2105 | ||||
2106 | ret = sysdb_attrs_get_string(attrs->sysdb_attrs, SYSDB_SID_STR"objectSIDString", &sid_str); | |||
2107 | if (ret != EOK0) { | |||
2108 | DEBUG(SSSDBG_CRIT_FAILURE,do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2109, __FUNCTION__, __debug_macro_level, "Cannot find SID of object with override.\n" ); } } while (0) | |||
2109 | "Cannot find SID of object with override.\n")do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2109, __FUNCTION__, __debug_macro_level, "Cannot find SID of object with override.\n" ); } } while (0); | |||
2110 | goto done; | |||
2111 | } | |||
2112 | ||||
2113 | ret = sysdb_search_object_by_sid(tmp_ctx, dom, sid_str, NULL((void*)0), &res); | |||
2114 | if (ret != EOK0) { | |||
2115 | DEBUG(SSSDBG_CRIT_FAILURE,do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2116, __FUNCTION__, __debug_macro_level, "Cannot find object with override with SID [%s].\n" , sid_str); } } while (0) | |||
2116 | "Cannot find object with override with SID [%s].\n", sid_str)do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2116, __FUNCTION__, __debug_macro_level, "Cannot find object with override with SID [%s].\n" , sid_str); } } while (0); | |||
2117 | goto done; | |||
2118 | } | |||
2119 | ||||
2120 | ret = sysdb_store_override(dom, view_name, type, override_attrs, | |||
2121 | res->msgs[0]->dn); | |||
2122 | if (ret != EOK0) { | |||
2123 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_store_override failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2123, __FUNCTION__, __debug_macro_level, "sysdb_store_override failed.\n" ); } } while (0); | |||
2124 | goto done; | |||
2125 | } | |||
2126 | ||||
2127 | done: | |||
2128 | if (in_transaction) { | |||
2129 | tret = sysdb_transaction_cancel(dom->sysdb); | |||
2130 | if (tret != EOK0) { | |||
2131 | DEBUG(SSSDBG_CRIT_FAILURE, "Failed to cancel transaction\n")do { int __debug_macro_level = 0x0020; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2131, __FUNCTION__, __debug_macro_level, "Failed to cancel transaction\n" ); } } while (0); | |||
2132 | } | |||
2133 | } | |||
2134 | ||||
2135 | talloc_free(tmp_ctx)_talloc_free(tmp_ctx, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2135"); | |||
2136 | ||||
2137 | return ret; | |||
2138 | } | |||
2139 | ||||
2140 | static void ipa_s2n_get_fqlist_done(struct tevent_req *subreq) | |||
2141 | { | |||
2142 | int ret; | |||
2143 | struct tevent_req *req = tevent_req_callback_data(subreq,(struct tevent_req *)_talloc_get_type_abort(_tevent_req_callback_data (subreq), "struct tevent_req", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2144") | |||
2144 | struct tevent_req)(struct tevent_req *)_talloc_get_type_abort(_tevent_req_callback_data (subreq), "struct tevent_req", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2144"); | |||
2145 | struct ipa_s2n_get_user_state *state = tevent_req_data(req,(struct ipa_s2n_get_user_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_get_user_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2146") | |||
2146 | struct ipa_s2n_get_user_state)(struct ipa_s2n_get_user_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_get_user_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2146"); | |||
2147 | const char *sid_str; | |||
2148 | struct be_acct_req *ar; | |||
2149 | ||||
2150 | ret = ipa_s2n_get_fqlist_recv(subreq); | |||
2151 | talloc_zfree(subreq)do { _talloc_free(((void *)((uintptr_t)(subreq))), "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2151"); subreq = ((void*)0); } while(0); | |||
2152 | if (ret != EOK0) { | |||
2153 | DEBUG(SSSDBG_OP_FAILURE, "s2n get_fqlist request failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2153, __FUNCTION__, __debug_macro_level, "s2n get_fqlist request failed.\n" ); } } while (0); | |||
2154 | tevent_req_error(req, ret)_tevent_req_error(req, ret, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2154"); | |||
2155 | return; | |||
2156 | } | |||
2157 | ||||
2158 | ret = sysdb_attrs_get_string(state->attrs->sysdb_attrs, SYSDB_SID_STR"objectSIDString", | |||
2159 | &sid_str); | |||
2160 | if (ret == ENOENT2) { | |||
2161 | ret = ipa_s2n_save_objects(state->dom, state->req_input, state->attrs, | |||
2162 | state->simple_attrs, NULL((void*)0), NULL((void*)0)); | |||
2163 | if (ret != EOK0) { | |||
2164 | DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_save_objects failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2164, __FUNCTION__, __debug_macro_level, "ipa_s2n_save_objects failed.\n" ); } } while (0); | |||
2165 | goto fail; | |||
2166 | } | |||
2167 | tevent_req_done(req)_tevent_req_done(req, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2167"); | |||
2168 | return; | |||
2169 | } else if (ret != EOK0) { | |||
2170 | DEBUG(SSSDBG_OP_FAILURE, "sysdb_attrs_get_string failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2170, __FUNCTION__, __debug_macro_level, "sysdb_attrs_get_string failed.\n" ); } } while (0); | |||
2171 | goto fail; | |||
2172 | } | |||
2173 | ||||
2174 | ret = get_be_acct_req_for_sid(state, sid_str, state->dom->name, &ar); | |||
2175 | if (ret != EOK0) { | |||
2176 | DEBUG(SSSDBG_OP_FAILURE, "get_be_acct_req_for_sid failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2176, __FUNCTION__, __debug_macro_level, "get_be_acct_req_for_sid failed.\n" ); } } while (0); | |||
2177 | goto fail; | |||
2178 | } | |||
2179 | ||||
2180 | if (state->override_attrs == NULL((void*)0) | |||
2181 | && strcmp(state->ipa_ctx->view_name,__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (state->ipa_ctx->view_name) && __builtin_constant_p ("default") && (__s1_len = strlen (state->ipa_ctx ->view_name), __s2_len = strlen ("default"), (!((size_t)(const void *)((state->ipa_ctx->view_name) + 1) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("default") + 1) - ( size_t)(const void *)("default") == 1) || __s2_len >= 4)) ? __builtin_strcmp (state->ipa_ctx->view_name, "default" ) : (__builtin_constant_p (state->ipa_ctx->view_name) && ((size_t)(const void *)((state->ipa_ctx->view_name) + 1 ) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) && (__s1_len = strlen (state->ipa_ctx->view_name ), __s1_len < 4) ? (__builtin_constant_p ("default") && ((size_t)(const void *)(("default") + 1) - (size_t)(const void *)("default") == 1) ? __builtin_strcmp (state->ipa_ctx-> view_name, "default") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("default"); int __result = (((const unsigned char *) (const char *) (state-> ipa_ctx->view_name))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (state->ipa_ctx->view_name))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (state->ipa_ctx->view_name ))[2] - __s2[2]); if (__s1_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) (state-> ipa_ctx->view_name))[3] - __s2[3]); } } __result; }))) : ( __builtin_constant_p ("default") && ((size_t)(const void *)(("default") + 1) - (size_t)(const void *)("default") == 1 ) && (__s2_len = strlen ("default"), __s2_len < 4) ? (__builtin_constant_p (state->ipa_ctx->view_name) && ((size_t)(const void *)((state->ipa_ctx->view_name) + 1 ) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) ? __builtin_strcmp (state->ipa_ctx->view_name, "default" ) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (state->ipa_ctx->view_name); int __result = (((const unsigned char *) (const char *) ("default" ))[0] - __s2[0]); if (__s2_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("default" ))[1] - __s2[1]); if (__s2_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("default" ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) ("default" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (state ->ipa_ctx->view_name, "default")))); }) | |||
2182 | SYSDB_DEFAULT_VIEW_NAME)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (state->ipa_ctx->view_name) && __builtin_constant_p ("default") && (__s1_len = strlen (state->ipa_ctx ->view_name), __s2_len = strlen ("default"), (!((size_t)(const void *)((state->ipa_ctx->view_name) + 1) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("default") + 1) - ( size_t)(const void *)("default") == 1) || __s2_len >= 4)) ? __builtin_strcmp (state->ipa_ctx->view_name, "default" ) : (__builtin_constant_p (state->ipa_ctx->view_name) && ((size_t)(const void *)((state->ipa_ctx->view_name) + 1 ) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) && (__s1_len = strlen (state->ipa_ctx->view_name ), __s1_len < 4) ? (__builtin_constant_p ("default") && ((size_t)(const void *)(("default") + 1) - (size_t)(const void *)("default") == 1) ? __builtin_strcmp (state->ipa_ctx-> view_name, "default") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("default"); int __result = (((const unsigned char *) (const char *) (state-> ipa_ctx->view_name))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (state->ipa_ctx->view_name))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (state->ipa_ctx->view_name ))[2] - __s2[2]); if (__s1_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) (state-> ipa_ctx->view_name))[3] - __s2[3]); } } __result; }))) : ( __builtin_constant_p ("default") && ((size_t)(const void *)(("default") + 1) - (size_t)(const void *)("default") == 1 ) && (__s2_len = strlen ("default"), __s2_len < 4) ? (__builtin_constant_p (state->ipa_ctx->view_name) && ((size_t)(const void *)((state->ipa_ctx->view_name) + 1 ) - (size_t)(const void *)(state->ipa_ctx->view_name) == 1) ? __builtin_strcmp (state->ipa_ctx->view_name, "default" ) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (state->ipa_ctx->view_name); int __result = (((const unsigned char *) (const char *) ("default" ))[0] - __s2[0]); if (__s2_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("default" ))[1] - __s2[1]); if (__s2_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) ("default" ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) ("default" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (state ->ipa_ctx->view_name, "default")))); }) != 0) { | |||
2183 | subreq = ipa_get_ad_override_send(state, state->ev, | |||
2184 | state->ipa_ctx->sdap_id_ctx, | |||
2185 | state->ipa_ctx->ipa_options, | |||
2186 | dp_opt_get_string(state->ipa_ctx->ipa_options->basic,_dp_opt_get_string(state->ipa_ctx->ipa_options->basic , IPA_KRB5_REALM, __FUNCTION__) | |||
2187 | IPA_KRB5_REALM)_dp_opt_get_string(state->ipa_ctx->ipa_options->basic , IPA_KRB5_REALM, __FUNCTION__), | |||
2188 | state->ipa_ctx->view_name, | |||
2189 | ar); | |||
2190 | if (subreq == NULL((void*)0)) { | |||
2191 | DEBUG(SSSDBG_OP_FAILURE, "ipa_get_ad_override_send failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2191, __FUNCTION__, __debug_macro_level, "ipa_get_ad_override_send failed.\n" ); } } while (0); | |||
2192 | ret = ENOMEM12; | |||
2193 | goto fail; | |||
2194 | } | |||
2195 | tevent_req_set_callback(subreq, ipa_s2n_get_user_get_override_done, | |||
2196 | req); | |||
2197 | } else { | |||
2198 | ret = ipa_s2n_save_objects(state->dom, state->req_input, state->attrs, | |||
2199 | state->simple_attrs, | |||
2200 | state->ipa_ctx->view_name, | |||
2201 | state->override_attrs); | |||
2202 | if (ret != EOK0) { | |||
2203 | DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_save_objects failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2203, __FUNCTION__, __debug_macro_level, "ipa_s2n_save_objects failed.\n" ); } } while (0); | |||
2204 | tevent_req_error(req, ret)_tevent_req_error(req, ret, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2204"); | |||
2205 | return; | |||
2206 | } | |||
2207 | ||||
2208 | tevent_req_done(req)_tevent_req_done(req, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2208"); | |||
2209 | } | |||
2210 | ||||
2211 | return; | |||
2212 | ||||
2213 | fail: | |||
2214 | tevent_req_error(req, ret)_tevent_req_error(req, ret, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2214"); | |||
2215 | return; | |||
2216 | } | |||
2217 | ||||
2218 | static void ipa_s2n_get_user_get_override_done(struct tevent_req *subreq) | |||
2219 | { | |||
2220 | int ret; | |||
2221 | struct tevent_req *req = tevent_req_callback_data(subreq,(struct tevent_req *)_talloc_get_type_abort(_tevent_req_callback_data (subreq), "struct tevent_req", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2222") | |||
2222 | struct tevent_req)(struct tevent_req *)_talloc_get_type_abort(_tevent_req_callback_data (subreq), "struct tevent_req", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2222"); | |||
2223 | struct ipa_s2n_get_user_state *state = tevent_req_data(req,(struct ipa_s2n_get_user_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_get_user_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2224") | |||
2224 | struct ipa_s2n_get_user_state)(struct ipa_s2n_get_user_state *)_talloc_get_type_abort(_tevent_req_data (req), "struct ipa_s2n_get_user_state", "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2224"); | |||
2225 | struct sysdb_attrs *override_attrs = NULL((void*)0); | |||
2226 | ||||
2227 | ret = ipa_get_ad_override_recv(subreq, NULL((void*)0), state, &override_attrs); | |||
2228 | talloc_zfree(subreq)do { _talloc_free(((void *)((uintptr_t)(subreq))), "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2228"); subreq = ((void*)0); } while(0); | |||
2229 | if (ret != EOK0) { | |||
2230 | DEBUG(SSSDBG_OP_FAILURE, "IPA override lookup failed: %d\n", ret)do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2230, __FUNCTION__, __debug_macro_level, "IPA override lookup failed: %d\n" , ret); } } while (0); | |||
2231 | tevent_req_error(req, ret)_tevent_req_error(req, ret, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2231"); | |||
2232 | return; | |||
2233 | } | |||
2234 | ||||
2235 | ret = ipa_s2n_save_objects(state->dom, state->req_input, state->attrs, | |||
2236 | state->simple_attrs, state->ipa_ctx->view_name, | |||
2237 | override_attrs); | |||
2238 | if (ret != EOK0) { | |||
2239 | DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_save_objects failed.\n")do { int __debug_macro_level = 0x0040; if ((debug_level & (__debug_macro_level) || (debug_level == 0 && (__debug_macro_level & (0x0010 | 0x0020))))) { debug_fn("../sssd/src/providers/ipa/ipa_s2n_exop.c" , 2239, __FUNCTION__, __debug_macro_level, "ipa_s2n_save_objects failed.\n" ); } } while (0); | |||
2240 | tevent_req_error(req, ret)_tevent_req_error(req, ret, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2240"); | |||
2241 | return; | |||
2242 | } | |||
2243 | ||||
2244 | tevent_req_done(req)_tevent_req_done(req, "../sssd/src/providers/ipa/ipa_s2n_exop.c" ":" "2244"); | |||
2245 | return; | |||
2246 | } | |||
2247 | ||||
2248 | int ipa_s2n_get_acct_info_recv(struct tevent_req *req) | |||
2249 | { | |||
2250 | TEVENT_REQ_RETURN_ON_ERROR(req)do { enum tevent_req_state TRROEstate; uint64_t TRROEerr; if ( tevent_req_is_error(req, &TRROEstate, &TRROEerr)) { if (TRROEstate == TEVENT_REQ_USER_ERROR && TRROEerr != 0 ) { return TRROEerr; } return ERR_INTERNAL; } } while (0); | |||
2251 | ||||
2252 | return EOK0; | |||
2253 | } |