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