pull-prototypes-to-head-20020821
[openafs.git] / src / log / kseal.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 #include <afsconfig.h>
11 #include <afs/param.h>
12
13 RCSID("$Header$");
14
15 #include <sys/types.h>
16 #include <netinet/in.h>
17 #ifdef  AFS_AIX32_ENV
18 #include <signal.h>
19 #endif
20
21 #ifdef HAVE_STRING_H
22 #include <string.h>
23 #else
24 #ifdef HAVE_STRINGS_H
25 #include <strings.h>
26 #endif
27 #endif
28
29 #include <afs/cellconfig.h>
30 #include <afs/afsutil.h>
31 #include <afs/auth.h>
32 #include <rx/xdr.h>
33 #include <rx/rx.h>
34 #include <des.h>
35 #include <rx/rxkad.h>
36
37 #include "AFS_component_version_number.c"
38
39 main(argc, argv)
40 int argc;
41 char **argv; {
42     struct ktc_token token;
43     struct ktc_principal sname;
44     register afs_int32 code;
45     struct afsconf_dir *dir;
46     afs_int32 now;
47     char skey[9];
48     char cellName[MAXKTCNAMELEN];
49     char session[8];
50
51 #ifdef  AFS_AIX32_ENV
52     /*
53      * The following signal action for AIX is necessary so that in case of a 
54      * crash (i.e. core is generated) we can include the user's data section 
55      * in the core dump. Unfortunately, by default, only a partial core is
56      * generated which, in many cases, isn't too useful.
57      */
58     struct sigaction nsa;
59     
60     sigemptyset(&nsa.sa_mask);
61     nsa.sa_handler = SIG_DFL;
62     nsa.sa_flags = SA_FULLDUMP;
63     sigaction(SIGSEGV, &nsa, NULL);
64 #endif
65     if (argc != 3) {
66         printf("kseal: usage is 'kseal <username> <server key>\n");
67         exit(1);
68     }
69
70     /* lookup configuration info */
71     dir = afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH);
72     if (!dir) {
73         printf("kseal: can't open config dir (%s)\n", AFSDIR_CLIENT_ETC_DIRPATH);
74         exit(1);
75     }
76     code = afsconf_GetLocalCell(dir, cellName, sizeof(cellName));
77     if (code) {
78         printf("kseal: failed to get local cell name, code %d\n", code);
79         exit(1);
80     }
81
82     /* setup key for sealing */
83     string_to_key(argv[2], skey);
84
85     now = time(0);
86     memcpy(session, &now, 4);   /* but this is only a test pgm */
87     memcpy(session+4, &now, 4);
88     code = tkt_MakeTicket(token.ticket, &token.ticketLen, skey, argv[1], "", cellName,
89         now-300, now+25*3600, session, /* host */ 0, "afs", "");
90     if (code) {
91         printf("kseal: could not seal ticket, code %d!\n", code);
92         exit(1);
93     }
94     
95     /* now send the ticket to the ticket cache */
96     strcpy(sname.name, "afs");
97     strcpy(sname.instance, "");
98     strcpy(sname.cell, cellName);
99     token.startTime = 0;
100     token.endTime = 0x7fffffff;
101     memcpy(&token.sessionKey, session, 8);
102     token.kvno = 0;
103     code = ktc_SetToken (&sname, &token, NULL, 0);
104     if (code) {
105         printf("kseal: could not install newly-sealed ticket, code %d\n", code);
106         exit(1);
107     }
108
109     /* all done */
110     afsconf_Close(dir);
111     exit(0);
112 }