Path: blob/main/crypto/krb5/src/clients/kpasswd/kpasswd.c
34907 views
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */12#include "k5-platform.h"3#include <locale.h>4#include <sys/types.h>56#ifndef _WIN327#include <unistd.h>8#endif910#include <krb5.h>1112#define P1 _("Enter new password")13#define P2 _("Enter it again")1415#ifdef HAVE_PWD_H16#include <pwd.h>1718static void19get_name_from_passwd_file(char *program_name, krb5_context context,20krb5_principal *me)21{22struct passwd *pw;23krb5_error_code ret;2425pw = getpwuid(getuid());26if (pw != NULL) {27ret = krb5_parse_name(context, pw->pw_name, me);28if (ret) {29com_err(program_name, ret, _("when parsing name %s"), pw->pw_name);30exit(1);31}32} else {33fprintf(stderr, _("Unable to identify user from password file\n"));34exit(1);35}36}37#else /* HAVE_PWD_H */38static void39get_name_from_passwd_file(char *program_name, krb5_context context,40krb5_principal *me)41{42fprintf(stderr, _("Unable to identify user\n"));43exit(1);44}45#endif /* HAVE_PWD_H */4647int main(int argc, char *argv[])48{49krb5_error_code ret;50krb5_context context;51krb5_principal princ = NULL;52char *pname, *message;53char pw[1024];54krb5_ccache ccache;55krb5_get_init_creds_opt *opts = NULL;56krb5_creds creds;57unsigned int pwlen;58int result_code;59krb5_data result_code_string, result_string;6061setlocale(LC_ALL, "");62if (argc > 2) {63fprintf(stderr, _("usage: %s [principal]\n"), argv[0]);64exit(1);65}6667pname = argv[1];6869ret = krb5_init_context(&context);70if (ret) {71com_err(argv[0], ret, _("initializing kerberos library"));72exit(1);73}74ret = krb5_get_init_creds_opt_alloc(context, &opts);75if (ret) {76com_err(argv[0], ret, _("allocating krb5_get_init_creds_opt"));77exit(1);78}7980/*81* In order, use the first of:82* - A name specified on the command line83* - The principal name from an existing ccache84* - The name corresponding to the ruid of the process85*86* Otherwise, it's an error.87* We always attempt to open the default ccache in order to use FAST if88* possible.89*/90ret = krb5_cc_default(context, &ccache);91if (ret) {92com_err(argv[0], ret, _("opening default ccache"));93exit(1);94}95ret = krb5_cc_get_principal(context, ccache, &princ);96if (ret && ret != KRB5_CC_NOTFOUND && ret != KRB5_FCC_NOFILE) {97com_err(argv[0], ret, _("getting principal from ccache"));98exit(1);99} else if (princ != NULL) {100ret = krb5_get_init_creds_opt_set_fast_ccache(context, opts, ccache);101if (ret) {102com_err(argv[0], ret, _("while setting FAST ccache"));103exit(1);104}105}106ret = krb5_cc_close(context, ccache);107if (ret) {108com_err(argv[0], ret, _("closing ccache"));109exit(1);110}111if (pname != NULL) {112krb5_free_principal(context, princ);113princ = NULL;114ret = krb5_parse_name(context, pname, &princ);115if (ret) {116com_err(argv[0], ret, _("parsing client name"));117exit(1);118}119}120if (princ == NULL)121get_name_from_passwd_file(argv[0], context, &princ);122123krb5_get_init_creds_opt_set_tkt_life(opts, 5 * 60);124krb5_get_init_creds_opt_set_renew_life(opts, 0);125krb5_get_init_creds_opt_set_forwardable(opts, 0);126krb5_get_init_creds_opt_set_proxiable(opts, 0);127128ret = krb5_get_init_creds_password(context, &creds, princ, NULL,129krb5_prompter_posix, NULL, 0,130"kadmin/changepw", opts);131if (ret) {132if (ret == KRB5KRB_AP_ERR_BAD_INTEGRITY) {133com_err(argv[0], 0,134_("Password incorrect while getting initial ticket"));135} else {136com_err(argv[0], ret, _("getting initial ticket"));137}138139krb5_get_init_creds_opt_free(context, opts);140exit(1);141}142143pwlen = sizeof(pw);144ret = krb5_read_password(context, P1, P2, pw, &pwlen);145if (ret) {146com_err(argv[0], ret, _("while reading password"));147krb5_get_init_creds_opt_free(context, opts);148exit(1);149}150151ret = krb5_change_password(context, &creds, pw, &result_code,152&result_code_string, &result_string);153if (ret) {154com_err(argv[0], ret, _("changing password"));155krb5_get_init_creds_opt_free(context, opts);156exit(1);157}158159if (result_code) {160if (krb5_chpw_message(context, &result_string, &message) != 0)161message = NULL;162printf("%.*s%s%s\n",163(int)result_code_string.length, result_code_string.data,164message ? ": " : "", message ? message : NULL);165krb5_free_string(context, message);166krb5_get_init_creds_opt_free(context, opts);167exit(2);168}169170free(result_string.data);171free(result_code_string.data);172krb5_get_init_creds_opt_free(context, opts);173174printf(_("Password changed.\n"));175exit(0);176}177178179