[BACK]Return to auth-krb5.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/auth-krb5.c between version 1.10.2.2 and 1.11

version 1.10.2.2, 2004/03/04 18:18:15 version 1.11, 2003/07/16 15:02:06
Line 49 
Line 49 
 {  {
         Authctxt *authctxt = (Authctxt *)context;          Authctxt *authctxt = (Authctxt *)context;
         krb5_error_code problem;          krb5_error_code problem;
           static int cleanup_registered = 0;
   
         if (authctxt->krb5_ctx == NULL) {          if (authctxt->krb5_ctx == NULL) {
                 problem = krb5_init_context(&authctxt->krb5_ctx);                  problem = krb5_init_context(&authctxt->krb5_ctx);
Line 56 
Line 57 
                         return (problem);                          return (problem);
                 krb5_init_ets(authctxt->krb5_ctx);                  krb5_init_ets(authctxt->krb5_ctx);
         }          }
           if (!cleanup_registered) {
                   fatal_add_cleanup(krb5_cleanup_proc, authctxt);
                   cleanup_registered = 1;
           }
         return (0);          return (0);
 }  }
   
   /*
    * Try krb5 authentication. server_user is passed for logging purposes
    * only, in auth is received ticket, in client is returned principal
    * from the ticket
    */
 int  int
   auth_krb5(Authctxt *authctxt, krb5_data *auth, char **client, krb5_data *reply)
   {
           krb5_error_code problem;
           krb5_principal server;
           krb5_ticket *ticket;
           int fd, ret;
   
           ret = 0;
           server = NULL;
           ticket = NULL;
           reply->length = 0;
   
           problem = krb5_init(authctxt);
           if (problem)
                   goto err;
   
           problem = krb5_auth_con_init(authctxt->krb5_ctx,
               &authctxt->krb5_auth_ctx);
           if (problem)
                   goto err;
   
           fd = packet_get_connection_in();
           problem = krb5_auth_con_setaddrs_from_fd(authctxt->krb5_ctx,
               authctxt->krb5_auth_ctx, &fd);
           if (problem)
                   goto err;
   
           problem = krb5_sname_to_principal(authctxt->krb5_ctx, NULL, NULL,
               KRB5_NT_SRV_HST, &server);
           if (problem)
                   goto err;
   
           problem = krb5_rd_req(authctxt->krb5_ctx, &authctxt->krb5_auth_ctx,
               auth, server, NULL, NULL, &ticket);
           if (problem)
                   goto err;
   
           problem = krb5_copy_principal(authctxt->krb5_ctx, ticket->client,
               &authctxt->krb5_user);
           if (problem)
                   goto err;
   
           /* if client wants mutual auth */
           problem = krb5_mk_rep(authctxt->krb5_ctx, authctxt->krb5_auth_ctx,
               reply);
           if (problem)
                   goto err;
   
           /* Check .k5login authorization now. */
           if (!krb5_kuserok(authctxt->krb5_ctx, authctxt->krb5_user,
               authctxt->pw->pw_name))
                   goto err;
   
           if (client)
                   krb5_unparse_name(authctxt->krb5_ctx, authctxt->krb5_user,
                       client);
   
           ret = 1;
    err:
           if (server)
                   krb5_free_principal(authctxt->krb5_ctx, server);
           if (ticket)
                   krb5_free_ticket(authctxt->krb5_ctx, ticket);
           if (!ret && reply->length) {
                   xfree(reply->data);
                   memset(reply, 0, sizeof(*reply));
           }
   
           if (problem) {
                   if (authctxt->krb5_ctx != NULL)
                           debug("Kerberos v5 authentication failed: %s",
                               krb5_get_err_text(authctxt->krb5_ctx, problem));
                   else
                           debug("Kerberos v5 authentication failed: %d",
                               problem);
           }
   
           return (ret);
   }
   
   int
   auth_krb5_tgt(Authctxt *authctxt, krb5_data *tgt)
   {
           krb5_error_code problem;
           krb5_ccache ccache = NULL;
           char *pname;
   
           if (authctxt->pw == NULL || authctxt->krb5_user == NULL)
                   return (0);
   
           temporarily_use_uid(authctxt->pw);
   
           problem = krb5_cc_gen_new(authctxt->krb5_ctx, &krb5_fcc_ops, &ccache);
           if (problem)
                   goto fail;
   
           problem = krb5_cc_initialize(authctxt->krb5_ctx, ccache,
               authctxt->krb5_user);
           if (problem)
                   goto fail;
   
           problem = krb5_rd_cred2(authctxt->krb5_ctx, authctxt->krb5_auth_ctx,
               ccache, tgt);
           if (problem)
                   goto fail;
   
           authctxt->krb5_fwd_ccache = ccache;
           ccache = NULL;
   
           authctxt->krb5_ticket_file = (char *)krb5_cc_get_name(authctxt->krb5_ctx, authctxt->krb5_fwd_ccache);
   
           problem = krb5_unparse_name(authctxt->krb5_ctx, authctxt->krb5_user,
               &pname);
           if (problem)
                   goto fail;
   
           debug("Kerberos v5 TGT accepted (%s)", pname);
   
           restore_uid();
   
           return (1);
   
    fail:
           if (problem)
                   debug("Kerberos v5 TGT passing failed: %s",
                       krb5_get_err_text(authctxt->krb5_ctx, problem));
           if (ccache)
                   krb5_cc_destroy(authctxt->krb5_ctx, ccache);
   
           restore_uid();
   
           return (0);
   }
   
   int
 auth_krb5_password(Authctxt *authctxt, const char *password)  auth_krb5_password(Authctxt *authctxt, const char *password)
 {  {
         krb5_error_code problem;          krb5_error_code problem;
         krb5_ccache ccache = NULL;          krb5_ccache ccache = NULL;
   
         if (!authctxt->valid)          if (authctxt->pw == NULL)
                 return (0);                  return (0);
   
         temporarily_use_uid(authctxt->pw);          temporarily_use_uid(authctxt->pw);
Line 83 
Line 228 
         if (problem)          if (problem)
                 goto out;                  goto out;
   
         problem = krb5_cc_initialize(authctxt->krb5_ctx, ccache,          problem = krb5_cc_initialize(authctxt->krb5_ctx, ccache,
                 authctxt->krb5_user);                  authctxt->krb5_user);
         if (problem)          if (problem)
                 goto out;                  goto out;
Line 98 
Line 243 
         if (problem)          if (problem)
                 goto out;                  goto out;
   
         problem = krb5_cc_gen_new(authctxt->krb5_ctx, &krb5_fcc_ops,          problem = krb5_cc_gen_new(authctxt->krb5_ctx, &krb5_fcc_ops,
             &authctxt->krb5_fwd_ccache);              &authctxt->krb5_fwd_ccache);
         if (problem)          if (problem)
                 goto out;                  goto out;
Line 110 
Line 255 
         if (problem)          if (problem)
                 goto out;                  goto out;
   
         authctxt->krb5_ticket_file = (char *)krb5_cc_get_name(authctxt->krb5_ctx,          authctxt->krb5_ticket_file = (char *)krb5_cc_get_name(authctxt->krb5_ctx, authctxt->krb5_fwd_ccache);
             authctxt->krb5_fwd_ccache);  
   
  out:   out:
         restore_uid();          restore_uid();
Line 138 
Line 282 
 }  }
   
 void  void
 krb5_cleanup_proc(Authctxt *authctxt)  krb5_cleanup_proc(void *context)
 {  {
           Authctxt *authctxt = (Authctxt *)context;
   
         debug("krb5_cleanup_proc called");          debug("krb5_cleanup_proc called");
         if (authctxt->krb5_fwd_ccache) {          if (authctxt->krb5_fwd_ccache) {
                 krb5_cc_destroy(authctxt->krb5_ctx, authctxt->krb5_fwd_ccache);                  krb5_cc_destroy(authctxt->krb5_ctx, authctxt->krb5_fwd_ccache);
Line 148 
Line 294 
         if (authctxt->krb5_user) {          if (authctxt->krb5_user) {
                 krb5_free_principal(authctxt->krb5_ctx, authctxt->krb5_user);                  krb5_free_principal(authctxt->krb5_ctx, authctxt->krb5_user);
                 authctxt->krb5_user = NULL;                  authctxt->krb5_user = NULL;
           }
           if (authctxt->krb5_auth_ctx) {
                   krb5_auth_con_free(authctxt->krb5_ctx,
                       authctxt->krb5_auth_ctx);
                   authctxt->krb5_auth_ctx = NULL;
         }          }
         if (authctxt->krb5_ctx) {          if (authctxt->krb5_ctx) {
                 krb5_free_context(authctxt->krb5_ctx);                  krb5_free_context(authctxt->krb5_ctx);

Legend:
Removed from v.1.10.2.2  
changed lines
  Added in v.1.11