*resource_groups_out = NULL;
}
- frame = talloc_stackframe();
+ if (entry.entry == NULL || entry.entry->info_from_pac == NULL) {
+ frame = talloc_stackframe();
+
+ ret = kerberos_pac_to_user_info_dc(frame,
+ entry.pac,
+ context,
+ &info,
+ AUTH_EXCLUDE_RESOURCE_GROUPS,
+ NULL,
+ NULL,
+ &resource_groups);
+ if (ret) {
+ const char *krb5err = krb5_get_error_message(context, ret);
+ DBG_ERR("kerberos_pac_to_user_info_dc failed: %s\n",
+ krb5err != NULL ? krb5err : "?");
+ krb5_free_error_message(context, krb5err);
- ret = kerberos_pac_to_user_info_dc(frame,
- entry.pac,
- context,
- &info,
- AUTH_EXCLUDE_RESOURCE_GROUPS,
- NULL,
- NULL,
- &resource_groups);
- if (ret) {
- const char *krb5err = krb5_get_error_message(context, ret);
- DBG_ERR("kerberos_pac_to_user_info_dc failed: %s\n",
- krb5err != NULL ? krb5err : "?");
- krb5_free_error_message(context, krb5err);
+ goto out;
+ }
- goto out;
- }
+ /*
+ * We need to expand group memberships within our local domain,
+ * as the token might be generated by a trusted domain.
+ */
+ nt_status = authsam_update_user_info_dc(frame,
+ samdb,
+ info);
+ if (!NT_STATUS_IS_OK(nt_status)) {
+ DBG_ERR("authsam_update_user_info_dc failed: %s\n",
+ nt_errstr(nt_status));
- /*
- * We need to expand group memberships within our local domain,
- * as the token might be generated by a trusted domain.
- */
- nt_status = authsam_update_user_info_dc(frame,
- samdb,
- info);
- if (!NT_STATUS_IS_OK(nt_status)) {
- DBG_ERR("authsam_update_user_info_dc failed: %s\n",
- nt_errstr(nt_status));
+ ret = map_errno_from_nt_status(nt_status);
+ goto out;
+ }
- ret = map_errno_from_nt_status(nt_status);
- goto out;
+ if (entry.entry != NULL) {
+ entry.entry->info_from_pac = talloc_steal(entry.entry, info);
+ entry.entry->resource_groups_from_pac = talloc_steal(entry.entry, resource_groups);
+ }
}
- *info_out = talloc_steal(mem_ctx, info);
- if (resource_groups_out != NULL) {
- *resource_groups_out = talloc_steal(mem_ctx, resource_groups);
+ if (entry.entry != NULL) {
+ /* Note: the caller does not own this! */
+ *info_out = entry.entry->info_from_pac;
+
+ if (resource_groups_out != NULL) {
+ /* Note: the caller does not own this! */
+ *resource_groups_out = entry.entry->resource_groups_from_pac;
+ }
+ } else {
+ *info_out = talloc_steal(mem_ctx, info);
+
+ if (resource_groups_out != NULL) {
+ *resource_groups_out = talloc_steal(mem_ctx, resource_groups);
+ }
}
out: