Sat, 31 Dec 2016 18:05:40 +0100
fixes cgi fd leak
23
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
1 | /* |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
3 | * |
44
3da1f7b6847f
added some error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
23
diff
changeset
|
4 | * Copyright 2013 Olaf Wintermann. All rights reserved. |
23
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
5 | * |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
8 | * |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
11 | * |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
15 | * |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
27 | */ |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
28 | |
92
382bff43c6eb
fixed some includes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
87
diff
changeset
|
29 | #include <ucx/string.h> |
382bff43c6eb
fixed some includes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
87
diff
changeset
|
30 | |
23
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
31 | #include "pathcheck.h" |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
32 | |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
33 | #include "../util/pblock.h" |
51 | 34 | #include "../daemon/config.h" |
35 | #include "../daemon/acl.h" | |
36 | #include "../daemon/acldata.h" | |
37 | #include "../daemon/session.h" | |
61
c858850f3d3a
improved configuration reloading
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
38 | #include "../daemon/vserver.h" |
23
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
39 | |
142
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
40 | #include "../daemon/vfs.h" |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
41 | |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
42 | #include "../config/acl.h" |
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
43 | |
23
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
44 | int require_auth(pblock *pb, Session *sn, Request *rq) { |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
45 | char *user = pblock_findkeyval(pb_key_auth_user, rq->vars); |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
46 | |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
47 | if(user == NULL) { |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
48 | pblock_nvinsert( |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
49 | "www-authenticate", |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
50 | "Basic realm=\"Webserver\"", |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
51 | rq->srvhdrs); |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
52 | |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
53 | protocol_status(sn, rq, PROTOCOL_UNAUTHORIZED, NULL); |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
54 | return REQ_ABORTED; |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
55 | } |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
56 | |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
57 | return REQ_PROCEED; |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
58 | } |
51 | 59 | |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
60 | int require_access(pblock *pb, Session *sn, Request *rq) { |
141 | 61 | char *mask_str = pblock_findval("mask", pb); |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
62 | if(!mask_str) { |
77 | 63 | log_ereport(LOG_MISCONFIG, "require-access: missing mask parameter"); |
64 | protocol_status(sn, rq, 500, NULL); | |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
65 | return REQ_ABORTED; |
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
66 | } |
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
67 | |
143
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
68 | char *method = pblock_findval("method", pb); |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
69 | if(method) { |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
70 | char *m = pblock_findkeyval(pb_key_method, rq->reqpb); |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
71 | if(strcmp(method, m)) { |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
72 | return REQ_NOACTION; |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
73 | } |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
74 | } |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
75 | |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
76 | uint32_t access_mask = 0; |
100
e9bb8449df02
fixed solaris build
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
92
diff
changeset
|
77 | ssize_t n = 0; |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
78 | sstr_t *rights = sstrsplit(sstr(mask_str), sstrn(",", 1), &n); |
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
79 | for(int i=0;i<n;i++) { |
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
80 | sstr_t right = rights[i]; |
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
81 | access_mask = access_mask | accstr2int(right); |
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
82 | } |
69
4a10bc0ee80d
compiles on os x
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
83 | |
143
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
84 | rq->aclreqaccess = access_mask; |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
85 | |
69
4a10bc0ee80d
compiles on os x
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
86 | return REQ_PROCEED; |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
87 | } |
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
88 | |
51 | 89 | int append_acl(pblock *pb, Session *sn, Request *rq) { |
61
c858850f3d3a
improved configuration reloading
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
90 | const VirtualServer *vs = request_get_vs(rq); |
51 | 91 | |
87
bdec069d2239
fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
77
diff
changeset
|
92 | WS_ASSERT(vs); |
bdec069d2239
fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
77
diff
changeset
|
93 | |
51 | 94 | char *aclname = pblock_findval("acl", pb); |
95 | if(aclname) { | |
61
c858850f3d3a
improved configuration reloading
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
96 | ACLList *acl = acl_get(vs->acls, aclname); |
51 | 97 | if(!acl) { |
77 | 98 | log_ereport( |
99 | LOG_MISCONFIG, | |
100 | "append-acl: acl %s not found", aclname); | |
101 | protocol_status(sn, rq, 500, NULL); | |
51 | 102 | return REQ_ABORTED; |
103 | } | |
104 | ||
105 | acllist_append(sn, rq, acl); | |
106 | } | |
107 | ||
87
bdec069d2239
fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
77
diff
changeset
|
108 | return REQ_PROCEED; |
51 | 109 | } |
110 | ||
111 | ||
112 | int check_acl(pblock *pb, Session *sn, Request *rq) { | |
143
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
113 | int access_mask = ACL_READ_DATA | rq->aclreqaccess; // TODO: check method and path |
51 | 114 | |
115 | int ret = acl_evaluate(sn, rq, access_mask); | |
116 | if(ret == REQ_ABORTED) { | |
117 | // TODO: status, error, ... | |
118 | return REQ_ABORTED; | |
119 | } | |
120 | ||
121 | return REQ_PROCEED; | |
122 | } | |
131
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
123 | |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
124 | int find_index(pblock *pb, Session *sn, Request *rq) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
125 | char *inames = pblock_findval("index-names", pb); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
126 | if(!inames) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
127 | log_ereport( |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
128 | LOG_MISCONFIG, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
129 | "find-index: index-names parameter missing"); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
130 | return REQ_ABORTED; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
131 | } |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
132 | |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
133 | ssize_t ni = 0; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
134 | sstr_t *names = sstrsplit(sstr(inames), S(","), &ni); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
135 | if(ni <= 0) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
136 | log_ereport( |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
137 | LOG_MISCONFIG, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
138 | "find-index: no files specified in index-names parameter"); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
139 | return REQ_ABORTED; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
140 | } |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
141 | |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
142 | int ret = REQ_NOACTION; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
143 | |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
144 | char *path = pblock_findkeyval(pb_key_path, rq->vars); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
145 | size_t pathlen = strlen(path); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
146 | sstr_t p = sstrn(path, pathlen); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
147 | if(path[pathlen-1] == '/') { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
148 | for(int i=0;i<ni;i++) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
149 | sstr_t newpath = sstrcat(2, p, sstrtrim(names[i])); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
150 | struct stat s; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
151 | if(!stat(newpath.ptr, &s)) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
152 | pblock_kvinsert( |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
153 | pb_key_path, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
154 | newpath.ptr, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
155 | newpath.length, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
156 | rq->vars); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
157 | free(newpath.ptr); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
158 | ret = REQ_PROCEED; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
159 | } else { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
160 | free(newpath.ptr); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
161 | } |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
162 | } |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
163 | } |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
164 | |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
165 | for(int i=0;i<ni;i++) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
166 | free(names[i].ptr); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
167 | } |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
168 | free(names); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
169 | |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
170 | return ret; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
171 | } |
142
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
172 | |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
173 | int dir_redirect(pblock *pb, Session *sn, Request *rq) { |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
174 | char *path = pblock_findkeyval(pb_key_path, rq->vars); |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
175 | |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
176 | // TODO: VFS support |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
177 | |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
178 | struct stat s; |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
179 | if(stat(path, &s) != 0) { |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
180 | return REQ_NOACTION; |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
181 | } |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
182 | |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
183 | // TODO: remove code duplication (service.c) |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
184 | if(S_ISDIR(s.st_mode) && path[strlen(path)-1] != '/') { |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
185 | pblock_nvinsert("content-length", "0", rq->srvhdrs); |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
186 | pblock_removekey(pb_key_content_type, rq->srvhdrs); |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
187 | char *uri = pblock_findkeyval(pb_key_uri, rq->reqpb); |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
188 | size_t urilen = strlen(uri); |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
189 | char *location = pool_malloc(sn->pool, urilen + 2); |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
190 | memcpy(location, uri, urilen); |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
191 | location[urilen] = '/'; |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
192 | location[urilen+1] = '\0'; |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
193 | pblock_kvinsert(pb_key_location, location, urilen + 1, rq->srvhdrs); |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
194 | protocol_status(sn, rq, 302, NULL); |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
195 | http_start_response(sn, rq); |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
196 | return REQ_ABORTED; |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
197 | } |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
198 | |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
199 | return REQ_PROCEED; |
55298bc9ed28
adds new a pathcheck saf and improves content type matchin and improves content type matching
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
141
diff
changeset
|
200 | } |