54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/*
2dd2efa5a06a9befe46075cf41e16f57533c9f98willf * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * Use is subject to license terms.
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#pragma ident "%Z%%M% %I% %E% SMI"
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/*
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * Copyright 2006 by the Massachusetts Institute of Technology.
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * All Rights Reserved.
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf *
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * Export of this software from the United States of America may
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * require a specific license from the United States Government.
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * It is the responsibility of any person or organization contemplating
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * export to obtain such a license before exporting.
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf *
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * distribute this software and its documentation for any purpose and
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * without fee is hereby granted, provided that the above copyright
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * notice appear in all copies and that both that copyright notice and
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * this permission notice appear in supporting documentation, and that
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * the name of M.I.T. not be used in advertising or publicity pertaining
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * to distribution of the software without specific, written prior
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * permission. Furthermore if you modify this software you must label
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * your software as modified software and not distribute it in such a
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * fashion that it might be confused with the original M.I.T. software.
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * M.I.T. makes no representations about the suitability of
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * this software for any purpose. It is provided "as is" without express
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * or implied warranty.
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/*
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * This code was based on code donated to MIT by Novell for
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * distribution under the MIT license.
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/*
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * Include files
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#include <stdio.h>
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#include <string.h>
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#include <k5-int.h>
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#include <osconf.h>
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#include "kdb5.h"
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#include <assert.h>
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#include "k5-platform.h"
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#include <libintl.h>
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/* Currently DB2 policy related errors are exported from DAL. But
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf other databases should set_err function to return string. */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#include "adb_err.h"
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/*
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * Type definitions
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#define KRB5_TL_DB_ARGS 0x7fff
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/*
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * internal static variable
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic k5_mutex_t db_lock = K5_MUTEX_PARTIAL_INITIALIZER;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#ifdef _KDB5_STATIC_LINK
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#undef _KDB5_DYNAMIC_LINK
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#else
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#undef _KDB5_DYNAMIC_LINK
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/* to avoid redefinition problem */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#define _KDB5_DYNAMIC_LINK
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#endif
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic db_library lib_list;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/*
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * Helper Functions
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfMAKE_INIT_FUNCTION(kdb_init_lock_list);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfMAKE_FINI_FUNCTION(kdb_fini_lock_list);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfint
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkdb_init_lock_list(void)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return k5_mutex_finish_init(&db_lock);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic int
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkdb_lock_list()
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf int err;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf err = CALL_INIT_FUNCTION (kdb_init_lock_list);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (err)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return err;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return k5_mutex_lock(&db_lock);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfvoid
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkdb_fini_lock_list(void)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (INITIALIZER_RAN(kdb_init_lock_list))
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf k5_mutex_destroy(&db_lock);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic int
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkdb_unlock_list()
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return k5_mutex_unlock(&db_lock);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#define kdb_init_lib_lock(a) 0
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#define kdb_destroy_lib_lock(a) (void)0
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#define kdb_lock_lib_lock(a, b) 0
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#define kdb_unlock_lib_lock(a, b) (void)0
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/* Caller must free result*/
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic char *
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkdb_get_conf_section(krb5_context kcontext)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *result = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *value = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->default_realm == NULL)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* The profile has to have been initialized. If the profile was
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf not initialized, expect nothing less than a crash. */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = profile_get_string(kcontext->profile,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* realms */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf KDB_REALM_SECTION,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kcontext->default_realm,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* under the realm name, database_module */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf KDB_MODULE_POINTER,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* default value is the realm name itself */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kcontext->default_realm,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf &value);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* some problem */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf result = strdup(kcontext->default_realm);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* let NULL be handled by the caller */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf } else {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf result = strdup(value);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* free profile string */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf profile_release_string(value);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return result;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic char *
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkdb_get_library_name(krb5_context kcontext)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *result = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *value = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *lib = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = profile_get_string(kcontext->profile,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* realms */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf KDB_REALM_SECTION,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kcontext->default_realm,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* under the realm name, database_module */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf KDB_MODULE_POINTER,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* default value is the realm name itself */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kcontext->default_realm,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf &value);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#define DB2_NAME "db2"
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* we got the module section. Get the library name from the module */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = profile_get_string(kcontext->profile, KDB_MODULE_SECTION, value,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf KDB_LIB_POINTER,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* default to db2 */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf DB2_NAME,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf &lib);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf result = strdup(lib);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (value) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* free profile string */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf profile_release_string(value);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (lib) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* free profile string */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf profile_release_string(lib);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return result;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic void
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkdb_setup_opt_functions(db_library lib)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (lib->vftabl.set_master_key == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib->vftabl.set_master_key = kdb_def_set_mkey;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (lib->vftabl.get_master_key == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib->vftabl.get_master_key = kdb_def_get_mkey;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (lib->vftabl.fetch_master_key == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib->vftabl.fetch_master_key = krb5_db_def_fetch_mkey;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (lib->vftabl.verify_master_key == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib->vftabl.verify_master_key = krb5_def_verify_master_key;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (lib->vftabl.dbe_search_enctype == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib->vftabl.dbe_search_enctype = krb5_dbe_def_search_enctype;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (lib->vftabl.db_change_pwd == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib->vftabl.db_change_pwd = krb5_dbe_def_cpw;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (lib->vftabl.store_master_key == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib->vftabl.store_master_key = krb5_def_store_mkey;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (lib->vftabl.promote_db == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib->vftabl.promote_db = krb5_def_promote_db;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic int kdb_db2_pol_err_loaded = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#ifdef _KDB5_STATIC_LINK
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#define DEF_SYMBOL(a) extern kdb_vftabl krb5_db_vftabl_ ## a
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#define GET_SYMBOL(a) (krb5_db_vftabl_ ## a)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic krb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkdb_load_library(krb5_context kcontext, char *lib_name, db_library * lib)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf void *vftabl_addr = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char buf[KRB5_MAX_ERR_STR];
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (!strcmp("kdb_db2", lib_name) && (kdb_db2_pol_err_loaded == 0)) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf initialize_adb_error_table();
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_db2_pol_err_loaded = 1;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf *lib = calloc((size_t) 1, sizeof(**lib));
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (*lib == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = ENOMEM;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_init_lib_lock(*lib);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf strcpy((*lib)->name, lib_name);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#if !defined(KDB5_USE_LIB_KDB_DB2) && !defined(KDB5_USE_LIB_TEST)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#error No database module defined
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#endif
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#ifdef KDB5_USE_LIB_KDB_DB2
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (strcmp(lib_name, "kdb_db2") == 0) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf DEF_SYMBOL(kdb_db2);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf vftabl_addr = (void *) &GET_SYMBOL(kdb_db2);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf } else
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#endif
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#ifdef KDB5_USE_LIB_TEST
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (strcmp(lib_name, "test") == 0) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf DEF_SYMBOL(test);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf vftabl_addr = (void *) &GET_SYMBOL(test);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf } else
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#endif
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf snprintf(buf, sizeof(buf), gettext("Program not built to support %s database type\n"),
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib_name);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = KRB5_KDB_DBTYPE_NOSUP;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_set_err(kcontext, krb5_err_have_str, status, buf);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf memcpy(&(*lib)->vftabl, vftabl_addr, sizeof(kdb_vftabl));
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_setup_opt_functions(*lib);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((status = (*lib)->vftabl.init_library())) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* ERROR. library not initialized cleanly */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf snprintf(buf, sizeof(buf), gettext("%s library initialization failed, error code %ld\n"),
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib_name, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = KRB5_KDB_DBTYPE_INIT;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_set_err(kcontext, krb5_err_have_str, status, buf);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(*lib), *lib = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#else /* KDB5_STATIC_LINK*/
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic char *db_dl_location[] = DEFAULT_KDB_LIB_PATH;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#define db_dl_n_locations (sizeof(db_dl_location) / sizeof(db_dl_location[0]))
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic krb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkdb_load_library(krb5_context kcontext, char *lib_name, db_library * lib)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf int ndx;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf void **vftabl_addrs = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* N.B.: If this is "const" but not "static", the Solaris 10
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf native compiler has trouble building the library because of
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf absolute relocations needed in read-only section ".rodata".
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf When it's static, it goes into ".picdata", which is
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf read-write. */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf static const char *const dbpath_names[] = {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf KDB_MODULE_SECTION, "db_module_dir", NULL,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf };
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf const char *filebases[2];
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char **profpath = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char **path = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf filebases[0] = lib_name;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf filebases[1] = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (!strcmp(DB2_NAME, lib_name) && (kdb_db2_pol_err_loaded == 0)) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf initialize_adb_error_table();
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_db2_pol_err_loaded = 1;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf *lib = calloc((size_t) 1, sizeof(**lib));
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (*lib == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = ENOMEM;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_init_lib_lock(*lib);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf strcpy((*lib)->name, lib_name);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* Fetch the list of directories specified in the config
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf file(s) first. */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = profile_get_values(kcontext->profile, dbpath_names, &profpath);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status != 0 && status != PROF_NO_RELATION)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf ndx = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (profpath)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf while (profpath[ndx] != NULL)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf ndx++;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf path = calloc(ndx + db_dl_n_locations, sizeof (char *));
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (path == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = errno;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (ndx)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf memcpy(path, profpath, ndx * sizeof(profpath[0]));
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf memcpy(path + ndx, db_dl_location, db_dl_n_locations * sizeof(char *));
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((status = krb5int_open_plugin_dirs ((const char **) path,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf filebases,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf &(*lib)->dl_dir_handle, &kcontext->err))) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf const char *err_str = krb5_get_error_message(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = KRB5_KDB_DBTYPE_NOTFOUND;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_set_error_message (kcontext, status,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf gettext("Unable to find requested database type: %s"), err_str);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_free_error_message (kcontext, err_str);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((status = krb5int_get_plugin_dir_data (&(*lib)->dl_dir_handle, "kdb_function_table",
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf &vftabl_addrs, &kcontext->err))) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf const char *err_str = krb5_get_error_message(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = KRB5_KDB_DBTYPE_INIT;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_set_error_message (kcontext, status,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf gettext("plugin symbol 'kdb_function_table' lookup failed: %s"), err_str);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_free_error_message (kcontext, err_str);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (vftabl_addrs[0] == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* No plugins! */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = KRB5_KDB_DBTYPE_NOTFOUND;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_set_error_message (kcontext, status,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf gettext("Unable to load requested database module '%s': plugin symbol 'kdb_function_table' not found"),
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib_name);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf memcpy(&(*lib)->vftabl, vftabl_addrs[0], sizeof(kdb_vftabl));
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_setup_opt_functions(*lib);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((status = (*lib)->vftabl.init_library())) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* ERROR. library not initialized cleanly */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfclean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (vftabl_addrs != NULL) { krb5int_free_plugin_dir_data (vftabl_addrs); }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* Both of these DTRT with NULL. */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf profile_free_list(profpath);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(path);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (*lib) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_destroy_lib_lock(*lib);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (PLUGIN_DIR_OPEN((&(*lib)->dl_dir_handle))) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5int_close_plugin_dirs (&(*lib)->dl_dir_handle);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(*lib);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf *lib = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#endif /* end of _KDB5_STATIC_LINK */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic krb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkdb_find_library(krb5_context kcontext, char *lib_name, db_library * lib)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* lock here so that no two threads try to do the same at the same time */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf int locked = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf db_library curr_elt, prev_elt = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((status = kdb_lock_list()) != 0) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf locked = 1;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf curr_elt = lib_list;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf while (curr_elt != NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (strcmp(lib_name, curr_elt->name) == 0) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf *lib = curr_elt;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf prev_elt = curr_elt;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf curr_elt = curr_elt->next;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* module not found. create and add to list */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_load_library(kcontext, lib_name, lib);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (prev_elt) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* prev_elt points to the last element in the list */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf prev_elt->next = *lib;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf (*lib)->prev = prev_elt;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf } else {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib_list = *lib;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (*lib) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf (*lib)->reference_cnt++;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (locked) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf (void)kdb_unlock_list();
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic krb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkdb_free_library(db_library lib)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf int locked = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((status = kdb_lock_list()) != 0) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf locked = 1;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib->reference_cnt--;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (lib->reference_cnt == 0) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = lib->vftabl.fini_library();
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* close the library */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (PLUGIN_DIR_OPEN((&lib->dl_dir_handle))) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5int_close_plugin_dirs (&lib->dl_dir_handle);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_destroy_lib_lock(lib);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (lib->prev == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* first element in the list */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib_list = lib->next;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf } else {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib->prev->next = lib->next;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (lib->next) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib->next->prev = lib->prev;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(lib);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (locked) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf (void)kdb_unlock_list();
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic krb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkdb_setup_lib_handle(krb5_context kcontext)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *library = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf db_library lib = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = calloc((size_t) 1, sizeof(kdb5_dal_handle));
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (dal_handle == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = ENOMEM;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf library = kdb_get_library_name(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (library == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = KRB5_KDB_DBTYPE_NOTFOUND;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_find_library(kcontext, library, &lib);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle = lib;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kcontext->db_context = (void *) dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(library);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(dal_handle);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (lib) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf (void)kdb_free_library(lib);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic krb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkdb_free_lib_handle(krb5_context kcontext)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_free_library(((kdb5_dal_handle *) kcontext->db_context)->
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf lib_handle);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(kcontext->db_context);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kcontext->db_context = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic void
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfget_errmsg (krb5_context kcontext, krb5_error_code err_code)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf const char *e;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (err_code == 0)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf assert(kcontext != NULL);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* Must be called with dal_handle->lib_handle locked! */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf assert(kcontext->db_context != NULL);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (dal_handle->lib_handle->vftabl.errcode_2_string == NULL)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf e = dal_handle->lib_handle->vftabl.errcode_2_string(kcontext, err_code);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf assert (e != NULL);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_set_error_message(kcontext, err_code, "%s", e);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (dal_handle->lib_handle->vftabl.release_errcode_string)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.release_errcode_string(kcontext, e);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/*
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * External functions... DAL API
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_open(krb5_context kcontext, char **db_args, int mode)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *section = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf section = kdb_get_conf_section(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (section == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = KRB5_KDB_SERVER_INTERNAL_ERR;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_set_error_message (kcontext, status,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf gettext("unable to determine configuration section for realm %s\n"),
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kcontext->default_realm ? kcontext->default_realm : "[UNSET]");
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
7c64d3750da7fda7e450b8f9b0b963905ded6379mp /* Solaris Kerberos */
7c64d3750da7fda7e450b8f9b0b963905ded6379mp kdb_free_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.init_module(kcontext, section, db_args,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf mode);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
7c64d3750da7fda7e450b8f9b0b963905ded6379mp /* Solaris Kerberos */
7c64d3750da7fda7e450b8f9b0b963905ded6379mp if (status)
7c64d3750da7fda7e450b8f9b0b963905ded6379mp kdb_free_lib_handle(kcontext);
7c64d3750da7fda7e450b8f9b0b963905ded6379mp
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (section)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(section);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_inited(krb5_context kcontext)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return !(kcontext && kcontext->db_context &&
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf ((kdb5_dal_handle *) kcontext->db_context)->db_context);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_create(krb5_context kcontext, char **db_args)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *section = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf section = kdb_get_conf_section(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (section == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = KRB5_KDB_SERVER_INTERNAL_ERR;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_set_error_message (kcontext, status,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf gettext("unable to determine configuration section for realm %s\n"),
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kcontext->default_realm);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.db_create(kcontext, section, db_args);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (section)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(section);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_fini(krb5_context kcontext)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* module not loaded. So nothing to be done */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.fini_module(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_free_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_destroy(krb5_context kcontext, char **db_args)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *section = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf section = kdb_get_conf_section(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (section == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = KRB5_KDB_SERVER_INTERNAL_ERR;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_set_error_message (kcontext, status,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf gettext("unable to determine configuration section for realm %s\n"),
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kcontext->default_realm);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.db_destroy(kcontext, section, db_args);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (section)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(section);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_get_age(krb5_context kcontext, char *db_name, time_t * t)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.db_get_age(kcontext, db_name, t);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_set_option(krb5_context kcontext, int option, void *value)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.db_set_option(kcontext, option, value);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_lock(krb5_context kcontext, int lock_mode)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* acquire an exclusive lock, ensures no other thread uses this context */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, TRUE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.db_lock(kcontext, lock_mode);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* exclusive lock is still held, so no other thread could use this context */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_unlock(krb5_context kcontext)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* normal lock acquired and exclusive lock released */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.db_unlock(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, TRUE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_get_principal(krb5_context kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_const_principal search_for,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_entry * entries,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf int *nentries, krb5_boolean * more)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.db_get_principal(kcontext, search_for,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf entries, nentries,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf more);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_get_principal_nolock(krb5_context kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_const_principal search_for,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_entry * entries,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf int *nentries, krb5_boolean * more)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.db_get_principal_nolock(kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf search_for,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf entries, nentries,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf more);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_free_principal(krb5_context kcontext, krb5_db_entry * entry, int count)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.db_free_principal(kcontext, entry,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf count);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_put_principal(krb5_context kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_entry * entries, int *nentries)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char **db_args = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_tl_data *prev, *curr, *next;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf int db_args_size = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* Giving db_args as part of tl data causes, db2 to store the
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tl_data as such. To prevent this, tl_data is collated and
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf passed as a sepearte argument. Currently supports only one
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf principal. but passing it as a seperate argument makes it
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf difficult for kadmin remote to pass arguments to server. */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf prev = NULL, curr = entries->tl_data;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf while (curr) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (curr->tl_data_type == KRB5_TL_DB_ARGS) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char **t;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* Since this is expected to be NULL terminated string and
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf this could come from any client, do a check before
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf passing it to db. */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (((char *) curr->tl_data_contents)[curr->tl_data_length - 1] !=
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf '\0') {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* not null terminated. Dangerous input */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = EINVAL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf db_args_size++;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf t = realloc(db_args, sizeof(char *) * (db_args_size + 1)); /* 1 for NULL */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (t == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = ENOMEM;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf db_args = t;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf db_args[db_args_size - 1] = (char *) curr->tl_data_contents;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf db_args[db_args_size] = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf next = curr->tl_data_next;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (prev == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* current node is the first in the linked list. remove it */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf entries->tl_data = curr->tl_data_next;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf } else {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf prev->tl_data_next = curr->tl_data_next;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf entries->n_tl_data--;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_free(kcontext, curr);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* previous does not change */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf curr = next;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf } else {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf prev = curr;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf curr = curr->tl_data_next;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.db_put_principal(kcontext, entries,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf nentries,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf db_args);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf while (db_args_size) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (db_args[db_args_size - 1])
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_free(kcontext, db_args[db_args_size - 1]);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf db_args_size--;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (db_args)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(db_args);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_delete_principal(krb5_context kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_principal search_for, int *nentries)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.db_delete_principal(kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf search_for,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf nentries);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_iterate(krb5_context kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *match_entry,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf int (*func) (krb5_pointer, krb5_db_entry *),
2dd2efa5a06a9befe46075cf41e16f57533c9f98willf krb5_pointer func_arg,
2dd2efa5a06a9befe46075cf41e16f57533c9f98willf /* Solaris Kerberos: adding support for db_args */
2dd2efa5a06a9befe46075cf41e16f57533c9f98willf char **db_args)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
2dd2efa5a06a9befe46075cf41e16f57533c9f98willf /* Solaris Kerberos: adding support for db_args */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.db_iterate(kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf match_entry,
2dd2efa5a06a9befe46075cf41e16f57533c9f98willf func, func_arg,
2dd2efa5a06a9befe46075cf41e16f57533c9f98willf db_args);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_supported_realms(krb5_context kcontext, char **realms)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.db_supported_realms(kcontext, realms);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_free_supported_realms(krb5_context kcontext, char **realms)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.db_free_supported_realms(kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf realms);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_set_master_key_ext(krb5_context kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *pwd, krb5_keyblock * key)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.set_master_key(kcontext, pwd, key);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_set_mkey(krb5_context context, krb5_keyblock * key)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return krb5_db_set_master_key_ext(context, NULL, key);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_get_mkey(krb5_context kcontext, krb5_keyblock ** key)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* Lets use temp key and copy it later to avoid memory problems
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf when freed by the caller. */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.get_master_key(kcontext, key);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_store_master_key(krb5_context kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *db_arg,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_principal mname,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_keyblock * key, char *master_pwd)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.store_master_key(kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf db_arg,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf mname,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf key, master_pwd);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfchar *krb5_mkey_pwd_prompt1 = KRB5_KDC_MKEY_1;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfchar *krb5_mkey_pwd_prompt2 = KRB5_KDC_MKEY_2;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_fetch_mkey(krb5_context context,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_principal mname,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_enctype etype,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_boolean fromkeyboard,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_boolean twice,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *db_args, krb5_data * salt, krb5_keyblock * key)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code retval;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char password[BUFSIZ];
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_data pwd;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf unsigned int size = sizeof(password);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf int kvno;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_keyblock tmp_key;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf memset(&tmp_key, 0, sizeof(tmp_key));
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (fromkeyboard) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_data scratch;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((retval = krb5_read_password(context, krb5_mkey_pwd_prompt1,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf twice ? krb5_mkey_pwd_prompt2 : 0,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf password, &size))) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf pwd.data = password;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf pwd.length = size;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (!salt) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf retval = krb5_principal2salt(context, mname, &scratch);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (retval)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf retval =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_c_string_to_key(context, etype, &pwd, salt ? salt : &scratch,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf key);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (!salt)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_xfree(scratch.data);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf memset(password, 0, sizeof(password)); /* erase it */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf } else {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (context->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf retval = kdb_setup_lib_handle(context);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (retval) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) context->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf retval = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (retval) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#if 0 /************** Begin IFDEF'ed OUT *******************************/
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* Orig MIT */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tmp_key.enctype = key->enctype;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#else
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* Solaris Kerberos: need to use etype */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tmp_key.enctype = etype;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#endif /**************** END IFDEF'ed OUT *******************************/
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf retval = dal_handle->lib_handle->vftabl.fetch_master_key(context,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf mname,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf &tmp_key,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf &kvno,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf db_args);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(context, retval);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (retval) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf key->contents = malloc(tmp_key.length);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (key->contents == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf retval = ENOMEM;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf key->magic = tmp_key.magic;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf key->enctype = tmp_key.enctype;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf key->length = tmp_key.length;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf memcpy(key->contents, tmp_key.contents, tmp_key.length);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (tmp_key.contents) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf memset(tmp_key.contents, 0, tmp_key.length);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_free(context, tmp_key.contents);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return retval;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_verify_master_key(krb5_context kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_principal mprinc, krb5_keyblock * mkey)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.verify_master_key(kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf mprinc, mkey);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfvoid *
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_alloc(krb5_context kcontext, void *ptr, size_t size)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf void *new_ptr = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf new_ptr = dal_handle->lib_handle->vftabl.db_alloc(kcontext, ptr, size);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return new_ptr;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfvoid
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_free(krb5_context kcontext, void *ptr)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.db_free(kcontext, ptr);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/* has to be modified */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_dbe_find_enctype(krb5_context kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_entry * dbentp,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_int32 ktype,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_int32 stype,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_int32 kvno, krb5_key_data ** kdatap)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_int32 start = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return krb5_dbe_search_enctype(kcontext, dbentp, &start, ktype, stype,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kvno, kdatap);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_dbe_search_enctype(krb5_context kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_entry * dbentp,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_int32 * start,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_int32 ktype,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_int32 stype,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_int32 kvno, krb5_key_data ** kdatap)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.dbe_search_enctype(kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dbentp,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf start,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf ktype,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf stype,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kvno, kdatap);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#define REALM_SEP_STRING "@"
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_setup_mkey_name(krb5_context context,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf const char *keyname,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf const char *realm,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char **fullname, krb5_principal * principal)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code retval;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf size_t keylen;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf size_t rlen = strlen(realm);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *fname;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (!keyname)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf keyname = KRB5_KDB_M_NAME; /* XXX external? */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf keylen = strlen(keyname);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf fname = malloc(keylen + rlen + strlen(REALM_SEP_STRING) + 1);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (!fname)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return ENOMEM;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf strcpy(fname, keyname);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf (void)strcat(fname, REALM_SEP_STRING);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf (void)strcat(fname, realm);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((retval = krb5_parse_name(context, fname, principal)))
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return retval;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (fullname)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf *fullname = fname;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf else
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(fname);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_dbe_lookup_last_pwd_change(context, entry, stamp)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_context context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_entry *entry;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_timestamp *stamp;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_tl_data tl_data;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code code;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_int32 tmp;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tl_data.tl_data_type = KRB5_TL_LAST_PWD_CHANGE;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((code = krb5_dbe_lookup_tl_data(context, entry, &tl_data)))
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (code);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (tl_data.tl_data_length != 4) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf *stamp = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (0);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_kdb_decode_int32(tl_data.tl_data_contents, tmp);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf *stamp = (krb5_timestamp) tmp;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (0);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/*ARGSUSED*/
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_dbe_lookup_tl_data(context, entry, ret_tl_data)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_context context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_entry *entry;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_tl_data *ret_tl_data;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_tl_data *tl_data;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf for (tl_data = entry->tl_data; tl_data; tl_data = tl_data->tl_data_next) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (tl_data->tl_data_type == ret_tl_data->tl_data_type) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf *ret_tl_data = *tl_data;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (0);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* if the requested record isn't found, return zero bytes.
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * if it ever means something to have a zero-length tl_data,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * this code and its callers will have to be changed */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf ret_tl_data->tl_data_length = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf ret_tl_data->tl_data_contents = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (0);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_dbe_create_key_data(context, entry)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_context context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_entry *entry;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((entry->key_data =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf (krb5_key_data *) krb5_db_alloc(context, entry->key_data,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf (sizeof(krb5_key_data) *
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf (entry->n_key_data + 1)))) == NULL)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (ENOMEM);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf memset(entry->key_data + entry->n_key_data, 0, sizeof(krb5_key_data));
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf entry->n_key_data++;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_dbe_update_mod_princ_data(context, entry, mod_date, mod_princ)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_context context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_entry *entry;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_timestamp mod_date;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_const_principal mod_princ;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_tl_data tl_data;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code retval = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_octet *nextloc = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *unparse_mod_princ = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf unsigned int unparse_mod_princ_size;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((retval = krb5_unparse_name(context, mod_princ, &unparse_mod_princ)))
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (retval);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf unparse_mod_princ_size = strlen(unparse_mod_princ) + 1;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((nextloc = (krb5_octet *) malloc(unparse_mod_princ_size + 4))
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(unparse_mod_princ);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (ENOMEM);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tl_data.tl_data_type = KRB5_TL_MOD_PRINC;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tl_data.tl_data_length = unparse_mod_princ_size + 4;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tl_data.tl_data_contents = nextloc;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* Mod Date */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_kdb_encode_int32(mod_date, nextloc);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* Mod Princ */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf memcpy(nextloc + 4, unparse_mod_princ, unparse_mod_princ_size);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf retval = krb5_dbe_update_tl_data(context, entry, &tl_data);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(unparse_mod_princ);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(nextloc);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (retval);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_dbe_lookup_mod_princ_data(context, entry, mod_time, mod_princ)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_context context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_entry *entry;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_timestamp *mod_time;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_principal *mod_princ;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_tl_data tl_data;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code code;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tl_data.tl_data_type = KRB5_TL_MOD_PRINC;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((code = krb5_dbe_lookup_tl_data(context, entry, &tl_data)))
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (code);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((tl_data.tl_data_length < 5) ||
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf (tl_data.tl_data_contents[tl_data.tl_data_length - 1] != '\0'))
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (KRB5_KDB_TRUNCATED_RECORD);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* Mod Date */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_kdb_decode_int32(tl_data.tl_data_contents, *mod_time);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* Mod Princ */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((code = krb5_parse_name(context,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf (const char *) (tl_data.tl_data_contents + 4),
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf mod_princ)))
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (code);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (0);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_dbe_update_last_pwd_change(context, entry, stamp)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_context context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_entry *entry;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_timestamp stamp;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_tl_data tl_data;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_octet buf[4]; /* this is the encoded size of an int32 */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tl_data.tl_data_type = KRB5_TL_LAST_PWD_CHANGE;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tl_data.tl_data_length = sizeof(buf);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_kdb_encode_int32((krb5_int32) stamp, buf);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tl_data.tl_data_contents = buf;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (krb5_dbe_update_tl_data(context, entry, &tl_data));
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_dbe_update_tl_data(context, entry, new_tl_data)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_context context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_entry *entry;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_tl_data *new_tl_data;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_tl_data *tl_data = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_octet *tmp;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* copy the new data first, so we can fail cleanly if malloc()
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * fails */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((tmp =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf (krb5_octet *) krb5_db_alloc(context, NULL,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf new_tl_data->tl_data_length)) == NULL)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (ENOMEM);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* Find an existing entry of the specified type and point at
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * it, or NULL if not found */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (new_tl_data->tl_data_type != KRB5_TL_DB_ARGS) { /* db_args can be multiple */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf for (tl_data = entry->tl_data; tl_data;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tl_data = tl_data->tl_data_next)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (tl_data->tl_data_type == new_tl_data->tl_data_type)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf break;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* if necessary, chain a new record in the beginning and point at it */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (!tl_data) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if ((tl_data =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf (krb5_tl_data *) krb5_db_alloc(context, NULL,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf sizeof(krb5_tl_data)))
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(tmp);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (ENOMEM);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf memset(tl_data, 0, sizeof(krb5_tl_data));
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tl_data->tl_data_next = entry->tl_data;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf entry->tl_data = tl_data;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf entry->n_tl_data++;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* fill in the record */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (tl_data->tl_data_contents)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_db_free(context, tl_data->tl_data_contents);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tl_data->tl_data_type = new_tl_data->tl_data_type;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tl_data->tl_data_length = new_tl_data->tl_data_length;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf tl_data->tl_data_contents = tmp;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf memcpy(tmp, new_tl_data->tl_data_contents, tl_data->tl_data_length);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return (0);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/* change password functions */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_dbe_cpw(krb5_context kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_keyblock * master_key,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_key_salt_tuple * ks_tuple,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf int ks_tuple_count,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *passwd,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf int new_kvno, krb5_boolean keepold, krb5_db_entry * db_entry)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.db_change_pwd(kcontext,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf master_key,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf ks_tuple,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf ks_tuple_count,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf passwd,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf new_kvno,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf keepold, db_entry);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/* policy management functions */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_create_policy(krb5_context kcontext, osa_policy_ent_t policy)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.db_create_policy(kcontext, policy);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_get_policy(krb5_context kcontext, char *name,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf osa_policy_ent_t * policy, int *cnt)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.db_get_policy(kcontext, name, policy,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf cnt);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_put_policy(krb5_context kcontext, osa_policy_ent_t policy)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.db_put_policy(kcontext, policy);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_iter_policy(krb5_context kcontext, char *match_entry,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf osa_adb_iter_policy_func func, void *data)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.db_iter_policy(kcontext, match_entry,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf func, data);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_delete_policy(krb5_context kcontext, char *policy)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = dal_handle->lib_handle->vftabl.db_delete_policy(kcontext, policy);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfvoid
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_free_policy(krb5_context kcontext, osa_policy_ent_t policy)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.db_free_policy(kcontext, policy);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_promote(krb5_context kcontext, char **db_args)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf char *section = NULL;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf section = kdb_get_conf_section(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (section == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = KRB5_KDB_SERVER_INTERNAL_ERR;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_set_error_message (kcontext, status,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf gettext("unable to determine configuration section for realm %s\n"),
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kcontext->default_realm);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status =
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle->lib_handle->vftabl.promote_db(kcontext, section, db_args);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf get_errmsg(kcontext, status);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (section)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf free(section);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/*
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * Solaris Kerberos: support for iprop
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf *
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * Not all KDB plugins support iprop.
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf *
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf * sets iprop_supported to 1 if iprop supportd, 0 otherwise.
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_error_code
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5_db_supports_iprop(krb5_context kcontext, int *iprop_supported)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf{
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5_error_code status = 0;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb5_dal_handle *dal_handle;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (kcontext->db_context == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_setup_lib_handle(kcontext);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf dal_handle = (kdb5_dal_handle *) kcontext->db_context;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (status) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf goto clean_n_exit;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf }
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf *iprop_supported = dal_handle->lib_handle->vftabl.iprop_supported;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf clean_n_exit:
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return status;
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf}