death to register
[openafs.git] / src / libacl / test / acltest.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         Information Technology Center
12         Carnegie-Mellon University
13 */
14
15 #include <afsconfig.h>
16 #include <afs/param.h>
17
18
19 #include <sys/types.h>
20 #ifdef AFS_NT40_ENV
21 #include <winsock2.h>
22 #else
23 #include <netinet/in.h>
24 #endif
25 #include <stdio.h>
26 #include <rx/xdr.h>
27 #include <rx/rx.h>
28 #include <ptclient.h>
29 #include "acl.h"
30 #include "prs_fs.h"
31
32
33 struct acl_accessList *aclstore[20];
34 char *externalstore[20];
35
36 int
37 PRights(arights)
38      long arights;
39 {
40     if (arights & PRSFS_READ)
41         printf("r");
42     if (arights & PRSFS_LOOKUP)
43         printf("l");
44     if (arights & PRSFS_INSERT)
45         printf("i");
46     if (arights & PRSFS_DELETE)
47         printf("d");
48     if (arights & PRSFS_WRITE)
49         printf("w");
50     if (arights & PRSFS_LOCK)
51         printf("k");
52     if (arights & PRSFS_ADMINISTER)
53         printf("a");
54 }
55
56 long
57 Convert(arights)
58      char *arights;
59 {
60     int i, len;
61     long mode;
62     char tc;
63     if (!strcmp(arights, "read"))
64         return PRSFS_READ | PRSFS_LOOKUP;
65     if (!strcmp(arights, "write"))
66         return PRSFS_READ | PRSFS_LOOKUP | PRSFS_INSERT | PRSFS_DELETE |
67             PRSFS_WRITE | PRSFS_LOCK;
68     if (!strcmp(arights, "mail"))
69         return PRSFS_INSERT | PRSFS_LOCK | PRSFS_LOOKUP;
70     if (!strcmp(arights, "all"))
71         return PRSFS_READ | PRSFS_LOOKUP | PRSFS_INSERT | PRSFS_DELETE |
72             PRSFS_WRITE | PRSFS_LOCK | PRSFS_ADMINISTER;
73     if (!strcmp(arights, "none"))
74         return 0;
75     len = strlen(arights);
76     mode = 0;
77     for (i = 0; i < len; i++) {
78         tc = *arights++;
79         if (tc == 'r')
80             mode |= PRSFS_READ;
81         else if (tc == 'l')
82             mode |= PRSFS_LOOKUP;
83         else if (tc == 'i')
84             mode |= PRSFS_INSERT;
85         else if (tc == 'd')
86             mode |= PRSFS_DELETE;
87         else if (tc == 'w')
88             mode |= PRSFS_WRITE;
89         else if (tc == 'k')
90             mode |= PRSFS_LOCK;
91         else if (tc == 'a')
92             mode |= PRSFS_ADMINISTER;
93         else {
94             printf("Bogus rights character '%c'.\n", tc);
95             exit(1);
96         }
97     }
98     return mode;
99 }
100
101
102
103 main()
104 {
105     long code;
106
107     char op[3];
108     char name[64];
109     char rights[10];
110     long which;
111     long n, p;
112     long realrights;
113     long i, j;
114     char *ptr;
115     char *tptr;
116     long size;
117     idlist ids;
118     namelist names;
119     prlist cps;
120
121     struct acl_accessList *alist;
122     char foo[200];
123
124     code = pr_Initialize(0, "/usr/afs/etc", 0);
125     if (code) {
126         fprintf(stderr, "Couldn't initialize wrt to protection server.\n");
127         exit(1);
128     }
129     for (i = 0; i < 20; i++) {
130         externalstore[i] = NULL;
131         aclstore[i] = NULL;
132     }
133
134     printf("acl> ");
135     while (1) {
136         scanf("%s", op);
137         if (!strcmp(op, "q"))
138             exit(2);
139         else if (!strcmp(op, "ex")) {
140             scanf("%d", &which);
141             if (aclstore[which] == NULL) {
142                 printf("No internal acl in %d.\n", which);
143                 printf("acl> ");
144                 continue;
145             }
146             if (externalstore[which] != NULL) {
147                 code = acl_FreeExternalACL(&externalstore[which]);
148                 if (code) {
149                     printf("Couldn't free current ACL.\n");
150                     printf("acl> ");
151                     continue;
152                 }
153             }
154             code = acl_Externalize(aclstore[which], &externalstore[which]);
155             if (code)
156                 printf("Couldn't externalize -- code is %d.\n", code);
157         } else if (!strcmp(op, "in")) {
158             scanf("%d", &which);
159             if (externalstore[which] == NULL) {
160                 printf("No external acl in %d.\n", which);
161                 printf("acl> ");
162                 continue;
163             }
164             if (aclstore[which] != NULL) {
165                 code = acl_FreeACL(&aclstore[which]);
166                 if (code) {
167                     printf("Couldn't free current ACL.\n");
168                     printf("acl> ");
169                     continue;
170                 }
171             }
172             code = acl_Internalize(externalstore[which], &aclstore[which]);
173             if (code)
174                 printf("Couldn't internalize. Code is %d\n", code);
175         } else if (!strcmp(op, "sa")) {
176             scanf("%d %s %s", &which, name, rights);
177             realrights = (long)Convert(rights);
178             if (externalstore[which] != NULL) {
179                 /* we're adding to access list */
180                 size = strlen(externalstore[which]);
181                 ptr = (char *)malloc(size);
182                 sscanf(externalstore[which], "%d\n%d\n", &p, &n);
183                 strncpy(ptr, externalstore[which], size);
184                 p++;
185                 free(externalstore[which]);
186                 code = acl_NewExternalACL((p + n), &externalstore[which]);
187                 if (code) {
188                     printf("Couldn't allocate external list.\n");
189                     exit(2);
190                 }
191                 sprintf(externalstore[which], "%d", p);
192                 tptr = externalstore[which] + 1;
193                 ptr++;
194                 sprintf(tptr, "%s", ptr);
195                 ptr = externalstore[which] + size;
196                 sprintf(ptr, "%s\t%d\n", name, realrights);
197             } else {
198                 /* new external list */
199                 code = acl_NewExternalACL(1, &externalstore[which]);
200                 if (code) {
201                     printf("Couldn't allocate external list.\n");
202                     exit(2);
203                 }
204                 p = 1;
205                 n = 0;
206                 sprintf(externalstore[which], "%d\n%d\n%s\t%d\n", p, n, name,
207                         realrights);
208             }
209         } else if (!strcmp(op, "la")) {
210             scanf("%d", &which);
211             if (externalstore[which] == NULL) {
212                 printf("No acl in %d.\n", which);
213                 printf("acl> ");
214                 continue;
215             }
216             ptr = externalstore[which];
217             sscanf(ptr, "%d\n%d\n", &p, &n);
218             skip(&ptr);
219             skip(&ptr);
220             for (i = 0; i < p; i++) {
221                 sscanf(ptr, "%s\t%d\n", name, &realrights);
222                 printf("%s\t", name);
223                 PRights(realrights);
224                 printf("\n");
225                 skip(&ptr);
226             }
227             if (n > 0) {
228                 printf("Negative rights: \n");
229                 for (i = 0; i < n; i++) {
230                     scanf(ptr, "%s\t%d\n", name, &realrights);
231                     printf("%s\t", name);
232                     PRights(realrights);
233                     printf("\n");
234                 }
235             }
236         } else if (!strcmp(op, "cr")) {
237             scanf("%s %d", name, &which);
238             if (aclstore[which] == NULL) {
239                 printf("No acl in %d.\n", which);
240                 printf("acl> ");
241                 continue;
242             }
243             names.namelist_len = 1;
244             names.namelist_val = (prname *) malloc(strlen(name) + 1);
245             strncpy(names.namelist_val, name, PR_MAXNAMELEN);
246             code = pr_NameToId(&names, &ids);
247             if (code) {
248                 printf("Couldn't translate %s\n", name);
249                 printf("acl> ");
250                 continue;
251             }
252             code = pr_GetCPS(*ids.idlist_val, &cps);
253             if (code) {
254                 printf("Couldn't get cps\n");
255                 printf("acl> ");
256                 continue;
257             }
258             code = acl_CheckRights(aclstore[which], &cps, &realrights);
259             if (code) {
260                 printf("Couldn't check rights\n");
261                 printf("acl> ");
262                 continue;
263             }
264             printf("Rights for %s on %d are:\n", name, which);
265             PRights(realrights);
266             printf("\n");
267         } else
268             printf("Unknown op!\n");
269         printf("acl> ");
270     }
271 }
272
273 skip(s)
274      char **s;
275 {
276     while (**s != '\n' && **s != '\0')
277         (*s)++;
278     if (**s == '\n')
279         (*s)++;
280 }