14960Swillf /*
25916Swillf * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
34960Swillf * Use is subject to license terms.
44960Swillf */
54960Swillf
64960Swillf
74960Swillf /*
84960Swillf * Copyright 2006 by the Massachusetts Institute of Technology.
94960Swillf * All Rights Reserved.
104960Swillf *
114960Swillf * Export of this software from the United States of America may
124960Swillf * require a specific license from the United States Government.
134960Swillf * It is the responsibility of any person or organization contemplating
144960Swillf * export to obtain such a license before exporting.
154960Swillf *
164960Swillf * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
174960Swillf * distribute this software and its documentation for any purpose and
184960Swillf * without fee is hereby granted, provided that the above copyright
194960Swillf * notice appear in all copies and that both that copyright notice and
204960Swillf * this permission notice appear in supporting documentation, and that
214960Swillf * the name of M.I.T. not be used in advertising or publicity pertaining
224960Swillf * to distribution of the software without specific, written prior
234960Swillf * permission. Furthermore if you modify this software you must label
244960Swillf * your software as modified software and not distribute it in such a
254960Swillf * fashion that it might be confused with the original M.I.T. software.
264960Swillf * M.I.T. makes no representations about the suitability of
274960Swillf * this software for any purpose. It is provided "as is" without express
284960Swillf * or implied warranty.
294960Swillf */
304960Swillf
314960Swillf /**********************************************************************
324960Swillf *
334960Swillf * C %name: db2_exp.c %
344960Swillf * Instance: idc_sec_2
354960Swillf * Description:
364960Swillf * %created_by: spradeep %
374960Swillf * %date_created: Tue Apr 5 11:44:00 2005 %
384960Swillf *
394960Swillf **********************************************************************/
404960Swillf #ifndef lint
414960Swillf static char *_csrc = "@(#) %filespec: db2_exp.c~5 % (%full_filespec: db2_exp.c~5:csrc:idc_sec#2 %)";
424960Swillf #endif
434960Swillf
444960Swillf #include "k5-int.h"
454960Swillf
464960Swillf #if HAVE_UNISTD_H
474960Swillf #include <unistd.h>
484960Swillf #endif
494960Swillf
504960Swillf #include <db.h>
514960Swillf #include <stdio.h>
524960Swillf #include <errno.h>
534960Swillf #include <utime.h>
544960Swillf #include <kdb/kdb5.h>
554960Swillf #include "kdb_db2.h"
564960Swillf #include "kdb_xdr.h"
574960Swillf #include "policy_db.h"
584960Swillf
594960Swillf /* Quick and dirty wrapper functions to provide for thread safety
604960Swillf within the plugin, instead of making the kdb5 library do it. Eventually
614960Swillf these should be integrated into the real functions.
624960Swillf
634960Swillf Some of the functions wrapped here are also called directly from
644960Swillf within this library (e.g., create calls open), so simply dropping
654960Swillf locking code into the top and bottom of each referenced function
664960Swillf won't do. (We aren't doing recursive locks, currently.) */
674960Swillf
684960Swillf static k5_mutex_t *krb5_db2_mutex;
694960Swillf
704960Swillf #define WRAP(NAME,TYPE,ARGLIST,ARGNAMES,ERROR_RESULT) \
714960Swillf static TYPE wrap_##NAME ARGLIST \
724960Swillf { \
734960Swillf TYPE result; \
744960Swillf int code = k5_mutex_lock (krb5_db2_mutex); \
754960Swillf if (code) { return ERROR_RESULT; } \
764960Swillf result = NAME ARGNAMES; \
774960Swillf k5_mutex_unlock (krb5_db2_mutex); \
784960Swillf return result; \
794960Swillf } \
804960Swillf /* hack: decl to allow a following ";" */ \
814960Swillf static TYPE wrap_##NAME ()
824960Swillf
834960Swillf /* Two special cases: void (can't assign result), and krb5_error_code
844960Swillf (return error from locking code). */
854960Swillf
864960Swillf #define WRAP_VOID(NAME,ARGLIST,ARGNAMES) \
874960Swillf static void wrap_##NAME ARGLIST \
884960Swillf { \
894960Swillf int code = k5_mutex_lock (krb5_db2_mutex); \
904960Swillf if (code) { return; } \
914960Swillf NAME ARGNAMES; \
924960Swillf k5_mutex_unlock (krb5_db2_mutex); \
934960Swillf } \
944960Swillf /* hack: decl to allow a following ";" */ \
954960Swillf static void wrap_##NAME ()
964960Swillf
974960Swillf #define WRAP_K(NAME,ARGLIST,ARGNAMES) \
984960Swillf WRAP(NAME,krb5_error_code,ARGLIST,ARGNAMES,code)
994960Swillf
1004960Swillf WRAP_K (krb5_db2_open,
1014960Swillf ( krb5_context kcontext,
1024960Swillf char *conf_section,
1034960Swillf char **db_args,
1044960Swillf int mode ),
1054960Swillf (kcontext, conf_section, db_args, mode));
1064960Swillf WRAP_K (krb5_db2_db_fini, (krb5_context ctx), (ctx));
1074960Swillf WRAP_K (krb5_db2_create,
1084960Swillf ( krb5_context kcontext, char *conf_section, char **db_args ),
1094960Swillf (kcontext, conf_section, db_args));
1104960Swillf WRAP_K (krb5_db2_destroy,
1114960Swillf ( krb5_context kcontext, char *conf_section, char **db_args ),
1124960Swillf (kcontext, conf_section, db_args));
1134960Swillf WRAP_K (krb5_db2_db_get_age,
1144960Swillf (krb5_context ctx,
1154960Swillf char *s,
1164960Swillf time_t *t),
1174960Swillf (ctx, s, t));
1184960Swillf WRAP_K (krb5_db2_db_set_option,
1194960Swillf ( krb5_context kcontext,
1204960Swillf int option,
1214960Swillf void *value ),
1224960Swillf (kcontext, option, value));
1234960Swillf
1244960Swillf WRAP_K (krb5_db2_db_lock,
1254960Swillf ( krb5_context context,
1264960Swillf int in_mode),
1274960Swillf (context, in_mode));
1284960Swillf WRAP_K (krb5_db2_db_unlock, (krb5_context ctx), (ctx));
1294960Swillf
1304960Swillf WRAP_K (krb5_db2_db_get_principal,
1314960Swillf (krb5_context ctx,
1324960Swillf krb5_const_principal p,
1334960Swillf krb5_db_entry *d,
1344960Swillf int * i,
1354960Swillf krb5_boolean *b),
1364960Swillf (ctx, p, d, i, b));
1374960Swillf WRAP_K (krb5_db2_db_free_principal,
1384960Swillf (krb5_context ctx,
1394960Swillf krb5_db_entry *d,
1404960Swillf int i),
1414960Swillf (ctx, d, i));
1424960Swillf WRAP_K (krb5_db2_db_put_principal,
1434960Swillf (krb5_context ctx,
1444960Swillf krb5_db_entry *d,
1454960Swillf int *i,
1464960Swillf char **db_args),
1474960Swillf (ctx, d, i, db_args));
1484960Swillf WRAP_K (krb5_db2_db_delete_principal,
1494960Swillf (krb5_context context,
1504960Swillf krb5_const_principal searchfor,
1514960Swillf int *nentries),
1524960Swillf (context, searchfor, nentries));
1534960Swillf
1545916Swillf /* Solaris Kerberos: adding support for db_args */
1554960Swillf WRAP_K (krb5_db2_db_iterate,
1564960Swillf (krb5_context ctx, char *s,
1574960Swillf krb5_error_code (*f) (krb5_pointer,
1584960Swillf krb5_db_entry *),
1595916Swillf krb5_pointer p,
1605916Swillf char **db_args),
1615916Swillf (ctx, s, f, p, db_args));
1624960Swillf
1634960Swillf WRAP_K (krb5_db2_create_policy,
1644960Swillf (krb5_context context, osa_policy_ent_t entry),
1654960Swillf (context, entry));
1664960Swillf WRAP_K (krb5_db2_get_policy,
1674960Swillf ( krb5_context kcontext,
1684960Swillf char *name,
1694960Swillf osa_policy_ent_t *policy,
1704960Swillf int *cnt),
1714960Swillf (kcontext, name, policy, cnt));
1724960Swillf WRAP_K (krb5_db2_put_policy,
1734960Swillf ( krb5_context kcontext, osa_policy_ent_t policy ),
1744960Swillf (kcontext, policy));
1754960Swillf WRAP_K (krb5_db2_iter_policy,
1764960Swillf ( krb5_context kcontext,
1774960Swillf char *match_entry,
1784960Swillf osa_adb_iter_policy_func func,
1794960Swillf void *data ),
1804960Swillf (kcontext, match_entry, func, data));
1814960Swillf WRAP_K (krb5_db2_delete_policy,
1824960Swillf ( krb5_context kcontext, char *policy ),
1834960Swillf (kcontext, policy));
1844960Swillf WRAP_VOID (krb5_db2_free_policy,
1854960Swillf ( krb5_context kcontext, osa_policy_ent_t entry ),
1864960Swillf (kcontext, entry));
1874960Swillf
1884960Swillf WRAP (krb5_db2_alloc, void *,
1894960Swillf ( krb5_context kcontext,
1904960Swillf void *ptr,
1914960Swillf size_t size ),
1924960Swillf (kcontext, ptr, size), NULL);
1934960Swillf WRAP_VOID (krb5_db2_free,
1944960Swillf ( krb5_context kcontext, void *ptr ),
1954960Swillf (kcontext, ptr));
1964960Swillf
1974960Swillf WRAP_K (krb5_db2_set_master_key_ext,
1984960Swillf ( krb5_context kcontext, char *pwd, krb5_keyblock *key),
1994960Swillf (kcontext, pwd, key));
2004960Swillf WRAP_K (krb5_db2_db_get_mkey,
2014960Swillf ( krb5_context context, krb5_keyblock **key),
2024960Swillf (context, key));
2034960Swillf WRAP_K (krb5_db2_promote_db,
2044960Swillf ( krb5_context kcontext, char *conf_section, char **db_args ),
2054960Swillf (kcontext, conf_section, db_args));
2064960Swillf
2074960Swillf static krb5_error_code
hack_init()2084960Swillf hack_init ()
2094960Swillf {
2104960Swillf krb5_error_code c;
2114960Swillf c = krb5int_mutex_alloc (&krb5_db2_mutex);
2124960Swillf if (c)
2134960Swillf return c;
2144960Swillf return krb5_db2_lib_init ();
2154960Swillf }
2164960Swillf
2174960Swillf static krb5_error_code
hack_cleanup(void)2184960Swillf hack_cleanup (void)
2194960Swillf {
2204960Swillf krb5int_mutex_free (krb5_db2_mutex);
2214960Swillf krb5_db2_mutex = NULL;
2224960Swillf return krb5_db2_lib_cleanup();
2234960Swillf }
2244960Swillf
2254960Swillf
2264960Swillf /*
2274960Swillf * Exposed API
2284960Swillf */
2294960Swillf
2304960Swillf kdb_vftabl kdb_function_table = {
2314960Swillf /* major version number 1 */ 1,
2324960Swillf /* minor version number 0 */ 0,
2334960Swillf /* Solaris Kerberos: iprop support */
2344960Swillf /* iprop_supported, yes for db2 */ 1,
2354960Swillf /* init_library */ hack_init,
2364960Swillf /* fini_library */ hack_cleanup,
2374960Swillf /* init_module */ wrap_krb5_db2_open,
2384960Swillf /* fini_module */ wrap_krb5_db2_db_fini,
2394960Swillf /* db_create */ wrap_krb5_db2_create,
2404960Swillf /* db_destroy */ wrap_krb5_db2_destroy,
2414960Swillf /* db_get_age */ wrap_krb5_db2_db_get_age,
2424960Swillf /* db_set_option */ wrap_krb5_db2_db_set_option,
2434960Swillf /* db_lock */ wrap_krb5_db2_db_lock,
2444960Swillf /* db_unlock */ wrap_krb5_db2_db_unlock,
2454960Swillf /* db_get_principal */ wrap_krb5_db2_db_get_principal,
2464960Swillf /* Solaris Kerberos: need a nolock for iprop */
2474960Swillf /* db_get_principal_nolock */ krb5_db2_db_get_principal,
2484960Swillf /* db_free_principal */ wrap_krb5_db2_db_free_principal,
2494960Swillf /* db_put_principal */ wrap_krb5_db2_db_put_principal,
2504960Swillf /* db_delete_principal */ wrap_krb5_db2_db_delete_principal,
2514960Swillf /* db_iterate */ wrap_krb5_db2_db_iterate,
2524960Swillf /* db_create_policy */ wrap_krb5_db2_create_policy,
2534960Swillf /* db_get_policy */ wrap_krb5_db2_get_policy,
2544960Swillf /* db_put_policy */ wrap_krb5_db2_put_policy,
2554960Swillf /* db_iter_policy */ wrap_krb5_db2_iter_policy,
2564960Swillf /* db_delete_policy */ wrap_krb5_db2_delete_policy,
2574960Swillf /* db_free_policy */ wrap_krb5_db2_free_policy,
2584960Swillf /* db_supported_realms */ NULL,
2594960Swillf /* db_free_supported_realms */ NULL,
2606426Smp153739 /* errcode_2_string */ krb5_db2_errcode_2_string,
2616426Smp153739 /* release_errcode_string */ krb5_db2_release_errcode_string,
2624960Swillf /* db_alloc */ wrap_krb5_db2_alloc,
2634960Swillf /* db_free */ wrap_krb5_db2_free,
2644960Swillf /* set_master_key */ wrap_krb5_db2_set_master_key_ext,
2654960Swillf /* get_master_key */ wrap_krb5_db2_db_get_mkey,
266*7934SMark.Phalan@Sun.COM /* blah blah blah */ 0,0,0,0,0,0,
2674960Swillf /* promote_db */ wrap_krb5_db2_promote_db,
2684960Swillf };
269