src/server/safs/pathcheck.c

changeset 142
55298bc9ed28
parent 141
ff311b63c3af
child 143
6bf5d2f37425
equal deleted inserted replaced
141:ff311b63c3af 142:55298bc9ed28
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 }

mercurial