/* System database */ static int mu_auth_system (struct mu_auth_data **return_data, const struct passwd *pw) { char *mailbox_name; int rc; if (!pw) return MU_ERR_AUTH_FAILURE; rc = mu_construct_user_mailbox_url (&mailbox_name, pw->pw_name); if (rc) return rc; /* FIXME: Return code is lost */ rc = mu_auth_data_alloc (return_data, pw->pw_name, pw->pw_passwd, pw->pw_uid, pw->pw_gid, pw->pw_gecos, pw->pw_dir, pw->pw_shell, mailbox_name, 1); free (mailbox_name); return rc; }
/* Virtual domains */ static int mu_auth_virt_domain_by_name (struct mu_auth_data **return_data, const void *key, void *unused_func_data, void *unused_call_data) { int rc; struct passwd *pw; char *mailbox_name; if (!key) return EINVAL; pw = getpwnam_virtual (key); if (!pw) { pw = getpwnam_ip_virtual (key); if (!pw) return MU_ERR_AUTH_FAILURE; } mailbox_name = mu_make_file_name (pw->pw_dir, "INBOX"); if (!mailbox_name) return ENOMEM; rc = mu_auth_data_alloc (return_data, pw->pw_name, pw->pw_passwd, pw->pw_uid, pw->pw_gid, pw->pw_gecos, pw->pw_dir, pw->pw_shell, mailbox_name, 0); free (mailbox_name); return rc; }
static int _mu_entry_to_auth_data (LDAP *ld, LDAPMessage *msg, struct mu_auth_data **return_data) { int rc; BerElement *ber = NULL; struct berval bv; char *ufn = NULL; struct mu_auth_data d; mu_iterator_t itr = NULL; memset (&d, 0, sizeof d); rc = ldap_get_dn_ber (ld, msg, &ber, &bv); ufn = ldap_dn2ufn (bv.bv_val); /* FIXME: Use debug or diag functions */ mu_error ("INFO: %s", ufn); ldap_memfree (ufn); mu_assoc_get_iterator (ldap_param.field_map, &itr); for (mu_iterator_first (itr); !mu_iterator_is_done (itr); mu_iterator_next (itr)) { char *key; char **pattr; char *attr; struct berval **values; mu_iterator_current_kv (itr, (const void **)&key, (void**) &pattr); attr = *pattr; values = ldap_get_values_len (ld, msg, attr); if (!values || !values[0]) { mu_error ("LDAP field `%s' (`%s') has NULL value", key, *pattr); _free_partial_auth_data (&d); return MU_ERR_READ; } rc = _assign_partial_auth_data (&d, key, values[0]->bv_val); ldap_value_free_len (values); if (rc) { _free_partial_auth_data (&d); return rc; } } rc = mu_auth_data_alloc (return_data, d.name, d.passwd, d.uid, d.gid, d.gecos, d.dir, d.shell, d.mailbox, 1); if (rc == 0) mu_auth_data_set_quota (*return_data, d.quota); _free_partial_auth_data (&d); return rc; }