190926Snectar/* 2233294Sstas * Copyright (c) 2001-2004 Kungliga Tekniska H��gskolan 3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden). 4233294Sstas * All rights reserved. 590926Snectar * 6233294Sstas * Redistribution and use in source and binary forms, with or without 7233294Sstas * modification, are permitted provided that the following conditions 8233294Sstas * are met: 990926Snectar * 10233294Sstas * 1. Redistributions of source code must retain the above copyright 11233294Sstas * notice, this list of conditions and the following disclaimer. 1290926Snectar * 13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright 14233294Sstas * notice, this list of conditions and the following disclaimer in the 15233294Sstas * documentation and/or other materials provided with the distribution. 1690926Snectar * 17233294Sstas * 3. Neither the name of the Institute nor the names of its contributors 18233294Sstas * may be used to endorse or promote products derived from this software 19233294Sstas * without specific prior written permission. 2090926Snectar * 21233294Sstas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24233294Sstas * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25233294Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26233294Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27233294Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28233294Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31233294Sstas * SUCH DAMAGE. 3290926Snectar */ 3390926Snectar 3490926Snectar#include "ktutil_locl.h" 3590926Snectar 36233294SstasRCSID("$Id$"); 3790926Snectar 3890926Snectarint 39233294Sstaskt_rename(struct rename_options *opt, int argc, char **argv) 4090926Snectar{ 4190926Snectar krb5_error_code ret = 0; 4290926Snectar krb5_keytab_entry entry; 4390926Snectar krb5_keytab keytab; 4490926Snectar krb5_kt_cursor cursor; 4590926Snectar krb5_principal from_princ, to_princ; 4690926Snectar 4790926Snectar ret = krb5_parse_name(context, argv[0], &from_princ); 4890926Snectar if(ret != 0) { 4990926Snectar krb5_warn(context, ret, "%s", argv[0]); 50178825Sdfr return 1; 5190926Snectar } 5290926Snectar 5390926Snectar ret = krb5_parse_name(context, argv[1], &to_princ); 5490926Snectar if(ret != 0) { 5590926Snectar krb5_free_principal(context, from_princ); 5690926Snectar krb5_warn(context, ret, "%s", argv[1]); 57178825Sdfr return 1; 5890926Snectar } 5990926Snectar 6090926Snectar if((keytab = ktutil_open_keytab()) == NULL) { 6190926Snectar krb5_free_principal(context, from_princ); 6290926Snectar krb5_free_principal(context, to_princ); 6390926Snectar return 1; 6490926Snectar } 6590926Snectar 6690926Snectar ret = krb5_kt_start_seq_get(context, keytab, &cursor); 6790926Snectar if(ret) { 6890926Snectar krb5_kt_close(context, keytab); 6990926Snectar krb5_free_principal(context, from_princ); 7090926Snectar krb5_free_principal(context, to_princ); 7190926Snectar return 1; 7290926Snectar } 7390926Snectar while(1) { 7490926Snectar ret = krb5_kt_next_entry(context, keytab, &entry, &cursor); 7590926Snectar if(ret != 0) { 7690926Snectar if(ret != KRB5_CC_END && ret != KRB5_KT_END) 7790926Snectar krb5_warn(context, ret, "getting entry from keytab"); 78178825Sdfr else 79178825Sdfr ret = 0; 8090926Snectar break; 8190926Snectar } 8290926Snectar if(krb5_principal_compare(context, entry.principal, from_princ)) { 8390926Snectar krb5_free_principal(context, entry.principal); 8490926Snectar entry.principal = to_princ; 8590926Snectar ret = krb5_kt_add_entry(context, keytab, &entry); 8690926Snectar if(ret) { 8790926Snectar entry.principal = NULL; 8890926Snectar krb5_kt_free_entry(context, &entry); 8990926Snectar krb5_warn(context, ret, "adding entry"); 9090926Snectar break; 9190926Snectar } 92233294Sstas if (opt->delete_flag) { 93233294Sstas entry.principal = from_princ; 94233294Sstas ret = krb5_kt_remove_entry(context, keytab, &entry); 95233294Sstas if(ret) { 96233294Sstas entry.principal = NULL; 97233294Sstas krb5_kt_free_entry(context, &entry); 98233294Sstas krb5_warn(context, ret, "removing entry"); 99233294Sstas break; 100233294Sstas } 10190926Snectar } 10290926Snectar entry.principal = NULL; 10390926Snectar } 10490926Snectar krb5_kt_free_entry(context, &entry); 10590926Snectar } 10690926Snectar krb5_kt_end_seq_get(context, keytab, &cursor); 10790926Snectar 10890926Snectar krb5_free_principal(context, from_princ); 10990926Snectar krb5_free_principal(context, to_princ); 11090926Snectar 111178825Sdfr return ret != 0; 11290926Snectar} 11390926Snectar 114