kaserver-log-tgtreq-20061206
[openafs.git] / src / kauth / kalog.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /*
11  * ALL RIGHTS RESERVED
12  */
13
14 /*
15  * Routines to log kaserver activity
16  *
17  */
18
19 #include <afsconfig.h>
20 #include <afs/param.h>
21
22 RCSID
23     ("$Header$");
24
25 #include <stdio.h>
26 #include <afs/afsutil.h>
27 #ifdef HAVE_STRING_H
28 #include <string.h>
29 #else
30 #ifdef HAVE_STRINGS_H
31 #include <strings.h>
32 #endif
33 #endif
34 #ifdef HAVE_FCNTL_H
35 #include <fcntl.h>
36 #endif
37 #include <sys/types.h>
38 #include <time.h>
39 #include <signal.h>
40 #include <assert.h>
41 #include <afs/afsutil.h>
42 #include "kauth.h"
43 #include "kalog.h"
44
45 extern afs_int32 verbose_track;
46
47 #ifdef AUTH_DBM_LOG
48
49 DBM *kalog_db;
50
51 kalog_Init()
52 {
53     OpenLog(AFSDIR_SERVER_KALOGDB_FILEPATH);    /* set up logging */
54     SetupLogSignals();
55     kalog_db =
56         dbm_open(AFSDIR_SERVER_KALOG_FILEPATH, O_WRONLY | O_CREAT,
57                  KALOG_DB_MODE);
58     if (!kalog_db)
59         ViceLog(0, ("Cannot open dbm database - no DB logging possible\n"));
60 }
61
62 /* log a ticket usage */
63 void
64 kalog_log(char *principal, char *instance, char *sprincipal, char *sinstance,
65           char *realm, int hostaddr, int type)
66 {
67     char keybuf[512];           /* not random! 63 . 63 , 63 . 63 max key */
68     datum key, data;
69     kalog_elt rdata;
70
71     if (!kalog_db)
72         return;
73     if (*principal)
74         strcpy(keybuf, principal);
75     if (realm) {
76         strcat(keybuf, "@");
77         strcat(keybuf, realm);
78     }
79     if (*instance) {
80         strcat(keybuf, ".");
81         strcat(keybuf, instance);
82     }
83
84     /* unlike the name/instance, the services can come down as NULL */
85     if (sprincipal && *sprincipal) {
86         strcat(keybuf, ",");
87         strcat(keybuf, sprincipal);
88         if (sinstance && *sinstance) {
89             strcat(keybuf, ".");
90             strcat(keybuf, sinstance);
91         }
92     }
93     switch (type) {
94     case LOG_CRUSER:
95         strcat(keybuf, ":cruser");
96         break;
97     case LOG_CHPASSWD:
98         strcat(keybuf, ":chp");
99         break;
100     case LOG_AUTHENTICATE:
101         strcat(keybuf, ":auth");
102         break;
103     case LOG_AUTHFAILED:
104         strcat(keybuf, ":authnot");
105         break;
106     case LOG_SETFIELDS:
107         strcat(keybuf, ":setf");
108         break;
109     case LOG_DELUSER:
110         strcat(keybuf, ":delu");
111         break;
112     case LOG_UNLOCK:
113         strcat(keybuf, ":unlok");
114         break;
115     case LOG_GETTICKET:
116         strcat(keybuf, ":gtck");
117         break;
118     case LOG_TGTREQUEST:
119         strcat(keybuf, ":tgtreq");
120         break;
121     default:
122         break;
123     }
124
125     key.dptr = keybuf;
126     key.dsize = strlen(keybuf) + 1;     /* store the key in a string w/ null */
127     rdata.last_use = time((time_t *) 0);
128     rdata.host = hostaddr;
129     data.dptr = (char *)&rdata;
130     data.dsize = sizeof(kalog_elt);
131
132     dbm_store(kalog_db, key, data, DBM_REPLACE);
133
134     ViceLog(verbose_track, ("%s from %s\n", keybuf, afs_inet_ntoa(hostaddr)));
135 }
136
137
138 #endif /* AUTH_DBM_LOG */
139
140
141 /* log a ticket usage to the text log */
142 void
143 ka_log(char *principal, char *instance, char *sprincipal, char *sinstance,
144        char *realm, int hostaddr, int type)
145 {
146     char logbuf[512];           /* not random! 63 . 63 , 63 . 63 max key */
147
148     if (*principal)
149         strcpy(logbuf, principal);
150     if (realm) {
151         strcat(logbuf, "@");
152         strcat(logbuf, realm);
153     }
154     if (*instance) {
155         strcat(logbuf, ".");
156         strcat(logbuf, instance);
157     }
158
159     /* unlike the name/instance, the services can come down as NULL */
160     if (sprincipal && *sprincipal) {
161         strcat(logbuf, ",");
162         strcat(logbuf, sprincipal);
163         if (sinstance && *sinstance) {
164             strcat(logbuf, ".");
165             strcat(logbuf, sinstance);
166         }
167     }
168     switch (type) {
169     case LOG_CRUSER:
170         strcat(logbuf, ":cruser");
171         break;
172     case LOG_CHPASSWD:
173         strcat(logbuf, ":chp");
174         break;
175     case LOG_AUTHENTICATE:
176         strcat(logbuf, ":auth");
177         break;
178     case LOG_AUTHFAILED:
179         strcat(logbuf, ":authnot");
180         break;
181     case LOG_SETFIELDS:
182         strcat(logbuf, ":setf");
183         break;
184     case LOG_DELUSER:
185         strcat(logbuf, ":delu");
186         break;
187     case LOG_UNLOCK:
188         strcat(logbuf, ":unlok");
189         break;
190     case LOG_GETTICKET:
191         strcat(logbuf, ":gtck");
192         break;
193     case LOG_TGTREQUEST:
194         strcat(logbuf, ":tgtreq");
195         break;
196     default:
197         break;
198     }
199
200     ViceLog(verbose_track, ("%s from %s\n", logbuf, afs_inet_ntoa(hostaddr)));
201 }