1 /*	$NetBSD: rename.c,v 1.1.1.2 2014/04/24 12:45:26 pettai Exp $	*/
2 
3 /*
4  * Copyright (c) 2001-2004 Kungliga Tekniska Högskolan
5  * (Royal Institute of Technology, Stockholm, Sweden).
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * 3. Neither the name of the Institute nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35 
36 #include "ktutil_locl.h"
37 
38 __RCSID("NetBSD");
39 
40 int
kt_rename(struct rename_options * opt,int argc,char ** argv)41 kt_rename(struct rename_options *opt, int argc, char **argv)
42 {
43     krb5_error_code ret = 0;
44     krb5_keytab_entry entry;
45     krb5_keytab keytab;
46     krb5_kt_cursor cursor;
47     krb5_principal from_princ, to_princ;
48 
49     ret = krb5_parse_name(context, argv[0], &from_princ);
50     if(ret != 0) {
51 	krb5_warn(context, ret, "%s", argv[0]);
52 	return 1;
53     }
54 
55     ret = krb5_parse_name(context, argv[1], &to_princ);
56     if(ret != 0) {
57 	krb5_free_principal(context, from_princ);
58 	krb5_warn(context, ret, "%s", argv[1]);
59 	return 1;
60     }
61 
62     if((keytab = ktutil_open_keytab()) == NULL) {
63 	krb5_free_principal(context, from_princ);
64 	krb5_free_principal(context, to_princ);
65 	return 1;
66     }
67 
68     ret = krb5_kt_start_seq_get(context, keytab, &cursor);
69     if(ret) {
70 	krb5_kt_close(context, keytab);
71 	krb5_free_principal(context, from_princ);
72 	krb5_free_principal(context, to_princ);
73 	return 1;
74     }
75     while(1) {
76 	ret = krb5_kt_next_entry(context, keytab, &entry, &cursor);
77 	if(ret != 0) {
78 	    if(ret != KRB5_CC_END && ret != KRB5_KT_END)
79 		krb5_warn(context, ret, "getting entry from keytab");
80 	    else
81 		ret = 0;
82 	    break;
83 	}
84 	if(krb5_principal_compare(context, entry.principal, from_princ)) {
85 	    krb5_free_principal(context, entry.principal);
86 	    entry.principal = to_princ;
87 	    ret = krb5_kt_add_entry(context, keytab, &entry);
88 	    if(ret) {
89 		entry.principal = NULL;
90 		krb5_kt_free_entry(context, &entry);
91 		krb5_warn(context, ret, "adding entry");
92 		break;
93 	    }
94 	    if (opt->delete_flag) {
95 		entry.principal = from_princ;
96 		ret = krb5_kt_remove_entry(context, keytab, &entry);
97 		if(ret) {
98 		    entry.principal = NULL;
99 		    krb5_kt_free_entry(context, &entry);
100 		    krb5_warn(context, ret, "removing entry");
101 		    break;
102 		}
103 	    }
104 	    entry.principal = NULL;
105 	}
106 	krb5_kt_free_entry(context, &entry);
107     }
108     krb5_kt_end_seq_get(context, keytab, &cursor);
109 
110     krb5_free_principal(context, from_princ);
111     krb5_free_principal(context, to_princ);
112 
113     return ret != 0;
114 }
115 
116