2 * Unix SMB/CIFS implementation.
4 * Copyright (C) Volker Lendecke 2004
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
22 #ifdef WITH_FAKE_KASERVER
24 #define NO_ASN1_TYPEDEFS 1
26 #include "system/filesys.h"
28 #include <afs/param.h>
32 #include <afs/venus.h>
33 #include <asm/unistd.h>
34 #include <openssl/des.h>
35 #include <sys/syscall.h>
37 int afs_syscall( int subcall
,
44 return( syscall( SYS_afs_syscall, subcall, path, cmd, cmarg, follow));
48 struct afsprocdata afs_syscall_data
;
49 afs_syscall_data
.syscall
= subcall
;
50 afs_syscall_data
.param1
= (long)path
;
51 afs_syscall_data
.param2
= cmd
;
52 afs_syscall_data
.param3
= (long)cmarg
;
53 afs_syscall_data
.param4
= follow
;
54 proc_afs_file
= open(PROC_SYSCALL_FNAME
, O_RDWR
);
55 if (proc_afs_file
< 0)
56 proc_afs_file
= open(PROC_SYSCALL_ARLA_FNAME
, O_RDWR
);
57 if (proc_afs_file
< 0)
59 errcode
= ioctl(proc_afs_file
, VIOC_SYSCALL
, &afs_syscall_data
);
68 uint32 BeginTimestamp
;
72 static bool afs_decode_token(const char *string
, char **cell
,
73 DATA_BLOB
*ticket
, struct ClearToken
*ct
)
76 struct ClearToken result_ct
;
79 char *s
= SMB_STRDUP(string
);
83 if ((t
= strtok_r(s
, "\n", &saveptr
)) == NULL
) {
84 DEBUG(10, ("strtok_r failed\n"));
88 *cell
= SMB_STRDUP(t
);
90 if ((t
= strtok_r(NULL
, "\n", &saveptr
)) == NULL
) {
91 DEBUG(10, ("strtok_r failed\n"));
95 if (sscanf(t
, "%u", &result_ct
.AuthHandle
) != 1) {
96 DEBUG(10, ("sscanf AuthHandle failed\n"));
100 if ((t
= strtok_r(NULL
, "\n", &saveptr
)) == NULL
) {
101 DEBUG(10, ("strtok_r failed\n"));
105 blob
= base64_decode_data_blob(t
);
107 if ( (blob
.data
== NULL
) ||
108 (blob
.length
!= sizeof(result_ct
.HandShakeKey
) )) {
109 DEBUG(10, ("invalid key: %x/%lu\n", (uint8_t)*blob
.data
,
110 (unsigned long) blob
.length
));
114 memcpy(result_ct
.HandShakeKey
, blob
.data
, blob
.length
);
116 data_blob_free(&blob
);
118 if ((t
= strtok_r(NULL
, "\n", &saveptr
)) == NULL
) {
119 DEBUG(10, ("strtok_r failed\n"));
123 if (sscanf(t
, "%u", &result_ct
.ViceId
) != 1) {
124 DEBUG(10, ("sscanf ViceId failed\n"));
128 if ((t
= strtok_r(NULL
, "\n", &saveptr
)) == NULL
) {
129 DEBUG(10, ("strtok_r failed\n"));
133 if (sscanf(t
, "%u", &result_ct
.BeginTimestamp
) != 1) {
134 DEBUG(10, ("sscanf BeginTimestamp failed\n"));
138 if ((t
= strtok_r(NULL
, "\n", &saveptr
)) == NULL
) {
139 DEBUG(10, ("strtok_r failed\n"));
143 if (sscanf(t
, "%u", &result_ct
.EndTimestamp
) != 1) {
144 DEBUG(10, ("sscanf EndTimestamp failed\n"));
148 if ((t
= strtok_r(NULL
, "\n", &saveptr
)) == NULL
) {
149 DEBUG(10, ("strtok_r failed\n"));
153 blob
= base64_decode_data_blob(t
);
155 if (blob
.data
== NULL
) {
156 DEBUG(10, ("Could not get ticket\n"));
167 Put an AFS token into the Kernel so that it can authenticate against
168 the AFS server. This assumes correct local uid settings.
170 This is currently highly Linux and OpenAFS-specific. The correct API
171 call for this would be ktc_SetToken. But to do that we would have to
172 import a REALLY big bunch of libraries which I would currently like
176 static bool afs_settoken(const char *cell
,
177 const struct ClearToken
*ctok
,
183 uint16 in_size
, out_size
;
190 memcpy(p
, &ticket
.length
, sizeof(uint32
));
192 memcpy(p
, ticket
.data
, ticket
.length
);
195 tmp
= sizeof(struct ClearToken
);
196 memcpy(p
, &tmp
, sizeof(uint32
));
198 memcpy(p
, ctok
, tmp
);
203 memcpy(p
, &tmp
, sizeof(uint32
));
207 if (tmp
>= MAXKTCREALMLEN
) {
208 DEBUG(1, ("Realm too long\n"));
212 strncpy(p
, cell
, tmp
);
218 iob
.in_size
= PTR_DIFF(p
,buf
);
220 iob
.out_size
= sizeof(buf
);
223 file_save("/tmp/ioctlbuf", iob
.in
, iob
.in_size
);
226 ret
= afs_syscall(AFSCALL_PIOCTL
, 0, VIOCSETTOK
, (char *)&iob
, 0);
228 DEBUG(10, ("afs VIOCSETTOK returned %d\n", ret
));
232 bool afs_settoken_str(const char *token_string
)
235 struct ClearToken ct
;
239 if (!afs_decode_token(token_string
, &cell
, &ticket
, &ct
))
242 if (geteuid() != sec_initial_uid())
243 ct
.ViceId
= getuid();
245 result
= afs_settoken(cell
, &ct
, ticket
);
248 data_blob_free(&ticket
);
255 bool afs_settoken_str(const char *token_string
)