Fri, 12 Jan 2018 17:54:52 +0100
using non-blocking IO for SSL_accept
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); |
145
1c93281ca4bf
fixes memory leaks in request_stat_path and send_cgi
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
143
diff
changeset
|
82 | free(right.ptr); |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
83 | } |
145
1c93281ca4bf
fixes memory leaks in request_stat_path and send_cgi
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
143
diff
changeset
|
84 | free(rights); |
69
4a10bc0ee80d
compiles on os x
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
85 | |
143
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
86 | rq->aclreqaccess = access_mask; |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
87 | |
69
4a10bc0ee80d
compiles on os x
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
88 | return REQ_PROCEED; |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
89 | } |
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
90 | |
51 | 91 | int append_acl(pblock *pb, Session *sn, Request *rq) { |
61
c858850f3d3a
improved configuration reloading
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
92 | const VirtualServer *vs = request_get_vs(rq); |
51 | 93 | |
87
bdec069d2239
fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
77
diff
changeset
|
94 | WS_ASSERT(vs); |
bdec069d2239
fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
77
diff
changeset
|
95 | |
51 | 96 | char *aclname = pblock_findval("acl", pb); |
97 | if(aclname) { | |
61
c858850f3d3a
improved configuration reloading
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
98 | ACLList *acl = acl_get(vs->acls, aclname); |
51 | 99 | if(!acl) { |
77 | 100 | log_ereport( |
101 | LOG_MISCONFIG, | |
102 | "append-acl: acl %s not found", aclname); | |
103 | protocol_status(sn, rq, 500, NULL); | |
51 | 104 | return REQ_ABORTED; |
105 | } | |
106 | ||
107 | acllist_append(sn, rq, acl); | |
108 | } | |
109 | ||
87
bdec069d2239
fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
77
diff
changeset
|
110 | return REQ_PROCEED; |
51 | 111 | } |
112 | ||
113 | ||
114 | 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
|
115 | int access_mask = ACL_READ_DATA | rq->aclreqaccess; // TODO: check method and path |
51 | 116 | |
117 | int ret = acl_evaluate(sn, rq, access_mask); | |
118 | if(ret == REQ_ABORTED) { | |
119 | // TODO: status, error, ... | |
120 | return REQ_ABORTED; | |
121 | } | |
122 | ||
123 | return REQ_PROCEED; | |
124 | } | |
131
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
125 | |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
126 | int find_index(pblock *pb, Session *sn, Request *rq) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
127 | char *inames = pblock_findval("index-names", pb); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
128 | if(!inames) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
129 | log_ereport( |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
130 | LOG_MISCONFIG, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
131 | "find-index: index-names parameter missing"); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
132 | return REQ_ABORTED; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
133 | } |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
134 | |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
135 | ssize_t ni = 0; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
136 | sstr_t *names = sstrsplit(sstr(inames), S(","), &ni); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
137 | if(ni <= 0) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
138 | log_ereport( |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
139 | LOG_MISCONFIG, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
140 | "find-index: no files specified in index-names parameter"); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
141 | return REQ_ABORTED; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
142 | } |
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 | int ret = REQ_NOACTION; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
145 | |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
146 | char *path = pblock_findkeyval(pb_key_path, rq->vars); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
147 | size_t pathlen = strlen(path); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
148 | sstr_t p = sstrn(path, pathlen); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
149 | if(path[pathlen-1] == '/') { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
150 | for(int i=0;i<ni;i++) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
151 | sstr_t newpath = sstrcat(2, p, sstrtrim(names[i])); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
152 | struct stat s; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
153 | if(!stat(newpath.ptr, &s)) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
154 | pblock_kvinsert( |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
155 | pb_key_path, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
156 | newpath.ptr, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
157 | newpath.length, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
158 | rq->vars); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
159 | free(newpath.ptr); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
160 | ret = REQ_PROCEED; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
161 | } else { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
162 | free(newpath.ptr); |
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 | } |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
166 | |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
167 | for(int i=0;i<ni;i++) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
168 | free(names[i].ptr); |
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 | free(names); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
171 | |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
172 | return ret; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
173 | } |
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
|
174 | |
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 | 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
|
176 | 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
|
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 | // 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
|
179 | |
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 | 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
|
181 | 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
|
182 | 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
|
183 | } |
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 | |
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 | // 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
|
186 | 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
|
187 | 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
|
188 | 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
|
189 | 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
|
190 | 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
|
191 | 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
|
192 | 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
|
193 | 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
|
194 | 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
|
195 | 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
|
196 | 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
|
197 | 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
|
198 | 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
|
199 | } |
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 | |
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
|
201 | 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
|
202 | } |