| 1 /* |
|
| 2 * nmuserrecord.c |
|
| 3 * |
|
| 4 * Copyright (c) 2004 Novell, Inc. All Rights Reserved. |
|
| 5 * |
|
| 6 * This program is free software; you can redistribute it and/or modify |
|
| 7 * it under the terms of the GNU General Public License as published by |
|
| 8 * the Free Software Foundation; version 2 of the License. |
|
| 9 * |
|
| 10 * This program is distributed in the hope that it will be useful, |
|
| 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 13 * GNU General Public License for more details. |
|
| 14 * |
|
| 15 * You should have received a copy of the GNU General Public License |
|
| 16 * along with this program; if not, write to the Free Software |
|
| 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
|
| 18 * |
|
| 19 */ |
|
| 20 |
|
| 21 #include <glib.h> |
|
| 22 #include <string.h> |
|
| 23 #include "nmuserrecord.h" |
|
| 24 #include "nmfield.h" |
|
| 25 #include "nmuser.h" |
|
| 26 |
|
| 27 struct _NMUserRecord |
|
| 28 { |
|
| 29 NMSTATUS_T status; |
|
| 30 char *status_text; |
|
| 31 char *dn; |
|
| 32 char *cn; |
|
| 33 char *display_id; |
|
| 34 char *fname; |
|
| 35 char *lname; |
|
| 36 char *full_name; |
|
| 37 NMField *fields; |
|
| 38 gboolean auth_attr; |
|
| 39 gpointer data; |
|
| 40 int ref_count; |
|
| 41 }; |
|
| 42 |
|
| 43 struct _NMProperty |
|
| 44 { |
|
| 45 char *tag; |
|
| 46 char *value; |
|
| 47 }; |
|
| 48 |
|
| 49 static int count = 0; |
|
| 50 |
|
| 51 /* API functions */ |
|
| 52 |
|
| 53 NMUserRecord * |
|
| 54 nm_create_user_record() |
|
| 55 { |
|
| 56 NMUserRecord *user_record = g_new0(NMUserRecord, 1); |
|
| 57 |
|
| 58 user_record->ref_count = 1; |
|
| 59 |
|
| 60 purple_debug(PURPLE_DEBUG_INFO, "novell", "Creating user_record, total=%d\n", |
|
| 61 count++); |
|
| 62 |
|
| 63 return user_record; |
|
| 64 } |
|
| 65 |
|
| 66 static char * |
|
| 67 _get_attribute_value(NMField *field) |
|
| 68 { |
|
| 69 char *value = NULL; |
|
| 70 |
|
| 71 if (field->ptr_value == NULL) |
|
| 72 return NULL; |
|
| 73 |
|
| 74 if (field->type == NMFIELD_TYPE_UTF8 || field->type == NMFIELD_TYPE_DN) { |
|
| 75 |
|
| 76 value = (char *)field->ptr_value; |
|
| 77 |
|
| 78 } else if (field->type == NMFIELD_TYPE_MV) { |
|
| 79 |
|
| 80 /* Need to handle multi-valued returns, for now |
|
| 81 * just pick the first value and return it |
|
| 82 */ |
|
| 83 NMField *tmp = (NMField *)field->ptr_value; |
|
| 84 if ((tmp != NULL) && |
|
| 85 ((tmp->type == NMFIELD_TYPE_UTF8) || |
|
| 86 (tmp->type == NMFIELD_TYPE_DN))) { |
|
| 87 |
|
| 88 value = (char *)tmp->ptr_value; |
|
| 89 |
|
| 90 } else { |
|
| 91 return NULL; |
|
| 92 } |
|
| 93 |
|
| 94 } else { |
|
| 95 return NULL; |
|
| 96 } |
|
| 97 |
|
| 98 return g_strdup(value); |
|
| 99 } |
|
| 100 /* |
|
| 101 * This creates a user_record for the reference list the |
|
| 102 * field array that is passed in should be a |
|
| 103 * NM_A_FA_USER_DETAILS array. |
|
| 104 */ |
|
| 105 NMUserRecord * |
|
| 106 nm_create_user_record_from_fields(NMField * details) |
|
| 107 { |
|
| 108 NMUserRecord *user_record; |
|
| 109 NMField *field, *fields = details; |
|
| 110 |
|
| 111 if (details == NULL) { |
|
| 112 return NULL; |
|
| 113 } |
|
| 114 |
|
| 115 if (details->type == NMFIELD_TYPE_ARRAY) { |
|
| 116 if (details->ptr_value == NULL) |
|
| 117 return NULL; |
|
| 118 fields = (NMField *) details->ptr_value; |
|
| 119 } |
|
| 120 |
|
| 121 user_record = nm_create_user_record(); |
|
| 122 |
|
| 123 if ((field = nm_locate_field(NM_A_SZ_AUTH_ATTRIBUTE, fields))) { |
|
| 124 |
|
| 125 if (field->ptr_value) { |
|
| 126 user_record->display_id = _get_attribute_value(field); |
|
| 127 user_record->auth_attr = TRUE; |
|
| 128 } |
|
| 129 } |
|
| 130 |
|
| 131 if ((field = nm_locate_field(NM_A_SZ_DN, fields))) { |
|
| 132 |
|
| 133 if (field->ptr_value) { |
|
| 134 user_record->dn = _get_attribute_value(field); |
|
| 135 } |
|
| 136 } |
|
| 137 |
|
| 138 if ((field = nm_locate_field("CN", fields))) { |
|
| 139 |
|
| 140 if (field->ptr_value) { |
|
| 141 user_record->cn = _get_attribute_value(field); |
|
| 142 } |
|
| 143 } |
|
| 144 |
|
| 145 if ((field = nm_locate_field("Given Name", fields))) { |
|
| 146 |
|
| 147 if (field->ptr_value) { |
|
| 148 user_record->fname = _get_attribute_value(field); |
|
| 149 } |
|
| 150 } |
|
| 151 |
|
| 152 if ((field = nm_locate_field("Surname", fields))) { |
|
| 153 |
|
| 154 if (field->ptr_value) { |
|
| 155 user_record->lname = _get_attribute_value(field); |
|
| 156 } |
|
| 157 } |
|
| 158 |
|
| 159 if ((field = nm_locate_field("Full Name", fields))) { |
|
| 160 |
|
| 161 if (field->ptr_value) { |
|
| 162 user_record->full_name = _get_attribute_value(field); |
|
| 163 } |
|
| 164 } |
|
| 165 |
|
| 166 if ((field = nm_locate_field(NM_A_SZ_STATUS, fields))) { |
|
| 167 |
|
| 168 if (field->ptr_value) |
|
| 169 user_record->status = atoi((char *) field->ptr_value); |
|
| 170 |
|
| 171 } |
|
| 172 |
|
| 173 if ((field = nm_locate_field(NM_A_SZ_MESSAGE_BODY, fields))) { |
|
| 174 |
|
| 175 if (field->ptr_value) |
|
| 176 user_record->status_text = g_strdup((char *) field->ptr_value); |
|
| 177 |
|
| 178 } |
|
| 179 |
|
| 180 user_record->fields = nm_copy_field_array(fields); |
|
| 181 |
|
| 182 return user_record; |
|
| 183 } |
|
| 184 |
|
| 185 void |
|
| 186 nm_user_record_copy(NMUserRecord * dest, NMUserRecord * src) |
|
| 187 { |
|
| 188 if (dest == NULL || src == NULL) |
|
| 189 return; |
|
| 190 |
|
| 191 dest->status = src->status; |
|
| 192 |
|
| 193 /* Copy status text */ |
|
| 194 if (dest->status_text) { |
|
| 195 g_free(dest->status_text); |
|
| 196 dest->status_text = NULL; |
|
| 197 } |
|
| 198 |
|
| 199 if (src->status_text) |
|
| 200 dest->status_text = g_strdup(src->status_text); |
|
| 201 |
|
| 202 /* Copy DN */ |
|
| 203 if (dest->dn) { |
|
| 204 g_free(dest->dn); |
|
| 205 dest->dn = NULL; |
|
| 206 } |
|
| 207 |
|
| 208 if (src->dn) |
|
| 209 dest->dn = g_strdup(src->dn); |
|
| 210 |
|
| 211 /* Copy CN */ |
|
| 212 if (dest->cn) { |
|
| 213 g_free(dest->cn); |
|
| 214 dest->cn = NULL; |
|
| 215 } |
|
| 216 |
|
| 217 if (src->cn) |
|
| 218 dest->cn = g_strdup(src->cn); |
|
| 219 |
|
| 220 /* Copy display id */ |
|
| 221 if (dest->display_id) { |
|
| 222 g_free(dest->display_id); |
|
| 223 dest->display_id = NULL; |
|
| 224 } |
|
| 225 |
|
| 226 if (src->display_id) |
|
| 227 dest->display_id = g_strdup(src->display_id); |
|
| 228 |
|
| 229 /* Copy first name */ |
|
| 230 if (dest->fname) { |
|
| 231 g_free(dest->fname); |
|
| 232 dest->fname = NULL; |
|
| 233 } |
|
| 234 |
|
| 235 if (src->fname) |
|
| 236 dest->fname = g_strdup(src->fname); |
|
| 237 |
|
| 238 /* Copy last name */ |
|
| 239 if (dest->lname) { |
|
| 240 g_free(dest->lname); |
|
| 241 dest->lname = NULL; |
|
| 242 } |
|
| 243 |
|
| 244 if (src->lname) |
|
| 245 dest->lname = g_strdup(src->lname); |
|
| 246 |
|
| 247 /* Copy full name */ |
|
| 248 if (dest->full_name) { |
|
| 249 g_free(dest->full_name); |
|
| 250 dest->full_name = NULL; |
|
| 251 } |
|
| 252 |
|
| 253 if (src->full_name) |
|
| 254 dest->full_name = g_strdup(src->full_name); |
|
| 255 |
|
| 256 /* Copy fields */ |
|
| 257 if (src->fields) { |
|
| 258 |
|
| 259 if (dest->fields) { |
|
| 260 nm_free_fields(&dest->fields); |
|
| 261 } |
|
| 262 |
|
| 263 dest->fields = nm_copy_field_array(src->fields); |
|
| 264 } |
|
| 265 |
|
| 266 /* Copy data */ |
|
| 267 dest->data = src->data; |
|
| 268 } |
|
| 269 |
|
| 270 void |
|
| 271 nm_user_record_add_ref(NMUserRecord * user_record) |
|
| 272 { |
|
| 273 if (user_record) |
|
| 274 user_record->ref_count++; |
|
| 275 } |
|
| 276 |
|
| 277 void |
|
| 278 nm_release_user_record(NMUserRecord * user_record) |
|
| 279 { |
|
| 280 if (--(user_record->ref_count) == 0) { |
|
| 281 |
|
| 282 purple_debug(PURPLE_DEBUG_INFO, "novell", |
|
| 283 "Releasing user_record, total=%d\n", --count); |
|
| 284 |
|
| 285 if (user_record->dn) { |
|
| 286 g_free(user_record->dn); |
|
| 287 } |
|
| 288 |
|
| 289 if (user_record->cn) { |
|
| 290 g_free(user_record->cn); |
|
| 291 } |
|
| 292 |
|
| 293 if (user_record->display_id) { |
|
| 294 g_free(user_record->display_id); |
|
| 295 } |
|
| 296 |
|
| 297 if (user_record->fname) { |
|
| 298 g_free(user_record->fname); |
|
| 299 } |
|
| 300 |
|
| 301 if (user_record->lname) { |
|
| 302 g_free(user_record->lname); |
|
| 303 } |
|
| 304 |
|
| 305 if (user_record->full_name) { |
|
| 306 g_free(user_record->full_name); |
|
| 307 } |
|
| 308 |
|
| 309 if (user_record->status_text) { |
|
| 310 g_free(user_record->status_text); |
|
| 311 } |
|
| 312 |
|
| 313 nm_free_fields(&user_record->fields); |
|
| 314 |
|
| 315 g_free(user_record); |
|
| 316 } |
|
| 317 } |
|
| 318 |
|
| 319 /* UserRecord API */ |
|
| 320 |
|
| 321 NMSTATUS_T |
|
| 322 nm_user_record_get_status(NMUserRecord * user_record) |
|
| 323 { |
|
| 324 if (user_record == NULL) |
|
| 325 return (NMSTATUS_T) - 1; |
|
| 326 |
|
| 327 return user_record->status; |
|
| 328 |
|
| 329 } |
|
| 330 |
|
| 331 const char * |
|
| 332 nm_user_record_get_status_text(NMUserRecord * user_record) |
|
| 333 { |
|
| 334 if (user_record == NULL) |
|
| 335 return NULL; |
|
| 336 |
|
| 337 return user_record->status_text; |
|
| 338 } |
|
| 339 |
|
| 340 void |
|
| 341 nm_user_record_set_dn(NMUserRecord * user_record, const char *dn) |
|
| 342 { |
|
| 343 if (user_record != NULL && dn != NULL) { |
|
| 344 if (user_record->dn) |
|
| 345 g_free(user_record->dn); |
|
| 346 |
|
| 347 user_record->dn = g_strdup(dn); |
|
| 348 } |
|
| 349 } |
|
| 350 |
|
| 351 const char * |
|
| 352 nm_user_record_get_dn(NMUserRecord * user_record) |
|
| 353 { |
|
| 354 if (user_record == NULL) |
|
| 355 return NULL; |
|
| 356 |
|
| 357 return user_record->dn; |
|
| 358 } |
|
| 359 |
|
| 360 void |
|
| 361 nm_user_record_set_userid(NMUserRecord * user_record, const char *userid) |
|
| 362 { |
|
| 363 if (user_record != NULL && userid != NULL) { |
|
| 364 if (user_record->cn) |
|
| 365 g_free(user_record->cn); |
|
| 366 |
|
| 367 user_record->cn = g_strdup(userid); |
|
| 368 } |
|
| 369 } |
|
| 370 |
|
| 371 const char * |
|
| 372 nm_user_record_get_userid(NMUserRecord * user_record) |
|
| 373 { |
|
| 374 if (user_record == NULL) |
|
| 375 return NULL; |
|
| 376 |
|
| 377 return user_record->cn; |
|
| 378 } |
|
| 379 |
|
| 380 void |
|
| 381 nm_user_record_set_display_id(NMUserRecord * user_record, const char *display_id) |
|
| 382 { |
|
| 383 if (user_record != NULL && display_id != NULL) { |
|
| 384 if (user_record->display_id) |
|
| 385 g_free(user_record->display_id); |
|
| 386 |
|
| 387 user_record->display_id = g_strdup(display_id); |
|
| 388 } |
|
| 389 } |
|
| 390 |
|
| 391 const char * |
|
| 392 nm_user_record_get_display_id(NMUserRecord * user_record) |
|
| 393 { |
|
| 394 if (user_record == NULL) |
|
| 395 return NULL; |
|
| 396 |
|
| 397 if (user_record->display_id == NULL) { |
|
| 398 user_record->display_id = nm_typed_to_dotted(user_record->dn); |
|
| 399 } |
|
| 400 |
|
| 401 return user_record->display_id; |
|
| 402 } |
|
| 403 |
|
| 404 const char * |
|
| 405 nm_user_record_get_full_name(NMUserRecord * user_record) |
|
| 406 { |
|
| 407 if (user_record == NULL) |
|
| 408 return NULL; |
|
| 409 |
|
| 410 if (user_record->full_name == NULL) { |
|
| 411 if (user_record->fname && user_record->lname) { |
|
| 412 user_record->full_name = g_strdup_printf("%s %s", |
|
| 413 user_record->fname, |
|
| 414 user_record->lname); |
|
| 415 |
|
| 416 } |
|
| 417 } |
|
| 418 |
|
| 419 return user_record->full_name; |
|
| 420 } |
|
| 421 |
|
| 422 const char * |
|
| 423 nm_user_record_get_first_name(NMUserRecord * user_record) |
|
| 424 { |
|
| 425 if (user_record == NULL) |
|
| 426 return NULL; |
|
| 427 |
|
| 428 return user_record->fname; |
|
| 429 |
|
| 430 } |
|
| 431 |
|
| 432 const char * |
|
| 433 nm_user_record_get_last_name(NMUserRecord * user_record) |
|
| 434 { |
|
| 435 if (user_record == NULL) |
|
| 436 return NULL; |
|
| 437 |
|
| 438 return user_record->lname; |
|
| 439 } |
|
| 440 |
|
| 441 gpointer |
|
| 442 nm_user_record_get_data(NMUserRecord * user_record) |
|
| 443 { |
|
| 444 if (user_record == NULL) |
|
| 445 return NULL; |
|
| 446 |
|
| 447 return user_record->data; |
|
| 448 } |
|
| 449 |
|
| 450 void |
|
| 451 nm_user_record_set_data(NMUserRecord * user_record, gpointer data) |
|
| 452 { |
|
| 453 if (user_record == NULL) |
|
| 454 return; |
|
| 455 |
|
| 456 user_record->data = data; |
|
| 457 } |
|
| 458 |
|
| 459 void |
|
| 460 nm_user_record_set_status(NMUserRecord * user_record, |
|
| 461 int status, const char *text) |
|
| 462 { |
|
| 463 if (user_record == NULL) |
|
| 464 return; |
|
| 465 |
|
| 466 user_record->status = status; |
|
| 467 |
|
| 468 if (user_record->status_text) { |
|
| 469 g_free(user_record->status_text); |
|
| 470 user_record->status_text = NULL; |
|
| 471 } |
|
| 472 |
|
| 473 if (text) |
|
| 474 user_record->status_text = g_strdup(text); |
|
| 475 } |
|
| 476 |
|
| 477 gboolean |
|
| 478 nm_user_record_get_auth_attr(NMUserRecord *user_record) |
|
| 479 { |
|
| 480 if (user_record == NULL) |
|
| 481 return FALSE; |
|
| 482 |
|
| 483 return user_record->auth_attr; |
|
| 484 } |
|
| 485 |
|
| 486 int |
|
| 487 nm_user_record_get_property_count(NMUserRecord * user_record) |
|
| 488 { |
|
| 489 NMField *locate, *fields; |
|
| 490 |
|
| 491 int count = 0; |
|
| 492 |
|
| 493 if (user_record && user_record->fields) { |
|
| 494 locate = nm_locate_field(NM_A_FA_INFO_DISPLAY_ARRAY, |
|
| 495 (NMField *) user_record->fields); |
|
| 496 if (locate && (fields = (NMField *) (locate->ptr_value))) { |
|
| 497 count = (int) nm_count_fields(fields); |
|
| 498 } |
|
| 499 } |
|
| 500 return count; |
|
| 501 } |
|
| 502 |
|
| 503 NMProperty * |
|
| 504 nm_user_record_get_property(NMUserRecord * user_record, int index) |
|
| 505 { |
|
| 506 NMProperty *property = NULL; |
|
| 507 NMField *field = NULL, *fields, *locate; |
|
| 508 |
|
| 509 if (user_record && user_record->fields) { |
|
| 510 locate = nm_locate_field(NM_A_FA_INFO_DISPLAY_ARRAY, |
|
| 511 (NMField *) user_record->fields); |
|
| 512 if (locate && (fields = (NMField *) (locate->ptr_value))) { |
|
| 513 int max = nm_count_fields(fields); |
|
| 514 |
|
| 515 if (index < max) { |
|
| 516 if (user_record) { |
|
| 517 field = &fields[index]; |
|
| 518 if (field && field->tag && field->ptr_value) { |
|
| 519 property = g_new0(NMProperty, 1); |
|
| 520 property->tag = g_strdup(field->tag); |
|
| 521 property->value = _get_attribute_value(field); |
|
| 522 } |
|
| 523 } |
|
| 524 } |
|
| 525 } |
|
| 526 } |
|
| 527 |
|
| 528 return property; |
|
| 529 } |
|
| 530 |
|
| 531 void |
|
| 532 nm_release_property(NMProperty * property) |
|
| 533 { |
|
| 534 if (property) { |
|
| 535 if (property->tag) |
|
| 536 g_free(property->tag); |
|
| 537 |
|
| 538 if (property->value) |
|
| 539 g_free(property->value); |
|
| 540 |
|
| 541 g_free(property); |
|
| 542 } |
|
| 543 } |
|
| 544 |
|
| 545 const char * |
|
| 546 nm_property_get_tag(NMProperty * property) |
|
| 547 { |
|
| 548 if (property) |
|
| 549 return property->tag; |
|
| 550 else |
|
| 551 return NULL; |
|
| 552 } |
|
| 553 |
|
| 554 const char * |
|
| 555 nm_property_get_value(NMProperty * property) |
|
| 556 { |
|
| 557 if (property) |
|
| 558 return property->value; |
|
| 559 else |
|
| 560 return NULL; |
|
| 561 } |
|