1b528cefcSMark Murray /* 2bbd80c28SJacques Vidrine * Copyright (c) 1997-2002 Kungliga Tekniska H�gskolan 3b528cefcSMark Murray * (Royal Institute of Technology, Stockholm, Sweden). 4b528cefcSMark Murray * All rights reserved. 5b528cefcSMark Murray * 6b528cefcSMark Murray * Redistribution and use in source and binary forms, with or without 7b528cefcSMark Murray * modification, are permitted provided that the following conditions 8b528cefcSMark Murray * are met: 9b528cefcSMark Murray * 10b528cefcSMark Murray * 1. Redistributions of source code must retain the above copyright 11b528cefcSMark Murray * notice, this list of conditions and the following disclaimer. 12b528cefcSMark Murray * 13b528cefcSMark Murray * 2. Redistributions in binary form must reproduce the above copyright 14b528cefcSMark Murray * notice, this list of conditions and the following disclaimer in the 15b528cefcSMark Murray * documentation and/or other materials provided with the distribution. 16b528cefcSMark Murray * 17b528cefcSMark Murray * 3. Neither the name of the Institute nor the names of its contributors 18b528cefcSMark Murray * may be used to endorse or promote products derived from this software 19b528cefcSMark Murray * without specific prior written permission. 20b528cefcSMark Murray * 21b528cefcSMark Murray * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22b528cefcSMark Murray * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23b528cefcSMark Murray * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24b528cefcSMark Murray * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25b528cefcSMark Murray * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26b528cefcSMark Murray * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27b528cefcSMark Murray * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28b528cefcSMark Murray * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29b528cefcSMark Murray * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30b528cefcSMark Murray * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31b528cefcSMark Murray * SUCH DAMAGE. 32b528cefcSMark Murray */ 33b528cefcSMark Murray 34b528cefcSMark Murray #include "kadmin_locl.h" 35b528cefcSMark Murray #include <kadm5/private.h> 36b528cefcSMark Murray 37bbd80c28SJacques Vidrine RCSID("$Id: init.c,v 1.29 2002/12/03 14:08:17 joda Exp $"); 38b528cefcSMark Murray 39b528cefcSMark Murray static kadm5_ret_t 40b528cefcSMark Murray create_random_entry(krb5_principal princ, 41b528cefcSMark Murray unsigned max_life, 42b528cefcSMark Murray unsigned max_rlife, 43b528cefcSMark Murray u_int32_t attributes) 44b528cefcSMark Murray { 45b528cefcSMark Murray kadm5_principal_ent_rec ent; 46b528cefcSMark Murray kadm5_ret_t ret; 47b528cefcSMark Murray int mask = 0; 48b528cefcSMark Murray krb5_keyblock *keys; 49b528cefcSMark Murray int n_keys, i; 50b528cefcSMark Murray 51b528cefcSMark Murray memset(&ent, 0, sizeof(ent)); 52b528cefcSMark Murray ent.principal = princ; 53b528cefcSMark Murray mask |= KADM5_PRINCIPAL; 54b528cefcSMark Murray if (max_life) { 55b528cefcSMark Murray ent.max_life = max_life; 56b528cefcSMark Murray mask |= KADM5_MAX_LIFE; 57b528cefcSMark Murray } 58b528cefcSMark Murray if (max_rlife) { 59b528cefcSMark Murray ent.max_renewable_life = max_rlife; 60b528cefcSMark Murray mask |= KADM5_MAX_RLIFE; 61b528cefcSMark Murray } 62b528cefcSMark Murray ent.attributes |= attributes | KRB5_KDB_DISALLOW_ALL_TIX; 63b528cefcSMark Murray mask |= KADM5_ATTRIBUTES; 64b528cefcSMark Murray 65b528cefcSMark Murray ret = kadm5_create_principal(kadm_handle, &ent, mask, "hemlig"); 66b528cefcSMark Murray if(ret) 67b528cefcSMark Murray return ret; 68b528cefcSMark Murray ret = kadm5_randkey_principal(kadm_handle, princ, &keys, &n_keys); 69b528cefcSMark Murray if(ret) 70b528cefcSMark Murray return ret; 71b528cefcSMark Murray for(i = 0; i < n_keys; i++) 72b528cefcSMark Murray krb5_free_keyblock_contents(context, &keys[i]); 73b528cefcSMark Murray free(keys); 74b528cefcSMark Murray ret = kadm5_get_principal(kadm_handle, princ, &ent, 75b528cefcSMark Murray KADM5_PRINCIPAL | KADM5_ATTRIBUTES); 76b528cefcSMark Murray if(ret) 77b528cefcSMark Murray return ret; 78b528cefcSMark Murray ent.attributes &= (~KRB5_KDB_DISALLOW_ALL_TIX); 79b528cefcSMark Murray ent.kvno = 1; 80b528cefcSMark Murray ret = kadm5_modify_principal(kadm_handle, &ent, 81b528cefcSMark Murray KADM5_ATTRIBUTES|KADM5_KVNO); 82b528cefcSMark Murray kadm5_free_principal_ent (kadm_handle, &ent); 83b528cefcSMark Murray if(ret) 84b528cefcSMark Murray return ret; 85b528cefcSMark Murray return 0; 86b528cefcSMark Murray } 87b528cefcSMark Murray 88b528cefcSMark Murray static struct getargs args[] = { 89b528cefcSMark Murray { "realm-max-ticket-life", 0, arg_string, NULL, 90b528cefcSMark Murray "realm max ticket lifetime" }, 91b528cefcSMark Murray { "realm-max-renewable-life", 0, arg_string, NULL, 92b528cefcSMark Murray "realm max renewable lifetime" }, 93bbd80c28SJacques Vidrine { "help", 'h', arg_flag, NULL }, 94b528cefcSMark Murray }; 95b528cefcSMark Murray 96b528cefcSMark Murray static int num_args = sizeof(args) / sizeof(args[0]); 97b528cefcSMark Murray 98b528cefcSMark Murray static void 99b528cefcSMark Murray usage(void) 100b528cefcSMark Murray { 1015e9cd1aeSAssar Westerlund arg_printusage (args, num_args, "init", "realm..."); 102b528cefcSMark Murray } 103b528cefcSMark Murray 104b528cefcSMark Murray int 105b528cefcSMark Murray init(int argc, char **argv) 106b528cefcSMark Murray { 107b528cefcSMark Murray kadm5_ret_t ret; 108b528cefcSMark Murray int i; 109b528cefcSMark Murray char *realm_max_life = NULL; 110b528cefcSMark Murray char *realm_max_rlife = NULL; 111bbd80c28SJacques Vidrine int help_flag = 0; 112b528cefcSMark Murray HDB *db; 113b528cefcSMark Murray int optind = 0; 114b528cefcSMark Murray krb5_deltat max_life, max_rlife; 115b528cefcSMark Murray 116b528cefcSMark Murray args[0].value = &realm_max_life; 117b528cefcSMark Murray args[1].value = &realm_max_rlife; 118bbd80c28SJacques Vidrine args[2].value = &help_flag; 119b528cefcSMark Murray 120bbd80c28SJacques Vidrine if(getarg(args, num_args, argc, argv, &optind) || help_flag) { 121b528cefcSMark Murray usage(); 122b528cefcSMark Murray return 0; 123b528cefcSMark Murray } 124b528cefcSMark Murray 1255e9cd1aeSAssar Westerlund if(argc - optind < 1) { 1265e9cd1aeSAssar Westerlund usage(); 1275e9cd1aeSAssar Westerlund return 0; 1285e9cd1aeSAssar Westerlund } 1295e9cd1aeSAssar Westerlund 130b528cefcSMark Murray if (realm_max_life) { 131b528cefcSMark Murray if (str2deltat (realm_max_life, &max_life) != 0) { 132b528cefcSMark Murray krb5_warnx (context, "unable to parse `%s'", realm_max_life); 133b528cefcSMark Murray return 0; 134b528cefcSMark Murray } 135b528cefcSMark Murray } 136b528cefcSMark Murray if (realm_max_rlife) { 137b528cefcSMark Murray if (str2deltat (realm_max_rlife, &max_rlife) != 0) { 138b528cefcSMark Murray krb5_warnx (context, "unable to parse `%s'", realm_max_rlife); 139b528cefcSMark Murray return 0; 140b528cefcSMark Murray } 141b528cefcSMark Murray } 142b528cefcSMark Murray 143b528cefcSMark Murray db = _kadm5_s_get_db(kadm_handle); 144b528cefcSMark Murray 145b528cefcSMark Murray ret = db->open(context, db, O_RDWR | O_CREAT, 0600); 146b528cefcSMark Murray if(ret){ 147b528cefcSMark Murray krb5_warn(context, ret, "hdb_open"); 148b528cefcSMark Murray return 0; 149b528cefcSMark Murray } 150b528cefcSMark Murray db->close(context, db); 151b528cefcSMark Murray for(i = optind; i < argc; i++){ 152b528cefcSMark Murray krb5_principal princ; 153b528cefcSMark Murray const char *realm = argv[i]; 154b528cefcSMark Murray 155b528cefcSMark Murray /* Create `krbtgt/REALM' */ 156bbd80c28SJacques Vidrine ret = krb5_make_principal(context, &princ, realm, 1575e9cd1aeSAssar Westerlund KRB5_TGS_NAME, realm, NULL); 158bbd80c28SJacques Vidrine if(ret) 159bbd80c28SJacques Vidrine return 0; 160b528cefcSMark Murray if (realm_max_life == NULL) { 161b528cefcSMark Murray max_life = 0; 162bbd80c28SJacques Vidrine if(edit_deltat ("Realm max ticket life", &max_life, NULL, 0)) { 163bbd80c28SJacques Vidrine krb5_free_principal(context, princ); 164bbd80c28SJacques Vidrine return 0; 165bbd80c28SJacques Vidrine } 166b528cefcSMark Murray } 167b528cefcSMark Murray if (realm_max_rlife == NULL) { 168b528cefcSMark Murray max_rlife = 0; 169bbd80c28SJacques Vidrine if(edit_deltat("Realm max renewable ticket life", &max_rlife, 170bbd80c28SJacques Vidrine NULL, 0)) { 171bbd80c28SJacques Vidrine krb5_free_principal(context, princ); 172bbd80c28SJacques Vidrine return 0; 173bbd80c28SJacques Vidrine } 174b528cefcSMark Murray } 175b528cefcSMark Murray create_random_entry(princ, max_life, max_rlife, 0); 176b528cefcSMark Murray krb5_free_principal(context, princ); 177b528cefcSMark Murray 178b528cefcSMark Murray /* Create `kadmin/changepw' */ 179b528cefcSMark Murray krb5_make_principal(context, &princ, realm, 180b528cefcSMark Murray "kadmin", "changepw", NULL); 181b528cefcSMark Murray create_random_entry(princ, 5*60, 5*60, 182b528cefcSMark Murray KRB5_KDB_DISALLOW_TGT_BASED| 183b528cefcSMark Murray KRB5_KDB_PWCHANGE_SERVICE| 184b528cefcSMark Murray KRB5_KDB_DISALLOW_POSTDATED| 185b528cefcSMark Murray KRB5_KDB_DISALLOW_FORWARDABLE| 186b528cefcSMark Murray KRB5_KDB_DISALLOW_RENEWABLE| 187b528cefcSMark Murray KRB5_KDB_DISALLOW_PROXIABLE| 188b528cefcSMark Murray KRB5_KDB_REQUIRES_PRE_AUTH); 189b528cefcSMark Murray krb5_free_principal(context, princ); 190b528cefcSMark Murray 191b528cefcSMark Murray /* Create `kadmin/admin' */ 192b528cefcSMark Murray krb5_make_principal(context, &princ, realm, 193b528cefcSMark Murray "kadmin", "admin", NULL); 194b528cefcSMark Murray create_random_entry(princ, 60*60, 60*60, KRB5_KDB_REQUIRES_PRE_AUTH); 195b528cefcSMark Murray krb5_free_principal(context, princ); 196b528cefcSMark Murray 197b528cefcSMark Murray /* Create `changepw/kerberos' (for v4 compat) */ 198b528cefcSMark Murray krb5_make_principal(context, &princ, realm, 199b528cefcSMark Murray "changepw", "kerberos", NULL); 2005e9cd1aeSAssar Westerlund create_random_entry(princ, 60*60, 60*60, 2015e9cd1aeSAssar Westerlund KRB5_KDB_DISALLOW_TGT_BASED| 2025e9cd1aeSAssar Westerlund KRB5_KDB_PWCHANGE_SERVICE); 2035e9cd1aeSAssar Westerlund 2045e9cd1aeSAssar Westerlund krb5_free_principal(context, princ); 2055e9cd1aeSAssar Westerlund 2065e9cd1aeSAssar Westerlund /* Create `kadmin/hprop' for database propagation */ 2075e9cd1aeSAssar Westerlund krb5_make_principal(context, &princ, realm, 2085e9cd1aeSAssar Westerlund "kadmin", "hprop", NULL); 2095e9cd1aeSAssar Westerlund create_random_entry(princ, 60*60, 60*60, 2105e9cd1aeSAssar Westerlund KRB5_KDB_REQUIRES_PRE_AUTH| 2115e9cd1aeSAssar Westerlund KRB5_KDB_DISALLOW_TGT_BASED); 212b528cefcSMark Murray krb5_free_principal(context, princ); 213b528cefcSMark Murray 214b528cefcSMark Murray /* Create `default' */ 215b528cefcSMark Murray { 216b528cefcSMark Murray kadm5_principal_ent_rec ent; 217b528cefcSMark Murray int mask = 0; 218b528cefcSMark Murray 219b528cefcSMark Murray memset (&ent, 0, sizeof(ent)); 220b528cefcSMark Murray mask |= KADM5_PRINCIPAL; 221b528cefcSMark Murray krb5_make_principal(context, &ent.principal, realm, 222b528cefcSMark Murray "default", NULL); 223b528cefcSMark Murray mask |= KADM5_MAX_LIFE; 224b528cefcSMark Murray ent.max_life = 24 * 60 * 60; 225b528cefcSMark Murray mask |= KADM5_MAX_RLIFE; 226b528cefcSMark Murray ent.max_renewable_life = 7 * ent.max_life; 227b528cefcSMark Murray ent.attributes = KRB5_KDB_DISALLOW_ALL_TIX; 228b528cefcSMark Murray mask |= KADM5_ATTRIBUTES; 229b528cefcSMark Murray 230b528cefcSMark Murray ret = kadm5_create_principal(kadm_handle, &ent, mask, ""); 231b528cefcSMark Murray if (ret) 232b528cefcSMark Murray krb5_err (context, 1, ret, "kadm5_create_principal"); 233b528cefcSMark Murray 234b528cefcSMark Murray krb5_free_principal(context, ent.principal); 235b528cefcSMark Murray } 236b528cefcSMark Murray } 237b528cefcSMark Murray return 0; 238b528cefcSMark Murray } 239