2 * Copyright (c) 1997-2006 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the Institute nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 #include "kadmin_locl.h"
35 #include "kadmin-commands.h"
38 * fetch the default principal corresponding to `princ'
41 static krb5_error_code
42 get_default (kadm5_server_context
*contextp
,
44 kadm5_principal_ent_t default_ent
)
47 krb5_principal def_principal
;
48 krb5_const_realm realm
= krb5_principal_get_realm(contextp
->context
, princ
);
50 ret
= krb5_make_principal (contextp
->context
, &def_principal
,
51 realm
, "default", NULL
);
54 ret
= kadm5_get_principal (contextp
, def_principal
, default_ent
,
55 KADM5_PRINCIPAL_NORMAL_MASK
);
56 krb5_free_principal (contextp
->context
, def_principal
);
61 * Add the principal `name' to the database.
62 * Prompt for all data not given by the input parameters.
65 static krb5_error_code
66 add_one_principal (const char *name
,
72 krb5_key_data
*key_data
,
73 const char *max_ticket_life
,
74 const char *max_renewable_life
,
75 const char *attributes
,
76 const char *expiration
,
77 const char *pw_expiration
)
80 kadm5_principal_ent_rec princ
, defrec
;
81 kadm5_principal_ent_rec
*default_ent
= NULL
;
82 krb5_principal princ_ent
= NULL
;
87 memset(&princ
, 0, sizeof(princ
));
88 ret
= krb5_parse_name(context
, name
, &princ_ent
);
90 krb5_warn(context
, ret
, "krb5_parse_name");
93 princ
.principal
= princ_ent
;
94 mask
|= KADM5_PRINCIPAL
;
96 ret
= set_entry(context
, &princ
, &mask
,
97 max_ticket_life
, max_renewable_life
,
98 expiration
, pw_expiration
, attributes
, policy
);
102 default_ent
= &defrec
;
103 ret
= get_default (kadm_handle
, princ_ent
, default_ent
);
108 default_mask
= KADM5_ATTRIBUTES
| KADM5_MAX_LIFE
| KADM5_MAX_RLIFE
|
109 KADM5_PRINC_EXPIRE_TIME
| KADM5_PW_EXPIRATION
;
113 set_defaults(&princ
, &mask
, default_ent
, default_mask
);
115 if(edit_entry(&princ
, &mask
, default_ent
, default_mask
))
117 if(rand_key
|| key_data
) {
118 princ
.attributes
|= KRB5_KDB_DISALLOW_ALL_TIX
;
119 mask
|= KADM5_ATTRIBUTES
;
120 random_password (pwbuf
, sizeof(pwbuf
));
122 } else if (rand_password
) {
123 random_password (pwbuf
, sizeof(pwbuf
));
125 } else if(password
== NULL
) {
130 ret
= krb5_unparse_name(context
, princ_ent
, &princ_name
);
133 aret
= asprintf (&prompt
, "%s's Password: ", princ_name
);
137 krb5_set_error_message(context
, ret
, "out of memory");
140 ret
= UI_UTIL_read_pw_string (pwbuf
, sizeof(pwbuf
), prompt
, 1);
143 ret
= KRB5_LIBOS_BADPWDMATCH
;
144 krb5_set_error_message(context
, ret
, "failed to verify password");
150 ret
= kadm5_create_principal(kadm_handle
, &princ
, mask
, password
);
152 krb5_warn(context
, ret
, "kadm5_create_principal");
156 krb5_keyblock
*new_keys
;
158 ret
= kadm5_randkey_principal(kadm_handle
, princ_ent
,
161 krb5_warn(context
, ret
, "kadm5_randkey_principal");
164 for(i
= 0; i
< n_keys
; i
++)
165 krb5_free_keyblock_contents(context
, &new_keys
[i
]);
168 kadm5_get_principal(kadm_handle
, princ_ent
, &princ
,
169 KADM5_PRINCIPAL
| KADM5_KVNO
| KADM5_ATTRIBUTES
);
170 princ
.attributes
&= (~KRB5_KDB_DISALLOW_ALL_TIX
);
172 * Updating kvno w/o key data and vice-versa gives _kadm5_setup_entry()
173 * and _kadm5_set_keys2() headaches. But we used to, so we handle
174 * this in in those two functions. Might as well leave this code as
178 kadm5_modify_principal(kadm_handle
, &princ
,
179 KADM5_ATTRIBUTES
| KADM5_KVNO
);
180 } else if (key_data
) {
181 ret
= kadm5_chpass_principal_with_key (kadm_handle
, princ_ent
,
184 krb5_warn(context
, ret
, "kadm5_chpass_principal_with_key");
186 kadm5_get_principal(kadm_handle
, princ_ent
, &princ
,
187 KADM5_PRINCIPAL
| KADM5_ATTRIBUTES
);
188 princ
.attributes
&= (~KRB5_KDB_DISALLOW_ALL_TIX
);
189 kadm5_modify_principal(kadm_handle
, &princ
, KADM5_ATTRIBUTES
);
190 } else if (rand_password
) {
193 krb5_unparse_name(context
, princ_ent
, &princ_name
);
194 printf ("added %s with password \"%s\"\n", princ_name
, password
);
198 kadm5_free_principal_ent(kadm_handle
, &princ
); /* frees princ_ent */
200 kadm5_free_principal_ent (kadm_handle
, default_ent
);
201 if (password
!= NULL
)
202 memset (password
, 0, strlen(password
));
207 * parse the string `key_string' into `key', returning 0 iff succesful.
215 * Parse arguments and add all the principals.
219 add_new_key(struct add_options
*opt
, int argc
, char **argv
)
221 krb5_error_code ret
= 0;
224 krb5_key_data key_data
[3];
225 krb5_key_data
*kdp
= NULL
;
228 if (opt
->random_key_flag
)
230 if (opt
->random_password_flag
)
232 if (opt
->password_string
)
238 fprintf (stderr
, "give only one of "
239 "--random-key, --random-password, --password, --key\n");
243 if (opt
->key_string
) {
246 if (parse_des_key (opt
->key_string
, key_data
, &error
)) {
247 fprintf (stderr
, "failed parsing key \"%s\": %s\n",
248 opt
->key_string
, error
);
254 for(i
= 0; i
< argc
; i
++) {
255 ret
= add_one_principal (argv
[i
],
256 opt
->random_key_flag
,
257 opt
->random_password_flag
,
258 opt
->use_defaults_flag
,
259 opt
->password_string
,
262 opt
->max_ticket_life_string
,
263 opt
->max_renewable_life_string
,
264 opt
->attributes_string
,
265 opt
->expiration_time_string
,
266 opt
->pw_expiration_time_string
);
268 krb5_warn (context
, ret
, "adding %s", argv
[i
]);
274 kadm5_free_key_data (kadm_handle
, &dummy
, key_data
);