Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 :
4 : KDC Server startup
5 :
6 : Copyright (C) Andrew Bartlett <abartlet@samba.org> 2005-20011
7 :
8 : This program is free software; you can redistribute it and/or modify
9 : it under the terms of the GNU General Public License as published by
10 : the Free Software Foundation; either version 3 of the License, or
11 : (at your option) any later version.
12 :
13 : This program is distributed in the hope that it will be useful,
14 : but WITHOUT ANY WARRANTY; without even the implied warranty of
15 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 : GNU General Public License for more details.
17 :
18 : You should have received a copy of the GNU General Public License
19 : along with this program. If not, see <http://www.gnu.org/licenses/>.
20 : */
21 :
22 : #include "includes.h"
23 : #include "kdc/kdc-glue.h"
24 : #include "lib/param/param.h"
25 :
26 32 : static krb5_error_code hdb_samba4_create(krb5_context context, struct HDB **db, const char *arg)
27 : {
28 : NTSTATUS nt_status;
29 32 : void *ptr = NULL;
30 32 : struct samba_kdc_base_context *base_ctx = NULL;
31 :
32 32 : if (sscanf(arg, "&%p", &ptr) != 1) {
33 0 : return EINVAL;
34 : }
35 :
36 32 : base_ctx = talloc_get_type_abort(ptr, struct samba_kdc_base_context);
37 :
38 : /* The global kdc_mem_ctx and kdc_lp_ctx, Disgusting, ugly hack, but it means one less private hook */
39 32 : nt_status = hdb_samba4_kpasswd_create_kdc(base_ctx, context, db);
40 :
41 32 : if (NT_STATUS_IS_OK(nt_status)) {
42 32 : return 0;
43 0 : } else if (NT_STATUS_EQUAL(nt_status, NT_STATUS_ERROR_DS_INCOMPATIBLE_VERSION)) {
44 0 : return EINVAL;
45 0 : } else if (NT_STATUS_EQUAL(nt_status, NT_STATUS_CANT_ACCESS_DOMAIN_INFO)) {
46 :
47 0 : krb5_set_error_message(context, EINVAL, "Failed to open Samba4 LDB at %s", lpcfg_private_path(base_ctx, base_ctx->lp_ctx, "sam.ldb"));
48 : } else {
49 0 : krb5_set_error_message(context, EINVAL, "Failed to connect to Samba4 DB: %s (%s)", get_friendly_nt_error_msg(nt_status), nt_errstr(nt_status));
50 : }
51 :
52 0 : return EINVAL;
53 : }
54 :
55 : #if (HDB_INTERFACE_VERSION != 11)
56 : #error "Unsupported Heimdal HDB version"
57 : #endif
58 :
59 : #if HDB_INTERFACE_VERSION >= 8
60 71 : static krb5_error_code hdb_samba4_init(krb5_context context, void **ctx)
61 : {
62 71 : *ctx = NULL;
63 71 : return 0;
64 : }
65 :
66 0 : static void hdb_samba4_fini(void *ctx)
67 : {
68 0 : }
69 : #endif
70 :
71 : /* Only used in the hdb-backed keytab code
72 : * for a keytab of 'samba4&<address>' or samba4, to find
73 : * kpasswd's key in the main DB
74 : *
75 : * The <address> is the string form of a pointer to a talloced struct hdb_samba_context
76 : */
77 : struct hdb_method hdb_samba4_interface = {
78 : HDB_INTERFACE_VERSION,
79 : #if HDB_INTERFACE_VERSION >= 8
80 : .init = hdb_samba4_init,
81 : .fini = hdb_samba4_fini,
82 : #endif
83 : .prefix = "samba4",
84 : .create = hdb_samba4_create
85 : };
|