Roxen.git / server / base_server / module.pike

version» Context lines:

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) {