0.0k
[heimdal.git] / admin / init.c
blob1f4165200b4fd8febdbe7a9b8aeefb060e5276f8
1 /*
2 * Copyright (c) 1997 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
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. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed by Kungliga Tekniska
20 * Högskolan and its contributors.
22 * 4. Neither the name of the Institute nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
39 #include "admin_locl.h"
41 RCSID("$Id$");
43 int
44 init(int argc, char **argv)
46 krb5_error_code ret;
47 int i;
49 int default_life = 86400;
50 int default_renew = 5 * 86400;
51 int max_life = 0;
52 int max_renew = 0;
54 hdb_entry ent;
56 ret = db->open(context, db, O_RDWR | O_CREAT, 0600);
57 if(ret){
58 krb5_warn(context, ret, "hdb_open");
59 return 0;
61 memset(&ent, 0, sizeof(ent));
62 for(i = 1; i < argc; i++){
63 krb5_build_principal(context, &ent.principal,
64 strlen(argv[i]), argv[i],
65 "krbtgt",
66 argv[i],
67 NULL);
68 ret = db->fetch(context, db, &ent);
69 switch(ret){
70 case 0:
71 krb5_warnx(context, "Entry already exists");
72 krb5_free_principal(context, ent.principal);
73 continue;
74 case HDB_ERR_NOENTRY:
75 break;
76 default:
77 krb5_warn(context, ret, "hdb_fetch");
78 db->close(context, db);
79 return 0;
82 max_life = getlife("Realm max ticket life", "infinite");
83 max_renew = getlife("Realm max renewable ticket life", "infinite");
84 default_life = getlife("Default ticket life", "1 day");
85 default_renew = getlife("Default renewable ticket life", "7 days");
87 /* Create `krbtgt/REALM' */
88 init_des_key(&ent);
89 ent.kvno = 1;
90 if(max_life){
91 ent.max_life = malloc(sizeof(*ent.max_life));
92 *ent.max_life = max_life;
94 if(max_renew){
95 ent.max_renew = malloc(sizeof(*ent.max_renew));
96 *ent.max_renew = max_renew;
98 ent.created_by.time = time(NULL);
99 krb5_build_principal(context, &ent.created_by.principal,
100 strlen(argv[i]), argv[i],
101 "kadmin",
102 NULL);
103 ent.flags.forwardable = 1;
104 ent.flags.proxiable = 1;
105 ent.flags.renewable = 1;
106 ent.flags.postdate = 1;
107 ent.flags.server = 1;
108 db->store(context, db, 1, &ent);
109 hdb_free_entry(context, &ent);
111 /* Create `default' */
112 memset(&ent, 0, sizeof(ent));
113 krb5_build_principal(context, &ent.principal,
114 strlen(argv[i]), argv[i],
115 "default",
116 NULL);
117 if(default_life){
118 ent.max_life = malloc(sizeof(*ent.max_life));
119 *ent.max_life = default_life;
121 if(default_renew){
122 ent.max_renew = malloc(sizeof(*ent.max_renew));
123 *ent.max_renew = default_renew;
125 ent.created_by.time = time(NULL);
126 krb5_build_principal(context, &ent.created_by.principal,
127 strlen(argv[i]), argv[i],
128 "kadmin",
129 NULL);
130 ent.flags.invalid = 1;
131 db->store(context, db, 1, &ent);
132 hdb_free_entry(context, &ent);
134 /* Create `kadmin/changepw' */
135 memset(&ent, 0, sizeof(ent));
136 init_des_key(&ent);
137 ent.kvno = 1;
138 krb5_build_principal(context, &ent.principal,
139 strlen(argv[i]), argv[i],
140 "kadmin",
141 "changepw",
142 NULL);
143 if(default_life){
144 ent.max_life = malloc(sizeof(*ent.max_life));
145 *ent.max_life = default_life;
147 if(default_renew){
148 ent.max_renew = malloc(sizeof(*ent.max_renew));
149 *ent.max_renew = default_renew;
151 ent.created_by.time = time(NULL);
152 krb5_build_principal(context, &ent.created_by.principal,
153 strlen(argv[i]), argv[i],
154 "kadmin",
155 NULL);
156 ent.flags.initial = 1;
157 ent.flags.server = 1;
158 ent.flags.change_pw = 1;
159 db->store(context, db, 1, &ent);
160 hdb_free_entry(context, &ent);
162 db->close(context, db);
163 return 0;