155682Smarkm/*
2233294Sstas * Copyright (c) 1995 - 1999, 2003 Kungliga Tekniska H��gskolan
355682Smarkm * (Royal Institute of Technology, Stockholm, Sweden).
455682Smarkm * All rights reserved.
5233294Sstas *
655682Smarkm * Redistribution and use in source and binary forms, with or without
755682Smarkm * modification, are permitted provided that the following conditions
855682Smarkm * are met:
9233294Sstas *
1055682Smarkm * 1. Redistributions of source code must retain the above copyright
1155682Smarkm *    notice, this list of conditions and the following disclaimer.
12233294Sstas *
1355682Smarkm * 2. Redistributions in binary form must reproduce the above copyright
1455682Smarkm *    notice, this list of conditions and the following disclaimer in the
1555682Smarkm *    documentation and/or other materials provided with the distribution.
16233294Sstas *
1755682Smarkm * 3. Neither the name of the Institute nor the names of its contributors
1855682Smarkm *    may be used to endorse or promote products derived from this software
1955682Smarkm *    without specific prior written permission.
20233294Sstas *
2155682Smarkm * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
2255682Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2355682Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2455682Smarkm * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
2555682Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2655682Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2755682Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2855682Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2955682Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3055682Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3155682Smarkm * SUCH DAMAGE.
3255682Smarkm */
3355682Smarkm
3455682Smarkm#include "ftpd_locl.h"
3555682Smarkm
36233294SstasRCSID("$Id$");
3755682Smarkm
38233294Sstas#if defined(KRB5)
39178825Sdfr
40178825Sdfrint do_destroy_tickets = 1;
41178825Sdfrchar *k5ccname;
42178825Sdfr
43178825Sdfr#endif
44178825Sdfr
45178825Sdfr#ifdef KRB5
4655682Smarkm
47178825Sdfrstatic void
48178825Sdfrdest_cc(void)
49178825Sdfr{
50178825Sdfr    krb5_context context;
51178825Sdfr    krb5_error_code ret;
52178825Sdfr    krb5_ccache id;
53233294Sstas
54178825Sdfr    ret = krb5_init_context(&context);
55178825Sdfr    if (ret == 0) {
56178825Sdfr	if (k5ccname)
57178825Sdfr	    ret = krb5_cc_resolve(context, k5ccname, &id);
5855682Smarkm	else
59178825Sdfr	    ret = krb5_cc_default (context, &id);
60178825Sdfr	if (ret)
61178825Sdfr	    krb5_free_context(context);
6255682Smarkm    }
63178825Sdfr    if (ret == 0) {
64178825Sdfr	krb5_cc_destroy(context, id);
65178825Sdfr	krb5_free_context (context);
6655682Smarkm    }
6755682Smarkm}
68178825Sdfr#endif
6955682Smarkm
70233294Sstas#if defined(KRB5)
71178825Sdfr
7255682Smarkm/*
7355682Smarkm * Only destroy if we created the tickets
7455682Smarkm */
7555682Smarkm
7655682Smarkmvoid
7755682Smarkmcond_kdestroy(void)
7855682Smarkm{
79178825Sdfr    if (do_destroy_tickets) {
80178825Sdfr#if KRB5
81178825Sdfr	dest_cc();
82178825Sdfr#endif
83178825Sdfr	do_destroy_tickets = 0;
84178825Sdfr    }
8555682Smarkm    afsunlog();
8655682Smarkm}
8755682Smarkm
8855682Smarkmvoid
8955682Smarkmkdestroy(void)
9055682Smarkm{
91178825Sdfr#if KRB5
92178825Sdfr    dest_cc();
93178825Sdfr#endif
9455682Smarkm    afsunlog();
9555682Smarkm    reply(200, "Tickets destroyed");
9655682Smarkm}
9755682Smarkm
9855682Smarkm
9955682Smarkmvoid
100178825Sdfrafslog(const char *cell, int quiet)
10155682Smarkm{
10255682Smarkm    if(k_hasafs()) {
103178825Sdfr#ifdef KRB5
104178825Sdfr	krb5_context context;
105178825Sdfr	krb5_error_code ret;
106178825Sdfr	krb5_ccache id;
107178825Sdfr
108178825Sdfr	ret = krb5_init_context(&context);
109178825Sdfr	if (ret == 0) {
110178825Sdfr	    if (k5ccname)
111178825Sdfr		ret = krb5_cc_resolve(context, k5ccname, &id);
112178825Sdfr	    else
113178825Sdfr		ret = krb5_cc_default(context, &id);
114178825Sdfr	    if (ret)
115178825Sdfr		krb5_free_context(context);
116178825Sdfr	}
117178825Sdfr	if (ret == 0) {
118178825Sdfr	    krb5_afslog(context, id, cell, 0);
119178825Sdfr	    krb5_cc_close (context, id);
120178825Sdfr	    krb5_free_context (context);
121178825Sdfr	}
122178825Sdfr#endif
123178825Sdfr	if (!quiet)
124178825Sdfr	    reply(200, "afslog done");
12555682Smarkm    } else {
126178825Sdfr	if (!quiet)
127178825Sdfr	    reply(200, "no AFS present");
12855682Smarkm    }
12955682Smarkm}
13055682Smarkm
13155682Smarkmvoid
13255682Smarkmafsunlog(void)
13355682Smarkm{
13455682Smarkm    if(k_hasafs())
13555682Smarkm	k_unlog();
13655682Smarkm}
137178825Sdfr
138178825Sdfr#else
139178825Sdfrint ftpd_afslog_placeholder;
140233294Sstas#endif /* KRB5 */
141