version 1.5, 2002/05/10 06:52:03 |
version 1.6, 2002/06/28 22:28:17 |
|
|
/* |
/* |
* Copyright (c) 1997-2000 Kungliga Tekniska Högskolan |
* Copyright (c) 1997-2000 Kungliga Tekniska Högskolan |
* (Royal Institute of Technology, Stockholm, Sweden). |
* (Royal Institute of Technology, Stockholm, Sweden). |
* All rights reserved. |
* All rights reserved. |
* |
* |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* modification, are permitted provided that the following conditions |
* are met: |
* are met: |
* |
* |
* 1. Redistributions of source code must retain the above copyright |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* notice, this list of conditions and the following disclaimer. |
* |
* |
* 2. Redistributions in binary form must reproduce the above copyright |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* documentation and/or other materials provided with the distribution. |
* |
* |
* 3. Neither the name of the Institute nor the names of its contributors |
* 3. Neither the name of the Institute nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* without specific prior written permission. |
* |
* |
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND |
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* SUCH DAMAGE. |
*/ |
*/ |
|
|
#include <stdio.h> |
#include <stdio.h> |
|
|
int |
int |
krb5_passwd (int argc, char **argv) |
krb5_passwd (int argc, char **argv) |
{ |
{ |
krb5_error_code ret; |
krb5_data result_code_string, result_string; |
krb5_context context; |
krb5_get_init_creds_opt opt; |
krb5_principal principal; |
krb5_principal principal; |
krb5_get_init_creds_opt opt; |
krb5_context context; |
krb5_creds cred; |
krb5_error_code ret; |
int result_code; |
char pwbuf[BUFSIZ]; |
krb5_data result_code_string, result_string; |
krb5_creds cred; |
char pwbuf[BUFSIZ]; |
int result_code; |
|
|
krb5_get_init_creds_opt_init (&opt); |
krb5_get_init_creds_opt_init (&opt); |
|
|
krb5_get_init_creds_opt_set_tkt_life (&opt, 300); |
|
krb5_get_init_creds_opt_set_forwardable (&opt, FALSE); |
|
krb5_get_init_creds_opt_set_proxiable (&opt, FALSE); |
|
|
|
ret = krb5_init_context (&context); |
krb5_get_init_creds_opt_set_tkt_life (&opt, 300); |
if (ret) |
krb5_get_init_creds_opt_set_forwardable (&opt, FALSE); |
errx (1, "krb5_init_context failed: %d", ret); |
krb5_get_init_creds_opt_set_proxiable (&opt, FALSE); |
|
|
if(argv[0]) { |
ret = krb5_init_context(&context); |
ret = krb5_parse_name (context, argv[0], &principal); |
|
if (ret) |
if (ret) |
krb5_err (context, 1, ret, "krb5_parse_name"); |
errx(1, "krb5_init_context failed: %d", ret); |
} else |
|
principal = NULL; |
|
|
|
ret = krb5_get_init_creds_password (context, |
if (argv[0]) { |
&cred, |
ret = krb5_parse_name(context, argv[0], &principal); |
principal, |
if (ret) |
NULL, |
krb5_err(context, 1, ret, "krb5_parse_name"); |
krb5_prompter_posix, |
} else |
NULL, |
principal = NULL; |
0, |
|
"kadmin/changepw", |
|
&opt); |
|
switch (ret) { |
|
case 0: |
|
break; |
|
case KRB5_LIBOS_PWDINTR : |
|
return 1; |
|
case KRB5KRB_AP_ERR_BAD_INTEGRITY : |
|
case KRB5KRB_AP_ERR_MODIFIED : |
|
krb5_errx(context, 1, "Password incorrect"); |
|
break; |
|
default: |
|
krb5_err(context, 1, ret, "krb5_get_init_creds"); |
|
} |
|
|
|
krb5_data_zero (&result_code_string); |
ret = krb5_get_init_creds_password (context, &cred, |
krb5_data_zero (&result_string); |
principal, NULL, krb5_prompter_posix, NULL, 0, |
|
"kadmin/changepw", &opt); |
|
switch (ret) { |
|
case 0: |
|
break; |
|
case KRB5_LIBOS_PWDINTR : |
|
return 1; |
|
case KRB5KRB_AP_ERR_BAD_INTEGRITY : |
|
case KRB5KRB_AP_ERR_MODIFIED : |
|
krb5_errx(context, 1, "Password incorrect"); |
|
break; |
|
default: |
|
krb5_err(context, 1, ret, "krb5_get_init_creds"); |
|
} |
|
|
if(des_read_pw_string (pwbuf, sizeof(pwbuf), "New password: ", 1) != 0) |
krb5_data_zero(&result_code_string); |
return 1; |
krb5_data_zero(&result_string); |
|
|
ret = krb5_change_password (context, &cred, pwbuf, |
if (des_read_pw_string(pwbuf, sizeof(pwbuf), "New password: ", 1) != 0) |
&result_code, |
return 1; |
&result_code_string, |
|
&result_string); |
|
if (ret) |
|
krb5_err (context, 1, ret, "krb5_change_password"); |
|
|
|
printf ("Reply from server: %.*s\n", (int)result_string.length, |
ret = krb5_change_password (context, &cred, pwbuf, &result_code, |
|
&result_code_string, &result_string); |
|
if (ret) |
|
krb5_err(context, 1, ret, "krb5_change_password"); |
|
|
|
printf("Reply from server: %.*s\n", (int)result_string.length, |
(char *)result_string.data); |
(char *)result_string.data); |
|
|
krb5_data_free (&result_code_string); |
krb5_data_free(&result_code_string); |
krb5_data_free (&result_string); |
krb5_data_free(&result_string); |
|
|
krb5_free_creds_contents (context, &cred); |
krb5_free_creds_contents(context, &cred); |
krb5_free_context (context); |
krb5_free_context(context); |
return result_code; |
return result_code; |
} |
} |