Wed, 05 Jun 2024 19:50:44 +0200
add extra nullptr check in the event loop to handle the case when the finish ptr is set to NULL after it was already scheduled
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 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
405
diff
changeset
|
29 | #include <cx/string.h> |
92
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 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
405
diff
changeset
|
44 | #define PATHCHECK_MAX_TOKENS 2048 |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
405
diff
changeset
|
45 | |
23
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
46 | int require_auth(pblock *pb, Session *sn, Request *rq) { |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
47 | char *user = pblock_findkeyval(pb_key_auth_user, rq->vars); |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
48 | |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
49 | if(user == NULL) { |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
50 | pblock_nvinsert( |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
51 | "www-authenticate", |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
52 | "Basic realm=\"Webserver\"", |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
53 | rq->srvhdrs); |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
54 | |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
55 | protocol_status(sn, rq, PROTOCOL_UNAUTHORIZED, NULL); |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
56 | return REQ_ABORTED; |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
57 | } |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
58 | |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
59 | return REQ_PROCEED; |
a2c8fc23c90e
Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
60 | } |
51 | 61 | |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
62 | int require_access(pblock *pb, Session *sn, Request *rq) { |
141 | 63 | 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
|
64 | if(!mask_str) { |
77 | 65 | log_ereport(LOG_MISCONFIG, "require-access: missing mask parameter"); |
66 | protocol_status(sn, rq, 500, NULL); | |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
67 | return REQ_ABORTED; |
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
68 | } |
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
69 | |
143
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
70 | char *method = pblock_findval("method", pb); |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
71 | if(method) { |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
72 | char *m = pblock_findkeyval(pb_key_method, rq->reqpb); |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
73 | if(strcmp(method, m)) { |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
74 | return REQ_NOACTION; |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
75 | } |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
76 | } |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
77 | |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
78 | uint32_t access_mask = 0; |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
405
diff
changeset
|
79 | cxstring *rights = NULL; |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
405
diff
changeset
|
80 | ssize_t n = cx_strsplit_a(pool_allocator(sn->pool), cx_str(mask_str), (cxstring){",", 1}, PATHCHECK_MAX_TOKENS, &rights); |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
81 | for(int i=0;i<n;i++) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
405
diff
changeset
|
82 | cxstring right = rights[i]; |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
83 | access_mask = access_mask | accstr2int(right); |
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
84 | } |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
405
diff
changeset
|
85 | pool_free(sn->pool, rights); |
69
4a10bc0ee80d
compiles on os x
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
86 | |
143
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
87 | rq->aclreqaccess = access_mask; |
6bf5d2f37425
fixes some acl safs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
142
diff
changeset
|
88 | |
69
4a10bc0ee80d
compiles on os x
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
89 | return REQ_PROCEED; |
52
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
90 | } |
aced2245fb1c
new pathcheck saf and code cleanup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
91 | |
51 | 92 | int append_acl(pblock *pb, Session *sn, Request *rq) { |
61
c858850f3d3a
improved configuration reloading
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
93 | const VirtualServer *vs = request_get_vs(rq); |
51 | 94 | |
87
bdec069d2239
fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
77
diff
changeset
|
95 | WS_ASSERT(vs); |
bdec069d2239
fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
77
diff
changeset
|
96 | |
51 | 97 | char *aclname = pblock_findval("acl", pb); |
98 | if(aclname) { | |
61
c858850f3d3a
improved configuration reloading
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
99 | ACLList *acl = acl_get(vs->acls, aclname); |
51 | 100 | if(!acl) { |
77 | 101 | log_ereport( |
102 | LOG_MISCONFIG, | |
103 | "append-acl: acl %s not found", aclname); | |
104 | protocol_status(sn, rq, 500, NULL); | |
51 | 105 | return REQ_ABORTED; |
106 | } | |
107 | ||
108 | acllist_append(sn, rq, acl); | |
109 | } | |
110 | ||
87
bdec069d2239
fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
77
diff
changeset
|
111 | return REQ_PROCEED; |
51 | 112 | } |
113 | ||
114 | ||
115 | 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
|
116 | int access_mask = ACL_READ_DATA | rq->aclreqaccess; // TODO: check method and path |
51 | 117 | |
118 | int ret = acl_evaluate(sn, rq, access_mask); | |
119 | if(ret == REQ_ABORTED) { | |
120 | // TODO: status, error, ... | |
121 | return REQ_ABORTED; | |
122 | } | |
123 | ||
124 | return REQ_PROCEED; | |
125 | } | |
131
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
126 | |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
127 | int find_index(pblock *pb, Session *sn, Request *rq) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
128 | char *inames = pblock_findval("index-names", pb); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
129 | if(!inames) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
130 | log_ereport( |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
131 | LOG_MISCONFIG, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
132 | "find-index: index-names parameter missing"); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
133 | return REQ_ABORTED; |
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 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
405
diff
changeset
|
136 | cxstring *names = NULL; |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
405
diff
changeset
|
137 | ssize_t ni = cx_strsplit_a(pool_allocator(sn->pool), cx_str(inames), (cxstring)CX_STR(","), PATHCHECK_MAX_TOKENS, &names); |
131
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
138 | if(ni <= 0) { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
139 | log_ereport( |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
140 | LOG_MISCONFIG, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
141 | "find-index: no files specified in index-names parameter"); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
142 | return REQ_ABORTED; |
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 | |
404
e0e0754efd46
add vfs support to find_index
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
145
diff
changeset
|
145 | // only find index for GET requests |
e0e0754efd46
add vfs support to find_index
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
145
diff
changeset
|
146 | // maybe we want to support find-index for other methods, in that case |
e0e0754efd46
add vfs support to find_index
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
145
diff
changeset
|
147 | // we should implement a parameter for this |
e0e0754efd46
add vfs support to find_index
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
145
diff
changeset
|
148 | char *method = pblock_findkeyval(pb_key_method, rq->reqpb); |
e0e0754efd46
add vfs support to find_index
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
145
diff
changeset
|
149 | if(strcmp(method, "GET")) { |
e0e0754efd46
add vfs support to find_index
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
145
diff
changeset
|
150 | return REQ_NOACTION; |
e0e0754efd46
add vfs support to find_index
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
145
diff
changeset
|
151 | } |
e0e0754efd46
add vfs support to find_index
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
145
diff
changeset
|
152 | |
e0e0754efd46
add vfs support to find_index
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
145
diff
changeset
|
153 | VFSContext *vfs = vfs_request_context(sn, rq); |
131
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
154 | int ret = REQ_NOACTION; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
155 | |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
156 | char *path = pblock_findkeyval(pb_key_path, rq->vars); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
157 | size_t pathlen = strlen(path); |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
405
diff
changeset
|
158 | cxstring p = cx_strn(path, pathlen); |
131
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
159 | if(path[pathlen-1] == '/') { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
160 | for(int i=0;i<ni;i++) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
405
diff
changeset
|
161 | cxmutstr newpath = cx_strcat(2, p, cx_strtrim(names[i])); |
131
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
162 | struct stat s; |
404
e0e0754efd46
add vfs support to find_index
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
145
diff
changeset
|
163 | if(!vfs_stat(vfs, newpath.ptr, &s)) { |
131
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
164 | pblock_kvinsert( |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
165 | pb_key_path, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
166 | newpath.ptr, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
167 | newpath.length, |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
168 | rq->vars); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
169 | free(newpath.ptr); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
170 | ret = REQ_PROCEED; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
171 | } else { |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
172 | free(newpath.ptr); |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
173 | } |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
174 | } |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
175 | } |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
176 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
405
diff
changeset
|
177 | pool_free(sn->pool, names); |
131
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
178 | |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
179 | return ret; |
70010b94bda5
adds find-index saf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
180 | } |
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
|
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 | 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
|
183 | 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
|
184 | |
405
162f122b96a1
add vfs support to dir_redirect
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
185 | VFSContext *vfs = vfs_request_context(sn, rq); |
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
|
186 | |
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 | struct stat s; |
405
162f122b96a1
add vfs support to dir_redirect
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
188 | if(vfs_stat(vfs, path, &s) != 0) { |
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
|
189 | 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
|
190 | } |
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 | |
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 | // TODO: remove code duplication (service.c) |
405
162f122b96a1
add vfs support to dir_redirect
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
404
diff
changeset
|
193 | // TODO: make response code configurable |
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
|
194 | 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
|
195 | 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
|
196 | 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
|
197 | 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
|
198 | 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
|
199 | 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
|
200 | 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
|
201 | 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
|
202 | 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
|
203 | 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
|
204 | 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
|
205 | 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
|
206 | 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
|
207 | } |
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
|
208 | |
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
|
209 | 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
|
210 | } |