@@ -31,67 +31,107 @@ static int pack_group_struct(json_t *root, struct group *result, char *buffer, s
31
31
32
32
memset (buffer , '\0' , buflen );
33
33
34
- // Carve off some space for array of members.
35
- result -> gr_mem = (char * * )next_buf ;
36
- result -> gr_name = strdup (con -> group_name );
34
+ size_t team_count = json_array_size (root );
35
+
36
+ result -> gr_mem = (char * * )malloc ((team_count + 1 ) * sizeof (char * ));
37
+ if (!result -> gr_mem ) {
38
+ return -1 ;
39
+ }
40
+
41
+ result -> gr_name = strdup (con -> group_name );
42
+ if (!result -> gr_name ) {
43
+ free (result -> gr_mem );
44
+ return -1 ;
45
+ }
46
+
37
47
result -> gr_passwd = "x" ;
38
- result -> gr_gid = con -> gid ;
48
+ result -> gr_gid = con -> gid ;
49
+
50
+ size_t gr_mem_index = 0 ;
39
51
40
- int i ;
41
- for (i = 0 ; i < json_array_size (root ); i ++ ) {
42
- json_t * j_member = json_object_get (json_array_get (root , i ), "login" );
43
- if (!json_is_string (j_member )) {
44
- return -1 ;
52
+ for (size_t i = 0 ; i < team_count ; i ++ ) {
53
+ json_t * j_team_obj = json_array_get (root , i );
54
+ if (!j_team_obj ) {
55
+ continue ;
45
56
}
46
- const char * login = json_string_value (j_member );
47
- if (bufleft <= strlen (login )) {
48
- return -2 ;
57
+
58
+ json_t * j_team_id = json_object_get (j_team_obj , "id" );
59
+ if (!json_is_integer (j_team_id )) {
60
+ continue ;
49
61
}
50
- result -> gr_mem [i ] = strdup (login );
51
62
52
- next_buf += strlen (result -> gr_mem [i ]) + 1 ;
53
- bufleft -= strlen (result -> gr_mem [i ]) + 1 ;
63
+ json_error_t error ;
64
+ struct response res ;
65
+ int team_id = json_integer_value (j_team_id );
66
+ int status = octopass_team_members_by_team_id (con , team_id , & res );
67
+ if (status != 0 ) {
68
+ free (res .data );
69
+ continue ;
70
+ }
71
+
72
+ json_t * members_root = NULL ;
73
+ members_root = json_loads (res .data , 0 , & error );
74
+ free (res .data );
75
+ res .data = NULL ;
76
+
77
+ if (!members_root || !json_is_array (members_root )) {
78
+ json_decref (members_root );
79
+ continue ;
80
+ }
81
+
82
+ for (size_t mi = 0 ; mi < json_array_size (members_root ); mi ++ ) {
83
+ json_t * j_member = json_object_get (json_array_get (members_root , mi ), "login" );
84
+ if (!json_is_string (j_member )) {
85
+ continue ;
86
+ }
87
+ const char * login = json_string_value (j_member );
88
+ size_t login_len = strlen (login );
89
+ if (bufleft <= strlen (login )) {
90
+ continue ;
91
+ }
92
+ result -> gr_mem [gr_mem_index ] = strdup (login );
93
+
94
+ next_buf += login_len + 1 ;
95
+ bufleft -= login_len + 1 ;
96
+
97
+ gr_mem_index ++ ;
98
+ }
99
+ json_decref (members_root );
54
100
}
55
101
102
+ result -> gr_mem [gr_mem_index ] = NULL ;
103
+
56
104
return 0 ;
57
105
}
58
106
59
107
enum nss_status _nss_octopass_setgrent_locked (int stayopen )
60
108
{
61
- json_t * root ;
62
- json_error_t error ;
63
-
64
109
struct config con ;
65
- struct response res ;
110
+ // struct response res;
66
111
octopass_config_loading (& con , OCTOPASS_CONFIG_FILE );
112
+
67
113
if (con .syslog ) {
68
114
syslog (LOG_INFO , "%s[L%d] -- stayopen: %d" , __func__ , __LINE__ , stayopen );
69
115
}
70
- int status = octopass_members (& con , & res );
71
116
72
- if (status != 0 ) {
117
+ json_t * root = octopass_teams (& con );
118
+ if (!root ) {
73
119
if (con .syslog ) {
74
120
syslog (LOG_INFO , "%s[L%d] -- status: %s" , __func__ , __LINE__ , "UNAVAIL" );
75
121
}
76
122
return NSS_STATUS_UNAVAIL ;
77
123
}
78
124
79
- root = json_loads (res .data , 0 , & error );
80
- free (res .data );
81
-
82
- if (!root ) {
125
+ if (!json_is_array (root ) || json_array_size (root ) == 0 ) {
83
126
if (con .syslog ) {
84
127
syslog (LOG_INFO , "%s[L%d] -- status: %s" , __func__ , __LINE__ , "UNAVAIL" );
85
128
}
129
+ json_decref (root );
86
130
return NSS_STATUS_UNAVAIL ;
87
131
}
88
132
89
- if (!json_is_array (root )) {
90
- json_decref (root );
91
- if (con .syslog ) {
92
- syslog (LOG_INFO , "%s[L%d] -- status: %s" , __func__ , __LINE__ , "UNAVAIL" );
93
- }
94
- return NSS_STATUS_UNAVAIL ;
133
+ if (ent_json_root ) {
134
+ json_decref (ent_json_root );
95
135
}
96
136
97
137
ent_json_root = root ;
@@ -115,9 +155,8 @@ enum nss_status _nss_octopass_setgrent(int stayopen)
115
155
enum nss_status _nss_octopass_endgrent_locked (void )
116
156
{
117
157
if (ent_json_root ) {
118
- while (ent_json_root -> refcount > 0 ) {
119
- json_decref (ent_json_root );
120
- }
158
+ json_decref (ent_json_root );
159
+ ent_json_root = NULL ;
121
160
}
122
161
123
162
ent_json_root = NULL ;
@@ -144,23 +183,30 @@ enum nss_status _nss_octopass_getgrent_r_locked(struct group *result, char *buff
144
183
145
184
if (ent_json_root == NULL ) {
146
185
ret = _nss_octopass_setgrent_locked (0 );
186
+ if (ret != NSS_STATUS_SUCCESS || ent_json_root == NULL ) {
187
+ * errnop = ENOENT ;
188
+ return NSS_STATUS_UNAVAIL ;
189
+ }
147
190
}
148
191
149
- if (ret != NSS_STATUS_SUCCESS ) {
150
- return ret ;
151
- }
192
+ size_t json_size = json_array_size (ent_json_root );
152
193
153
194
// Return notfound when there's nothing else to read.
154
- if (ent_json_idx > 0 ) {
195
+ if (ent_json_idx >= json_size ) {
155
196
* errnop = ENOENT ;
156
197
return NSS_STATUS_NOTFOUND ;
157
198
}
158
199
159
200
struct config con ;
160
- octopass_config_loading (& con , OCTOPASS_CONFIG_FILE );
201
+ if (octopass_config_loading (& con , OCTOPASS_CONFIG_FILE ) != 0 ) {
202
+ * errnop = EIO ;
203
+ return NSS_STATUS_UNAVAIL ;
204
+ }
205
+
161
206
if (con .syslog ) {
162
207
syslog (LOG_INFO , "%s[L%d]" , __func__ , __LINE__ );
163
208
}
209
+
164
210
int pack_result = pack_group_struct (ent_json_root , result , buffer , buflen , & con );
165
211
166
212
if (pack_result == -1 ) {
@@ -202,12 +248,14 @@ enum nss_status _nss_octopass_getgrent_r(struct group *result, char *buffer, siz
202
248
enum nss_status _nss_octopass_getgrgid_r_locked (gid_t gid , struct group * result , char * buffer , size_t buflen ,
203
249
int * errnop )
204
250
{
205
- json_t * root ;
206
- json_error_t error ;
207
-
251
+ enum nss_status status = NSS_STATUS_UNAVAIL ;
208
252
struct config con ;
209
- struct response res ;
210
- octopass_config_loading (& con , OCTOPASS_CONFIG_FILE );
253
+
254
+ if (octopass_config_loading (& con , OCTOPASS_CONFIG_FILE ) != 0 ) {
255
+ * errnop = EIO ;
256
+ return NSS_STATUS_UNAVAIL ;
257
+ }
258
+
211
259
if (con .syslog ) {
212
260
syslog (LOG_INFO , "%s[L%d] -- gid: %d" , __func__ , __LINE__ , gid );
213
261
}
@@ -220,54 +268,53 @@ enum nss_status _nss_octopass_getgrgid_r_locked(gid_t gid, struct group *result,
220
268
return NSS_STATUS_NOTFOUND ;
221
269
}
222
270
223
- int status = octopass_members (& con , & res );
224
-
225
- if (status != 0 ) {
271
+ json_t * root = octopass_teams (& con );
272
+ if (!root ) {
226
273
* errnop = ENOENT ;
227
274
if (con .syslog ) {
228
275
syslog (LOG_INFO , "%s[L%d] -- status: %s" , __func__ , __LINE__ , "UNAVAIL" );
229
276
}
230
277
return NSS_STATUS_UNAVAIL ;
231
278
}
232
279
233
- root = json_loads (res .data , 0 , & error );
234
- free (res .data );
235
-
236
- if (json_array_size (root ) == 0 ) {
237
- json_decref (root );
280
+ if (!json_is_array (root ) || json_array_size (root ) == 0 ) {
281
+ status = NSS_STATUS_NOTFOUND ;
238
282
* errnop = ENOENT ;
239
283
if (con .syslog ) {
240
284
syslog (LOG_INFO , "%s[L%d] -- status: %s" , __func__ , __LINE__ , "NOTFOUND" );
241
285
}
242
- return NSS_STATUS_NOTFOUND ;
286
+ goto cleanup ;
243
287
}
244
288
245
289
int pack_result = pack_group_struct (root , result , buffer , buflen , & con );
246
290
247
291
if (pack_result == -1 ) {
248
- json_decref ( root ) ;
292
+ status = NSS_STATUS_NOTFOUND ;
249
293
* errnop = ENOENT ;
250
294
if (con .syslog ) {
251
295
syslog (LOG_INFO , "%s[L%d] -- status: %s" , __func__ , __LINE__ , "NOTFOUND" );
252
296
}
253
- return NSS_STATUS_NOTFOUND ;
297
+ goto cleanup ;
254
298
}
255
299
256
300
if (pack_result == -2 ) {
257
- json_decref ( root ) ;
301
+ status = NSS_STATUS_TRYAGAIN ;
258
302
* errnop = ERANGE ;
259
303
if (con .syslog ) {
260
304
syslog (LOG_INFO , "%s[L%d] -- status: %s" , __func__ , __LINE__ , "TRYAGAIN" );
261
305
}
262
- return NSS_STATUS_TRYAGAIN ;
306
+ goto cleanup ;
263
307
}
264
308
265
309
if (con .syslog ) {
266
310
syslog (LOG_INFO , "%s[L%d] -- status: %s, gr_name: %s" , __func__ , __LINE__ , "SUCCESS" , result -> gr_name );
267
311
}
268
312
313
+ status = NSS_STATUS_SUCCESS ;
314
+
315
+ cleanup :
269
316
json_decref (root );
270
- return NSS_STATUS_SUCCESS ;
317
+ return status ;
271
318
}
272
319
273
320
// Find a group by gid
@@ -285,12 +332,14 @@ enum nss_status _nss_octopass_getgrgid_r(gid_t gid, struct group *result, char *
285
332
enum nss_status _nss_octopass_getgrnam_r_locked (const char * name , struct group * result , char * buffer , size_t buflen ,
286
333
int * errnop )
287
334
{
288
- json_t * root ;
289
- json_error_t error ;
290
-
335
+ enum nss_status status = NSS_STATUS_UNAVAIL ;
291
336
struct config con ;
292
- struct response res ;
293
- octopass_config_loading (& con , OCTOPASS_CONFIG_FILE );
337
+
338
+ if (octopass_config_loading (& con , OCTOPASS_CONFIG_FILE ) != 0 ) {
339
+ * errnop = EIO ;
340
+ return NSS_STATUS_UNAVAIL ;
341
+ }
342
+
294
343
if (con .syslog ) {
295
344
syslog (LOG_INFO , "%s[L%d] -- name: %s" , __func__ , __LINE__ , name );
296
345
}
@@ -303,53 +352,53 @@ enum nss_status _nss_octopass_getgrnam_r_locked(const char *name, struct group *
303
352
return NSS_STATUS_NOTFOUND ;
304
353
}
305
354
306
- int status = octopass_members (& con , & res );
307
-
308
- if (status != 0 ) {
355
+ json_t * root = octopass_teams (& con );
356
+ if (!root ) {
309
357
* errnop = ENOENT ;
310
358
if (con .syslog ) {
311
359
syslog (LOG_INFO , "%s[L%d] -- status: %s" , __func__ , __LINE__ , "UNAVAIL" );
312
360
}
313
361
return NSS_STATUS_UNAVAIL ;
314
362
}
315
363
316
- root = json_loads (res .data , 0 , & error );
317
- free (res .data );
318
- if (!root ) {
319
- json_decref (root );
364
+ if (!json_is_array (root ) || json_array_size (root ) == 0 ) {
365
+ status = NSS_STATUS_NOTFOUND ;
320
366
* errnop = ENOENT ;
321
367
if (con .syslog ) {
322
- syslog (LOG_INFO , "%s[L%d] -- status: %s" , __func__ , __LINE__ , "UNAVAIL " );
368
+ syslog (LOG_INFO , "%s[L%d] -- status: %s" , __func__ , __LINE__ , "NOTFOUND " );
323
369
}
324
- return NSS_STATUS_UNAVAIL ;
370
+ goto cleanup ;
325
371
}
326
372
327
373
int pack_result = pack_group_struct (root , result , buffer , buflen , & con );
328
374
329
375
if (pack_result == -1 ) {
330
- json_decref ( root ) ;
376
+ status = NSS_STATUS_NOTFOUND ;
331
377
* errnop = ENOENT ;
332
378
if (con .syslog ) {
333
379
syslog (LOG_INFO , "%s[L%d] -- status: %s" , __func__ , __LINE__ , "NOTFOUND" );
334
380
}
335
- return NSS_STATUS_NOTFOUND ;
381
+ goto cleanup ;
336
382
}
337
383
338
384
if (pack_result == -2 ) {
339
- json_decref ( root ) ;
385
+ status = NSS_STATUS_TRYAGAIN ;
340
386
* errnop = ERANGE ;
341
387
if (con .syslog ) {
342
388
syslog (LOG_INFO , "%s[L%d] -- status: %s" , __func__ , __LINE__ , "TRYAGAIN" );
343
389
}
344
- return NSS_STATUS_TRYAGAIN ;
390
+ goto cleanup ;
345
391
}
346
392
347
393
if (con .syslog ) {
348
394
syslog (LOG_INFO , "%s[L%d] -- status: %s, gr_name: %s" , __func__ , __LINE__ , "SUCCESS" , result -> gr_name );
349
395
}
350
396
397
+ status = NSS_STATUS_SUCCESS ;
398
+
399
+ cleanup :
351
400
json_decref (root );
352
- return NSS_STATUS_SUCCESS ;
401
+ return status ;
353
402
}
354
403
355
404
// Find a group by name
0 commit comments