src/server/safs/pathcheck.c

Sun, 27 Nov 2022 13:33:30 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 27 Nov 2022 13:33:30 +0100
changeset 443
ef3c8a0e1fee
parent 415
d938228c382e
permissions
-rw-r--r--

improve daemon startup
parent will wait until daemon is started and returns error code if startup failed
daemon startup log messages will be printed by parent

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
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
34 #include "../daemon/config.h"
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
35 #include "../daemon/acl.h"
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
36 #include "../daemon/acldata.h"
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
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
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
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
ff311b63c3af many fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 131
diff changeset
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
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 69
diff changeset
65 log_ereport(LOG_MISCONFIG, "require-access: missing mask parameter");
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 69
diff changeset
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
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
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
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
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
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
97 char *aclname = pblock_findval("acl", pb);
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
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
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
100 if(!acl) {
77
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 69
diff changeset
101 log_ereport(
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 69
diff changeset
102 LOG_MISCONFIG,
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 69
diff changeset
103 "append-acl: acl %s not found", aclname);
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 69
diff changeset
104 protocol_status(sn, rq, 500, NULL);
51
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
105 return REQ_ABORTED;
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
106 }
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
107
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
108 acllist_append(sn, rq, acl);
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
109 }
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
110
87
bdec069d2239 fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 77
diff changeset
111 return REQ_PROCEED;
51
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
112 }
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
113
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
114
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
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
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
117
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
118 int ret = acl_evaluate(sn, rq, access_mask);
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
119 if(ret == REQ_ABORTED) {
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
120 // TODO: status, error, ...
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
121 return REQ_ABORTED;
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
122 }
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
123
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
124 return REQ_PROCEED;
b28cf69f42e8 added acls
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
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 }

mercurial