auth: Allow identities in the UserList
[openafs.git] / tests / auth / superuser-t.c
1 /*
2  * Copyright (c) 2010 Your File System Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24 #include <afsconfig.h>
25 #include <afs/param.h>
26
27 #include <roken.h>
28
29 #include <afs/cellconfig.h>
30 #include <afs/afsutil.h>
31 #include <rx/rx_identity.h>
32
33 #include <tap/basic.h>
34
35 static void
36 testOriginalIterator(struct afsconf_dir *dir, int num, char *user) {
37     char buffer[256];
38
39     ok((afsconf_GetNthUser(dir, num, buffer, sizeof buffer) == 0),
40        "User %d successfully returned as %s", num, buffer);
41
42     ok(strcmp(user, buffer) == 0,
43        "User %d matches", num);
44 }
45
46 static void
47 testNewIterator(struct afsconf_dir *dir, int num, struct rx_identity *id) {
48     struct rx_identity *fileId;
49
50     ok((afsconf_GetNthIdentity(dir, num, &fileId) == 0),
51        "Identity %d successfully returned", num);
52
53     ok(rx_identity_match(fileId, id), "Identity %d matches", num);
54
55     rx_identity_free(&fileId);
56 }
57
58 int main(int argc, char **argv)
59 {
60     struct afsconf_dir *dir;
61     char buffer[1024];
62     char ubuffer[256];
63     char *dirEnd;
64     FILE *file;
65     struct rx_identity *testId, *anotherId, *extendedId, *dummy;
66
67     plan(36);
68
69     snprintf(buffer, sizeof(buffer), "%s/afs_XXXXXX", gettmpdir());
70     mkdtemp(buffer);
71     dirEnd = buffer + strlen(buffer);
72
73     /* Create a CellServDB file */
74     strcpy(dirEnd, "/CellServDB");
75     file = fopen(buffer, "w");
76     fprintf(file, ">example.org # An example cell\n");
77     fprintf(file, "127.0.0.1 #test.example.org\n");
78     fclose(file);
79
80     /* Create a ThisCell file */
81     strcpy(dirEnd, "/ThisCell");
82     file = fopen(buffer, "w");
83     fprintf(file, "example.org\n");
84     fclose(file);
85
86     *dirEnd='\0';
87     /* Start with a blank configuration directory */
88     dir = afsconf_Open(strdup(buffer));
89     ok(dir!=NULL,
90        "Configuration directory opened sucessfully");
91
92     /* Add a normal user to the super user file */
93     ok(afsconf_AddUser(dir, "test") == 0,
94        "Adding a simple user works");
95
96     testId = rx_identity_new(RX_ID_KRB4, "test", "test", strlen("test"));
97
98     /* Check that they are a super user */
99     ok(afsconf_IsSuperIdentity(dir, testId),
100        "User added with old i/face is identitifed as super user");
101
102     /* Check that nobody else is */
103     ok(!afsconf_IsSuperIdentity(dir,
104                                rx_identity_new(RX_ID_KRB4, "testy",
105                                                "testy", strlen("testy"))),
106        "Additional users are not super users");
107
108     ok(afsconf_AddUser(dir, "test") == EEXIST,
109        "Adding a user that already exists fails");
110
111     ok(afsconf_AddIdentity(dir, testId) == EEXIST,
112        "Adding an identity that already exists fails");
113
114     anotherId = rx_identity_new(RX_ID_KRB4, "another",
115                                            "another", strlen("another"));
116
117     /* Add another normal user, but using the extended interface */
118     ok(afsconf_AddIdentity(dir, anotherId) == 0,
119        "Adding a KRB4 identity works");
120
121     /* Check that they are a super user */
122     ok(afsconf_IsSuperIdentity(dir, anotherId),
123        "User added with new i/face is identitifed as super user");
124
125     ok(afsconf_AddIdentity(dir, anotherId) == EEXIST,
126        "Adding a KRB4 identity that already exists fails");
127
128     /* Add an extended user to the super user file */
129     extendedId = rx_identity_new(RX_ID_GSS, "sxw@INF.ED.AC.UK",
130                                  "\x04\x01\x00\x0B\x06\x09\x2A\x86\x48\x86\xF7\x12\x01\x02\x02\x00\x00\x00\x10sxw@INF.ED.AC.UK", 35);
131
132     ok(afsconf_AddIdentity(dir, extendedId) == 0,
133        "Adding a GSSAPI identity works");
134
135     /* Check that they are now special */
136     ok(afsconf_IsSuperIdentity(dir, extendedId),
137        "Added GSSAPI identity is a super user");
138
139     /* Check that display name isn't used for matches */
140     ok(!afsconf_IsSuperIdentity(dir,
141                                 rx_identity_new(RX_ID_GSS, "sxw@INF.ED.AC.UK",
142                                                 "abcdefghijklmnopqrstuvwxyz123456789", 35)),
143        "Display name is not used for extended matches");
144
145     ok(afsconf_AddIdentity(dir, extendedId) == EEXIST,
146        "Adding GSSAPI identity twice fails");
147
148     /* Add a final normal user, so we can check that iteration works */
149     /* Add a normal user to the super user file */
150     ok(afsconf_AddUser(dir, "test2") == 0,
151        "Adding another simple user works");
152
153     testOriginalIterator(dir, 0, "test");
154     testOriginalIterator(dir, 1, "another");
155     testOriginalIterator(dir, 2, "test2");
156     ok(afsconf_GetNthUser(dir, 3, ubuffer, sizeof ubuffer) != 0,
157        "Reading past the end of the superuser list fails");
158
159     testNewIterator(dir, 0, testId);
160     testNewIterator(dir, 1, anotherId);
161     testNewIterator(dir, 2, extendedId);
162     testNewIterator(dir, 3, rx_identity_new(RX_ID_KRB4, "test2",
163                                             "test2", strlen("test2")));
164     ok(afsconf_GetNthIdentity(dir, 4, &dummy) != 0,
165        "Reading past the end of the superuser list fails");
166
167     ok(afsconf_DeleteUser(dir, "notthere") != 0,
168        "Deleting a user that doesn't exist fails");
169
170     /* Delete the normal user */
171     ok(afsconf_DeleteUser(dir, "another") == 0,
172        "Deleting normal user works");
173
174     ok(!afsconf_IsSuperIdentity(dir, anotherId),
175        "Deleted user is no longer super user");
176
177     ok(afsconf_IsSuperIdentity(dir, testId) &&
178        afsconf_IsSuperIdentity(dir, extendedId),
179        "Other identities still are");
180
181     ok(afsconf_DeleteIdentity(dir, extendedId) == 0,
182        "Deleting identity works");
183
184     ok(!afsconf_IsSuperIdentity(dir, extendedId),
185        "Deleted identity is no longer special");
186
187     strcpy(dirEnd, "/CellServDB");
188     unlink(buffer);
189     strcpy(dirEnd, "/ThisCell");
190     unlink(buffer);
191     strcpy(dirEnd, "/UserList");
192     unlink(buffer);
193     *dirEnd='\0';
194     rmdir(buffer);
195
196     return 0;
197 }