/*
* Copyright 2000, International Business Machines Corporation and others.
* All Rights Reserved.
- *
+ *
* This software has been released under the terms of the IBM Public
* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
#include <afsconfig.h>
#include <afs/param.h>
-
#include <afs/stds.h>
-#include <sys/types.h>
-#include <rx/xdr.h>
-#ifdef AFS_AIX32_ENV
-#include <signal.h>
-#endif
-#include <string.h>
-#include <errno.h>
+#include <roken.h>
+
+#include <rx/xdr.h>
#include <lock.h>
#include <ubik.h>
-
-#include <stdio.h>
-#include <pwd.h>
#include <afs/com_err.h>
#include <afs/auth.h>
#include <afs/afsutil.h>
#include <afs/cellconfig.h>
-#ifdef AFS_RXK5
-#include "rxk5_utilafs.h"
-#endif
#include <afs/ptclient.h>
#include <afs/cmd.h>
+#include <afs/ptuser.h>
+
#include <krb5.h>
#ifdef HAVE_KRB5_CREDS_KEYBLOCK
afs_int32 code;
#ifdef AFS_AIX32_ENV
/*
- * The following signal action for AIX is necessary so that in case of a
- * crash (i.e. core is generated) we can include the user's data section
+ * The following signal action for AIX is necessary so that in case of a
+ * crash (i.e. core is generated) we can include the user's data section
* in the core dump. Unfortunately, by default, only a partial core is
* generated which, in many cases, isn't too useful.
*/
{
static char gpbuf[BUFSIZ];
/* read a password from stdin, stop on \n or eof */
- register int i, tc;
+ int i, tc;
memset(gpbuf, 0, sizeof(gpbuf));
for (i = 0; i < (sizeof(gpbuf) - 1); i++) {
tc = fgetc(stdin);
struct ktc_principal *aclient,
int *vicep)
{
- rx_securityIndex scIndex;
int code;
- int i;
- struct ubik_client *ptconn = 0;
- struct rx_securityClass *sc;
- struct rx_connection *conns[MAXSERVERS+1];
- idlist lids[1];
- namelist lnames[1];
char tempname[PR_MAXNAMELEN + 1];
- memset(lnames, 0, sizeof *lnames);
- memset(lids, 0, sizeof *lids);
- scIndex = RX_SECIDX_KAD;
- sc = rxkad_NewClientSecurityObject(rxkad_auth,
- &atoken->sessionKey, atoken->kvno,
- atoken->ticketLen, atoken->ticket);
- for (i = 0; i < cellconfig->numServers; ++i)
- conns[i] = rx_NewConnection(cellconfig->hostAddr[i].sin_addr.s_addr,
- cellconfig->hostAddr[i].sin_port, PRSRV, sc, scIndex);
- conns[i] = 0;
- ptconn = 0;
- if ((code = ubik_ClientInit(conns, &ptconn)))
+ code = pr_Initialize(0, AFSDIR_CLIENT_ETC_DIRPATH, cellconfig->name);
+ if (code)
goto Failed;
+
if (*aclient->instance)
snprintf (tempname, sizeof tempname, "%s.%s",
aclient->name, aclient->instance);
else
snprintf (tempname, sizeof tempname, "%s", aclient->name);
- lnames->namelist_len = 1;
- lnames->namelist_val = (prname *) tempname;
- code = ubik_PR_NameToID(ptconn, 0, lnames, lids);
- if (lids->idlist_val) {
- *vicep = *lids->idlist_val;
- }
+ code = pr_SNameToId(tempname, vicep);
Failed:
- if (lids->idlist_val) free(lids->idlist_val);
- if (ptconn) ubik_ClientDestroy(ptconn);
return code;
}
KLOGEXIT(code);
}
initialize_U_error_table();
- /*initialize_krb5_error_table();*/
+ /*initialize_krb5_error_table();*/
initialize_RXK_error_table();
initialize_KTC_error_table();
initialize_ACFG_error_table();
* krb5_allow_weak_crypto is MIT Kerberos 1.8. krb5_enctype_enable is
* Heimdal.
*/
-#if defined(HAVE_KRB5_ALLOW_WEAK_CRYPTO)
- krb5_allow_weak_crypto(k5context, 1);
-#elif defined(HAVE_KRB5_ENCTYPE_ENABLE)
+#if defined(HAVE_KRB5_ENCTYPE_ENABLE)
i = krb5_enctype_valid(k5context, ETYPE_DES_CBC_CRC);
if (i)
krb5_enctype_enable(k5context, ETYPE_DES_CBC_CRC);
+#elif defined(HAVE_KRB5_ALLOW_WEAK_CRYPTO)
+ krb5_allow_weak_crypto(k5context, 1);
#endif
/* Parse remaining arguments. */
} else
#endif
snprintf (service_temp, sizeof service_temp, "afs/%s", cellconfig->name);
- if (writeTicketFile)
- service = 0;
- else
- service = service_temp;
klog_arg->pp = &pass;
klog_arg->pstore = passwd;
#else
krb5_get_init_creds_opt_init(gic_opts);
#endif
+
for (;;) {
- code = krb5_get_init_creds_password(k5context,
+ code = krb5_get_init_creds_password(k5context,
incred,
princ,
pass,
pf, /* prompter */
pa, /* data */
0, /* start_time */
- service, /* in_tkt_service */
+ 0, /* in_tkt_service */
gic_opts);
- if (code != KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN || service != service_temp) break;
-#ifdef AFS_RXK5
- if (authtype & FORCE_RXK5) break;
-#endif
- service = "afs";
+ if (code != KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN)
+ break;
}
memset(passwd, 0, sizeof(passwd));
if (code) {
char *r = 0;
if (krb5_get_default_realm(k5context, &r))
r = 0;
- if (service)
- afs_com_err(rn, code, "Unable to authenticate to use %s", service);
- else if (r)
+ if (r)
afs_com_err(rn, code, "Unable to authenticate in realm %s", r);
else
afs_com_err(rn, code, "Unable to authenticate to use cell %s",
KLOGEXIT(code);
}
- if (service) {
- afscred = incred;
- } else {
- for (;;writeTicketFile = 0) {
- if (writeTicketFile) {
- what = "getting default ccache";
- code = krb5_cc_default(k5context, &cc);
- } else {
- what = "krb5_cc_resolve";
- code = krb5_cc_resolve(k5context, "MEMORY:core", &cc);
- if (code) goto Failed;
- }
- what = "initializing ccache";
- code = krb5_cc_initialize(k5context, cc, princ);
- if (code) goto Failed;
- what = "writing Kerberos ticket file";
- code = krb5_cc_store_cred(k5context, cc, incred);
- if (code) goto Failed;
- if (writeTicketFile)
- fprintf(stderr,
- "Wrote ticket file to %s\n",
- krb5_cc_get_name(k5context, cc));
- break;
- Failed:
- if (code)
- afs_com_err(rn, code, "%s", what);
- if (writeTicketFile) {
- if (cc) {
- krb5_cc_close(k5context, cc);
- cc = 0;
- }
- continue;
- }
- KLOGEXIT(code);
- }
+ for (;;writeTicketFile = 0) {
+ if (writeTicketFile) {
+ what = "getting default ccache";
+ code = krb5_cc_default(k5context, &cc);
+ } else {
+ what = "krb5_cc_resolve";
+ code = krb5_cc_resolve(k5context, "MEMORY:core", &cc);
+ if (code) goto Failed;
+ }
+ what = "initializing ccache";
+ code = krb5_cc_initialize(k5context, cc, princ);
+ if (code) goto Failed;
+ what = "writing Kerberos ticket file";
+ code = krb5_cc_store_cred(k5context, cc, incred);
+ if (code) goto Failed;
+ if (writeTicketFile)
+ fprintf(stderr,
+ "Wrote ticket file to %s\n",
+ krb5_cc_get_name(k5context, cc));
+ break;
+ Failed:
+ if (code)
+ afs_com_err(rn, code, "%s", what);
+ if (writeTicketFile) {
+ if (cc) {
+ krb5_cc_close(k5context, cc);
+ cc = 0;
+ }
+ continue;
+ }
+ KLOGEXIT(code);
+ }
- for (service = service_temp;;service = "afs") {
- memset(mcred, 0, sizeof *mcred);
- mcred->client = princ;
- code = krb5_parse_name(k5context, service, &mcred->server);
- if (code) {
- afs_com_err(rn, code, "Unable to parse service <%s>\n", service);
- KLOGEXIT(code);
- }
- if (tofree) { free(tofree); tofree = 0; }
- if (!(code = krb5_unparse_name(k5context, mcred->server, &outname)))
- tofree = outname;
- else outname = service;
- code = krb5_get_credentials(k5context, 0, cc, mcred, &outcred);
- krb5_free_principal(k5context, mcred->server);
- if (code != KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN || service != service_temp) break;
+ for (service = service_temp;;service = "afs") {
+ memset(mcred, 0, sizeof *mcred);
+ mcred->client = princ;
+ /* Ask for DES since that is what rxkad understands */
+ if (service && !strncmp(service, "afs", 3))
+ get_creds_enctype(mcred) = ENCTYPE_DES_CBC_CRC;
+ code = krb5_parse_name(k5context, service, &mcred->server);
+ if (code) {
+ afs_com_err(rn, code, "Unable to parse service <%s>\n", service);
+ KLOGEXIT(code);
+ }
+ if (tofree) { free(tofree); tofree = 0; }
+ if (!(code = krb5_unparse_name(k5context, mcred->server, &outname)))
+ tofree = outname;
+ else outname = service;
+ code = krb5_get_credentials(k5context, 0, cc, mcred, &outcred);
+ krb5_free_principal(k5context, mcred->server);
+ if (code != KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN || service != service_temp) break;
#ifdef AFS_RXK5
- if (authtype & FORCE_RXK5) break;
+ if (authtype & FORCE_RXK5)
+ break;
#endif
- }
- afscred = outcred;
}
+ afscred = outcred;
+
if (code) {
afs_com_err(rn, code, "Unable to get credentials to use %s", outname);
KLOGEXIT(code);
struct ktc_principal aserver[1], aclient[1];
struct ktc_token atoken[1];
+ if (get_cred_keylen(afscred) != sizeof(atoken->sessionKey)) {
+ afs_com_err(rn, 0, "Invalid rxkad key length (%u != 8) key type (%u)",
+ (unsigned)get_cred_keylen(afscred),
+ get_creds_enctype(afscred));
+ KLOGEXIT(1);
+ }
+
memset(atoken, 0, sizeof *atoken);
if (evil) {
size_t elen = enc_part->length;