34 #include "../daemon/config.h" |
34 #include "../daemon/config.h" |
35 #include "../daemon/acl.h" |
35 #include "../daemon/acl.h" |
36 #include "../daemon/acldata.h" |
36 #include "../daemon/acldata.h" |
37 #include "../daemon/session.h" |
37 #include "../daemon/session.h" |
38 #include "../daemon/vserver.h" |
38 #include "../daemon/vserver.h" |
|
39 |
|
40 #include "../daemon/vfs.h" |
39 |
41 |
40 #include "../config/acl.h" |
42 #include "../config/acl.h" |
41 |
43 |
42 int require_auth(pblock *pb, Session *sn, Request *rq) { |
44 int require_auth(pblock *pb, Session *sn, Request *rq) { |
43 char *user = pblock_findkeyval(pb_key_auth_user, rq->vars); |
45 char *user = pblock_findkeyval(pb_key_auth_user, rq->vars); |
155 } |
157 } |
156 free(names); |
158 free(names); |
157 |
159 |
158 return ret; |
160 return ret; |
159 } |
161 } |
|
162 |
|
163 int dir_redirect(pblock *pb, Session *sn, Request *rq) { |
|
164 char *path = pblock_findkeyval(pb_key_path, rq->vars); |
|
165 |
|
166 // TODO: VFS support |
|
167 |
|
168 struct stat s; |
|
169 if(stat(path, &s) != 0) { |
|
170 return REQ_NOACTION; |
|
171 } |
|
172 |
|
173 // TODO: remove code duplication (service.c) |
|
174 if(S_ISDIR(s.st_mode) && path[strlen(path)-1] != '/') { |
|
175 pblock_nvinsert("content-length", "0", rq->srvhdrs); |
|
176 pblock_removekey(pb_key_content_type, rq->srvhdrs); |
|
177 char *uri = pblock_findkeyval(pb_key_uri, rq->reqpb); |
|
178 size_t urilen = strlen(uri); |
|
179 char *location = pool_malloc(sn->pool, urilen + 2); |
|
180 memcpy(location, uri, urilen); |
|
181 location[urilen] = '/'; |
|
182 location[urilen+1] = '\0'; |
|
183 pblock_kvinsert(pb_key_location, location, urilen + 1, rq->srvhdrs); |
|
184 protocol_status(sn, rq, 302, NULL); |
|
185 http_start_response(sn, rq); |
|
186 return REQ_ABORTED; |
|
187 } |
|
188 |
|
189 return REQ_PROCEED; |
|
190 } |