Roxen.git
/
server
/
base_server
/
module.pike
version
»
Context lines:
10
20
40
80
file
none
3
Roxen.git/server/base_server/module.pike:1:
// This file is part of Roxen Webserver. // Copyright © 1996 - 2000, Roxen IS.
-
// $Id: module.pike,v 1.
110
2001/
02
/
21
05
:
41
:
10
per Exp $
+
// $Id: module.pike,v 1.
111
2001/
03
/
08
14
:
35
:
40
per Exp $
#include <module_constants.h> #include <module.h> #include <request_trace.h> inherit "basic_defvar"; mapping(string:array(int)) error_log=([]); constant is_module = 1; // constant module_type = MODULE_ZERO;
Roxen.git/server/base_server/module.pike:220:
if (!hostname) hostname = gethostname(); for (int i = 0; i < sizeof (urls); i++) if (sizeof (urls[i]/"*") == 2) urls[i] = replace(urls[i], "*", hostname); return map (urls, `+, loc[1..]); } /* By default, provide nothing. */ string query_provides() { return 0; }
-
/*
-
* Parse and return a parsed version of the security levels for this module
-
*
-
*/
+
-
class
IP
_
with_mask
+
function(RequestID:int|mapping)
query
_
seclevels()
{
-
int net;
-
int mask;
-
static private int ip_to_int(string ip)
-
{
-
int res;
-
foreach(((ip/".") + ({ "0", "0", "0" }))[..3], string num) {
-
res = res*256 + (int)num;
-
}
-
return(res);
-
}
-
void create(string _ip, string|int _mask)
-
{
-
net = ip_to_int(_ip);
-
if (intp(_mask)) {
-
if (_mask > 32) {
-
report_error(sprintf("Bad netmask: %s/%d\n"
-
"Using %s/32\n", _ip, _mask, _ip));
-
_mask = 32;
-
}
-
mask = ~0<<(32-_mask);
-
} else {
-
mask = ip_to_int(_mask);
-
}
-
if (net & ~mask) {
-
report_error(sprintf("Bad netmask: %s for network %s\n"
-
"Ignoring node-specific bits\n", _ip, _mask));
-
net &= mask;
-
}
-
}
-
int `()(string ip)
-
{
-
return((ip_to_int(ip) & mask) == net);
-
}
-
};
-
-
array query_seclevels()
-
{
-
array patterns=({ });
-
+
if(catch(query("_seclevels")) || (query("_seclevels") == 0))
-
return
patterns;
-
-
foreach(replace(query("_seclevels"),
-
({" ","\t","\\\n"}),
-
({"","",""}))/"\n", string sl) {
-
if(!strlen(sl) || sl[
0
]=='#')
-
continue
;
-
-
string type, value;
-
if(sscanf(sl, "%s=%s", type, value)==2)
-
{
-
array(string|int) arr;
-
switch(lower
_
case(type))
-
{
-
case "allowip":
-
if (sizeof(arr = (value/"/")) == 2) {
-
// IP/bits
-
arr[1] = (int)arr[1];
-
patterns += ({ ({ MOD
_
ALLOW, IP_with_mask
(
@arr) }) });
-
} else if
(
(sizeof(arr = (value/
"
:")) == 2) ||
-
(sizeof(arr = (value/",")) > 1)) {
-
// IP:mask or IP,mask
-
patterns += ({ ({ MOD
_
ALLOW, IP_with_mask(@arr) }) });
-
} else {
-
// Pattern
-
value = replace(value, ({
"
?", ".", "*" }
),
({ ".", "\\.", ".*" }));
-
patterns += ({ ({ MOD
_
ALLOW, Regexp
(
value
)
->match, }
)
})
;
+
return 0;
+
return
roxen.compile
_
security
_
pattern
(
query
("_
seclevels
"),
this
_
object
());
}
-
break;
+
-
case "acceptip":
-
// Short-circuit version of allow ip.
-
if (sizeof(arr = (value/"/")) == 2) {
-
// IP/bits
-
arr[1] = (int)arr[1];
-
patterns += ({ ({ MOD_ACCEPT, IP_with_mask(@arr) }) });
-
} else if ((sizeof(arr = (value/":")) == 2) ||
-
(sizeof(arr = (value/",")) > 1)) {
-
// IP:mask or IP,mask
-
patterns += ({ ({ MOD_ACCEPT, IP_with_mask(@arr) }) });
-
} else {
-
// Pattern
-
value = replace(value, ({ "?", ".", "*" }), ({ ".", "\\.", ".*" }));
-
patterns += ({ ({ MOD_ACCEPT, Regexp(value)->match, }) });
-
}
-
break;
-
-
case "denyip":
-
if (sizeof(arr = (value/"/")) == 2) {
-
// IP/bits
-
arr[1] = (int)arr[1];
-
patterns += ({ ({ MOD_DENY, IP_with_mask(@arr) }) });
-
} else if ((sizeof(arr = (value/":")) == 2) ||
-
(sizeof(arr = (value/",")) > 1)) {
-
// IP:mask or IP,mask
-
patterns += ({ ({ MOD_DENY, IP_with_mask(@arr) }) });
-
} else {
-
// Pattern
-
value = replace(value, ({ "?", ".", "*" }), ({ ".", "\\.", ".*" }));
-
patterns += ({ ({ MOD_DENY, Regexp(value)->match, }) });
-
}
-
break;
-
-
case "allowuser":
-
value = replace(value, ({ "?", ".", "*" }), ({ ".", "\\.", ".*" }));
-
array(string) users = (value/"," - ({""}));
-
int i;
-
-
for(i=0; i < sizeof(users); i++) {
-
if (lower_case(users[i]) == "any") {
-
if(this_object()->register_module()[0] & MODULE_PROXY)
-
patterns += ({ ({ MOD_PROXY_USER, lambda(){ return 1; } }) });
-
else
-
patterns += ({ ({ MOD_USER, lambda(){ return 1; } }) });
-
break;
-
} else {
-
users[i & 0x0f] = "(^"+users[i]+"$)";
-
}
-
if ((i & 0x0f) == 0x0f) {
-
value = users[0..0x0f]*"|";
-
if(this_object()->register_module()[0] & MODULE_PROXY) {
-
patterns += ({ ({ MOD_PROXY_USER, Regexp(value)->match, }) });
-
} else {
-
patterns += ({ ({ MOD_USER, Regexp(value)->match, }) });
-
}
-
}
-
}
-
if (i & 0x0f) {
-
value = users[0..(i-1)&0x0f]*"|";
-
if(this_object()->register_module()[0] & MODULE_PROXY) {
-
patterns += ({ ({ MOD_PROXY_USER, Regexp(value)->match, }) });
-
} else {
-
patterns += ({ ({ MOD_USER, Regexp(value)->match, }) });
-
}
-
}
-
break;
-
-
case "acceptuser":
-
// Short-circuit version of allow user.
-
// NOTE: MOD_PROXY_USER is already short-circuit.
-
value = replace(value, ({ "?", ".", "*" }), ({ ".", "\\.", ".*" }));
-
users = (value/"," - ({""}));
-
-
for(i=0; i < sizeof(users); i++) {
-
if (lower_case(users[i]) == "any") {
-
if(this_object()->register_module()[0] & MODULE_PROXY)
-
patterns += ({ ({ MOD_PROXY_USER, lambda(){ return 1; } }) });
-
else
-
patterns += ({ ({ MOD_ACCEPT_USER, lambda(){ return 1; } }) });
-
break;
-
} else {
-
users[i & 0x0f] = "(^"+users[i]+"$)";
-
}
-
if ((i & 0x0f) == 0x0f) {
-
value = users[0..0x0f]*"|";
-
if(this_object()->register_module()[0] & MODULE_PROXY) {
-
patterns += ({ ({ MOD_PROXY_USER, Regexp(value)->match, }) });
-
} else {
-
patterns += ({ ({ MOD_ACCEPT_USER, Regexp(value)->match, }) });
-
}
-
}
-
}
-
if (i & 0x0f) {
-
value = users[0..(i-1)&0x0f]*"|";
-
if(this_object()->register_module()[0] & MODULE_PROXY) {
-
patterns += ({ ({ MOD_PROXY_USER, Regexp(value)->match, }) });
-
} else {
-
patterns += ({ ({ MOD_ACCEPT_USER, Regexp(value)->match, }) });
-
}
-
}
-
break;
-
-
default:
-
report_error(sprintf("Unknown Security:Patterns directive: "
-
"type=\"%s\"\n", type));
-
break;
-
}
-
} else {
-
report_error(sprintf("Syntax error in Security:Patterns directive: "
-
"line=\"%s\"\n", sl));
-
}
-
}
-
return patterns;
-
}
-
+
Stat stat_file(string f, RequestID id){} array(string) find_dir(string f, RequestID id){} mapping(string:Stat) find_dir_stat(string f, RequestID id) { TRACE_ENTER("find_dir_stat(): \""+f+"\"", 0); array(string) files = find_dir(f, id); mapping(string:Stat) res = ([]); foreach(files || ({}), string fname) {