Tue, 13 Aug 2024 19:59:42 +0200
new linux event_send implementation, replace event pipes with eventfd
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 | } |