static char *getxtra(char *hand, char *field) { struct userrec *urec; struct user_entry *ue; struct xtra_key *xk; urec = get_user_by_handle(userlist, hand); if (urec) { ue = find_user_entry(&USERENTRY_XTRA, urec); if (ue) for (xk = ue->u.extra; xk; xk = xk->next) if (xk->key && !egg_strcasecmp(xk->key, field)) { if (xk->data[0] == '{' && xk->data[strlen(xk->data) - 1] == '}' && strlen(xk->data) > 2) { strncpy(fixit, &xk->data[1], strlen(xk->data) - 2); fixit[strlen(xk->data) - 2] = 0; return fixit; } else { return xk->data; } } } return ""; }
void *get_user(struct user_entry_type *et, struct userrec *u) { struct user_entry *e = NULL; if (u && (e = find_user_entry(et, u))) return et->get(u, e); return NULL; }
int del_note_ignore(struct userrec *u, char *mask) { struct user_entry *ue; struct xtra_key *xk; char **ignores, *buf = NULL; int ignoresn, i, size = 0, foundit = 0; ignoresn = get_note_ignores(u, &ignores); if (!ignoresn) return 0; buf = user_malloc(1); buf[0] = 0; for (i = 0; i < ignoresn; i++) { if (strcmp(ignores[i], mask)) { size += strlen(ignores[i]); if (buf[0]) size++; buf = user_realloc(buf, size + 1); if (buf[0]) strcat(buf, " "); strcat(buf, ignores[i]); } else foundit = 1; } nfree(ignores[0]); /* Free the string buffer */ nfree(ignores); /* Free the ptr array */ /* Entry not found */ if (!foundit) { nfree(buf); return 0; } ue = find_user_entry(&USERENTRY_XTRA, u); /* Delete the entry if the buffer is empty */ xk = user_malloc(sizeof(struct xtra_key)); xk->key = user_malloc(strlen(NOTES_IGNKEY) + 1); xk->next = 0; if (!buf[0]) { nfree(buf); /* The allocated byte needs to be free'd too */ strcpy(xk->key, NOTES_IGNKEY); xk->data = 0; } else { xk->data = buf; strcpy(xk->key, NOTES_IGNKEY); } xtra_set(u, ue, xk); return 1; }
/* Return either NULL or a pointer to the xtra_key structure * where the not ignores are kept. */ static struct xtra_key *getnotesentry(struct userrec *u) { struct user_entry *ue = find_user_entry(&USERENTRY_XTRA, u); struct xtra_key *xk, *nxk = NULL; if (!ue) return NULL; /* Search for the notes ignore list entry */ for (xk = ue->u.extra; xk; xk = xk->next) if (xk->key && !egg_strcasecmp(xk->key, NOTES_IGNKEY)) { nxk = xk; break; } if (!nxk || !nxk->data || !(nxk->data[0])) return NULL; return nxk; }
bool add_entry_type(struct user_entry_type *type) { struct userrec *u = NULL; list_insert((&entry_type_list), type); for (u = userlist; u; u = u->next) { struct user_entry *e = find_user_entry(type, u); if (e && e->name) { e->type = type; e->type->unpack(u, e); free(e->name); e->name = NULL; } } return 1; }
int add_note_ignore(struct userrec *u, char *mask) { struct xtra_key *xk; char **ignores; int ignoresn, i; ignoresn = get_note_ignores(u, &ignores); if (ignoresn > 0) { /* Search for existing mask */ for (i = 0; i < ignoresn; i++) if (!strcmp(ignores[i], mask)) { nfree(ignores[0]); /* Free the string buffer */ nfree(ignores); /* Free the ptr array */ /* The mask already exists, exit. */ return 0; } nfree(ignores[0]); /* Free the string buffer */ nfree(ignores); /* Free the ptr array */ } xk = getnotesentry(u); /* First entry? */ if (!xk) { struct xtra_key *mxk = user_malloc(sizeof(struct xtra_key)); struct user_entry *ue = find_user_entry(&USERENTRY_XTRA, u); if (!ue) return 0; mxk->next = 0; mxk->data = user_malloc(strlen(mask) + 1); strcpy(mxk->data, mask); mxk->key = user_malloc(strlen(NOTES_IGNKEY) + 1); strcpy(mxk->key, NOTES_IGNKEY); xtra_set(u, ue, mxk); } else { /* ... else, we already have other entries. */ xk->data = user_realloc(xk->data, strlen(xk->data) + strlen(mask) + 2); strcat(xk->data, " "); strcat(xk->data, mask); } return 1; }
errno_t check_if_pac_is_available(TALLOC_CTX *mem_ctx, struct sss_domain_info *dom, struct dp_id_data *ar, struct ldb_message **_msg) { struct ldb_message *msg; struct ldb_message_element *el; uint64_t pac_expires; time_t now; int ret; ret = find_user_entry(mem_ctx, dom, ar, &msg); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, "find_user_entry failed.\n"); return ret; } el = ldb_msg_find_element(msg, SYSDB_PAC_BLOB); if (el == NULL) { DEBUG(SSSDBG_TRACE_ALL, "No PAC available.\n"); talloc_free(msg); return ENOENT; } pac_expires = ldb_msg_find_attr_as_uint64(msg, SYSDB_PAC_BLOB_EXPIRE, 0); now = time(NULL); if (pac_expires < now) { DEBUG(SSSDBG_TRACE_FUNC, "PAC available but too old.\n"); talloc_free(msg); return ENOENT; } if (_msg != NULL) { *_msg = msg; } return EOK; }
bool set_user(struct user_entry_type *et, struct userrec *u, void *d) { if (!u || !et) return 0; struct user_entry *e = NULL; bool r; if (!(e = find_user_entry(et, u))) { e = (struct user_entry *) my_calloc(1, sizeof(struct user_entry)); e->type = et; e->name = NULL; e->u.list = NULL; list_insert((&(u->entries)), e); } r = et->set(u, e, d); if (!e->u.list) { list_delete((struct list_type **) &(u->entries), (struct list_type *) e); free(e); } return r; }