xref: /lighttpd1.4/src/t/test_mod_userdir.c (revision 3392e8fb)
1 #include "first.h"
2 
3 #undef NDEBUG
4 #include <assert.h>
5 #include <stdlib.h>
6 
7 #include "mod_userdir.c"
8 
9 static void test_mod_userdir_reset(request_st * const r)
10 {
11     r->http_status = 0;
12     buffer_clear(&r->physical.basedir);
13     buffer_clear(&r->physical.path);
14 }
15 
16 static void
17 test_mod_userdir_docroot_handler(request_st * const r, plugin_data * const p)
18 {
19     buffer_copy_string_len(&r->uri.path, CONST_STR_LEN(""));
20     test_mod_userdir_reset(r);
21     assert(HANDLER_GO_ON == mod_userdir_docroot_handler(r, p));
22     assert(buffer_is_empty(&r->physical.basedir));
23     assert(buffer_is_empty(&r->physical.path));
24 
25     p->defaults.active = 1;
26 
27     test_mod_userdir_reset(r);
28     assert(HANDLER_GO_ON == mod_userdir_docroot_handler(r, p));
29     assert(buffer_is_empty(&r->physical.basedir));
30     assert(buffer_is_empty(&r->physical.path));
31 
32     buffer_copy_string_len(&r->uri.path, CONST_STR_LEN("/"));
33     test_mod_userdir_reset(r);
34     assert(HANDLER_GO_ON == mod_userdir_docroot_handler(r, p));
35     assert(buffer_is_empty(&r->physical.basedir));
36     assert(buffer_is_empty(&r->physical.path));
37 
38     buffer_copy_string_len(&r->uri.path, CONST_STR_LEN("/other"));
39     test_mod_userdir_reset(r);
40     assert(HANDLER_GO_ON == mod_userdir_docroot_handler(r, p));
41     assert(buffer_is_empty(&r->physical.basedir));
42     assert(buffer_is_empty(&r->physical.path));
43 
44     buffer_copy_string_len(&r->uri.path, CONST_STR_LEN("/~"));
45     test_mod_userdir_reset(r);
46     assert(HANDLER_GO_ON == mod_userdir_docroot_handler(r, p));
47     assert(buffer_is_empty(&r->physical.basedir));
48     assert(buffer_is_empty(&r->physical.path));
49 
50     buffer_copy_string_len(&r->uri.path, CONST_STR_LEN("/~no-trailing-slash"));
51     test_mod_userdir_reset(r);
52     assert(HANDLER_FINISHED == mod_userdir_docroot_handler(r, p));
53     assert(301 == r->http_status);
54     assert(buffer_is_empty(&r->physical.basedir));
55     assert(buffer_is_empty(&r->physical.path));
56 
57     buffer_copy_string_len(&r->uri.path, CONST_STR_LEN("/~/"));
58     test_mod_userdir_reset(r);
59     assert(HANDLER_GO_ON == mod_userdir_docroot_handler(r, p));
60     assert(buffer_is_empty(&r->physical.basedir));
61     assert(buffer_is_empty(&r->physical.path));
62 
63     buffer_copy_string_len(&r->uri.path, CONST_STR_LEN("/~jan/"));
64     buffer_copy_string_len(&r->physical.rel_path, CONST_STR_LEN("/~jan/"));
65     test_mod_userdir_reset(r);
66     assert(HANDLER_GO_ON == mod_userdir_docroot_handler(r, p));
67     assert(buffer_eq_slen(&r->physical.basedir,
68                           CONST_STR_LEN("/web/u/jan/public_html")));
69     assert(buffer_eq_slen(&r->physical.path,
70                           CONST_STR_LEN("/web/u/jan/public_html/")));
71 
72     buffer_copy_string_len(&r->uri.path, CONST_STR_LEN("/~jan/more"));
73     buffer_copy_string_len(&r->physical.rel_path, CONST_STR_LEN("/~jan/more"));
74     test_mod_userdir_reset(r);
75     assert(HANDLER_GO_ON == mod_userdir_docroot_handler(r, p));
76     assert(buffer_eq_slen(&r->physical.basedir,
77                           CONST_STR_LEN("/web/u/jan/public_html")));
78     assert(buffer_eq_slen(&r->physical.path,
79                           CONST_STR_LEN("/web/u/jan/public_html/more")));
80 
81     p->defaults.letterhomes = 1;
82 
83     buffer_copy_string_len(&r->uri.path, CONST_STR_LEN("/~.jan/"));
84     test_mod_userdir_reset(r);
85     assert(HANDLER_GO_ON == mod_userdir_docroot_handler(r, p));
86     assert(buffer_is_empty(&r->physical.basedir));
87     assert(buffer_is_empty(&r->physical.path));
88 
89     buffer_copy_string_len(&r->uri.path, CONST_STR_LEN("/~jan/"));
90     buffer_copy_string_len(&r->physical.rel_path, CONST_STR_LEN("/~jan/"));
91     test_mod_userdir_reset(r);
92     assert(HANDLER_GO_ON == mod_userdir_docroot_handler(r, p));
93     assert(buffer_eq_slen(&r->physical.basedir,
94                           CONST_STR_LEN("/web/u/j/jan/public_html")));
95     assert(buffer_eq_slen(&r->physical.path,
96                           CONST_STR_LEN("/web/u/j/jan/public_html/")));
97 
98     p->defaults.letterhomes = 0;
99 
100     array *include_user = array_init(2);
101     array *exclude_user = array_init(2);
102 
103     array_insert_value(include_user, CONST_STR_LEN("notjan"));
104 
105     p->defaults.include_user = include_user;
106 
107     buffer_copy_string_len(&r->uri.path, CONST_STR_LEN("/~jan/"));
108     buffer_copy_string_len(&r->physical.rel_path, CONST_STR_LEN("/~jan/"));
109     test_mod_userdir_reset(r);
110     assert(HANDLER_GO_ON == mod_userdir_docroot_handler(r, p));
111     assert(buffer_is_empty(&r->physical.basedir));
112     assert(buffer_is_empty(&r->physical.path));
113 
114     array_insert_value(include_user, CONST_STR_LEN("jan"));
115 
116     buffer_copy_string_len(&r->uri.path, CONST_STR_LEN("/~jan/"));
117     buffer_copy_string_len(&r->physical.rel_path, CONST_STR_LEN("/~jan/"));
118     test_mod_userdir_reset(r);
119     assert(HANDLER_GO_ON == mod_userdir_docroot_handler(r, p));
120     assert(buffer_eq_slen(&r->physical.basedir,
121                           CONST_STR_LEN("/web/u/jan/public_html")));
122     assert(buffer_eq_slen(&r->physical.path,
123                           CONST_STR_LEN("/web/u/jan/public_html/")));
124 
125     p->defaults.exclude_user = exclude_user;
126 
127     array_insert_value(exclude_user, CONST_STR_LEN("notjan"));
128 
129     buffer_copy_string_len(&r->uri.path, CONST_STR_LEN("/~jan/"));
130     buffer_copy_string_len(&r->physical.rel_path, CONST_STR_LEN("/~jan/"));
131     test_mod_userdir_reset(r);
132     assert(HANDLER_GO_ON == mod_userdir_docroot_handler(r, p));
133     assert(buffer_eq_slen(&r->physical.basedir,
134                           CONST_STR_LEN("/web/u/jan/public_html")));
135     assert(buffer_eq_slen(&r->physical.path,
136                           CONST_STR_LEN("/web/u/jan/public_html/")));
137 
138     array_insert_value(exclude_user, CONST_STR_LEN("jan"));
139 
140     buffer_copy_string_len(&r->uri.path, CONST_STR_LEN("/~jan/"));
141     buffer_copy_string_len(&r->physical.rel_path, CONST_STR_LEN("/~jan/"));
142     test_mod_userdir_reset(r);
143     assert(HANDLER_GO_ON == mod_userdir_docroot_handler(r, p));
144     assert(buffer_is_empty(&r->physical.basedir));
145     assert(buffer_is_empty(&r->physical.path));
146 
147     p->defaults.include_user = NULL;
148     p->defaults.exclude_user = NULL;
149     array_free(include_user);
150     array_free(exclude_user);
151 }
152 
153 int main (void)
154 {
155     plugin_data * const p = mod_userdir_init();
156     assert(NULL != p);
157 
158     buffer *basepath = buffer_init_string("/web/u/"); /*(skip getpwnam())*/
159     buffer *path     = buffer_init_string("public_html");
160     p->defaults.basepath = basepath;
161     p->defaults.path = path;
162 
163     request_st r;
164 
165     memset(&r, 0, sizeof(request_st));
166     r.tmp_buf                = buffer_init();
167     r.conf.errh              = log_error_st_init();
168     r.conf.errh->errorlog_fd = -1; /* (disable) */
169 
170     test_mod_userdir_docroot_handler(&r, p);
171 
172     free(r.uri.path.ptr);
173     free(r.physical.basedir.ptr);
174     free(r.physical.path.ptr);
175     free(r.physical.rel_path.ptr);
176 
177     log_error_st_free(r.conf.errh);
178     buffer_free(r.tmp_buf);
179 
180     buffer_free(basepath);
181     buffer_free(path);
182     free(p);
183     return 0;
184 }
185 
186 /*
187  * stub functions
188  */
189 
190 int http_response_redirect_to_directory(request_st *r, int status) {
191     r->http_status = status;
192     return 0;
193 }
194 
195 int stat_cache_path_isdir(const buffer *name) {
196     UNUSED(name);
197     return 1;
198 }
199 
200 int config_plugin_values_init(server *srv, void *p_d, const config_plugin_keys_t *cpk, const char *mname) {
201     UNUSED(srv);
202     UNUSED(p_d);
203     UNUSED(cpk);
204     UNUSED(mname);
205     return 0;
206 }
207 
208 int config_check_cond(request_st *r, int context_ndx) {
209     UNUSED(r);
210     UNUSED(context_ndx);
211     return 0;
212 }
213