1 /* 2 * Copyright (c) 1995 - 1999, 2003 Kungliga Tekniska Högskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 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. 16 * 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. 20 * 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 31 * SUCH DAMAGE. 32 */ 33 34 #include "ftpd_locl.h" 35 36 RCSID("$Id$"); 37 38 #if defined(KRB5) 39 40 int do_destroy_tickets = 1; 41 char *k5ccname; 42 43 #endif 44 45 #ifdef KRB5 46 47 static void 48 dest_cc(void) 49 { 50 krb5_context context; 51 krb5_error_code ret; 52 krb5_ccache id; 53 54 ret = krb5_init_context(&context); 55 if (ret == 0) { 56 if (k5ccname) 57 ret = krb5_cc_resolve(context, k5ccname, &id); 58 else 59 ret = krb5_cc_default (context, &id); 60 if (ret) 61 krb5_free_context(context); 62 } 63 if (ret == 0) { 64 krb5_cc_destroy(context, id); 65 krb5_free_context (context); 66 } 67 } 68 #endif 69 70 #if defined(KRB5) 71 72 /* 73 * Only destroy if we created the tickets 74 */ 75 76 void 77 cond_kdestroy(void) 78 { 79 if (do_destroy_tickets) { 80 #if KRB5 81 dest_cc(); 82 #endif 83 do_destroy_tickets = 0; 84 } 85 afsunlog(); 86 } 87 88 void 89 kdestroy(void) 90 { 91 #if KRB5 92 dest_cc(); 93 #endif 94 afsunlog(); 95 reply(200, "Tickets destroyed"); 96 } 97 98 99 void 100 afslog(const char *cell, int quiet) 101 { 102 if(k_hasafs()) { 103 #ifdef KRB5 104 krb5_context context; 105 krb5_error_code ret; 106 krb5_ccache id; 107 108 ret = krb5_init_context(&context); 109 if (ret == 0) { 110 if (k5ccname) 111 ret = krb5_cc_resolve(context, k5ccname, &id); 112 else 113 ret = krb5_cc_default(context, &id); 114 if (ret) 115 krb5_free_context(context); 116 } 117 if (ret == 0) { 118 krb5_afslog(context, id, cell, 0); 119 krb5_cc_close (context, id); 120 krb5_free_context (context); 121 } 122 #endif 123 if (!quiet) 124 reply(200, "afslog done"); 125 } else { 126 if (!quiet) 127 reply(200, "no AFS present"); 128 } 129 } 130 131 void 132 afsunlog(void) 133 { 134 if(k_hasafs()) 135 k_unlog(); 136 } 137 138 #else 139 int ftpd_afslog_placeholder; 140 #endif /* KRB5 */ 141