version 1.118, 2003/05/14 02:15:47 |
version 1.119, 2003/05/15 00:28:28 |
|
|
void userauth(Authctxt *, char *); |
void userauth(Authctxt *, char *); |
|
|
static int sign_and_send_pubkey(Authctxt *, Identity *); |
static int sign_and_send_pubkey(Authctxt *, Identity *); |
static void clear_auth_state(Authctxt *); |
|
static void pubkey_prepare(Authctxt *); |
static void pubkey_prepare(Authctxt *); |
static void pubkey_cleanup(Authctxt *); |
static void pubkey_cleanup(Authctxt *); |
static Key *load_identity_file(char *); |
static Key *load_identity_file(char *); |
|
|
dispatch_run(DISPATCH_BLOCK, &authctxt.success, &authctxt); /* loop until success */ |
dispatch_run(DISPATCH_BLOCK, &authctxt.success, &authctxt); /* loop until success */ |
|
|
pubkey_cleanup(&authctxt); |
pubkey_cleanup(&authctxt); |
|
dispatch_range(SSH2_MSG_USERAUTH_MIN, SSH2_MSG_USERAUTH_MAX, NULL); |
|
|
debug("Authentication succeeded (%s).", authctxt.method->name); |
debug("Authentication succeeded (%s).", authctxt.method->name); |
} |
} |
|
|
void |
void |
userauth(Authctxt *authctxt, char *authlist) |
userauth(Authctxt *authctxt, char *authlist) |
{ |
{ |
|
|
if (method == NULL) |
if (method == NULL) |
fatal("Permission denied (%s).", authlist); |
fatal("Permission denied (%s).", authlist); |
authctxt->method = method; |
authctxt->method = method; |
|
|
|
/* reset the per method handler */ |
|
dispatch_range(SSH2_MSG_USERAUTH_PER_METHOD_MIN, |
|
SSH2_MSG_USERAUTH_PER_METHOD_MAX, NULL); |
|
|
|
/* and try new method */ |
if (method->userauth(authctxt) != 0) { |
if (method->userauth(authctxt) != 0) { |
debug2("we sent a %s packet, wait for reply", method->name); |
debug2("we sent a %s packet, wait for reply", method->name); |
break; |
break; |
|
|
fatal("input_userauth_success: no authentication context"); |
fatal("input_userauth_success: no authentication context"); |
if (authctxt->authlist) |
if (authctxt->authlist) |
xfree(authctxt->authlist); |
xfree(authctxt->authlist); |
clear_auth_state(authctxt); |
|
authctxt->success = 1; /* break out */ |
authctxt->success = 1; /* break out */ |
} |
} |
|
|
|
|
logit("Authenticated with partial success."); |
logit("Authenticated with partial success."); |
debug("Authentications that can continue: %s", authlist); |
debug("Authentications that can continue: %s", authlist); |
|
|
clear_auth_state(authctxt); |
|
userauth(authctxt, authlist); |
userauth(authctxt, authlist); |
} |
} |
void |
void |
|
|
xfree(pkalg); |
xfree(pkalg); |
xfree(pkblob); |
xfree(pkblob); |
|
|
/* unregister */ |
|
clear_auth_state(authctxt); |
|
dispatch_set(SSH2_MSG_USERAUTH_PK_OK, NULL); |
|
|
|
/* try another method if we did not send a packet */ |
/* try another method if we did not send a packet */ |
if (sent == 0) |
if (sent == 0) |
userauth(authctxt, NULL); |
userauth(authctxt, NULL); |
|
|
|
|
dispatch_set(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, |
dispatch_set(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, |
&input_userauth_passwd_changereq); |
&input_userauth_passwd_changereq); |
} |
|
|
|
static void |
|
clear_auth_state(Authctxt *authctxt) |
|
{ |
|
/* XXX clear authentication state */ |
|
dispatch_set(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, NULL); |
|
} |
} |
|
|
static int |
static int |