3 * Kerberos routines for registration server
5 * Copyright (C) 1998 by the Massachusetts Institute of Technology
6 * For copying and distribution information, please see the file
11 #include <mit-copyright.h>
15 #if !defined(KRB4) && !defined(KRB5)
24 #define KRB5_DEPRECATED 1
25 #define KRB5_PRIVATE 1
35 #include <kadm5/admin.h>
44 extern char *hostname, *shorthostname;
47 long init_kerberos(void)
51 /* Initialize Kerberos stuff. */
52 code = krb5_init_context(&context);
55 krb_set_tkt_string("/tmp/tkt_ureg");
59 /* Check the kerberos database to see if a principal exists */
60 long check_kerberos(char *username)
66 #ifdef KERBEROS_TEST_REALM
69 sprintf(ubuf, "%s@%s", username, KERBEROS_TEST_REALM);
73 memset(&creds, 0, sizeof(creds));
74 code = krb5_parse_name(context, username, &creds.client);
78 realm = krb5_princ_realm(context, creds.client);
79 code = krb5_build_principal_ext(context, &creds.server,
80 realm->length, realm->data,
81 KRB5_TGS_NAME_SIZE, KRB5_TGS_NAME,
82 realm->length, realm->data, 0);
86 code = krb5_timeofday(context, &now);
90 creds.times.starttime = 0;
91 creds.times.endtime = now + 60;
93 code = krb5_get_in_tkt_with_password(context,
97 NULL /* pre_auth_types */,
101 NULL /* ret_as_reply */);
104 krb5_free_principal(context, creds.client);
105 krb5_free_principal(context, creds.server);
107 if (code == KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN)
113 /* Create a new principal in Kerberos */
114 long register_kerberos(char *username, char *password)
116 void *kadm_server_handle = NULL;
118 kadm5_principal_ent_rec princ;
119 kadm5_config_params realm_params;
120 char admin_princ[256];
121 #ifdef KERBEROS_TEST_REALM
124 sprintf(admin_princ, "moira/%s@%s", hostname, KERBEROS_TEST_REALM);
125 sprintf(ubuf, "%s@%s", username, KERBEROS_TEST_REALM);
127 realm_params.realm = KERBEROS_TEST_REALM;
128 realm_params.mask = KADM5_CONFIG_REALM;
130 strcpy(admin_princ, REG_SVR_PRINCIPAL);
131 realm_params.mask = 0;
134 status = krb5_parse_name(context, username, &(princ.principal));
139 status = kadm5_init_with_skey(admin_princ, NULL, KADM5_ADMIN_SERVICE,
140 &realm_params, KADM5_STRUCT_VERSION,
141 KADM5_API_VERSION_2, &kadm_server_handle);
145 status = kadm5_create_principal(kadm_server_handle, &princ,
146 KADM5_PRINCIPAL, password);
149 krb5_free_principal(context, princ.principal);
150 if (kadm_server_handle)
151 kadm5_destroy(kadm_server_handle);
153 if (status == KADM5_DUP)
155 else if (status == KADM5_PASS_Q_TOOSHORT ||
156 status == KADM5_PASS_Q_CLASS ||
157 status == KADM5_PASS_Q_DICT)
164 char realm[REALM_SZ];
166 long init_kerberos(void)
168 return krb_get_lrealm(realm, 1);
171 long check_kerberos(char *username)
175 status = krb_get_pw_in_tkt(username, "", realm, "krbtgt", realm, 1, "");
176 if (status == KDC_PR_UNKNOWN)
182 long register_kerberos(char *username, char *password)
187 unsigned long *lkey = (unsigned long *)key;
189 if ((status = krb_get_svc_in_tkt(MOIRA_SNAME, shorthostname, realm,
190 PWSERV_NAME, KADM_SINST, 1, KEYFILE)))
193 if ((status = kadm_init_link(PWSERV_NAME, KADM_SINST, realm)) !=
197 memset(&new, 0, sizeof(new));
198 SET_FIELD(KADM_DESKEY, new.fields);
199 SET_FIELD(KADM_NAME, new.fields);
201 des_string_to_key(password, key);
202 new.key_low = htonl(lkey[0]);
203 new.key_high = htonl(lkey[1]);
204 strcpy(new.name, username);
206 status = kadm_add(&new);
207 memset(&new, 0, sizeof(new));
210 if (status == KADM_INUSE)