Add the DragonFly cvs id and perform general cleanups on cvs/rcs/sccs ids. Most
[dragonfly.git] / crypto / kerberosIV / kadmin / kpasswd_standalone.c
1 /*
2  * Copyright 1988 by the Massachusetts Institute of Technology.
3  *
4  * For copying and distribution information, please see the file
5  * Copyright.MIT.
6  *
7  * change your password with kerberos
8  *
9  * $FreeBSD: src/crypto/kerberosIV/kadmin/kpasswd_standalone.c,v 1.1.8.3 2003/02/14 22:37:37 nectar Exp $
10  * $DragonFly: src/crypto/kerberosIV/kadmin/Attic/kpasswd_standalone.c,v 1.2 2003/06/17 04:24:36 dillon Exp $
11  */
12
13 /*
14  * kpasswd
15  * change your password with kerberos
16  */
17
18 #include <stdio.h>
19 #include <sys/types.h>
20 #include <sys/param.h>
21 #include <netinet/in.h>
22 #include <com_err.h>
23 #include <err.h>
24 #include <krb.h>
25 #include <string.h>
26 #include <pwd.h>
27 #include <unistd.h>
28 #include "kadm.h"
29
30 #include "extern.h"
31
32 extern void krb_set_tkt_string();
33 static void go_home(char *, int);
34
35
36 int krb_passwd(char *uname, char *iflag, char *rflag, char *uflag)
37 {
38     char name[ANAME_SZ];        /* name of user */
39     char inst[INST_SZ];         /* instance of user */
40     char realm[REALM_SZ];       /* realm of user */
41     char default_name[ANAME_SZ];
42     char default_inst[INST_SZ];
43     char default_realm[REALM_SZ];
44     int realm_given = 0;        /* True if realm was give on cmdline */
45     int use_default = 1;        /* True if we should use default name */
46     struct passwd *pw;
47     int status;                 /* return code */
48     des_cblock new_key;
49     extern char *optarg;
50     extern int optind;
51     char tktstring[MAXPATHLEN];
52
53     void get_pw_new_key();
54
55 #ifdef NOENCRYPTION
56 int placebo_long_pw_string();
57 #define read_long_pw_string placebo_read_pw_string
58 #else
59 #define read_long_pw_string des_read_pw_string
60 #endif
61
62     bzero(name, sizeof(name));
63     bzero(inst, sizeof(inst));
64     bzero(realm, sizeof(realm));
65
66     if (krb_get_tf_fullname(TKT_FILE, default_name, default_inst,
67                             default_realm) != KSUCCESS) {
68         pw = getpwuid((int) getuid());
69         if (pw) {
70                 strcpy(default_name, pw->pw_name);
71         } else {
72             /* seems like a null name is kinda silly */
73                 strcpy(default_name, "");
74         }
75         strcpy(default_inst, "");
76         if (krb_get_lrealm(default_realm, 1) != KSUCCESS)
77             strcpy(default_realm, KRB_REALM);
78     }
79
80     if(uflag) {
81             if ((status = kname_parse(name, inst, realm, uflag))) {
82                     errx(2, "Kerberos error: %s", krb_err_txt[status]);
83             }
84             if (realm[0])
85                 realm_given++;
86             else
87                 if (krb_get_lrealm(realm, 1) != KSUCCESS)
88                     strcpy(realm, KRB_REALM);
89     }
90
91     if(uname) {
92             if (k_isname(uname)) {
93                     strncpy(name, uname, sizeof(name) - 1);
94             } else {
95                     errx(1, "bad name: %s", uname);
96             }
97     }
98
99     if(iflag) {
100             if (k_isinst(iflag)) {
101                     strncpy(inst, iflag, sizeof(inst) - 1);
102             } else {
103                     errx(1, "bad instance: %s", iflag);
104             }
105     }
106
107     if(rflag) {
108             if (k_isrealm(rflag)) {
109                     strncpy(realm, rflag, sizeof(realm) - 1);
110                     realm_given++;
111             } else {
112                     errx(1, "bad realm: %s", rflag);
113             }
114     }
115
116     if(uname || iflag || rflag || uflag) use_default = 0;
117
118     if (use_default) {
119         strcpy(name, default_name);
120         strcpy(inst, default_inst);
121         strcpy(realm, default_realm);
122     } else {
123         if (!name[0])
124             strcpy(name, default_name);
125         if (!realm[0])
126             strcpy(realm, default_realm);
127     }
128
129     (void) sprintf(tktstring, "/tmp/tkt_cpw_%d",getpid());
130     krb_set_tkt_string(tktstring);
131
132     get_pw_new_key(new_key, name, inst, realm, realm_given);
133
134     if ((status = kadm_init_link("changepw", KRB_MASTER, realm))
135         != KADM_SUCCESS)
136         com_err("kpasswd", status, "while initializing");
137     else if ((status = kadm_change_pw(new_key)) != KADM_SUCCESS)
138         com_err("kpasswd", status, " attempting to change password.");
139
140     if (status != KADM_SUCCESS)
141         fprintf(stderr,"Password NOT changed.\n");
142     else
143         printf("Password changed.\n");
144
145     (void) dest_tkt();
146     if (status)
147         exit(2);
148     else
149         exit(0);
150 }
151
152 void get_pw_new_key(new_key, name, inst, realm, print_realm)
153   des_cblock new_key;
154   char *name;
155   char *inst;
156   char *realm;
157   int print_realm;              /* True if realm was give on cmdline */
158 {
159     char ppromp[40+ANAME_SZ+INST_SZ+REALM_SZ]; /* for the password prompt */
160     char pword[MAX_KPW_LEN];                   /* storage for the password */
161     char npromp[40+ANAME_SZ+INST_SZ+REALM_SZ]; /* for the password prompt */
162
163     char local_realm[REALM_SZ];
164     int status;
165
166     /*
167      * We don't care about failure; this is to determine whether or
168      * not to print the realm in the prompt for a new password.
169      */
170     (void) krb_get_lrealm(local_realm, 1);
171
172     if (strcmp(local_realm, realm))
173         print_realm++;
174
175     (void) sprintf(ppromp,"Old password for %s%s%s%s%s:",
176                    name, *inst ? "." : "", inst,
177                    print_realm ? "@" : "", print_realm ? realm : "");
178     if (read_long_pw_string(pword, sizeof(pword)-1, ppromp, 0)) {
179         fprintf(stderr, "Error reading old password.\n");
180         exit(1);
181     }
182
183     if ((status = krb_get_pw_in_tkt(name, inst, realm, PWSERV_NAME,
184                                     KADM_SINST, 1, pword)) != KSUCCESS) {
185         if (status == INTK_BADPW) {
186             printf("Incorrect old password.\n");
187             exit(0);
188         }
189         else {
190             fprintf(stderr, "Kerberos error: %s\n", krb_err_txt[status]);
191             exit(1);
192         }
193     }
194     bzero(pword, sizeof(pword));
195     do {
196         (void) sprintf(npromp,"New Password for %s%s%s%s%s:",
197                        name, *inst ? "." : "", inst,
198                        print_realm ? "@" : "", print_realm ? realm : "");
199         if (read_long_pw_string(pword, sizeof(pword)-1, npromp, 1))
200             go_home("Error reading new password, password unchanged.\n",0);
201         if (strlen(pword) == 0)
202             printf("Null passwords are not allowed; try again.\n");
203     } while (strlen(pword) == 0);
204
205 #ifdef NOENCRYPTION
206     bzero((char *) new_key, sizeof(des_cblock));
207     new_key[0] = (unsigned char) 1;
208 #else
209     (void) des_string_to_key(pword, (des_cblock *)new_key);
210 #endif
211     bzero(pword, sizeof(pword));
212 }
213
214 static void
215 go_home(str,x)
216   char *str;
217   int x;
218 {
219     fprintf(stderr, str, x);
220     (void) dest_tkt();
221     exit(1);
222 }